无人机姿态解算_互补滤波(1)

一、 基础知识

1. 坐标系:遵循右手定则

1.1 大地坐标系(地球坐标系):北(x轴)东(y轴)地(z轴),就是向下指向地
1.2 机体坐标系: 前(x轴)右(y轴)下(z轴)
1.3 IMU坐标系:该坐标系就是IMU本身的坐标系,一般无人机的IMU都是在飞控的中间,因此,IMU坐标系和机体坐标系可以看做有相同的原点,只需要简单的改变一下坐标轴的正负号就能和机体坐标系一致了,并不需要复杂的旋转。
在这里插入图片描述

在这里插入图片描述

2.姿态: 横滚(roll)俯仰(pitch) 偏航(yaw)

在这里插入图片描述
如果所示:
横滚(roll): 绕x轴旋转的动作叫横滚,向右横滚为正方向,向左横滚为负方向;
俯仰(pitch):绕y轴旋转的动作叫做俯仰,向上(抬头)为正方向,向下为负方向;
偏航(yaw): 绕z轴旋转的动作叫做偏航,向右偏航为正方向,向下偏航为负方向。

3. 旋转矩阵

一般定义旋转矩阵为
在这里插入图片描述
然后欧拉角和四元数都可以表示旋转矩阵,欧拉角和四元数可以互换。然后一般在无人机上,都是用四元数来表示欧拉角的。

4. 欧拉角:横滚角(roll angle)俯仰角(pitch angle) 偏航角(yaw angle)

3.1 姿态角也叫欧拉角。
横滚角(roll angle): 绕x轴横滚的角度,向右横滚为正方向,向左横滚为负方向;
俯仰角(pitch angle):绕y轴俯仰的角度,向上(抬头)为正方向,向下为负方向;
偏航角(yaw angle): 绕z轴偏航的角度,向右(顺时针)偏航为正方向,向左(逆时针)偏航为负方向。

3.2 欧拉角表示旋转,旋转顺序是Z-Y-X。
下面的矩阵是机体系到地球系的旋转矩阵。
在这里插入图片描述

在这里插入图片描述

如果将一个机体系转到地球系就是用上面的矩阵。

下面是地球系到机体系的旋转矩阵。

在这里插入图片描述
下面的意思就是将地球系vg通过地球系到机体系的旋转矩阵旋转至机体系。
在这里插入图片描述

5. 四元数

4.1 四元数:q0,q1,q2,q3,软件中默认初值分别是0,1,1,1。
四元数的更新(即q0,q1,q2,q3怎么来):根据陀螺仪的数据来更新四元数
△t : 是读取陀螺仪的时间,也是调用姿态解算的时间。
wx,wy,wz:分别是陀螺仪测量到的值,单位是弧度每秒,rad/s. 如果用的是度每秒,那么最终的姿态是:你稍微动一下,姿态就变化很大。
在这里插入图片描述

4.2 四元数表示的矩阵

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

6. 用四元数表示欧拉角

欧拉角是地球系下的表示;传感器的数值是在机体系上表示的,因此,需要将机体系转换到地球系。所以要用到下面的旋转矩阵。

在这里插入图片描述

在这里插入图片描述
对比红框的内容就可以用四元数表示欧拉角了:
在这里插入图片描述

二、Mahony 互补滤波算法

开源代码位置:https://x-io.co.uk/open-source-imu-and-ahrs-algorithms/
源文件在 《四、代码 》 Algorithm/madgwick_algorithm_c的压缩包中。
在这里插入图片描述

传入的数据:校准且滤波后的九轴数据。其中,陀螺仪的单位要从度转换成弧度,不然的话,稍微动一动IMU,姿态就变换很大。

	gyro.x = gyro.x * DEG2RAD;	/* 度转弧度 */
	gyro.y = gyro.y * DEG2RAD;
	gyro.z = gyro.z * DEG2RAD;

三、 PID控制:Mahony互补滤波中只用到了P和I。

代码中的下面三个参数是需要根据实际来进行修改的。
在这里插入图片描述
这里我只用到了比例调节。下面是根据横滚角输出的PID图,可以看到姿态到达目标姿态还是很快的。

在这里插入图片描述

四、代码

gitee 搜索 stm32_minidrone

如果错误,请指正。

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要订阅 `/mavros/imu/data` 话题并读取飞控的俯仰和偏滚角信息,你可以按照以下步骤进行: 1. 确保你已经安装了ROS,并且已经配置好了工作空间。 2. 创建一个新的ROS包,可以使用以下命令: ``` $ catkin_create_pkg imu_subscriber roscpp sensor_msgs ``` 3. 进入你的工作空间,并构建ROS包: ``` $ cd ~/catkin_ws $ catkin_make ``` 4. 进入创建的ROS包的源代码目录: ``` $ cd ~/catkin_ws/src/imu_subscriber/src ``` 5. 创建一个名为 `imu_subscriber.cpp` 的源代码文件,并使用你喜欢的文本编辑打开它。 6. 在 `imu_subscriber.cpp` 文件中,导入必要的头文件: ```cpp #include <ros/ros.h> #include <sensor_msgs/Imu.h> ``` 7. 创建一个回调函数来处理接收到的飞控数据。该函数将被调用每当接收到新的消息时。 ```cpp void imuCallback(const sensor_msgs::Imu::ConstPtr& msg) { // 读取俯仰和偏滚角信息 double roll = msg->orientation.x; double pitch = msg->orientation.y; // 在这里处理俯仰和偏滚角信息 // 例如,可以打印这些信息 ROS_INFO("Roll: %f, Pitch: %f", roll, pitch); } ``` 8. 在 `main` 函数中,初始化ROS节点,并创建一个订阅者来订阅 `/mavros/imu/data` 话题,并指定回调函数。 ```cpp int main(int argc, char** argv) { ros::init(argc, argv, "imu_subscriber"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/mavros/imu/data", 10, imuCallback); ros::spin(); return 0; } ``` 9. 保存并关闭 `imu_subscriber.cpp` 文件。 10. 返回到你的工作空间根目录,并构建ROS包: ``` $ cd ~/catkin_ws $ catkin_make ``` 11. 运行ROS节点: ``` $ rosrun imu_subscriber imu_subscriber ``` 现在,你已经编写了一个用于订阅 `/mavros/imu/data` 话题并读取飞控的俯仰和偏滚角信息的C++程序。当有新的飞控数据发布到该话题时,`imuCallback` 函数将被调用。你可以在 `imuCallback` 函数中添加你想要执行的逻辑来处理接收到的俯仰和偏滚角信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值