8.3 应用开发、编译与示例
本节主要解答与在RDK平台上安装/使用第三方库、编译应用程序、运行官方示例以及相关问题。
如需交叉编译部署,请参考交叉编译环境部署
Q1: 第三方库在RDK上的安装/交叉编译和使用方法是怎样的?
A:
- 板端直接安装: 如果第三方库提供了适用于ARM架构的预编译包(例如
.deb
文件),或者可以通过包管理器(如apt
)直接安装,那么可以在RDK板卡上直接进行安装。对于Python库,如果Pypi上有对应的arm64 wheels包,也可以直接pip install
。 - 交叉编译: 如果第三方库需要从源码编译,推荐在PC开发主机上进行交叉编译,然后将编译产物部署到RDK板卡上。
- 环境部署: 详细的交叉编译环境搭建步骤,请参考地平线开发者社区的教程:交叉编译环境部署
- 编译步骤: 通常需要配置CMake Toolchain文件,指定交叉编译器、目标系统Sysroot等。
Q2: 在编译大型程序(如C++项目、ROS功能包)的过程中,如果系统提示编译进程被“kill”或出现内存不足相关的错误日志,应该如何解决?
A: 编译大型项目时,如果物理内存不足,Linux系统的OOM (Out Of Memory) killer机制可能会杀死消耗内存最多的进程(通常是编译器进程如cc1plus
、ld
等),导致编译失败。
解决方法: 增加系统的交换空间 (Swap)。Swap是硬盘上的一块区域,当物理内存不足时,系统可以将部分不常用的内存数据暂时存放到Swap中,从而释放物理内存供当前任务使用。虽然Swap比物理内存慢,但可以有效防止因瞬时内存不足导致的编译失败。
增加Swap空间的步骤示 例 (创建一个1GB的Swap文件):
# 1. (可选)创建一个目录用于存放Swap文件,或者直接在根目录创建
sudo mkdir -p /swapfile_custom_dir
cd /swapfile_custom_dir
# 2. 使用dd命令创建一个指定大小的空文件 (bs=1M表示块大小为1MB, count=1024表示1024个块,即1GB)
sudo dd if=/dev/zero of=swap bs=1M count=1024
# 3. 设置正确的文件权限 (只有root用户可读写)
sudo chmod 0600 swap
# 4. 将该文件格式化为Swap分区
sudo mkswap -f swap
# 5. 启用Swap分区
sudo swapon swap
# 6. 验证Swap空间是否已启用 (会显示Swap总量和已用量)
free -h
swapon --show
使其开机自动挂载 (可选但推荐):
编辑 /etc/fstab
文件,在末尾添加一行(假设您的swap文件路径是/swapfile_custom_dir/swap
):
/swapfile_custom_dir/swap none swap sw 0 0
参考教程: Swap使用教程
Q3: 如何运行GC4633 MIPI摄像头的示例程序?
A: 地平线官方通常会提供基于常见MIPI摄像头(如F37、GC4663)的AI算法示例(例如FCOS目标检测)。这些示例一般会自动检测连接的摄像头型号并进行算法推理。
运行步骤示例 (以 /app/ai_inference/03_mipi_camera_sample
为例):
- 确保GC4663(或其他兼容的MIPI摄像头)已正确连接到RDK板卡的MIPI CSI接口,并且板卡已上电。
- 通过SSH或串口登录到板卡系统。
- 进入示例程序所在的目录:
cd /app/ai_inference/03_mipi_camera_sample
# 注意:具体路径可能因RDK系统版本和镜像内容而略有不同。 - 使用
sudo
权限运行Python示例脚本:sudo python3 mipi_camera.py
- 如果示例设计为通过HDMI输出,请确保RDK板卡的HDMI接口已连接到显示器。运行后,您应该能在显示器上看到摄像头捕捉的实时画面以及AI 算法处理后的结果(例如检测框、分类标签等)。
Q4: 使用rqt_image_view
查看RDK通过ROS发布的RGB888 RAW图像时,感觉非常卡顿,甚至无法接收图像,是什么原因?
A: 这个问题通常与ROS2中间件DDS的配置以及网络传输效率有关,特别是当传输未压缩的大尺寸原始图像数据时。
- 原因分析:
- 默认的FastDDS在UDP协议层可能没有实现有效的MTU(最大传输单元)分片。当发布的图像数据包大小超过网络路径上的MTU时,IP层会进行分片。
- 大量的IP分片对许多常见的路由器、交换机或网卡来说处理负担较重,可能导致无法有效缓冲所有分片。
- 在UDP传输中,如果任何一个IP分片丢失,整个UDP包(即整个图像帧)通常就会被丢弃,或者需要等待重传(如果上层有相关机制,但ROS图像话题通常不保证可靠传输),这会导致严重的卡顿或图像丢失。这种情况有时被称为“IP fragmentation attack”的类似表现,即大量分片导致网络拥堵和丢包。
- 解决方法:
- 更换DDS实现: 尝试将ROS2的RMW (ROS Middleware) 实现从默认的
rmw_fastrtps_cpp
切换到rmw_cyclonedds_cpp
。CycloneDDS在处理大数据包和网络分片方面有时表现更优。 在终端执行以下命令来切换DDS(仅对当前终端会话有效,或可加入到.bashrc
):然后重新启动您的ROS节点。export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
- 降低传输数据量:
- 发送压缩格式图像: 考虑在RDK板卡端将原始图像(如RGB888)压缩为JPEG或PNG等格式后再通过ROS话题发布。这会显著减小每帧图像的数据量。您可以在PC端订阅压缩图像话题,并由
rqt_image_view
(或自定义节点)进行解压显示。 - 降低分辨率或帧率: 如果应用允许,适当降低发布图像的分辨率或帧率也能有效减少网络负担。
- 发送压缩格式图像: 考虑在RDK板卡端将原始图像(如RGB888)压缩为JPEG或PNG等格式后再通过ROS话题发布。这会显著减小每帧图像的数据量。您可以在PC端订阅压缩图像话题,并由
- 更换DDS实现: 尝试将ROS2的RMW (ROS Middleware) 实现从默认的