| RMVL 2.4.0 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
硬件设备与软件模块的初始化

作者
  赵曦

日期
  2023/10/02

上一篇教程：顶层模块开发基本流程
下一篇教程：读取（默认）数据以控制逻辑分支

## 概述

软件模块一般在使用时仅涉及到 4 个功能模块，即 检测与识别模块（功能模块） ， 补偿模块（功能模块） ， 目标预测模块（功能模块） ，和 决策模块（功能模块） 。此外，用户仍然可以基于 RMVL 提供的抽象类数据组件（如 rm::feature ）完成适用于个人项目中派生数据组件的接口设计，在这种情况下，初始化的内容可能需要考虑到这些数据组件，在本文中不多介绍。

而硬件设备主要有感知设备 SDK 和通信设备相关层级支持（及相关通信中间件），目前 RMVL 包含的感知设备 SDK 涉及到

相机设备 光源控制器 激光雷达

通信设备相关层级支持涉及到

进程间通信 串口通信 以 Socket 为核心的传输层 以 HTTP 为核心的应用层及后端框架

通信中间件涉及到

OPC UA MQTT

## 软件模块

实际上，各个功能模块在运行时初始化的主要依据正是通信传输的控制信息，这里仅介绍功能模块在运行时初始化的最一般写法。

4 个功能模块均提供了对应的 make_xxx 静态工厂函数，可直接使用此函数完成初始化操作，在 API 概念 的 低耦合逻辑 中涉及到了以下写法，其中最后一个序列组列表则是贯穿于所有功能模块的数据组件集合。

// 创建 detector
rm::detector::ptr p_detector = rm::ArmorDetector::make_detector();
// 创建 compensator
rm::compensator::ptr p_compensator = rm::GravityCompensator::make_compensator();
// 创建 predictor
rm::predictor::ptr p_predictor = rm::ArmorPredictor::make_predictor();
// 创建 decider
rm::decider::ptr p_decider = rm::TranslationDecider::make_decider();
// 默认初始化 group 列表
std::vector<rm::group::ptr> groups;
rm::ArmorDetector::make_detector
static auto make_detector()
构建 ArmorDetector
定义 armor_detector.h:68
rm::ArmorPredictor::make_predictor
static std::unique_ptr< ArmorPredictor > make_predictor()
构建 ArmorPredictor
定义 armor_predictor.h:40
rm::GravityCompensator::make_compensator
static auto make_compensator()
构造 GravityCompensator
定义 gravity_compensator.h:28
rm::TranslationDecider::make_decider
static std::unique_ptr< TranslationDecider > make_decider()
构造 TranslationDecider
定义 translation_decider.h:42

此外，要注意某些静态工厂函数可能需要传入参数，这些参数一般就是对应功能类的构造函数的入参。具体的功能模块在使用上均可参考该类对应的说明文档。

## 感知设备

- 相机设备

  相机模块可参考手册 相机设备 ，此处不多赘述，以 rm::HikCamera 为例，直接使用

  // 创建并初始化相机
  auto p_capture = rm::HikCamera::make_capture(rm::CameraConfig::create(rm::GrabMode::Continuous, rm::RetrieveMode::OpenCV));
  rm::HikCamera::make_capture
  static std::unique_ptr< HikCamera > make_capture(CameraConfig cfg, std::string_view info="")
  构建 HikCamera 对象
  定义 hik_camera.h:65
  rm::RetrieveMode::OpenCV
  @ OpenCV
  使用 OpenCV 的 'cvtColor' 进行处理
  定义 camutils.hpp:49
  rm::GrabMode::Continuous
  @ Continuous
  连续采样
  定义 camutils.hpp:33
  rm::CameraConfig::create
  static CameraConfig create(Args &&...modes)
  创建相机初始化配置模式
  定义 camutils.hpp:66

  即可完成相机的初始化。

- 光源控制器

  光源控制器 一文中指引了有关 SDK 的安装，可参考其相关类完成开发工作。

- 激光雷达

  待办事项
    本小节暂无

## 通信设备

- 串口通信

  串行接口通信，使用方法见 串口通信模块

  示例

  /* code */
  #pragma pack(1)
  // 发送协议
  struct SendStruct {
  uint8_t test;
  /* code */
  };
  #pragma pack()
  /*
  不使用 #pragma pack 预处理器宏实现取消内存对齐，也可以使用
  C++11 提供的关键字 alignas，例如下面的接收协议
  */
  // 接收协议
  struct alignas(1) ReceiveStruct {
  uint8_t test;
  /* code */
  };
  /* code */
  int main() {
  // 创建并初始化串口通信
  auto port = rm::SerialPort("/dev/ttyACM0", BaudRate::BR_115200, SerialReadMode::NONBLOCK);
  /* code */
  }
  /* code */
  rm::SerialPort
  同步模式串行接口通信库
  定义 serial.hpp:50
  注解
    - 取消内存对齐可参考 alignas 和 pragma pack
    - 初始化硬件设备同时要定义好串口通信协议
    - 串口通信协议可参考 2.3 链路层协议 小节
- 其余层级支持
  - 进程间通信，使用方法见 进程间通信设施 —— IPC
    - 跨平台的同步支持包括 rm::PipeServer 和 rm::PipeClient ，对应的异步协程支持包括 rm::async::PipeServer 和 rm::async::PipeClient
    - Linux 下基于 Unix FIFO 实现的 rm::MqServer 和 rm::MqClient
  - 以 Socket 为核心的传输层支持，使用方法见 传输层设施 —— Socket
  - 以 HTTP 为核心的应用层及后端框架支持，使用方法见 网络、应用层设施
    - 基础工具包括 rm::Request 和 rm::Response
    - 同步请求工具包括 rm::requests::get 和 rm::requests::post 等，对应的异步请求工具包括 rm::async::requests::get 和 rm::async::requests::post 等
    - 后端框架包括 rm::async::Webapp
- 通信中间件
  - OPC UA，使用方法见 工业自动化通信协议 —— OPC UA
  - MQTT，使用方法见 消息队列遥测传输协议 —— MQTT

涉及到运行时切换模块的功能，可以对上述 软件模块 中的写法进行拓展，请继续阅读下一篇 读取（默认）数据以控制逻辑分支 以了解数据信息是如何控制程序分支的。