3.2 安装 ROS2 以及初体验
一、安装 ROS2
1.1 版本选择逻辑
ROS2 有多个版本,每隔一段时间会发布新版本。我们的版本选择遵循以下逻辑:
第一步:确定 ROS2 版本
本课程选择 ROS2 Jazzy,原因是:
- ✓ 支持 MoveIt2 Python API(本课程核心功能需求)
- ✓ 其他版本可能不提供完整的 Python API 支持
具体支持情况参见 MoveIt2 官方说明
![]()
第二步:匹配操作系统版本
不同 ROS2 版本对应不同的操作系统和 Python 版本:
- 越新的 ROS2 版本 → 要求越新的 Ubuntu 版本
- 根据官方文档建议,ROS2 Jazzy 官方推荐 Ubuntu 24.04
最终配置:
操作系统:Ubuntu 24.04 LTS
ROS2版本:Jazzy Jalisco
Python版本:3.12+
关于版本兼容性:ROS2 核心原理相同,官方保持良好的向后兼容性。如果未来有新版本发布,课程中的概念和方法依然适用,只需按官方文档调整安装命令即可。
Ubuntu 24.04 LTS 镜像下载:https://ubuntu.com/download/desktop,请自行下载安装,推荐双系统。
1.2 安装 ROS2
推荐使用 deb packages 方式安装,这里提供两个 shell 脚本,可快速安装:
如果需要编译安装,参考官方教程
使用方法: chmod +x install_ros2_jazzy.sh && ./install_ros2_jazzy.sh
1.3 验证 ROS2
| 介绍 | 插图 |
|---|---|
Ubuntu 内置的终端不好用,安装一下 sudo apt install terminator |
![]() |
设置环境 source /opt/ros/jazzy/setup.bash 如果你用的不是 bash,请将 .bash 替换为你的 shell 类型。可选值:setup.bash、setup.sh、setup.zsh |
|
一个终端运行 ros2 run demo_nodes_cpp talker |
![]() |
另一个终端先 source,再运行 ros2 run demo_nodes_py listener |
![]() |
应该可以看到两边信息同步。
1.4 配置环境
1.4.1 为什么需要 source?
ROS2 基于**工作空间(workspace)**概念:
- 不执行 source 命令 → 无法使用
ros2命令和软件包 - 每次打开新终端都需要重新 source
source是 shell 内置命令,作用是在当前进程中执行脚本,使环境变量设置生效。
# 两种等价写法
source /opt/ros/jazzy/setup.bash
. /opt/ros/jazzy/setup.bash
1.4.2 setup.bash 里有什么?
setup.bash 脚本设置了多个关键环境变量:
主要环境变量:
ROS_DISTRO=jazzy # ROS2版本
ROS_VERSION=2 # 区分ROS1/ROS2
PYTHONPATH=/opt/ros/jazzy/lib/... # Python模块路径
PATH=/opt/ros/jazzy/bin:... # 可执行命令路径(ros2命令)
LD_LIBRARY_PATH=/opt/ros/jazzy/lib/... # 动态库路径
AMENT_PREFIX_PATH=/opt/ros/jazzy # 软件包查找路径
1.4.3 配置方式
方式 1:手动配置(临时)
source /opt/ros/jazzy/setup.bash # 每次打开新终端都需要执行
方式 2:自动配置(推荐)
# 添加到启动脚本
echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
source ~/.bashrc # 立即生效
其他 shell:zsh 用户改为
~/.zshrc
验证配置:
printenv | grep -i ROS
# 输出类似
ROS_VERSION=2
ROS_PYTHON_VERSION=3
AMENT_PREFIX_PATH=/opt/ros/jazzy
CMAKE_PREFIX_PATH=/opt/ros/jazzy/opt/gz_math_vendor:/opt/ros/jazzy/opt/gz_utils_vendor:/opt/ros/jazzy/opt/gz_cmake_vendor
ROS_AUTOMATIC_DISCOVERY_RANGE=SUBNET
PYTHONPATH=/opt/ros/jazzy/lib/python3.12/site-packages
LD_LIBRARY_PATH=/opt/ros/jazzy/opt/rviz_ogre_vendor/lib:/opt/ros/jazzy/lib/x86_64-linux-gnu:/opt/ros/jazzy/opt/gz_math_vendor/lib:/opt/ros/jazzy/opt/gz_utils_vendor/lib:/opt/ros/jazzy/opt/gz_cmake_vendor/lib:/opt/ros/jazzy/lib
PATH=/opt/ros/jazzy/bin:/home/enpei/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand:/home/enpei/.vscode-server/data/User/globalStorage/github.copilot-chat/copilotCli:/home/enpei/.vscode-server/cli/servers/Stable-994fd12f8d3a5aa16f17d42c041e5809167e845a/server/bin/remote-cli:/home/enpei/.atuin/bin:/home/enpei/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ROS_DISTRO=jazzy
1.4.4 可选:ROS_DOMAIN_ID
什么时候需要? 多人在同一局域网使用 ROS2 时,为避免节点互相干扰,可设置不同的 Domain ID(0-101)进行隔离:
export ROS_DOMAIN_ID=10 # 临时设置
echo "export ROS_DOMAIN_ID=10" >> ~/.bashrc # 永久生效
什么时候不需要? 只有你一个人使用,或者需要多台电脑协同工作时,保持默认即可。
ROS2 的自动发现机制
ROS2 使用 DDS 协议实现自动发现:节点启动时通过多播广播自己的存在,其他节点收到后自动建立连接。这就是为什么同一局域网内的 ROS2 程序能自动互相通信,无需手动配置 IP 地址。
二、ROS2 初体验
2.1 Episode1 真机测试
没有 Episode1 机械臂的可以跳过此小结,请看 2.2 小乌龟测试
-
安装 PEAK 驱动
首先需要安装 PEAK 驱动程序(如果已经安装完毕,可跳过),安装完成后可以使用以下命令检查:
pcaninfo # 我的输出 PCAN driver version: 8.20.0 PCAN-Basic version: 4.10.0.4 * pcanusb32: "PCAN_USBBUS1" (0x051), PCAN-USB #1, devid=0x00 (/sys/class/pcan/pcanusb32) -
安装 Python 相关包
# 安装 wheelhouse 目录下的 Python 包: pip3 install ./episode_controller_core-1.0.0-cp312-cp312-linux_x86_64.whl --break-system-packages--break-system-packages:Ubuntu 24.04 默认禁止 pip 直接安装包到系统 Python 环境(避免与系统包管理器冲突)。此参数允许强制安装,适用于明确知道不会影响系统的情况。 -
编译项目
# 安装依赖 rosdep install --from-paths src --ignore-src -y # 编译 colcon build正常编译你会看到
Starting >>> robot_arm_interfaces Starting >>> episode1_urdf_1113 Finished <<< episode1_urdf_1113 [1.40s] Finished <<< robot_arm_interfaces [14.0s] Starting >>> episode_controller Finished <<< episode_controller [1.37s] Summary: 3 packages finished [15.5s] -
设置环境
source install/setup.bash两种 source 的区别:
source /opt/ros/jazzy/setup.bash:加载 ROS2 系统环境(基础工具和官方包)source install/setup.bash:加载用户工作空间环境(自己编译的包,会叠加在系统环境之上)
工作空间的
install/setup.bash会自动关联系统环境,通常只需 source 一次即可。 -
启动机械臂控制接口
注意,用 ROS2 控制,我们就不需要打开带界面的机械臂上位机了,你可以关掉它或者停止服务,否则 USB 端口被占用,无法启动 ROS2 包
若要初始化机械臂(从归零开始),使用下面命令:
ros2 run episode_controller interface --ros-args -p init_mode:=0 -p usb_index:=1如果你有多个 USB2CAN 设备,注意调整 usb_index 的值
若要从当前位置恢复:
ros2 run episode_controller interface其实用了默认值:
init_mode:=1 usb_index:=1一切正常,你会看到
controller_core loaded [INFO] [1767345749.065369607] [episode_robot_interface]: 开始初始化: usb_index=1, init_mode=1 [INFO] [1767345749.065706657] [episode_robot_interface]: 正在初始化电机控制,usb_index=1 CAN通信初始化成功! [INFO] [1767345749.080942187] [episode_robot_interface]: 电机控制初始化成功,usb_index=1 [INFO] [1767345749.085726614] [episode_robot_interface]: 成功从当前位置恢复: [180.0, 90.03, 83.06, 29.99, 109.99, 29.96] [INFO] [1767345749.239601963] [episode_robot_interface]: 以120.0Hz频率发布关节状态 [INFO] [1767345749.240079933] [episode_robot_interface]: Episode1机械臂接口准备就绪 -
启动 RViz 可视化
在新终端中启动 RViz(记得先 source 环境):
ros2 launch episode1_urdf_1113 launch.py加载配置后,你会看到机械臂的 3D 模型:

-
测试机械臂运动
在新终端中(记得先 source 环境)运行以下命令测试运动功能:
ros2 run episode_controller client_demo --action move_xyz一切正常的话,你会看到机械臂开始运动,同时 RViz 中的模型也会同步更新。
2.2 小乌龟测试

-
一个终端打开:
ros2 run turtlesim turtlesim_node应该可以看到弹出的游戏界面:

-
另一个终端打开:
ros2 run turtlesim turtle_teleop_key使用方向键应该可以控制这个小乌龟运动。


