本 ROS 软件包 (alicia_duo_leader_driver) 旨在处理与机械臂底层硬件的串口通信,解析接收到的数据,并将机械臂的状态(如关节角度、夹爪状态、按钮信息)发布为标准的 ROS 消息。
该驱动程序包含多个节点,协同工作以实现完整的功能:
- 串口服务节点 (
serial_server_node): C++ 实现,负责底层的串口读写和原始数据帧的校验与发布/接收。 - 数据类型处理节点 (
serial_data_type_node.py): Python 实现,订阅原始串口数据,根据指令ID将数据分发到不同的处理话题。 - 舵机状态节点 (
servo_states_node.py): Python 实现,处理来自serial_data_type_node.py的舵机和夹爪状态数据,将其转换为标准的ArmJointState消息(使用弧度单位)并发布。
在开始部署之前,请确保您的系统满足以下要求:
- 操作系统: Ubuntu 18.04 (Melodic) 或 Ubuntu 20.04 (Noetic) - 推荐使用 Ubuntu 20.04 / ROS Noetic。
- ROS: ROS Melodic 或 ROS Noetic (推荐 Desktop-Full 安装)。
- 构建工具:
catkin(通常随 ROS 安装)。 - 编译器: C++11 或更高版本的编译器 (如 g++)。
- Python: Python 3.x (通常随较新版 ROS 安装)。
- ROS
serial库: 用于串口通信 (sudo apt-get install ros-<ros-distro>-serial)。 - Boost 库: (通常随 ROS Desktop-Full 安装)。
<ros-distro> 应替换为您使用的 ROS 发行版名称,例如 noetic 或 melodic。
以下步骤将指导您完成 alicia_duo_leader_driver 的安装和部署。假设您已经安装了 ROS 并且熟悉基本的 Linux 命令行操作。
确保您的 ROS 环境已正确安装并配置。如果您尚未安装 ROS,请遵循官方 ROS 安装指南。
如果您还没有 Catkin 工作空间,请创建一个:
# 创建工作空间目录
mkdir -p ~/alicia_leader_ws
cd ~/alicia_leader_ws将本代码库克隆到您的 Catkin 工作空间下:
git clone https://github.com/Xianova-Robotics/Alicia-D-Leader-ROS.git ./src/进入工作空间根目录,并使用 rosdep 安装软件包依赖:
cd ~/alicia_leader_ws
rosdep install --from-paths src --ignore-src -r -y如果 rosdep 提示找不到某些依赖,您可能需要手动安装 (例如 sudo apt-get install ros-<ros-distro>-serial)。
使用 catkin_make 编译工作空间中的所有软件包:
cd ~/alicia_leader_ws
catkin_make编译过程可能需要一些时间。如果遇到错误,请检查依赖项是否已正确安装以及代码是否完整。
每次打开新的终端时,都需要 source 工作空间的配置文件,以便 ROS 能够找到您的软件包:
echo "source ~/alicia_leader_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc如果您使用的是 zsh,请将 .bashrc 替换为 .zshrc。
Linux 系统通常需要将用户添加到 dialout 组才能访问串口设备:
sudo usermod -a -G dialout $USER执行此命令后,您需要完全注销并重新登录系统,或者重启计算机,才能使权限生效。
要启动机械臂的驱动程序和所有相关节点,请运行 serial_server.launch 文件。确保机械臂已通过 USB 连接到计算机。
roslaunch alicia_duo_leader_driver serial_server.launch该命令将启动以下节点:
serial_server_node: 处理底层串口通信。serial_data_type_node.py: 分类转发串口数据。servo_states_node.py: 处理状态数据并发布/arm_joint_state。
您可以通过添加参数来修改启动行为,例如启用调试模式或指定串口:
# 启用调试模式
roslaunch alicia_duo_leader_driver serial_server.launch debug_mode:=true
# 指定串口为 ttyUSB0
roslaunch alicia_duo_leader_driver serial_server.launch port:=ttyUSB0
# 同时指定端口和启用调试
roslaunch alicia_duo_leader_driver serial_server.launch port:=ttyUSB0 debug_mode:=true项目提供了一个简单的 Python 脚本 (arm_read_demo.py) 来演示如何订阅和打印机械臂的状态信息。
- 确保核心服务 (
serial_server.launch) 正在运行。 - 打开一个新的终端 (确保已 source
setup.bash)。 - 运行示例脚本:
rosrun alicia_duo_leader_driver arm_read_demo.py您将在终端中看到持续打印的机械臂关节角度(度和弧度)、夹爪角度和按钮状态。
成功部署并启动驱动程序后,最关键的信息来源是 /arm_joint_state 话题。该话题发布了机械臂的完整状态,是您开发上层应用(如运动规划、状态监控)时需要订阅的主要接口。
该话题使用自定义的 alicia_duo_leader_driver/ArmJointState 消息类型,其结构如下:
alicia_duo_leader_driver/ArmJointState:std_msgs/Header header: 标准消息头,包含时间戳和坐标系 ID。float32 joint1到float32 joint6: 六个主要关节的角度,单位为 弧度 (radians)。float32 gripper: 夹爪的角度,单位为 弧度 (radians)。int32 but1,int32 but2: 机械臂基座上的两个按钮状态 (通常 0 表示未按下,1 表示按下)。float32 time: (此字段在状态消息中通常不直接使用,主要用于控制指令) 期望的运动时间 (秒)。
理解并正确使用 /arm_joint_state 话题及其 ArmJointState 消息是与 Alicia Duo Leader 机械臂进行交互的基础。后续的 "ROS API" 部分将提供更详细的话题和节点信息。
| 节点名称 | 类型 | 包 | 描述 |
|---|---|---|---|
serial_server_node |
C++ | alicia_duo_leader_driver |
负责底层串口通信、数据帧校验和原始数据收发。 |
serial_data_type_node |
Python | alicia_duo_leader_driver |
订阅原始串口数据,根据指令 ID 分类转发到不同话题。 |
servo_states_node |
Python | alicia_duo_leader_driver |
处理舵机/夹爪状态,发布标准 ArmJointState 消息 (弧度)。 |
| 话题名称 | 消息类型 | 发布者 | 订阅者 | 描述 |
|---|---|---|---|---|
/read_serial_data |
std_msgs/UInt8MultiArray |
serial_server_node |
serial_data_type_node |
从串口接收到的原始字节数据帧。 |
/send_serial_data |
std_msgs/UInt8MultiArray |
servo_control_node |
serial_server_node |
要发送到串口的原始字节数据帧。 |
/gripper_angle |
std_msgs/UInt32MultiArray |
serial_data_type_node |
servo_states_node |
处理后的夹爪原始值和按钮状态 [gripper_raw, but1, but2]。 |
/servo_states |
std_msgs/UInt8MultiArray |
serial_data_type_node |
servo_states_node |
处理后的舵机状态原始数据帧 (指令 ID 0x04)。 |
/servo_states_6 |
std_msgs/UInt8MultiArray |
serial_data_type_node |
(无标准订阅者) | 处理后的扩展舵机状态原始数据帧 (指令 ID 0x06),用途待定。 |
/error_frame_deal |
std_msgs/UInt8MultiArray |
serial_data_type_node |
(无标准订阅者) | 从串口接收到的错误帧 (指令 ID 0xEE)。 |
/arm_joint_state |
alicia_duo_leader_driver/ArmJointState |
servo_states_node |
arm_read_demo.py, 其他用户节点 |
主要的机械臂状态话题,包含所有关节和夹爪的角度 (弧度) 及按钮状态。 |
/servo_states_main |
std_msgs/Float32MultiArray |
servo_states_node |
(用于向后兼容) | 包含 6 个关节角度和夹爪角度 (弧度) 的数组。 |
/startup_complete |
std_msgs/String |
serial_server.launch |
(无标准订阅者) | 在所有核心节点启动后发布一次,表示系统准备就绪。 |
alicia_duo_leader_driver/ArmJointState:std_msgs/Header header: 标准消息头 (时间戳, frame_id)。float32 joint1到float32 joint6: 六个主要关节的角度 (弧度)。float32 gripper: 夹爪的角度 (弧度)。int32 but1,int32 but2: 按钮状态 (通常为 0 或 1)。float32 time:期望的运动时间 (秒),0 表示立即执行。
您可以在启动 serial_server.launch 时通过命令行参数或直接修改 launch 文件来调整以下配置:
| 参数名称 | 默认值 | 可选值 | 描述 |
|---|---|---|---|
debug_mode |
false |
true, false |
是否启用调试模式,启用后会打印详细的串口收发数据日志。 |
port |
ttyUSB3 |
例如 ttyUSB0, ttyACM0, "" |
指定要连接的串口设备名称 (位于 /dev 下)。如果留空 (""),节点将自动搜索可用的 ttyUSB 设备。 |
baudrate |
921600 |
整数 | 串口通信波特率。必须与机械臂硬件设置一致。 |
servo_count |
9 |
整数 | 机械臂上的舵机总数 (包括夹爪)。影响状态解析节点的配置。 |
output |
screen |
screen, log |
ROS 节点的日志输出位置。screen 输出到终端,log 输出到日志文件。 |
- 无法连接串口 / Permission denied:
- 确认权限: 确保您已将用户添加到
dialout组,并且已经注销/重新登录或重启。运行groups $USER查看当前用户所属的组,应包含dialout。 - 检查设备: 确认机械臂已连接,并通过
ls /dev/ttyUSB*或ls /dev/ttyACM*查看设备是否存在。 - 检查端口: 如果指定了
port参数,请确保指定的端口号正确且存在。尝试不指定port让节点自动检测。 - 设备冲突: 确保没有其他程序 (如 Arduino IDE 的串口监视器) 正在占用该串口。
- 确认权限: 确保您已将用户添加到
- 节点崩溃或无响应:
- 检查日志: 查看
roslaunch输出或 ROS 日志文件 (~/.ros/log) 获取详细错误信息。 - 检查依赖: 确保所有依赖项已正确安装。
- 检查代码: 确认代码已完整克隆或下载,并且已成功编译 (
catkin_make无错误)。
- 检查日志: 查看
- 数据接收不正确或不稳定:
- 检查波特率: 确认 launch 文件中的
baudrate与机械臂硬件设置完全一致。 - 检查连接: 检查 USB 线缆是否连接牢固,尝试更换 USB 端口或线缆。
- 启用调试模式: 运行
roslaunch alicia_duo_leader_driver serial_server.launch debug_mode:=true查看原始串口数据,判断问题出在底层通信还是上层解析。
- 检查波特率: 确认 launch 文件中的