RMVL
1.0.0
RoboMaster Vision Library
|
RMVL 提供了简化视觉伺服控制操作的功能,并包括智能射击机器人的基本功能模块,包括:步兵 Infantry、英雄 Hero、哨兵 Sentry 和无人机 Drone 。该代码库易于维护,所有的功能模块都已解耦,包括由特征feature
、特征组合combo
、追踪器tracker
和序列组group
组成的 数据组件 ,由检测和识别模块detector
、补偿模块compensator
、目标预测模块predictor
和决策模块decider
组成的 功能模块 ,还有已经打包了许多厂商的工业相机底层驱动程序的相机模块,以及与单片机进行通信的串口通信模块。此外,还有一些实用程序可以缩短开发周期,如图像处理imgproc
、线程池库thread_pool
、机器学习与深度学习支持库ml
等。
RMVL 具有模块化结构,这意味着该软件包包含了多个共享或静态库,有以下内容可用。
modules
文件夹中的模块。cv::findContours
函数来获取,简单封闭图形可通过 OpenCV 中的 imgproc
模块提供的各类函数接口来进行获取,例如最小外接矩形 cv::minAreaRect
、最小包络三角 cv::minEnclosingTriangle
等,提取到的对象 cv::RotatedRect
或一个 cv::OutputArray
等内容可由开发者自行转化成 feature
有用的信息(一般是通过 feature
的构造函数完成)。std::vector<feature_ptr>
来存储它们,特征的数量通常不会太多,并且这类特征在物理空间中通常是刚性的,即特征之间大致具备尺度不变的特点。开发中,一般会使用若干特征以及附带信息作为 combo
的构造函数。tracker
是在时间上包含了许多相同物理特性的 combo
,从而形成一个 combo
的时间序列,在 RMVL 中,则通过使用 std::deque<combo_ptr>
来表示这个时间序列。在功能上,tracker
不仅表示了不同时间下相同的 combo
的相关信息,还能处理在某个时间点上获取到不正确的 combo
的异常情况。group
,从而能够表示更加高级的物理信息。序列组使用 std::vector<tracker_ptr>
来存储这些追踪器。rm::DetectInfo
中。tof
以及补偿增量 compensation
均保存至补偿模块信息 rm::CompensateInfo
中。group
对象)进行 Kt
、B
、Bs
3 种预测量类型的计算,每种预测量类型都包含 9 种预测对象,每个预测对象之间对于 3 种预测量来说都是线性关系,例如在 整车状态预测模块 中对于 ANG_Y
预测对象的 3 种预测量都是单独计算的,这也便于后续的 决策模块 能够自由组合这些预测量。同样,计算得到的各类预测量均被保存至预测模块信息 rm::PredictInfo
中。DetectInfo
、补偿模块信息 CompensateInfo
、预测模块信息 PredictInfo
)导出到决策模块信息 rm::DecideInfo
中。该文档的后续章节描述了每个模块的功能。但首先,请确保彻底了解库中使用的常用 API 概念。
RMVL中的每个功能模块都设计有一个抽象类和一系列派生类,以严格限制暴露的接口并实现接口的统一性。这种方法有助于顶层项目统一管理功能模块中特定的方法,顶层项目开发人员可以专注于模块之间的逻辑关系处理。例如,您可以使用同一接口实现不同的功能。
RMVL 中功能模块之间的耦合度非常低,它们不会相互影响或依赖。例如,基于装甲的自动瞄准模块可以通过以下代码实现,它们之间共享的数据组件是对象是一个序列组列表:groups
。
例如,对一个数据组件进行识别的结果并不影响预测的逻辑。换句话说,在对象识别过程中,异常和不合格的对象不应该被交给预测、补偿和决策模块进行后续处理,而应由识别检测模块本身解决。
不同的机器人具有不同的属性,它们对功能需求、运动响应和通信延迟都有不同的影响。RMVL 为所有这些参数提供了默认值,以确保正确的运行。但在实际部署时,但这些参数通常不是最有效的、最正确的,因此像机器人这样的顶层项目需要手动加载这些参数以最大化性能。
到目前为止,RMVL 的所有参数文件都是通过 YAML 文件读取和写入运行时加载的,参数规范文件本身由 *.para
文件所规定,包含了该参数的类型、标识符、默认值以及注释。这个文件在 CMake 架构期间会生成一系列对应的 *.cpp
和 *.h/*.hpp
,这个功能由一系列 CMake 语法定义,例如 rmvl_generate_para
。RMVL 参数模块在命名空间 para
中提供了统一的参数加载接口 load()
,并限制只能将参数传递给已实例化的 xxxParam
对象。请参考以下代码:
这段代码中,rmvlpara/loader.hpp
头文件被包含,并使用load()
函数来加载参数。以加载armor_param
和camera_param
为例,假设这些参数分别对应于装甲板和相机的参数。
RMVL 使用异常 (exception) 来触发错误,当输入数据出现格式错误、范围错误、内存错误等异常情况,它会返回一个特殊的错误代码。
异常可以是 rm::Exception 的实例化对象,或者其派生对象。此外 rm::Exception 是 std::exception
的派生类,因此可以优雅的使用标准 C++ 库的各类组件来处理 RMVL 抛出的异常。
RMVL 中的异常通常是使用 RMVL_Error(code, msg)
宏或类似 printf
的 RMVL_Error_(code, fmt, args...)
变体进行触发的,或者可以使用 RMVL_Assert(cond)
宏检查条件并在不满足条件时触发异常。对于性能要求高的代码,有一个 RMVL_DbgAssert(cond)
,它只保留在 Debug 配置中。由于自动内存管理,所有中间缓冲区自动释放的情况下突然出现错误,您只需添加 try
语句来捕获异常。