跳到主要内容

手臂轨迹规划案例

1. 描述

  • 本文介绍用于规划人形机器人的手臂关节状态轨迹的实现
  • 示例代码位于 <kuavo-ros-opensource>/src/demo/examples_code/hand_plan_arm_trajectory
  • 目前提供两种插值方法用于实现手臂关节状态轨迹规划:
    1. 三次样条插值器 (plan_arm_traj_cubicspline_demo.py)
    2. 贝塞尔曲线插值器 (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: 关节角度单位, 可选 raddeg, 默认值为 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

字段类型描述
headerstd_msgs/Header消息头
joint_namesstring[]关节名称数组
pointsJointTrajectoryPoint[]轨迹点数组,只有points[0]包含最新的关节值
/<interpolate_type>/arm_traj_state

话题描述: 发布轨迹执行状态

消息类型: humanoid_plan_arm_trajectory/planArmState

字段类型描述
progressint32轨迹执行进度,单位毫秒
is_finishedbool轨迹是否执行完成
/kuavo_arm_traj

话题描述: 控制手部关节位置

消息类型: sensor_msgs/JointState

字段类型描述
headerstd_msgs/Header消息头
namestring[]关节名称
positionfloat64[]关节位置
velocityfloat64[]关节速度
effortfloat64[]关节力矩(未使用)

3.2 服务

/<interpolate_type>/plan_arm_trajectory

话题描述: 轨迹规划服务

其中 <interpolate_type> 可以是:

  • bezier: 贝塞尔曲线插值
  • cubic_spline: 三次样条插值

贝塞尔曲线插值服务

消息类型: humanoid_plan_arm_trajectory/planArmTrajectoryBezierCurve

请求参数:

字段类型描述
multi_joint_bezier_trajectoryjointBezierTrajectory[]多个关节的贝塞尔轨迹数组
start_frame_timefloat64轨迹的开始时间,单位秒
end_frame_timefloat64轨迹的结束时间,单位秒
joint_namesstring[]关节名称数组

返回结果:

字段类型描述
successbool规划是否成功

三次样条插值服务

消息类型: humanoid_plan_arm_trajectory/planArmTrajectoryCubicSpline

请求参数:

字段类型描述
joint_trajectorytrajectory_msgs/JointTrajectory关节轨迹规范

返回结果:

字段类型描述
successbool规划是否成功
/<interpolate_type>/stop_plan_arm_trajectory

话题描述: 停止轨迹执行服务

消息类型: std_srvs/Trigger

4. 使用指南

4.1 三次样条插值器

4.1.1 功能概述

plan_arm_traj_cubicspline_demo.py 使用三次样条插值器来规划机器人的手臂轨迹。

4.1.2 主要步骤

  1. 初始化节点和服务:

    • 初始化 ROS 节点 arm_trajectory_cubicspline_demo
    • 订阅 /cubic_spline/arm_traj 话题
    • 发布 /kuavo_arm_traj 话题
  2. 服务调用:

    • 设置手臂控制模式
    • 使用轨迹规划服务
  3. 轨迹规划:

    • 定义关节位置和时间点
    • 将当前关节状态作为起始点
    • 发送轨迹请求

4.1.3 注意事项

  • 确保所有服务和话题配置正确
  • 确保 mpc_observation 消息可用

4.2 贝塞尔曲线插值器

4.2.1 功能概述

plan_arm_traj_bezier_demo.py 使用贝塞尔曲线插值器来规划机器人的手臂轨迹。

4.2.2 主要步骤

  1. 初始化节点和服务:

    • 初始化 ROS 节点 arm_trajectory_bezier_demo
    • 订阅 /bezier/arm_traj 话题
    • 发布 /kuavo_arm_traj 话题
  2. 服务调用:

    • 设置手臂控制模式
    • 使用轨迹规划服务
  3. 轨迹规划:

    • 读取 JSON 动作数据
    • 定义贝塞尔曲线控制点
    • 发送轨迹请求

4.2.3 注意事项

  • 确保所有服务和话题配置正确
  • 确保 JSON 文件路径正确且数据有效

5. 补充说明

5.1 TACT文件格式说明

5.1.1 功能概述

  1. TACT 文件是用于编辑 kuavo 的头部、手臂和手指的关节运动,文件内容采用 JSON 格式进行存储与组织。

  2. TACT 文件可以通过手部编辑软件(使用手册)导出,welcome.tact 是欢迎动作,放在同目录下的 action_files 文件夹下。

  3. 用户可以自定义动作帧供贝塞尔曲线插值器使用,具体可以参考plan_arm_traj_bezier_no_tact_demo.py

5.1.2 主要字段说明

  1. 顶层结构

    键名类型描述
    frameslist每一项为一个时间点中包含贝塞尔曲线插值器需要的所有关节数据
    musicslist音乐数据
    finishint动作结束时刻,单位为毫秒
    firstint动作起始时刻,单位为毫秒
    versionstr.tact 文件的版本号,示例值:"1.0.0"
  2. frames

    键名类型描述
    servoslist包含所有关节角度值的数组,关节序号与关节位置的映射关系,在此处(KUAVO_4.1)(KUAVO4pro长手版)(KUAVO4pro短手版)查看
    keyframeint关键帧的时间点,单位为毫秒
    attributedict包含所有关节的贝塞尔曲线控制点配置,一一对应 servos 中的每个关节,key 是关节编号,data 是用于调整贝赛尔曲线形状的参数
  3. attribute

    键名类型描述
    CPlist控制点的坐标列表,包含左控制点和右控制点的数据,控制点定义为[时间偏移量, 角度偏移量], 与 CPType 的长度一致
    CPTypelist控制点类型,长度与 CP 对应,分别对应左控制点和右控制点,可选 AUTOMANUAL
    selectbool在贝塞尔曲线插值器中未使用

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"
}