本教程介绍了 LPSS 机器人扩展中的运动规划功能,展示了如何使用该功能进行机器人运动规划。
- 作者
- 赵曦
- 日期
- 2026/04/29
- 版本
- 1.0
上一篇教程:轻量发布订阅服务 —— LPSS
下一篇教程:机器人控制
相关模块: 机器人功能扩展
1 概述
rm::lpss::RobotPlanner 提供 URDF 加载、正/逆运动学求解、以及轨迹规划功能。使用者可以直接指定关节角度或末端位姿来规划平滑的运动轨迹。
1.1 URDF 文件说明
URDF(Unified Robot Description Format)是 ROS/ROS2 标准的机器人描述格式,用 XML 定义机器人的连杆、关节和动力学属性。可以使用 SW2URDF 插件从 SolidWorks 导出 URDF 文件,或参考 ROS 官方文档手工编写。RMVL 完全兼容标准 URDF 格式,支持加载 ROS/ROS2 生态中的机器人模型。
2 快速开始
2.1 创建规划器
首先需要创建一个 RobotPlanner 对象,加载 URDF 模型:
#include <rmvl/lpss/robot.hpp>
int main() {
return 0;
}
机器人规划模块,提供 URDF 解析、正/逆运动学求解、轨迹规划等运动学功能
定义 robot.hpp:94
2.2 更新关节状态
在进行轨迹规划前,需要更新规划器中的关节状态(通常是当前机器人的实际关节角度):
current_state.
name = {
"joint1",
"joint2",
"joint3"};
current_state.
position = {0.0, 0.0, 0.0};
current_state.
velocity = {0.0, 0.0, 0.0};
current_state.
effort = {0.0, 0.0, 0.0};
planner.update(current_state);
const auto &state = planner.joints();
JointState 消息类型:sensor/JointState
定义 joint_state.hpp:32
std::vector< double > velocity
定义 joint_state.hpp:37
std::vector< std::string > name
定义 joint_state.hpp:35
std::vector< double > position
定义 joint_state.hpp:36
std::vector< double > effort
定义 joint_state.hpp:38
2.3 关节空间规划
在已知目标关节角的情况下,可以使用关节空间规划快速生成轨迹:
target.
name = {
"joint1",
"joint2",
"joint3"};
target.
position = {1.57, 0.785, -0.785};
target.
effort = {0.0, 0.0, 0.0};
std::cout << "轨迹规划失败!" << std::endl;
} else {
std::cout <<
"规划成功,轨迹包含 " << traj.
points.size() <<
" 个点" << std::endl;
}
JointTrajectory 消息类型:motion/JointTrajectory
定义 joint_trajectory.hpp:33
std::vector< JointTrajectoryPoint > points
定义 joint_trajectory.hpp:37
2.4 笛卡尔空间规划(点到点)
指定末端执行器的目标位姿,规划器会自动进行逆运动学求解:
std::cout <<
"轨迹总时间:" << traj.
points.back().time_from_start <<
" ms" << std::endl;
}
Pose 消息类型:geometry/Pose
定义 pose.hpp:33
Point position
定义 pose.hpp:35
Quaternion orientation
定义 pose.hpp:36
double y
定义 quaternion.hpp:34
double w
定义 quaternion.hpp:36
double z
定义 quaternion.hpp:35
double x
定义 quaternion.hpp:33
2.5 笛卡尔空间规划(多点)
规划末端执行器通过多个途经点的轨迹:
std::vector<msg::Pose> waypoints;
waypoints.push_back(p1);
waypoints.push_back(p2);
2.6 正运动学查询
msg::Pose link_pose = planner.linkpose(
"link2");
2.7 调整执行速度
planner.setMaxVelocityScalingFactor(0.5);
planner.setMaxVelocityScalingFactor(1.0);