您的位置:

全能编程开发工程师之gimballock

一、什么是gimballock

在飞行器控制中,经常会使用到互相垂直的三个陀螺仪。由于历史原因,这三个陀螺仪的输出信息通常分别称为pitch、yaw和roll(俯仰、偏航和翻滚)。在飞行器姿态控制时,一般会根据姿态传感器输出的角度信息计算目标姿态与当前姿态的角度差,进而通过PID等控制方法对飞行器进行控制,使其达到目标姿态。

然而,飞行器姿态控制过程中常常会遭遇一种困境——gimbal lock。当飞行器的姿态遭遇到gimbal lock时,三个陀螺仪的输出信息就会出现奇异点,控制器很难确定当前准确的姿态信息,因而会导致飞行器失控。

二、gimballock的产生原因

想要深入理解gimballock,需要对矩阵旋转进行一定的了解。在三维计算中,通常将姿态信息表示为一个3x3的旋转矩阵。旋转矩阵有三个要点:旋转轴、旋转角度和右手坐标系。如果某一个轴旋转180°,那么这个矩阵就出现了奇异点——gimbal lock。

举例来说,考虑一架飞行器正在执行一次俯仰动作(pitch motion),也就是要将飞行器从平直的飞行状态调整到一个俯仰的状态。在这个过程中,飞行器的x轴旋转了一定角度,而飞行器的y轴恰好垂直于地面,所以y轴这个维度和x轴这个维度相关联了起来。此时,如果再对z轴(也就是飞行器的水平轴)进行旋转,就会导致x轴和z轴之间的信息重叠,即使再输入正确的控制信号,也无法得到正确的控制效果。这样一来,就出现了gimbal lock。

三、如何避免gimballock

为了避免gimbal lock,我们需要寻找一种方法来解除三维旋转中的奇异点。最直接的方法,就是使用四元数(quaternion)进行旋转。四元数可以看作是一种扩展了复数的数学对象,可以用四个数字表示,分别为实数部分和三个虚数部分。通过四元数的乘积运算,我们可以方便地进行旋转操作,并且不受shear的影响。因此,使用四元数进行旋转,可以有效地避免gimbal lock。

四、gimballocked和大疆

gimballock问题不仅存在于理论计算中,也是实际应用中遇到的难题。目前,大疆的无人机产品已经采用了基于四元数的传感器融合算法,从而大大提高了飞行器的姿态控制稳定性,使其更加适合各种复杂的应用场景。

在实现中,我们可以使用大疆的飞控组件进行快速开发。首先,需要使用DJI Assistant 2软件进行控制器的初始化和固件升级操作。然后,使用DJI SDK提供的高级API接口,可以轻松地获取飞行器的实时姿态信息,并且进行飞行控制的设计和实现。

#include 

// 回调函数,获取飞行器姿态信息
void AttitudeCallback(const dji_sdk::Attitude::ConstPtr& msg){
  // 获取当前俯仰、偏航和翻滚的角度信息
  float pitch = msg->pitch;
  float yaw = msg->yaw;
  float roll = msg->roll;

  // 在这里进行PID等控制方法的实现
  // ...
}

int main(int argc, char** argv){
  ros::init(argc, argv, "gimballock_demo");
  ros::NodeHandle nh;

  // 订阅飞行器姿态信息
  ros::Subscriber sub_attitude = nh.subscribe(
    "/dji_sdk/attitude", 10, AttitudeCallback);

  // 主循环
  ros::spin();

  return 0;
}

  

在上面的示例代码中,我们使用了dji_sdk中的Attitude消息类型,它可以从飞行器实时获取到俯仰、偏航和翻滚的角度信息。通过这些信息,我们可以进行PID等控制方法的实现,从而完成对飞行器的精准控制。

五、总结

gimballock是飞行器姿态控制中常遇到的难题,但我们可以通过使用四元数进行旋转,以避免出现奇异点,实现更加精准的飞行器控制。通过使用大疆的飞行控制组件和SDK,在实现过程中可以方便地获取飞行器的实时姿态信息,并进行PID等控制方法的实现。