1. 安装步骤
-
设置语言环境
确保系统支持UTF-8,这对ROS2的正常运行很重要。
bashlocale # 检查当前语言环境 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 locale # 再次检查,确保设置成功 -
添加ROS2软件源
首先确保
universe仓库已启用,然后添加ROS2官方的GPG密钥和软件源。bashsudo apt install -y software-properties-common curl sudo add-apt-repository universe sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg 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 -
安装ROS2 Humble
更新软件包列表后,安装完整版的ROS2。这会包含库、工具、示例等所有内容。
bashsudo apt update sudo apt upgrade # 可选,但建议先升级系统现有包 sudo apt install -y ros-humble-desktop-full -
设置环境变量
bashecho "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc -
安装开发工具和依赖管理工具
ros-dev-tools包含编译ROS工作空间所需的工具,python3-rosdep用于管理项目依赖。bashsudo apt install -y ros-dev-tools python3-rosdep -
初始化rosdep
这是很多新手容易漏掉的步骤,但它对后续编译其他ROS包很重要。
bashsudo rosdep init rosdep update如果遇到报错: ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml\]:
Failed to download target platform data for gbpdistro:
The read operation timed out
**使用国内工具 rosdepc。**这相当于rosdep的国内优化版,解决了网络问题和依赖源问题
bash
sudo pip3 install rosdepc
sudo rosdepc init
rosdepc update
2. 如何判断ros2是否安装成功?
查看环境变量
首先确保ROS2环境已生效:
bash
source /opt/ros/humble/setup.bash
printenv | grep -i ROS
如果安装成功,你应该能看到类似输出:
bash
ROS_VERSION=2
ROS_PYTHON_VERSION=3
ROS_DOMAIN_ID=0
ROS_DISTRO=humble
查看版本号
bash
echo $ROS_DISTRO
printenv ROS_DISTRO
输出应为humble。
运行官方示例验证
运行ROS2自带的talker-listener示例
bash
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
应该看到不断输出的消息:
bash
[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
如果能正常通信,说明ROS2安装完整无误。
启动乌龟模拟器
bash
ros2 run turtlesim turtlesim_node
# 新终端启动键盘控制
ros2 run turtlesim turtle_teleop_key
如果能看到乌龟窗口并能用键盘控制,说明图形界面和通信都正常。
3. 如何杀死启动的节点?
| 停止方式 | 命令示例 | 原理 | 是否执行清理 | 风险 |
|---|---|---|---|---|
| 优雅终止(推荐) | Ctrl + C |
发送 SIGINT 信号 | ✅ 是 | 无 |
| 命令行终止(生命周期) | ros2 lifecycle set ... |
通过服务接口控制 | ✅ 是 | 仅适用于生命周期节点 |
| 命令行终止(系统命令) | kill <PID> |
发送 SIGTERM 信号 | ✅ 是(默认处理) | 需要先找到PID |
| 强制终止 | kill -9 <PID> |
发送 SIGKILL 信号 | ❌ 否 | 可能留下临时文件/资源未释放 |
| 关闭终端 | 点击 ❌ 按钮 | 终端退出时发送 SIGHUP | ❌ 否 | 可能造成资源泄露 |
为什么没有ros2 node stop 命令?
ROS2的设计者有意没有提供这样一个命令,原因如下:
1. 哲学层面:ROS2是去中心化的
ROS2没有中心化的节点管理器(不像ROS1的roscore)。每个节点都是独立的进程,ROS2本身不知道 节点是如何启动的,也不应该替用户决定何时停止。
2. 技术层面:停止一个节点意味着什么?
一个节点被"停止"可能涉及:
-
是否需要保存当前状态?
-
是否需要发布"即将下线"的消息?
-
是否需要等待正在处理的任务完成?
-
是否需要通知其他节点?
不同的节点有不同的需求,ROS2无法提供一个通用的"停止"实现。
lifecycle(仅适用于生命周期节点)
bash
# 生命周期节点才有这些状态
ros2 lifecycle set /node_name configure
ros2 lifecycle set /node_name activate
ros2 lifecycle set /node_name deactivate
ros2 lifecycle set /node_name shutdown
Ctrl+C 成为标准的原因
-
简单:不需要额外命令
-
通用:适用于任何ROS2节点
-
规范:给予节点完整的生命周期
-
一致:所有终端程序都这样用
Ctrl + C 是 ROS2 中最优雅、最通用的节点停止方式,它通过信号机制给予节点自我清理的机会,这是任何其他命令行工具难以完全替代的。