Alicia-D ROS2 Humble
1. 介绍
Alicia-D ROS2 是一个用于控制【灵动 Alicia-D】系列六轴机械臂(带夹爪)的 ROS 工具包。它基于 ROS 2 Humble 构建,提供通过串口通信控制机械臂运动、操作夹爪、读取姿态与状态数据等功能。
1.1 主要特性
- ros2_control 集成:基于标准的 ros2_control 硬件接口,支持与 MoveIt2 无缝集成。
- MoveIt2 支持:完整的 MoveIt2 运动规划与执行功能。
- 关节控制:支持设置与读取六个关节的角度,提供平滑轨迹执行。
- 夹爪控制:支持精确位置控制,适配 50mm 和 100mm 两种夹爪类型。
- 实时状态反馈:实时获取关节角、夹爪位置与机器人状态。
- 自动固件检测:自动检测固件版本。
- 串口通信:自动搜索串口或手动指定,支持高波特率通信。
- 零位校准:将当前位置设置为新的零点。
- 扭矩开关:开启或关闭关节电机扭矩,实现自由拖动示教。
1.2 项目结构
alicia_d_driver/
├── include/alicia_d_driver/
│ ├── alicia_d_hardware_interface.hpp # 硬件接口头文件
│ └── alicia_d_driver_node.hpp # 独立驱动节点
├── src/
│ ├── alicia_d_hardware_interface.cpp # 硬件接口实现
│ ├── alicia_d_driver_node.cpp # 独立驱动
│ └── serial_communicator.cpp # 串口通信
├── launch/
│ └── alicia_d_driver.launch.py # 独立驱动启动
├── alicia_d_driver.xml # 插件描述
└── CMakeLists.txt
alicia_d_moveit/
├── config/
│ ├── alicia_d_descriptions.ros2_control.xacro # 硬件接口配置
│ ├── ros2_controllers.yaml # 控制器配置
│ ├── moveit_controllers.yaml # MoveIt 控制器映射
│ └── ... # 其他 MoveIt 配置
├── launch/
│ ├── real_robot.launch.py # 真实机械臂启动
│ ├── demo.launch.py # 仿真启动
│ └── ... # 其他启动文件
└── package.xml
2. 快速开始
2.1 设置串口权限(一次性)
sudo usermod -a -G dialout $USER
然后需要完全注销并重新登录!
或临时设置:
sudo chmod 666 /dev/ttyACM*
2.2 获取源代码并编译
mkdir -p ~/alicia_ws/src
cd ~/alicia_ws
git clone https://github.com/Synria-Robotics/Alicia-D-ROS2.git -b v6.1.0 ./src
rosdep install --from-paths src --ignore-src -r -y
colcon build
source install/setup.bash
2.3 启动真实机械臂
ros2 launch alicia_d_driver alicia_d_driver.launch.py
3. 使用方法
3.1 MoveIt 仿真
对于 50mm 夹爪类型,使用默认值:
ros2 launch alicia_d_moveit demo.launch.py
对于 100mm 夹爪类型,指定夹爪类型:
ros2 launch alicia_d_moveit demo.launch.py gripper_type:=100mm
3.2 Real Robot MoveIt
使用 MoveIt 控制真实机械臂:
基本启动(使用默认参数):
ros2 launch alicia_d_moveit real_robot.launch.py
指定夹爪类型:
ros2 launch alicia_d_moveit real_robot.launch.py gripper_type:=50mm
指定串口(自动检测可用时可不指定):
ros2 launch alicia_d_moveit real_robot.launch.py \
gripper_type:=100mm \
port:=/dev/ttyACM0
指定运动速度(度/秒):
ros2 launch alicia_d_moveit real_robot.launch.py \
gripper_type:=50mm \
port:=/dev/ttyACM0 \
speed_deg_s:=30
MoveIt Launch 参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
gripper_type | 50mm | 夹爪类型:50mm 或 100mm |
port | ''(空字符串) | 串口设备路径,如 /dev/ttyACM0,留空则自动检测 |
speed_deg_s | 20 | 关节运动的默认速度(度/秒) |
提示:底层驱动会自动检测固件版本与机械臂版本(
v5_5/v5_6),一般无需手动指定。
3.3 独立驱动节点(无 MoveIt)
独立驱动节点仅运行底层驱动,不依赖 MoveIt,适用于只需要基础关节/夹爪控制的场景。
启动独立驱动
基本启动(使用默认参数):
ros2 launch alicia_d_driver alicia_d_driver.launch.py
指定串口:
ros2 launch alicia_d_driver alicia_d_driver.launch.py port:=/dev/ttyACM0
指定默认速度(度/秒):
ros2 launch alicia_d_driver alicia_d_driver.launch.py \
port:=/dev/ttyACM0 \
default_speed_deg_s:=30.0
独立驱动参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
port | ''(空字符串) | 串口设备路径,如 /dev/ttyACM0。留空则自动检测 |
default_speed_deg_s | 20.0 | 关节运动的默认速度(度/秒),范围:4.39–439.45 |
独立驱动 Topics
订阅 Topics:
/joint_commands(sensor_msgs/JointState):发送关节位置和速度命令/demonstration(std_msgs/Bool):使能/禁用示教模式(零力矩)/zero_calibrate(std_msgs/Bool):执行零位校准
发布 Topics:
/joint_states(sensor_msgs/JointState):发布当前关节状态(位置、速度)
使用示例
1. 使能示教模式(零力矩)
使能示教模式后,可以手动拖动机械臂进行示教:
ros2 topic pub --once /demonstration std_msgs/msg/Bool "{data: true}"
2. 禁用示教模式(恢复全力矩)
ros2 topic pub --once /demonstration std_msgs/msg/Bool "{data: false}"
3. 零位校准
⚠️ 注意:此操作不可逆,如非必要请忽略此步骤。
-
先禁用力矩(进入示教模式):
ros2 topic pub --once /demonstration std_msgs/msg/Bool "{data: true}" -
将机械臂手动移动到期望的零位姿势
-
执行零位校准(校准后会自动恢复力矩):
ros2 topic pub --once /zero_calibrate std_msgs/msg/Bool "{data: true}"
4. 发送关节命令
通过 /joint_commands topic 发送关节位置和速度命令。
示例 1:移动到零位,使用默认速度(20 度/秒)
ros2 topic pub --once /joint_commands sensor_msgs/msg/JointState "
name: ['Joint1', 'Joint2', 'Joint3', 'Joint4', 'Joint5', 'Joint6', 'Gripper']
position: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 500.0]
"
示例 2:指定速度移动(30 度/秒 = 0.524 弧度/秒)
ros2 topic pub --once /joint_commands sensor_msgs/msg/JointState "
name: ['Joint1', 'Joint2', 'Joint3', 'Joint4', 'Joint5', 'Joint6', 'Gripper']
position: [0.785, 0.785, 0.0, 0.0, 0.0, 0.0, 500.0]
velocity: [0.524, 0.524, 0.524, 0.524, 0.524, 0.524, 0.0]
"
单位说明:
/joint_commands topic 使用 sensor_msgs/JointState 消息类型,遵循 ROS 标准约定:
- 关节位置单位为 弧度(rad)
velocity字段中的速度单位为 弧度/秒(rad/s)
虽然驱动内部使用度/秒(
speed_deg_s/default_speed_deg_s),但 ROS 消息标准要求使用 rad/s。驱动会自动将 rad/s 转换为 deg/s,因此请始终以 rad/s 提供速度值。
行为说明:
- 如果提供了 rad/s 的速度值,驱动会将其转换为 deg/s,并使用最大值作为所有关节的公共速度
- 如果不提供速度,将使用
default_speed_deg_s参数值(单位为度/秒) - 夹爪位置范围为 0–1000(0 为完全打开,1000 为完全闭合)
速度转换参考(用于 /joint_commands topic):
- 20 度/秒 = 0.349 弧度/秒 → 使用
velocity: [0.349, 0.349, ...] - 30 度/秒 = 0.524 弧度/秒 → 使用
velocity: [0.524, 0.524, ...] - 40 度/秒 = 0.698 弧度/秒 → 使用
velocity: [0.698, 0.698, ...] - 100 度/秒 = 1.745 弧度/秒 → 使用
velocity: [1.745, 1.745, ...]
快速换算公式:弧度/秒 = 度/秒 × π / 180 或 弧度/秒 = 度/秒 × 0.0174533
5. 读取关节状态数据
ros2 topic echo /joint_states
4. 故障排除
4.1 连接问题
问题:无法连接到串口
解决方案:
- 检查线缆连接
- 验证端口名称:
ls /dev/tty* - 检查权限:
ls -l /dev/ttyACM0 - 将用户添加到 dialout 组:
sudo usermod -a -G dialout $USER
4.2 控制器故障
问题:控制器启动失败
解决方案:
- 检查硬件接口:
ros2 control list_hardware_interfaces - 检查控制器:
ros2 control list_controllers - 验证机械臂已连接并通电
4.3 运动执行问题
问题:规划成功但执行失败
解决方案:
- 验证固件版本是否正确检测(查看日志)
- 确保夹爪类型与硬件匹配(50mm vs 100mm)
- 使用
debug_mode:=true监控串口通信
5. 安全注意事项
⚠️ 重要的安全指南:
- 始终准备好紧急停止
- 在执行运动前清理工作区域
- 从慢速开始
- 首先在仿真中测试
- 在操作过程中监控机械臂
6. 支持
如有问题或疑问:
- 查看故障排除部分
- 查看 ROS 日志:
~/.ros/log/ - 启用调试模式:
debug_mode:=true - 检查硬件连接和固件版本
- Github发布Issue