前言

最近想开发一个小型机器人,碰巧看到了 RDK x5 发布了,参数对于我来说非常合适,就买了一块回来玩。

在这里插入图片描述
外设也是非常丰富,机器人开发的接口都是有的
在这里插入图片描述

板子实物非常好看哈哈:
在这里插入图片描述

架构图

机器人大概的框架是这样的,也算比较简单的,也是比较入门的架构。

在这里插入图片描述

  • 视觉:摄像头作为图形输入端,采集外部的图像,让机器人有一双眼睛,在 RDK x5 的板子上使用加速引擎对视觉模型进行部署,速度 25 fps 完全没有压力,

  • 运动: 运动的主控主要是交给 STM32F103 ,其负责底部电机还有小型液晶屏的显示交互。

开发过程

下面重点讲解下开发的过程,主要涉及以下几点:

  • 摄像头
  • YOLO 量化部署
  • 底版开发

摄像头

我用的摄像头是 MIPI 摄像头,简单说下 MIPI 摄像头的原理

MIPI:移动产业处理器接口(Mobile Industry Processorinterface) 是MIPI联盟发起的为移动应用处理器制定的开放标准。

更多细节见 MIPI官网

‌MIPI摄像头的工作原理‌主要包括以下几个步骤:

  • 数据传输‌:MIPI接口支持高速、低延迟的数据传输,确保相机捕获的图像和视频数据能够迅速且准确地传输到主处理器(如应用处理器)进行处理‌1。‌
  • 协议支持‌:CSI(Camera Serial Interface)是关键协议,定义了相机传感器与处理器之间如何交换图像数据‌1。
  • 同步与控制‌:同步信号和控制信号的传输确保相机与处理器之间的同步操作,并允许处理器对相机进行配置和控制,如调整曝光时间、增益等参数‌1。
  • 图像处理‌:处理器接收到来自MIPI相机的原始图像数据后,会进行一系列图像处理操作,如去噪、色彩校正、图像压缩等,以生成最终可供显示或存储的图像‌1。

MIPI接口的特点和优势

  • 优化功耗‌:MIPI接口通过低压差分信号传输,降低了功耗,提高了设备的续航能力‌2。
  • 高速传输‌:数据传输速率可以达到Gbps级别,满足了IT领域对高速数据传输的需求‌2。
  • 减少引脚数‌:采用串行通信方式可以大幅减少物理接口数量,同时提高数据传输的速率和效率‌3。
  • 差分信号传输‌:有效地减少了电磁干扰(EMI)对信号质量的影响,提高了信号传输的稳定性和可靠性‌3。
  • 多种通信协议‌:支持多种通信协议,可以根据需求进行选择和定制,具有较高的灵活性‌2。

MIPI接口在移动设备中的应用

MIPI接口广泛应用于智能手机、平板电脑、可穿戴设备等移动设备的摄像头、显示屏、存储和其他外设与主处理器之间的连接。通过优化数据传输速率、功耗和物理连接等方面的设计,MIPI接口使得移动设备能够搭载更高性能的相机系统,从而提供更出色的拍照和录像体验‌1。

在 RDK x5 上使用 MIPI 摄像机非常简单, RDK x5 文档如下;

在这里插入图片描述

RDK相机驱动的逻辑:
在这里插入图片描述

模型转换

因为我的项目需要微调 YOLO,训练好之后,将 pth -> onnx -> ptq -> bin 然后直接部署就可以了。

微调过程这里不展开讲了,有兴趣的同学可以参考我的博文:《 深度学习实战 | 智慧工地安全帽和危险区域检测系统(代码已开源!) 》 ,里面会从数据集准备到微调全链路覆盖讲解,非常详细。

每款芯片都有自己的推理引擎,例如 英伟达的 TensorRT,瑞芯微的 RKNN,高通的 SNPE,RDK x5 也有自己的推理引擎,我们需要完成浮点模型到 D-Robotics 混合异构模型的转换,经过这个阶段,我们将得到一个可以在D-Robotics 处理器上运行的模型。

在这里插入图片描述

模型转换使用 hb_mapper makertbin 工具完成,转换期间会完成模型优化和校准量化等重要过程,校准需要依照模型预处理要求准备校准数据。 为了方便您全面了解模型转换,本节将依次介绍校准数据准备、转换工具使用、转换内部过程解读、转换结果解读和转换产出物解读等内容。

准备校准数据

在进行模型转换时,校准阶段会需要 100份左右 标定样本输入,每一份样本都是一个独立的数据文件。 为了确保转换后模型的精度效果,我们希望这些校准样本来自于您训练模型使用的 训练集或验证集 ,不要使用非常少见的异常样本,例如 纯色图片、不含任何检测或分类目标的图片等。

转换配置文件中的 preprocess_on 参数,该参数启用和关闭状态下分别对应了两种不同的预处理样本要求。 preprocess_on 关闭状态下,我们需要把取自训练集/验证集的样本做与模型推理(inference)前一样的前处理, 处理完后的校准样本会与原始模型具备一样的数据类型( input_type_train )、尺寸( input_shape )和 layout( input_layout_train ),对于 featuremap 输入的模型,可以通过 numpy.tofile 命令将数据保存为float32格式的二进制文件, 工具链校准时会基于 numpy.fromfile 命令进行读取。 例如,YOLOv5 训练的用于分类的原始浮点模型,它只有一个输入节点,输入信息描述如下:

  • 输入类型:BGR
  • 输入layout:NCHW
  • 输入尺寸:1x3x640x640

使用验证集做模型推理(inference)时的数据预处理如下:

图像长宽等比 scale, 并缩放到 32 的倍数,如果不足 32 则用 144,144,144 的 pad 补齐。

使用 hb_mapper makertbin 工具转换模型

hb_mapper makertbin 提供两种模式,开启 fast-perf 模式和不开启 fast-perf 模式。

fast-perf 模式开启后,会在转换过程中生成可以在板端运行最高性能的bin模型,工具内部主要进行以下操作:

  • 将BPU可执行算子尽可能运行在BPU上(RDK X5 则可以通过yaml文件中node_info参数指定在BPU上运行的算子)。

  • 删除模型首尾不可删除的CPU算子,包括:Quantize/Dequantize(QAT过程会有的算子)、TransposeCastReshape等。

  • 以性能最高的O3优化等级编译模型。

hb_mapper makertbin 命令使用方式如下:

不开启 fast-perf 模式:

  hb_mapper makertbin --config ${config_file}  \
                      --model-type  ${model_type}

开启 fast-perf 模式:

  hb_mapper makertbin --fast-perf --model ${caffe_model/onnx_model} --model-type ${model_type} \
                      --proto ${caffe_proto} \
                      --march ${march}

底版开发

底盘开发主要是 STM32F103 使用 软件 I2C 好 舵机控制版通信,舵机控制板会控制 3个舵机的运动,主要是让摄像头始终跟随某个物体使用的。

底板的 STM32 和控制板 RDK x5 只要是用串口通信的,整个协议也比较简单,这里不做过多的阐述了。

结语

好啦,以上就是我用 RDK x5 做的小机器人,后续我会持续更新,感谢大家看到这里。RDK x5 的板子真的非常好用,还在慢慢摸索更多功能哈哈。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部