Coder Social home page Coder Social logo

rmvl's People

Contributors

zhaoxi-scut avatar zkkkk1 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

rmvl's Issues

合并 `core` 和 `rmath` 模块

描述待优化、重构的内容

目前 core 模块包含了部分数值计算的内容,而 rmath 模块本身就是一个数学库,二者在功能上有重叠,建议将基础数学库、数值计算、数据处理与信号处理、数据结构与算法合并,统一放置在 core 模块中

解决的大致思路

No response

数据导出导入改为文本文件

描待优化、重构的内容

GyroData 的数据导出、导入和角点导出、导入均取消与 OpenCV cv::FileStorage 的绑定,改为更简单的 txt 文件即可。由此实现与 OpenCV 的解耦。

解决的大致思路

使用标准库的文件输入输出流对象完成这一功能

为数据组件添加指向常量的共享指针别名

Describe the feature and motivation - 描述功能特点和出发点

起初这个东西是想到了 STL 中的 vector<T>::const_iterator,它跟 const vector<T>::iterator 的区别就好比 T *const ptrconst T *ptr的关系,同理,智能指针应该也要有此功能。

以数据组件的共享指针为例,即提供:

//! 特征共享指针
using feature_ptr = std::shared_ptr<feature>;
//! 常量特征共享指针
using const_feature_ptr = std::shared_ptr<const feature>;

Additional context - 附加内容

No response

添加光源控制器设备二次开发库至 modules/light 下

Describe the feature and motivation - 描述功能特点和出发点

出发点

目前缺少光源控制器的二次开发库,需要添加相关功能

需求

  • 添加 light 模块至 modules
  • 完成相关文档

Additional context - 附加内容

No response

RMStatus 在 GCC13 下无法通过编译

System Information - 系统配置信息

配置 版本
RMVL 1.1.0-dev
OpenCV 4.7.0
OS / Platform Ubuntu 22.04
Compiler GCC 13.2.0

Detailed description - 问题的详细描述

有如下报错提示

/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’的成员

Steps to reproduce - 复现步骤

在 GCC 13.2.0 编译器环境下,运行

cd <path/to/rmvl>
rm -rf build
mkdir build && cd build
cmake ..
make rmvl_types

即可出现报错

Issue submission checklist - 工单提交清单

  • I report the issue, it's not a question - 我报告了这个 Bug,但这不是个人疑问
  • I checked the problem with documentation, open issues, etc and have not found any solution - 我用文档、未解决的问题等检查了问题,但没有找到任何解决方案
  • I updated to the latest RMVL version and the issue is still there - 我更新到最新的 RMVL 版本,问题仍然存在
  • There is reproducer code and related data files (videos, images, etc) - 我提供了相关代码和数据文件(视频,图像等)

CMake 阶段完成针对 C++ 版本的语言特性测试

描述功能特点和出发点

现状

目前 CMake 确实具有语言特性的测试,但是很局限,目前的语言标准测试内容是

  • C++17:inline 变量
  • C++20:范围库(这里都不是语言特性,是库支持)
  • C++23:<print> 打印库(这个也是库支持)

计划

目前希望针对各个 C++ 版本的语言特性的支持需要使用多个内容进行测试,例如 位域的默认成员初始化器 是 C++20 标准的内容,但在 GCC 8 中即可享受该功能,目前的 Github Actions 用于测试的编译器仅包含了

  • GCC 9.4.0
  • GCC 12.3.0
    两个版本,因此该部分也同样需要进一步配置,例如添加 GCC 7.5.0 的编译器

工作清单

  • 语言特性测试完善
  • Github Actions 完善

core 模块与 OpenCV 解耦

描待优化、重构的内容

  • core 与 OpenCV 解耦,KalmanFiler 移出 core,单独开设 algorithm 模块
  • 重启 dataio 模块,主要负责硬件上的数据通信和存储,将现在的 SerialPortGyroData 移至其中。

解决的大致思路

CMake 需要删除有关 OpenCV 的 dependence,改为

rmvl_add_module(core)

algorithm 模块和 dataio 中依赖 OpenCV 即可

数据组件应提供默认派生类,以实现各自数据组件的退化使用

Describe the feature and motivation - 描述功能特点和出发点

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>

Additional context - 附加内容

以下展示了这些默认类可能的声明

feature - 图像特征

//! 默认图像特征,仅表示一个孤立的点 `cv::Point2f`
class DefaultFeature final : public feature;

combo - 组合体

//! 默认组合体,包含一个固定的特征,退化为 `feature` 使用
class DefaultCombo final : public combo;

*tracker - 追踪器

//! 默认追踪器,时间序列仅用于存储组合体,可退化为 `combos` 使用
class DefaultTracker final : public tracker;

视觉标签识别的第三方库需要添加到 3rdparty 中

Describe the feature and motivation - 描述功能特点和出发点

目前 TagDetector 使用到了第三方库的代码,这部分内容需要添加到 3rdparty 中,因此需要开设新的文件夹,并需要完成相应的 CMake 配置

Additional context - 附加内容

No response

对数据组件设计一个形如原型模式的复制方法,即实现 clone 方法

Describe the feature and motivation - 描述功能特点和出发点

在重构 armor_tracker 模块的时候,发现其几乎没有依赖任何 rm::Armor 的内容,实际上该追踪器模块仅为一个二维平面物体的追踪,因此计划将 armor_tracker 模块改为 planar_tracker 即平面目标追踪,但是目前遇到了一个问题。

vanishProcess 函数内,涉及到了从 rm::Armor 构造另一个 rm::Armor 的功能,其数据完全一致,仅有时间戳 tick 的不一致,因此计划为数据组件增加一个复制/构造方法,那么为了实现从一个对象复制到另一个对象的行为有

  • 复制构造 T t2(t1);
  • 原型模式 t2 = t1.clone(); 方法

大致两种操作,实际上,所有非特征的数据组件维护的原始数据均是由更底层的数据组件的共享指针的列表组成的。此外,显式弃置了复制、移动构造也限定了数据组件的构造方式仅为使用工厂函数一种方法,因此或许第二种方案,即原型模式会比较好。

Additional context - 附加内容

可能的设计 (1)

数据组件抽象类提供形如

virtual xxx_ptr clone() = 0;

的纯虚拟函数接口,由各自派生类实现,这种操作的好处是统一接口,并且是多态的,即可以从基类指针进行 clone 操作,返回的指针也是直接指向对应派生类对象的,但存在

  • 每个 clone() 函数可能会有不同的入参,由于虚拟函数接口尽量不要设计成有默认参数的形式,因此这需要每类数据组件的 clone 方法在使用是需要进行统一的操作,但可能不同数据组件之间的入参会有不一致的现象。
  • 无法做到协变返回类型,众所周知,RMVL 操作对象基本都是智能指针,智能指针无法实现按返回值协变。

可能的设计 (2)

为了解决 $(1)$ 的问题其实有个更加粗暴的方法,就是每个派生类各自实现 clone 方法,这样能最大程度的解决以上问题,并且还可以为自己的 clone 方法添加默认参数,但这样的话就不能使用抽象类了。假设说如果真的需要从抽象类的共享指针完成构造,可能会有

/* combo_ptr p_combo; */
auto p_new_armor = Armor::cast(p_combo)->clone();

这种写法。优雅一点的话,可以使用类似

auto p_new_armor = Armor::copyFrom(p_combo);

的写法。

Rmvl

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$$

并提供对应的雅可比矩阵,即原先的状态转移矩阵。观测方程同理。

添加 OPC UA 使用说明文档

描述文档的问题

  • 目前缺乏 OPC UA 相关使用的说明文档,这一部分在 open62541 中概念极其繁多,需要与 opcua 模块中的概念结合起来
  • 提供 opcua 模块的使用教程

解决建议

可大致分为以下内容介绍

## 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);

复现步骤


工单(Issue)提交清单

  • 我报告了代码中的 Bug,我保证这不是个人的疑问
  • 我用文档、未解决的问题等检查了问题,但没有找到任何解决方案
  • 我更新到最新的 RMVL 版本,问题仍然存在
  • 我提供了相关代码和数据文件(视频,图像等)

添加最优化工具库(头文件)`optimal.hpp`

描述功能特点和出发点

初步计划提供

  • 一维最优化,对应函数:rm::fminbnd
  • 无约束二维最优化,对应函数:rm::fminunc
  • 有约束二维最优化,对应函数:rm::fmincon

对标 MATLAB 最优化工具箱

附加内容

考虑开发成本,可以使用 Ceres 等最优化库作为辅助

重写定时器 Timer,修改时间戳表示方式,取消其与 cv::getTickCount 的强关联

Describe the feature and motivation - 描述功能特点和出发点

出发点

目前在 combo 模块等其他模块中使用到的时间戳均为 int64 表示的变量,该类型在 OpenCV 中定义,并且能够通过使用 cv::getTickCount() 函数能够直接获得,然而其存在些许问题导致使用 getTickCount 来定时并不是一个可靠的方法,因为它只能提供 CPU 时钟计数的精度,并不能保证时间的准确性。一般情况下,这个函数可以用于简单的时间测量和计算程序运行时间,但它并不是用于实现高精度定时的最佳方法。原因如下:

  1. 精度有限:getTickCount 返回的是 CPU 时钟计数,它的精度依赖于硬件和操作系统。在某些情况下,时钟计数可能会以较低的频率更新,导致时间测量的误差增加。
  2. 不受外部时钟影响:getTickCount 忽略了系统的时间调整和时钟同步。例如,如果用户手动更改了系统时间或进行了时钟同步,getTickCount 不会受到影响,仍然按照自己的计数进行记录。
  3. CPU 占用问题:使用 getTickCount 进行定时,通常需要通过循环不断检查时间,这样会导致 CPU 被持续占用,产生额外的负载。

功能特点

  • 使用 std::chrono 提供的类型、函数和类,完成高精度计时和定时器的操作。
  • 其可移植性更高,且提供了纳秒(ns)级别的时间测量

一些讨论

  • Linux 中可以使用 itimerval 结构体和 setitimer 函数,配合 SIGALRM 信号完成定时,但精度不高,并且会中断正在处理的代码,但可参考这一原理,完成定时器的设计。代码上仍然采用 std::chrono

Additional context - 附加内容

No response

完成 opcua-2.0 以支持 PubSub 功能

描述功能特点和出发点

  • 新的 OPC UA 支持 Pub/Sub 功能,在 open62541 中也提供了此功能,因此可以为 Server 添加此功能
  • 增加视图节点 rm::View

附加内容

防止混淆,需要把 rm::Client 中有关 subscribe 的部分移除(目前是设置为了已弃用

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.