【cartographer without ros】四、里程计odom数据转换

上一节介绍了cartographer中的TimedPointCloudData数据相关转换。

本节将介绍里程计Odom数据转换为cartographer中的OdometryData数据。还有cartographer中的OdometryData数据和Ros的nav_msgs::Odometry数据相互转换,方便引入Rosbag进行储存和读取。


目录

1:OdometryData数据类型

2:Odom数据转换cartographer数据

3:Odom数据转换Ros数据

4:cartographer数据转换Ros数据

5:Ros数据转换cartographer数据



1:OdometryData数据类型

【odometry_data.h】中查看数据结构:

//时间
common::Time time;
//位置
transform::Rigid3d pose;


2:Odom数据转换cartographer数据

cartographer::sensor::OdometryData GetOdometryData()
{
    cartographer::sensor::OdometryData odometry_data;

    current_time = ros::Time::now();
    double dt = (current_time - last_time).toSec();
    double dx = (vx * cos(th) - vy * sin(th)) * dt;
    double dy = (vx * sin(th) + vy * cos(th)) * dt;
    double dth = vth * dt;
    last_time = current_time;

    x += dx;
    y += dy;
    th += dth;


    cartographer::common::Time curTime = cartographer::common::NowTime();
    const Eigen::AngleAxisd rotation(th, Eigen::Vector3d::UnitZ());
    const Eigen::Vector3d translation(x, y, 0.0);
    cartographer::transform::Rigid3d pose(translation, rotation);
    odometry_data = cartographer::sensor::OdometryData{curTime, pose};

    return odometry_data;
}


3:Odom数据转换Ros数据

【cartographer_ros】四: 发布和订阅里程计odom信息


4:cartographer数据转换Ros数据

nav_msgs::Odometry ToRosMsg(cartographer::sensor::OdometryData odometry_data)
{
    nav_msgs::Odometry odom;

    odom.header.stamp = TimeRosFromCarto(odometry_data.time);
    odom.header.frame_id = "odom";
    odom.pose.pose.position.x = odometry_data.pose.translation().x();
    odom.pose.pose.position.y = odometry_data.pose.translation().y();
    odom.pose.pose.position.z = odometry_data.pose.translation().z();
    odom.pose.pose.orientation.w = odometry_data.pose.rotation().w();
    odom.pose.pose.orientation.x = odometry_data.pose.rotation().x();
    odom.pose.pose.orientation.y = odometry_data.pose.rotation().y();
    odom.pose.pose.orientation.z = odometry_data.pose.rotation().z();
    odom.child_frame_id = "base_link";
    return odom;
}


5:Ros数据转换cartographer数据

cartographer::sensor::OdometryData ToCartoSensor(nav_msgs::Odometry odom)
{
    cartographer::sensor::OdometryData odometry_data;
    odometry_data.time = Time::CartoFromRos(odom.header.stamp);
    const Eigen::Vector3d translation(odom.pose.pose.position.x, odom.pose.pose.position.y, odom.pose.pose.position.z);
    const Eigen::Quaterniond rotation(odom.pose.pose.orientation.w, odom.pose.pose.orientation.x, odom.pose.pose.orientation.y, odom.pose.pose.orientation.z);
    odometry_data.pose = cartographer::transform::Rigid3d(translation, rotation);
    return odometry_data;
}

【完】


下一节会介绍里程计Imu数据转换为cartographer中的cartographer::sensor::ImuData数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CloudFlame

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

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

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

打赏作者

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

抵扣说明:

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

余额充值