RDK-X5

info
页面定位

本页记录 RDK X5 的一条可复现开发链路:先让虚拟机和板卡网络互通,再用 SSH 登录、SCP 传输文件,随后配置 OpenExplorer 或 VNC;最后通过结构体协议把视觉结果发给 STM32。不同协议和不同实验只在必要处分节,不再复制同一套安装命令。

阅读顺序

  1. RDKX5 虚拟机:启动 VMware、选择网络模式并确认 USB/串口入口。
  2. 远程访问与文件传输(SSH/SCP):建立稳定命令行连接,再用同一组账号、地址和端口传输文件。
  3. OpenExplorer 环境:安装工具包、导入离线镜像并启动容器。
  4. VNC 远程桌面:只有必须操作图形界面时才启用;它与 SSH/SCP 是不同协议。
  5. 结构体通信:将检测结果封装为固定数据包交给 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
warning
地址属于本机现场记录

本次记录的板卡地址是 192.168.0.150、网关是 192.168.0.1。换网络或重建虚拟机后必须重新实测;出现 Connection timed out 时先查 IP、网段、路由和防火墙,不要直接继续改 SSH 或 VNC。

2. 远程访问与文件传输(SSH/SCP)

subject
Abstract

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
warning
文件名核对

上面的 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 联调顺序

  1. 先单独验证 UART 电平、波特率和共地。
  2. 用固定测试包确认 STM32 能识别包头、长度和包尾。
  3. 再接入 RDK 的视觉坐标,并记录发送频率、丢包率和异常包。
  4. 坐标跨平台传输时明确小端/大端和有符号数范围。

配套的通用排查见通信与联调,不要把 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 测试包通过包头、长度、包尾和异常恢复验证。
subject
Abstract

稳定的 RDK-X5 开发顺序是:先网络,后 SSH;SSH 通了再 SCP;文件和镜像就绪后启动 OpenExplorer;需要 GUI 才启用 VNC;最后用明确的数据包协议联调 STM32。