ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

树莓派4B/5跑ROS2完整实战:从系统烧录到建图导航

树莓派4B/5跑ROS2完整实战:从系统烧录到建图导航 我手头这块树莓派4B从买回来到现在折腾ROS2前后刷了不下十次系统。网上教程很多但大部分要么只讲树莓派要么只讲ROS2把两者放到一起按真实项目流程走的文章其实不多。这篇就把我从零开始用树莓派跑ROS2再到接摄像头、控制舵机、做小车、尝试建图导航的完整经历写出来包括踩过的坑、试错的路径以及最后沉淀下来的稳定方案。文章适合两类人一是手里有树莓派但不知道从哪下手的零基础玩家二是已经能跑通例程、想往实际机器人方向推进的初学者。1. 先想清楚一个问题你的树莓派真的要装ROS2吗很多人上来就问“树莓派怎么装ROS2”但很少有人先问“我的树莓派适不适合装ROS2”。这个前置问题不解决后面会走很多弯路。我见过有人在树莓派Zero上折腾ROS2编译到一半卡死最后跑来问是不是命令错了——不是命令错是板子本身跑不动。1.1 树莓派4B和5的真实性能差距树莓派4B4GB版是跑ROS2的入门底线。我自己主力用的是4B实测跑Ubuntu 22.04 ROS2 Humble再挂一个USB摄像头节点和一个激光雷达节点CPU占用在60%到80%之间浮动内存大约占用2.5GB左右。这个负载下树莓派的散热片温度能到65度上下如果不加风扇、长时间跑降频是必然的。所以如果你是4B且只有2GB内存我的建议是老老实实跑Ubuntu Server版不要装桌面省下来的内存对ROS2这种多节点通信框架来说意义非常大。树莓派5我后来也上手试了。它的CPU性能比4B强不少尤其在编译ROS2功能包的时候5代编译同样的包时间差不多是4B的一半。如果你预算允许直接上树莓派5可以说是在硬件层面把后面三年的折腾成本都压低了。但要注意树莓派5的供电要求是5V/5A老款电源和普通充电宝大概率喂不饱跑高负载时系统会直接重启这个现象非常容易让新手误判成“系统没装好”。1.2 什么时候该选Pico这样的轻量方案如果你的目标不是跑完整的ROS2只是想用树莓派Pico控制一个舵机或者做一个简单的传感器采集那完全没必要套ROS2。Pico这类MCU的定位是执行层跑的是micro-ROS——这是ROS2官方为资源受限设备设计的方案通过串口或者WiFi和上位机通信。我后来做舵机控制就想通了Pico负责高频PWM控制树莓派4B负责决策和通信两者各干各的比在树莓派上硬接舵机更稳。具体到micro-ROS的搭建有个很顺手的组合树莓派上开Docker跑micro-ROS Agent然后通过VS Code的PlatformIO插件往ESP32或Pico里烧micro-ROS固件。这套流程在GitHub上有现成的模板可以看。我第一次把Pico发出的话题在树莓派上用ros2 topic echo接收到的时候一种“数据链路打通了”的实感非常强烈而不是像跑例程那样只是图个亮。1.3 系统烧录时最容易忽略的细节树莓派系统的烧录工具官方叫Raspberry Pi Imager。这个工具有两个地方新手容易卡一是烧录时可以选择预配置SSH和WiFi很多人不知道直接跳过了结果板子起来后没法远程连接又得拿显示器键盘去重弄二是Imager默认会把安装程序装到C盘如果你想把软件本体放到别的盘安装过程中是能选路径的别一路点“下一步”到最后才发现C盘满了。烧录报错是另一个高频问题。如果你用的TF卡是那种杂牌扩容卡烧录到一半报错特别正常。我的建议是烧录失败先换一张卡别反复重烧同一张卡。做过一次完整镜像校验比烧十次都省时间。2. ROS2系统版本对照以及换源和安装顺序的讲究ROS2的版本和Ubuntu版本是严格绑定的。很多人装不上不是操作不对而是Ubuntu版本和ROS2版本对不上。比如ROS2 Jazzy只支持Ubuntu 24.04你拿22.04去装官方源里根本没有这个包。2.1 树莓派上最常见的三组搭配我列一下我实际用过的搭配你可以直接照着选树莓派型号Ubuntu版本ROS2版本我的评级树莓派4B 2GBUbuntu Server 22.04Humble勉强能用别开桌面树莓派4B 4GB/8GBUbuntu 22.04 DesktopHumble舒适适合学习树莓派5Ubuntu 24.04 DesktopJazzy当前最优选择树莓派5如果想装旧一点的Humble其实也能跑但需要自己从源码编译。我没走这条路因为Ubuntu 24.04 Jazzy在树莓派5上的表现已经足够稳定没必要为了“情怀”去编译一晚上。2.2 安装步骤里的关键顺序ROS2的安装步骤看着简单但顺序错了很折腾。完整的流程应该是先改软件源再更新系统然后装 locales 和 curl 之类的基础依赖接着添加ROS2官方的源和密钥最后才执行apt install ros-humble-desktop。很多时候问题出在改了软件源但没有执行apt update或者添加ROS2源之后没有把密钥配好。还有一个很典型的坑在树莓派上安装ROS2的deb包时ros-humble-desktop太大了包含可视化工具下载时间很长不少人在这个环节以为卡死了。实际上放那等十来分钟很正常实在担心的话可以先装ros-humble-ros-base这样的小集合之后缺什么功能再按需装。2.3 换镜像源的边界问题在树莓派上跑Ubuntu默认连的是官方源国内网络环境下速度很感人。换源是必须做的一步。这里我多说一句换的是Ubuntu的apt源把国内的镜像站地址替换掉/etc/apt/sources.list里的默认地址就行。操作前备份一下原文件万一替换错了还能改回来。树莓派OS的源和Ubuntu的源位置不一样树莓派OS是/etc/apt/sources.list.d/下的多个文件。如果你刷的是树莓派OS而不是Ubuntu换源方式别照搬Ubuntu教程否则改错文件不会报错但也不会生效。3. 跑通第一个ROS2程序小乌龟到rviz2再到摄像头的跳跃ROS2装完之后第一个验证程序当然是ros2 run turtlesim turtlesim_node。这个例程的意义在于验证发布订阅、话题通信和服务调用是否正常不是让你做游戏。很多人跑完小乌龟就不知道该干嘛了实际上ROS2入门有一条非常清晰的路径先让小乌龟动起来再用rviz2看机器人模型最后接上真实传感器。这条链走通你才算真正入门。3.1 小乌龟验证的三种通信机制跑小乌龟的时候建议顺便验证三种基本通信机制。第一种是话题终端里执行ros2 topic list看有哪些话题然后ros2 topic echo /turtle1/cmd_vel就能看到速度指令的数据。第二种是服务执行ros2 service list能看到服务列表比如/spawn调用一下就能在窗口里生成新乌龟。第三种是参数ros2 param list能查看节点参数。这一套下来你对ROS2的“话题、服务、参数”三个基本概念会有直观理解比看一百页概念定义都管用。3.2 rviz2无法启动的常见原因rviz2是ROS2里的三维可视化工具跑起来之后能看到机器人模型、传感器点云、地图这些内容。但rviz2在树莓派上有一个很常见的问题窗口起不来或者起来之后全黑。如果你用的是无桌面版系统那不用想了rviz2这类GUI工具必须配合桌面环境才能运行。如果你用的是Desktop版但仍打不开大概率是显卡驱动的问题。树莓派的GPU驱动在Ubuntu下默认用的是软件渲染rviz2在这种模式下降频特别严重简单来说就是“能跑但拖不动”。我的解决办法是给/boot/firmware/cmdline.txt增加GPU内存分配或者在启动rviz2之前先关掉一些不必要的后台节点把显存腾出来。3.3 树莓派摄像头模块的接入方式树莓派的官方摄像头模块型号是OV5647也就是常说的800万像素摄像头CSI接口是它区别于USB摄像头的最大特点。CSI摄像头在ROS2里不是即插即用的你需要安装raspicam2或者使用camera_ros这类驱动节点。我实测下来直接用ROS2的usb_cam驱动是识别不到CSI摄像头的必须走专用的CSI封装节点。如果你的摄像头是USB接口的那简单得多用usb_cam功能包改一下设备路径和像素格式就能发布图像话题。我在树莓派上遇到的一个问题是USB摄像头打开后画面颜色偏绿后来发现是白平衡参数没设置对在usb_cam的配置里把白平衡模式改成自动就正常了。如果想快速验证摄像头本身有没有问题可以装一个叫luvcview的小工具——它是Linux下通用的USB摄像头查看工具不需要ROS2就能直接看画面。这个工具特别适合排查“是不是摄像头硬件坏了”这种问题。先确认摄像头硬件本身能出图再去排查ROS2驱动排查思路就清晰得多。4. 从舵机到四轮小车树莓派实际控制执行器的几条路线前面这些环节都是软件层的验证到了这里才真正进入“机器人”的范畴让硬件动起来。热词里提到“树莓派Pico控制舵机”和“树莓派四轮小车”这其实代表了两种完全不同的控制思路用错方向会浪费很多时间。4.1 树莓派Pico控制舵机的接线和代码思路Pico控制舵机走的是PWM信号舵机的角度由脉冲宽度决定。常见的SG90舵机需要50Hz的频率也就是20毫秒周期其中0.5ms对应0度2.5ms对应180度。用MicroPython代码实现的话先去构造PWM对象设置频率为50Hz然后控制占空比来改变脉宽。硬件接线上舵机三根线分别为信号线、正极和地线。我最初接的时候没注意外部供电这回事直接用Pico的3.3V输出带动SG90结果舵机抖动、复位后来才明白舵机启动时电流瞬间能到几百毫安甚至更高Pico的引脚根本供不住。正确的做法是舵机的电源用5V外部供电信号线连Pico的GPIO输出地线共地。4.2 四轮小车摄像头的开启方式四轮小车涉及的摄像头要先分清用的什么型号。如果是带摄像头的4WD小车一般有两种情况一种是树莓派单独跑了ROS2摄像头直接连树莓派那么摄像头的开启方式和上一节讲的完全一样另一种是摄像头连的是别的控制板树莓派只负责算法层。我调试这类小车时发现很多人说“摄像头打不开”其实是没给权限。Linux下访问摄像头设备需要让当前用户加进video用户组否则会提示权限不足。执行sudo usermod -aG video $USER然后重新登录问题就解决了。4.3 小车运动控制里最容易忽略的供电问题四轮小车比单纯一个舵机复杂在系统层面。四个电机同时启动的电流非常可观如果你给树莓派和电机驱动芯片用的是同一个电源电机一转电压跌落树莓派直接重启。这个问题几乎每个玩小车的人都会遇到区别只是重启的时机早晚。解决方法是分开供电电机一路树莓派一路共地但别共电源。我后来测过用两节18650电池专门给电机供电再用一块稳压模块给树莓派供电整套系统就稳定了再没出现过一动就重启的情况。5. 车能动了之后建图导航、雷达配置和ROS2目录结构能把车开动说明基础通信已经通了。接着往高阶走就是建图和导航。这里面的关键词是“八叉树地图”和“Livox雷达”这俩凑一块儿属于比较硬核的方向了。5.1 八叉树地图导航到底在做什么传统的地图表示方法是占据栅格地图就是一张二维图片黑色是障碍物、白色是空地。八叉树地图OctoMap是三维的它把空间递归切块如果一个块内部全是空的或者全是实的就不再细分。这样做的好处是内存消耗比体素地图小得多而且能表达复杂的三维结构比如室内天花板、悬空障碍物。导航时使用八叉树地图能够做真正意义上的三维路径规划而不是只在平面图上避障。在ROS2生态里构建八叉树地图通常借助octomap_server这类功能包它订阅激光雷达或深度相机的数据实时生成八叉树地图并通过rviz2展示。如果你的传感器是2D激光雷达那就只能用二维占据栅格地图了想玩8叉树至少得有个3D数据源比如Livox雷达或者RGB-D深度相机。5.2 Livox雷达在ROS2下的配置经验Livox是国产的固态激光雷达品牌在户外机器人场景用得多。Livox Avia这类雷达在ROS2下的配置比常规雷达要费劲一点。首先要装厂商提供的livox_ros_driver2功能包新版本对ROS2 Humble和Jazzy都有支持。其次雷达的IP地址和电脑网卡的IP地址要配到同一个网段这是最容易被忽略的一步。我调试的时候发现点云话题始终没有数据排查了一个多小时才发现雷达默认IP是192.168.1.5而树莓派网卡IP是192.168.0.10跨网段了数据根本收不到。5.3 ROS2功能包的目录结构说到这里得提一下ROS2的目录结构因为后面你自己写功能包时这个绕不开。一个标准的ROS2功能包目录大致是这样的my_robot/ ├── package.xml # 包描述文件记录依赖 ├── CMakeLists.txt # 编译配置C包 ├── setup.py # 编译配置Python包 ├── setup.cfg ├── resource/ ├── launch/ # 存放launch文件 ├── src/ # 源码目录 └── config/ # 配置文件yaml等我最早犯的错是把编译好的Python包直接丢进src目录就跑当然找不到因为ROS2的功能包必须按上述结构组织好然后执行colcon build完成编译再source工作空间才能被识别。ROS2里常用的命令其实核心就那么几条ros2 node list看节点ros2 topic list看话题ros2 topic echo看数据ros2 service list看服务ros2 action list看动作。真正复杂的是Action机制。Action在ROS2里的地位很像“带反馈的异步服务”适合那些执行时间长的任务比如导航到某个点。它由目标、反馈、结果三个部分组成客户端发起目标后服务端可以异步反馈进度最后返回结果。写导航代码时用Action比用Service合理得多因为导航是一个持续过程不是一问一答。还有一个进阶概念是FastDDS它是ROS2默认的DDS实现负责节点之间的底层通信。FastDDS不是独立于ROS2之外的东西它本身就是ROS2的通信底座。理解这一点就够了除非你要做性能调优或者跨设备通信否则不需要深入它的内部封装结构。6. 从数据采集到应用场景树莓派ROS2的实际项目方向装了ROS2跑通了小乌龟和摄像头那接下来能做什么这个问题比“怎么装”更值得思考。我整理几个自己实操过或深入研究过的方向。6.1 ADS-B航空数据接收项目树莓派接收ADS-B信号是用来获取附近飞机信息的。ADS-B是飞机自动广播自身位置、高度、速度等信息的系统地面用专门的SDR接收棒就能捕获这些广播再配合软件解码就能在电脑上看到周边空域的情况。这个项目的典型链路是树莓派插上RTL-SDR接收棒装上dump1090之类的解码软件再通过网页界面或者ROS2节点来读取数据。和ROS2结合的一个玩法是把接收到的飞机信息包装成自定义话题发给下游做数据处理。这个项目特别适合练手因为硬件成本低数据获取简单而且涉及串口或USB设备读取、数据解析、话题通信这些都是机器人项目的通用技能。6.2 无桌面环境下ROS2的日常使用技巧既然前面强调了Server版省内存那你得掌握一套纯命令行的操作习惯。树莓派Ubuntu Server版启动后默认不装桌面SSH连接过去就是黑底白字的终端。对于ROS2来说这完全够用因为大部分操作都可以在命令行完成。唯一不方便的是可视化验证。解决办法有两个方向一是通过SSH的X11转发把rviz2这种GUI程序显示到本地电脑上。这个方案要求本地电脑跑Linux或者装XmingWindows下也可以用但延迟高展示效果一般。二是使用Web端的可视化方案比如Foxglove Studio树莓派上把ROS2数据桥接出去本地浏览器打开看图像和点云。我后来一直用这种方法比X11转发顺滑得多。6.3 自定义话题与语音交互的扩展热词里出现了“小智语音聊天”和别的一些语音方案。把语音接入ROS2本质上是写两个节点一个是语音识别节点把声音转成文本后发布成字符串话题另一个是语音合成节点订阅字符串话题转成声音播放。这个架构最直接的价值是让你理解“节点职责单一”的设计思想后面不管接什么外设都是往话题总线里加节点。做中文语音交互时还涉及一个问题树莓派默认没有中文字体和中文字库你如果是装桌面版然后想输入中文需要帮忙安装输入法框架。五笔用户则可以再添加五笔输入法支持。这些都是系统层的坑和ROS2本身无关但会实实在在影响使用体验。7. 装机之后的三件小事U盘挂载、SSH保活、时间同步最后写几个装完系统、跑起ROS2之后实际使用中绕不开的小问题。这些小问题单独看都不难但遇到一个卡一次非常消磨耐心。7.1 U盘自动挂载位置与权限树莓派OS和Ubuntu Server对U盘的处理不同。树莓派OS桌面版插上U盘会自动挂载到/media/pi/设备名而Ubuntu Server默认不做自动挂载需要手动挂载。手动挂载的第一步是要先看lsblk找到U盘的设备名比如/dev/sda1然后执行sudo mount /dev/sda1 /mnt/usb。这里有个不太优雅的细节如果U盘是NTFS格式直接挂载只有只读权限需要安装ntfs-3g并加参数挂载如果是exFATUbuntu自带支持不会有大问题。7.2 SSH连接不稳定对ROS2多机通信的影响树莓派用得久了你会发现WiFi连接的SSH会偶发断连。这在平时无所谓重连一下就好但在ROS2多机通信时影响很大。ROS2节点之间的通信走的是DDS基于UDP网络抖动会导致话题数据卡顿或丢失。我在树莓派和电脑双机通信时就遇到过订阅端时不时掉话题一连查了几天代码最后发现是WiFi下网络延迟不稳定。解决思路有两个一是优先用网线直连树莓派和路由器把网络抖动降到最低二是调FastDDS的配置。简单来说在fastdds.xml里合理设置端口和网卡绑定。这个文件能配置节点使用的网卡、端口复用、心跳间隔等参数。如果只有一块网卡配置不配置差别不大但多网卡环境比如同时连着WiFi和网线不指定网卡的话ROS2可能自己选错网络接口导致节点发现不了这是个很容易踩的深坑。7.3 时间同步问题ROS2的TF坐标变换对时间戳很敏感。如果你的树莓派没有连网系统时间和真实时间偏差很大那么跑地图或者导航时会出现各种奇怪的“转换失败”报错看起来像是代码写错了实际上是时间基准不对。装完系统第一步养成习惯检查时间是否正确如果不对就配置网络时间同步服务。就这么一个操作能帮你避免后面排查问题的弯路。树莓派ROS2这条路说难不难说容易也不容易。它难在涉及的层次太多硬件、系统、网络、通信框架、传感器、执行器每一层都有各自的坑。但它也正因为层次多而适合学习——每跨过一个坑你对整个机器人系统从底层到上层的理解都会深一层。我的经验是别想着一步到位先把系统装干净把小乌龟跑起来再一个传感器一个传感器地接最后当你把传感器数据、控制指令、可视化界面串起来的那一刻对这套体系才算真正有感觉。
返回列表