运动路径规划,ROS发布期望运动轨迹

news2024/11/19 17:20:13

目录

一、Python实现(推荐方法)

1.1代码cubic_spline_path.py

1.2使用方法

 二、C++实现

参考博客


想让机器人/智能车无人驾驶,要有期望路径,最简单的是一条直线,或者是一条光滑曲线。

生成路径的方法有两种:

  1. 手动遥控机器人运动一段路径,并保存轨迹
  2. 人为设定几个关键点,拟合出直线或曲线

方法1通常是根据GNSS/INS位姿数据记录轨迹,可参考ROS之rviz显示GNSS/INS运动轨迹_可见一班的博客-CSDN博客

方法2是这篇博客讨论的内容。分别使用C++和Python在ROS下实现。

一、Python实现(推荐方法)

1.1代码cubic_spline_path.py

根据指定的插值算法 alg,创建一个插值函数 cubic_spline。如果 alg 为 “linear”,则使用线性插值函数 interp1d 创建插值函数;如果 alg 为 “cubic”,则使用三次样条插值函数 interp1d 创建插值函数。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import rospy
import rosparam
from nav_msgs.msg import Path
from geometry_msgs.msg import PoseStamped
import sys
import os
import yaml
import numpy as np
from scipy.interpolate import interp1d

# def interpolation(waypoint_list, alg="cubic"):
def interpolation(alg="linear"):
    ix = []
    iy = []

    temp_x = np.array([1,5,8,10])
    temp_y = np.array([1,4,9,10])
        
    cubic_spline = None
    if alg == "linear":
        cubic_spline = interp1d(temp_x, temp_y)
    elif alg == "cubic":
        cubic_spline = interp1d(temp_x, temp_y, kind='cubic')

    waypoint_x_start = temp_x[0]
    waypoint_x_end = temp_x[-1]
    length = int(abs(waypoint_x_end - waypoint_x_start) / 0.01)
    print(length)
    ix = np.linspace(waypoint_x_start, waypoint_x_end, num=length)
    iy = cubic_spline(ix)

    return ix, iy


if __name__ == '__main__':
    rospy.init_node("cubic_spline_path")

    waypoint_x, waypoint_y = interpolation()

    path_pub = rospy.Publisher('/spline_path', Path, queue_size=10)

    path = Path()
    for index in range(len(waypoint_x)):
        pose = PoseStamped()
        pose.pose.position.x = waypoint_x[index]
        pose.pose.position.y = waypoint_y[index]
        print(pose)
        path.poses.append(pose)
    path.header.frame_id = "map"
    path.header.stamp = rospy.Time.now()

    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        path_pub.publish(path)
        rate.sleep()
    rospy.spin()

1.2使用方法

  1. 在ROS工作空间中新建文件夹scripts
  2. 新建.py文件,复制上述代码
  3. 更改文件权限允许作为程序执行
  4. 终端执行 ./cubic_spline_path.py
  5. 打开rviz,订阅spline_path话题显示路径

 

 二、C++实现

 直线插值比较简单,三次样条插值比较复杂。

主函数中调用这个函数即可,传入参数为A、B点x,y坐标值,返回nav_msgs::Path路径。

// 线性插值路径
nav_msgs::Path LinearInterpolation(const double &Ax, const double &Ay, const double &Bx, const double &By, const double &stepsize)
{

  double x1 = Ax;
  double y1 = Ay;
  double z1 = 0;
  double x2 = Bx;
  double y2 = By;
  double z2 = 0;

  double step_size = stepsize;

  double dist = std::sqrt(std::pow((x2 - x1), 2) + std::pow((y2 - y1), 2) + std::pow((z2 - z1), 2));
  int num_steps = dist / step_size;

  for (int i = 0; i < num_steps; ++i)
  {
    double ratio = static_cast<double>(i) / num_steps;

    geometry_msgs::PoseStamped interpolated_pose;
    interpolated_pose.header.frame_id = "map";
    interpolated_pose.header.stamp = ros::Time::now();
    interpolated_pose.pose.position.x = x1 + ratio * (x2 - x1);
    interpolated_pose.pose.position.y = y1 + ratio * (y2 - y1);
    interpolated_pose.pose.position.z = z1 + ratio * (z2 - z1);

    interpolated_pose.pose.orientation.x = 1;
    interpolated_pose.pose.orientation.y = 0;
    interpolated_pose.pose.orientation.z = 0;
    interpolated_pose.pose.orientation.w = 0;

    scatter_path.poses.push_back(interpolated_pose);
  }

  return scatter_path;
}

参考博客

【运动规划算法项目实战】路径规划中常用的插值方法(附ROS C++代码)_路径插值

【运动规划算法项目实战】如何使用Pure Pursuit算法进行路径跟踪(附ROS C++代码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RSA加密解密算法原理以及实现

文章目录 前言一、RSA加密算法是什么&#xff1f;加密过程1、选择一对不相等且足够大的质数2、计算p、q的乘积3、计算n的欧拉函数4、选择一个与 φ ( n ) \varphi(n) φ(n)互质的整数e5、计算出e对于 φ ( n ) \varphi(n) φ(n)的模反元素d6、将e、n公开作为公钥进行加密7、将d…

步入React正殿 - 生命周期

目录 资料 三个阶段的生命周期函数 创建阶段 初始化阶段constructor 挂载阶段componentWillMount 挂载阶段render 挂载阶段componentDidMount 更新阶段【props或state改变】 更新阶段componentWillReceiveProps 更新阶段shouldComponentUpdate【可不使用&#xff0c;…

Mysql事务篇——Day02

Mysql事务篇——Day02 事务有哪些特性并发事务引发的问题脏读不可重复读幻读 事务隔离级别Read View 在 MVCC里如何工作 事务有哪些特性 事务是依赖MySQL的储存引擎是实现的&#xff0c;我们常见的Innodb引擎就是支持事务的。 不过并不是所有的存储引擎都可以支持事务&#xf…

SecureCRT8.5安装教程

第一步&#xff1a; 将文件下载解压 第二步&#xff1a; 双击进行安装&#xff0c;或者右键以管理员的方式运行 第三步&#xff1a; 直接点下一步 第四步&#xff1a; 选择接受协议&#xff0c;然后点下一步 第五步&#xff1a; 我这里选择所有用户&#xff0c;然后点下一…

js实现按创建时间戳1609459200000 开始往后开始显示运行时长-demo

运行时长 00日 00时 17分 59秒 代码 function calculateRuntime(timestamp) {const startTime Date.now(); // 获取当前时间戳//const runtimeElement document.getElementById(runtime); // 获取显示运行时长的元素function updateRuntime() {const currentTimestamp Date…

spring入门基本介绍及注入方式---详细介绍

一&#xff0c;spring的简介 Spring是一个开源框架&#xff0c;它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 提供了许多功能强大且易于使用的特性&#xff0c;使得开发者能够更加轻松地构建可维护且可扩展的应用程序&#xff0c;简单来说: Spring使用基…

攻击LNMP架构Web应用

环境配置(centos7) 1.php56 php56-fpm //配置epel yum install epel-release rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//安装php56&#xff0c;php56-fpm及其依赖 yum --enablereporemi install php56-php yum --enablereporemi install php…

深入了解唯品会API及其应用

随着电商行业的快速发展&#xff0c;API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;已经成为许多企业实现系统对接、数据交换和功能扩展的重要工具之一。唯品会作为国内领先的电商平台之一&#xff0c;也提供了丰富的API接口&#xff…

component:()=>import(“@/views/Home.vue“) 报错,ts说没有找到类型声明文件

1 没有写.vue文件的类型声明&#xff0c;要在env.d.ts文件中写.vue的类型声明文件 2 ts.config.josn的incluede字段中&#xff0c;没有把.d.ts文件的路径写对。 如果没写对&#xff0c;就会在项目启动的时候&#xff0c;找不到.d.ts文件。找不到类型声明文件

【自动电压调节器】无功功率控制的终端电压控制研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…

cs231n assignment 3 Q2 Image Captioning with Vanilla RNNs

文章目录 嫌啰嗦直接看代码Q2 Image Captioning with Vanilla RNNs一个给的工具代码里的bug问题展示问题解决思路解决办法 rnn_step_forward题面解析代码输出 rnn_step_backward题面解析代码输出 rnn_forward题面解析代码输出 rnn_backward题面解析代码输出 word_embedding_for…

时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍…

leetcode 518. 零钱兑换 II

本题是背包问题系列的完全背包问题&#xff0c;和0-1背包唯一的区别就在于&#xff1a;物品是可以重复选取的。 经过之前背包问题的拷打&#xff0c;本题也是一遍AC了。 接下来将给出二维和一维两种做法。 二维dp数组做法&#xff1a; 本题的背包大小即为题中给出的总金额&am…

与微软Office抗衡,两大巨头布局,打造新办公软件,再上新台阶

办公软件是我们日常工作中不可或缺的工具。 除了广为人知的微软Office套件外&#xff0c;近几年来&#xff0c;中国市场有许多优秀的国产办公软件抢眼登场&#xff0c;这些软件在提高工作效率、简化工作流程方面发挥着重要作用。 简单介绍几款值得知道的国产办公软件&#xff…

【学习FreeRTOS】第9章——FreeRTOS任务调度

1.开启任务调度器 vTaskStartScheduler() 作用&#xff1a;用于启动任务调度器&#xff0c;任务调度器启动后&#xff0c; FreeRTOS 便会开始进行任务调度【动态创建任务为例】 创建空闲任务如果使能软件定时器&#xff0c;则创建定时器任务关闭中断&#xff0c;防止调度器开…

99%的Python用户都不知道的f-string隐秘技巧

f-string想必很多Python用户都基础性的使用过&#xff0c;作为Python3.6版本开始引入的特性&#xff0c;通过它我们可以更加方便地向字符串中嵌入自定义内容&#xff0c;但f-string真正蕴含的功能远比大多数用户知道的要丰富&#xff0c;今天我们就来一起get它们~ 「最基础用法…

JVS开源基础框架:平台基本信息介绍

JVS是面向软件开发团队可以快速实现应用的基础开发脚手架&#xff0c;主要定位于企业信息化通用底座&#xff0c;采用微服务分布式框架&#xff0c;提供丰富的基础功能&#xff0c;集成众多业务引擎&#xff0c;它灵活性强&#xff0c;界面化配置对开发者友好&#xff0c;底层容…

MySQL性能分析之慢查询日志查看

一、背景 MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应的时间超过阈值的语句,具体指运行时间超过long_query_time(默认是10秒)值的SQL,会被记录到慢查询日志中。 慢查询日志一般用于性能分析时开启,收集慢SQL然后通过explain进行全面分析,一…

GPU Dissolve(GPU 消散)学习GPU Instancing

一&#xff1a;摘要 通过制作一个模型GPU消散效果来学习GPU Instancing 也就是实例化。 目标效果是杨超大佬文章《GPU shatter》里面的消散效果如图&#xff1a; Tags&#xff1a;模型顶点分裂(Mesh Vertex Splitting)&#xff0c; 实例化绘制(GPU Instancing Drawing)&#x…