RMVL  1.5.0-dev
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);
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::ptrMyCombo::const_ptr 作为 std::shared_ptr<MyCombo>std::shared_ptr<const MyCombo> 的别名;
  4. 必须实现以 MyCombo::ptr 为返回值的 MyCombo::make_feature 静态工厂函数;
  5. 不得定义公开数据成员,避免对数据成员的直接操作,设置、获取操作应该使用形如 setXXXgetXXX 的成员方法;
  6. 实现从基类共享指针动态转换到派生共享指针的 cast 静态函数,方便起见,可以使用 RMVL_COMBO_CAST 宏,例如

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