跳转至

OpenArm 示教功能教程

简介

OpenArm 示教功能提供了完整的机器人轨迹录制与回放系统,支持双臂协作机器人的示教编程。通过本功能,您可以:

  • 录制轨迹: 实时记录机器人所有关节的运动状态(双臂 + 双夹爪)
  • 回放轨迹: 精确复现录制的运动轨迹,支持速度调节和选择性回放
  • 多控制器协同: 自动协调多个控制器(左臂、右臂、左夹爪、右夹爪)同步执行

系统架构

示教功能基于 ROS 2 Action 接口实现,主要包含两个核心组件:

1. 录制模块 (record_joint_states_always)

  • 订阅 /joint_states 话题,按固定频率采样所有关节状态
  • 支持交互式控制(开始/暂停/清空/保存)
  • 生成标准 YAML 格式的轨迹文件

2. 回放模块 (play_joint_trajectory)

  • 读取 YAML 轨迹文件,自动分组关节
  • 通过 FollowJointTrajectory Action 控制机械臂
  • 通过 GripperCommand Action 控制夹爪
  • 支持多控制器并行执行与时间同步

快速开始

环境准备

  1. 编译功能包:
    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 不保存直接退出

录制流程示例

  1. 启动录制节点
  2. 按 SPACE 开始录制
  3. 手动拖动机器人完成示教动作
  4. 按 SPACE 暂停录制(如需调整)
  5. 按 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
- 夹爪动作提前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: 双臂协同抓取

目标: 录制并回放双臂协同抓取物体的动作

  1. 录制轨迹:

    ros2 run openarm_utils record_joint_states_always --rate 20
    # 按SPACE开始录制
    # 执行双臂协同抓取动作
    # 按w保存
    

  2. 验证回放:

    ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --all-joints
    

  3. 调整速度:

    # 减速到50%便于观察
    ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --all-joints --rate-scale 0.5
    

案例2: 单臂精细操作

目标: 单独示教左臂进行精细装配

  1. 录制高精度轨迹:

    ros2 run openarm_utils record_joint_states_always --rate 50
    

  2. 仅回放左臂:

    ros2 run openarm_utils play_joint_trajectory joint_states_stream_*.yaml --left-arm
    

案例3: 夹爪独立测试

目标: 测试夹爪开合动作

  1. 录制包含夹爪动作的轨迹:

    ros2 run openarm_utils record_joint_states_always --rate 10
    # 手动控制夹爪开合
    

  2. 单独测试左夹爪:

    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