Soma Zero Tutorials
🔍 搜索功能尚未开启,敬请期待。

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.bashsetup.shsetup.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 小乌龟测试

  • 下载 Episode1 ROS2 包,并解压

  • 安装 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

    使用方向键应该可以控制这个小乌龟运动。