雷达标定与解析

融合雷达与解析雷达数据的相关代码。感谢开源社区的贡献。以下代码继承了很多人的工作。
如果是单雷达:
直接进行标定,所以就是接收相关的话题然后发布。
lidar_calibration_params.yaml:

calibration:在这个接口里面
  x_offset: 0.0
  y_offset: 0.0
  z_offset: 0.4
  roll_offset: -0.074
  pitch_offset: 0
  yaw_offset: -1.57

input_topic: "/lslidar_point_cloud"
output_topic: "/fusion_points"

lidar_calibration_node.cpp

#include <ros/ros.h>
#include <sensor_msgs/PointCloud2.h>
#include <tf2/LinearMath/Quaternion.h>
#include <tf2/LinearMath/Matrix3x3.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl_ros/transforms.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <Eigen/Geometry>
#include <iostream>

// 标定参数结构体
struct CalibrationParams
{
  double x_offset;
  double y_offset;
  double z_offset;
  double roll_offset;
  double pitch_offset;
  double yaw_offset;
};

ros::Publisher calibrated_pub;
CalibrationParams calibration_params;

void loadCalibrationParams(const ros::NodeHandle& nh)
{
  nh.getParam("calibration/x_offset", calibration_params.x_offset);
  nh.getParam("calibration/y_offset", calibration_params.y_offset);
  nh.getParam("calibration/z_offset", calibration_params.z_offset);
  nh.getParam("calibration/roll_offset", calibration_params.roll_offset);
  nh.getParam("calibration/pitch_offset", calibration_params.pitch_offset);
  nh.getParam("calibration/yaw_offset", calibration_params.yaw_offset);

  // 打印加载的参数以确认
  ROS_INFO("Loaded calibration parameters:");
  ROS_INFO("x_offset: %f", calibration_params.x_offset);
  ROS_INFO("y_offset: %f", calibration_params.y_offset);
  ROS_INFO("z_offset: %f", calibration_params.z_offset);
  ROS_INFO("roll_offset: %f", calibration_params.roll_offset);
  ROS_INFO("pitch_offset: %f", calibration_params.pitch_offset);
  ROS_INFO("yaw_offset: %f", calibration_params.yaw_offset);
}

void laserCallback(const sensor_msgs::PointCloud2ConstPtr& cloud_msg)
{
  // Create transformation matrix
  Eigen::Affine3f transform = Eigen::Affine3f::Identity();
  transform.translation() << calibration_params.x_offset, calibration_params.y_offset, calibration_params.z_offset;
  Eigen::AngleAxisf rollAngle(calibration_params.roll_offset, Eigen::Vector3f::UnitX());
  Eigen::AngleAxisf pitchAngle(calibration_params.pitch_offset, Eigen::Vector3f::UnitY());
  Eigen::AngleAxisf yawAngle(calibration_params.yaw_offset, Eigen::Vector3f::UnitZ());
  transform.rotate(yawAngle * pitchAngle * rollAngle);

  // 打印转换矩阵以确认
  std::cout << "Transformation Matrix:" << std::endl;
  std::cout << transform.matrix() << std::endl;

  // Transform the point cloud
  sensor_msgs::PointCloud2 calibrated_cloud_msg;
  pcl_ros::transformPointCloud(transform.matrix(), *cloud_msg, calibrated_cloud_msg);

  // Publish the calibrated point cloud
  calibrated_cloud_msg.header = cloud_msg->header;
  calibrated_pub.publish(calibrated_cloud_msg);
}

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

  // 获取参数服务器中的参数
  std::string input_topic;
  std::string output_topic;
  int queue_size;

  nh.param<std::string>("input_topic", input_topic, "/lslidar_point_cloud");
  nh.param<std::string>("output_topic", output_topic, "/calibrated_point_cloud");
  nh.param<int>("queue_size", queue_size, 10);

  // 加载标定参数
  loadCalibrationParams(nh);
  // std::cout<<input_topic<<std::endl;
  // std::cout<<output_topic<<std::endl;

  // 订阅输入点云话题
  ros::Subscriber laser_sub = nh.subscribe(input_topic, queue_size, laserCallback);

  // 发布标定后的点云话题
  calibrated_pub = nh.advertise<sensor_msgs::PointCloud2>(output_topic, queue_size);

  ros::spin();
  return 0;
}

启动launch:

<launch>
  <rosparam file="$(find lidar_calibration)/config/lidar_calibration_params.yaml" command="load"/>

  <node pkg="lidar_calibration" type="lidar_calibration_node" name="lidar_calibration_node" output="screen">
  </node>

</launch>

以上是单个雷达的标定的,接下来是融合点云的数据标定:
来源于一个开源项目:git clone https://github.com/Hliu0313/fusion_pointclouds
也是直接修改接口就行了:

#参数加载对应 loadparams.h/loadparams.cpp,若修改params.yaml对应修改加载函数即可
fusion_lidar_num: 3                                                      #融合 lidar 点云数量 2/3/4
topics:                                                                                 #订阅 lidar 点云话题
#   parent_pc_topic: "/livox/lidar"
#   child_pc_topic1: "/right/rslidar_points"
#   child_pc_topic2: "/left/rslidar_points"
#   child_pc_topic3: "/livox/lidar"
  parent_pc_topic: "/livox/lidar"
  child_pc_topic1: "/right/rslidar_points"
  child_pc_topic2: "/left/rslidar_points"
  child_pc_topic3: "/livox/lidar"

  fusion_pc_topic: "/fusion_points"                       #融合后发布点云话题名称
  fusion_pc_frame_id: "rslidar"                 #融合后发布点云话题名称

#注意
#1.点云话题少于4个时,为了时间同步回调函数适应不同数量雷达,空位child_pc_topic可以填入parent_pc_topic
#例如 需要融合"/front/rslidar_points" 与"/left/rslidar_points"点云数据
#
#fusion_lidar_num: 2
#parent_pc_topic: "/front/rslidar_points"
#child_pc_topic1: "/left/rslidar_points"
#child_pc_topic2: "/front/rslidar_points" "
#child_pc_topic3: "/front/rslidar_points" 

#---->   如果只是融合点云数据,下方参数填 false 即可    <------- 
set_params_tf:  true                                                     #是否对点云进行坐标变换 
set_params_internal_bounds: true                       #是否对点云内边界 XYZ 滤除
set_params_external_bounds: true                       #是否对点外内边界 XYZ 滤除
set_dynamic_params: true                                        #是否开启动态调整,配合 rqt_reconfigure 动态调整坐标变化参数 ---> 解决标定参数不准确,实时微调

# cpc1_to_ppc:                                                                   #child_pc1_to_parent_pc,坐标变化信息传入节点,按需填写即可
#    x: -0.75
#    y: -0.8
#    z: 0.58
#    roll: 0.05
#    pitch: 0.01
#    yaw: 0.06
# cpc2_to_ppc:
#    x: -0.75
#    y: 0.72
#    z: 0.58
#    roll: 0.0
#    pitch: 0.0
#    yaw: -0.1
# cpc3_to_ppc:
#    x: 0.0
#    y: 0.0
#    z: 0.0
#    roll: 0.0
#    pitch: 0.0
#    yaw: 0.0

cpc1_to_ppc:                                                                   #child_pc1_to_parent_pc,坐标变化信息传入节点,按需填写即可
   x: -0.8
   y: -0.5
   z: 1.06
   roll: 0.04
   pitch: 0.0
   yaw: 0.0

cpc2_to_ppc:
   x: -0.75
   y: 0.75
   z: 1.06
   roll: -0.018
   pitch: 0.018
   yaw: -0.168

# cpc2_to_ppc:
#    x: -0.
#    y: 0.
#    z: 0.0
#    roll: -0.0
#    pitch: -0.0
#    yaw: -0.0

cpc3_to_ppc:
   x: 0.0
   y: 0.0
   z: 0.0
   roll: 0.0
   pitch: 0.0
   yaw: 0

# Dynamic rqt_reconfigure default bounds
internal_bounds :  #内边界
  x_min: 0.0
  x_max: 0.0
  y_min: 0.0
  y_max: 0.0
  z_min: 0.0
  z_max: 0.0

external_bounds :  #外边界
  x_min: -100
  x_max: 100
  y_min: -100
  y_max: 100
  z_min: -5
  z_max: 5

最后是聚类,也是来源于一个开源项目:
https://blog.csdn.net/weixin_42905141/article/details/122977315?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171888729016777224495812%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171888729016777224495812&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-122977315-null-null.142v100control&utm_term=%E4%B8%9A%E4%BD%99%E5%86%99%E7%9A%84%E4%B8%80%E4%B8%AA%E7%B2%97%E7%89%88demo%EF%BC%8C%E6%9C%89%E5%BE%88%E5%A4%9A%E5%9C%B0%E6%96%B9%E6%98%AF%E5%8F%AF%E4%BB%A5%E6%94%B9%E8%BF%9B%E7%9A%84%EF%BC%8C%E5%A4%A7%E5%AE%B6%E8%87%AA%E8%A1%8C%E4%BF%AE%E6%94%B9%E5%90%A7&spm=1018.2226.3001.4187
非常感谢他的工作,接下来要做的就是把障碍物的信息用我们需要的方式重新就行发布就行了。我这里直接借鉴一下之前的比赛所遇到的障碍物的接口,我很喜欢他的这一系列的定义。
请添加图片描述
在这个接口里面主要是用上述msg来定义雷达给出的数据。
上述单雷达标定,多雷达融合,以及雷达的聚类都放到这里面了:

https://github.com/chan-yuu/lidar_ws

后续会继续做雷达处理的相关的工作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…

想让Python序列切片更高效?这些技巧你不可不知!

目录 1、自定义类实现切片 🍏 1.1 实现__getitem__方法 1.2 支持正负索引与步长 2、利用 collections.abc 模块 🧠 2.1 继承MutableSequence类 2.2 重写关键方法 3、使用标准库itertools.slice 🍲 3.1 itertools工具介绍 3.2 slice函数应用实例 4、通过生成器实…

Docker Compose--安装Nginx--方法/实例

原文网址&#xff1a;Docker Compose--安装Nginx--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker Compose如何安装Nginx。 目录结构 ├── config │ ├── cert │ │ ├── xxx_bundle.pem │ │ └── xxx.key │ ├── conf.d │ …

APP客户端接口本地缓存,降低请求量和请求峰值,减少云资源成本

背景 静态信息&#xff1a;非实时有状态的数据 针对资源位、评价等静态信息在xx点高峰时进行缓存&#xff0c;达到降低请求量和请求峰值的目标。 在成本预算控制下&#xff0c;云资源成本和WAF都受限于请求峰值。 出于业务和数据安全考虑&#xff0c;公司希望接入阿里云的WAF&a…

头歌——机器、深度学习——手写体识别

第1关&#xff1a;神经网络基本概念 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.神经网络基本概念。 神经网络基本概念 神经网络由输入层、隐藏层、输出层组成&#xff1b;…

安卓逆向经典案例—H5appXX运维

H5app的class不一定是android.webkit.WebView 也可能是腾讯X5内核或者是uc webview 殊途同归也要去hook webview的系统函数和可调式方法setWebContentsDebuggingEnabled。突破sign算法&#xff0c;输出协议和加密算法的作用是什么&#xff1f;分析c-sign值 在加密的位置下断点 …

爱心商城管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;企业管理&#xff0c;用户管理&#xff0c;论坛管理&#xff0c;商品管理&#xff0c;公告管理&#xff0c;用户捐赠 企业账户功能包括&#xff1a;系统首页&#xff0c;个人中…

2009年-2022年 地级市-环境污染处罚数据

环境污染处罚数据是环境保护领域中重要的信息资源&#xff0c;它记录了因违反环保法律法规而受到行政处罚或法律制裁的具体情况。这些数据对于提高公众的环保意识、促进企业采取环保措施以及推动环境治理具有重要作用。 数据内容概述 违法行为的主体&#xff1a;即受到处罚的…

【树形dp 换根法 BFS】2581. 统计可能的树根数目

本文涉及知识点 CBFS算法 动态规划汇总 图论知识汇总 树形dp 换根法 BFS LeetCode 2581. 统计可能的树根数目 Alice 有一棵 n 个节点的树&#xff0c;节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示&#xff0c;其中 edges[i] [ai, bi] &#xf…

LoRaWAN在嵌入式网络通信中的应用:打造高效远程监控系统(附代码示例)

引言 随着物联网&#xff08;IoT&#xff09;技术的发展&#xff0c;远程监控系统在各个领域的应用越来越广泛。LoRaWAN&#xff08;Long Range Wide Area Network&#xff09;作为一种低功耗广域网通信协议&#xff0c;因其长距离传输、低功耗和高可靠性等特点&#xff0c;成为…

Apollo9.0 PNC源码学习之Planning模块(二)—— planning_component

前面文章: Apollo9.0 PNC源码学习之Planning模块(一)—— 规划概览 0 Planning代码框架速览 1 planning_component源码解析 modules/planning/planning_component/planning_component.h #pragma once#include <memory>#

在vue项目中集成cesium

首先创建一个新的vue项目 安装vite中cesium插件 https://github.com/nshen/vite-plugin-cesium 安装插件 npm i cesium vite-plugin-cesium vite -D配置插件 注释原有样式 修改代码 效果

04--MySQL8.0_JDBC

第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量、数组、集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系; 后来我们学习了数据库管理软件MySQL,可以方便的管理数据1。 那么如何将它俩结合起来呢?即…

【面试干货】Java中的四种引用类型:强引用、软引用、弱引用和虚引用

【面试干货】Java中的四种引用类型&#xff1a;强引用、软引用、弱引用和虚引用 1、强引用&#xff08;Strong Reference&#xff09;2、软引用&#xff08;Soft Reference&#xff09;3、弱引用&#xff08;Weak Reference&#xff09;4、虚引用&#xff08;Phantom Reference…

【Docker】Docker操作容器命令

1、容器 1.1简介 容器镜像是一个软件的轻量级独立可执行软件包&#xff0c;包含运行它所需的一切&#xff1a;代码&#xff0c;运行时&#xff0c;系统工具&#xff0c;系统库&#xff0c;设置。不管环境如何&#xff0c;集装箱化软件都可以运行相同的Linux和Windows应用程序…

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了&#xff0c;难不成是被华为淘汰的&#xff1f;在华为混不下去了吧&#xff1f;身体没啥毛病吧&#xff0c;我们这体检可是很严的。” 近日&#xff0c;一位华为员工在朋友圈爆料&#xff0c;自己在面试时遭到了面试官的无理取闹和人身攻击&#xff0c;原因仅仅是因…

C语言中操作符详解(二)

OK&#xff0c;今天继续为诸君带来有关C语言中操作符的讲解 一 . 位操作符 C语言中的位操作符我相信大家并不陌生&#xff0c;我们在之前就已经接触过了一些 位操作符&#xff08;位操作符的操作数只能是整数&#xff09;&#xff1a; &#xff08;1&#xff09;& &…

头歌——机器学习——集成学习案例

第1关&#xff1a;基于集成学习模型的应用案例 任务描述 本次任务我们将会使用银行营销数据集&#xff08;来源于UCI数据集&#xff1a;UCI Machine Learning Repository &#xff09;,该数据集共45211条数据&#xff0c;涉及葡萄牙银行机构的营销活动&#xff0c;通过一些与…

idea http client GET 请求 报503错误

idea 提供的 http client 插件&#xff0c;在 GET 请求时总是 报503 的错误&#xff0c;但请求URL可以在浏览器中正常访问。 GET localhost:8080/student Response file saved. > 2024-06-20T160906.503.html 有一种原因跟本地配置的代理有关&#xff0c;如下图。如果在…

ubuntu22.04笔记: 更换为阿里源

没有按照LTS 版本 会遇到下面问题&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/691625646 Ubuntu 22.04代号为&#xff1a;jammy Ubuntu 20.04代号为&#xff1a;focal Ubuntu 19.04代号为&#xff1a;disco Ubuntu 18.04代号为&#xff1a;bionic Ubuntu …