ROS进阶——运动规划分析

本文深入解析了ROS MoveIt中的三种运动规划算法:Time-optimalTrajectoryParameterization、IterativeSplineParameterization和IterativeParabolicTimeParameterization。探讨了每种算法的原理、应用场景、参数设置及其实现效果,特别关注于机械臂路径规划中的速度和加速度平滑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、运动规划算法简述

实现流程

通过给定的轨迹点,根据设定的最大速度和加速度计算每个点的速度,加速度和时间帧。

  • 轨迹点:可通过插补获得,数据类型为moveit_msgs::RobotTrajectory
  • 设定的最大速度和加速度:为URDF文件中设定参数

规划器

当前ROS提供三种规划器:

  • Time-optimal Trajectory Parameterization
  • Iterative Spline Parameterization
  • Iterative Parabolic Time Parameterization

分析

在规划固定轨迹时(直线,圆弧),规划获得速度和加速度一般会有抖动,特别是在精确的规划下,因此在对轨迹要求不高的情况下,使用样条曲线(Spline Curves)拟合轨迹可以获得较好的运动规划结果,若需要精确的固定轨迹规划,建议降低速度。

应用

  • 通过planning_adapters调用

ompl_planning_pipeline.launch中修改default_planner_request_adapters/AddTimeParameterization,若使用其他规划器,修改对应planning_pipeline.launch。(可将不支持算法制作成plugin再调用,详细参考ROS进阶——MoveIt Planning Request Adapters

规划算法调用
Time-optimal Trajectory ParameterizationAddTimeOptimalParameterization(>=Melodic)
Iterative Spline ParameterizationAddIterativeSplineParameterization
Iterative Parabolic Time ParameterizationAddTimeParameterization
  • 手动调用

当使用自定义规划算法(按照默认算法编写接口)或者新的算法(旧ros版本不支持)时,可以直接通过类调用,但注意在moveit通过plan规划时,会调用planning_adapters设置的规划算法,因此手动调用需要在plan之后。

参考:Add better functionality for adding Time Parametrization to a Cartesian Trajectory

// First to create a RobotTrajectory object
robot_trajectory::RobotTrajectory rt(group->getCurrentState()->getRobotModel(), "hand");

// Second get a RobotTrajectory from trajectory
rt.setRobotTrajectoryMsg(*group->getCurrentState(), trajectory_msg);

// Thrid create a iterative time
trajectory_processing::IterativeParabolicTimeParameterization iptp;// 五次样条曲线插补

trajectory_processing::IterativeSplineParameterization isp;// 三次样条曲线

trajectory_processing::TimeOptimalTrajectoryGeneration totg;//时间优化
      
// Fourth compute computeTimeStamps
// bool ItSuccess = iptp.computeTimeStamps(rt);
// bool ItSuccess = isp.computeTimeStamps(rt);
bool ItSuccess = totg.computeTimeStamps(rt);
OS_INFO("Computed time stamp %s", ItSuccess ? "SUCCEDED" : "FAILED");

// Get RobotTrajectory_msg from RobotTrajectory
rt.getRobotTrajectoryMsg(trajectory_msg);

computeTimeStamps函数定义(三个规划器一样)

bool trajectory_processing::IterativeParabolicTimeParameterization::computeTimeStamps(
robot_trajectory::RobotTrajectory & trajectory, //轨迹数据
const double max_velocity_scaling_factor = 1.0, //速度比例
const double max_acceleration_scaling_factor = 1.0 //加速度比例
)

速度比例和加速度比例是对关节最大速度和加速度的约束,值范围为0-1,最大值的设置值在joint_limits.yaml文件中定义。

二、Time-optimal Trajectory Parameterization

Add time-optimal trajectory parameterization

算法原理:Time-Optimal Path Following (July 2012)

注意:该规划算法在melodic版本以上才整合到moveit中

分析

  1. 该规划器输出轨迹为等时间间距(其余为等距)
  2. 该规划器在小间距下规划的速度和加速度较其余两种优化算法更加合理与平滑,在较大间距下三种规划算法效果差距不大,良好的规划间距会因机械臂参数的不同而有所不同。
  3. 在过小间距下(0.001s)插补,会出现运动规划不恒定,规划速度不平滑的现象,经测试在0.005s(不同机械臂不一致,同时需要根据控制器输出频率等确定)的规划间距下可以有较为稳定和理想的规划效果。

参数设置

TimeOptimalTrajectoryGeneration(const double path_tolerance = 0.1, 
                                const double resample_dt = 0.1);
  • path_tolerance,轨迹宽容度,允许轨迹相对实际轨迹的误差量,单位m。
  • resample_dt,输出轨迹时间间距,单位s。

减少轨迹宽容度和时间间隔会导致速度和加速度出现抖动,应根据实际情况调整。

低版本(kinetic)使用

下载time_optimal_trajectory_generation.htime_optimal_trajectory_generation.cpp放到workspcae中手动调用或制作为插件调用,程序采用c++14标准编写,使用低标准需要进行修改。

修改

std::make_unique<LinearPathSegment>(start_config, end_config)//c++14

std::unique_ptr<LinearPathSegment>(new LinearPathSegment(start_config, end_config))//c++11

若编译器支持c++14无需修改

实现效果
在这里插入图片描述

  1. 直线插补-时间间距0.001s,精度1mm

注意:该间距下规划所得结果不恒定

  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-时间间距0.01s,精度10mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-时间间距0.1s,精度100mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述

三、Iterative Spline Parameterization

Improved IPTP by fitting a cubic spline

实现效果
在这里插入图片描述

  1. 直线插补-1mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-10mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-100mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述

四、Iterative Parabolic Time Parameterization

分析

  1. 该运动规划器为moveit默认使用规划器,可以实现速度和加速度平滑,但无法避免加速度的抖动,详细参考Improve time parameterization
  2. 该规划器等间距插补,平滑速度和加速度,适合用在低速精确轨迹控制下。

实现效果
在这里插入图片描述

  1. 直线插补-1mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-10mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述
  1. 直线插补-100mm
  • 操作空间
    在这里插入图片描述
  • 关节空间
    在这里插入图片描述
    在这里插入图片描述

参考

https://github.com/ros-planning/moveit/tree/melodic-devel/moveit_core/trajectory_processing/include/moveit/trajectory_processing

libmoveit_default_planning_request_adapter_plugins

### 关于 ROSROS 2 的学习资源与项目示例 #### ROS 2 学习教程 ROS2Learn 是一个专注于 ROS 2 中机器学习算法的开源项目,提供了丰富的文档和代码示例来帮助开发者理解如何将现代机器学习技术集成到机器人应用中[^1]。该项目不仅涵盖了基础概念,还深入探讨了高级主题,例如强化学习、神经网络模型部署以及数据处理管道的设计。 对于初学者来说,可以从官方提供的入门指南入手,逐步探索更复杂的场景实现方法。此外,在其 GitHub 页面上还有详细的 README 文件说明各个模块的功能及其依赖关系。 ```bash # 安装依赖项并克隆仓库 sudo apt update && sudo apt install git python3-pip -y pip3 install --upgrade pip setuptools wheel git clone https://gitcode.com/gh_mirrors/ro/ros2learn.git cd ros2learn/ colcon build source ~/ros2_ws/install/local_setup.bash ``` --- #### 经典 ROS 教程 如果目标是掌握传统版本即 ROS Noetic 或 Melodic,则可以参考另一个全面覆盖基础知识至进阶技巧的教学资料集——《ROS 开源项目教程》[^2]。此书由经验丰富的工程师编写而成,适合不同层次的学习者阅读,并附带大量实际操作练习以便巩固理论知识点。 书中提到的一些核心组件包括但不限于消息传递机制、服务调用方式、动作服务器设计原则等方面的内容均被细致剖析出来供读者查阅学习之便。 --- #### ROS 2 Demo 示例 为了进一步加深对整个框架的理解程度,《ROS2 Demos 项目教程》提供了一系列精心挑选出来的演示程序作为教学辅助工具[^3]。这些例子展示了从简单运动控制命令发送直到复杂导航规划执行等多个方面的功能特性展示给用户观看体验效果的同时也教会他们如何去构建类似的解决方案自己动手尝试制作属于自己的作品吧! 以下是启动其中一个 demo 节点的方法: ```bash # 启动 turtlesim 模拟器 ros2 run turtlesim turtlesim_node & sleep 2 ros2 run turtlesim turtle_teleop_key ``` --- #### 工业级应用实例 —— KUKA IIWA 控制接口开发包(iiwa_ros) 针对工业领域内的具体需求,“iiwa_ros” 提供了一套完整的 API 来简化与 KUKA LBR iiwa 系列协作型机械臂之间的交互过程[^4]。它支持多种编程语言绑定形式(如 C++ / Python),允许程序员快速搭建原型测试环境或者直接投入生产环境中使用。 当完成软件栈设置之后即可按照如下指令序列开启默认样例验证当前配置状态是否正常工作: ```bash # 执行基本功能性检测流程 roscore & rosrun iiwa_ros iiwa_example ``` --- #### 计算机视觉方向拓展 —— Intel RealSense 集成方案(realsense_samples_ros) 最后值得一提的是有关三维感知硬件设备的支持情况。“realsense_samples_ros” 就是用来指导大家怎样利用英特尔实感系列摄像头(ZR300型号为代表)来进行物体识别跟踪定位地图创建等一系列任务的最佳实践手册之一[^5]。其中包含了多个专题讨论环节分别对应不同的应用场景需求分析解决办法分享交流心得等等重要内容值得每一位对此感兴趣的朋友们深入了解一番哦! ```cpp // 加载相机驱动件 #include <realsense_camera.h> ... int main(int argc, char **argv){ ... } ```
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值