lego_loam——featuerAssociation.cpp

IMU回调函数:

    //imu回调函数
    void imuHandler(const sensor_msgs::Imu::ConstPtr& imuIn)
    {
        //通过接收到的imuIn里面的四元素得到roll,pitch,yaw三个角
        double roll, pitch, yaw;
        tf::Quaternion orientation;
        tf::quaternionMsgToTF(imuIn->orientation, orientation);
        tf::Matrix3x3(orientation).getRPY(roll, pitch, yaw);
        
        // ! step 1 加速度去除重力影响,同时坐标轴进行变换从xyz转换到yzx
        float accX = imuIn->linear_acceleration.y - sin(roll) * cos(pitch) * 9.81;
        float accY = imuIn->linear_acceleration.z - cos(roll) * cos(pitch) * 9.81;
        float accZ = imuIn->linear_acceleration.x + sin(pitch) * 9.81;
        
        //!step  2   将欧拉角,加速度,速度保存到循环队列中
        imuPointerLast = (imuPointerLast + 1) % imuQueLength;

        imuTime[imuPointerLast] = imuIn->header.stamp.toSec();

        imuRoll[imuPointerLast] = roll;//横滚角
        imuPitch[imuPointerLast] = pitch;//俯仰角
        imuYaw[imuPointerLast] = yaw;//偏航

        imuAccX[imuPointerLast] = accX;//x轴加速度
        imuAccY[imuPointerLast] = accY;//y轴加速度
        imuAccZ[imuPointerLast] = accZ;//z轴加速度

        imuAngularVeloX[imuPointerLast] = imuIn->angular_velocity.x;//x轴角速度
        imuAngularVeloY[imuPointerLast] = imuIn->angular_velocity.y;//y轴角速度
        imuAngularVeloZ[imuPointerLast] = imuIn->angular_velocity.z;//z轴角速度
        
        //! step 3对速度,角速度,加速度进行积分,得到位移,角度和速度
        AccumulateIMUShiftAndRotation();
    }

难点1:

 // ! step 1 加速度去除重力影响,同时坐标轴进行变换从xyz转换到yzx
        float accX = imuIn->linear_acceleration.y - sin(roll) * cos(pitch) * 9.81;
        float accY = imuIn->linear_acceleration.z - cos(roll) * cos(pitch) * 9.81;
        float accZ = imuIn->linear_acceleration.x + sin(pitch) * 9.81;

本段代码涉及两个操作

1.坐标转换从xyz转换到yzx

  • imu原始观测值的坐标轴方向为右前上(xyz)
  • 转换为前上右(xyz–>yzx)??
 // ! step 1 加速度去除重力影响,同时坐标轴进行变换从xyz转换到zxy
        float accX = imuIn->linear_acceleration.y     
        float accY = imuIn->linear_acceleration.z     
        float accZ = imuIn->linear_acceleration.x     

2.消除重力加速度对于测量的影响:

欧拉角表示的: R b n : R_b^n : Rbn

在这里插入图片描述

  1. 导航坐标系下重力矢量: g n = [ 0 , 0 , − 9.81 ] g^n=[0,0,-9.81] gn=[0,0,9.81]
  2. 将重力转换到导航坐标系: ( R b n ) T ∗ g n (R_b^n)^T*g^n (Rbn)Tgn
  3. 原始观测值减去重力影响: a c c − ( R b n ) T ∗ g n acc-(R_b^n)^T *g^n acc(Rbn)Tgn
 // ! step 1 坐标轴进行变换从xyz转换到zxy,同时去除重力影响。
        float accX = imuIn->linear_acceleration.y - sin(roll) * cos(pitch) * 9.81;
        float accY = imuIn->linear_acceleration.z - cos(roll) * cos(pitch) * 9.81;
        float accZ = imuIn->linear_acceleration.x + sin(pitch) * 9.81;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

My.科研小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值