# ROS进阶——运动规划分析

## 一、运动规划算法简述

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

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

• 通过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
• 手动调用

// 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 //加速度比例
)


## 二、Time-optimal Trajectory Parameterization

Add time-optimal trajectory parameterization

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。

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


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


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

08-01
08-01 2143
06-14 569
11-16 1864
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客