ROS2 操控机械臂教程
前置知识
什么是 ROS2?
一句话:ROS2 是一套用于机器人开发的"通信总线+工具集"——让机械臂的各个部件(关节、传感器、摄像头)和你的电脑能互相收发消息、协同工作。
为什么需要它?
如果你直接给机械臂发 JSON 指令,每次都要手动构造、发送、解析返回数据,写起来很累。 ROS2 帮你封装好底层通信,让你能:
-
用标准接口发布"目标位置",订阅"当前姿态"
-
直接调用现成的运动规划、逆解算法
-
把机械臂、摄像头、手柄等不同设备连接到一个"消息网络"里
核心概念
| 概念 | 说明 |
|---|---|
| 节点(Node) | 一个独立运行的程序,比如"机械臂控制节点"、"摄像头节点"、"手柄节点"。 |
| 话题(Topic) | 节点之间传递消息的通道。比如"关节状态"话题上,机械臂节点不断发布当前角度;你的控制节点订阅它就能实时获取。 |
| 消息(Message) | 结构化的数据,如 JointState(关节弧度)、Pose(位置+姿态)。 |
| 服务(Service) | 一问一答的通信,比如你发送"执行轨迹规划请求",机械臂回复"成功/失败"。 |
| 启动文件(Launch) | 一次性启动多个节点和配置的脚本,不用每个节点手动开终端。 |
类比理解
-
没有 ROS2:就像你手动给每个关节发微信消息("肩关节转 30°"),还要等回复。
-
有了 ROS2:就像你建立了一个微信群(话题),机械臂在群里实时喊"我当前角度是。..",你在群里喊"目标位置是 (200,50,150)",群里的规划节点自动算好发出去。
安装 ROS2
你需要的准备
-
VMware Workstation Pro:官网下载,目前对个人使用免费。安装过程一路默认即可。
-
下载并解压我们提供的 Ubuntu 22.04 + ROS2 Humble 镜像文件:下载链接:https://pan.quark.cn/s/bc72fbfba0fc
roarm_ws 工作空间(容器)主要功能:
-
roarm_driver:驱动真实机械臂的通信节点
-
roarm_description:机械臂模型 URDF
-
roarm_moveit:运动学相关配置
-
roarm_moveit_ikfast_plugins:运动学求解器
-
roarm_moveit_cmd:指令控制相关服务
-
roarm_moveit_mtc_demo:MTC 演示
安装 VMware
双击安装包,按向导完成安装。
安装过程中若提示安装虚拟网卡驱动,请允许。
新建虚拟机配置
-
打开 VMware,点击 文件 → 新建虚拟机
-
选择 自定义(高级) → 下一步

-
硬件兼容性:默认选择最新的,因为和本地安装的 VMware 版本有关
注意选择稍后安装操作系统
-
选择 Linux + Ubuntu 64 位 → 下一步
-
修改虚拟机的名称,不修改的点击下一步
-
根据 CPU 的数量和每个 CPU 的内核数选择,建议 CPU 的数量为机器 CPU 数量的 50%
-
根据机器的内存选择虚拟机分配的内存,建议 20GB 及以上,如果机器内存不够 32G,那么虚拟机就分配机器内存的 60%
-
网络类型默认选择 NAT,点击下一步
-
I/O 类型默认选择 LSI Logic,点击下一步
-
磁盘类型默认选择 SCSI(S),点击下一步
这里要修改为使用现有虚拟磁盘 (E)
- 新建虚拟机向导,选择准备好的后缀为 vmdk 的文件,然后点击下一步
- 在弹出框中选择这个"保持现有格式 (K)"

- 点击完成创建虚拟机配置
- 关闭 3D 图形加速

- 开启处理器的虚拟化引擎第一个选项,点击确定保存修改。

VMware 实现主机与虚拟机之间的复制粘贴和文件拖拽
为方便后续的代码复制与虚拟机之间的复制粘贴和文件拖拽功能。在 VMware Workstation 中实现主机与 Ubuntu 虚拟机之间的复制粘贴和文件拖拽功能,主要依赖于 VMware Tools(或 open-vm-tools)的正确安装和配置。
- 检查 VMware Tools 是否已安装
VMware Tools 是实现主机与虚拟机交互功能的核心组件,Ubuntu 中通常推荐使用开源版本 open-vm-tools(兼容性更好)
打开 Ubuntu 虚拟机,登录系统。
检查是否已安装:打开终端CtrlAlt+T,输入命令:
dpkg -l | grep open-vm-tools
若输出包含 open-vm-tools 和 open-vm-tools-desktop,则已安装(跳到步骤 2 配置)
若未安装或缺失组件,执行下一步安装。
- 安装 open-vm-tools(关键组件)
更新软件源:终端输入:
sudo apt update
安装必要组件:执行以下命令(包含桌面环境所需的交互功能):
sudo apt install open-vm-tools open-vm-tools-desktop
若 Ubuntu 是服务器版,无需 open-vm-tools-desktop,但服务器版通常不支持文件拖拽。
重启虚拟机:安装完成后,必须重启才能生效:
sudo reboot
- 配置 VMware Workstation 的共享设置
关闭虚拟机(若已启动,先关机)
打开 VMware Workstation,右键点击左侧的 Ubuntu 虚拟机,选择"设置"。
在设置窗口中,选择"选项"标签页,左侧导航栏找到"客户机隔离"。
右侧勾选以下选项:
启用复制粘贴(启用双向拖放和启用双向复制粘贴)
确保"隔离设置"中没有限制主机与虚拟机的交互
点击"确定"保存设置,重新启动虚拟机。
常见问题及解决方法
问题 1:更新软件源、安装 open-vm-tools 和 open-vm-tools-desktop 时报错
解决方法:
方法一:更换可用的软件源
- 打开终端,编辑软件源配置文件:
sudo nano /etc/apt/sources.list
- 注释掉所有现有源(在每行开头加#),然后添加以下阿里云的 Ubuntu 22.04(jammy)源:
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
-
保存并退出Ctrl+X → Y → Enter。
-
再次执行 apt update:
sudo apt update
方法二:检查网络连接
- 确保虚拟机的网络适配器设置为"NAT"或"桥接"模式,且主机能正常访问互联网。
- 可在虚拟机中 ping 百度测试网络:
ping www.baidu.com
若无法 ping 通,需排查网络配置(如防火墙、代理等)。
问题 2:如何退出 nano 编辑器界面?
按 Ctrl+X → 输入 Y,回车
点击开启此虚拟机,流程完毕。
虚拟机默认密码:ws
驱动节点控制现实中的机械臂
前置知识
进入 roarm_ws 容器方法及目的
在 Ubuntu 虚拟机中按 Ctrl+Alt+T 打开终端,在查看当前 Ubuntu 的串口设备之前,需要先执行 ./ros_humble.sh 命令并输入 1 进入到容器当中,容器中已经部署了 ROS2 Humble 的环境。

记住进入容器的命令 ./ros_humble.sh ,后续的操作都需要在容器中进行!
查看当前 Ubuntu 的串口设备
先不要连接电脑和机械臂,在终端中输入 ls /dev/tty* 命令,可以查看当前的 Ubuntu 串口的所有设备

用 USB 线连接机械臂与电脑,注意要连接机械臂驱动板中间的 Type-C 接口(边缘的 Type-C 接口是与雷达通信的接口,不与 ESP32 进行通信)。弹出的选项选中连接到虚拟机。
再次在终端中执行ls /dev/tty*命令,可以看见此时多出来一个 /dev/ttyUSB0 的设备名,这个代表机械臂连接的端口号。

在后续的例程中,默认串口设备名称为 /dev/ttyUSB0。如果上一步中查看到的机械臂串口设备名名称不是 /dev/ttyUSB0,则需要更改串口设备名称。
打开虚拟机终端,进入 roarm_ws 容器:
./ros_humble.sh
进入到存放 roarm_driver.py 的目录下:
cd /home/ws/roarm_ws/src/roarm_main/roarm_driver/roarm_driver/
打开 roarm_driver.py 文件:
nano roarm_driver.py
光标移动到串口名称的位置,将串口名称改为 /dev/ttyUSB0。然后 Ctrl + O (字母 O),然后按 Enter 确认保存,最后 Ctrl + X (字母 X) 退出 nano 编辑器。

运行机械臂驱动节点
赋予串口权限
在 Ubuntu 虚拟机终端中输入以下指令赋予串口读写权限:
sudo chmod 666 /dev/ttyUSB0
密码为系统默认密码:ws,输入时终端不会显示密码。
如果该指令报错,请确认串口设备号是否正确以及机械臂是否与虚拟机系统连接。
编译功能包(仅第一次使用时需要)
在终端中依次执行以下命令:
进入 ROS2 容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
编译功能包:
colcon build
设置环境变量:
source install/setup.bash
虚拟机镜像中的机械臂驱动库需要更新:
pip install roarm-sdk==0.1.0
运行驱动节点
按 Ctrl+Alt+T 打开一个新的终端窗口,依次执行以下命令运行 ROS2 的机械臂驱动节点:
进入 ROS2 容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
运行机械臂驱动节点:
ros2 run roarm_driver roarm_driver
-
成功运行机械臂驱动节点的终端界面不要关闭
-
在后续教程的操作中,都需要保持机械臂驱动节点的运行
-
若不小心结束了该进程,需要重新运行机械臂驱动节点
ROS2 Rviz2 显示机械臂模型
前置知识
什么是 Rviz2?
一句话:Rviz2 是 ROS2 的"可视化驾驶舱"——让你不用看代码和数字,直接用 3D 画面看到机械臂长什么样、现在摆到什么角度、轨迹怎么走。
为什么需要它?
如果你只靠打印关节角度数据来调试机械臂,每次动一下都要对着数字脑补姿态,眼都快看花了。
Rviz2 帮你把机器人的内部状态"画"出来,让你能:
-
实时看到机械臂的 3D 模型和每个关节的当前角度
-
用滑块或数值面板直接调节关节角度,立刻看到模型跟着动
-
同时查看传感器数据、规划路径、时间轴等多种信息
-
调整参数来观察机器人行为的变化,像调示波器一样直观
启动 Rviz2 模型界面
执行该指令后,机械臂将会转动(大臂小臂竖直向上),请勿在机械臂周围放置易碎品,远离儿童。
按 Ctrl+Alt+T 打开一个新的终端窗口,进入机械臂 ROS2 的工作空间,启动 Rviz2 模型界面:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动 Rviz2 模型界面:
ros2 launch roarm_description display.launch.py
如果运行机械臂驱动节点出现了以下错误:

需要在新开终端不进入容器的情况下执行命令xhost +,启动 X 服务器之后再到容器终端中执行机械臂驱动节点。
使用关节角度控制面板

Randomize 功能会随机运动至某位置,可能会导致机械臂运动到不安全的位置。使用该功能时注意周围环境,避免碰撞到其他物品或者砸到桌面。也可以拔掉电源仅保留 USB 连接从而断掉真实机械臂的控制再尝试。
在 Rviz2 中,左键拖动旋转视角,右键拖动平移视角,滚轮缩放视图,中键拖动垂直平移。
挑战任务
用 Rviz2 控制机械臂夹取一个小物品
Moveit2 拖拽交互
前置知识
什么是 MoveIt2?
一句话:MoveIt2 是 ROS2 下的"机械臂运动规划大脑"——你只需要告诉它"末端要去哪",它自动帮你算出每个关节怎么转、怎么避开障碍物、怎么走出一条合理的路径。
为什么需要它?
如果你手动给机械臂的每个关节发角度指令,要想让它从 A 点走到 B 点同时不撞到自己或周围物体,光是算逆解和避障就够写几百行代码,还容易出错。
MoveIt2 帮你封装了运动规划、碰撞检测、逆解等复杂算法,让你能:
直接在 Rviz2 里用鼠标拖拽机械臂末端点
自动生成整条运动路径
自动避开自身碰撞和环境障碍物
比如桌子、墙壁
支持多种规划算法
RRT、PRM 等,一键切换看哪种走得更顺
与 Rviz2 深度集成
在 3D 视图中实时预览规划结果,确认无误再执行
通过驱动节点把规划好的路径直接发给真实机械臂
完成从"想法"到"动作"的全流程
启动 MoveIt2 节点
如果是跟着上一步操作到这的:
需要关闭之前运行的 Rviz2 机械臂模型关节界面(Ctrl+C),但保持 机械臂驱动节点运行。如已关闭驱动节点,需要重新启动。
启动 MoveIt2 节点:
ros2 launch roarm_moveit roarm_moveit.launch.py
新终端启动 MoveIt2 节点:运行机械臂驱动节点后 进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动 MoveIt2 节点:
ros2 launch roarm_moveit roarm_moveit.launch.py
执行后机械臂会转动,请勿在周围放置易碎品,远离儿童。
如未显示机械臂,将 Display 窗口的 Fixed Frame 从 world 改为 base_link。

接着添加 MotionPlanning 插件:
点击左下角"Add" → 选择"MotionPlanning" → 点击"OK"。

拖拽交互
拖拽末端拖拽球或 XYZ 轴改变姿态,点击"Plan & Execute"执行。
复位:将"Goal State"改为"home",点击"Plan & Execute"。
夹爪控制
Planning Group 改为 gripper,在 Joints 选项卡设置 Link3_to_gripper 角度,回到 Planning 选项卡将"Start State"改为"<previous>",点击"Plan & Execute"。
"Goal State"改为"open"打开夹爪,"close"关闭夹爪。
键盘控制机械臂
启动 Rviz2 节点
如果是跟着上一步操作到这的:
需要关闭之前运行的 MoveIt2 拖拽交互例程Ctrl+Alt+C,但保持 机械臂驱动节点运行。如已关闭驱动节点,需要重新启动。
在 MoveIt2 节点终端中启动 Rviz2 节点:
ros2 launch roarm_moveit_servo servo_control.launch.py
新终端启动 Rviz2 节点:运行机械臂驱动节点后 进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动 Rviz2 节点:
ros2 launch roarm_moveit_servo servo_control.launch.py
启动键盘控制节点
按 Ctrl+Alt+T 打开一个新的终端:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动键盘控制节点:
ros2 run roarm_moveit_servo keyboardcontrol
坐标控制
方向键 ↑ : ↑ :X 轴正方向运动;
方向键 ↓ : ↓ :X 轴负方向运动;
方向键 ← : ← :Y 轴正方向运动;
方向键 → : → :Y 轴负方向运动;
; : Z :Z 轴正方向运动;
. : . :Z 轴负方向运动;
关节控制
数字 1 键:底座关节运动;
数字 2 键:肩关节运动;
数字 3 键:肘关节运动;
数字 4 键:腕关节运动;
数字 5 键:滚动关节运动;
字母 G 键:夹爪运动。
字母 R 键:切换上述关节控制的运动方向。
字母 Q 键:退出操作
保持键盘控制终端为激活状态,确保按键操作有效。
指令控制机械臂
运行指令控制文件
需要关闭之前运行的其他交互例程Ctrl+C,但保持 机械臂驱动节点运行。如已关闭驱动节点,需要重新启动。
运行指令控制文件:打开新的终端
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动指令控制文件:
ros2 launch roarm_moveit_cmd command_control.launch.py
执行后机械臂会转动,请勿放置易碎品,远离儿童。
如需要在 Rviz2 中显示机械臂运动轨迹,参考 运行 Moveit2 拖拽交互例程的操作步骤。
获取当前位置
按 Ctrl+Alt+T 打开一个新的终端:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
获取当前位置:
ros2 service call /get_pose_cmd roarm_msgs/srv/GetPoseCmd
控制机械臂末端运动到指定位置
按 Ctrl+Alt+T 打开一个新的终端:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
控制机械臂末端运动到指定位置:
ros2 service call /move_joint_cmd roarm_msgs/srv/MoveJointCmd"{x: 0.3, y: 0, z: 0.1, roll: 0.2, pitch: 0.2, yaw: 0}"
xyz 为机械臂目标位置的坐标,单位为 m。Roll、Pitch 和 Yaw 是末端执行器的旋转角度,单位为弧度。
控制机械臂末端到线轨迹的指定位置(滚动和俯仰保持不变)
按 Ctrl+Alt+T 打开一个新的终端:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
控制机械臂末端到线轨迹的指定位置(滚动和俯仰保持不变):
ros2 service call /move_line_cmd roarm_msgs/srv/MoveLineCmd "{x: 0.2, y: 0.2, z: 0.1}"
xyz 为机械臂目标位置的坐标,单位为 m。
控制机械臂抓夹到指定弧度位置
按 Ctrl+Alt+T 打开一个新的终端:
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
控制机械臂抓夹到指定弧度位置:
ros2 topic pub /gripper_cmd std_msgs/msg/Float32 "{data: 0.5}" -1
data 为机械臂目标位置的坐标,单位为弧度,范围是 0.0~1.5。
在固定高度上画圆
用 Rviz2 查看末端关节的运动位置
在 Rviz2 中,点击 Add,添加 RobotModel。

在 RobotModel 选项卡内,找到 Description Topic,选择 /robot_description,就会出现 Links 的选项。

在 Links 选项中,找到 hand_tcp,展开后勾选 Show Trail,用于查看末端关节的运动轨迹。

调用这个服务,来让机械臂在圆弧轨迹处移动到指定的位置:
打开新终端,进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
调用这个服务,来让机械臂在圆弧轨迹处移动到指定的位置:
ros2 service call /move_circle_cmd roarm_msgs/srv/MoveCircleCmd "{x0: 0.2, y0: 0.1, z0: 0.2, x1: 0.2, y1: 0.2, z1: 0.2 }"
x0、y0 和 z0 是中心点的坐标, x1、y1 和 z1 是目标点的坐标,单位为米,通过调用该服务,就可以控制机械臂在圆弧轨迹处移动到指定的位置,同时也可以看见 Rviz 2 界面中机械臂画出的圆。
Moveit MTC 规划轨迹
前置知识
MoveIt MTC 演示的三种模式
一句话总述:MTC(任务构造器)把复杂动作拆成小步骤依次执行。三种演示分别对应:单段直线、多段路径、完整抓取放置。
笛卡尔演示(单段直线)
-
干什么:让机械臂末端沿直线从 A 到 B。
-
为什么需要:普通规划会走弧线,直线演示保证垂直下探、涂胶等精度动作不走样。
-
好处:一键验证直线轨迹,直观看到末端是否撞到东西。
笛卡尔模演示(多段路径)
-
干什么:把一条复杂路径拆成多个小段(如下降→平移→上升),每段独立设置参数。
-
为什么需要:单段直线没法中途拐弯或变速,笛卡尔模让你搭积木一样拼出"门"字形等轨迹。
-
好处:模块可复用,不同段可设不同速度/加速度,过渡自动平滑。
Pick & Place 演示(抓取放置)
-
干什么:完整演示"抓取→搬运→放置"全流程。
-
为什么需要:自己写抓取代码要处理接近、下探、夹爪、抬升、移动、下放、松开……几十步,容易出错。
-
好处:一键运行整套流程,直接当模板改成上料、装配、码垛应用。
运行 MTC 演示文件
需要关闭之前运行的其他交互例程Ctrl+C,但保持 机械臂驱动节点运行。如已关闭驱动节点,需要重新启动。
运行指令控制文件:打开新的终端
进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动 MTC 演示文件:
ros2 launch roarm_moveit_mtc_demo demo.launch.py
执行后机械臂会转动,请勿放置易碎品,远离儿童。
笛卡尔演示
打开新终端,进入容器环境:
./ros_humble.sh
进入工作空间目录:
cd /home/ws/roarm_ws/
启动笛卡尔演示:
ros2 launch roarm_moveit_mtc_demo run.launch.py exe:=cartesian
选择对应的完整路径后,点击 “Exec” 按钮执行 Demo。

笛卡尔模演示
按 Ctrl+C 结束上一个 Moveit MTC 演示的进程,再同一个终端启动当前的 Moveit MTC 演示。
进入工作空间目录:
cd /home/ws/roarm_ws/
启动笛卡尔模演示:
ros2 launch roarm_moveit_mtc_demo run.launch.py exe:=cartesian_modular
选择对应的完整路径后,点击 “Exec” 按钮执行 Demo。

Place 演示
按 Ctrl+C 结束上一个 Moveit MTC 演示的进程,再同一个终端启动当前的 Pick Place 演示。
进入工作空间目录:
cd /home/ws/roarm_ws/
启动 Place 演示:
ros2 launch roarm_moveit_mtc_demo run.launch.py exe:=place
选择对应的完整路径后,点击 “Exec” 按钮执行 Demo。
