树莓派4B跑ROS这件事,我在实验室里帮人折腾过不止一次,从Raspbian buster装机到ROS Melodic跑通小乌龟,再一路把手头的机器人底盘接上去,中间踩过的坑能写满一张A4纸。这篇内容就是把整套流程完整复盘一遍:树莓派4B装Raspbian buster系统之后,怎么做网络配置,怎么搞定远程桌面,然后把ROS Melodic干净利落地装上。适合手头正好有树莓派4B、想拿它做机器人入门或者当小车主控的人参考。如果你用的是3B+,流程基本一致,只是内存和性能决定你后面跑不了太重的可视化。
先说结论:树莓派4B、Raspbian buster、ROS Melodic这三样凑在一起,是目前树莓派上跑ROS 1最省心、资料最多、预编译包最完整的组合。树莓派4B的四核A72处理器和最高8GB内存,能让ROS Melodic的desktop-full版本跑得动,而buster作为Debian 10的同源系统,恰好落在ROS Melodic官方支持的范围内。选对版本组合,后面能省掉大量编译源码的时间。
1. 安装前的系统准备与环境认知
1.1 为什么是buster而不是bullseye
很多新手上来就问,为什么不用最新的Raspberry Pi OS?这里面有个关键逻辑:ROS版本和操作系统版本是绑定的。ROS Melodic是2018年发布的ROS 1长期支持版本,官方主推的是Ubuntu 18.04,同时社区支持Debian Buster。而Raspbian buster正好就是Debian 10的树莓派定制版,系统架构是armhf,所以Melodic在buster上有现成的预编译包可以直接用。
如果你去树莓派官网下载系统,默认下载到的是新版Raspberry Pi OS,基于Debian 11 bullseye,那个系统上ROS Melodic的apt源没有对应组件,只能走源码编译或者换装ROS 2,对新手来说非常痛苦。所以我的建议很明确:如果非要跑ROS Melodic,那就老老实实去官网的旧版本镜像列表里找Raspbian Buster,不要看着新版系统顺手就装了。
还有个容易被忽略的点:树莓派4B的Raspbian buster系统默认是32位的,也就是armhf架构。这听起来像缺点,但反而是ROS Melodic能用apt直接装的原因之一。如果换成64位beta版系统,部分ROS源的arm64包不一定齐,绕来绕去反而麻烦。
1.2 烧录镜像与首次开机设置
系统镜像下载好之后,烧录工具我用的是树莓派官方出的Raspberry Pi Imager,不用记什么偏移量、不用分区管理,选镜像选SD卡一路点到底就行。没有Imager的话,balenaEtcher也完全胜任。
烧录完成后,SD卡会被识别出两个分区,其中boot分区是FAT32格式,可以直接在电脑上打开。这一步有两个关键动作:
- 在boot分区新建一个空文件,命名为
ssh,不要后缀不要内容,这样树莓派首次启动就会自动开启SSH服务。 - 如果需要无线连接,再新建一个
wpa_supplicant.conf文件,内容按下面这样写:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=CN network={ ssid="你的WiFi名" psk="你的WiFi密码" }这里有个坑:很多教程写这个文件是用来配WiFi的,但如果你用的是有线网线直连路由器,这步可以跳过。首次启动后,boot分区里的wpa_supplicant.conf会自动被复制到系统目录,之后就算删除boot分区里的文件也不影响。
通电开机后,可以从路由器后台的设备列表里找到树莓派的IP,也可以直接执行ssh pi@raspberrypi.local,这是树莓派默认开启的mDNS主机名解析,只要你的电脑和树莓派在同一局域网,通常能直接连上。默认账号是pi,默认密码是raspberry。
登录之后第一件事是扩展根分区。树莓派镜像里的根分区默认只占SD卡一部分空间,后续装ROS要几个GB,不扩容根本不够用。运行sudo raspi-config,在Advanced Options里选Expand Filesystem,然后重启。
1.3 先换源再干活:apt和系统源
Raspbian默认的apt源在境外,在国内网络环境下执行sudo apt update会慢到怀疑人生。我每次装新系统,第一步永远是换源,这一步能省下后面80%的等待时间。
编辑/etc/apt/sources.list,把默认源注释掉,替换成清华或者中科大的Raspbian镜像。以清华源为例:
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main contrib non-free rpi另外,树莓派还有一个独立的软件源文件/etc/apt/sources.list.d/raspi.list,对应的是树莓派基金会自己的软件仓库,同样建议换成镜像:
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui改完运行sudo apt update,看到下载速度上去了,再执行sudo apt upgrade -y把系统包更新到最新。这里要注意,如果SD卡比较老旧,升级过程会有点慢,属于正常现象。换源这一步做完,后续装ROS才能顺畅进行。
2. 网络配置:给树莓派一个稳定身份
2.1 静态IP为什么必要
树莓派作为ROS机器人主控时,IP地址稳定性极其重要。默认情况下路由器用DHCP动态分配IP,你笔记本电脑上登录路由器后台看到的树莓派IP可能今天是192.168.1.104,明天就变成了192.168.1.109。单从SSH连接来说,差一个数字无非是多查一次IP,但ROS多机通信就没有这么宽容了。
ROS的通信架构里,节点之间通过master互相发现,每一台机器需要知道对方的IP地址。如果你在笔记本上跑rviz、在树莓派上跑传感器驱动,两边配置文件里写死的IP一旦变了,整个系统直接瘫痪。所以装完系统、准备折腾ROS之前,先给树莓派固定一个IP,后面所有调试都舒服。
配置静态IP之前有一个前提:你要确定自己路由器的网段和网关。大多数家用路由器是192.168.1.1或者192.168.0.1,少数是192.168.31.1之类。不要拍脑袋填,先执行ip route看清楚默认网关地址,再动手配置。
2.2 用dhcpcd.conf配置静态IP
这里要特别强调一个容易翻车的地方:Raspbian buster的网络管理是由dhcpcd这个服务负责的,不是NetworkManager,也不是Ubuntu Server那套netplan。很多新手拿着Ubuntu的教程到树莓派上改/etc/network/interfaces,结果要么不生效,要么把网络弄崩,就是这个原因。
正确的做法是编辑/etc/dhcpcd.conf,在文件末尾追加接口配置:
sudo nano /etc/dhcpcd.conf如果是无线连接,配置wlan0接口:
interface wlan0 static ip_address=192.168.1.100/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 223.5.5.5如果是有线连接,配置eth0接口:
interface eth0 static ip_address=192.168.1.100/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 223.5.5.5写完保存,执行sudo systemctl restart dhcpcd重启网络服务。然后跑ip addr show wlan0,如果看到inet后面跟着192.168.1.100,就说明静态IP生效了。
有几个细节必须说清楚。static domain_name_servers这一行很多人会漏掉,导致网络“通”但域名解析不了,ping IP通、ping百度不通,全是被这个问题坑的。首选DNS我习惯填路由器网关地址,备用填国内公共DNS223.5.5.5,这样路由器的DHCP分配和本地解析都不耽误。
另外静态IP地址一定要避开路由器的DHCP地址池。很多路由器默认DHCP范围是192.168.1.100到192.168.1.200,如果你把树莓派设成192.168.1.100,路由器可能转头就把这个地址分配给手机,出现IP冲突,网络时断时续。稳妥的做法是选一个地址池之外的IP,比如192.168.1.50,或者干脆去路由器后台做一个MAC地址和IP绑定,双保险。
2.3 WiFi与热点场景下的实战细节
机器人场景里,树莓派经常要连自建热点或者实验室路由器。如果你要连的WiFi信号在多个路由器上出现,比如楼上楼下两个AP共用同一个SSID,树莓派可能会在两个AP之间漫游,导致IP频繁变化和丢包。这种情况我建议直接用有线连接,或者固定连接一个AP的MAC地址。
修改/etc/wpa_supplicant/wpa_supplicant.conf,可以给WiFi配置增加一个优先级,也可以绑定BSSID。我之前遇到过树莓派总是连上信号弱但同名的那个AP,后来在network块里加了bssid=xx:xx:xx:xx:xx:xx才解决。不过对大多数初学者来说,最简单的是把不用的WiFi从配置里删掉,让树莓派只连目标路由器。
还要注意,树莓派4B虽然支持5GHz WiFi,但5GHz信号穿墙能力弱,机器人跑起来之后位置一变,信号强度波动会直接导致ROS话题延迟变高。我实测过,同样一个激光雷达数据包,在WiFi信号好的时候延迟3ms,信号弱的时候能到100ms以上,这在做实时避障时是不能接受的。所以如果树莓派要长期作为机器人的主控,网线直连是首选,WiFi只适合调试阶段。
如果你只是在家里临时调试,不想插网线,那么用手机热点也能凑合。但手机热点的IP网段可能是192.168.43.x,和实验室路由器不一样,每次换场地IP都会变,重新配置静态IP很麻烦。我的建议是:固定环境用路由器,野路子调试用热点,别指望一套配置通吃所有场景。
3. 远程桌面控制:把树莓派的屏幕搬到电脑上
3.1 为什么VNC是首选方案
SSH虽然能解决命令行操作,但ROS调试离不开图形界面。你想在树莓派上运行rosrun rviz rviz看一下点云和TF树,或者打开rqt_graph看看节点通信关系,纯SSH根本做不到。这时候就需要远程桌面。
远程桌面的方案有好几种,xrdp、X2Go、VNC都有,我的选择是VNC,原因只有一个:树莓派官方系统预装了RealVNC Server,不需要额外安装乱七八糟的依赖,基本上打开服务就能连。
xrdp也不是不行,但Raspbian buster下的xrdp配置比较折腾,装完之后经常遇到黑屏、会话冲突、键盘布局错乱之类的问题,不适合新手。而RealVNC Server和树莓派的桌面环境深度集成,开机自动登录桌面后,VNC连接过去就是你熟悉的那个桌面,省心太多。
3.2 开启VNC Server的完整步骤
开启VNC Server最快的方式是命令行:
sudo raspi-config在Interfacing Options里找到VNC,选择Enable。然后进Boot Options,把启动方式改成Desktop Autologin,这样树莓派开机自动进入图形桌面,VNC客户端才能连接到一个真实的桌面会话。
如果你更习惯直接操作,也可以用systemd命令开启服务:
sudo systemctl enable vncserver-x11-serviced sudo systemctl start vncserver-x11-serviced电脑端我用的客户端是RealVNC Viewer,官网下载后打开,在地址栏输入树莓派的IP地址就能连接。默认端口是5900,客户端会自动识别,不用手动敲端口号。如果局域网里mDNS正常工作,你也可以直接输入raspberrypi.local,不需要查IP。
连接时提示输入用户名和密码,用户名填pi,密码填系统登录密码。这里有个细节:如果你在SSH里执行VNC相关操作,但树莓派当前并没有进入桌面会话,VNC连接过去会看到黑屏或者根本连不上。一定要确保树莓派开机后进入了桌面,或者设置了自动登录桌面。
3.3 远程桌面卡顿的优化经验
VNC卡顿几乎是每个树莓派用户都会遇到的问题,尤其是4B这种性能不算强的ARM板子,带宽稍差就拖影严重。我的优化思路是两步走:降分辨率、降画质。
分辨率调整用sudo raspi-config里的Display Options,选择Resolution,我推荐设成1280x720。这个分辨率在VNC下既能看到完整的RViz界面,又不至于让树莓派的图形渲染压力太大。如果你只是远程看一下终端和简单窗口,1024x768也可以,更流畅。
画质方面,RealVNC Viewer连接后右上角有个设置按钮,把Picture Quality从High调成Medium甚至Low,色彩的细节会损失一点,但交互流畅度会明显提升。我实测在同一个WiFi环境下,降画质之后rqt_graph刷新的卡顿感几乎消失了。
还有一个小技巧:树莓派桌面默认开启了屏幕空白保护,长时间不操作会黑屏,VNC连接之后看到黑屏以为死机了。可以在树莓派的桌面偏好设置里关闭Screen Blanking,或者运行xset s off临时关闭。这个坑很隐蔽,我一度以为是VNC服务崩了,排查了半天。
4. ROS Melodic安装全流程:从配置源到跑通小乌龟
4.1 添加ROS软件源与密钥
ROS Melodic在Raspbian buster上走apt安装是最高效的路径。不要一上来就想着源码编译,ROS的依赖树很庞大,源码编译光等编译就能等上几个小时,而且中间任何一个依赖版本不对都会报错。预先编译好的二进制包可以直接安装,省时省力。
第一步,创建ROS的apt软件源文件:
sudo sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ buster main" > /etc/apt/sources.list.d/ros-latest.list'这里我直接用清华镜像,原因是官方源packages.ros.org在国内下载速度非常慢,尤其安装desktop-full这种大包时会让人崩溃。中科大镜像也可以,选一个用的顺手的就行。
第二步,添加ROS的GPG密钥。官方推荐的方式是从GitHub下载ros.asc文件,但国内直连raw.githubusercontent.com经常超时,所以我更喜欢用key server的方式:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654如果这个命令卡住或者报错,也可以尝试用清华镜像下载密钥文件:
curl -sSL https://mirrors.tuna.tsinghua.edu.cn/rosdistro/ros.asc | sudo apt-key add -密钥添加完成之后,执行sudo apt update刷新软件源。这时可以运行apt-cache policy ros-melodic-desktop-full检查一下源是否生效,如果输出里能看到候选版本,就说明ROS源配置成功了。
4.2 安装ros-melodic-desktop-full的注意事项
在输入安装命令之前,先看一眼磁盘空间:
df -hros-melodic-desktop-full包含ROS的核心功能、RViz、Gazebo、TurtleSim等一大批工具,整体体积接近3到4个GB,安装完成后还会占用更多空间。建议SD卡不低于32GB,16GB的卡装完基本就满了。
安装命令很简单:
sudo apt install ros-melodic-desktop-full -y安装过程会持续比较久,特别是包含Gazebo这种大型仿真器,下载文件很大。中间如果网络波动导致某个包下载失败,直接重新执行一次安装命令,apt会断点续传,不用清缓存。
如果你只是想在树莓派上跑跑简单的传感器驱动和节点,不打算做仿真,可以装轻量版:
sudo apt install ros-melodic-ros-base但我的建议是既然都折腾了,直接desktop-full,因为后续你在笔记本上看教程、跑官方例程,很多例程依赖RViz和Gazebo这些图形化工具,轻量版装完还得回头补装依赖,更麻烦。
4.3 rosdep初始化失败与解决套路
ROS装完之后,接下来是最容易卡住的步骤:rosdep init和rosdep update。这两步的作用是让ROS能够根据包描述文件自动解析依赖,后续编译工作空间时rosdep install会用到。
正常流程是:
sudo rosdep init rosdep update但国内网络环境下,这两条命令经常翻车。rosdep init要从raw.githubusercontent.com下载一堆yaml文件,这个地址在国内直连极不稳定,经常会报超时错误。很多新手在这里卡一两个小时,然后开始怀疑人生。
我的解决方案是修改rosdep的源列表,让它的下载地址指向清华镜像。如果rosdep init完全跑不过去,就先手动创建目录和20-default.list文件:
sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list \ https://mirrors.tuna.tsinghua.edu.cn/rosdistro/rosdep/sources.list.d/20-default.list下载下来之后,20-default.list里的地址前缀默认是raw.githubusercontent.com,用sed命令替换成清华镜像:
sudo sed -i 's@raw.githubusercontent.com/ros/rosdistro/master@mirrors.tuna.tsinghua.edu.cn/rosdistro@g' /etc/ros/rosdep/sources.list.d/20-default.list然后执行rosdep update。如果清华镜像路径和你系统上的实际路径对不上,用浏览器打开清华镜像的rosdistro目录,看一眼里面的真实路径再调整命令。核心思路就是让rosdep不再访问GitHub的raw地址,而是走国内镜像。
还有一个常见的偏门技巧:设置环境变量,让rosdep强制走镜像索引:
export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml设置完再跑rosdep update。如果update过程中还是会出现超时,不要急,反复执行几次,因为每次执行它都会重新尝试下载未完成的部分。我帮别人装的时候,最多的跑过五六次才全部成功,也没出其他问题。
4.4 环境变量配置与TurtleSim验收
rosdep搞定之后,配置ROS环境变量:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc顺手装几个常用的ROS工具包:
sudo apt install -y python-rosinstall python-rosinstall-generator python-wstool build-essential环境变量加载之后,先跑roscore验证核心节点能不能正常启动。看到started core service [/rosout]这类输出就对了。这个终端不要关,按住不动。
新开一个终端,启动小乌龟:
rosrun turtlesim turtlesim_node再开一个新终端,启动键盘控制:
rosrun turtlesim turtle_teleop_key如果前面的网络配置和远程桌面都做好了,你会在VNC远程桌面上看到一个小乌龟窗口,键盘方向键可以控制它移动。看到这个画面,就说明ROS核心、话题通信、图形界面全部正常工作,树莓派上的ROS Melodic安装已经成功了。
接着创建工作空间,为后面的实际操作做准备:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make编译完把工作空间的环境变量也写进.bashrc:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc这一步做完,你的树莓派才算真正具备了开发ROS项目的完整条件。
5. 常见问题与性能优化实录
5.1 内存不足:swap调整与编译保护
树莓派4B虽然有4GB内存版本,但很多入门用户手里是2GB甚至1GB的板子。在安装ROS Melodic和后续catkin_make编译比较大的功能包时,内存吃紧是常态。尤其是用desktop-full装完大量库之后,编译时GCC和链接器同时开多个任务,内存瞬间耗尽,轻则编译进程被杀,重则整个系统卡死。
查看内存最直接的方式:
free -h如果free这一行可用内存常年只有几百MB,建议把swap调大。编辑/etc/dphys-swapfile,找到CONF_SWAPSIZE,默认可能是100,改成2048:
CONF_SWAPSIZE=2048重启swap服务:
sudo /etc/init.d/dphys-swapfile restart再次free -h,看到Swap一栏变成2G左右就生效了。这里要提醒一句,swap在SD卡上频繁读写会加速SD卡老化,所以这只适合学习阶段。后面真机部署,最好用USB SSD或者外接移动硬盘,既能提升IO速度,也减少SD卡损坏的风险。
编译时还有个小窍门,可以用-j2限制并发任务数,防止一次编译几十个文件把树莓派拖死:
catkin_make -j25.2 高温降频:一个容易被忽略的性能杀手
树莓派4B在高负载编译时发热非常明显。我做过测试,在没加散热片的情况下,连续编译ROS功能包几分钟,CPU温度能爬到85°C以上,然后系统自动降频,编译速度反而比低负载时候还慢。很多人以为树莓派“变卡了”,其实是温度墙触发了。
监控CPU温度只需要一条命令:
vcgencmd measure_temp正常情况下80°C以下都算安全,超过80°C就要考虑散热了。我的做法是给树莓派装一个带风扇的散热外壳,或者至少贴一块铜制散热片。编译的时候尽量关掉VNC桌面,只保留SSH连接,因为桌面渲染也在消耗CPU资源,对散热和编译速度都是负担。
如果你发现树莓派编译时频繁降频,但物理条件没法改善,可以把编译拆成多个小批次,或者直接在笔记本上交叉编译,再把编译好的代码同步到树莓派。不过这些属于后话了,学习阶段只要注意散热,4B跑常见的ROS教程完全够用。
5.3 ROS节点连接不上的排查思路
树莓派跑起ROS之后,很多人会遇到笔记本上的rviz连不上树莓派上的roscore,或者两个树莓派节点互相发现不了。这种情况90%是网络配置和ROS环境变量的问题,不是代码问题。
先确认两边的网络在同一网段,能互相ping通。如果ping不通,回到第2章检查静态IP配置。然后检查ROS环境变量:
echo $ROS_MASTER_URI echo $ROS_IP如果ROS_MASTER_URI默认是http://localhost:11311,那就需要显式设置指向树莓派。在笔记本端修改.bashrc:
export ROS_MASTER_URI=http://192.168.1.100:11311 export ROS_IP=192.168.1.50ROS_MASTER_URI指向树莓派的IP,ROS_IP填当前电脑自己的IP。这个步骤在ROS多机通信中基本是必做的,很多教程只讲了单机配置,导致新手一遇到分布式调试就懵。
还有防火墙问题。树莓派Raspbian默认没有开启防火墙,但如果你自己装了ufw,记得放行ROS常用端口:
sudo ufw allow 22/tcp sudo ufw allow 5900/tcp sudo ufw allow 11311/tcp11311是roscore默认监听端口,不放开它,即使网络通了,节点之间的发现也会超时。
最后分享一个我自己踩过几次坑之后养成的习惯:整套环境跑通之后,一定要把SD卡拔下来,用Win32DiskImager或者树莓派Imager做一个整卡镜像备份。别以为装过一次就万事大吉,SD卡随时可能损坏,系统也可能被你后面折腾依赖装崩。有一份干净的镜像,恢复环境只需要十分钟。树莓派4B刷Raspbian buster再装ROS Melodic,整个流程走下来不难,难的是那些隐藏在网络和系统版本背后的细节。希望这篇内容能帮你一次走通,少翻几次车。