基于STM32F407四旋翼无人机 --- 姿态解算讲解(四元数)(叉积法融合陀螺仪数据和加速度数据)(五)

2023-05-16

基于STM32F407四旋翼无人机 --- 姿态解算讲解(五)

  • 姿态解算
    • 姿态解算定义
    • 欧拉角
    • 四元数
      • 四元数性质
    • 方向余弦矩阵
      • 四元数方向余弦矩阵
    • 叉积法融合陀螺仪数据和加速度数据
      • 叉积运算
    • 一阶龙格库塔法
    • 四元数更新
    • 获得欧拉角

姿态解算

姿态解算定义

在机器人的姿态中是涉及了两个比较关键的坐标系,一个是机器人本身的坐标系,称为机体坐标系,该坐标系会跟随机器人的姿态变化而变化。另一个坐标系为地理坐标系,在看地图的时候我们只有一个固定的方位是东西南北,即该坐标系为东北天坐标系,X轴指向东方向,Y轴指向北方向,Z轴指向天,地理坐标系也可以称为导航坐标系。为什么要介绍这两个坐标系呢?第一是因为在做姿态解算的时候就是需要将机体坐标系和地理坐标系进行相互联系,计算出机体坐标系对于地理坐标系的变化。第二是做惯性导航需要将机体坐标系转到东北天坐标系(地理坐标系)。

这两个坐标系之间的转换其实就是对一个坐标系绕一个轴做旋转,两个坐标系的原点重合。而坐标系的定点转动可以通过一个矩阵来表示,矩阵中的各个元素包含了坐标系的姿态信息,对于机器人来说可以根据该矩阵中的一些元素计算出,横滚角,俯仰角和偏航角。将机体坐标系中的一个向量,左乘这个矩阵之后就可以推出该向量在地理坐标系中的大小。

我们的目的就是根据惯性元件(加速度计、陀螺仪和磁力计)输出的实时的输出数据来计算姿态矩阵,从而可以不断更新横滚、俯仰和偏航角。陀螺仪输出的为角速度。

欧拉角

欧拉角表示法具有简便、几何意义明显的优点,同时姿态敏感器可以直接测出这些参数,但是采用欧拉角的姿态描述方式存在一些问题,且需要好几次的三角函数运算,对于MCU而言,计算很多的三角函数很耗资源,而且计算量很大。而采用四元数表示方法则可以避免这些问题,因此开始采用四元数来描述飞行器的姿态。
根据欧拉定理,坐标系绕固定点的位移也可以是绕该点的若干次有限转动的合成。在欧拉转动中,在三次转动中每次的旋转轴是被转动坐标系的某一坐标轴,每次转动的角为欧拉角。

根据秦永元的《惯性导航》来讲解转换矩阵。

在这里插入图片描述
假设坐标系O-X1Y1Z1绕Z轴旋转α角度后得到坐标系O-X2Y2Z2,在O-X1Y1Z1则投影为Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30在坐标系O-X2Y2Z2投影为Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30
由于旋转轴为Z轴,那么Z轴的向量是没有变化的,有rz1 = rz2,根据图可以得出:Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30
将上面的三个式子写成矩阵的形式为:
在这里插入图片描述
对于机器人,若机体坐标系向地理坐标系变换的过程可以分为三步。
(1)第一步,将机器人绕Z轴逆时针旋转,最终得到偏航角(YAW),大小为α,则旋转矩阵为:Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30
(2)第二步,将机器人绕Y轴逆时针旋转,最终得到俯仰角(pitch),大小为ψ,则旋转矩阵为:Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30
(3)第三步,将机器人绕X轴逆时针旋转,最终得到横滚角(ROLL),大小为φ,则旋转矩阵为:Alt(https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =100x30比如说机体坐标系旋转前向量是a,经过三次旋转后的向量变成b,则此时的机体坐标系到地理坐标系的旋转矩阵为:c = Rx(φ)*Ry(ψ)*Rz(α)

矩阵相乘结果为:在这里插入图片描述
但是用欧拉角矩阵去解算的话会有一些问题,第一就是因为需要大量的三角函数运算,所以对于MCU来说是非常占用资源的,计算量很大,而且会有万向节锁死的问题,对此引入了用四元数去做姿态解算的方法。

四元数

(1)四元数定义:四元数是由四个元构成的数Q(q0,q1,q2,q3) = q0 + q1i + q2j + q3k;其中,q0,q1,q2,q3是实数,i,j,k既是互相正交的单位向量,又是虚单位根号-1。四元数即可看作四维空间中的一个向量,又可以看做一个超复数。对于后续有一个重要的变化需要记住:在这里插入图片描述

四元数性质

(2)四元数的范数:在这里插入图片描述
(3)规范化四元数:||Q|| = 1;
(4)坐标系旋转,坐标系OXYZ按照四元数Q转动,得到新坐标系OX’Y’Z’,设矢量V在两坐标系中的映像分别问Ve、Ve‘,则Ve’ = Q-1 * Ve * Q。

方向余弦矩阵

四元数方向余弦矩阵

在这里插入图片描述

一个矢量V相对于坐标系OXYZ固定:V = xi + yj + zk;坐标系OXYZ转动了Q得到一个新坐标系OX’Y’Z’:V = x’i’ + y’j‘ + z’k’;设四元数Ve、Ve‘
Ve = xi + yj + zk;
Ve’ = x’i + y’j + z’k;
则Ve’ = Q-1 * Ve * Q;

设Q = q0 + q1i + q2j + q3k;则Q-1 = q0 - q1i - q2j - q3k;
Ve’=x’i+y’j+z’k=(q0-q1i-q2j-q3k)(0+xi+yj+zk)(q0+q1i+q2j+q3k);则可以算出
x’=(q0 ^2+q1 ^2-q2 ^2-q3 ^2)x+2(q1q2+ q1q3)y+2(q1q3-q0q2)z
y’ = 2(q1q2-q0q3)x+(q0 ^2-q1 ^2+q2 ^2-q3 ^2)y+2(q2q3+q0q1)z
z’ = 2(q1q3+q0q2)x+2(q2q3-q0q1)y+(q0 ^2-q1 ^2-q2 ^2+q3 ^2)z

在这里插入图片描述
那么中间那一堆就是将地理坐标系通过四元素转换为机体坐标系的方向余弦矩阵。如果做惯导的话,那么x’,y’,z’则需要进行逆转换,再次将这三个矩阵相乘得到的方向余弦矩阵就是将机体坐标系转为东北天坐标系,这样不管我们在做惯导的时候如何旋转航向,在经过变换到地理坐标系求出的加速度的方向是不变的。

用方向余弦表示四元数: 对于小角度,四元数参数可以用下面的关系式推导:
q0 = 1/2 (1 + c11 + c22 + c33)^1/2;
q1 = 1/4q0 (c32 - c23);
q2 = 1/4q0 (c13 - c31);
q3 = 1/4q0 (c21 - c12);
而用方向余弦表示欧拉角:可以按照以下方法直接由方向余弦得出欧拉角  Roll = arctan[c32/c33];  Pitch = arcsin[-c31];  Yaw = arctan[c21/c11]; 

叉积法融合陀螺仪数据和加速度数据

由于加速度计短时间内数据不算可靠,但是长时间加速度计的数据是可靠的,而陀螺仪数据是由积分得来的,所以长时间的话积分误差会不断的叠加,不断增大,所以就要通过算法融合加速度计和陀螺仪来不断矫正陀螺仪数据。在此使用叉积法去做融合。
世界坐标系重力分向量是通过方向旋转矩阵的最后一列的三个元素乘上加速度就可以算出机体坐标系中的重力向量。

 Gravity.x = 2*(Nq.q1*Nq.q3 - Nq.q0*Nq.q2); //由下向上方向的加速度在加速度计X分量               
 Gravity.y = 2*(Nq.q0*Nq.q1 + Nq.q2*Nq.q3);   //由下向上方向的加速度在加速度计Y分量           
 Gravity.z = 1 - 2*(Nq.q1*Nq.q1 + Nq.q2*Nq.q2);  //由下向上方向的加速度在加速度计Z分量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图1中模型中的小球处于失重状态,坐标系与世界坐标系重合。
图2中坐标系仍与世界坐标系重合,描述为[x,y,z],不同的是小球收到重力作用,模型坐标系中重力向量为[0,0,1],世界坐标系中也是[0,0,1]。
图3中在世界坐标系中与地面夹角为45度,但是坐标系仍是[x,y,z],重力向量变为了[-0.71,0,-0.71],注意这个向量是模型坐标系的向量值,转换到世界坐标系仍是[0,0,1]。
所以无论加计怎么旋转重力向量在世界坐标系中都是[0,0,1],但是我们有加速度计读到的值是基于模型坐标系的,也就是我们所说的机体坐标系。现在就明白了,刚才为什么要用四元数将[0,0,1]乘一个旋转矩阵,我们之后关于加速度计和陀螺仪的计算都是基于机体坐标系的。

叉积运算

详细过程可以通过代码来了解:
(1)将加计的三维向量转为单位向量

 NormQuat = my_sqrt(my_pow(Acc.x) + my_pow(Acc.y) + my_pow(Acc.z));   
 //把加计的三维向量转成单位向量。
  Acc.x = Acc.x / NormQuat;
  Acc.y = Acc.y / NormQuat;
  Acc.z = Acc.z / NormQuat;

(2)叉积运算开始。

   /* 叉乘得到误差 */
   why_err_Acc.x = Acc.y*Gravity.z - Acc.z*Gravity.y;
   why_err_Acc.y = Acc.z*Gravity.x - Acc.x*Gravity.z;
   why_err_Acc.z = Acc.x * Gravity.y - Acc.y * Gravity.x;

(3)在对叉乘得到的误差进行低通滤波,其中的HalfTime 表示在姿态解算中运行周期的一半。

/* 误差低通 */
   ref.err_lpf.x += 6.28f *HalfTime *( why_err_Acc.x  - ref.err_lpf.x );
   ref.err_lpf.y += 6.28f *HalfTime *( why_err_Acc.y  - ref.err_lpf.y );
  ref.err_lpf.z += 6.28f *HalfTime *( why_err_Acc.z  - ref.err_lpf.z );

(4)开始对误差进行积分运算,并进行积分限幅,在进行kp控制

#define IMU_INTEGRAL_LIM  0.034906585f
#define ANGLE_TO_RADIAN 0.017453293f

ref.err_Int.x += ref.err.x *Ki *2 *HalfTime ;
 ref.err_Int.y += ref.err.y *Ki *2 *HalfTime ;
 ref.err_Int.z += ref.err.z *Ki *2 *HalfTime ;
/* 积分限幅 */
 ref.err_Int.x = LIMIT(ref.err_Int.x, - IMU_INTEGRAL_LIM ,IMU_INTEGRAL_LIM );
 ref.err_Int.y = LIMIT(ref.err_Int.y, - IMU_INTEGRAL_LIM ,IMU_INTEGRAL_LIM );
 ref.err_Int.z = LIMIT(ref.err_Int.z, - IMU_INTEGRAL_LIM ,IMU_INTEGRAL_LIM );
 /***************与上式构成PI控制******************/
 ref.g.x = (Gyro.x - Gravity.x * yaw_correct ) *ANGLE_TO_RADIAN + ( Kp*(ref.err.x + ref.err_Int.x) ) ;  
 ref.g.y = (Gyro.y - Gravity.y * yaw_correct ) *ANGLE_TO_RADIAN + ( Kp*(ref.err.y + ref.err_Int.y) ) ;    
 ref.g.z = (Gyro.z - Gravity.z * yaw_correct ) *ANGLE_TO_RADIAN;

一阶龙格库塔法

已知一四元数:在这里插入图片描述
对时间微分得:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述则有在这里插入图片描述
由一阶龙格库塔法在这里插入图片描述
在这里插入图片描述,则可以推导出:在这里插入图片描述

四元数更新

 // 一阶龙格库塔法, 更新四元数
   //矫正后的角速度值积分,得到两次姿态解算中四元数一个实部Q0,三个虚部Q1~3的值的变化
 Nq.q0 = Nq.q0 +(-Nq.q1*ref.g.x - Nq.q2*ref.g.y - Nq.q3*ref.g.z)*HalfTime;
 Nq.q1 = Nq.q1 + (Nq.q0*ref.g.x + Nq.q2*ref.g.z - Nq.q3*ref.g.y)*HalfTime;
 Nq.q2 = Nq.q2 + (Nq.q0*ref.g.y - Nq.q1*ref.g.z + Nq.q3*ref.g.x)*HalfTime;
 Nq.q3 = Nq.q3 + (Nq.q0*ref.g.z + Nq.q1*ref.g.y - Nq.q2*ref.g.x)*HalfTime; 
 /* 四元数规一化 normalise quaternion */
 NormQuat = my_sqrt(my_pow(Nq.q0) + my_pow(Nq.q1) + my_pow(Nq.q2) + my_pow(Nq.q3));
 
 Nq.q0 = Nq.q0 / NormQuat;
 Nq.q1 = Nq.q1 / NormQuat;
 Nq.q2 = Nq.q2 / NormQuat;
 Nq.q3 = Nq.q3 / NormQuat;

获得欧拉角

四元数转换为方向余弦矩阵的关键元素:

/**********四元数的旋转矩阵转换***************/
static void IMU_ComputeRotationMatrix(void)
{
 Eln_angle[0] = 2*(Nq.q0*Nq.q1 + Nq.q2*Nq.q3);
 Eln_angle[1] = 1 - 2*(Nq.q1*Nq.q1 + Nq.q2*Nq.q2);
 Eln_angle[2] = 2*(Nq.q1*Nq.q3 - Nq.q0*Nq.q2);
 Eln_angle[3] = 2*(-Nq.q1*Nq.q2 - Nq.q0*Nq.q3);
 Eln_angle[4] = 2*(Nq.q0*Nq.q0 + Nq.q1*Nq.q1) - 1;
}

/***********获得欧拉角**********/
void Get_Angle(void)
{
 IMU_ComputeRotationMatrix(); //四元数转旋转矩阵
 
 IMU_data.Pitch = asin(Eln_angle[2])*DEG_PER_RAD;
 IMU_data.Roll= fast_atan2(Eln_angle[0],Eln_angle[1])*DEG_PER_RAD;
 IMU_data.Yaw = fast_atan2(Eln_angle[3],Eln_angle[4])*DEG_PER_RAD;
}

最终得到横滚、俯仰和偏航角。但是需要注意的有一点,如果单独依靠陀螺仪和加速度计解算出来的姿态横滚和俯仰是没有问题的,但是航向是一直在漂移的,这个是因为解算出来就会漂移的,所以一般都使用磁力计去限航。通过之前的博客我们获取的磁力计数据。

/*磁力计限制偏航函数*/
void Mag_Limit(float DT)
{
  static xyz_t Mag;
  //计算磁力计向量的模 
  Mag_norm_xyz = my_sqrt(my_pow(WHY.MAGX) + my_pow(WHY.MAGY) + my_pow(WHY.MAGZ));
    
   if( Mag_norm_xyz != 0)
 {
  Mag.x += 20 *(6.28f *DT) *( (float)WHY.MAGX /( Mag_norm_xyz ) - Mag.x);
  Mag.y += 20 *(6.28f *DT) *( (float)WHY.MAGY /( Mag_norm_xyz ) - Mag.y); 
  Mag.z += 20 *(6.28f *DT) *( (float)WHY.MAGZ /( Mag_norm_xyz ) - Mag.z); 
 }
 mag_trans(&Gravity,&Mag,&Mag_process);
 Mag_norm = my_sqrt(Mag_process.x * Mag_process.x + Mag_process.y *Mag_process.y);
 if( Mag_process.x != 0 && Mag_process.y != 0 && Mag_process.z != 0 && Mag_norm != 0)
 {
  yaw_mag = fast_atan2( ( Mag_process.y/Mag_norm ) , ( Mag_process.x/Mag_norm) ) * DEG_PER_RAD;
 } 
 yaw_correct = Kp *0.8f *To_180_degrees(yaw_mag - IMU_data.Yaw);
 }

有很多的上位机可以通过你传输的欧拉角去看此时机器人的姿态,比如匿名的上位机,有能力的也可以自己写一个上位机,按照通信协议将所需显示的数据在PC端进行显示。

姿态解算C代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F407四旋翼无人机 --- 姿态解算讲解(四元数)(叉积法融合陀螺仪数据和加速度数据)(五) 的相关文章

  • C++面试常见题目

    C 43 43 面试常见题目 c 43 43 编译过程自动类型推导auto和decltype重载 重写 xff08 覆盖 xff09 和隐藏的区别C 43 43 构造函数和析构函数能调用虚函数吗volatile关键词运算符重载格式noexe
  • 计算机网络面试常问问题

    C 43 43 面试 计算机网络常见问题 计算机网络常见问题TCP IP协议笔记TCPTCP的特点及目的序列号与确认应答提高可靠性为什么是三次握手和四次挥手滑动窗口流量控制拥塞控制TCP粘包问题 httphttp和https的区别https
  • Trajectory generation for quadrotor while tracking a moving target in cluttered environment

    四旋翼在杂波环境下跟踪运动目标的轨迹生成 摘要1 文章主要贡献2 前言2 1 轨迹公式2 2 实现结构 3 跟踪轨迹生成3 1 标称路径点生成3 2 可行路径点生成3 3 安全飞行走廊生成3 4 代价函数3 5 强制约束3 6 求解跟踪轨迹
  • 翻译-Frustum PointNets for 3D Object Detection from RGB-D Data

    Frustum PointNets for 3D Object Detection from RGB D Data 摘要介绍相关工作从RGB D数据中检测三维物体基于前视图图像的方法 xff1a 基于鸟瞰图的方法 基于3D的方法 点云的深度
  • Online Trajectory Generation of a MAV for Chasing a Moving Target in 3D Dense Environments

    微型无人机的在线轨迹生成 xff0c 用于在3D密集环境中追踪运动目标 摘要一 介绍二 相关工作A 在障碍物环境中追逐B 通过预先规划安全地生成轨迹 三 问题陈述A 问题设置B 能力C 命名 IV 视点生成A 可见度指标B 具有安全性和可见
  • 配置目标跟踪开源项目traj_gen_vis踩过的坑

    项目地址 https github com icsl Jeon traj gen vis 安装依赖需注意的问题 traj gen with qpoases 需安装ros分支的代码 xff08 这个作者并没有指出 xff0c 坑 xff09
  • cmake arm-none-eabi-gcc for stm32 cpp project

    尝试把原有的stm32工程F1canBootloader用cmake来管理 xff0c 遇到了以下几个坑 xff1a 1 报错 xff0c undefined reference to 96 dso handle 39 CMakeFiles
  • 网络攻防之wireshark抓取登录信息

    使用wireshark抓取登录信息 简介 xff1a Wireshark xff08 前称Ethereal xff09 是一个网络封包分析软件 网络封包分析软件的功能是撷取网络封包 xff0c 并尽可能显示出最为详细的网络封包资料 Wire
  • 头文件互相包含所引发的的问题(深入剖析)

    今天写程序出现了一个让人蛋疼的错误 xff0c 后来发现是由于头文件互相包含所引起的 原本只是简单的以为头文件互相包含只会触发 xff0c 头文件的递归包含 即 xff0c A包含B xff0c 所以才A的头文件里会将B的头文件内容拷贝过来
  • C++11异步操作future和aysnc 、function和bind

    C 43 43 11异步操作future和aysnc function和bind 前言异步操作std future和std aysnc 介绍std future和std aysnc的使用Demostd packaged task 介绍std
  • C++文件服务器项目—FastDFS—1

    C 43 43 文件服务器项目 FastDFS 1 前言1 项目架构2 分布式文件系统2 1 传统文件系统2 2 分布式文件系统 3 FastDFS介绍3 1 fdfs概述3 2 fdfs框架中的三个角色3 3 fdfs三个角色之间的关系3
  • C++文件服务器项目—Redis—2

    C 43 43 文件服务器项目 Redis 2 前言1 数据库类型1 1 基本概念1 2 关系 非关系型数据库搭配使用 2 redis基础知识点2 1 redis安装2 2 redis中的两个角色2 3 redis中数据的组织格式2 4 r
  • C++文件服务器项目—Nginx—3

    C 43 43 文件服务器项目 Nginx 3 前言1 Nginx一些基本概念1 1 Nginx初步认识1 2 正向代理概念理解1 3 反向代理概念理解 2 Nginx的安装与配置2 1 Nginx与相关依赖库的安装2 2 Nginx相关的
  • C++文件服务器项目—FastCGI—4

    C 43 43 文件服务器项目 FastCGI 4 前言1 CGI 概念理解2 FastCGI 概念理解3 FastCGI和spawn fcgi安装4 FastCGI和 Nginx的关系5 Nginx数据转发 修改配置文件6 spawn f
  • C++文件服务器项目—Nginx+FastDFS插件—5

    C 43 43 文件服务器项目 Nginx 43 FastDFS插件 5 前言1 文件上传下载流程1 1 文件上传流程1 2 文件下载流程1 3 文件下载优化流程 2 Nginx和fastDFS插件2 1 安装Nginx和fastdfs n
  • C++文件服务器项目—数据库表设计 与 后端接口设计—6

    C 43 43 文件服务器项目 数据库表的设计 6 前言1 数据库建表1 1 用户信息表 user info1 2 文件信息表 file info1 3 用户文件列表表 user file list1 4 用户文件数量表 user file
  • C语言中宏定义的使用

    1 引言 预处理命令可以改变程序设计环境 提高编程效率 它们并不是 C 语言本身的组成部分 不能直接对 它们进行编译 必须在对程序进行编译之前 先对程序中这些特殊的命令进行 预处理 经过预处理后 程序就不再包括预处理命令了 最后再由编译程序
  • C++文件服务器项目—项目总结与反向代理—7

    C 43 43 文件服务器项目 项目总结与反向代理 7 1 项目总结2 项目提炼3 web服务器的反向代理4 存储节点的反向代理 组件介绍基本写完了 xff0c 后续进行深入 本专栏知识点是通过零声教育的线上课学习 xff0c 进行梳理总结
  • https相关内容

    https相关内容 前言基础概念理解https传输过程 前言 本文写https相关内容 xff0c 持续补充 基础概念理解 对称加密 加解密秘钥是同一个 非对称加密 公钥 私钥 sa gt 公钥私钥都是两个数字ecc gt 椭圆曲线 两个点
  • TinyKv介绍

    TinyKv介绍 前言tinykv架构代码结构如何去写TinyKv参考内容 前言 开一个新坑 xff0c 将tinykv的4个project全部实现 虽然今天我点进去看的时候就萌生退意 好在没有放弃之前 xff0c 把project1完成了

随机推荐

  • TinyKv Project1 Standalone KV

    TinyKv Project1 Standalone KV 前言Project1 StandaloneKV 文档翻译文档的重点内容StandAloneStorageWriteReader Server单元测试 前言 project1还是比较
  • TinyKv Project2 PartA RaftKV

    TinyKv Project2a RaftKV 前言Project2 RaftKV 文档翻译Project2A重点内容抛出RaftLogRaftLog结构体字段详解RaftLog核心函数详解 RaftRaft 驱动规则Msg的作用与含义Ms
  • TinyKv Project2 PartB RaftKV

    TinyKv Project2 PartB RaftKV 前言Project2 PartB RaftKV 文档翻译PartB 到底想让我们做什么 xff1f 分析要实现的函数到底要干什么事情proposeRaftCommand 将上层命令打
  • TinyKv Project2 PartC RaftKV

    TinyKv Project2 PartC RaftKV 前言Project2 PartC RaftKV 文档翻译raft节点如何自动的compact压缩自己的entries日志生成快照与快照收收发日志压缩与快照收发总结疑难杂症 前言 pr
  • TinyKv Project3 PartA Multi-raft KV

    TinyKv Project3 PartA Multi raft KV 前言Project3 PartA Multi raft KV 文档翻译Add RemoveLeaderTransfer 前言 Project3是整个项目最难的部分 xf
  • TinyKv Project3 PartB Multi-raft KV

    TinyKv Project3 PartB Multi raft KV 前言Project3 PartB Multi raft KV 文档翻译发送请求LeaderTransfer 禅让ConfChange 集群成员变更Split regio
  • TinyKv Project3 PartC Multi-raft KV

    TinyKv Project3 PartC Multi raft KV 前言Project3 PartC Multi raft KV 文档翻译processRegionHeartbeatSchedule 前言 3C要求我们实现调度 3c按照
  • nodejs api学习:fs.createReadStreame()

    作用 这个api的作用是打开一个可读的文件流并且返回一个fs ReadStream对象 参数 createReadStream path option 该用来打开一个可读的文件流 xff0c 它返回一个fs ReadStream对象 64
  • TinyKv Project4 Transactions

    TinyKv Project4 Transactions 前言Project4 Transactions 文档翻译Project 4 TransactionsTinyKV中的事务Part APart BPart C Percolator x
  • sealos issue #2157 debug 思路流程记录

    sealos issues 2157 debug思路流程 前言分析issue剖析源码解决方案总结 前言 这个项目蛮有意思的 xff0c sealos 是以 kubernetes 为内核的云操作系统发行版 boss上看到 gt 沟通 gt 解
  • 系统设计场景题—MySQL使用InnoDB,通过二级索引查第K大的数,时间复杂度是多少?

    系统设计场景题 MySQL使用InnoDB xff0c 通过二级索引查第K大的数 xff0c 时间复杂度是多少 xff1f 前言明确场景对齐表的结构分析时间复杂度执行一条 select 语句 xff0c 期间发生了什么 xff1f 分析性能
  • 《嵌入式系统》 |(四) STM32软件架构 知识梳理

    系列索引 嵌入式系统 嵌入式系统 重点知识梳理 目录 CMSIS软件架构库文件说明 CMSIS软件架构 CMSIS概述 CMSIS软件架构由四层 xff1a 用户应用层 操作系统及中间件接口层 CMSIS层和硬件层 由三部分构成 核内外设访
  • Cmake链接第三方库的三种方法

    Cmake链接第三方库的三种方法 本文介绍链接第三方库的3种方法 以OpenBLAS举例 使用的工程名称为Test lib xff08 可执行文件名字 xff09 xff0c 主程序为library c 代码中的各路径请自行替代 xff1a
  • SADP功能使用

    SADP主要使用的是链路层多播及UDP多播的原理进行实现的 1 链路层多播 span class token function socket span span class token punctuation span PF PACKET
  • MatlabR2022b + Visual Studio环境配置

    在Matlab中输入 mex setup c 43 43 命令确认MEX使用VS2022编译环境 VC 43 43 目录 包含目录 添加 D Matlab2022b extern include VC 43 43 目录 库目录 添加 D M
  • ROS小车自主导航

    在进行ROS小车自主导航时 xff0c 需要用到三维可视化软件rviz xff0c 然而出现了问题 问题 xff1a 在运行rosrun rviz rviz xff0c 导入自己导航的程序后 xff0c 需要通过2D Pose Estima
  • SIYI AK28 遥控器接收机的SBUS口与STM32通讯

    SBUS介绍 SBUS是Futaba公司定义的一种串口通信协议 xff0c Futaba的产品应用越来越广泛 xff0c 不论是航模 xff0c 无人机 xff0c 还是机器人 xff0c 遥控车 xff0c 总能有它的身影 SBUS是一个
  • 基于STM32F407四旋翼无人机---AK8975磁力计(四)

    基于STM32F407四旋翼无人机 AK8975磁力计 xff08 四 xff09 磁力计基本介绍1 2 磁力计原理图 2 磁力计数据获取3 磁力计椭球拟合校准3 1 简单介绍椭球拟合 磁力计基本介绍 该模块采用高灵敏度霍尔传感器技术 xf
  • 硬链接与软链接

    硬链接 hard link 与软链接 xff08 又称符号链接 xff0c 即 soft link 或 symbolic link xff09 链接为 Linux 系统解决了文件的共享使用 xff0c 还带来了隐藏文件路径 增加权限安全及节
  • 基于STM32F407四旋翼无人机 --- 姿态解算讲解(四元数)(叉积法融合陀螺仪数据和加速度数据)(五)

    基于STM32F407四旋翼无人机 姿态解算讲解 xff08 五 xff09 姿态解算姿态解算定义欧拉角四元数四元数性质 方向余弦矩阵四元数方向余弦矩阵 叉积法融合陀螺仪数据和加速度数据叉积运算 一阶龙格库塔法四元数更新获得欧拉角 姿态解算