Skip to content
 
 

Latest commit

 

History

51 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AgileX 机械臂 ROS2 驱动

English

ROS STATE
humble Pass
jazzy Pass

概述

当前工作区以 Nero 为主线,提供对应的 ROS2 控制、描述、MoveIt2 与 MIT 软控制接口。

说明 文档
SDK pyAgxArm
官方CAN模块的使用 can_user
TCP偏移设置 tcp_offset
URDF agx_arm_description
Moveit Moveit
Nero MIT 软控制 agx_arm_mit_controller
Q&A Q&A

快速开始

1. 安装 Python SDK

git clone https://github.com/agilexrobotics/pyAgxArm.git
cd pyAgxArm

根据你的 ROS 版本选择安装命令:

Jazzy 安装命令:

pip3 install . --break-system-packages

Humble 安装命令:

pip3 install .

2. 安装 ROS2 驱动

  1. 创建工作空间

    mkdir -p ~/agx_arm_ws/src
    cd ~/agx_arm_ws/src
  2. 克隆仓库

    git clone -b ros2 --recurse-submodules https://github.com/agilexrobotics/agx_arm_ros.git
    cd agx_arm_ros/
    git submodule update --remote --recursive

    当前仓库仅保留 vendor/Omnihand-2025-SDK 作为子模块;Nero/Revo2 描述资产已经直接提交在仓库内。

3. 安装依赖

运行脚本一键安装所有依赖

cd ~/agx_arm_ws/src/agx_arm_ros/scripts/
chmod +x agx_arm_install_deps.sh
bash ./agx_arm_install_deps.sh

或者依次执行以下命令手动安装:

  1. Python 依赖

    根据你的 ROS 版本选择安装命令:

    Jazzy 安装命令:

    pip3 install python-can scipy numpy --break-system-packages

    Humble 安装命令:

    pip3 install python-can scipy numpy
  2. CAN 工具

    sudo apt update && sudo apt install can-utils ethtool
  3. ROS2 依赖

    sudo apt install -y \
        ros-$ROS_DISTRO-ros2-control \
        ros-$ROS_DISTRO-ros2-controllers \
        ros-$ROS_DISTRO-controller-manager \
        ros-$ROS_DISTRO-topic-tools \
        ros-$ROS_DISTRO-joint-state-publisher-gui \
        ros-$ROS_DISTRO-robot-state-publisher \
        ros-$ROS_DISTRO-xacro \
        python3-colcon-common-extensions
  4. Moveit

    使用 MoveIt 前,需先配置相关依赖。 具体步骤请参考:agx_arm_moveit

    或者依次执行以下命令进行配置:

    sudo apt install ros-$ROS_DISTRO-moveit*
    sudo apt-get install -y \
        ros-$ROS_DISTRO-control* \
        ros-$ROS_DISTRO-joint-trajectory-controller \
        ros-$ROS_DISTRO-joint-state-* \
        ros-$ROS_DISTRO-gripper-controllers \
        ros-$ROS_DISTRO-trajectory-msgs

    若 apt 元数据里存在 ros-$ROS_DISTRO-trac-ik-kinematics-plugin,请额外安装:

    sudo apt-get install -y ros-$ROS_DISTRO-trac-ik-kinematics-plugin

    在 ROS 2 Humble / Jetson 环境下,该 TRAC-IK apt 包可能不存在。此时请参考 TRAC-IK Humble / Jetson 复现实录,在独立 overlay 中源码构建并先于 agx_arm_ros source。

    若系统语言区域设置不为英文区域,须设置为英文区域

    echo "export LC_NUMERIC=en_US.UTF-8" >> ~/.bashrc
    source ~/.bashrc

4.编译并Source工作空间

检查是否在虚拟环境里,如果是,建议先退出虚拟环境。

which pip3

编译工作空间并加载环境配置:

cd ~/agx_arm_ws
colcon build
source install/setup.bash

使用说明

激活 CAN 模块

使用前需先激活 CAN 模块,详见:CAN 配置指南

推荐优先使用仓库内的角色化准备脚本。该脚本会读取 config/can_interface_roles.json 中的角色定义,并统一处理 Nero、末端执行器与 OmniHand 的 SocketCAN 命名、波特率和 CAN FD 参数:

cd ~/agx_arm_ws/src/agx_arm_ros
python3 scripts/prepare_can_interfaces.py --list
python3 scripts/prepare_can_interfaces.py --roles nero --dry-run
python3 scripts/prepare_can_interfaces.py --roles nero

若需要显式绑定某个 USB 口或 Linux 接口,可额外传入 --nero-can-interface 3-1.4:1.0--nero-can-interface can0。当同时准备机械臂和 OmniHand 时,可使用 --roles nero,omnihand。兼容旧流程的 can_activate.sh / can_muti_activate.sh 仍保留在 CAN 配置指南 中。

启动驱动

您可以通过 launch 文件或直接运行节点来启动驱动。

重要提示:启动前必读 以下启动命令中的参数必须根据您的实际硬件配置进行替换:

  • can_port:机械臂连接的 CAN 端口,示例值 can0;若按本文推荐流程使用 prepare_can_interfaces.py,Nero 默认角色名为 can_nero
  • arm_type:机械臂的型号,当前工作区示例值 nero
  • effector_type:末端执行器类型,示例值 noneagx_gripper
  • tcp_offset:工具中心(TCP)相对法兰盘中心的偏移量,示例值:[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    • 注意 :tcp_offset 所有值均需为浮点数;关于 TCP 偏移实际配置示例,请参考 TCP 设置详解

所有参数的完整说明、默认值及可选值,请参阅下方的 启动参数

使用 launch 文件启动:

ros2 launch agx_arm_ctrl start_single_agx_arm.launch.py can_port:=can0 arm_type:=nero effector_type:=none tcp_offset:='[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]'

直接运行节点启动:

ros2 run agx_arm_ctrl agx_arm_ctrl_single --ros-args -p can_port:=can0 -p arm_type:=nero -p effector_type:=none -p tcp_offset:='[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]'

可视化调试启动:

ros2 launch agx_arm_ctrl start_single_agx_arm_rviz.launch.py can_port:=can0 arm_type:=nero effector_type:=none tcp_offset:='[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]'

注意:

  • start_single_agx_arm_rviz.launch.py 默认 use_mit_controller:=true,因此 RViz 控制路径会优先走 MIT 软轨迹,而不是直接写 /control/joint_states
  • control:=trueuse_mit_controller:=true 时,RViz 关节滑条会发布到 mit_controller/soft_target_joint_states,再由 agx_arm_mit_joint_state_bridge 转成发往 mit_controller 的调试短段 trajectory_msgs/JointTrajectory
  • mit_joint_target_duration_s 用于调节每个滑条目标的软轨迹时长;若要退回原始 /control/joint_states 路径,可显式设置 use_mit_controller:=false
  • follow:=true 时,模型会订阅真实反馈并驱动显示;若只做状态跟随展示,推荐保持 control:=false
  • MIT 调试 topic 仅在 control:=true 时开启,且滑条桥接节点不再自动使能 MIT;在拖动滑条前请先显式使能 mit_controller

MoveIt 一键启动(臂控 + MoveIt + RViz):

ros2 launch agx_arm_ctrl start_single_agx_arm_moveit.launch.py \
    can_port:=can_nero \
    arm_type:=nero \
    effector_type:=agx_gripper \
    load_simple_obstacles:=true

该启动方式默认 use_mit_controller:=true:会先启动 start_nero_mit_controller.launch.py,再让 MoveIt 通过 arm_controller/follow_joint_trajectory 直接调用 mit_controller 上的集成 MIT action server。load_simple_obstacles:=true 会通过 src/agx_arm_moveit/scripts/apply_simple_obstacles.pysimple_obstacles.json 中的基础障碍物注入规划场景;如需替换障碍物集合,可传入 simple_obstacles_config:=/abs/path/to/file.json。若要退回旧的直接执行路径,可显式设置 use_mit_controller:=false

MIT 侧控制频率与参数文件可继续通过 mit_control_rate_hzmit_params_file 调整。

Nero MIT 软轨迹控制(ROS 应用节点 + 臂控节点):

ros2 launch agx_arm_mit_controller start_nero_mit_controller.launch.py \
    can_port:=can_nero \
    arm_type:=nero \
    effector_type:=agx_gripper \
    tcp_offset:='[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]'

该启动方式会复用 agx_arm_ctrl 作为硬件适配层,并额外启动一个面向应用的 MIT 控制节点。它现在除了 can_port 外,也直接暴露 arm_typeeffector_typeomnihand_typelaunch_omnihand_bridgeomnihand_backend_typeauto_enablefast_modespeed_percentpub_rateenable_timeouttcp_offsetgripper_default_effortpublish_gripper_joint 等底层运行参数,同时额外提供 control_rate_hzparams_filelog_level,以及用于 RViz 软目标调试的显式 enable_debug_joint_trajectory_topic 开关。

该节点订阅 feedback/joint_states,对外提供 arm_controller/follow_joint_trajectory 给 MoveIt 使用,并持续发布 control/move_mit。仅当显式开启调试输入时,它才接收调试用的 ~/joint_trajectory topic,便于后续扩展软轨迹回放、重力补偿和碰撞监测。

若需要同时启动机械臂控制节点、MoveIt2 和 RViz,请使用上面的 start_single_agx_arm_moveit.launch.py;它会自动接入关节反馈,并默认复用 MIT 软轨迹执行路径。详见 Moveit

启动参数

参数 默认值 说明 可选值
can_port can0 CAN 端口 -
arm_type nero 机械臂型号 nero
effector_type none 末端执行器类型 none, agx_gripper, revo2
namespace 空字符串 机械臂实例命名空间 任意合法 ROS 命名空间
auto_enable true 启动时自动使能 true, false
fast_mode false 启用快速模式(如果启用,/control/joint_states 内部将改用无平滑无插值的 move_js 关节控制接口控制机械臂) true, false
speed_percent 100 运动速度 (%) 0-100
pub_rate 200 状态发布频率 (Hz) -
enable_timeout 5.0 使能超时 (秒) -
tcp_offset [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] 工具中心(TCP)相对法兰盘中心的偏移 [x, y, z, rx, ry, rz] -
gripper_default_effort 1.0 夹爪默认力(单位:N) >=0.0
publish_gripper_joint true 是否在 /feedback/joint_states 中发布 gripper 关节(夹爪开口宽度)。与 MoveIt 联用时设为 false,因 URDF 中仅有 gripper_joint1/gripper_joint2 true, false
log_level info 日志级别 debug, info, warn, error, fatal

URDF 模型可视化

独立查看模型

在 RViz 中加载 URDF 模型并通过 GUI 滑条手动调试关节,可以不启动机械臂节点:

ros2 launch agx_arm_description display.launch.py arm_type:=nero

支持以下三种方式指定模型:

  1. 预设型号名称(通过 arm_type 指定)(推荐):直接使用内置型号名,自动匹配对应 URDF 文件

    ros2 launch agx_arm_description display.launch.py arm_type:=nero
  2. 相对路径(通过 custom_model 指定):相对于 agx_arm_urdf/ 目录的路径,适用于自定义模型

    ros2 launch agx_arm_description display_control.launch.py custom_model:=nero/urdf/nero_description.urdf
  3. 绝对路径(通过 custom_model 指定):直接指定 URDF 文件的绝对路径,适用于任意位置的模型文件

    ros2 launch agx_arm_description display_control.launch.py custom_model:=~/agx_arm_ws/src/agx_arm_ros/src/agx_arm_sim/agx_arm_description/agx_arm_urdf/nero/urdf/nero_description.urdf
参数 默认值 说明
arm_type nero 机械臂型号,预设值:nero
custom_model 空字符串 可选自定义模型路径;相对路径时相对于 agx_arm_urdf/ 目录,绝对路径可指向任意 URDF/xacro 文件。若设置该参数,则 arm_typeeffector_type 将被忽略
effector_type none 末端执行器类型,预设值:none, agx_gripper, revo2
revo2_type left Revo2 灵巧手类型,预设值:left, right
pub_rate 200 状态发布频率 (Hz)
gui true 是否启用 joint_state_publisher_gui 关节滑条控制界面
rvizconfig 内置配置 自定义 RViz 配置文件的绝对路径
follow false 是否跟随真实机械臂状态(订阅 /feedback/joint_states,并在 robot_state_publisher 中重映射 /joint_statesfeedback/joint_states
tcp_offset [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] TCP 偏移 [x, y, z, rx, ry, rz](米/弧度)。非零时自动发布 tcp_link 坐标系
control true 是否通过 joint_state_publisher(或 GUI 版本)发布控制话题:true 时发布到 control_topicfalse 时仅用于跟随或显示,不发布控制话题。与 follow:=true 配合时,常用组合为 follow:=true, control:=false(只跟随真实机械臂,不从 RViz 发出控制)
control_topic /control/joint_states RViz 关节滑条输出(joint_state_publisher_gui)发布到的目标话题

典型应用组合示例(follow / control)

下面给出几种常见使用场景下,followcontrol 的推荐组合及对应示例指令:

  • 场景 1:纯模型调试(无真机,仅看 URDF、用滑条拖动)
    • 是否需要真机:否
    • 推荐配置:follow:=false, control:=true
    • 示例:
      ros2 launch agx_arm_description display_control.launch.py arm_type:=nero follow:=false control:=true

说明:若希望把 RViz 滑动条发布的关节目标重定向给阻抗控制器(例如 agx_arm_impedance 的关节阻抗 control_type:=joint_impedance),可在启动 display.launch.py 时设置 control:=truecontrol_topic:=/impedance/target_joint

  • 场景 2:真机 + 仅控制不跟随(从 RViz 发控制,但 RViz 不显示真实反馈)

    • 是否需要真机:是
    • 推荐配置:follow:=false, control:=true
    • 示例:
      ros2 launch agx_arm_ctrl start_single_agx_arm_rviz.launch.py can_port:=can0 arm_type:=nero follow:=false control:=true
  • 场景 3:真机 + 仅跟随不控制(常见:只看状态,不希望 RViz 干扰控制)

    • 是否需要真机:是
    • 推荐配置:follow:=true, control:=false
    • 示例:
      ros2 launch agx_arm_ctrl start_single_agx_arm_rviz.launch.py can_port:=can0 arm_type:=nero follow:=true control:=false
  • 场景 4:真机 + 控制 + 跟随(从 RViz 发控制,并在 RViz 跟随真实反馈)

    • 是否需要真机:是
    • 推荐配置:follow:=true, control:=true
    • 示例:
      ros2 launch agx_arm_ctrl start_single_agx_arm_rviz.launch.py can_port:=can0 arm_type:=nero follow:=true control:=true

提示: 一般情况下,建议控制通道保持唯一,即只保留一个组件负责发布 /control/* 话题(如 agx_arm_ctrl 节点、MoveIt、或 RViz 中的 joint_state_publisher 三者选其一),以避免多源控制导致冲突。


控制示例

额外启动一个终端,运行以下指令:

cd ~/agx_arm_ws
source install/setup.bash
cd src/agx_arm_ros

Nero 机械臂

  1. 关节运动

    ros2 topic pub /control/move_j sensor_msgs/msg/JointState \
      "$(cat test/nero/test_move_j.yaml)" -1
  2. 点到点运动

    ros2 topic pub /control/move_p geometry_msgs/msg/PoseStamped \
      "$(cat test/nero/test_move_p.yaml)" -1
  3. 直线运动

    ros2 topic pub /control/move_l geometry_msgs/msg/PoseStamped \
      "$(cat test/nero/test_move_l.yaml)" -1
  4. 圆弧运动(起点 → 中间点 → 终点)

    ros2 topic pub /control/move_c geometry_msgs/msg/PoseArray \
      "$(cat test/nero/test_move_c.yaml)" -1

Gripper 夹爪

  1. 夹爪控制(通过 /control/joint_states控制)

    ros2 topic pub /control/joint_states sensor_msgs/msg/JointState \
      "$(cat test/gripper/test_gripper_joint_states.yaml)" -1

注意: 以上夹爪控制指令,需在 launch 文件或参数中设置 effector_type=agx_gripper

Hand 灵巧手

  1. 灵巧手 — 位置模式(所有手指移动到 10)

    ros2 topic pub /control/hand agx_arm_msgs/msg/HandCmd \
      "$(cat test/hand/test_hand_position.yaml)" -1
  2. 灵巧手 — 速度模式(所有手指速度 50)

    ros2 topic pub /control/hand agx_arm_msgs/msg/HandCmd \
      "$(cat test/hand/test_hand_speed.yaml)" -1
  3. 灵巧手 — 电流模式(所有手指电流 50)

    ros2 topic pub /control/hand agx_arm_msgs/msg/HandCmd \
      "$(cat test/hand/test_hand_current.yaml)" -1
  4. 灵巧手 — 位置-时间控制(所有手指移动到 50,时间 1 秒)

    ros2 topic pub /control/hand_position_time agx_arm_msgs/msg/HandPositionTimeCmd \
      "$(cat test/hand/test_hand_position_time.yaml)" -1
  5. 灵巧手控制(通过 /control/joint_states控制)

    ros2 topic pub /control/joint_states sensor_msgs/msg/JointState \
      "$(cat test/hand/test_hand_joint_states.yaml)" -1

注意: 以上灵巧手控制指令,需在 launch 文件或参数中设置 effector_type=revo2

服务调用

  1. 使能机械臂

    ros2 service call /enable_agx_arm std_srvs/srv/SetBool "{data: true}"
  2. 失能机械臂

    ros2 service call /enable_agx_arm std_srvs/srv/SetBool "{data: false}"
  3. 回零位

    ros2 service call /move_home std_srvs/srv/Empty
  4. 急停(保持当前位置)

    ros2 service call /emergency_stop std_srvs/srv/Empty

状态订阅

  1. 关节状态

    ros2 topic echo /feedback/joint_states
  2. TCP 位姿

    ros2 topic echo /feedback/tcp_pose
  3. 机械臂状态

    ros2 topic echo /feedback/arm_status
  4. 主导臂关节角度(主导臂模式下使用)

    ros2 topic echo /feedback/leader_joint_angles
  5. 夹爪状态

    ros2 topic echo /feedback/gripper_status
  6. 灵巧手状态

    ros2 topic echo /feedback/hand_status

ROS2 接口

反馈话题

话题 消息类型 说明 适用条件
/feedback/joint_states sensor_msgs/JointState 关节状态 始终可用
/feedback/tcp_pose geometry_msgs/PoseStamped TCP 位姿 始终可用
/feedback/arm_status agx_arm_msgs/AgxArmStatus 机械臂状态 始终可用
/feedback/leader_joint_angles sensor_msgs/JointState 主导臂关节角度 主导臂模式
/feedback/gripper_status agx_arm_msgs/GripperStatus 夹爪状态 配置 AgxGripper
/feedback/hand_status agx_arm_msgs/HandStatus 灵巧手状态 配置 Revo2

/feedback/joint_states 详细说明

该话题包含机械臂和末端执行器的组合关节状态:

机械臂关节 (joint1 ~ joint*)

字段 说明
position 关节角度 (rad)
velocity 关节速度 (rad/s)
effort 关节力矩 (Nm)

夹爪关节 (需配置 effector_type=agx_gripper

默认发布 grippergripper_joint1gripper_joint2 三个关节;若 publish_gripper_joint 设为 false,仅发布 gripper_joint1gripper_joint2(URDF 中的关节名,适配 MoveIt)。

关节名 position 说明 velocity effort
gripper 夹爪开口宽度 (m),范围 [0, 0.1] 0.0 力 (N)
gripper_joint1 单侧夹片位移 = 宽度 × 0.5 (m) 0.0 力 (N)
gripper_joint2 单侧夹片位移 = 宽度 × -0.5 (m) 0.0 力 (N)

灵巧手关节(需配置 effector_type=revo2

左手关节命名:

  • left_thumb_metacarpal_joint
  • left_thumb_proximal_joint
  • left_index_proximal_joint
  • left_middle_proximal_joint
  • left_ring_proximal_joint
  • left_pinky_proximal_joint

右手关节命名:

  • right_thumb_metacarpal_joint
  • right_thumb_proximal_joint
  • right_index_proximal_joint
  • right_middle_proximal_joint
  • right_ring_proximal_joint
  • right_pinky_proximal_joint
字段 说明
position 手指关节角度 (rad)
velocity 0.0
effort 0.0

/feedback/arm_status 详细说明

消息类型:agx_arm_msgs/AgxArmStatus

消息字段说明:

字段 类型 说明
ctrl_mode uint8 控制模式,见下表
arm_status uint8 机械臂状态,见下表
mode_feedback uint8 模式反馈,见下表
teach_status uint8 示教状态,见下表
motion_status uint8 运动状态:0=已到达目标位置,1=未到达目标位置
trajectory_num uint8 当前轨迹点序号(0~255,离线轨迹模式下反馈)
err_status int64 错误状态码
joint_1_angle_limit ~ joint_7_angle_limit bool 关节1~7角度超限(true=异常,false=正常)
communication_status_joint_1 ~ communication_status_joint_7 bool 关节1~7通信状态(true=异常,false=正常)

控制模式 (ctrl_mode):

说明
0 待机
1 CAN指令控制
2 示教模式
3 以太网控制
4 WiFi控制
5 遥控模式
6 联动示教输入
7 离线轨迹模式
8 TCP控制

机械臂状态 (arm_status):

说明
0 正常
1 急停
2 无解
3 奇异点
4 目标角度超限
5 关节通信异常
6 关节刹车未释放
7 发生碰撞
8 示教拖动超速
9 关节状态异常
10 其他异常
11 示教记录中
12 示教执行中
13 示教暂停
14 主控NTC过温
15 释放电阻NTC过温

模式反馈 (mode_feedback):

说明
0 MOVE P
1 MOVE J
2 MOVE L
3 MOVE C
4 MOVE MIT
5 MOVE CPV

示教状态 (teach_status):

说明
0 关闭
1 开始示教记录(进入拖动示教)
2 结束示教记录(退出拖动示教)
3 执行示教轨迹
4 暂停执行
5 继续执行
6 终止执行
7 移动至轨迹起点

/feedback/gripper_status 详细说明

消息类型:agx_arm_msgs/GripperStatus

消息字段说明:

字段 类型 说明
header std_msgs/Header 消息头
width float64 当前夹爪开口宽度(单位:米)
force float64 当前夹持力(单位:牛顿)
voltage_too_low bool 电压过低(true=异常,false=正常)
motor_overheating bool 电机过热(true=异常,false=正常)
driver_overcurrent bool 驱动器过流(true=异常,false=正常)
driver_overheating bool 驱动器过热(true=异常,false=正常)
sensor_status bool 传感器状态(true=异常,false=正常)
driver_error_status bool 驱动器错误状态(true=异常,false=正常)
driver_enable_status bool 驱动器使能状态(true=已使能,false=未使能)
homing_status bool 回零/归零状态(true=已完成,false=未完成)

/feedback/hand_status 详细说明

消息类型:agx_arm_msgs/HandStatus

消息字段说明:

字段 类型 说明
header std_msgs/Header 消息头
left_or_right uint8 手部类型标识:1=左手,2=右手

手指位置字段(范围:[0, 100],0=完全张开,100=完全弯曲):

字段 类型 说明
thumb_tip_pos uint8 拇指指尖位置
thumb_base_pos uint8 拇指指根位置
index_finger_pos uint8 食指位置
middle_finger_pos uint8 中指位置
ring_finger_pos uint8 无名指位置
pinky_finger_pos uint8 小指位置

手指电机状态字段(0=空闲,1=运行中,2=堵转/卡死):

字段 类型 说明
thumb_tip_status uint8 拇指指尖电机状态
thumb_base_status uint8 拇指指根电机状态
index_finger_status uint8 食指电机状态
middle_finger_status uint8 中指电机状态
ring_finger_status uint8 无名指电机状态
pinky_finger_status uint8 小指电机状态

控制话题

话题 消息类型 说明 适用条件
/control/joint_states sensor_msgs/JointState 关节控制(含末端执行器) 始终可用
/control/move_j sensor_msgs/JointState 关节控制运动 始终可用
/control/move_p geometry_msgs/PoseStamped 点到点运动 始终可用
/control/move_l geometry_msgs/PoseStamped 直线运动 始终可用
/control/move_c geometry_msgs/PoseArray 圆弧运动 始终可用
/control/move_js sensor_msgs/JointState MIT 模式关节运动 始终可用
/control/move_mit agx_arm_msgs/MoveMITMsg MIT 力矩控制 始终可用
/control/hand agx_arm_msgs/HandCmd 灵巧手控制 配置 Revo2
/control/hand_position_time agx_arm_msgs/HandPositionTimeCmd 灵巧手位置时间控制 配置 Revo2

/control/joint_states 详细说明

该话题使用 sensor_msgs/JointState 消息类型,支持同时控制机械臂关节和末端执行器(夹爪/灵巧手)。只需发送要控制的关节即可,未包含的关节不受影响。

消息字段说明:

字段 说明
name 关节名称列表
position 对应关节的目标位置
velocity 未使用(可留空)
effort 用于夹爪力控制(仅对 gripper 关节有效)

通过 /control/joint_states 控制夹爪(需配置 effector_type=agx_gripper

name 中包含 gripper,通过 position 设置目标宽度,通过 effort 设置夹持力。

关节名 position(宽度) effort(力)
gripper 目标宽度 (m),范围: [0.0, 0.1] 目标力 (N),范围: [0.5, 3.0],默认: 1.0

注意:effort 为 0 或未指定时,使用默认力 1.0N。

示例:控制夹爪宽度 0.05m、力 1.5N

ros2 topic pub /control/joint_states sensor_msgs/msg/JointState \
  "{name: [gripper], position: [0.05], velocity: [], effort: [1.5]}" -1

通过 /control/joint_states 控制灵巧手(需配置 effector_type=revo2

name 中包含灵巧手关节名,通过 position 设置目标位置(position 模式, 单位: rad)。仅需发送要控制的关节,未包含的关节将保持当前位置。

示例:仅控制左手食指到位置 0.5rad

ros2 topic pub /control/joint_states sensor_msgs/msg/JointState \
  "{name: [left_index_proximal_joint], position: [0.5], velocity: [], effort: []}" -1
关节名 说明 position 范围
left_thumb_metacarpal_joint / right_thumb_metacarpal_joint 大拇指指根 [0, 1.57]
left_thumb_proximal_joint / right_thumb_proximal_joint 大拇指指尖 [0, 1.03]
left_index_proximal_joint / right_index_proximal_joint 食指 [0, 1.41]
left_middle_proximal_joint / right_middle_proximal_joint 中指 [0, 1.41]
left_ring_proximal_joint / right_ring_proximal_joint 无名指 [0, 1.41]
left_pinky_proximal_joint / right_pinky_proximal_joint 小指 [0, 1.41]

/control/move_mit 详细说明

消息类型:agx_arm_msgs/MoveMITMsg

消息字段说明:

字段 类型 说明
joint_index int32[] 要控制的关节索引数组
p_des float64[] 期望关节位置数组(单位:弧度)
v_des float64[] 期望关节速度数组(单位:弧度/秒)
kp float64[] 位置增益数组
kd float64[] 速度增益数组
torque float64[] 期望关节力矩数组(单位:牛·米,N·m)

注意: 所有数组字段长度需与 joint_index 一致,支持同时控制多个关节。

/control/hand 详细说明

消息类型:agx_arm_msgs/HandCmd

消息字段说明:

字段 类型 说明
mode string 控制模式:position(位置)/ speed(速度)/ current(电流)

各手指目标值字段:

字段 类型 说明
thumb_tip int8 拇指指尖目标值
thumb_base int8 拇指指根目标值
index_finger int8 食指目标值
middle_finger int8 中指目标值
ring_finger int8 无名指目标值
pinky_finger int8 小指目标值

不同模式下的数值范围:

模式 数值范围 说明
position [0, 100] 0=完全张开,100=完全弯曲
speed [-100, 100] 负值=张开方向,正值=弯曲方向
current [-100, 100] 负值=张开方向,正值=弯曲方向

/control/hand_position_time 详细说明

消息类型:agx_arm_msgs/HandPositionTimeCmd

消息字段说明:

各手指目标位置字段(范围:[0, 100],0=完全张开,100=完全弯曲):

字段 类型 说明
thumb_tip_pos int8 拇指指尖位置
thumb_base_pos int8 拇指指根位置
index_finger_pos int8 食指位置
middle_finger_pos int8 中指位置
ring_finger_pos int8 无名指位置
pinky_finger_pos int8 小指位置

各手指到达时间字段(单位:10毫秒,范围:[0, 255],例如:200 = 2秒):

字段 类型 说明
thumb_tip_time uint8 拇指指尖到达时间
thumb_base_time uint8 拇指指根到达时间
index_finger_time uint8 食指到达时间
middle_finger_time uint8 中指到达时间
ring_finger_time uint8 无名指到达时间
pinky_finger_time uint8 小指到达时间

服务

服务 类型 说明 适用条件
/enable_agx_arm std_srvs/SetBool 使能/失能机械臂 始终可用
/move_home std_srvs/Empty 回零位 始终可用
/emergency_stop std_srvs/Empty 急停(保持当前位置) 始终可用

参数限制

夹爪 (Gripper)

参数 范围 默认值 说明
width (宽度) [0.0, 0.1] m - 目标开合宽度
force (力) [0.5, 3.0] N 1.0 夹持力度

⚠️ 超出范围的值将被拒绝(不执行),节点输出警告日志。例如:发送 force=5.0 时,该指令不会执行,并输出 force must be in range [0.5, 3.0], current value: 5.0 警告。

灵巧手 (Revo2)

参数 范围 说明
position (位置) [0, 100] 手指目标位置,0 为完全张开,100 为完全握紧
speed (速度) [-100, 100] 手指运动速度
current (电流) [-100, 100] 手指驱动电流
time (时间) [0, 255] 到达目标位置的时间(单位: 10ms,例如 100 = 1 秒)

⚠️ 超出范围的值将被拒绝(不执行),节点输出警告日志。例如:发送 position=120 时,该指令不会执行,并输出 position must be in range [0, 100], current value: 120 警告。


注意事项

CAN 通信

  • 使用前必须先激活 CAN 模块
  • 波特率:1000000 bps
  • 若出现 SendCanMessage failed 错误,请检查 CAN 连接

⚠️ 安全警告

  • 保持安全距离:机械臂运动时,请勿进入其工作空间,以免造成伤害
  • 奇异点风险:靠近运动学奇异点时,关节可能发生突然大幅运动
  • MIT 模式危险:高速响应的 MIT 模式极具危险性,请谨慎使用

About

AgileX Arm ROS with custom Controllers

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages