| RMVL 1.5.2 Robotic Manipulation and Vision Library

载入中...
搜索中...
未找到
如何使用/开发 combo 模块

包含 combo 模块的创建、信息获取以及开发时的注意事项

作者
  赵曦

日期
  2023/07/07

上一篇教程：AprilTag 视觉标签 ↑
下一篇教程：如何使用/开发 tracker 模块 ↓

基类 rm::combo

# 1. 如何使用

## 1.1 有关构造与创建

特征组合 `combo` 对象创建方法与 `feature` 基本一致，都是使用静态工厂函数，这里是使用 `make_combo` 完成构建，同样会在最初进行能否构造的判断。

构造一个装甲板的代码如下

auto p_combo = rm::Armor::make_combo(p_left, p_right, imu_data, tick);
rm::Armor::make_combo
static ptr make_combo(LightBlob::ptr p_left, LightBlob::ptr p_right, const ImuData &imu_data, double tick, ArmorSizeType armor_size_type=ArmorSizeType::UNKNOWN)
Armor 构造接口

rm::combo 提供了 `clone` 纯虚拟函数，用于完全复制一份数据，适合于强制构造无视匹配要求的情况。

## 1.2 信息获取

特征组合体（数据组件） 与 图像轮廓特征（数据组件） 在信息获取上基本一致，但 特征组合体（数据组件） 内部维护了图像特征相关的信息，这一类数据在获取上与 STL 容器的操作基本一致。

### 1.2.1 数据信息

`combo` 记录了空间上彼此关联的一组 `feature`，内部使用 `std::vector<feature::ptr>` 表示。`combo` 提供了与序列式容器类似的访问操作，包括

表 1: combo 信息获取接口

信息获取接口 | 实现功能
--- | ---
`at(idx)` | 获取指定的下标`idx`
`data()` | 获取`std::vector<feature::ptr>`（特征列表）的数据
`size()` | 获取特征列表的大小
`empty()` | 判断特征列表是否为空

### 1.2.2 通用属性与派生类属性

包含高度、宽度、角度、中心点、角点列表、类型信息、相机外参等内容，访问方式与 `feature` 完全一致，这里不再赘述。

# 2. 如何开发

## 2.1 基本准则

开发与使用是一脉相承的，设计一个新的 rm::combo 派生类对象也要满足使用上的条件，一个新的派生类对象（假设定义为 `MyCombo`）需要满足以下准则。

1. 必须定义在 `namespace rm` 中；
2. 必须 public 继承于 `rm::combo` 基类；
3. 必须定义 `MyCombo::ptr` 和 `MyCombo::const_ptr` 作为 `std::shared_ptr<MyCombo>` 和 `std::shared_ptr<const MyCombo>` 的别名；
4. 必须实现以 `MyCombo::ptr` 为返回值的 `MyCombo::make_feature` 静态工厂函数；
5. 不得定义公开数据成员，避免对数据成员的直接操作，设置、获取操作应该使用形如 `setXXX` 或 `getXXX` 的成员方法；

6. 实现从基类共享指针动态转换到派生共享指针的 `cast` 静态函数，方便起见，可以使用 `RMVL_COMBO_CAST` 宏，例如

   RMVL_COMBO_CAST(MyCombo);
   RMVL_COMBO_CAST
   #define RMVL_COMBO_CAST(name)
   定义 combo.h:108