| RMVL 2.4.0 Robotic Manipulation and Vision Library

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

作者
  赵曦

日期
  2023/07/07

上一篇教程：如何使用/开发 tracker 模块
下一篇教程：如何使用/开发 group 模块

基类 rm::tracker

# 1 如何使用

## 1.1 有关构造与创建

追踪器 追踪器/特征组合的时间序列（数据组件） 对象创建方法与特征组合 特征组合体（数据组件） 以及图像特征 图像轮廓特征（数据组件） 基本一致，均使用静态工厂函数，这里是使用 make_tracker 完成构建。

构造一个平面目标追踪器的代码如下

auto p_tracker = rm::PlanarTracker::make_tracker(p_combo); // p_combo 是已经存在的追踪器，并且不能为 nullptr
rm::PlanarTracker::make_tracker
static ptr make_tracker(combo::ptr p_combo)
构建 PlanarTracker
定义 planar_tracker.h:41

rm::tracker 提供了 clone 纯虚拟函数，用于完全复制一份数据。

## 1.2 信息获取

和低层数据组件类似， 追踪器/特征组合的时间序列（数据组件） 内部维护了各时间下特征组合的相关信息，即特征组合的时间序列。

### 1.2.1 数据信息

追踪器/特征组合的时间序列（数据组件） 记录了时间上彼此关联的一组 特征组合体（数据组件），内部使用 std::deque<combo::ptr> 表示。追踪器/特征组合的时间序列（数据组件） 提供了与 std::deque 容器类似的访问操作，包括

表 1: tracker 信息获取接口

信息获取接口 | 实现功能
--- | ---
at(idx) | 获取指定的下标idx
front() | 获取特征组合时间序列最新的元素
back() | 获取特征组合时间序列最旧的元素
data() | 获取std::deque<combo::ptr>（特征组合时间序列）的数据
size() | 获取特征组合时间序列的大小
empty() | 判断特征组合时间序列是否为空

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

和低层数据组件类似一样，包含高度、宽度、角度、中心点、角点列表、类型信息、相机外参等内容，但主要表示经过修正后的数据，例如 height 成员方法表示追踪器在通过对时间序列中所有特征组合进行处理，得到的修正后的高度信息（譬如加权平均）。访问方式与 特征组合体（数据组件）、图像轮廓特征（数据组件） 完全一致，这里不再赘述。

# 2 如何开发

## 2.1 基本准则

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

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

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

   RMVL_TRACKER_CAST(MyTracker);
   RMVL_TRACKER_CAST
   #define RMVL_TRACKER_CAST(name)
   rm::tracker 追踪器类型转换宏
   定义 tracker.h:105