树莓派5安装ROS2实战指南:从零搭建多机通信机器人系统
最近在实验室调试一套分布式移动机器人系统,团队里几个小伙伴都卡在了“树莓派5装不上ROS2”这个环节。有人ping不通主机,有人ros2 node list半天没反应,还有人编译完功能包一运行就崩溃……其实问题根源并不复杂——不是不会装ROS2,而是没搞懂它背后的通信逻辑。
今天我就以一个一线开发者的视角,手把手带你完成树莓派5上部署ROS2 Humble的全过程,并重点讲清楚那些官方文档里一笔带过、但实际项目中天天踩坑的网络配置细节。尤其是如何让多个树莓派之间稳定通信,这可是做SLAM、集群控制、远程监控的基础。
为什么选树莓派5 + ROS2?性能与生态的双重升级
先说结论:如果你要做的是真实场景下的机器人原型开发(而不是纯仿真),那么树莓派5是目前性价比最高的ARM64平台之一。
相比树莓派4B,它的提升不是小打小闹:
- CPU:四核Cortex-A76 @ 2.4GHz,单核性能翻倍
- 内存:支持8GB LPDDR4X,跑Gazebo都不再卡顿
- 接口:原生PCIe 2.0 ×1 → 可接M.2 NVMe SSD,彻底告别SD卡IO瓶颈
- 网络:千兆以太网 + 双频Wi-Fi(5GHz干扰更少)
最关键的是,它能完美运行ROS2 Humble——这是目前对ARM64支持最成熟的长期支持版本(LTS),有官方二进制包,省去源码编译的痛苦。
📌 小贴士:虽然Ubuntu Core也支持树莓派5,但Raspberry Pi OS(64位)社区资源更多、驱动更全,更适合初学者和快速验证。
系统准备:别急着装ROS2,先把底子打好
很多问题其实出在第一步。很多人直接刷个桌面版系统就开始装ROS2,结果发现CPU占用飙到90%,节点延迟高达几百毫秒。
推荐配置清单
| 项目 | 建议 |
|---|---|
| 操作系统 | Raspberry Pi OS (64-bit) Lite |
| 存储介质 | ≥32GB Class 10 SD卡 或 M.2 NVMe SSD(通过HAT扩展) |
| 散热方案 | 主动风扇+金属散热壳(长时间运行不降频) |
| 电源适配器 | 官方5V/5A电源(避免USB设备供电不足) |
Lite版本没有图形界面,节省至少500MB内存,系统响应更快,特别适合做主控板。
初始设置三步走
启用SSH
在SD卡根目录创建空文件ssh即可开启SSH服务:bash touch /path/to/sdcard/boot/ssh连接Wi-Fi(可选)
创建wpa_supplicant.conf文件写入WiFi信息:
```conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN
network={
ssid=”你的WiFi名称”
psk=”密码”
}
```
插卡启动后会自动联网。
- 首次登录并更新系统
bash ssh pi@raspberrypi.local # 默认用户名pi,密码raspberry sudo apt update && sudo apt full-upgrade -y sudo reboot
正式安装ROS2 Humble:避开APT源的大坑
网上很多教程直接用http://packages.ros.org/ros2/ubuntu这个源,但在国内访问极慢,经常断连。我们得换镜像源。
方法一:使用中科大镜像(推荐)
# 添加GPG密钥 sudo curl -sSL https://mirrors.ustc.edu.cn/ros/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 写入软件源(注意替换为 jammy) echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.ustc.edu.cn/ros2/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null✅ 验证是否成功:执行
cat /etc/apt/sources.list.d/ros2.list,看输出是否有中科大的地址。
然后更新并安装:
sudo apt update sudo apt install ros-humble-desktop -y这个版本包含了RViz、Gazebo、相机驱动等常用工具。如果空间紧张,可以只装基础版:
sudo apt install ros-humble-ros-base后续按需安装特定包,比如:
sudo apt install ros-humble-rviz2 ros-humble-gazebo-ros-pkgs初始化环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc现在你可以试试看ROS2有没有装好:
ros2 --version # 输出类似:ros2 version 0.15.0安装构建工具链
以后要自己写节点或编译第三方包,必须装这些:
sudo apt install python3-colcon-common-extensions python3-rosdep初始化rosdep(用于解决依赖):
sudo rosdep init rosdep update网络配置才是重头戏:让多台设备真正“看见”彼此
这才是大多数人失败的地方。ROS2靠DDS发现节点,而DDS依赖网络广播和主机名解析。一旦网络没配对,就会出现“明明在同一局域网却找不到对方”的诡异情况。
1. 固定IP地址,别再靠DHCP分配
每次重启变一个IP,谁受得了?
编辑Netplan配置文件:
sudo nano /etc/netplan/01-network-manager-all.yaml内容如下(假设你使用有线网口eth0):
network: version: 2 renderer: NetworkManager ethernets: eth0: dhcp4: no addresses: - 192.168.1.10/24 gateway4: 192.168.1.1 nameservers: addresses: - 8.8.8.8 - 1.1.1.1保存后应用:
sudo netplan apply🔧 提示:如果你不确定网卡名,可用
ip a查看。常见名称包括eth0,enxb827ebxxxxxx等。
2. 设置有意义的主机名
默认叫raspberrypi,两台设备就冲突了。
改成本机专属名字,比如主控叫robot-master,底盘控制器叫robot-chassis:
sudo hostnamectl set-hostname robot-master修改后重新登录即可生效。
为了让其他机器也能通过名字访问你,有两种方式:
方式A:局域网mDNS(推荐)
Linux和macOS自带Avahi服务,支持.local域名解析。
检查是否运行:
systemctl status avahi-daemon如果没有,启用它:
sudo systemctl enable avahi-daemon sudo systemctl start avahi-daemon之后你在PC上就可以直接ping通:
ping robot-master.local方式B:手动添加hosts映射(适用于Windows或关闭mDNS的情况)
在你的开发机(比如Ubuntu笔记本)上添加:
sudo nano /etc/hosts加入一行:
192.168.1.10 robot-master这样就能直接用ssh pi@robot-master登录了。
3. 统一ROS_DOMAIN_ID(关键!)
这是最容易被忽略的一点:不同ROS_DOMAIN_ID的节点无法互相发现!
想象一下,两个机器人在同一房间发消息,但一个说的是中文,另一个听英文——自然无法交流。
设置方法:
echo "export ROS_DOMAIN_ID=1" >> ~/.bashrc source ~/.bashrc⚠️ 所有多机通信设备必须设成相同的ID(取值范围0~233)。建议:
- 机器人A:ID=1
- 机器人B:ID=2
- 实验室共用测试网段:ID=50
你可以新开终端验证是否生效:
echo $ROS_DOMAIN_ID # 应输出:1多机通信实战测试:五条命令验真身
一切就绪后,来做一个简单的跨设备通信测试。
场景设定
- 设备A:树莓派5,IP=
192.168.1.10,主机名=robot-master - 设备B:你的Ubuntu笔记本,IP=
192.168.1.20
两者连接同一个路由器,且都设置了ROS_DOMAIN_ID=1。
测试步骤
- 在树莓派上启动一个发布者节点:
ros2 run demo_nodes_cpp talker你会看到不断输出:
[INFO] [1234567890] Publishing: 'Hello World'- 在你的笔记本上新开终端,同样设置
ROS_DOMAIN_ID=1:
export ROS_DOMAIN_ID=1然后查看当前活跃节点:
ros2 node list✅ 成功的话,你应该能看到:
/talker /parameter_events- 再试试话题列表:
ros2 topic list输出应包含:
/chatter /parameter_events /rosout- 订阅消息看看能不能收到:
ros2 topic echo /chatter如果屏幕上开始滚动显示'Hello World',恭喜你!ROS2多机通信已经打通!
- 最后来个反向测试:在笔记本上启动listener,在树莓派上启动talker,依然能收到数据吗?能,说明双向通信正常。
常见问题排查清单(附解决方案)
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
ping xxx.local不通 | mDNS未启用 | 安装并启动avahi-daemon |
ros2 node list为空 | ROS_DOMAIN_ID不一致 | 两边都要export ROS_DOMAIN_ID=x |
| 节点发现延迟高(>10秒) | 防火墙阻断UDP多播 | 关闭防火墙或放行端口7400~7500 |
| 数据丢包严重 | 使用2.4GHz Wi-Fi干扰大 | 改用5GHz频段或有线连接 |
| CPU占用过高 | 同时运行太多节点 | 使用htop观察负载,拆分任务到不同设备 |
| 时间不同步导致日志错乱 | 本地时间不准 | 配置NTP同步:sudo timedatectl set-ntp true |
💡 进阶技巧:可以用
ROS_LOCALHOST_ONLY=1强制只允许本机通信,用于安全调试。
实际应用场景举例:小型自主巡逻车架构
我之前做过一个校园巡检机器人,核心就是基于这套配置:
- 树莓派5(ID=1):作为主控,运行SLAM建图、AMCL定位、导航栈
- ESP32(串口接入):采集温湿度、气体传感器数据
- Jetson Nano(ID=1):运行YOLO目标检测,结果通过ROS2发布
- 远端PC(ID=1):运行RViz实时可视化,接收报警信息
所有设备通过同一台千兆路由器连接,全部设置ROS_DOMAIN_ID=1,借助mDNS实现主机名自动发现。即使Jetson重启,树莓派也能在几秒内重新发现它并恢复订阅。
整个系统完全去中心化,没有“主从”之分,任何一个节点都可以动态加入或退出,正是ROS2的设计精髓所在。
写在最后:这不是终点,而是起点
当你第一次看到/chatter话题传来数据时,可能会觉得不过如此。但请相信我,这短短几行字符串背后,是一整套现代机器人系统的通信基石。
从这一刻起,你已经具备了搭建分布式机器人的能力。接下来可以尝试:
- 把IMU、激光雷达接入树莓派并发布传感器数据
- 在另一台设备上运行
robot_localization进行状态估计 - 用
teleop_twist_keyboard远程控制小车 - 最终整合成完整的导航系统
技术永远在演进。未来ROS2 Iron/Foxy将进一步优化实时性,而树莓派生态也在不断丰富——CAN HAT、PoE供电模块、RT-Thread支持都在路上。
但无论怎么变,理解底层原理、掌握网络配置、学会调试通信,才是嵌入式开发者真正的护城河。
如果你正在折腾树莓派+ROS2的组合,欢迎留言交流经验。遇到具体问题也可以贴出来,我们一起排雷。