MahonyAHRS算法的实现
目标
- 观察程序中处理时间的方法
- 训练写C++的能力
eigen
Eigen::Quaterniond q1 = Eigen::Quaterniond (0.1,0.2,0.1,0.3).normalized(); //定义一个四元数并用normalized()归一化
出现的问题
开发的过程中,流程没有掌握好,对函数的熟悉程度也很低。所以造成了无法定位误差的结果。利用matlab的矩阵方法求解,明显效率是更高的。
最后出现NAN的错误,找不到问题在哪里,决定看一下作者本来的程序。
vscode的配置
-
https://blog.csdn.net/weixin_43374723/article/details/84064644
-
vscode远程开发;
ESKF程序的熟悉
程序设计中的一些做法。
constexpr 相当于const
在下面的定义中,可以有效的防止重复定义的问题,就方便了很多。
#pragma once
#include <Eigen/Core>
#include <Eigen/Dense>
namespace OriEst{
constexpr double kDeg2Rad = M_PI / 180.;
constexpr double kRad2Deg = 180. / M_PI;
constexpr double kGravity = 9.8;
inline Eigen::Matrix3d SkewMat(const Eigen::Vector3d& v) {
Eigen::Matrix3d w;
w << 0., -v(2), v(1),
v(2), 0., -v(0),
-v(1), v(0), 0.;
return w;
};
}
应对如此报错:
智能指针的常用方法
智能指针的用法:
//这个具体是啥意思?
std::make_unique
-
\1. make_unique 同 unique_ptr 、auto_ptr 等一样,都是 smart pointer,可以取代new 并且无需 delete pointer,有助于代码管理。
-
\2. make_unique 创建并返回 unique_ptr 至指定类型的对象,这一点从其构造函数能看出来。make_unique相较于unique_ptr 则更加安全。
-
\3. 编译器不同,make_unique 要求更新(Visual Studio 2015)。
#include <memory>
std::unique_ptr<Initializer> initializer_;
queue 队列对于数据的保存
在初始化的过程中,需要对加速度计的信号进行运算。
std::deque<Eigen::Vector3d , Eigen::aligned_allocator<Eigen::Vector3d>> acc_buffer_;
构造函数
构造函数等于default?
Initializer() = default;
头文件中的定义
#pragme once
aligned_allocator:内存分配器
配置文件写入到类中
struct Config {
size_t acc_buffer_size = 10;
double max_acc_std = 0.5;
};
const Config config_;
报错分析
: error: multiple types in one declaration };
出现了段错误:结果发现是在类中调用智能指针的时候,没有在构造函数中进行初始化导致的问题。
which is of non-class type
主函数声明类的时候多加了一个括号:(如果构造函数不需要参数,写成下面的就行了)
OriEst::MahonyAHRSupdate mahonyAHRS
IMU与GPS信息融合C++项目的实现
ENU笛卡尔坐标系:将GPS的WGS84坐标(大地坐标系)转换为平面坐标(笛卡尔坐标系)的方法。那么所谓的笛卡尔坐标系就是我们通常认为的参考坐标系。