当前位置: 首页 > news >正文

相机雷达时间同步(基于ROS)

文章目录

    • 运行环境:
    • 思路:
    • 同步前和同步后效果对比
    • 1.1创建工作空间
    • 1.2创建功能包
    • 2.1编写源文件
    • 2.2编写头文件
    • 2.3编写可执行文件
    • 2.4配置文件
    • 3.1编译运行
    • 4.1录制时间同步后的rosbag
    • 4.2rviz可视化rosbag

运行环境:

ubuntu20.04 noetic
usb_cam
速腾Robosense 16线
宏基暗影骑士笔记本

思路:

软同步:订阅相机和雷达原始数据,然后进行时间同步,最后将同步后的数据发布出去,通过rosbag record进行录制

同步前和同步后效果对比

同步前的话题:
/rslidar_packets
/usb_cam/image_raw

 # 录制命令rosbag record -O lidar_camera /usb_cam/image_raw /rslidar_points

在这里插入图片描述

同步后的话题:
/sync/img
/sync/lidar

 # 录制命令rosbag record -O lidar_camera_syn_time /sync/img /sync/lidar

在这里插入图片描述

1.1创建工作空间

mkdir -p sys_time_ws/src
cd sys_time_ws
catkin_make
code .

1.2创建功能包

1) 在工作空间src目录下创建功能包

sys_time
roscpp rospy std_msgs

2.1编写源文件

1)在 src 目录下新建文件 sub_and_pub.cpp

代码解释:
this 关键字指向类创建的对象
registerCallback 绑定回调函数,触发回调函数发布同步后的数据

#include "sys_time/sub_and_pub.h"# 重写头文件中的构造函数subscriberANDpublisher()
# main函数初始化对象(subscriberANDpublisher sp)时自动调用构造函数
subscriberANDpublisher::subscriberANDpublisher()
{//订阅话题lidar_sub.subscribe(nh, "/rslidar_points", 1);camera_sub.subscribe(nh, "/usb_cam/image_raw", 1);//消息过滤器,使用 ApproximateTime 进行时间同步(允许一定程度的时间误差)sync_.reset(new message_filters::Synchronizer<syncpolicy>(syncpolicy(10), camera_sub, lidar_sub));sync_->registerCallback(boost::bind(&subscriberANDpublisher::callback, this, _1, _2));//发布者camera_pub = nh.advertise<sensor_msgs::Image>("sync/img", 10);lidar_pub = nh.advertise<sensor_msgs::PointCloud2>("sync/lidar", 10);
}void subscriberANDpublisher::callback(const sensor_msgs::ImageConstPtr& image, const sensor_msgs::PointCloud2ConstPtr& pointcloud) {ROS_INFO("Received synchronized message!");camera_pub.publish(image);lidar_pub.publish(pointcloud);
}

2.2编写头文件

1)在功能包下的 include/功能包名 目录下新建头文件 sub_and_pub.h
2)配置 includepath 详情见

#ifndef SUB_AND_PUB_H
#define SUB_AND_PUB_H
//ros头文件
#include <ros/ros.h>
//时间同步
#include <message_filters/subscriber.h>
#include <message_filters/sync_policies/approximate_time.h>
#include <message_filters/synchronizer.h>
//传感器消息
#include <sensor_msgs/Image.h>
#include <sensor_msgs/image_encodings.h>
#include <sensor_msgs/PointCloud2.h>class subscriberANDpublisher{
public:subscriberANDpublisher();void callback(const sensor_msgs::ImageConstPtr &image, const sensor_msgs::PointCloud2ConstPtr &pointcloud);private:ros::NodeHandle nh;ros::Publisher camera_pub;ros::Publisher lidar_pub;message_filters::Subscriber<sensor_msgs::PointCloud2> lidar_sub;//雷达订阅message_filters::Subscriber<sensor_msgs::Image> camera_sub;//相机订阅typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::PointCloud2> syncpolicy;//时间戳对齐规则typedef message_filters::Synchronizer<syncpolicy> Sync;boost::shared_ptr<Sync> sync_;//时间同步器};
#endif

2.3编写可执行文件

#include <ros/ros.h>
#include "sys_time/sub_and_pub.h"int main(int argc, char **argv) {ros::init(argc, argv, "node");subscriberANDpublisher sp;ROS_INFO("main done! ");ros::spin();
}

2.4配置文件

1)修改CMakeLists.txt

# 添加message_filters ROS包依赖
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_filters
)# 头文件路径
include_directories(include${catkin_INCLUDE_DIRS}
)# 新建c++库,将头文件和源文件添加到新库里面
add_library(sys_time_libinclude/sys_time/sub_and_pub.hsrc/sub_and_pub.cpp
)
# 将src目录下的main.cpp编译成可执行文件
add_executable(main.cpp src/main.cpp)# 将新库和ros库链接起来
target_link_libraries(sys_time_lib${catkin_LIBRARIES}
)# 将可执行文件和新库链接起来
target_link_libraries(main.cppsys_time_lib${catkin_LIBRARIES}
)

2)修改package.xml (实际上不修改也可以通过编译)

  <exec_depend>message_filters</exec_depend>

3.1编译运行

1)运行时间同步节点

# 编译
ctrl+shift+broscore
source ./devel/setup.bash
rosrun sys_time main.cpp

在这里插入图片描述

2)启动相机

cd usb_cam_ws
source ./devel/setup.bash
roslaunch usb_cam usb_cam-test.launch

3)启动雷达

cd robosense_ws
source ./devel/setup.bash
roslaunch rslidar_sdk start.launch

当相机雷达全部启动后,显示接受到时间同步消息
在这里插入图片描述

4.1录制时间同步后的rosbag

lidar_camera_syn_time 是保存的rosbag名称
/sync/img 和 /sync/lidar 是录制的话题名

rosbag record -O lidar_camera_syn_time /sync/img /sync/lidar
# 查看录制好的rosbag
rosbag info lidar_camera_syn_time.bag

在这里插入图片描述

4.2rviz可视化rosbag

配置文件详细步骤见:Robosense激光雷达录制rosbag

1)打开rviz

rviz

2)导入配置文件 file–open cofig
在这里插入图片描述

3)添加相机话题
在这里插入图片描述

在这里插入图片描述

4)播放rosbag

rosbag play lidar_camera_syn_time.bag

在这里插入图片描述


⭐⭐⭐嘟嘟崽 ⭐⭐⭐
⭐⭐⭐祝你成功 ⭐⭐⭐

相关文章:

相机雷达时间同步(基于ROS)

文章目录运行环境&#xff1a;思路&#xff1a;同步前和同步后效果对比1.1创建工作空间1.2创建功能包2.1编写源文件2.2编写头文件2.3编写可执行文件2.4配置文件3.1编译运行4.1录制时间同步后的rosbag4.2rviz可视化rosbag运行环境&#xff1a; ubuntu20.04 noetic usb_cam 速腾R…...

素数环PrimeRing [3*]

目录 素数环PrimeRing [3*] 程序设计 程序分析 素数环PrimeRing [3*] 把1~N这N个整数摆成一个环,要求任意相邻两个数的和为素数。按字典序打印出以1开始的素数环 Input 一个整数N (<=10) Output 每行一个素数环。每个数之间用一个空格隔开。 无解输出 No Solution Sampl…...

mongodb 连接池配置

参考官方描述&#xff1a; 如果spring使用以下mongodb的配置&#xff0c;则默认是没有连接池的 spring:data:mongodb:host: 地址port: 27017database: 数据库名username: 账号password: 密码 每隔一两分钟没有去请求的话就会断开连接重连&#xff0c;每次都要等待5-10秒之间才…...

数据在内存中的存储(深度剖析)

目录 1.数据类型介绍 1.1类型分类 2.整形在内存中的存储 2.1原码&#xff0c;反码&#xff0c;补码 2.2大小端介绍 2.3练习 3.浮点型在内存中的存储 3.1浮点数存储规则 引入&#xff1a; 有正负的数据可以存放在有符号的变量中 只有正数的数据可以存放在无符号的变量…...

python 实现二叉搜索树的方法有哪些?

树的介绍 树不同于链表或哈希表&#xff0c;是一种非线性数据结构&#xff0c;树分为二叉树、二叉搜索树、B树、B树、红黑树等等。 树是一种数据结构&#xff0c;它是由n个有限节点组成的一个具有层次关系的集合。用图片来表示的话&#xff0c;可以看到它很像一棵倒挂着的树。…...

ORM概述

1_ORM概述[理解] 解释: 对象关系映射模型特点: 1.将类名,属性, 映射成数据库的表名和字段2.类的对象,会映射成为数据库表中的一行一行的数据 优缺点: 优点: 1.不再需要编写sql语句2.不再关心使用的是什么数据库了 缺点: 1.由于不是直接通过sql操作数据库,所以有性能损失 2_…...

程序员必知必会7种UML图(类图、序列图、组件图、部署图、用例图、状态图和活动图)画法盘点

众所周知&#xff0c;软件开发是一个分阶段进行的过程。不同的开发阶段需要使用不同的模型图来描述业务场景和设计思路&#xff0c;在不同的阶段输出不同的设计文档也是必不可少的&#xff0c;例如&#xff0c;在需求分析阶段需要输出领域模型和业务模型&#xff0c;在架构阶段…...

基于asp的搜索引擎开发和实现

随着因特网的迅猛发展、WEB信息的增加&#xff0c;用户要在信息海洋里查找信息&#xff0c;就像大海捞针一样&#xff0c;搜索引擎技术恰好解决了这一难题。目前&#xff0c;搜索引擎系统可以分类三大类&#xff0c;分别是&#xff1a;目录式搜索引擎&#xff1a;以人工方式或半…...

代码随想录刷题-字符串-实现 strStr()

文章目录实现 strStr()习题暴力解法kmp 解法实现 strStr() 本节对应代码随想录中&#xff1a;代码随想录&#xff0c;讲解视频&#xff1a;帮你把KMP算法学个通透&#xff01;&#xff08;理论篇&#xff09;_哔哩哔哩_bilibili、帮你把KMP算法学个通透&#xff01;&#xff0…...

前端已死?金三银四?你收到offer了吗?

目录 一、前言 二、“唱衰” 三、不局限于框架、前端 四、打动面试官 五、正向加成 六、小结 一、前言 最近在脉脉、知乎等平台都有人在渲染前端从业人员的危机&#xff0c;甚至使用“前端已死”的字眼&#xff0c;颇有“语不惊人死不休”的意味&#xff0c;对老鸟来说&a…...

C生万物 | 十分钟带你学会位段相关知识

结构体相关知识可以先看看这篇文章 —— 链接 一、什么是位段 位段的声明和结构是类似的&#xff0c;有两个不同&#xff1a; 位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字 在下面&#xff0c;我分别写了一个结构体和一个位段&…...

Spring Boot基础学习之(十):修改员工的信息

注意&#xff1a;spring boot专栏是一个新手项目&#xff0c;博文顺序则是功能实现的流程&#xff0c;如果有看不懂的内容可以到前面系列去了解。 本次项目所有能够使用的静态资源可以免费进行下载 静态资源 在本篇代码DAO层将通过Java文件去实现&#xff0c;在这里就不连接数…...

闭关十几天,我完成了我的毕业设计

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端&#xff08;Node.js&#xff09; &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;…...

认识rust的项目管理工具--cargo

cargo 提供了一系列的工具&#xff0c;从项目的建立、构建到测试、运行直至部署&#xff0c;为 Rust 项目的管理提供尽可能完整的手段。不过&#xff0c;我们无需再手动安装&#xff0c;之前安装 Rust 的时候&#xff08;用rustup或者vscode加插件的方式安装&#xff09;&#…...

面试常问的Linux之 I/O 复用

I/O 复用 一、I/O的概念 在Linux系统中&#xff0c;I/O&#xff08;输入/输出&#xff09;指的是计算机系统的数据交换过程&#xff0c;包括从外部设备读取数据&#xff08;输入&#xff09;和将数据发送到外部设备&#xff08;输出&#xff09;。I/O操作是Linux系统中非常重要…...

MySQL-binlog+dump备份还原

目录 &#x1f341;binlog日志恢复 &#x1f342;binlog介绍 &#x1f342;Binlog的用途 &#x1f342;开启binary log功能 &#x1f342;配置binlog &#x1f341;mysqldump &#x1f342;数据库的导出 &#x1f342;数据库的导入 &#x1f341;mysqldumpbinlog &#x1f990;…...

互联网络-单级互联网络

1.立方体单级网络 1.定义 立方体单级网络(cube)的名称来源于下图所示的三维立方体结构,如010只能连接到000、011、110,不能直接连接到对角线上的001、100、101、111。 2.例题 1.编号为0、1、2、3、4,…,15的16个处理器,用单级互联网络互联,用Cube0互联函数时,与第10…...

上海亚商投顾:沪指四连阳重回3300点 中字头个股再发力

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪大小指数今日走势分化&#xff0c;沪指低开后震荡反弹&#xff0c;创业板指盘中跌超1%。中字头个股再度发力&#x…...

LeetCode:150. 逆波兰表达式求值—栈

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;150. 逆波兰表达式求值 题目描述&#xff1a;给你一个字符串数组 token…...

C/C++每日一练(20230410) 二叉树专场(4)

目录 1. 二叉搜索树迭代器 &#x1f31f;&#x1f31f;&#x1f31f; 2. 验证二叉搜索树 &#x1f31f;&#x1f31f;&#x1f31f; 3. 不同的二叉搜索树 II &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...