OriginCar RDK X5 入门实践:从镜像烧录到 ROS 2 远程控制
记录 OriginCar RDK X5 从镜像与主板程序烧录、网络连接,到 ROS 2 底盘控制、相机展示和 rosbridge 上位机联动的完整实践路径。

拿到一块搭载地平线 RDK 的 OriginCar 后,真正需要处理的事情并不只有“把 ROS 2 跑起来”。从存储卡烧录系统、主板烧录程序,到让电脑通过网络登录设备,再到启动底盘、相机和上位机,每一步都依赖前一步的结果。
这篇文章把我的 OriginCar 使用记录整理成一条连续路径:先完成设备准备,再建立远程连接,随后启动 ROS 2 基础功能,最后通过 rosbridge 把车辆数据交给上位机。文中的默认地址、软件版本和命令来自历史使用记录,实际操作前需要根据当前镜像与 RDK 文档重新核对。
可以把这次配置分成五层:
- 设备层:向 Micro SD 卡写入 RDK 镜像,并向 OriginCar 主板烧录 HEX 程序。
- 网络层:通过网线或 Wi-Fi 让电脑与 RDK 进入同一个可通信的网络。
- 系统层:使用 SSH 登录 RDK,处理软件源、GPG 签名和代理配置。
- ROS 2 层:启动底盘、键盘控制、相机和
rosbridge。 - 上位机层:运行桌面端程序,通过 WebSocket 连接 ROS 2 话题和服务。
这条链路的好处是便于定位问题:设备无法启动时检查烧录,电脑无法登录时检查网络,ROS 2 命令失败时检查软件包和环境,上位机没有数据时检查 rosbridge 与 IP、端口配置。
将下载的镜像解压为 .img 文件,然后使用 balenaEtcher:

- 点击 Flash from file,选择解压后的
.img文件。 - 点击 Select target,选择对应的 Micro SD 卡。
- 点击 Flash,等待工具显示烧录完成。
烧录前确认目标磁盘,避免选择到电脑本地磁盘。镜像写入完成后,将存储卡装入 RDK 并上电启动。


主板程序使用 FlyMcu2188 工具烧录。连接电脑和 OriginCar 主板后,按照工具要求选择 HEX 文件和烧录串口。执行烧录时需要按下主板复位键;历史记录中,烧录成功后可以观察到 OriginCar 两侧灯带亮起。



地平线 RDK 的历史默认地址如下:
| 型号 | 记录中的有线默认地址 |
|---|---|
| RDK X3 | 192.168.1.10 |
| RDK X5 | 192.168.127.10 |
这些地址属于镜像和网络配置相关的历史记录。使用前先在设备端或显示器上确认当前地址,避免把默认值当作实时状态。
准备网线连接电脑和 OriginCar,再将电脑以太网接口设置到与 RDK 相同的网段。打开 MobaXterm,创建 SSH 会话并填写 RDK 的 IP 地址、端口和登录用户。

官方远程登录参考:RDK Remote Login。

在已经登录 RDK 的终端中,可以按照当前镜像提供的网络工具检查 Wi-Fi:
sudo nmcli device wifi rescansudo nmcli device wifi listsudo wifi_connect "SSID" "PASSWORD"ifconfig其中 wifi_connect 属于镜像环境中的辅助命令,系统没有该命令时需要改用 NetworkManager 的标准连接方式。执行 ifconfig 或 ip addr 获取新的无线网卡地址,再使用该地址建立 SSH 连接。
OriginCar 镜像记录中包含 ROS 2 Foxy、TogetheROS 以及车辆底层驱动。登录 RDK 后,先启动底盘:
ros2 launch origincar_base origincar_bringup.launch.py
然后在另一个终端启动键盘控制:
ros2 run teleop_twist_keyboard teleop_twist_keyboardOriginCar 使用阿克曼转向结构,车辆的转向运动依赖线速度。启动键盘节点后,可以通过终端中的按键发送速度指令,观察底盘是否响应。

相机展示 Demo 使用以下启动文件:
ros2 launch origincar_bringup usb_websocket_display.launch.py将电脑和 OriginCar 放在同一个局域网中,在浏览器打开:
http://<RDK_IP>:8000其中 <RDK_IP> 替换为当前 RDK 地址。这个 Demo 适合先验证相机采集和网络展示链路,再继续接入自己的视觉节点。
RDK 软件源需要同时匹配设备型号、Ubuntu 代号和软件源发布通道。先登录 RDK 检查当前环境:
cat /etc/version. /etc/os-releaseprintf 'Ubuntu: %s\n' "$PRETTY_NAME"dpkg --print-architecturecat /etc/apt/sources.list.d/sunrise.listD-Robotics 当前 RDK X5 文档以 Ubuntu 22.04(jammy)镜像为主。旧镜像可能仍然使用 Ubuntu 20.04(focal),软件源需要跟随实际镜像版本。
编辑 /etc/apt/sources.list.d/sunrise.list:
sudoedit /etc/apt/sources.list.d/sunrise.list根据当前型号、Ubuntu 版本和发布通道保留对应的一行。RDK X5 的示例配置如下:
# RDK X5 Ubuntu 22.04 正式源deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk-x5 jammy main
# RDK X5 Ubuntu 22.04 beta 源deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk-x5-beta jammy main
# 旧版 Ubuntu 20.04 镜像的历史示例deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk-x5 focal main正式源和 beta 源属于不同发布通道,配置时保留与你当前目标对应的一行。旧版 focal 示例用于历史镜像排查,当前 X5 新镜像优先核对官方 jammy 配置。
将密钥保存到与软件源中 signed-by 相同的路径:
sudo install -d -m 0755 /usr/share/keyringssudo curl -fsSL http://archive.d-robotics.cc/keys/sunrise.gpg \ -o /usr/share/keyrings/sunrise.gpgsudo chmod 0644 /usr/share/keyrings/sunrise.gpggpg --show-keys --fingerprint /usr/share/keyrings/sunrise.gpg原始记录中出现过 NO_PUBKEY 599F576057BDF67C,也记录过使用 apt-key 从密钥服务器取 key 的旧流程。当前软件源配置使用独立 keyring 和 signed-by,密钥指纹与下载地址应以当前 D-Robotics 官方文档为准。
完成源和密钥配置后更新索引:
sudo apt updateapt-cache policy如果仍然出现签名错误,依次核对 sunrise.list 中的域名、型号目录、Ubuntu 代号、beta/正式通道和 keyring 路径。
上位机通过 rosbridge 与 ROS 2 通信。历史配置中,安装 rosbridge 前需要处理 ROS 软件源和密钥:
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
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \ -o /usr/share/keyrings/ros-archive-keyring.gpg执行前确认当前 Ubuntu 发行版、ROS 发行版和官方仓库配置。安装并启动 rosbridge:
sudo apt install ros-$ROS_DISTRO-rosbridge-suiteros2 launch rosbridge_server rosbridge_websocket_launch.xml
上位机连接时,需要填写 RDK 的 IP 地址和 rosbridge WebSocket 端口。连接成功后,Foxglove 或项目提供的桌面端程序可以读取车辆话题,并向底盘发送控制指令。
历史上位机环境需要安装 keyboard、roslibpy、opencv-python 和 pyyaml 等 Python 依赖:


pip install -r requirements.txtWindows 端可以运行源码或打包后的 bridge_client.exe。源码运行方式如下:
python bridge_client.py <RDK_IP> <PORT>运行前确认 bridge_client.py 同级目录存在 map.png。二进制版本则需要将 map.png 放在 bridge_client.exe 同级目录,并在同目录的 config.yaml 中设置连接参数。
Ubuntu 端使用项目提供的 Shell 脚本:
./bridge_client.sh


需要自行打包时,可以使用项目中的 PyInstaller 配置:
pyinstaller src/bridge_client.spec连接完成后,先在 RDK 中启动底盘和 rosbridge,再在上位机中打开连接。这样可以把“底盘驱动是否运行”和“上位机是否连接成功”分开检查。
例如出现 NO_PUBKEY 时,通常需要检查仓库地址、发行版代号、密钥文件和密钥指纹。原始记录使用过 apt-key,当前 Ubuntu 的密钥环配置方式需要以发行版和官方文档为准。
检查 /etc/apt/sources.list.d/sunrise.list,确认 RDK 型号、Ubuntu 版本和软件源路径匹配。历史配置示例如下:
deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk/ focal main这条配置只适用于相应的软件源环境,修改前应先确认当前系统版本和官方源信息。
按以下顺序检查:
- 网线、Wi-Fi 和网卡是否已经连接。
- 电脑与 RDK 是否处于同一网段。
- RDK 当前 IP 是否发生变化。
- SSH、WebSocket 或网页展示使用的端口是否正确。
- 局域网代理是否把本地地址排除在
NO_PROXY之外。
完整的自动检测、手动开关和 sudo 继承配置见 Ubuntu/RDK 开发环境代理配置。这里保留一段最小的占位符示例,方便快速检查局域网代理变量:
export HOST_IP="<PROXY_HOST>"export PROXY_PORT="<HTTP_PORT>"export SOCKS_PORT="<SOCKS5_PORT>"export HTTP_PROXY="http://${HOST_IP}:${PROXY_PORT}"export HTTPS_PROXY="http://${HOST_IP}:${PROXY_PORT}"export ALL_PROXY="socks5://${HOST_IP}:${SOCKS_PORT}"export NO_PROXY="localhost,127.0.0.1,::1,10.*,192.168.*,172.16.0.0/12"OriginCar 的 ROS 2 入门过程可以拆成一条清晰的验证链:先确认系统能启动,再确认网络能登录,然后确认底盘和相机节点能够工作,最后确认 rosbridge 与上位机能够交换数据。按照这条顺序排查,每个阶段都有明确的输入、命令和观察结果,后续接入导航、视觉或比赛控制节点时也更容易定位问题。