3. 感知算法概览

说实话,ROS2的环境搭建是很多人入门时第一个坎。我记得自己第一次装ROS1的时候,折腾了一整天,各种依赖冲突、源的问题,搞得头大。到了ROS2,情况好了不少,但坑还是有的。这一节,我就带你一步步把环境搭起来,顺便聊聊我踩过的那些坑。

3.1 ROS2的安装——选对版本很重要

ROS2的版本跟Ubuntu系统是绑定的。我个人习惯用Ubuntu 22.04,对应的ROS2版本是Humble Hawksbill。为什么选这个?因为Humble是LTS版本,稳定,社区支持好,我在项目里用了两年没出过大问题。

⚠️ 注意: 千万别装错了版本。比如Ubuntu 20.04对应的是Foxy,Ubuntu 22.04对应Humble。装错了,依赖会乱成一锅粥。

安装其实就几步,我直接贴命令:

# 1. 设置编码
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

# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
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

# 3. 安装ROS2
sudo apt update
sudo apt install ros-humble-desktop

# 4. 安装开发工具(后面编译工作空间要用)
sudo apt install ros-dev-tools

嗯,这里要注意:ros-humble-desktop 包含了常用的工具和库,大概2-3GB。如果你空间紧张,可以装 ros-humble-ros-base,但后面很多功能就得自己补了。我建议一步到位。

💡 小技巧: 安装过程中如果遇到网络慢,换个国内的源。比如清华源、中科大源,速度能快不少。我曾经在客户现场用国外源,装了一下午没装完,换了国内源20分钟搞定。

3.2 工作空间配置——你的代码仓库

ROS2的工作空间,说白了就是你放代码、编译代码的地方。我习惯叫它 colcon_ws,因为ROS2用colcon来编译。

创建工作空间很简单:

mkdir -p ~/colcon_ws/src
cd ~/colcon_ws
colcon build

第一次编译会生成 build、install、log 三个文件夹。你想想看,src 放源码,build 放中间文件,install 放编译结果,log 放日志。结构很清晰。

每次打开终端,都要source一下环境变量,不然ROS2找不到你的包:

source ~/colcon_ws/install/setup.bash

我建议把这行加到 ~/.bashrc 里,省得每次手动敲:

echo "source ~/colcon_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
🔑 关键点: 工作空间的名字可以随便起,但路径里不要有中文和空格。我曾经有个同事用了中文路径,编译死活报错,查了半天才发现是路径问题。

3.3 话题与服务——ROS2的通信灵魂

ROS2里,节点之间怎么说话?靠话题(Topic)和服务(Service)。

话题是发布/订阅模式。一个节点发消息,其他节点收消息。比如摄像头节点发图像数据,图像处理节点订阅它。这是单向的、持续的。

服务是请求/响应模式。客户端发请求,服务端处理完返回结果。比如你让机器人抓个东西,它抓完了告诉你「好了」。这是双向的、一次性的。

我画个图帮你理解:

ROS2 通信机制:话题与服务 话题(Topic) 发布/订阅模式 单向、持续、多对多 发布者 订阅者 服务(Service) 请求/响应模式 双向、一次性、一对一 客户端 服务端 举个例子: 话题:摄像头一直发图像,显示节点一直收图像 → 实时视频流 服务:你问机器人「现在电量多少?」机器人回答「80%」→ 一问一答 # 话题:发布者发消息 ros2 topic pub /chatter std_msgs/msg/String "data: 'Hello ROS2'" # 服务:客户端请求 ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 5, b: 3}"

3.4 动手试试——跑一个话题示例

光说不练假把式。我们启动两个终端,看看话题怎么玩。

终端1:启动一个发布者

ros2 run demo_nodes_cpp talker

你会看到它每隔0.5秒发一条消息:Publishing: 'Hello World: 1'

终端2:启动一个订阅者

ros2 run demo_nodes_py listener

它会收到消息并打印:I heard: 'Hello World: 1'

你看,两个节点之间通过话题 /chatter 通信,一个发一个收,就这么简单。

💡 试试看: 用 ros2 topic list 查看当前所有话题,用 ros2 topic echo /chatter 直接监听话题内容。这些命令在调试时特别有用。

3.5 服务示例——一问一答

服务怎么用?我们跑一个加法服务。

终端1:启动服务端

ros2 run demo_nodes_cpp add_two_ints_server

终端2:调用服务

ros2 run demo_nodes_py add_two_ints_client 5 3

客户端发请求 5 + 3,服务端返回 8。这就是服务的典型用法。

⚠️ 注意: 如果提示找不到包,说明环境变量没source。运行 source /opt/ros/humble/setup.bash 再试。我刚开始学的时候经常忘这步,后来养成习惯,开终端第一件事就是source。

3.6 避坑指南——我踩过的那些坑

  • Python版本冲突: ROS2 Humble要求Python 3.8以上。我曾经在Ubuntu 20.04上装了Python 3.10,结果colcon编译报错。后来发现系统自带的Python 3.8最稳,别乱升级。
  • 工作空间嵌套: 不要在 src 里再建 src,colcon会找不到包。我见过有人把代码放在 ~/colcon_ws/src/my_pkg/src,编译死活不通过。
  • 话题名字写错: 发布者和订阅者的话题名字必须完全一致,大小写敏感。我调试时经常用 ros2 topic list 确认名字对不对。

好了,环境搭好了,基本通信也跑通了。接下来你就可以开始写自己的节点了。记住,ROS2的核心就是节点之间的通信,把话题和服务玩熟了,后面就顺了。

📌 总结一下:
  • 安装ROS2:选对版本,用 ros-humble-desktop
  • 工作空间:mkdir -p ~/colcon_ws/src,然后 colcon build
  • 话题:发布/订阅,单向持续
  • 服务:请求/响应,双向一次性
  • 调试命令:ros2 topic list、ros2 topic echo、ros2 service list

可可精品资料库