
很多朋友拿到树莓派4B之后第一个念头就是装ROS2。这个组合差不多是当下做机器人原型验证、课程作业和入门学习最经典的搭配之一。前一阵子我刚好在树莓派4B上完整走了一遍ROS2 Humble的安装部署从系统烧录到DDS通信调优踩了不少坑这篇就当作一份完整的复盘记录。这篇主要解决几个问题树莓派4B上到底该选哪个Ubuntu版本、ROS2 Humble和Foxy怎么选、官方安装流程每一步在做什么、装完之后环境变量怎么配、以及DDS这个ROS2的核心通信机制在树莓派这种ARM平台上有什么需要特别注意的地方同时附带我实际遇到的坑和排查思路。如果你有一块树莓派4B4GB或8GB版本会更舒服想在上面跑ROS2做机器人开发不管是学Nav2导航、做SLAM还是单纯想给机器人小车配一个大脑这篇都值得花20分钟看完。1. 版本选型为什么是树莓派4B ROS2 Humble1.1 硬件评估与真实定位树莓派4B在我眼里是当前做机器人控制器性价比最高的选择之一。它搭载四核Cortex-A72处理器4GB或8GB内存版本跑ROS2完全够用。对比动辄几千块的工控机或者带GPU的Jetson系列树莓派4B在几百元的价位提供了足够强的CPU性能和完整的GPIO生态做机器人小车的上位机、SLAM建图的数据处理平台都撑得住。当然它也不是没有短板。树莓派4B没有独立GPU加速跑视觉SLAM比如ORB-SLAM3会有些吃力。如果你要做深度学习和视觉重负载任务还是建议考虑带GPU的Jetson平台。但做纯ROS2节点通信、传感器数据处理、导航规划树莓派4B的性能绰绰有余。另一个关键点是架构。树莓派4B是arm64架构和大多数教程里用的x86 PC不一样这一点会在后面安装过程中处处体现。好消息是Ubuntu 22.04和ROS2 Humble对arm64的支持已经非常成熟大部分包都有现成的预编译版本只有少数扩展包需要自己从源码编译。1.2 Humble与Foxy怎么选很多初学者在选ROS2版本时很纠结。我的建议很简单新用户直接上Humble除非你的硬件主板官方只支持Ubuntu 20.04才需要考虑Foxy。原因有三点。第一Humble是ROS2的LTS版本支持周期到2027年5月现在正处于壮年期Foxy在2023年5月已经停止维护官方不再修复bug这对做开发来说很麻烦。第二Humble基于Ubuntu 22.04系统本身更新内核版本、Python版本、OpenSSL库都更现代很多新工具链只支持22.04。第三Humble的社区活跃度和文档完善程度远超Foxy遇到问题搜索到的解决方案数量不是一个量级。从功能上看Humble和Foxy的核心API差距不算大但Humble在生命周期管理、参数回调机制、通信性能等底层做了很多改进。做新项目完全没理由选一个已经停服的旧版本。1.3 系统镜像选择的两个关键点树莓派4B装ROS2 Humble的第一个坑就是系统版本。ROS2 Humble官方只支持Ubuntu 22.04这一点没得商量千万不要想着用20.04或者Debian替代然后手动编译一堆依赖纯属给自己挖坑。第二个关键点是位数。务必选择64位系统arm64镜像不要用32位的armhf。现在ROS2的预编译包基本只发布arm64架构32位系统下很多包要么没有要么需要自己从源码编译过程痛苦不说编译时间在树莓派上能让你怀疑人生。官方推荐的下载渠道有两个一个是树莓派官网的Ubuntu 22.04 LTS 64位镜像另一个是Ubuntu官方发布的树莓派专用镜像。两者核心差别不大我用的是Ubuntu官方镜像更新源时直接走Ubuntu的标准源兼容性更稳。2. 系统烧录与初始化装ROS2之前的地基工程2.1 镜像烧录实操烧录系统我强烈推荐用Raspberry Pi Imager官方工具支持在线下载镜像和直接烧录SD卡省去了先下载镜像再解压的麻烦。如果你已经有镜像文件用balenaEtcher也可以两者效果一样。烧录时有几个选项需要注意。在Raspberry Pi Imager里选择操作系统时不要选“推荐”的Raspberry Pi OS要手动找“Other general-purpose OS - Ubuntu - Ubuntu Server 22.04 LTS (64-bit)”或者选桌面版。如果你要跑rviz2、rqt这些图形工具建议选带桌面的版本如果打算无头运行只通过SSH操作选Server版更节省资源。烧录完成后SD卡会有一个名为system-boot的分区Windows和macOS下都能直接访问。建议在烧录完、还没插卡启动之前先在这个分区里做好两个预配置一是在根目录创建名为ssh的空文件以开启SSH二是编辑network-config文件配置网络。这样插卡开机就能远程连上去操作不用接显示器和键盘。2.2 首次启动与软件源更换第一次开机用SSH登录Ubuntu官方树莓派镜像的默认用户名和密码是ubuntu/ubuntu首次登录后系统会强制你修改密码。如果你用Raspberry Pi Imager烧录时自定义了用户名和密码直接使用自定义的即可。登录之后第一件事就是更新系统并换源。树莓派上的Ubuntu默认源指向国外服务器在国内网络下apt update会非常慢。换源时注意一个容易被忽略的坑arm64架构下树莓派的Ubuntu必须使用ubuntu-ports源而不是x86平台的archive源。正确做法是把/etc/apt/sources.list和/etc/apt/sources.list.d/ubuntu.sources里的地址统一替换为镜像站的ubuntu-ports路径。换完之后执行sudo apt update sudo apt upgrade -y把系统完整升到最新。这一步很有必要因为ROS2 Humble对系统的glibc、Python版本都有最低要求系统越新越不容易踩到依赖冲突。2.3 硬件配置与散热方案树莓派4B跑ROS2编译和工作负载时发热非常明显尤其编译大型工作空间时温度能轻松飙到80度以上触发降频。我强烈建议安装带散热片的主动散热风扇。风扇三根线的接法红色线接物理引脚45V黑色线接物理引脚6GND黄色测速线可接任意GPIO比如物理引脚7但如果不读转速可以不接。供电也需要注意树莓派4B官方推荐5V 3A电源。实际跑ROS2编译时峰值电流经常超过2A用普通手机充电头容易电压跌落导致频繁重启。我用的是官方电源一直很稳。还有一个容易被忽略的问题SD卡的容量和速度。ROS2 Humble桌面版装完大概占用8到10GB如果还要装Gazebo、Nav2这些扩展包加上编译缓存建议直接上64GB的A2级SD卡。速度上A2卡对随机读写优化明显编译和系统响应都会快一些。3. ROS2 Humble安装全流程从官方步骤到一键脚本3.1 安装前的环境准备系统更新完之后先做几个标准化设置。第一个是localeROS2对UTF-8编码有要求虽然Ubuntu默认通常没问题但为了保险还是按官方推荐执行一遍sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8第二个是添加必要的工具包和软件属性这一步为后面添加ROS2软件源做准备sudo apt install software-properties-common curl sudo add-apt-repository universe注意add-apt-repository universe这一步不能省ROS2的一部分依赖在universe仓库里不添加的话后面会出现找不到某些依赖包的问题。3.2 添加ROS2软件源与密钥ROS2官方仓库需要先导入GPG密钥再添加apt源。这里我直接贴出在树莓派arm64上验证过的完整命令sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [archarm64 signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null sudo apt update这里特别提醒一个常见错误网上很多教程抄来抄去写的源地址是deb [archamd64 ...]你在树莓派上照着加apt源里根本搜不到任何包因为架构不匹配。检查一下你的/etc/apt/sources.list.d/ros2.list确认archarm64。如果访问raw.githubusercontent.com和packages.ros.org很慢或者超时可以把ROS2源换成国内镜像。具体做法是把上面的packages.ros.org域名替换成国内镜像站对应的ROS镜像地址替换后重新执行sudo apt update验证。3.3 选择安装版本Desktop版还是Base版ROS2官方提供了两个主要安装选项ros-humble-ros-base包含通信核心、常用工具库、demo节点以及ros-humble-desktop在ros-base基础上加上rviz2、rqt、demo仿真等图形化工具。我的建议是只要你的SD卡空间够、内存不低于4GB直接装desktop版。因为它包含了rviz2、rqt_graph、rqt_console这些可视化工具学习阶段理解ROS2的消息通信、坐标系、节点关系这些工具帮助非常大。很多初学者装了ros-base之后发现没有rviz2又得回头补装白白浪费时间。sudo apt install ros-humble-desktop如果需要精简环境再执行sudo apt install ros-humble-ros-base实际测试下来arm64树莓派4B安装desktop版整个安装过程加上依赖总下载量在2GB左右安装完成后占用约8GB空间。安装过程中系统会自动处理依赖耐心等待即可。3.4 一键脚本安装方式与取舍除了官方手动流程国内还有一套非常流行的安装方式鱼香ROS一键安装脚本。它在ROS中文社区使用率很高核心是用一条命令完成换源、密钥导入、软件包安装、环境变量配置等一整套动作wget http://fishros.com/install -O fishros . fishros这个脚本的好处是交互做得很好选项清晰对新手特别友好比如它能自动检测架构、询问桌面版还是基础版、自动source环境变量。坏处是它集成的动作较多运行之前最好先了解脚本每一步在做什么避免以后出了问题不知道怎么排查。我的态度是新手可以用一键脚本快速把环境跑起来节省时间成本但至少应该完整看一遍官方安装流程理解密钥、源、apt包这三个环节的关系。这样将来遇到问题你才有能力自己动手排查而不是只会重装系统再来一遍。前面几节把官方流程讲透了你跟着走一遍再决定要不要用脚本加速。4. 环境配置与DDS通信调优用好ROS2的通信核心4.1 环境变量配置与多版本共存安装完成后最关键的一步是让终端知道ros2命令从哪里来。每次打开新终端手动执行一次source是可以的但更推荐写入~/.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc之所以用/opt/ros/humble/setup.bash这个路径是因为ROS2安装的标准位置就在/opt/ros/distro/下面。setup.bash会帮我们把ROS2的bin目录、lib目录、Python包路径、共享库路径全部加入当前终端的运行环境中。注意如果你以后在同一台设备上装了多个ROS2版本不要在.bashrc里同时source多个版本否则环境变量会互相覆盖出现各种诡异问题。正确做法是.bashrc里固定source一个版本另一个版本每次用之前手动source。4.2 ROS2为什么依赖DDS学习ROS2DDS是一个绕不开的话题。ROS2和ROS1最大的架构差异就是ROS1的通信是自研的TCPROS/UDPROS所有节点必须通过一个中心节点roscore来建立连接中心节点挂了整个系统就瘫了。而ROS2把通信层整个替换为DDSData Distribution Service数据分发服务这是一种去中心化的发布订阅中间件。你可以把DDS理解成一个完全分布式的消息总线每个节点启动时通过DDS的发现协议自动找到系统中其他节点不需要任何中央服务器节点之间直接点对点通信。这带来三个好处没有单点故障、通信延迟更低、多机分布式部署天然支持。但分布式发现协议也带来一个实际问题局域网内多播multicast不稳定时节点发现会变慢甚至发现不了对方。这在Wi-Fi环境下特别明显树莓派用无线网通信时偶尔会碰到topic找不到的情况后面我会详细说排查思路。4.3 RMW实现选择与性能调优ROS2的DDS层是抽象化的底层可以插拔不同厂商的DDS实现ROS2里这个抽象层叫RMWROS Middleware Interface。Humble默认使用Fast DDS这也是大多数教程默认的前提假设。但在树莓派这种资源有限、Wi-Fi网络常驻的环境下我更推荐换成Cyclone DDS。换装方式很简单sudo apt install ros-humble-rmw-cyclonedds-cpp echo export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp ~/.bashrc source ~/.bashrc我为什么推荐Cyclone DDS主要有三点。第一它在无线网络环境下的节点发现比Fast DDS更稳定遇到topic时有时无的概率明显降低。第二它的内存占用和CPU占用在ARM平台上更友好树莓派上跑多个节点的场景更从容。第三相同数据吞吐下Cyclone DDS的延迟实测略低一些。另一个有效的小配置是单机模式。如果你的ROS2系统只跑在树莓派一块板子上没有多机通信需求在.bashrc里加一行echo export ROS_LOCALHOST_ONLY1 ~/.bashrc这会让DDS跳过网卡的复杂网络发现直接用回环接口通信延迟和稳定性都会提升而且能避免树莓派的广播发现报文干扰其他局域网设备。等后面真要做多机通信了把这一行删掉就能恢复网络发现。4.4 ROS_DOMAIN_ID设置最后是ROS_DOMAIN_ID这个参数可以理解为通信域的编号。同一网络下只有ROS_DOMAIN_ID相同的节点才能互相发现和通信。在树莓派这种经常多任务共存的场景下如果你同时有多台设备或者同一台设备要跑多组相互隔离的ROS2系统给它们设置不同的ID就能避免通信串扰。echo export ROS_DOMAIN_ID1 ~/.bashrc取值范围是0到101默认是0。注意一点ROS_DOMAIN_ID会影响DDS底层使用的端口号不同域之间不会互相干扰这是设计好的。只要保持配置一致节点就能正常通信。5. 验证安装与图形化工具链让样例真正跑起来5.1 最经典的发布订阅测试环境变量配置完成后先用最经典的talker/listener测试验证ROS2核心是否正常。打开两个终端终端1执行ros2 run demo_nodes_cpp talker终端2执行ros2 run demo_nodes_py listener如果一切正常终端1会持续打印“Publishing: Hello World: N”终端2会同步收到消息并打印“I heard: Hello World: N”。这两个demo节点一个用Python、一个用C刚好分别验证了两种客户端库的通信链路。验证通过后再看几个常用命令ros2 node list ros2 topic list ros2 topic echo /chatter ros2 topic info -v /chatter这些命令能让你快速查看当前系统的节点、话题、话题类型和发布订阅关系。特别是ros2 topic echo它直接打印话题里的原始数据排查通信问题时高频用到。5.2 图形化工具rqt与rviz2desktop版自带rqt和rviz2。rqt是一系列GUI工具的集合其中最常用的是rqt_graph它把系统中所有节点和话题以有向图形式画出来非常适合理解节点间的数据流。rqt_graph等你跑起来talker和listener后再打开rqt_graph会看到两个椭圆节点被一条边话题/chatter连接发布订阅关系一目了然。初学者强烈建议把这个图玩熟它是理解ROS2架构最快的方式。rviz2是ROS2的3D可视化工具对机器人开发来说几乎是刚需。它可以把激光雷达点云、里程计、TF坐标变换、地图、机器人的3D模型全部渲染出来。树莓派4B没有独立GPUrviz2跑起来确实会卡一些但静态场景如查看地图、坐标系还是够用的。如果rviz2打开后界面渲染异常或者直接闪退多数是OpenGL兼容性问题可以尝试软件渲染export LIBGL_ALWAYS_SOFTWARE1 rviz2把这个环境变量写入.bashrc也可以代价是渲染效率略降换取稳定性。5.3 创建工作空间并编译自己的第一个包环境能跑通demo说明ROS2安装本身没问题。接下来是环境配置的关键一环创建自己的工作空间。虽然写源码不是这篇的重点但工作空间创建和编译环境是必须配好的。sudo apt install python3-colcon-common-extensions mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build第一次colcon build会生成build、install、log三个目录。build是编译产物install是安装结果log是编译日志。每次编译完成后要source整个工作空间的setup.bash新包才能被找到echo source ~/ros2_ws/install/setup.bash ~/.bashrc source ~/.bashrc在树莓派4B上编译大型源码包时内存不足是一个高频问题。4GB版本编译大型工作空间时偶尔会触发OOM建议给系统增加swap空间sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile如果要开机自动启用swap在/etc/fstab末尾添加一行/swapfile none swap sw 0 0。这个方法在树莓派上实测非常管用编译时swap大量命中能有效避免编译进程被内核杀掉。6. 常见问题与排查技巧实录6.1 高频问题排查速查表实操中大家遇到的绝大多数问题其实都可以归为几类。我整理了一张速查表按症状、原因、解决思路三条列出来。症状常见原因排查与解决ros2: command not found环境变量未生效确认source /opt/ros/humble/setup.bash检查.bashrc两个终端无法互相发现话题网络多播受限或RMW不匹配检查是否在同一网段统一RMW_IMPLEMENTATION或设ROS_LOCALHOST_ONLY1apt update报packages.ros.org连不上网络因素导致官方源不可达切换为国内ROS镜像源编译时进程被kill或提示内存不足内存不足触发OOM添加swap用colcon build --parallel-workers 2限制并行度rviz2打开闪退或花屏OpenGL驱动兼容性问题export LIBGL_ALWAYS_SOFTWARE1sudo操作极其缓慢/etc/hosts缺少主机名映射在/etc/hosts中加入本机主机名到127.0.0.1的映射树莓派运行一段时间后速度骤降过热降频检查温度加散热风扇和散热片改善通风更换RMW后通信反而异常某个节点仍使用旧RMW启动所有终端重新source并重启节点确保环境变量一致6.2 几个容易忽略的独家避坑经验除了上面这张表我再分享几个常规文档里不会写、但实际非常影响体验的细节。第一个是不要乱动系统自带的Python环境。Ubuntu 22.04自带的Python是3.10ROS2 Humble的Python工具链也依赖这个版本。很多初学者习惯先装Anaconda再装ROS2结果发现ROS2的Python工具怎么都起不来因为conda把PATH改了Python指向了conda环境。我的建议是ROS2开发用系统Python不要用conda管理ROS2环境。如果确实需要conda做深度学习只在需要时激活conda环境平时保持系统Python为默认。第二个是每次安装扩展包后都要检查依赖完整性。比如装完Humble后再装Nav2或者Gazebo有些包会引入新的依赖版本冲突。遇到apt或colcon报依赖错误时先看具体错误信息是缺少某个deb包还是Python模块缺失还是编译时某个头文件找不到。这类问题多数可以用sudo apt install 包名或pip install 模块名解决。第三个是SD卡寿命和备份习惯。ROS2编译和日志反复读写对SD卡的损耗比普通应用大。建议重要代码和配置经常用git推到远程仓库系统的镜像备份也可以定期做一次。我吃过一次亏SD卡在编译过程中突然坏掉辛辛苦苦配好的环境直接归零。从那以后我所有代码都走git系统配置用脚本管理重装一遍也就是二三十分钟的事。第四个是树莓派4B的性能余地。跑了ROS2之后可以通过htop或者rpi-monitor观察CPU占用率。如果发现大量时间耗在编译上可以考虑把系统装到外接SSD上。给树莓派4B加一块USB 3.0移动硬盘把系统装到硬盘上编译速度和整体流畅度提升非常明显SD卡只保留引导分区。实测下来colcon编译速度提升非常显著。第五个是养成用tmux管理终端会话的习惯。树莓派上跑ROS2经常要同时开好几个终端一个跑主节点一个跑导航一个看日志。通过SSH连接时一旦断开终端里的上下文就没了。如果用的是tmux重新连上后所有会话还在不用重新启动节点、重新source环境。我在树莓派上几乎所有ROS2相关操作都在tmux里完成这个习惯帮我省了无数次重头再来的麻烦。这套环境配好之后接下来的路其实很清晰装个激光雷达驱动跑SLAM建图用Nav2做自主导航或者把摄像头接进来做视觉识别树莓派的GPIO还能直接驱动电机驱动板和传感器。从仿真到真机路径基本是通的。把这些玩熟了再去碰更高性能的机器人平台会发现核心概念全是通用的。