2. ROS2基础
在开始编写机械臂控制程序之前,必须先理解ROS2的“骨架”——它的核心通信机制与运行模型。ROS2不是操作系统,而是一个分布式通信中间件,它让机械臂的各个功能模块(如视觉识别、运动规划、电机驱动)能够像独立的小程序一样各自运行,再通过标准化的接口互相协作。这种设计让系统具备极强的模块化与容错能力。
2.1 四大核心概念:节点、话题、服务、动作
ROS2的通信模型围绕四个核心概念展开。我们可以用一家“机器人餐厅”来类比:节点是餐厅里的每位员工(厨师、传菜员、收银员);话题是餐厅里的广播系统(“3号桌需要加水”);服务是电话点单(顾客打电话询问“今天有鱼吗?”);动作则是复杂的“宴会筹备流程”(需要多步骤、可取消、有进度反馈)。
节点(Node)
节点是ROS2中最小的计算单元。一个机械臂控制程序通常由多个节点组成:arm_controller节点负责发送关节角度指令,joint_state_publisher节点负责发布当前关节角度,camera_detector节点负责识别目标物体位置。每个节点都是独立的进程,它们之间不直接调用代码,而是通过“话题”或“服务”进行通信。这种设计使得某个节点崩溃后,其他节点仍能继续运行,系统鲁棒性显著提升。
话题(Topic)——异步数据流
话题用于单向、持续、高频的数据传输,是机械臂控制中最常用的通信方式。发布者(Publisher)将数据“广播”到话题上,订阅者(Subscriber)按需接收。例如,机械臂的关节状态以50Hz频率发布到/joint_states话题,而可视化节点订阅该话题即可实时显示机械臂姿态。话题通信是异步的,发布者不关心谁在接收,订阅者也不阻塞发布者。
服务(Service)——同步请求/应答
服务适用于一次性、短耗时、需要确认结果的交互。客户端(Client)发送请求并等待服务器(Server)处理完毕返回响应。例如,机械臂的“夹爪开合”指令就适合用服务实现:客户端发送open_gripper请求,服务器执行夹爪动作后返回“成功/失败”状态。服务通信是同步的,客户端在等待响应期间会阻塞。
动作(Action)——长时程任务
动作是ROS2为长时间执行、可中断、需进度反馈的任务设计的通信机制。它由三部分组成:目标(Goal)、反馈(Feedback)、结果(Result)。例如,控制机械臂从A点移动到B点,这是一个耗时数秒的运动过程。客户端发送目标后,服务器持续发布反馈(如“当前完成度40%”),客户端可随时发送取消请求。动作在底层由话题和服务组合实现,但对用户提供了更高级的接口。
2.2 开发环境搭建:从零到可运行
搭建ROS2开发环境是实践的第一步。本课程采用Ubuntu 22.04 + ROS2 Humble组合,这是目前兼容性最好、资料最丰富的版本。整个搭建过程分为四个阶段:
阶段一:安装ROS2核心
# 1. 设置软件源
sudo apt update && sudo apt install -y curl
curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 2. 添加ROS2软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
# 3. 安装ROS2 Humble桌面版(包含可视化工具)
sudo apt update
sudo apt install -y ros-humble-desktop
# 4. 安装编译工具
sudo apt install -y python3-colcon-common-extensions python3-rosdep
阶段二:配置环境变量
每次打开新终端时,需要手动加载ROS2环境。建议将以下命令写入~/.bashrc文件,实现自动加载:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc # 设置通信域,避免与其他设备冲突
source ~/.bashrc
阶段三:创建工作空间
工作空间(Workspace)是存放ROS2项目的根目录。我们创建一个名为arm_ws的工作空间,用于后续所有机械臂控制代码:
mkdir -p ~/arm_ws/src
cd ~/arm_ws
colcon build # 首次构建,生成build/install/log目录
阶段四:验证安装
运行以下命令,若能看到小乌龟窗口并可用键盘控制,说明安装成功:
# 终端1:启动仿真器
ros2 run turtlesim turtlesim_node
# 终端2:启动键盘控制
ros2 run turtlesim turtle_teleop_key
colcon build报错找不到rosdep,请先运行sudo rosdep init和rosdep update。若网络受限,可改用国内镜像源。另外,务必确保Ubuntu系统语言为英文,否则部分工具链可能因路径含中文而报错。
2.3 核心命令速查与案例
掌握以下命令,能帮助你快速诊断机械臂控制系统的运行状态。我们以“查看机械臂关节状态”为例:
| 命令 | 功能 | 机械臂场景示例 |
|---|---|---|
ros2 node list |
列出所有运行中的节点 | 确认arm_controller和joint_state_pub是否在运行 |
ros2 topic list |
列出所有话题 | 查看是否存在/joint_states话题 |
ros2 topic echo /joint_states |
实时打印话题数据 | 观察机械臂当前各关节角度值 |
ros2 service list |
列出所有服务 | 确认/gripper_service是否可用 |
ros2 action list |
列出所有动作 | 查看/arm_move动作服务器是否注册 |
ros2 node info <节点名> |
查看节点详细信息 | 检查arm_controller订阅了哪些话题、提供了哪些服务 |
2.4 误区与复盘:新手最容易踩的四个坑
误区二:忘记source环境变量。新开终端直接运行
ros2命令会报“command not found”。这是因为没有执行source /opt/ros/humble/setup.bash。务必将其写入~/.bashrc。
误区三:工作空间路径混乱。在
~/arm_ws目录下运行colcon build后,必须执行source install/setup.bash才能让系统找到新编译的包。很多新手忘记这一步,导致运行自己的节点时提示“Package not found”。
误区四:忽略ROS_DOMAIN_ID。在实验室等多人共用网络环境中,如果不设置
ROS_DOMAIN_ID,不同人的节点会互相干扰,导致话题数据错乱。建议每人设置不同的ID(如42、43等)。