ARTICLE DETAIL

资讯详情

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

树莓派+ROS2实操指南:从环境搭建到机器人开发全流程

树莓派+ROS2实操指南:从环境搭建到机器人开发全流程 很多朋友第一次接触「树莓派与ROS2」脑子里其实是懵的树莓派我知道一块小开发板ROS2我也知道一个机器人操作系统。但这两样东西怎么组合到一起组合起来到底能做什么值不值得花力气去搞我先给个结论树莓派 ROS2是目前学生做毕设、工程师做机器人原型验证、爱好者入门机器人开发时性价比最高的一套组合。树莓派提供了硬件载体和Linux运行环境ROS2提供了分布式通信、传感器驱动、导航规划等一整套机器人软件框架。两者一结合你就能在一张比银行卡大不了多少的板子上跑起一个真正意义上的机器人系统——无论是做个带摄像头的小车还是搞一套室内导航方案甚至接上舵机、麦克风阵列做语音交互都能在这套组合上完成。这篇文章我不想写成一个操作手册的堆砌而是想以“我实际折腾过、踩过坑”的角度把从零搭建树莓派 ROS2开发环境、跑通核心功能、再到扩展应用的全过程拆开讲清楚。内容包括硬件选型怎么看、系统刷机和基础配置怎么做、ROS2到底装哪个版本、怎么快速掌握核心命令、以及摄像头、Pico舵机、导航地图这些常见扩展玩法。篇幅会比较长但保证每一段都是实操过的经验照着做基本不会翻车。树莓派与ROS2从系统安装到机器人开发的完整实操经验1. 硬件选型树莓派到底买哪块才够跑ROS21.1 不同型号的性能差异与选择逻辑先解决一个最基础的问题跑ROS2需要什么配置树莓派哪一款才够用从ROS2本身的架构来说它不是一个“重量级”软件。核心通信层基于DDS主要消耗的是CPU和内存资源对GPU没有硬性要求。真正吃性能的是你跑不跑仿真、跑不跑SLAM建图、跑不跑视觉识别。所以我给不同需求列的选型建议是这样的树莓派3B能装能跑ROS2但只适合跑节点通信、小乌龟这类基础Demo。一旦同时开启摄像头采集、图像处理、导航规划内存和CPU都会顶不住。如果你手里只有3B建议只做学习入门别指望做太复杂的实车实验。树莓派4B4GB/8GB目前最主流的“甜点级”选择。4B的BCM2711芯片虽然不算新但跑Ubuntu Server 22.04 ROS2 Humble再挂一个USB摄像头、跑几个导航节点内存占用还能控制住。4GB版本基本够用8GB版本更从容尤其是做SLAM建图时点云和地图数据的缓存很吃内存。树莓派5性能提升非常明显CPU比4B快了2到3倍PCIe接口、更强的USB 3.0带宽对它来说是真正的质变。如果你要跑Livox雷达的ROS2驱动、实时八叉树地图导航、或者做人脸识别这类视觉任务5代是更稳的选择。但代价是散热要求更高必须配主动散热风扇或铝合金外壳否则高温降频很严重。树莓派Pico或ESP32这类MCU注意这不是让你直接跑完整ROS2而是作为“执行机构”挂到ROS2系统里。树莓派主控负责决策和通信Pico这类单片机负责实时控制舵机、电机、读取编码器。两者通过micro-ROS桥接这也是现在很多机器人项目的标准分层架构。1.2 周边配件怎么配内存卡、电源、散热硬件选的第二部分是周边配件。这地方很多人不注意结果后面问题不断。内存卡是第一优先级的。ROS2的安装包比较多加上Ubuntu系统本体、依赖库、日志文件一张16GB的卡装完基本就满了所以起步建议32GB最好选A2速度等级的。我踩过最典型的一个坑用了一张杂牌A1卡跑树莓派4B系统启动要两分半编译ROS2功能包时频繁卡死。换成Sandisk Extreme A2之后编译时间直接缩短了一半以上。别在这种地方省钱。电源是最容易被忽略的“隐形杀手”。树莓派4B和5对供电非常敏感官方推荐的5V/3A或5V/5A不是说着玩的。很多人在USB口上插了移动硬盘、GPS模块、4G上网卡之后设备就开始随机掉线、USB设备不识别十有八九是供电不足。我自己的习惯是所有扩展外设优先用带独立供电的USB Hub主板USB口只留给必须直连的设备。散热方面树莓派4B裸奔跑ROS2的话CPU满载时温度经常冲到80度以上虽然不至于立刻死机但降频会让编译和运行变得很痛苦。我推荐至少配一个带风扇的散热片套装树莓派5则直接建议上主动散热外壳这是长期稳定运行的前提。2. 系统基础无屏幕装机、换源与SSH三板斧2.1 无屏幕安装Ubuntu Server树莓派作为机器人主控绝大多数场景是“无头模式”——没有显示器、没有键盘只有一块主板放在小车底盘上。所以无屏幕安装系统是必学技能。我的推荐方案是使用树莓派官方烧录工具Raspberry Pi Imager直接烧录Ubuntu Server镜像。注意两个关键点第一选择64位系统。现在Ubuntu对树莓派的64位支持已经非常成熟ROS2的很多预编译包尤其是Gazebo、Nav2这类依赖较多的大型包在64位系统上兼容性更好。32位系统虽然能跑但会让你多出很多编译上的麻烦。第二利用Imager的“高级选项”功能。在写入镜像之前按CtrlShiftX打开高级配置提前设置好hostname、开启SSH、配置WiFi账号、设置登录用户名和密码。这一步做好你的树莓派就可以做到“开机即连”——插电启动后在电脑上直接用SSH连进去完全不需要屏幕。这里还得提醒一个烧录时的常见误区Imager烧录完成后的“验证写入”选项默认是开启的。如果你用的是大容量卡或慢速卡验证过程会非常耗时。我一般只在刚买的新卡时验证一次确认卡没问题之后后续烧录都会关掉验证能省下不少时间。2.2 换源树莓派Ubuntu的apt源到底该怎么改装完系统第一件事就是换软件源。这一步不做后面安装ROS2、安装依赖库的网络速度会让你怀疑人生。Ubuntu系统的源配置文件在两个位置/etc/apt/sources.list和/etc/apt/sources.list.d/目录下的ubuntu.sources文件。新版Ubuntu22.04及以后用的是后者很多老教程还在教改前者照着操作会发现根本没效果。换源的方法很简单把archive.ubuntu.com和security.ubuntu.com替换成你所在的镜像站地址。以清华源为例http://mirrors.tuna.tsinghua.edu.cn/ubuntu/。但这里有个树莓派专属的坑树莓派的Ubuntu是专门针对ARM架构移植的它的源里面有一部分包指向的是ports.ubuntu.com而不是archive.ubuntu.com。如果你把所有源都换掉有些硬件相关的包会找不到。我的建议是只替换ubuntu.sources文件里的main、universe、multiverse等软件源地址restricted和ports相关的源保留原样或者单独处理避免折腾半天最后连内核头文件都装不上。换完源之后先执行sudo apt update再执行sudo apt upgrade -y。升级是最容易出问题的环节如果卡在某个包的配置界面多半是interactive配置弹窗卡住了按Tab键选择“保持现有版本”或者直接设置DEBIAN_FRONTENDnoninteractive再执行升级命令就能跳过。2.3 SSH环境与终端基础配置SSH连上之后有几个基础配置建议第一时间完成都是后续开发绕不开的设置时区sudo timedatectl set-timezone Asia/Shanghai。树莓派默认UTC时间会让你的ROS2日志时间戳对不上排查问题时非常痛苦。启用字符集sudo locale-gen en_US.UTF-8并设置默认locale。中文字符集问题会影响一些依赖库的输出为了避免乱码直接用UTF-8最省心。配置静态IP如果你打算让树莓派常驻小车或机器人平台强烈建议在路由器上为树莓派绑定DHCP保留或者在netplan配置文件里设置静态IP。ROS2的多机通信对网络稳定性要求很高IP地址频繁变化会严重影响节点发现。还有一个小技巧在电脑上用VS Code的Remote-SSH插件连接树莓派。在树莓派上装好openssh-server后直接从VS Code里连接就能在本地IDE界面中编辑树莓派里的代码、打开终端执行命令比用命令行vim高效太多了。这个是我目前开发ROS2功能包的主力工作流。3. ROS2选型与安装别一上来就复制粘贴3.1 选哪个发行版Foxy、Humble还是Jazzy很多新手栽在第一关网上搜到一篇教程让装Foxy另一篇让装Humble还有最新的Jazzy到底选哪个我的建议非常简单明确除非你有特殊的课程要求否则直接装Humble。原因有这么几点Humble是ROS2目前用户量最大的LTS长期支持版本支持到2027年生态最成熟。你遇到的大部分报错网上都已经有人遇到过并给出了解决方案。很多第三方硬件驱动雷达、相机、IMU的ROS2包优先适配的就是Humble。虽然新的Jazzy也在逐步跟上但依然有部分驱动包没有完成迁移。树莓派最稳定的Ubuntu 22.04系统对应ROS2的Humble。这两个版本组合在一起算是目前“树莓派 ROS2”最经典的配置各种教程、镜像、示例代码都是围绕这套组合的。那Foxy呢Foxy发布于2020年现在已经过了维护期EOL新包不再支持遇到问题基本没有维护者回复除非你是被课程教材锁定了版本否则别碰。Jazzy是2024年发布的新版本配合Ubuntu 24.04使用虽然长期支持到2029年但生态还在成长中遇到问题很可能只能自己啃源码。对于绝大多数学习者和项目开发者Humble是当前的最优解。3.2 安装流程详解从哪里复制、怎么少踩坑ROS2官方提供了一套完整的二进制安装教程在docs.ros.org上我建议以官方流程为准不要跟着博客里的“一键安装脚本”乱来。不过官方教程只给了命令我这里补充一些实际操作中的细节。安装前先确保Ubuntu系统的locale是UTF-8然后添加ROS2软件源sudo apt update sudo apt install -y curl gnupg lsb-release 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 $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null如果连接packages.ros.org太慢可以去中科大或清华的镜像站把源地址替换成镜像站地址。注意ros.key的下载地址也要换成镜像站的否则很可能卡在这一步。然后是正式安装。我推荐安装“桌面版”里的ros-base组件再按需添加其他包sudo apt update sudo apt install -y ros-humble-ros-base python3-argcomplete ros-dev-tools为什么不装完整的ros-humble-desktop因为在树莓派上desktop版包含的图形化工具如RViz、Gazebo体积很大而且有些GUI组件在SSH环境或没有显示器的情况下根本用不到。先用ros-base把核心通信跑起来等需要可视化时单独装RViz2sudo apt install -y ros-humble-rviz2 ros-humble-gazebo-ros-pkgs这种方式更符合树莓派的资源定位。不然光安装就下载好几个GB内存卡和网络都要遭罪。3.3 环境变量与工作空间的初始化装完ROS2核心后每个新终端窗口都要source一下环境变量手动执行很麻烦直接写进shell配置echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc之后验证安装是否成功最经典的方法就是运行那个蓝色小乌龟的Demoros2 run turtlesim turtlesim_node能弹出小乌龟窗口说明ROS2核心安装成功。如果是在SSH无桌面环境需要先在树莓派上装好x11-apps和xauth然后在电脑上使用支持X11转发的SSH客户端比如MobaXterm连接或者直接用VNC远程桌面否则turtlesim这类GUI程序是看不到画面的。接着创建一个自己的工作空间。ROS2的工作空间结构非常清晰就是一个src目录里面放功能包。创建方式mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build第一次colcon build后要在终端里source一下install/setup.bash让系统知道这个工作空间的存在。同样这个也可以写进.bashrc免去每次手动source的麻烦。4. 从turtlesim到自写节点把ROS2核心机制跑明白4.1 ROS2的节点、话题、服务和动作到底是什么ROS2的核心理念是“分布式通信”。所谓分布式就是说你的机器人系统可以同时跑在多台设备上——树莓派上跑传感器节点电脑上跑导航节点两者通过网络互相通信。理解ROS2本质上就是理解它提供的几种通信方式话题Topic单向、连续的数据流。比如摄像头节点把图像数据持续发布到/image_raw话题上其他节点订阅这个话题就能拿到图像。这是ROS2里最常用的通信方式适合传感器数据流。服务Service请求-响应模式适合短时、一次性的调用。比如你请求机器人“打开灯光”服务端处理完返回“已打开”。请求和响应是一对一的关系。动作Action适合长时间执行的任务可以反馈进度、可以被取消。比如“导航到A点”这个过程可能耗时30秒期间客户端能持续收到进度反馈也可以在中途发起取消请求。动作在ROS2的导航和机械臂控制中用得非常多。理解这三种通信方式就理解了ROS2最核心的抽象模型。你后面写的每个节点做的每个机器人功能本质都是在用这些通信方式组织数据流。4.2 小乌龟Demo验证全部核心通信机制我建议实操时别只启动小乌龟就完事而是用它把三种通信方式都验一遍首先开两个终端分别运行ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_key这时你可以用方向键控制乌龟移动。然后打开新终端用命令查看通信过程ros2 node list ros2 topic list ros2 topic echo /turtle1/cmd_velecho话题数据是最直观的教学方式——你按一下方向键终端里就会刷出一条速度指令包含线速度x和角速度z这就是键盘节点发给乌龟节点的“控制信号”。接着试试服务ros2 service list ros2 service type /spawn ros2 service call /spawn turtlesim/srv/Spawn {x: 5, y: 5, theta: 0.0}这样能凭空生成一只新乌龟理解“服务”就是一次性的请求-响应调用。至于动作Actionturtlesim里没有现成示例但你可以用Nav2相关的模拟包或者后续在自写节点中体验。核心是先分清这三种通信方式之后写代码时才知道该用哪一种。4.3 用Python写一个最小的发布订阅节点小乌龟Demo跑明白之后就该动手写第一个自己的节点了。ROS2支持C和Python两种开发语言树莓派上做原型开发、控制逻辑、测试脚本我推荐先用Python做对实时性要求高的底盘驱动、传感器驱动时才用C。创建一个功能包cd ~/ros2_ws/src ros2 pkg create my_first_pkg --build-type ament_python --dependencies rclpy std_msgs然后编辑my_first_pkg/my_first_pkg/my_publisher.pyimport rclpy from rclpy.node import Node from std_msgs.msg import String class SimplePublisher(Node): def __init__(self): super().__init__(simple_publisher) self.publisher self.create_publisher(String, my_topic, 10) self.timer self.create_timer(1.0, self.timer_callback) self.counter 0 def timer_callback(self): msg String() msg.data fHello ROS2 from Raspberry Pi: {self.counter} self.publisher.publish(msg) self.get_logger().info(fPublishing: {msg.data}) self.counter 1 def main(argsNone): rclpy.init(argsargs) node SimplePublisher() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()这段话的逻辑很清晰创建一个定时器每1秒触发一次回调函数在回调里发布一条字符串消息。这就是ROS2节点的基本骨架——初始化、创建话题、定义回调、spin进入循环监听。订阅节点的代码结构也类似核心区别是创建一个订阅者对象然后处理每一条接收到的消息。写完之后在setup.py里把入口点配置好用colcon build编译ros2 run my_first_pkg my_publisher运行。这套流程走通你就算是真正入门ROS2开发了。5. 玩法进阶摄像头、Pico舵机与机器人导航5.1 树莓派摄像头OV5647与USB摄像头的ROS2接入摄像头是机器人视觉的基础传感器。树莓派主流的摄像头有两种一种是CSI接口的官方摄像头常见传感器型号就是OV5647一种是USB摄像头。两种接到ROS2的方式差别很大。CSI摄像头OV5647接在树莓派的CSI排线接口上图像质量好、延迟低。但麻烦在于驱动方式——树莓派官方使用libcamera框架它不像旧的raspistill那样直接输出一个v4l2设备节点所以ROS2里很多老的raspicam2驱动包已经不好用了。我的建议是如果做ROS2开发优先用USB摄像头省掉CSI驱动的兼容性问题。USB摄像头插上后系统会自动生成/dev/video0设备节点然后用现成的usb_cam功能包发布图像话题sudo apt install -y ros-humble-usb-cam ros2 run usb_cam usb_cam_node_exe --ros-args -p video_device:/dev/video0 -p image_width:640 -p image_height:480另一终端用ros2 topic hz /image_raw查看图像发布频率正常应该有30Hz左右。如果要用rviz2查看图像直接在RViz里添加Image显示组件话题选择/image_raw就能看到画面。如果是CSI摄像头且坚持要用我最新的实测经验是在树莓派上运行libcamera-hello确认摄像头硬件没问题然后用libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:8888以TCP流方式输出视频宿主机端用GStreamer或FFmpeg拉流再转成ROS2话题。这种方式能用但不优雅所以我个人还是推荐USB摄像头方案。5.2 Pico控制舵机micro-ROS的接线与应用方式树莓派主控 Pico/ESP32执行机构是目前DIY机器人很流行的高低配架构。树莓派负责视觉、导航、决策收到指令后通过串口发给PicoPico再以微秒级精度去控制舵机或电机。这种分层的核心是micro-ROS——一个能让MCU直接接入ROS2网络的小型化通信库。Pico控制舵机的硬件接线非常简单舵机的信号线接Pico的GPIO口比如GPIO0电源和地线接外部5V电源注意舵机启动瞬间电流很大不要直接从Pico的3.3V引脚取电否则Pico会直接复位。代码层面用micro-ROS的方式是这样的先在电脑/树莓派上运行micro-ROS Agent它是一个桥接程序通过串口或WiFi与Pico通信Pico里烧录micro-ROS固件声明一个订阅者节点订阅速度指令话题当树莓派上的ROS2系统给这个话题发消息时Pico解析消息并生成对应PWM信号控制舵机。实际的部署过程比这个要繁琐一些需要用到PlatformIO或Arduino IDE、micro-ROS的Arduino库以及micro_ros_agent这个程序。但整个流程跑通之后你就掌握了一套非常通用的机器人控制架构——以后换不同的电机、加IMU、加编码器都只是在Pico端加几个节点的事。5.3 从SLAM到八叉树地图导航如果要把树莓派 ROS2做成一台能自主导航的移动机器人那核心技术栈是SLAM和Nav2。SLAM负责“建图定位”。树莓派上常见的选择是slam_toolbox2D激光雷达或rtabmapRGB-D摄像头。以2D雷达为例启动雷达驱动后用slam_toolbox把激光数据与里程计数据融合在RViz里逐步扫描环境就能实时生成一张2D栅格地图。导航部分用的是Nav2堆栈它把路径规划、避障、行为树、代价地图这些模块全部整合在一起。启动Nav2后在RViz里用2D Goal Pose工具在地图上点一个目标点机器人就会自主规划路径并移动过去。Nav2在树莓派上是可以运行的但建议把地图的分辨率调到0.05m以下、代价地图的更新频率降低一些否则CPU会持续高负载。热词里提到的“八叉树地图导航”是比2D栅格地图更进一步的三维建图方案用OctoMap库生成常用于无人机或机械臂的环境感知。8叉树地图的分辨率可以动态调节而且支持概率更新非常适合做避障地图。在ROS2里用它一般是把激光雷达或深度相机的数据通过octomap_server功能包转换成八叉树地图再用于Nav2的三维代价地图。这块内容比较进阶建议先把2D导航跑通再深入学习。6. 高频问题排查实录6.1 树莓派烧录与系统启动问题速查表问题现象常见原因解决方法烧录到一半报错内存卡质量问题或读卡器供电不稳换数据线换读卡器换卡重试树莓派通电后红灯亮绿灯不亮系统镜像损坏或内存卡接触不良重新烧录镜像格式化SD卡后再试SSH连接不上镜像中没有开启SSH或IP地址不对Imager配置里勾选SSH路由器后台查IPapt update报错证书问题系统时间错误先执行sudo apt install -y ntpdate sudo ntpdate ntp.ubuntu.comUSB设备随机断开供电不足换官方电源外接供电Hub6.2 ROS2安装与运行常见报错报错1Package ros-humble-desktop has no installation candidate多半是ROS2源没有正确添加或者没有执行sudo apt update。检查/etc/apt/sources.list.d/ros2.list文件是否存在、源地址是否正确。还要确认你的Ubuntu版本是22.04Humble不支持20.04。报错2ros2: command not found环境变量没有source。执行下面的命令后重新测试source /opt/ros/humble/setup.bash如果还是找不到确认ROS2是否真的安装成功ls /opt/ros/看看humble目录是否存在。报错3colcon build编译失败最常见的是依赖缺失。先安装ros-dev-tools再确认功能包的package.xml中声明的依赖已经通过sudo apt install安装。如果是Python包编译失败检查Python版本是否与功能包要求的一致。报错4节点间通信失败topic list看不到对方发布的话题这是ROS2多机分布式通信最常见的坑。首先确认两台设备在同一网段其次关掉防火墙或有线/无线网络冲突。还可以设置环境变量ROS_DOMAIN_ID为同一个数字确保两端在同一个DDS域。最后如果一台设备有多个网络接口比如树莓派同时连了WiFi和有线要设置ROS_AUTOMATIC_DISCOVERY_RANGE或指定网卡否则DDS节点发现会出现诡异的问题。6.3 我的独家排错四步法干这行这几年我总结了一套ROS2通用排错流程先按这个顺序查能解决九成问题查网络ros2 node list能看到哪些节点看不到自己的节点就是环境或网络问题。查话题ros2 topic list和ros2 topic hz /目标话题确认数据是否在流动。话题存在但hz是0就是发布端有问题。查日志ros2 doctor会自动检查环境配置问题看看它给的报告。查依赖ros2 pkg list | grep 包名确认功能包是否真的安装。这套流程我已经用了很多年每次机器人出问题都从这四个维度倒推基本都能快速定位。7. 关于后续扩展的一些真实心得写到最后我想说点个人体会。树莓派和ROS2这对组合从入门到能独立做一个机器人项目中间有不少“顿悟”的瞬间第一次看到小乌龟在屏幕上跑起来第一次用自己写的节点控制真实电机转动第一次看着小车在地图上自动避障走到目标点……这些时刻带来的成就感是纯粹写上层软件体会不到的。但我更想提醒的是不要一味追求功能堆叠。我见过很多项目前期摄像头、雷达、机械臂一股脑全上结果每个模块都不稳定最后演示时从头翻车到尾。我自己踩过几次坑之后的习惯是每次只加一个新模块跑稳了再加下一个。先用turtlesim把核心通信搞清楚再用一个摄像头节点把图像数据链打通然后才逐步往系统里加舵机、加导航。稳扎稳打比什么都重要。对了还有一个很实用的小技巧分享给所有用树莓派做开发的朋友定期给内存卡做备份。树莓派系统很容易在反复折腾中断电损坏我把装好ROS2环境的系统镜像备份到电脑里之后后续不管怎么搞坏系统半小时就能恢复到完整可用的状态。这个习惯帮我省了无数个重装系统的夜晚。希望这篇文章能帮你在树莓派 ROS2的路上少走些弯路。后面我还会继续分享一些具体模块的实战经验比如Nav2导航参数调优、Pico端micro-ROS的详细配置欢迎持续关注。
返回列表