RDK-X5
本页记录 RDK X5 的一条可复现开发链路:先让虚拟机和板卡网络互通,再用 SSH 登录、SCP 传输文件,随后配置 OpenExplorer 或 VNC;最后通过结构体协议把视觉结果发给 STM32。不同协议和不同实验只在必要处分节,不再复制同一套安装命令。
阅读顺序
- RDKX5 虚拟机:启动 VMware、选择网络模式并确认 USB/串口入口。
- 远程访问与文件传输(SSH/SCP):建立稳定命令行连接,再用同一组账号、地址和端口传输文件。
- OpenExplorer 环境:安装工具包、导入离线镜像并启动容器。
- VNC 远程桌面:只有必须操作图形界面时才启用;它与 SSH/SCP 是不同协议。
- 结构体通信:将检测结果封装为固定数据包交给 STM32。
最短排障路径
| 现象 | 先做的检查 | 不要先做的事 |
|---|---|---|
| 虚拟机或板卡找不到 | ip -br addr、ip route、同网段 ping |
反复重装 SSH/VNC |
| SSH 超时 | IP、网段、路由、防火墙和 22 端口 | 直接修改用户名或密码 |
| SSH 正常、文件传输失败 | 远端目录权限、磁盘空间和 SCP 路径 | 把 Windows 路径粘到 Ubuntu |
| OpenExplorer 拉取失败 | 镜像文件类型、大小、tag 和 Docker 进程 | 把工具包误当镜像包 |
| VNC 黑屏或端口冲突 | 显示号、桌面会话、5900/5901 进程 | 同时启动 x11vnc 与 TigerVNC |
| STM32 收不到坐标 | 共地、TX/RX、电平、包头/长度/校验 | 先调视觉阈值或 PID |
1. 环境边界与网络
1.1 板卡、虚拟机与主机不是同一个目标
- 板端:真正运行视觉推理或业务程序的 RDK X5。
- 虚拟机:运行 Ubuntu、Docker 和 OpenExplorer 的开发环境;它可能通过 SSH 再访问板卡。
- Windows 主机:执行 PowerShell 的
ssh/scp,或运行 VNC Viewer。
排障时先写清楚命令在哪台机器执行。Windows 的 C:\... 路径不能直接粘到 Ubuntu 终端;Ubuntu 的 /home/... 路径也不能当作 Windows 本地路径。
1.2 网络模式与地址
VMware 需要访问局域网内的板卡时优先使用 Bridged(桥接);NAT 适合虚拟机借宿主机上网,但不保证局域网设备能主动访问虚拟机。
ip -br addr
hostname -I
ip route
本次 OpenExplorer 记录使用局域网地址 192.168.0.150,网关为 192.168.0.1。这属于本机现场记录;换网络后仍必须重新检查板卡 IP、网关和路由。
如果需要固定地址,先确认网卡名(本次为 ens33),再编辑 netplan:
sudo nano /etc/netplan/01-network-manager-all.yaml
本次使用的配置如下(换网络后按现场地址替换):
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.0.150/24
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
应用前后分别检查配置和连通性:
sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
sudo netplan generate
# 远程修改时先试运行;确认不中断 SSH 后再接受配置
sudo netplan try
ip addr show ens33
ip route
本次记录的板卡地址是 192.168.0.150、网关是 192.168.0.1。换网络或重建虚拟机后必须重新实测;出现 Connection timed out 时先查 IP、网段、路由和防火墙,不要直接继续改 SSH 或 VNC。
2. 远程访问与文件传输(SSH/SCP)
SSH 负责登录、执行命令和排障;SCP 复用同一 SSH 主机、用户名、端口和认证方式传输文件。这两者是一条远程开发链路,维护在本节;VNC、USB 和串口属于不同链路,单独处理。
SSH 远程命令
安装与启动服务
在 Ubuntu 板端或虚拟机内执行:
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
sudo systemctl status ssh
ss -lntp | grep ':22'
建立连接
在 Windows PowerShell 或另一台 Linux 主机执行:
ssh oyz@192.168.0.150
首次连接确认主机指纹后输入 yes;输入密码时终端不回显字符是正常现象。登录后先验证目标:
hostname
uname -a
ip -br addr
需要执行单条命令时:
ssh oyz@192.168.0.150 "uname -a"
退出会话:
exit
SSH 故障判断
| 现象 | 先检查什么 |
|---|---|
Connection timed out |
IP、网段、路由、防火墙和设备是否在线 |
Connection refused |
systemctl status ssh 与 22 端口是否监听 |
Permission denied |
用户名、密码/密钥和服务端登录策略 |
| 主机指纹冲突 | 确认 IP 未被复用后执行 ssh-keygen -R 板卡IP |
| SSH 可用但 VNC 不可用 | SSH 链路正常,转到 VNC 的桌面会话与 5900 端口排查 |
SCP 传输文件
SCP 只有在 SSH 能够连接时才有排查价值。先确认远端目录存在、当前账号有权限,再执行传输。
Windows 发送到板卡
scp .\main.py oyz@192.168.0.150:/home/oyz/
scp -r .\project oyz@192.168.0.150:/home/oyz/
路径含空格时加引号:
scp "C:\work files\main.py" oyz@192.168.0.150:/home/oyz/
从板卡下载到 Windows
scp oyz@192.168.0.150:/home/oyz/result.csv .\
scp -r oyz@192.168.0.150:/home/oyz/logs .\logs
非默认端口与大目录
# SSH 使用非 22 端口时,SCP 使用大写 -P
scp -P 2222 .\main.py oyz@192.168.0.150:/home/oyz/
# 尽量保留时间和权限
scp -p .\main.py oyz@192.168.0.150:/home/oyz/
单个文件或小目录使用 SCP 最直接;大量文件需要增量同步时再考虑 rsync。传输中断或速度异常时,检查 Wi-Fi、USB 网卡、虚拟网卡和系统代理是否改变了路由。
3. OpenExplorer 与 Docker
3.1 下载并解压工具包
在虚拟机或板端建立工作目录:
mkdir -p ~/rdkx5_workspace
cd ~/rdkx5_workspace
从官方 FTP 下载时不要把口令写进公开笔记或 shell 历史;用环境变量、交互式输入或密码管理器注入 <FTP_PASSWORD>:
wget -c ftp://x5ftp@vrftp.horizon.ai/OpenExplorer/v1.2.8_release/horizon_x5_open_explorer_v1.2.8-py310_20240926.tar.gz \
--ftp-password='<FTP_PASSWORD>'
本次交付包解压后包含:
horizon_x5_open_explorer_v1.2.8-py310_20240926/
├── package
├── README-CN
├── README-EN
├── resolve_all.sh
├── run_docker.sh
└── samples
tar -xvf horizon_x5_open_explorer_v1.2.8-py310_20240926.tar.gz
cd ~/rdkx5_workspace/horizon_x5_open_explorer_v1.2.8-py310_20240926
本次交付实测使用 tar -xvf 成功解包;如果后续拿到标准 gzip 包,应以 file 文件名 的实际类型为准,不要只根据扩展名猜命令。
3.2 在线拉取失败时导入离线镜像
在线拉取曾遇到 403 Forbidden 或镜像代理失败,因此改用离线镜像包。要传输的是 Docker 镜像包,而不是 OpenExplorer 工具包:
docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar.gz # Docker 镜像包
horizon_x5_open_explorer_v1.2.8-py310_20240926.tar.gz # 工具包
在 Windows PowerShell 中使用本节 SCP 主线上传:
scp "C:\Users\12706\Desktop\docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar.gz" oyz@192.168.0.150:/home/oyz/
在虚拟机内核对文件:
ls -lh /home/oyz/docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar.gz
file /home/oyz/docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar.gz
本次文件约 1.7G,类型为 gzip compressed data。文件大小属于历史实测值,迁移到其他环境时先用 ls -lh 和 file 复核。保留原压缩包并导入:
gunzip -k /home/oyz/docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar.gz
sudo docker load -i /home/oyz/docker_openexplorer_ubuntu_20_x5_cpu_v1.2.8.tar
上面的 docker load 路径必须与实际解压出的文件名一致。如果文件名仍为 ...v1.2.8.tar(下划线前后与示例不同),先用 ls 确认后再执行;不要盲目复制示例中的拼写。
导入大镜像时数分钟没有输出不等于卡死。另开终端检查:
ps -ef | grep '[d]ocker load'
3.3 对齐镜像 tag 并启动
本次导入得到的 tag 为:
openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8-py310
而 run_docker.sh 使用 v1.2.8,因此补一个兼容 tag:
sudo docker tag \
openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8-py310 \
openexplorer/ai_toolchain_ubuntu_20_x5_cpu:v1.2.8
sudo docker images | grep openexplorer
启动:
mkdir -p ~/rdkx5_dataset
cd ~/rdkx5_workspace/horizon_x5_open_explorer_v1.2.8-py310_20240926
./run_docker.sh ~/rdkx5_dataset cpu
进入 root@OE-X5-CPU-1-2-8:/open_explorer# 说明容器已经启动;仍需按项目脚本实际输出验证模型和设备是否可用。
3.4 OpenExplorer 复现检查表
- 虚拟机与板卡处于可互通网段。
- SSH 登录目标正确,未把旧 NAT 地址当作最终地址。
- 工具包与 Docker 镜像包没有混用。
- 镜像文件在传输后通过
ls -lh/file核对。 -
docker load完成后检查进程和镜像 tag。 -
run_docker.sh使用的 tag 与本地镜像一致。 - 容器启动后再验证数据目录、模型和设备权限。
4. VNC 远程桌面
VNC 只解决图形桌面访问,不能替代 SSH 的命令行和 SCP 的文件传输。先选清楚目标:
| 目标 | 方案 | 端口 |
|---|---|---|
| 无显示器也能得到独立桌面 | TigerVNC 虚拟桌面 | 5901(显示 :1) |
| 看到显示器上的真实桌面 | x11vnc 共享 :0 |
5900 |
4.1 x11vnc(本次实际使用)
临时验证桌面会话:
sudo killall x11vnc 2>/dev/null || true
x11vnc -display :0 -rfbport 5900 -forever -rfbauth /etc/x11vnc.pass -bg
Windows 端连接 板卡IP:5900。正式使用时创建带密码和自动重启的 systemd 服务:
sudo apt install -y x11vnc
sudo x11vnc -storepasswd /etc/x11vnc.pass
sudo chmod 600 /etc/x11vnc.pass
sudo tee /etc/systemd/system/x11vnc.service >/dev/null <<'EOF'
[Unit]
Description=Share the physical X11 desktop with x11vnc
After=display-manager.service
Wants=display-manager.service
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pass -rfbport 5900 -shared
Restart=on-failure
RestartSec=2
[Install]
WantedBy=graphical.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now x11vnc.service
验证服务、进程和端口:
systemctl is-enabled x11vnc.service
systemctl --no-pager -l status x11vnc.service
ss -lntp | grep ':5900'
pgrep -a x11vnc
如果开机后只有登录本地桌面才能连接,问题通常是 :0 的 X 会话尚未建立;应启用自动登录或改用 TigerVNC 虚拟桌面,而不是重复修改 SSH。
4.2 TigerVNC(需要独立虚拟桌面时)
TigerVNC 与 x11vnc 不应同时抢同一个显示号。若选择 TigerVNC,使用独立的 :1/5901,并先停用旧服务:
sudo systemctl disable --now vncserver.service 2>/dev/null || true
sudo systemctl disable --now x11vnc.service 2>/dev/null || true
TigerVNC 的安装、密码和桌面启动脚本必须按当前 Ubuntu 版本的包名配置。A VNC server is already running as :1 通常表示旧的 TigerVNC/Xvnc 进程仍占用显示号;先查清进程和端口,再清理对应实例,不能只删除 PID 文件。
4.3 VNC 冲突的最短排查路径
ps -ef | grep -E '[x]11vnc|[X]vnc|[X]tightvnc|[v]ncserver'
ss -lntp | grep -E ':(5900|5901)'
systemctl --no-pager -l status x11vnc.service vncserver.service
- x11vnc 共享真实桌面
:0,正常监听 5900。 - TigerVNC 常用虚拟桌面
:1,正常监听 5901。 - 出现
:1 已在运行且 PID 文件不存在,说明 vncserver 的状态文件与实际进程不一致;先停止冲突服务并确认端口释放。 - 如果 SSH 正常、5900 正常但画面黑屏,检查桌面会话、显示授权和
-auth参数。
5. RDK—STM32 结构体通信
视觉程序不应把坐标拼成字符串再让 STM32 解析;更稳定的做法是约定一个固定二进制数据包。双方必须使用同一字段顺序、宽度、字节序和校验规则。
5.1 数据包定义
typedef struct {
uint8_t header; // 例如固定为 0xA5
int16_t x;
int16_t y;
uint8_t end; // 例如固定为 0x5A
} VisionPacket;
5.2 STM32 接收示例
VisionPacket rx_data;
if (HAL_UART_Receive(&huart1,
(uint8_t *)&rx_data,
sizeof(rx_data),
10) == HAL_OK) {
if (rx_data.header == 0xA5 && rx_data.end == 0x5A) {
printf("Target Found! X: %d, Y: %d\r\n", rx_data.x, rx_data.y);
}
}
HAL_UART_Receive 接收的是字节缓冲区,所以需要把结构体指针转换为 uint8_t *。实际工程还应补充长度、校验和、超时、丢包恢复以及编译器对齐规则;不能假设不同编译器会自动产生相同的 sizeof(VisionPacket)。
5.3 联调顺序
- 先单独验证 UART 电平、波特率和共地。
- 用固定测试包确认 STM32 能识别包头、长度和包尾。
- 再接入 RDK 的视觉坐标,并记录发送频率、丢包率和异常包。
- 坐标跨平台传输时明确小端/大端和有符号数范围。
配套的通用排查见通信与联调,不要把 UART、USB、SSH 和 VNC 当作同一条链路。
6. Ollama:历史状态
这部分只记录当时的下载事实,不代表 RDK X5 已经具备合适的推理性能:
ollama pull deepseek-r1:8b
ollama list
ollama run deepseek-r1:8b
ollama ps
复现实验时必须注明模型实际运行在 Windows、虚拟机还是板端,并重新记录内存占用、首字延迟和生成速度。视觉推理或比赛控制链路优先保证稳定,不要让未经验证的 8B 模型抢占关键资源。
7. 最终验收
-
ip -br addr、ip route与现场网络一致。 - SSH 登录后
hostname/uname -a能确认目标主机。 - SCP 能上传和下载一个小文件,且路径、权限、端口无误。
- OpenExplorer 工具包、Docker 镜像包和镜像 tag 已分别核对。
- VNC 只启用一种目标方案,5900/5901 端口与显示号对应。
- RDK—STM32 测试包通过包头、长度、包尾和异常恢复验证。
稳定的 RDK-X5 开发顺序是:先网络,后 SSH;SSH 通了再 SCP;文件和镜像就绪后启动 OpenExplorer;需要 GUI 才启用 VNC;最后用明确的数据包协议联调 STM32。