OpenArm 示教功能教程¶
简介¶
OpenArm 示教功能提供了完整的机器人轨迹录制与回放系统,支持双臂协作机器人的示教编程。通过本功能,您可以:
- 录制轨迹: 实时记录机器人所有关节的运动状态(双臂 + 双夹爪)
- 回放轨迹: 精确复现录制的运动轨迹,支持速度调节和选择性回放
- 多控制器协同: 自动协调多个控制器(左臂、右臂、左夹爪、右夹爪)同步执行
系统架构¶
示教功能基于 ROS 2 Action 接口实现,主要包含两个核心组件:
1. 录制模块 (record_joint_states_always)¶
- 订阅 /joint_states 话题,按固定频率采样所有关节状态
- 支持交互式控制(开始/暂停/清空/保存)
- 生成标准 YAML 格式的轨迹文件
2. 回放模块 (play_joint_trajectory)¶
- 读取 YAML 轨迹文件,自动分组关节
- 通过 FollowJointTrajectory Action 控制机械臂
- 通过 GripperCommand Action 控制夹爪
- 支持多控制器并行执行与时间同步
快速开始¶
环境准备¶
- 编译功能包:
cd ~/openarmx_robotstride_ws-cc colcon build --packages-select openarm_utils source install/setup.bash
第一步:启动机器人控制系统(MoveIt):¶
ros2 launch openarm_bimanual_moveit_config demo.launch.py
第二步:调整 KP、KD 参数¶
因为示教功能需要手动调整机器人位置,所以需要将 KP、KD 参数调整到很小的值。
添加 KP、KD参数面板:
视频制作中,敬请期待!
第三步:录制轨迹¶
再打开一个新的终端窗口,启动录制节点:
ros2 run openarm_utils record_joint_states_always --rate 20
录制参数说明¶
| 参数 | 说明 | 默认值 |
|---|---|---|
| --rate | 采样频率(Hz) | 10 |
| --topic | 关节状态话题名 | /joint_states |
| --outfile | 输出文件路径 | 自动生成 |
交互式控制¶
录制节点启动后,可通过以下按键控制:
| 按键 | 功能 |
|---|---|
| SPACE 或 p | 开始/暂停录制 |
| c | 清空所有已录制数据(需确认) |
| w | 保存并退出(需确认) |
| q | 不保存直接退出 |
录制流程示例¶
- 启动录制节点
- 按 SPACE 开始录制
- 手动拖动机器人完成示教动作
- 按 SPACE 暂停录制(如需调整)
- 按 w 保存轨迹,生成文件如: joint_states_stream_20231215_143052.yaml
采样频率建议¶
- 粗略动作: 5-10 Hz (减小文件大小)
- 常规示教: 10-20 Hz (推荐)
- 精细操作: 20-50 Hz (高精度,文件较大)
注意: 频率过低会导致轨迹不平滑;频率过高会增大文件体积,且对夹爪的连续变化意义不大。
第四步:回放轨迹¶
基本用法¶
回放所有关节(双臂 + 双夹爪):
ros2 run openarm_utils play_joint_trajectory joint_states_stream_20231215_143052.yaml --all-joints
选择性回放¶
只回放左臂:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --left-arm
只回放右臂:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --right-arm
只回放双臂(不含夹爪):
ros2 run openarm_utils play_joint_trajectory <yaml文件> --both-arms
指定关节回放:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --joints openarm_left_joint1 openarm_left_joint2
回放参数说明¶
| 参数 | 说明 | 默认值 |
|---|---|---|
| --all-joints | 回放所有关节 | 是(默认) |
| --left-arm | 仅左臂关节 | 否 |
| --right-arm | 仅右臂关节 | 否 |
| --both-arms | 双臂不含夹爪 | 否 |
| --joints | 指定关节列表 | - |
| --rate-scale | 速度缩放系数 | 1.0 |
| --action | 指定单一Action | 自动检测 |
| --sync-feedback | 启用反馈同步 | 否 |
| --sync-margin | 同步提前量(秒) | 0.0 |
速度控制¶
加速回放(2倍速):
ros2 run openarm_utils play_joint_trajectory <yaml文件> --all-joints --rate-scale 2.0
减速回放(0.5倍速):
ros2 run openarm_utils play_joint_trajectory <yaml文件> --all-joints --rate-scale 0.5
说明: rate-scale > 1.0 加速, rate-scale < 1.0 减速
高级功能¶
多控制器同步¶
自动分组机制¶
回放模块会根据关节名称自动分组:
| 关节前缀 | 控制器 | Action类型 |
|---|---|---|
| openarm_left_joint* | 左臂控制器 | FollowJointTrajectory |
| openarm_right_joint* | 右臂控制器 | FollowJointTrajectory |
| openarm_left_finger* | 左夹爪控制器 | GripperCommand |
| openarm_right_finger* | 右夹爪控制器 | GripperCommand |
时间同步策略¶
墙钟同步模式(默认):
ros2 run openarm_utils play_joint_trajectory <yaml文件> --all-joints
反馈同步模式(高精度):
ros2 run openarm_utils play_joint_trajectory <yaml文件> --all-joints --sync-feedback
提前触发模式:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --all-joints --sync-feedback --sync-margin 0.05
单控制器测试¶
测试左夹爪:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --action /left_gripper_controller/gripper_cmd
测试右臂轨迹控制器:
ros2 run openarm_utils play_joint_trajectory <yaml文件> --action /right_joint_trajectory_controller/follow_joint_trajectory
轨迹文件格式¶
YAML结构¶
joint_names:
- openarm_left_joint1
- openarm_left_joint2
- ...
- openarm_left_finger_joint1
- openarm_left_finger_joint2
- openarm_right_joint1
- ...
points:
- positions: [0.0, -0.5, 0.3, ...] # 按joint_names顺序
time_from_start: 0.05 # 相对起点的时间(秒)
- positions: [0.1, -0.4, 0.35, ...]
time_from_start: 0.10
- ...
实战案例¶
案例1: 双臂协同抓取¶
目标: 录制并回放双臂协同抓取物体的动作
-
录制轨迹:
ros2 run openarm_utils record_joint_states_always --rate 20 # 按SPACE开始录制 # 执行双臂协同抓取动作 # 按w保存 -
验证回放:
ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --all-joints -
调整速度:
# 减速到50%便于观察 ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --all-joints --rate-scale 0.5
案例2: 单臂精细操作¶
目标: 单独示教左臂进行精细装配
-
录制高精度轨迹:
ros2 run openarm_utils record_joint_states_always --rate 50 -
仅回放左臂:
ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --left-arm
案例3: 夹爪独立测试¶
目标: 测试夹爪开合动作
-
录制包含夹爪动作的轨迹:
ros2 run openarm_utils record_joint_states_always --rate 10 # 手动控制夹爪开合 -
单独测试左夹爪:
ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml \ --action /left_gripper_controller/gripper_cmd \ --joints openarm_left_finger_joint1 openarm_left_finger_joint2