在一个刚装好的 ROS 2 环境里,我敲下第一句命令:
$ ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888
Package 'micro_ros_agent' not found
然后是全盘搜索,结果是空的。这台机器上根本没有这个包,也从来没安装过。
接下来我花了大概两个小时,把「装上它」这件事做完。真正浪费时间的不是编译, 而是三个前置的坑——它们都不会给你明确的提示,只会让你在错误的路上反复尝试。
01原因一:它不在 apt 里
最根本的一条:micro_ros_agent 不是 ROS 2 自带的包,官方也不提供 apt 二进制。
你在 apt search ros-humble-* 里翻多久都找不到它。
原因不难理解:micro-ROS 是给单片机用的,Agent 要跑在哪台主机、连什么传输 (UDP、串口、TCP、还是 CAN),取决于你的具体场景。官方把这部分留给你自己编译。
所以「装它」这件事的本质是:从源码构建一个 ROS 2 功能包。
这就注定要走 colcon build 那条路,而不是 apt install。
02原因二:shell 没 source ROS 2
第二个坑不会报错,只会让你困惑。我当时的环境里 ROS_DISTRO 是空的:
$ source /opt/ros/humble/setup.bash
$ echo $ROS_DISTRO
humble
$ ros2 --help # 能出帮助信息,说明这一步对了
没 source 的时候,ros2 命令往往还能跑(因为二进制在 PATH 里),
但很多环境变量是空的,于是后面 rosdep、colcon 的行为会变得莫名其妙。
我的做法是直接把这一行写进 ~/.bashrc,一劳永逸:
source /opt/ros/humble/setup.bash
注意发行版名字要对上——你装的是 humble 还是 jazzy,看 /opt/ros/ 下面那个目录名就知道。
03原因三:克隆失败,而且不告诉为什么
第三个坑最有意思:这台机器访问 GitHub 的下载通道被网络设备拦了。 git 协议、tarball 下载、API 调用全部不通,只有网页能正常打开。
这种环境的麻烦在于,它不会给你一个「网络被拦截」的错误,而是给你超时、 连接重置、或者干脆卡住——你会先怀疑自己打错了命令,然后怀疑 GitHub 挂了。
后来我用了两种绕法。第一种是浏览器手动下载 zip:
# 1. 浏览器打开并下载: # https://github.com/micro-ROS/micro_ros_agent/archive/refs/heads/master.zip # 2. 把 zip 传到目标机器后: mkdir -p ~/microros_ws/src cd ~/microros_ws/src unzip ~/micro_ros_agent-master.zip mv micro_ros_agent-master micro_ros_agent
第二种是走镜像加速(可用性随时间变化,不一定每次都灵):
curl -L -o agent.zip \
"https://ghfast.top/https://github.com/micro-ROS/micro_ros_agent/archive/refs/heads/master.zip"
无论用哪种方式,关键是最后目录结构要长成 ~/microros_ws/src/micro_ros_agent/——
colcon 认的是这个形状,中间多套一层文件夹它不会报错,只会静默地什么都编译不出来。
04编译
sudo apt-get update
sudo apt-get install -y git cmake python3-pip python3-rosdep
sudo rosdep init # 提示已初始化就跳过
rosdep update
cd ~/microros_ws
source /opt/ros/humble/setup.bash
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install
在 aarch64 上大概要 5 到 15 分钟。中途如果报缺系统库,
用 apt-cache search <关键字> 找一下装上去就行,不用慌。
编译完成后验证,这一步必须 source 新工作空间,否则你还是会看到 「Package not found」——而且是同一个报错,很容易以为编译白做了:
source ~/microros_ws/install/setup.bash
ros2 pkg list | grep micro_ros_agent # 能列出来就算成功
05连上之后,才算真正开始
启动 Agent:
ros2 run micro_ros_agent micro_ros_agent udp4 -i 192.168.31.100 --port 8888
ESP32 那边烧好程序一连上,日志会刷出一长串。这几行是握手成功的标志:
[1786983463.562502] info | UDPv4AgentLinux.cpp | init | running... | port: 8888
[1786983475.555139] info | Root.cpp | create_client | create | client_key: 0x0EA1126F, session_id: 0x81
[1786983475.555289] info | SessionManager.hpp | establish_session | session established | client_key: 0x0EA1126F, address: 10.230.61.237:47138
[1786983475.628974] info | ProxyClient.cpp | create_participant| participant created | client_key: 0x0EA1126F, participant_id: 0x000(1)
[1786983475.887035] info | ProxyClient.cpp | create_topic | topic created | client_key: 0x0EA1126F, topic_id: 0x000(2)
[1786983476.033583] info | ProxyClient.cpp | create_publisher | publisher created | client_key: 0x0EA1126F, publisher_id: 0x000(3)
[1786983476.243162] info | ProxyClient.cpp | create_datareader | datareader created | client_key: 0x0EA1126F, datareader_id: 0x000(6)
读日志能读出两件事:
- 首次连接花了大约 12 秒(
init到create_client之间), 这不是 bug,是 UDP 广播发现机制的正常代价。 - 实体是在 0.7 秒内逐个建起来的:participant → topic → publisher → subscriber → reader。 如果卡在某一行不动了,你就知道是哪个环节没走通。
还有一个我当时没在意、后来才觉得可疑的细节:Agent 监听在 192.168.31.100,
但会话里记录的客户端地址是 10.230.61.237。两者不在同一网段,
说明中间还有一层设备在做地址转换。这类不对称值得记一笔——
它常常是「能握手,但数据不稳」的根源。
06握手成功 ≠ 数据流畅
看到 session established 时我松了一口气,以为最难的部分过去了。
然后我测了一下话题频率:
average rate: 0.330
min: 3.030s max: 3.030s std dev: 0.00000s window: 1
average rate: 0.276
min: 3.030s max: 4.814s std dev: 0.63409s window: 5
average rate: 0.448
min: 0.027s max: 4.814s std dev: 1.65541s window: 9
average rate: 0.745
min: 0.024s max: 4.814s std dev: 1.29310s window: 22
最慢的一次间隔是 4.814 秒,最快 0.024 秒,标准差一度到 1.65 秒。 也就是说:连接是通的,消息也确实在到达,但节奏完全不可控。
对 ping/pong 这种测试无所谓,对控制指令就很致命了。 这份输出是我后来去查局域网延迟的起点——那次排查写在了 另一篇笔记里。
07一张排查表
| 现象 | 先查什么 |
|---|---|
ros2 run 报 Package not found |
是不是没 source ~/microros_ws/install/setup.bash?编译真的成功了吗? |
| clone 卡住或超时 | 换浏览器手动下载 zip,或走镜像加速 |
| colcon 编译 0 个包 | 目录层级对不对?(必须是 src/micro_ros_agent/package.xml) |
| Agent 起来了但 ESP32 连不上 | 防火墙放行 UDP 端口;确认 -i 绑的是本机真实 IP |
| 端口被占用 | ros2 daemon stop,或者换端口(两边要一致) |
08一句话总结
装 micro-ROS Agent 的难点不在编译,在先确认你面对的是哪一类问题: 是「包不存在」(要编译),是「环境没准备好」(要 source), 还是「源码拿不到」(要绕网络)。这三件事的解法完全不同, 但它们在终端里长得一模一样——都是某句命令没反应。
分清楚了,剩下的事情二十分钟就能做完。
- 关于本文
- 整理自 2026 年 8 月的便签记录,日志为当时的真实输出(ROS 2 / Ubuntu on aarch64)。 系统版本与包名请按自己的环境替换。
- 2026.09.20 整理
- 补上了
ros2 topic hz那段数据——原始笔记里只写了「好像不太稳」, 把数字摊开之后才看清问题的量级。
留言
正在载入留言…