手臂轨迹规划案例
1. 描述
- 本文介绍用于规划人形机器人的手臂关节状态轨迹的实现
- 示例代码位于
<kuavo-ros-opensource>/src/demo/examples_code/hand_plan_arm_trajectory
- 目前提供两种插值方法用于实现手臂关节状态轨迹规划:
- 三次样条插值器 (
plan_arm_traj_cubicspline_demo.py
) - 贝塞尔曲线插值器 (
plan_arm_traj_bezier_demo.py
)
- 三次样条插值器 (
2. 编译与启动
2.1 编译
catkin build humanoid_plan_arm_trajectory
2.2 启动参数
以下是轨迹规划模块启动时可选的参数:
joint_state_topic
: 发布关节状态的话题名称, 默认值为kuavo_arm_traj
joint_state_unit
: 关节角度单位, 可选rad
或deg
, 默认值为deg
use_nodelet
: 是否使用 nodelet 方式启动, 默认值为false
2.3 启动示例
三次样条法:
python3 plan_arm_traj_cubicspline_demo.py
效果图如下:
贝塞尔曲线法:
python3 plan_arm_traj_bezier_demo.py
效果图如下:
3. ROS 接口
3.1 话题
发布的话题
/<interpolate_type>/arm_traj
话题描述: 发布规划的手臂轨迹
消息类型: trajectory_msgs/JointTrajectory
字段 | 类型 | 描述 |
---|---|---|
header | std_msgs/Header | 消息头 |
joint_names | string[] | 关节名称数组 |
points | JointTrajectoryPoint[] | 轨迹点数组,只有points[0]包含最新的关节值 |
/<interpolate_type>/arm_traj_state
话题描述: 发布轨迹执行状态
消息类型: humanoid_plan_arm_trajectory/planArmState
字段 | 类型 | 描述 |
---|---|---|
progress | int32 | 轨迹执行进度,单位毫秒 |
is_finished | bool | 轨迹是否执行完成 |
/kuavo_arm_traj
话题描述: 控制手部关节位置
消息类型: sensor_msgs/JointState
字段 | 类型 | 描述 |
---|---|---|
header | std_msgs/Header | 消息头 |
name | string[] | 关节名称 |
position | float64[] | 关节位置 |
velocity | float64[] | 关节速度 |
effort | float64[] | 关节力矩(未使用) |
3.2 服务
/<interpolate_type>/plan_arm_trajectory
话题描述: 轨迹规划服务
其中 <interpolate_type>
可以是:
bezier
: 贝塞尔曲线插值cubic_spline
: 三次样条插值
贝塞尔曲线插值服务
消息类型: humanoid_plan_arm_trajectory/planArmTrajectoryBezierCurve
请求参数:
字段 | 类型 | 描述 |
---|---|---|
multi_joint_bezier_trajectory | jointBezierTrajectory[] | 多个关节的贝塞尔轨迹数组 |
start_frame_time | float64 | 轨迹的开始时间,单位秒 |
end_frame_time | float64 | 轨迹的结束时间,单位秒 |
joint_names | string[] | 关节名称数组 |
返回结果:
字段 | 类型 | 描述 |
---|---|---|
success | bool | 规划是否成功 |
三次样条插值服务
消息类型: humanoid_plan_arm_trajectory/planArmTrajectoryCubicSpline
请求参数:
字段 | 类型 | 描述 |
---|---|---|
joint_trajectory | trajectory_msgs/JointTrajectory | 关节轨迹规范 |
返回结果:
字段 | 类型 | 描述 |
---|---|---|
success | bool | 规划是否成功 |
/<interpolate_type>/stop_plan_arm_trajectory
话题描述: 停止轨迹执行服务
消息类型: std_srvs/Trigger
4. 使用指南
4.1 三次样条插值器
4.1.1 功能概述
plan_arm_traj_cubicspline_demo.py
使用三次样条插值器来规划机器人的手臂轨迹。
4.1.2 主要步骤
初始化节点和服务:
- 初始化 ROS 节点
arm_trajectory_cubicspline_demo
- 订阅
/cubic_spline/arm_traj
话题 - 发布
/kuavo_arm_traj
话题
- 初始化 ROS 节点
服务调用:
- 设置手臂控制模式
- 使用轨迹规划服务
轨迹规划:
- 定义关节位置和时间点
- 将当前关节状态作为起始点
- 发送轨迹请求
4.1.3 注意事项
- 确保所有服务和话题配置正确
- 确保
mpc_observation
消息可用
4.2 贝塞尔曲线插值器
4.2.1 功能概述
plan_arm_traj_bezier_demo.py
使用贝塞尔曲线插值器来规划机器人的手臂轨迹。
4.2.2 主要步骤
初始化节点和服务:
- 初始化 ROS 节点
arm_trajectory_bezier_demo
- 订阅
/bezier/arm_traj
话题 - 发布
/kuavo_arm_traj
话题
- 初始化 ROS 节点
服务调用:
- 设置手臂控制模式
- 使用轨迹规划服务
轨迹规划:
- 读取 JSON 动作数据
- 定义贝塞尔曲线控制点
- 发送轨迹请求
4.2.3 注意事项
- 确保所有服务和话题配置正确
- 确保 JSON 文件路径正确且数据有效
5. 补充说明
5.1 TACT文件格式说明
5.1.1 功能概述
TACT 文件是用于编辑 kuavo 的头部、手臂和手指的关节运动,文件内容采用 JSON 格式进行存储与组织。
TACT 文件可以通过手部编辑软件(使用手册)导出,welcome.tact 是欢迎动作,放在同目录下的 action_files 文件夹下。
用户可以自定义动作帧供贝塞尔曲线插值器使用,具体可以参考plan_arm_traj_bezier_no_tact_demo.py
5.1.2 主要字段说明
顶层结构
键名 类型 描述 frames
list 每一项为一个时间点中包含贝塞尔曲线插值器需要的所有关节数据 musics
list 音乐数据 finish
int 动作结束时刻,单位为毫秒 first
int 动作起始时刻,单位为毫秒 version
str .tact
文件的版本号,示例值:"1.0.0"
frames
键名 类型 描述 servos
list 包含所有关节角度值的数组,关节序号与关节位置的映射关系,在此处(KUAVO_4.1)、(KUAVO4pro长手版)或(KUAVO4pro短手版)查看 keyframe
int 关键帧的时间点,单位为毫秒 attribute
dict 包含所有关节的贝塞尔曲线控制点配置,一一对应 servos
中的每个关节,key 是关节编号,data 是用于调整贝赛尔曲线形状的参数attribute
键名 类型 描述 CP
list 控制点的坐标列表,包含左控制点和右控制点的数据,控制点定义为 [时间偏移量, 角度偏移量]
, 与CPType
的长度一致CPType
list 控制点类型,长度与 CP
对应,分别对应左控制点和右控制点,可选AUTO
或MANUAL
select
bool 在贝塞尔曲线插值器中未使用
5.1.3 示例
{
"frames": [
{
"servos": [20, 0, 0, -30, 15, -10, 0, 0, 5, -5, 10, 0, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"keyframe": 50,
"attribute": {
"1": {
"CP": [[0, 0], [21, 0]],
"CPType": ["AUTO", "AUTO"],
"select": false
},
"2": {
"CP": [[10, 10], [20, 20]],
"CPType": ["MANUAL", "AUTO"],
"select": true
},
"3": {
...
},
...
}
},
{
...
},
...
],
"musics": [],
"finish": 500,
"first": 0,
"version": "1.0.0"
}