ROS之多传感器融合算法实现

2023-05-16

ROS之多传感器融合算法实现

文章目录

  • 1、motivation
  • 2、method
    • 2.1 订阅ROS的多个话题并对数据进行处理
    • 2.2 订阅ROS的多个话题并发布成一个话题

1、motivation

IntelRealsenseD435i传感器对imu传感器的数据是分开发布的,一般的SLAM的算法都是作为一个话题发布,所以要对它进行修改,用实际的传感器来说只需要修改launch文件,然后一并发布出去即可。

对于网上的一些公开数据集合而言,例如OpenLIROS数据集,在运行SLAM算法时需要进行处理,主要是两种解决办法

  • 2.1中的方法,在SLAM算法源码上修改,保证时间同步,然后进行处理
  • 2.2中的方法,把两个imu话题抓换成一个话题并发布出去

2、method

2.1 订阅ROS的多个话题并对数据进行处理

/*
* @Description:
订阅 ROS 的话题对数据进行处理(多传感器融合)
* @version: v1.0
* @Author: sunshine
* @Github: https://subshine.github.io/
* @Email: 2182216077@ncepu.edu.cn
* @Date: 2020-03-26 15:34:41
* @LastEditTime: 2020-03-27 17:53:23
*/
#include <ros/ros.h>
#include <sensor_msgs/Imu.h>
#include <std_msgs/String.h>
#include <message_filters/subscriber.h>
#include <message_filters/synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h>
#include <boost/thread/thread.hpp>
using namespace message_filters;
void imu_Callback(const sensor_msgs::ImuConstPtr& imu_msg_accel,const
sensor_msgs::ImuConstPtr& imu_msg_gyro) {
/*
处理程序
//
sensor_msgs::Imu imu_data;
imu_data.header.stamp = imu_msg_accel->header.stamp;
imu_data.header.frame_id = imu_msg_accel->header.frame_id;
imu_data.orientation.x = 0;
imu_data.orientation.y = 0;
imu_data.orientation.z = 0;
imu_data.orientation.w = 0;
线加速度
//
imu_data.linear_acceleration.x = imu_msg_accel->linear_acceleration.x;
imu_data.linear_acceleration.y = imu_msg_accel->linear_acceleration.y;
imu_data.linear_acceleration.z = imu_msg_accel->linear_acceleration.z;
⻆速度
//
imu_data.angular_velocity.x = imu_msg_gyro->angular_velocity.x;
imu_data.angular_velocity.y = imu_msg_gyro->angular_velocity.y;
imu_data.angular_velocity.z = imu_msg_gyro->angular_velocity.z;
std::cout << "imu_data.linear_acceleration"
<< " " << imu_data.angular_velocity.x << " "
<< imu_data.angular_velocity.y << " "
<<imu_data.angular_velocity.z << " " << std::endl;
*/
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "subscribe_two_and_translate_pub_one");
ros::NodeHandle n;
// SubscribeAndPublish sub_to_pub;
message_filters::Subscriber<sensor_msgs::Imu> sub_imu_accel(
n, "/d400/accel/sample", 2000,ros::TransportHints().tcpNoDelay());
message_filters::Subscriber<sensor_msgs::Imu> sub_imu_gyro(
n, "/d400/gyro/sample", 2000,ros::TransportHints().tcpNoDelay());
将两个话题的数据进行同步
//typedef sync_policies::ApproximateTime<sensor_msgs::Imu,sensor_msgs::Imu>syncPolocy;
Synchronizer<syncPolocy> sync(syncPolocy(10), sub_imu_accel,sub_imu_gyro);
指定一个回调函数,实现两个数据的同步读取
//
sync.registerCallback(boost::bind(&imu_Callback, _1, _2));
ros::spin();
return 0;
}

2.2 订阅ROS的多个话题并发布成一个话题

/*
 * @Description: 把ROS bag包中的数据两个话题合并成一个话题
 * @version: v1.0
 * @Author: sunshine
 * @Github: https://subshine.github.io/
 * @Email: 2182216077@ncepu.edu.cn
 * @Date: 2020-03-26 15:34:41
 * @LastEditTime: 2020-03-27 19:56:12
 */
#include <ros/ros.h> 
#include <sensor_msgs/Imu.h>
#include <std_msgs/String.h>
#include <message_filters/subscriber.h>
#include <message_filters/synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h>
#include <boost/thread/thread.hpp>
using namespace message_filters;
class SubscribeAndPublish {
 public:
    ros::NodeHandle n;
    ros::Publisher IMU_pub;
    SubscribeAndPublish() {
        IMU_pub = n.advertise<sensor_msgs::Imu>("/imu/data", 1);
        message_filters::Subscriber<sensor_msgs::Imu> sub_imu_accel(
            n, "/d400/accel/sample", 2000, ros::TransportHints().tcpNoDelay());
        message_filters::Subscriber<sensor_msgs::Imu> sub_imu_gyro(
            n, "/d400/gyro/sample", 2000, ros::TransportHints().tcpNoDelay());
        //将两个话题的数据进行同步
        typedef sync_policies::ApproximateTime<sensor_msgs::Imu,sensor_msgs::Imu>syncPolocy;
        Synchronizer<syncPolocy> sync(syncPolocy(10), sub_imu_accel,sub_imu_gyro);
        // //指定一个回调函数,实现两个数据的同步读取
        sync.registerCallback(boost::bind(&SubscribeAndPublish::imu_Callback,this,_1, _2));
        ros::spin();
    }
    void imu_Callback(const sensor_msgs::ImuConstPtr& imu_msg_accel,
                      const sensor_msgs::ImuConstPtr& imu_msg_gyro) {
        sensor_msgs::Imu imu_data;
        imu_data.header.stamp = imu_msg_accel->header.stamp;
        imu_data.header.frame_id = imu_msg_accel->header.frame_id;
        imu_data.orientation.x = 0;
        imu_data.orientation.y = 0;
        imu_data.orientation.z = 0;
        imu_data.orientation.w = 0;
        //线加速度
        imu_data.linear_acceleration.x = imu_msg_accel->linear_acceleration.x;
        imu_data.linear_acceleration.y = imu_msg_accel->linear_acceleration.y;
        imu_data.linear_acceleration.z = imu_msg_accel->linear_acceleration.z;
        //角速度
        imu_data.angular_velocity.x = imu_msg_gyro->angular_velocity.x;
        imu_data.angular_velocity.y = imu_msg_gyro->angular_velocity.y;
        imu_data.angular_velocity.z = imu_msg_gyro->angular_velocity.z;
        IMU_pub.publish(imu_data);
       
    }
};

int main(int argc, char** argv)
{
    ros::init(argc, argv, "subscribe_two_and_translate_pub_one");
    SubscribeAndPublish sub_and_pub;

    return 0;
}

实现效果:第一种办法应该不存在问题,第二种办法导致时间戳可能存在问题,具体看以下两张可视化图
原始数据
在这里插入图片描述

重新发布后的话题数据
在这里插入图片描述

参考链接: message_filters 对齐多种传感器数据的时间戳

C++:boost::bind的一些用法

ros::spin() 和 ros::spinOnce() 区别及详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS之多传感器融合算法实现 的相关文章

随机推荐

  • 解决 vscode中js变量 文件不能自动跳转问题~

    项目场景 xff1a 在项目开发中 xff0c 为了便于理解js代码逻辑和调试 xff0c 通常会使用快捷键自动定位到变量原始定义的文件位置 mac中快捷键 xff1a command 43 鼠标点击 但在vue项目开发中 xff0c 发现
  • vue3源码分析(二)—— 初始化流程

    系列文章目录 目录分析初始化流程响应式系统shared工具函数 文章目录 系列文章目录前言一 createApp在项目中的使用二 createApp源码追溯1 创建app实例1 1 ensureRenderer1 2 ensureRende
  • JS基础 ——解释执行

    文章目录 前言一 词法分析二 预编译创建全局作用域GO对象创建局部作用域AO对象 三 代码执行总结 前言 大家都知道 xff0c JS是一种不需要编译的解释型语言 但其实在浏览器执行JS代码前 xff0c 也有一个词法分析和预编译过程 xf
  • vue 项目中引入字体文件的正确方式~

    文章目录 前言一 开发中需要什么样的字体1 字体图标2 特殊字体 二 项目中引入字体文件1 字体文件2 css文件3 项目使用该字体 总结 前言 在UI设计稿中 xff0c 可能会有一些特殊字体 xff0c 或者是一些字体图标 对于特殊字体
  • vue3 使用 swiper轮播库

    文章目录 前言一 Swiper引入方式1 HTML标签引入方式2 CommonJs引入方式3 ES引入方式 xff08 采用 xff09 二 使用Swiper总结 前言 轮播图在前端开发中 xff0c 是常见需求 而Swiper库是最受前端
  • vue-cli2 老项目webpack3升级webpack5过程总结

    文章目录 背景一 webpack5环境要求二 升级步骤1 脚手架webpack cli2 升级webpack包3 更新webpack相关插件3 1 不推荐或被移除的插件3 2 升级babel到7版本3 3 更新插件 4 修改配置4 1 新增
  • 前端下载文件

    文章目录 前言二进制流前端核心实现下载功能有 xff1a 一 a标签 43 download属性二 window open url 34 blank 34 三 form表单四 接口请求 43 blob 43 a标签 43 download属
  • 前端JS 云打印 LODOP实践

    文章目录 前言一 Lodop是什么 xff1f 二 如何使用Lodop1 下载打印插件2 配置打印机3 html中植入打印控件4 调用Lodop对应的JS相关方法接口实现打印功能 三 Lodop主要方法接口三 注意点总结 前言 一般B S系
  • axios源码——工具函数utils.js

    文章目录 前言一 工具函数所在目录二 判定数据类型的函数1 isArray 判定数组 2 isString 判定字符串 3 isNumber 判定数值 4 isObject 判定对象 5 isPlainObject 判定纯对象 6 isUn
  • 源码阅读——validate-npm-package-name

    文章目录 前言一 源码阅读工具二 阅读源码1 目录结构2 package json3 index js 三 使用该包1 vue cli中使用2 create react app 中使用 总结 前言 validate npm package
  • 学习rtklib

    数据下载 日期转换和一些常用数据下载 http www gnsscalendar com index html year 61 2019 多系统精密星历和精密钟差下载 2021年10月25日更新 xff1a 单GPS精密星历文件要在这里下载
  • echarts 绘制多条折线图(横坐标,折线图条数不确定)

    项目场景 xff1a 使用echarts做业务图表统计 xff0c 记录一下在项目中图表接口返回的数据处理问题 需求描述 1 一个统计图中实现多条折现图的显示 xff0c 如下图所示 2 后台返回的数据结构 span class token
  • 线性二次型调节器(LQR)原理详解

    文章目录 前言算法解释代价函数的意义 推导过程可控性LQR控制实例参考资料 前言 LQR Linaer Quadratic Regulator xff0c 即线性二次型调节器 xff0c 是一种现代控制理论中设计状态反馈控制器 State
  • 嵌入式软件工程师常见面试问题

    嵌入式软件工程师面试题 1 stm32启动方式 xff1f 有三种 xff1a 从Flash启动 xff0c 将Flash地址0x0800 0000映射到0x00000000 这样启动以后就相当于从0x0800 0000开始的 xff0c
  • 使用python爬虫把自己的CSDN文章爬取下来并保存到MD文件

    导言 爬虫作为一个敏感技术 xff0c 千万要把握好 xff0c 如果人家不让爬那就不要头铁去试了 如何确定某个网站是否允许爬虫 在域名后面加上 robots txt查看即可 xff0c 例如 xff1a https blog csdn n
  • 寻找矩阵中的指定路径

    给定一个矩阵和一个要找的字符串 xff0c 如果有的话找出矩阵中的字符串路径 测试用例 功能测试 xff1a 在多行多列的矩阵中存在或者不存在路径 边界值测试 xff1a 矩阵只有一行或一列 xff1b 矩阵和路径中的所有字母都是相同的 特
  • Kalibr标定Intel D435i相机

    Kalibr标定Intel D435i相机 文章目录 Kalibr标定Intel D435i相机1 相机标定2 IMU标定3 相机 43 IMU联合标定4 标定结果评价 系统环境 xff1a ubuntu16 04 43 roskineti
  • VINS初始化

    VINS初始化 VINS初始化之外参在线标定 前面主要分析了外参标定出来旋转矩阵 xff0c 接下来接着分析初始化 if solver flag 61 61 INITIAL if frame count 61 61 WINDOW SIZE
  • ROS中关于两个话题时间同步遇到的问题 message_filters

    ROS中关于两个话题时间同步遇到的问题 message filters 参考链接 CMakeFiles imu data dir src imu data cpp o xff1a 在函数 message filters Synchroniz
  • ROS之多传感器融合算法实现

    ROS之多传感器融合算法实现 文章目录 1 motivation2 method2 1 订阅ROS的多个话题并对数据进行处理2 2 订阅ROS的多个话题并发布成一个话题 1 motivation IntelRealsenseD435i传感器