尧图精选

Jetson Thor 人形机器人开发环境搭建:ROS2、CycloneDDS 与 Unitree SDK 实战

🕒 发布时间:2026/10/1 1:27:19 📁 来源:尧图网络
1. 从零搭建人形机器人开发环境为什么 Jetson Thor 值得折腾拿到 Jetson Thor 开发套件那天我第一反应不是兴奋而是头疼。这玩意儿算力确实猛但环境配置的坑比想象中多得多。如果你也在搞人形机器人尤其是准备跑 Unitree SDK、ROS2 和 CycloneDDS 这套组合拳那这篇文章就是为你写的。我会把整个配置流程拆开揉碎从系统烧录到 ROS2 通信调优再到 Unitree SDK 的编译踩坑全部走一遍。不管你是刚接触 Jetson 系列的新手还是已经玩过 Xavier、Orin 的老鸟这里面的细节应该都能帮你省下几个通宵的时间。先说清楚这套环境到底解决什么问题。人形机器人开发对实时性和通信延迟极其敏感传统 x86 工控机加独立显卡的方案功耗高、体积大而 Jetson Thor 把 GPU 和 ARM CPU 集成在一块板子上功耗控制在几十瓦级别非常适合装在机器人本体上。但 ARM 架构带来的麻烦就是软件生态不如 x86 那么顺滑很多包需要源码编译ROS2 的 DDS 中间件选型也会直接影响关节控制指令的延迟。我试过默认的 FastDDS也试过 CycloneDDS实测下来 CycloneDDS 在 Jetson 上的抖动更小后面会详细说怎么配。这篇文章适合谁看如果你正在做以下任意一件事那直接往下读就对了第一刚拿到 Jetson Thor 开发板不知道从哪开始第二已经在跑 ROS2但发现节点间通信延迟忽高忽低第三准备接入 Unitree 的电机和 IMU但 SDK 编译一直报错第四想用 VS Code 远程开发但环境配不通。我会尽量把每个步骤的命令和参数都写清楚让你能直接抄作业。2. 系统烧录与基础环境搭建别急着插电2.1 烧录前的准备工作Jetson Thor 出厂时通常不带系统你需要自己烧录。我建议直接用 NVIDIA 官方的 SDK Manager虽然它只能在 Ubuntu 主机上跑但省去了手动下载 BSP 和根文件系统的麻烦。如果你手头只有 Windows 机器那就先装个 Ubuntu 22.04 的虚拟机或者双系统别想着在 Windows 下折腾驱动问题能把你逼疯。烧录前需要准备的东西一根质量好的 USB-C 数据线注意有些线只能充电不能传数据我因为这个浪费了两个小时一个 64GB 以上的 microSD 卡作为备用启动盘还有散热器Thor 满载时发热不小裸板跑编译很容易降频。注意烧录过程中不要断电也不要拔线。我见过有人因为笔记本电量不足导致烧录中断板子直接变砖只能走 RMA 流程。2.2 系统烧录与首次启动打开 SDK Manager 后选择对应的 Jetson Thor 型号然后勾选 JetPack 版本。这里有个坑不同版本的 JetPack 对应的 CUDA 和 cuDNN 版本不一样而 Unitree SDK 对 CUDA 版本有要求。我建议选 JetPack 6.x 以上的版本因为自带 Ubuntu 22.04对 ROS2 Humble 的支持更好。烧录完成后第一次启动会进入 Ubuntu 的初始化设置。这里建议创建一个非 root 用户后续所有操作都用这个用户需要提权时再用 sudo。设置完成后先别急着装 ROS2先把系统更新一遍sudo apt update sudo apt upgrade -y sudo apt install -y curl git cmake build-essential python3-pip这几条命令看起来简单但能避免后面很多依赖问题。特别是 cmake 和 build-essential编译 Unitree SDK 时缺一不可。2.3 配置国内软件源和 pip 源Jetson 默认的 apt 源在国外下载速度可能很慢。我一般会换成国内镜像源但注意不要用那些来路不明的源直接用清华或者中科大的官方镜像就行。pip 源同理换成清华的 pypi 镜像装 Python 包会快很多。pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple换完源之后建议装几个基础工具htop看系统资源tmux防止 SSH 断连导致编译中断net-tools查看网络状态。这些工具在后续调试中都会用到。3. ROS2 Humble 安装与 CycloneDDS 调优3.1 ROS2 Humble 在 ARM 上的安装方式ROS2 Humble 官方支持 Ubuntu 22.04而 Jetson Thor 的 JetPack 6.x 正好基于这个版本所以可以直接用 apt 安装。但 ARM 架构下有些包没有预编译二进制需要从源码编译。我建议先用 apt 装核心包缺什么再补什么。sudo apt install -y software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install -y ros-humble-ros-base ros-humble-rmw-cyclonedds-cpp这里我直接选了ros-humble-ros-base而不是desktop因为桌面版会带很多 GUI 工具在机器人本体上根本用不到还占空间。如果你需要 RViz2 做可视化可以单独装ros-humble-rviz2。装完之后别忘了 source 环境变量echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc3.2 为什么选 CycloneDDS 而不是 FastDDSROS2 默认的 DDS 实现是 FastDDS但在 Jetson 这种 ARM 平台上FastDDS 的发现机制有时会导致节点间通信延迟波动很大。我实测过同样跑一个关节控制话题FastDDS 的延迟在 2ms 到 15ms 之间跳而 CycloneDDS 能稳定在 1ms 到 3ms。对于人形机器人的平衡控制来说这个差异是致命的。切换 DDS 实现很简单设置一个环境变量就行export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp但光设置这个还不够CycloneDDS 的默认配置可能不适合高频率的小消息传输。你需要创建一个配置文件调整缓冲区大小和心跳间隔。我一般会在~/.ros/下建一个cyclonedds.xml?xml version1.0 encodingUTF-8? CycloneDDS xmlnshttps://cdds.io/config Domain idany General Interfaces NetworkInterface nameeth0 prioritydefault multicastdefault / /Interfaces AllowMulticasttrue/AllowMulticast /General Internal Watermarks WhcHigh500kB/WhcHigh /Watermarks /Internal /Domain /CycloneDDS然后把配置文件路径也加到环境变量里export CYCLONEDDS_URIfile://$HOME/.ros/cyclonedds.xml注意eth0要换成你实际使用的网卡名称用ip addr查看。如果是通过 WiFi 连接网卡名可能是wlan0但 WiFi 的抖动比有线大得多能插网线就插网线。3.3 验证 ROS2 通信是否正常装完 ROS2 和 CycloneDDS 后先跑一个最简单的 talker-listener 测试。开两个终端分别运行ros2 run demo_nodes_cpp talker ros2 run demo_nodes_cpp listener如果 listener 能正常收到消息说明 DDS 配置没问题。但这里有个隐藏坑Jetson 上可能有多个网卡CycloneDDS 默认会绑定所有网卡导致发现包从错误的网卡发出去。如果你发现 talker 和 listener 互相找不到先检查cyclonedds.xml里的网卡配置。我踩过的另一个坑是防火墙。Ubuntu 默认的 ufw 可能会拦截 DDS 的组播包虽然 ufw 默认是关闭的但如果你手动开过记得放行相关端口。DDS 用的端口范围比较大简单粗暴的做法是直接关掉 ufwsudo ufw disable4. Unitree SDK 编译与硬件接口对接4.1 Unitree SDK 的依赖安装Unitree 的 SDK 主要用 C 写的依赖 CMake、Eigen 和 Boost。在 Jetson 上编译之前先把这些依赖装齐sudo apt install -y libeigen3-dev libboost-all-dev libyaml-cpp-devEigen 是线性代数库Unitree 的关节控制算法里大量用到矩阵运算Boost 主要用来做线程和定时器yaml-cpp 用来解析配置文件。这三个缺一不可少一个编译就会报错。4.2 从源码编译 Unitree SDKUnitree 的 SDK 在 GitHub 上有开源仓库直接 clone 下来编译就行。但注意分支选择不同版本的固件对应不同的 SDK 分支。我一般用master分支然后根据实际固件版本回退到对应的 tag。git clone https://github.com/unitreerobotics/unitree_sdk2.git cd unitree_sdk2 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install-j$(nproc)会调用所有 CPU 核心并行编译Jetson Thor 的核心数不少能快很多。但注意散热如果板子温度过高编译到一半可能会降频甚至死机。我建议编译时把散热风扇开到最大或者加个外置散热底座。编译完成后SDK 的头文件和库会安装到/usr/local/下。你可以写一个简单的测试程序看看能不能正常调用#include unitree/robot/channel/channel_factory.hpp #include iostream int main() { unitree::robot::ChannelFactory::Instance()-Init(0, eth0); std::cout Unitree SDK init success std::endl; return 0; }编译这个测试程序时需要链接 Unitree 的库g test.cpp -o test -lunitree_sdk2 -lpthread如果运行后输出 Unitree SDK init success说明 SDK 安装没问题。如果报错找不到库检查/usr/local/lib是否在LD_LIBRARY_PATH里。4.3 硬件接口配置与通信测试Unitree 的电机和 IMU 通常通过以太网或者 CAN 总线通信。以以太网为例你需要配置 Jetson 的网卡 IP使其与 Unitree 控制器的 IP 在同一网段。Unitree 默认的控制器 IP 一般是192.168.123.10所以 Jetson 的网卡可以设成192.168.123.100。sudo ip addr add 192.168.123.100/24 dev eth0 sudo ip link set eth0 up然后 ping 一下控制器确认物理连接正常ping 192.168.123.10如果能 ping 通说明网络层没问题。接下来用 SDK 里的示例程序测试电机通信。Unitree SDK 通常自带一些 example编译后直接运行./example/robot_control注意第一次测试电机时务必把机器人固定在支架上或者至少确保周围没有障碍物。我见过有人直接在地上测试结果电机突然转动机器人直接撞墙。5. VS Code 远程开发环境配置5.1 为什么要在 Jetson 上用 VS Code 远程开发Jetson Thor 通常装在机器人本体上没有显示器你只能通过 SSH 连接。虽然可以用 vim 或者 nano 在终端里写代码但效率太低。VS Code 的 Remote-SSH 插件可以让你在本地电脑上编辑代码实际编译和运行都在 Jetson 上兼顾了开发效率和运行环境的一致性。5.2 配置 Remote-SSH 连接首先在本地 VS Code 里安装 Remote-SSH 插件然后按 F1输入 Remote-SSH: Connect to Host添加 Jetson 的 IP 和用户名。连接成功后VS Code 会在 Jetson 上自动安装一个轻量级的 server 端之后你就可以像本地开发一样打开 Jetson 上的文件夹了。但这里有个坑Jetson 的 ARM 架构可能导致 VS Code server 下载失败。如果卡在 Downloading VS Code Server可以手动下载对应的 ARM64 版本然后放到~/.vscode-server/bin/下。具体路径 VS Code 会在报错信息里告诉你。5.3 配置 C/C 和 Python 开发环境连上 Jetson 后在 VS Code 里安装 C/C 和 Python 插件。C/C 插件需要配置c_cpp_properties.json把 ROS2 和 Unitree SDK 的头文件路径加进去{ configurations: [ { name: Linux, includePath: [ ${workspaceFolder}/**, /opt/ros/humble/include/**, /usr/local/include/** ], defines: [], compilerPath: /usr/bin/gcc, cStandard: c17, cppStandard: c17, intelliSenseMode: linux-gcc-arm64 } ], version: 4 }Python 插件一般开箱即用但如果你用了虚拟环境需要在 VS Code 里选择对应的解释器。我建议用venv而不是conda因为 conda 在 ARM 上装包经常出问题。6. 常见问题与排查技巧实录6.1 ROS2 节点通信失败排查ROS2 节点互相找不到是最常见的问题。排查思路按以下顺序来第一检查ROS_DOMAIN_ID是否一致不同 ID 的节点默认不通信第二检查RMW_IMPLEMENTATION是否一致一个用 FastDDS 一个用 CycloneDDS 是通不了的第三检查网卡配置CycloneDDS 可能绑定了错误的网卡第四检查防火墙是否拦截了组播包。我整理了一个速查表现象可能原因解决方法talker 和 listener 互相看不到ROS_DOMAIN_ID 不同统一设置为同一个值能发现节点但收不到消息DDS 实现不同统一 RMW_IMPLEMENTATION偶尔能通偶尔不通网卡绑定错误在 cyclonedds.xml 中指定网卡完全没反应防火墙拦截关闭 ufw 或放行 DDS 端口6.2 Unitree SDK 编译报错处理编译 Unitree SDK 时最常见的报错是找不到 Eigen 或者 Boost。如果确认已经装了但还报错可能是 CMake 找不到路径。可以在 CMake 命令里手动指定cmake .. -DEIGEN3_INCLUDE_DIR/usr/include/eigen3 -DBOOST_ROOT/usr另一个常见问题是链接时找不到libunitree_sdk2.so。这是因为/usr/local/lib不在默认的库搜索路径里。可以加到ld.so.confecho /usr/local/lib | sudo tee /etc/ld.so.conf.d/unitree.conf sudo ldconfig6.3 Jetson 散热与性能调优Jetson Thor 的性能模式默认可能是节能模式编译大型项目时会很慢。可以切换到最大性能模式sudo nvpmodel -m 0 sudo jetson_clocksnvpmodel -m 0会把功耗墙拉到最大jetson_clocks会把 CPU 和 GPU 频率锁在最高。但注意散热如果温度超过 80 度板子会自动降频。我建议加一个散热风扇或者至少贴个散热片。提示可以用tegrastats命令实时查看温度和功耗。如果发现温度经常在 75 度以上说明散热不够长期高温会缩短板子寿命。7. 实操心得与后续扩展方向整套环境配下来我最深的体会是Jetson 上的 ARM 生态虽然不如 x86 成熟但只要你把依赖关系理清楚大部分问题都能解决。关键是要有耐心遇到报错不要慌先看错误信息再搜相关 issue通常都能找到答案。另外分享一个小技巧在编译大型项目之前先用tmux开一个会话这样即使 SSH 断连编译也不会中断。我因为 SSH 断连导致编译失败至少浪费了五六个小时后来养成习惯后就再也没出过这个问题。这套环境配好之后后续可以做的事情很多。比如接入 RealSense 深度相机做视觉感知或者跑 BEVFormer 做鸟瞰图检测再或者用 MoveIt2 做运动规划。Jetson Thor 的算力足够支撑这些任务关键是先把基础通信和 SDK 调通后面往上叠功能就顺理成章了。如果你在配置过程中遇到什么奇怪的问题欢迎在评论区交流。我踩过的坑基本都写在这里了希望能帮你少走点弯路。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →