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

目录

一、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 = Noneif 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, iyif __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.mzph.cn/news/40706.shtml

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

相关文章

【网络编程(二)】NIO快速入门

NIO Java NIO 三大核心组件 Buffer&#xff08;缓冲区&#xff09;&#xff1a;每个客户端连接都会对应一个Buffer&#xff0c;读写数据通过缓冲区读写。Channel&#xff08;通道&#xff09;&#xff1a;每个channel用于连接Buffer和Selector&#xff0c;通道可以进行双向读…

Linux下C++开发

Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统&#xff0c;而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备&#xff0c;例如磁盘&#xff0c;光盘等。在其中的外接设备是不能直接被使用的&…

Redis数据库的可视化工具AnotherRedisDesktopManager使用+抖音直播小玩法实践

一、它是什么 Another Redis DeskTop Manager 是一个开源项目&#xff0c;提供了以可视化的方式管理 Redis 的功能&#xff0c;可供免费下载安装&#xff0c;也可以在此基础上进行二次开发&#xff0c;主要特点有&#xff1a; 支持 Windows 平台和 MacOS 平台 支持查询 Key、…

2023-08-17力扣每日一题

链接&#xff1a; 1444. 切披萨的方案数 题意&#xff1a; 给定一个矩阵&#xff0c;其中含有多个苹果&#xff0c;需要切割k-1次,每次可以切割多行/多列&#xff0c;需要保证切割两个部分都有苹果&#xff0c;移除靠上/靠右的部分&#xff0c;对留下部分进行后续的切割&…

QT中的按钮控件Buttons介绍

目录 Buttons 按钮控件 1、常用属性介绍 2、按钮介绍 2.1QPushButton 普通按钮 2.2QtoolButton 工具按钮 2.3Radio Button单选按钮 2.4CheckButton复选按钮 2.5Commam Link Button命令链接按钮 2.6Dialog Button Box命令链接按钮 Buttons 按钮控件 在Qt里&#xff0c;…

Viobot开机指南

0.前言 本篇旨在让每个拿到Viobot设备的用户都能够第一时间测试它的效果&#xff0c;以及将设备配置到自己的环境下面。 1.上电 首先&#xff0c;我们先要把设备接上电源线和网线&#xff0c;最简单的方式就是网线直连电脑。 电源选用12V1.5A设备自带的电源即可。 2.配置网…

JavaScript中的this指向,call、apply、bind的简单实现

JavaScript中的this this是JavaScript中一个特殊关键字&#xff0c;用于指代当前执行上下文中的对象。它的难以理解之处就是值不是固定的&#xff0c;是再函数被调用时根据调用场景动态确定的&#xff0c;主要根据函数的调用方式来决定this指向的对象。this 的值在函数被调用时…

深入学习前端开发,掌握HTML、CSS、JavaScript等技术

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1WECwJ4T8UQfs2FyjUMbxig?pwdi654 提取码: i654 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; 第1周&#xff1a;HTML5基础语法与标签 &#x1f…

web集群学习:搭建 LNMP应用环境

目录 LNMP的介绍&#xff1a; LNMP组合工作流程&#xff1a; FastCGI介绍&#xff1a; 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍&#xff1a; 随着 Nginx Web 服务的逐渐流行&#xff0c;又岀现了新的 Web 服务环境组合—…

【Spring Cloud 八】Spring Cloud Gateway网关

gateway网关 系列博客背景一、什么是Spring Cloud Gateway二、为什么要使用Spring Cloud Gateway三、 Spring Cloud Gateway 三大核心概念4.1 Route&#xff08;路由&#xff09;4.2 Predicate&#xff08;断言&#xff09;4.3 Filter&#xff08;过滤&#xff09; 五、Spring …

如何使用Kali Linux进行密码破解?

今天我们探讨Kali Linux的应用&#xff0c;重点是如何使用它来进行密码破解。密码破解是渗透测试中常见的任务&#xff0c;Kali Linux为我们提供了强大的工具来帮助完成这项任务。 1. 密码破解简介 密码破解是一种渗透测试活动&#xff0c;旨在通过不同的方法和工具来破解密码…

力扣初级算法(数组拆分)

力扣初级算法&#xff08;数组拆分&#xff09; 每日一算法&#xff1a; 力扣初级算法&#xff08;数组拆分&#xff09; 学习内容&#xff1a; 1.问题描述 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) …

机器人CPP编程基础-03变量类型Variables Types

机器人CPP编程基础-02变量Variables 全文AI生成。 C #include<iostream>using namespace std;main() {int a10,b35; // 4 bytescout<<"Value of a : "<<a<<" Address of a : "<<&a <<endl;cout<<"Val…

[Openwrt]一步一步搭建MT7981A uboot、atf、openwrt-21.02开发环境操作说明

安装ubuntu-18.04 软件安装包 ubuntu-18.04-desktop-amd64.iso 修改ubuntu管理员密码 sudo passwd [sudo] password for w1804: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully 更新ubuntu源 备份源 sudo cp /etc/apt/so…

CentO7.9安装Docker

文章目录 CentO7.9安装Docker删除旧版本的Docker安装Docker仓库安装Docker安装最新版本安装指定版本 Docker安装个NGINX查看Docker镜像运行查看Docker进程查看启动端口停止Docker容器 CentO7.9安装Docker 删除旧版本的Docker sudo yum remove docker \docker-client \docker-…

Vue+ElementUI实现选择指定行导出Excel

这里记录一下&#xff0c;今天写项目时 的一个需求&#xff0c;就是通过复选框选中指定行然后导出表格中选中行的Excel表格 然后这里介绍一个工具箱(模板)&#xff1a;vue-element-admin 将它拉取后&#xff0c;运行就可以看到如下界面&#xff1a; 这里面的很多功能都已经实现…

【NAS群晖drive异地访问】使用cpolar远程访问内网Synology Drive「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

jupyter切换conda虚拟环境

环境安装 conda install nb_conda 进入你想使用的虚拟环境&#xff1a; conda activate your_env_name 在你想使用的conda虚拟环境中&#xff1a; conda install -y jupyter 在虚拟环境中安装jupyter&#xff1a; conda install -y jupyter 重启jupyter 此时我们已经把该安装…

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

Linux系统下的性能分析命令

在 Linux 系统下&#xff0c;有许多用于性能分析和调试的命令和工具&#xff0c;可以帮助您识别系统瓶颈、优化性能以及调查问题。本文将介绍在性能分析过程中&#xff0c;可能使用到的一些命令。 以下是一些常用的性能分析命令和工具汇总&#xff1a; 命令功能简述top用于实…