栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PCL点云库必备知识点8——四元素转方向余弦矩阵C

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PCL点云库必备知识点8——四元素转方向余弦矩阵C

四元素转方向余弦矩阵C的完整代码如下:
#include"ros/ros.h"
#include"std_msgs/String.h"

#include
#include"nav_msgs/Odometry.h"
#include 
#include 
#include
// 可用于geometry_msgs与Eigen相关数据类型之间的转换。
#include 
#include
#include

// 包含pcd的输入输出头文件——pcd文件IO操作定义的头文件
#include 
// 包含点类型、结构的数据定义——包含若干PointT数据结构定义的头文件
#include 
using namespace std;
    // ConstPtr常量指针可以修改指针的方向,不可以修改指针的数值
    // 将点云map坐标系转换到导航坐标系下
void doMsg(const nav_msgs::Odometry::ConstPtr &gps_msg)
{
    // 通过msg获取并操作订阅到的数据

    // ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());
    Eigen::Affine3d gps_aff;
    // cout<<"gps_aff="<pose.pose,gps_aff);
    // cout<();;
    cout<<"方法1:gps_matrix="<pose.pose.orientation.x;
     q.y()=gps_msg->pose.pose.orientation.y;
     q.z()=gps_msg->pose.pose.orientation.z;
     q.w()=gps_msg->pose.pose.orientation.w;
    //  四元素转方向余矩阵的方法2:
    Eigen::Matrix3d A;
    A(0,0)=2*q.w()*q.w()+2*pow(q.x(),2)-1;
    A(0,1)=2*q.x()*q.y()+2*q.w()*q.z();
    A(0,2)=2*q.x()*q.z()-2*q.w()*q.y();
    A(1,0)=2*q.x()*q.y()-2*q.w()*q.z();
    A(1,1)=2*q.w()*q.w()+2*q.y()*q.y()-1;
    A(1,2)=2*q.y()*q.z()+2*q.w()*q.x();
    A(2,0)=2*q.x()*q.z()+2*q.w()*q.y();
    A(2,1)=2*q.y()*q.z()-2*q.w()*q.x();
    A(2,2)=2*q.w()*q.w()+2*q.z()*q.z()-1;
    cout<<"A="< 
实验结果: 

**程序说明:

四元素转方向余弦矩阵的三种方法如下:**
X轴指向北,Y轴指向天,Z轴指向东,符合右手坐标系
注意:方向余弦矩阵是分别沿着Y(yaw)、Z(pitch)、X(roll)旋转而来的

方法1:
Eigen::Affine3d gps_aff;
tf::poseMsgToEigen(gps_msg->pose.pose,gps_aff);
方法2:
 定义四元素并获取四元素值    Eigen::Quaterniond q;
 q.x()=gps_msg->pose.pose.orientation.x;
 q.y()=gps_msg->pose.pose.orientation.y;
 q.z()=gps_msg->pose.pose.orientation.z;
 q.w()=gps_msg->pose.pose.orientation.w;

手动写方向余弦矩阵C

Eigen::Matrix3d A;
    A(0,0)=2*q.w()*q.w()+2*pow(q.x(),2)-1;
    A(0,1)=2*q.x()*q.y()+2*q.w()*q.z();
    A(0,2)=2*q.x()*q.z()-2*q.w()*q.y();
    A(1,0)=2*q.x()*q.y()-2*q.w()*q.z();
    A(1,1)=2*q.w()*q.w()+2*q.y()*q.y()-1;
    A(1,2)=2*q.y()*q.z()+2*q.w()*q.x();
    A(2,0)=2*q.x()*q.z()+2*q.w()*q.y();
    A(2,1)=2*q.y()*q.z()-2*q.w()*q.x();
    A(2,2)=2*q.w()*q.w()+2*q.z()*q.z()-1;
    Eigen::Matrix3d C;
    C=A.transpose();//转置


方法3:
cout<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/511880.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号