運動路徑規劃,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.pswp.cn/news/40706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40706.shtml
英文地址,請注明出處:http://en.pswp.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用于實…