2026/10/5 9:20:16

树莓派4B安装ROS Melodic全流程:系统升级、网络配置与踩坑记录

树莓派4B安装ROS Melodic全流程:系统升级、网络配置与踩坑记录 树莓派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_interfaceDIR/var/run/wpa_supplicant GROUPnetdev update_config1 countryCN network{ ssid你的WiFi名 psk你的WiFi密码 }这里有个坑很多教程写这个文件是用来配WiFi的但如果你用的是有线网线直连路由器这步可以跳过。首次启动后boot分区里的wpa_supplicant.conf会自动被复制到系统目录之后就算删除boot分区里的文件也不影响。通电开机后可以从路由器后台的设备列表里找到树莓派的IP也可以直接执行ssh piraspberrypi.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_address192.168.1.100/24 static routers192.168.1.1 static domain_name_servers192.168.1.1 223.5.5.5如果是有线连接配置eth0接口interface eth0 static ip_address192.168.1.100/24 static routers192.168.1.1 static domain_name_servers192.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块里加了bssidxx: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卡不低于32GB16GB的卡装完基本就满了。安装命令很简单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 sraw.githubusercontent.com/ros/rosdistro/mastermirrors.tuna.tsinghua.edu.cn/rosdistrog /etc/ros/rosdep/sources.list.d/20-default.list然后执行rosdep update。如果清华镜像路径和你系统上的实际路径对不上用浏览器打开清华镜像的rosdistro目录看一眼里面的真实路径再调整命令。核心思路就是让rosdep不再访问GitHub的raw地址而是走国内镜像。还有一个常见的偏门技巧设置环境变量让rosdep强制走镜像索引export ROSDISTRO_INDEX_URLhttps://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编译完把工作空间的环境变量也写进.bashrcecho 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改成2048CONF_SWAPSIZE2048重启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那就需要显式设置指向树莓派。在笔记本端修改.bashrcexport ROS_MASTER_URIhttp://192.168.1.100:11311 export ROS_IP192.168.1.50ROS_MASTER_URI指向树莓派的IPROS_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整个流程走下来不难难的是那些隐藏在网络和系统版本背后的细节。希望这篇内容能帮你一次走通少翻几次车。