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) 实现从默认的
Q5: 地瓜机器人提供的Linux镜像(特指经过最小裁剪的系统,非完整Ubuntu Desktop/Server)是否支持在板卡端直接进行编译操作?
A: 地瓜机器人为RDK提供的部分Linux镜像,特别是那些为嵌入式部署而经过最小化裁剪的rootfs(根文件系统),可能不包含完整的编译工具链(如GCC, G++, make, CMake等)和开发所需的头文件、库文件。
- 结论: 这类最小化Linux镜像通常无法支持或不适合在板卡端直接进行复杂的源码编译工作。
- 推荐做法: 对于需要在RDK上运行的应用程序,推荐采用交叉编译的方式。即在PC开发主机(如Ubuntu PC)上配置好针对RDK目标平台的交叉编译环境,在PC上完成编译后,再将生成的可执行文件和相关依赖部署到RDK板卡上运行。
Q6: 在地瓜机器人提供的最小化Linux镜像上如何运行官方手册中提供的示例(这些示例通常以Ubuntu系统环境为例)?
A: 官方手册中的示例(尤其是TROS/ROS相关的示例)通常是在功能更完整的Ubuntu系统环境下演示的。要在最小化的Linux镜像(可能没有预装Python解释器或完整的ROS环境)上运行这些示例(特别是C++编写的ROS节点),需要做一些调整:
-
Ubuntu系统与Linux镜像启动示例的差异:
- 环境配置:
- Ubuntu系统: 通常使用
source /opt/tros/setup.bash(或对应ROS版本的setup.bash) 来配置TROS/ROS环境,这个脚本会设置大量的环境变量(如PATH,LD_LIBRARY_PATH,AMENT_PREFIX_PATH等)。 - Linux镜像: 可能需要手动设置关键的环境变量,特别是
LD_LIBRARY_PATH以确保程序能找到所需的共享库。日志路径ROS_LOG_DIR也可能需要手动指定到一个可写的位置。
- Ubuntu系统: 通常使用
- 配置文件拷贝: 无论哪种系统,运行示例前通常都需要将示例依赖的配置文件(如模型配置、参数文件等)从TROS/ROS安装路径下拷贝到当前工作目录或指定路径。
- 启动方式:
- Ubuntu系统: 常使用
ros2 run <package_name> <executable_name>或ros2 launch <package_name> <launch_file_name>来启动节点或启动文件。 - Linux镜像: 由于可能没有完整的
ros2命令行工具或launch系统,通常需要直接运行编译好的C++可执行程序,并通过命令行参数的方式传递原本在launch文件中设置的参数。
- Ubuntu系统: 常使用
- 环境配置:
-
将launch脚本内容转换为Linux镜像上的直接执行命令(以一个C++的
dnn_node_example为例):-
分析Ubuntu上的启动命令:
# Ubuntu: 配置tros.b环境
source /opt/tros/setup.bash
# Ubuntu: 从tros.b的安装路径中拷贝出运行示例需要的配置文件。config中为example使用的模型,回灌使用的本地图片
cp -r /opt/tros/${TROS_DISTRO}/lib/dnn_node_example/config/ .
# Ubuntu: 使用本地jpg格式图片进行回灌预测,并存储渲染后的图片
ros2 launch dnn_node_example dnn_node_example_feedback.launch.py -
找到launch脚本并分析其内容:
- 查找launch脚本路径:
# find /opt/tros/ -name dnn_node_example_feedback.launch.py
/opt/tros/share/dnn_node_example/launch/dnn_node_example_feedback.launch.py
- 查找launch脚本路径:
-