• loam详细代码解析与公式推导


    loam详细代码解析与公式推导(基础理论知识)

    一、基础坐标变换

    loam中欧拉角解算都采用R P Y 的解算方式,即先左乘R, 再左乘P, 最后左乘Y,用矩阵表示为: R = Ry * Rp * Rr。用个很简单的示例表示,在坐标系Oxyz中经过旋转后得到坐标系O'xyz,可以把坐标系Oxyz当成全局坐标系{world_link},坐标系O'xyz当成局部坐标系{local_link};有局部坐标系上的点Pl,在全局坐标系下的位置Pw是:

    Pw = R * Pl = (Ry * Rp * Rr)* Pl

     上式将局部坐标系上的点变换到全局坐标系即:

      R = Ry * Rp * Rr

    {world_link} ------------------------> {link_link}

    其中:Rr是agv的翻滚角,与loam坐标系中的rot_x对应

        rot_x = [1, 0, 0;
                 0, crx, -srx;
                 0 , srx, crx];

              Ry是agv的偏航角,与loam坐标系中的rot_y对应

           rot_y = [cry, 0, sry; 
               0, 1, 0; 
                 -sry , 0, cry];

             Rp是agv的俯仰角,与loam坐标系中的rot_z对应

                rot_z = [crz, -srz, 0; 
                  srz, crz, 0; 
                 0 , 0, 1];

    二、loam对应的欧拉变换顺序

           loam中坐标变换通常分为从{link_world}到{world_link}和从{world_link}到{link_world}的变换,其分别对应的欧拉拉变换方式为:Rzxy 和 其逆矩阵inv(Rzxy) = R-y-x-z,其中

         Rzxy = rot_z  * rot_x  * rot_y  =  [ cry*crz + srx*sry*srz, crz*srx*sry - cry*srz, crx*sry]
                              [crx*srz,           crx*crz,         -srx]
                               [ cry*srx*srz - crz*sry, sry*srz + cry*crz*srx, crx*cry]

    inv(Rzxy) = -rot_y  * -rot_x  * -rot_z = [ cry*crz + srx*sry*srz, crx*srz, cry*srx*srz - crz*sry]
                                 [ crz*srx*sry - cry*srz, crx*crz, sry*srz + cry*crz*srx]
                                  [     crx*sry,    -srx,               crx*cry]

    三、imu角度变换计算

    loam中imu的坐标系方向是前左上,假设在current的imu坐标系下的各个方向加速度为

    A = [ax; ay; az]

    在前左上坐标系中欧拉角的解算方式是:Rxyz = rot_z  *  rot_x  * rot_y,现在需要得到重力加速度在current坐标系下各个方向的分量,应为imu开始坐标系下G=[0; 0; -9.8];现在相当于求全局imu坐标系下的向量在局部imu坐标系下向量值G',故

    G'  =  inv(Rxyz) * G

    其中

    inv(Rxyz) =  [          cry*crz,        cry*srz,    -sry]
              [ crz*srx*sry - crx*srz, crx*crz + srx*sry*srz, cry*srx]
              [ srx*srz + crx*crz*sry, crx*sry*srz - crz*srx, crx*cry]

    因此

    A’= A  +  inv(Rxyz) *  G

    到这里,关于坐标系变换的基础理论就讲明白了。

     

     

     

  • 相关阅读:
    Leetcode 907.子数组的最小值之和(中等)
    C++ 基础与深度分析 Chapter11 类与面向对象编程(构造函数:缺省、单一、拷贝、移动、赋值)
    Vue3: 获取元素DOM的方法
    Altium Designer2022相关操作
    WPF(一) WPF基本控件与布局
    Linux系统中让$前面显示完整的路径
    SpringBoot整合框架——集成SpringSecurity、shiro
    GBase 8c维护审计日志(二)
    docker run:--privileged=true选项解析(特权模式:赋予容器几乎与主机相同的权限)
    Java IO流
  • 原文地址:https://www.cnblogs.com/RobustFresher/p/16728241.html