cv-rmvl / rmvl Goto Github PK
View Code? Open in Web Editor NEWRobotic Manipulation and Vision Library
Home Page: https://cv-rmvl.github.io
License: Apache License 2.0
Robotic Manipulation and Vision Library
Home Page: https://cv-rmvl.github.io
License: Apache License 2.0
目前 core
模块包含了部分数值计算的内容,而 rmath
模块本身就是一个数学库,二者在功能上有重叠,建议将基础数学库、数值计算、数据处理与信号处理、数据结构与算法合并,统一放置在 core
模块中
No response
GyroData
的数据导出、导入和角点导出、导入均取消与 OpenCV cv::FileStorage
的绑定,改为更简单的 txt
文件即可。由此实现与 OpenCV 的解耦。
使用标准库的文件输入输出流对象完成这一功能
起初这个东西是想到了 STL 中的 vector<T>::const_iterator
,它跟 const vector<T>::iterator
的区别就好比 T *const ptr
和 const T *ptr
的关系,同理,智能指针应该也要有此功能。
以数据组件的共享指针为例,即提供:
//! 特征共享指针
using feature_ptr = std::shared_ptr<feature>;
//! 常量特征共享指针
using const_feature_ptr = std::shared_ptr<const feature>;
No response
出发点
目前缺少光源控制器的二次开发库,需要添加相关功能
需求
light
模块至 modules
中No response
配置 | 版本 |
---|---|
RMVL | 1.1.0-dev |
OpenCV | 4.7.0 |
OS / Platform | Ubuntu 22.04 |
Compiler | GCC 13.2.0 |
有如下报错提示
/xxx/cv-rmvl/rmvl/extra/types/include/rmvl/types.hpp:141:79: 错误:‘uint8_t’不是一个类型名
141 | static std::string to_string(Tp type) { return std::to_string(static_cast<uint8_t>(type)); }
| ^~~~~~~
/xxx/cv-rmvl/rmvl/extra/types/include/rmvl/types.hpp:15:1: 附注:‘uint8_t’ is defined in header ‘<cstdint>’; did you forget to ‘#include <cstdint>’?
14 | #include "rmvl/core/util.hpp"
+++ |+#include <cstdint>
15 |
/xxx/cv-rmvl/rmvl/extra/types/src/type_to_string.cpp: 在全局域:
/xxx/cv-rmvl/rmvl/extra/types/src/type_to_string.cpp:14:13: 错误:‘std::string rm::RMStatus::to_string’ is not a static data member of ‘struct rm::RMStatus’
14 | std::string rm::RMStatus::to_string(rm::RobotType type)
| ^~
/xxx/cv-rmvl/rmvl/extra/types/src/type_to_string.cpp:14:41: 错误:‘RobotType’不是‘rm’的成员
在 GCC 13.2.0 编译器环境下,运行
cd <path/to/rmvl>
rm -rf build
mkdir build && cd build
cmake ..
make rmvl_types
即可出现报错
现状
目前 CMake 确实具有语言特性的测试,但是很局限,目前的语言标准测试内容是
inline
变量<print>
打印库(这个也是库支持)计划
目前希望针对各个 C++ 版本的语言特性的支持需要使用多个内容进行测试,例如 位域的默认成员初始化器 是 C++20 标准的内容,但在 GCC 8 中即可享受该功能,目前的 Github Actions 用于测试的编译器仅包含了
core
与 OpenCV 解耦,KalmanFiler
移出 core
,单独开设 algorithm
模块dataio
模块,主要负责硬件上的数据通信和存储,将现在的 SerialPort
和 GyroData
移至其中。CMake 需要删除有关 OpenCV 的 dependence,改为
rmvl_add_module(core)
在 algorithm
模块和 dataio
中依赖 OpenCV 即可
Motivation - 出发点
目前在 group 模块中已经实现了 DefaultGroup
类
//! 默认序列组(一般退化为 `trackers` 使用)
class DefaultGroup final : public group
{
public:
DefaultGroup() = default;
//! 构建 DefaultGroup
static inline std::shared_ptr<DefaultGroup> make_group() { return std::make_shared<DefaultGroup>(); }
//! DefaultGroup 同步操作
void sync(const GyroData &, int64_t) override {}
};
以上代码是表示序列组 group
在此类的作用下可直接退化为 vector<tracker_ptr>
使用,那么同样的,其他数据组件应该具备类似的功能。
Feature - 功能特点
数据组件 | 默认类 | 退化后的功能 |
---|---|---|
图像特征 | DefaultFeature |
默认的图像特征仅表示一个孤立的点 cv::Point2f ,譬如一类特征是一个角点,要通过此角点的坐标进行后续识别、预测上的逻辑处理,所有的这类特征都是一个点,因此不需要额外派生其他的类来表示它,但为了识别等后续处理的接口的统一,还是需要提供一个默认图像特征类 |
组合体 | DefaultCombo |
默认的组合体应该仅包含一个固定的特征,这在实际开发中也是比较常见的,例如条形码、二维码识别出来的特征内容,这在 OpenCV 中一般使用一个 cv::RotatedRect 表示图形码的矩形,当然也可以使用一个 std::vector<cv::Point> 来表示图形码的角点列表,这些内容都可组合成一个简单的特征,而这些特征之间并不是相互组合的 |
追踪器 | DefaultTracker |
默认的追踪器只是起到了时间序列的存储工作,但不做任何的运动目标追踪,时间序列长度被固定设置为 32 ,此时成员属性 std::deque<combo_ptr> 更像是一个 std::vector<combo_ptr> |
以下展示了这些默认类可能的声明
feature - 图像特征
//! 默认图像特征,仅表示一个孤立的点 `cv::Point2f`
class DefaultFeature final : public feature;
combo - 组合体
//! 默认组合体,包含一个固定的特征,退化为 `feature` 使用
class DefaultCombo final : public combo;
*tracker - 追踪器
//! 默认追踪器,时间序列仅用于存储组合体,可退化为 `combos` 使用
class DefaultTracker final : public tracker;
目前 TagDetector 使用到了第三方库的代码,这部分内容需要添加到 3rdparty 中,因此需要开设新的文件夹,并需要完成相应的 CMake 配置
No response
在重构 armor_tracker 模块的时候,发现其几乎没有依赖任何 rm::Armor
的内容,实际上该追踪器模块仅为一个二维平面物体的追踪,因此计划将 armor_tracker 模块改为 planar_tracker 即平面目标追踪,但是目前遇到了一个问题。
在 vanishProcess
函数内,涉及到了从 rm::Armor
构造另一个 rm::Armor
的功能,其数据完全一致,仅有时间戳 tick
的不一致,因此计划为数据组件增加一个复制/构造方法,那么为了实现从一个对象复制到另一个对象的行为有
T t2(t1);
t2 = t1.clone();
方法大致两种操作,实际上,所有非特征的数据组件维护的原始数据均是由更底层的数据组件的共享指针的列表组成的。此外,显式弃置了复制、移动构造也限定了数据组件的构造方式仅为使用工厂函数一种方法,因此或许第二种方案,即原型模式会比较好。
可能的设计 (1)
数据组件抽象类提供形如
virtual xxx_ptr clone() = 0;
的纯虚拟函数接口,由各自派生类实现,这种操作的好处是统一接口,并且是多态的,即可以从基类指针进行 clone
操作,返回的指针也是直接指向对应派生类对象的,但存在
clone()
函数可能会有不同的入参,由于虚拟函数接口尽量不要设计成有默认参数的形式,因此这需要每类数据组件的 clone
方法在使用是需要进行统一的操作,但可能不同数据组件之间的入参会有不一致的现象。可能的设计 (2)
为了解决 clone
方法,这样能最大程度的解决以上问题,并且还可以为自己的 clone
方法添加默认参数,但这样的话就不能使用抽象类了。假设说如果真的需要从抽象类的共享指针完成构造,可能会有
/* combo_ptr p_combo; */
auto p_new_armor = Armor::cast(p_combo)->clone();
这种写法。优雅一点的话,可以使用类似
auto p_new_armor = Armor::copyFrom(p_combo);
的写法。
repositories { google() jcenter() mavenCentral() }
目前 kalman.hpp
只包含了普通的卡尔曼滤波功能,缺少扩展卡尔曼,在非线性的问题不能很好的处理
原先卡尔曼滤波的先验状态估计的公式为
$$\hat{\pmb x}k^-=A\hat{\pmb x}{k-1}+B\pmb u_{k-1}\tag1$$
现需要更改为
$$\hat{\pmb x}k^-=\pmb f(\hat{\pmb x}{k-1},\pmb u_{k-1})\tag2$$
并提供对应的雅可比矩阵,即原先的状态转移矩阵。观测方程同理。
可大致分为以下内容介绍
## 1. 简介
### 1.1 基本介绍
### 1.2 地址空间
## 2. 服务器/客户端
## 3. Pub/Sub (*)
带 (*)
的表示允许暂无代码实现,但是要有文档说明
RMVL version: 1.1.1
OpenCV version: 4.8.0
OS / Platform: Ubuntu 22.04
Compiler version: GCC 11.4.0 x86_64-linux-gnu
在 modules/core/include/rmvl/core/serial.hpp
的第 79
行
constexpr int SIZE = sizeof(SerialPort);
SIZE
应该是数据包的大小,而不是 SerialPort
的大小,应该改为
constexpr int SIZE = sizeof(Tp);
初步计划提供
rm::fminbnd
rm::fminunc
rm::fmincon
对标 MATLAB 最优化工具箱
考虑开发成本,可以使用 Ceres 等最优化库作为辅助
目前在 combo
模块等其他模块中使用到的时间戳均为 int64
表示的变量,该类型在 OpenCV 中定义,并且能够通过使用 cv::getTickCount()
函数能够直接获得,然而其存在些许问题导致使用 getTickCount
来定时并不是一个可靠的方法,因为它只能提供 CPU 时钟计数的精度,并不能保证时间的准确性。一般情况下,这个函数可以用于简单的时间测量和计算程序运行时间,但它并不是用于实现高精度定时的最佳方法。原因如下:
getTickCount
返回的是 CPU 时钟计数,它的精度依赖于硬件和操作系统。在某些情况下,时钟计数可能会以较低的频率更新,导致时间测量的误差增加。getTickCount
忽略了系统的时间调整和时钟同步。例如,如果用户手动更改了系统时间或进行了时钟同步,getTickCount
不会受到影响,仍然按照自己的计数进行记录。getTickCount
进行定时,通常需要通过循环不断检查时间,这样会导致 CPU 被持续占用,产生额外的负载。std::chrono
提供的类型、函数和类,完成高精度计时和定时器的操作。ns
)级别的时间测量itimerval
结构体和 setitimer
函数,配合 SIGALRM
信号完成定时,但精度不高,并且会中断正在处理的代码,但可参考这一原理,完成定时器的设计。代码上仍然采用 std::chrono
。No response
Server
添加此功能rm::View
防止混淆,需要把 rm::Client
中有关 subscribe
的部分移除(目前是设置为了已弃用)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.