【SLAM学习】获取IMU和雷达消息并发布

news2024/9/21 0:36:17

本文主要记录如何将rosbag的消息进行获取并进行发布以及后续处理。

测试数据集:

链接: https://pan.baidu.com/s/1DthWE45V5Zhq7UUrfTt_CQ 提取码: mxvn 
 

查看数据集bag包里面都有那些话题:

rosbag info indoor_lab_RS.bag 

 可以看到包含了两个话题topic:

  • /imu/data
  • /rslidar_points

本文件包含两个回调函数:

  1. imu回调函数(获取时间戳、角速度值、加速度值)
  2. lidar回调函数(获取时间戳,将消息类型转化为PCL点云,进行体素滤波下采样,并将最终下采样的点云转化为消息的类型发布出来)
#include <iostream>
#include "ros/ros.h"
#include "sensor_msgs/Imu.h"
#include "sensor_msgs/PointCloud2.h"

#include "pcl/point_types.h"
#include "pcl/filters/voxel_grid.h"
#include "pcl_ros/point_cloud.h"

// rsliar的数据结构
namespace rslidar_ros
{
    struct EIGEN_ALIGN16 Point
    {
        PCL_ADD_POINT4D;
        std::uint8_t intensity;
        std::uint16_t ring = 0;
        double timestamp = 0;
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };
} // namespace rslidar_ros
POINT_CLOUD_REGISTER_POINT_STRUCT(rslidar_ros::Point,
    (float, x, x)(float, y, y)(float, z, z)(std::uint8_t, intensity, intensity)(std::uint16_t, ring, ring)(double, timestamp, timestamp))


bool first_imu = true;
double first_imu_time;

// IMU消息回调函数
void Imu_callback(const sensor_msgs::Imu &msg)
{
    if (first_imu){
        first_imu_time = msg.header.stamp.toSec(); // 获取第一帧时间戳
        first_imu = false;
    }
    std::cout << "IMU time:" << msg.header.stamp.toSec() - first_imu_time << std::endl;
    std::cout << "angular_velocity:" 
              << msg.angular_velocity.x << " " 
              << msg.angular_velocity.y << " "
              << msg.angular_velocity.z << std::endl;
    std::cout << "linear_acceleration:" 
              << msg.linear_acceleration.x << " "
              << msg.linear_acceleration.y << " "
              << msg.linear_acceleration.z << std::endl;

}

bool first_lidar = true;
double first_lidar_time;

// 下采样,体素滤波
pcl::VoxelGrid<pcl::PointXYZI> downSizeFilter;
pcl::PointCloud<pcl::PointXYZI> pl_filtered;

ros::Publisher publaserCloud;

// 雷达消息回调函数
void laser_callback(const sensor_msgs::PointCloud2 &msg)
{
    if (first_lidar){
        first_lidar_time = msg.header.stamp.toSec(); // 获取第一帧雷达的时间戳
        first_lidar = false;
    }

    std::cout << "Lidar time:" << msg.header.stamp.toSec() - first_lidar_time << std::endl;

    pcl::PointCloud<rslidar_ros::Point> pl_orig;
    pcl::fromROSMsg(msg, pl_orig); // 从ROS的消息转化到点云PCL
    int plsize = pl_orig.points.size(); // 获取点云的数量
    std::cout << "Lidar point size:" << plsize << std::endl; // 原始点云的大小

    pl_filtered.clear();
    for (int i = 0; i < plsize; i++){
        pcl::PointXYZI point;
        point.x = pl_orig.points[i].x;
        point.y = pl_orig.points[i].y;
        point.z = pl_orig.points[i].z;
        point.intensity = pl_orig.points[i].intensity;

        pl_filtered.points.push_back(point);
    }

    // 下采样
    downSizeFilter.setLeafSize(0.05, 0.05, 0.05); // 设置下采样大小
    downSizeFilter.setInputCloud(pl_filtered.makeShared());
    downSizeFilter.filter(pl_filtered);

    std::cout << "Lidar filtered size:" << pl_filtered.points.size() << std::endl; // 滤波后的点云大小

    // 将点云通过消息的类型发布出来
    sensor_msgs::PointCloud2 laserCloud;
    pcl::toROSMsg(pl_filtered, laserCloud);
    laserCloud.header.stamp = msg.header.stamp;
    laserCloud.header.frame_id = "camera_init";
    publaserCloud.publish(laserCloud);
}



int main(int argc, char** argv)
{
    ros::init(argc, argv, "lio_test");
    ros::NodeHandle nh;

    // 订阅IMU和lidar消息
    ros::Subscriber imu_sub = nh.subscribe("/imu/data",10,Imu_callback);

    ros::Subscriber lidar_sub = nh.subscribe("/rslidar_points",10,laser_callback);

    // 发布雷达点云
    publaserCloud = nh.advertise<sensor_msgs::PointCloud2>("/cloud", 100000);
    while(ros::ok())
    {
        ros::spinOnce();
    }

    return 0;
}

CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0.2)
project(LIO_TEST)

find_package(catkin REQUIRED COMPONENTS
  pcl_ros
  roscpp
  sensor_msgs
  std_msgs
)

find_package(PCL REQUIRED)

add_executable(lio_test src/lio_test.cpp)

target_link_libraries(lio_test
  ${catkin_LIBRARIES}
  ${PCL_LIBRARIES}
)

IMU数据输出结果:

 


雷达数据体素滤波下采样结果:

 

 


 

查看IMU的数据类型: 

rosmsg show sensor_msgs/Imu

查看雷达的数据类型:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web安全php基础_php语法格式与注释

php开头与结尾 php脚本以<php 开始 以 ?>结束 但是先前创建页面的时候我们发现phpinfo只有<php开头&#xff0c;并没有&#xff1f;>结尾 在这里我们可以手动给它加上?>结尾 php强制使用分号&#xff1b;结尾 PHP指令分隔符   与C、Perl及Java一样&…

mysql的集群和主从的区别

现在的项目使用mysql数据库&#xff0c;要自己设计数据存储架构。所以研究了一下mysql的集群(cluster)和主从&#xff08;master/slave&#xff09;这两个概念。两者非常容易混淆&#xff0c;所以需要分辨出这2者之间的区别。 一、Mysql cluster: share-nothing,分布式节点架构…

综合实验---基于卷积神经网络的目标分类案例

文章目录 配置环境猫狗数据分类建模猫狗分类的实例基准模型猫狗分类的实例基准模型之数据增强问题回答 配置环境 ①首先打开 cmd&#xff0c;创建虚拟环境。 conda create -n tf1 python3.6如果报错&#xff1a;‘conda’ 不是内部或外部命令,也不是可运行的程序 或批处理文件…

Docker镜像是什么原理?Dockerfile是什么?

Dockerfile 一、docker镜像原理 Linux文件系统有bootfs和rootfs两部分组成 bootfs&#xff1a; 包含bootloader&#xff08;引导加载程序&#xff09;和kernel&#xff08;内核&#xff09;rootfs&#xff1a; root文件系统&#xff0c;包含的就是典型Linux系统中的 /dev&…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册4

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 钟表是一种计时的装置&#xff0c;也是计量和指示时间的精密仪器。 钟表通常是以内机的大小来区别的。按国际惯例&#xff0c;机芯直径超过80毫米、厚度超…

Axure设计之下拉复选框(中继器)

在系统表单设计中经常用到下拉复选框&#xff0c;下拉复选列表用于展示可选标签&#xff0c;并允许用户选择多个标签&#xff0c;那么该如何利用Axure RP9制作一个下拉复选框呢&#xff1f;本文总结了设计过程的所需元件和整体思路&#xff0c;通过对关键步骤的讲解&#xff0c…

Type-c取电方案

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD协议适配器越来越普遍&#xff0c;如何让微软surface 充电器线支持使用PD适配器快充&#xff1f;加入一颗受电端PD协议取电芯片——LDR6328能够完美的兼容市面上的PD适配器&#xff0c;支持不同的电压输出。 1…

vuex 持久化插件 vuex-persistedstate

/** ** /store/index.js ****/ import Vue from vue import Vuex from vuex import createPersistedState from vuex-persistedstate // 【主要代码】Vue.use(Vuex)// https://webpack.js.org/guides/dependency-management/#requirecontext const modulesFiles require.conte…

使用alist连接百度网盘和阿里云盘挂载到本地磁盘

1、下载alist软件 使用alist连接百度网盘和阿里云盘挂载到本地磁盘 跳转后&#xff0c;找到对应windows版本 2 、下载后解压&#xff0c;并启动服务 注意&#xff1a;alist的启动方式不是传统的双击启动&#xff0c;需要用命令提示符,启动服务 下载完成后解压&#xff0c;在你解…

MySQL - 第13节 - MySQL用户管理

1.MySQL用户管理概念 MySQL用户管理概念&#xff1a; • 与Linux操作系统类似&#xff0c;MySQL中也有超级用户和普通用户之分。 • 如果一个用户只需要访问MySQL中的某一个数据库&#xff0c;甚至数据库中的某一个表&#xff0c;那么可以为其创建一个普通用户&#xff0c;并为…

HarmonyOS学习路之开发篇—设备管理(传感器开发)

传感器开发概述 基本概念 HarmonyOS传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor API&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器的数据&#xff0c;并根据传感器数据定制相应的算法&#xff0c;开发各类应用&#xff0c;…

【海量数据挖掘/数据分析】之 贝叶斯信念网络(贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例)

【海量数据挖掘/数据分析】之 贝叶斯信念网络&#xff08;贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例&#xff09; 目录 【海量数据挖掘/数据分析】之 贝叶斯信念网络&#xff08;贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例&…

仙剑风景图片生成【InsCode Stable Diffusion美图活动一期】

一、 Stable Diffusion 模型在线使用地址&#xff1a;https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型版本及相关配置&#xff1a; Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 423016627, Size: 512x512, Model hash: 74c61c3a52, Model: GuoFeng3,…

通过摄像头监测交通——远眺智慧交通视频AI分析系统「捷码精品应用展」

随着社会经济的发展和人民生活水平的提高&#xff0c;汽车数量增长迅猛。汽车数量的迅速增加造成交通拥挤严重、交通事故频发&#xff0c;甚至愈演愈烈&#xff0c;惨不忍"堵"&#xff0c;严重影响城市交通安全与交通效率&#xff0c;如何保障人民群众安全、有序出行…

06_RBAC项目总结

RBAC项目总结 基于角色访问控制(RBAC&#xff1a;Role Based Access Control) 对于基本的增删改查 1.通过看接口文档要求这个接口使用什么方式发送请求,需要响应的数据的格式是什么 2.若请求的参数由其他对象或者数组组成的,就需要重新定义一个类来进行接收,后端接收的时候…

(动态规划) 673. 最长递增子序列的个数 ——【Leetcode每日一题】

❓ 673. 最长递增子序列的个数 难度&#xff1a;中等 给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1,…

Leetcode-每日一题【328.奇偶链表】

题目 给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xff0c;偶数组和奇数组…

【Matlab】智能优化算法_樽海鞘群算法SSA

【Matlab】智能优化算法_樽海鞘群算法SSA 1.背景介绍2.数学模型2.1 提出的移动樽海鞘链的数学模型2.2 Swarm仿真2.3 单目标Salp Swarm算法&#xff08;SSA&#xff09; 3.算法流程图4.文件结构5.伪代码6.详细代码及注释6.1 func_plot.m6.2 Get_Functions_details.m6.3 initiali…

自学网络安全究竟该从何学起?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行…

八大数据结构分类

1、数组 数组是可以再内存中连续存储多个元素的结构&#xff0c;在内存中的分配也是连续的&#xff0c;数组中的元素通过数组下标进行访问&#xff0c;数组下标从0开始。例如下面这段代码就是将数组的第一个元素赋值为 1。 int[] data new int[100]&#xff1b;data[0] 1;…