当前位置:   article > 正文

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

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 创建插值函数。

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import rospy
  4. import rosparam
  5. from nav_msgs.msg import Path
  6. from geometry_msgs.msg import PoseStamped
  7. import sys
  8. import os
  9. import yaml
  10. import numpy as np
  11. from scipy.interpolate import interp1d
  12. # def interpolation(waypoint_list, alg="cubic"):
  13. def interpolation(alg="linear"):
  14. ix = []
  15. iy = []
  16. temp_x = np.array([1,5,8,10])
  17. temp_y = np.array([1,4,9,10])
  18. cubic_spline = None
  19. if alg == "linear":
  20. cubic_spline = interp1d(temp_x, temp_y)
  21. elif alg == "cubic":
  22. cubic_spline = interp1d(temp_x, temp_y, kind='cubic')
  23. waypoint_x_start = temp_x[0]
  24. waypoint_x_end = temp_x[-1]
  25. length = int(abs(waypoint_x_end - waypoint_x_start) / 0.01)
  26. print(length)
  27. ix = np.linspace(waypoint_x_start, waypoint_x_end, num=length)
  28. iy = cubic_spline(ix)
  29. return ix, iy
  30. if __name__ == '__main__':
  31. rospy.init_node("cubic_spline_path")
  32. waypoint_x, waypoint_y = interpolation()
  33. path_pub = rospy.Publisher('/spline_path', Path, queue_size=10)
  34. path = Path()
  35. for index in range(len(waypoint_x)):
  36. pose = PoseStamped()
  37. pose.pose.position.x = waypoint_x[index]
  38. pose.pose.position.y = waypoint_y[index]
  39. print(pose)
  40. path.poses.append(pose)
  41. path.header.frame_id = "map"
  42. path.header.stamp = rospy.Time.now()
  43. rate = rospy.Rate(10)
  44. while not rospy.is_shutdown():
  45. path_pub.publish(path)
  46. rate.sleep()
  47. 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路径。

  1. // 线性插值路径
  2. nav_msgs::Path LinearInterpolation(const double &Ax, const double &Ay, const double &Bx, const double &By, const double &stepsize)
  3. {
  4. double x1 = Ax;
  5. double y1 = Ay;
  6. double z1 = 0;
  7. double x2 = Bx;
  8. double y2 = By;
  9. double z2 = 0;
  10. double step_size = stepsize;
  11. double dist = std::sqrt(std::pow((x2 - x1), 2) + std::pow((y2 - y1), 2) + std::pow((z2 - z1), 2));
  12. int num_steps = dist / step_size;
  13. for (int i = 0; i < num_steps; ++i)
  14. {
  15. double ratio = static_cast<double>(i) / num_steps;
  16. geometry_msgs::PoseStamped interpolated_pose;
  17. interpolated_pose.header.frame_id = "map";
  18. interpolated_pose.header.stamp = ros::Time::now();
  19. interpolated_pose.pose.position.x = x1 + ratio * (x2 - x1);
  20. interpolated_pose.pose.position.y = y1 + ratio * (y2 - y1);
  21. interpolated_pose.pose.position.z = z1 + ratio * (z2 - z1);
  22. interpolated_pose.pose.orientation.x = 1;
  23. interpolated_pose.pose.orientation.y = 0;
  24. interpolated_pose.pose.orientation.z = 0;
  25. interpolated_pose.pose.orientation.w = 0;
  26. scatter_path.poses.push_back(interpolated_pose);
  27. }
  28. return scatter_path;
  29. }

参考博客

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/206503
推荐阅读
相关标签
  

闽ICP备14008679号