雷达标定与解析

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

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

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
使用 JavaScript 编写的 Squareshooter 游戏及其源代码   项目:使用 JavaScript 编写的 Squareshooter 游戏(附源代码) 这款游戏是双人游戏。这是一款使用 JavaScript 编写的射击游戏,带有门户和强化道具。在这里,每个玩家都必须控制方形盒子(作为射手)。这款射击游戏的主要目标是射击对手玩家以求生存。当它射击对手时,它会获得一分。 游戏制作 该游戏仅使用 HTML 和 JavaScript 开发。该游戏的 PC 控制也很简单。 对于玩家 1: T:朝你上次动作的方向射击 A:向左移动 D:向右移动 W:向上移动 S:向下移动 对于玩家2: L:朝你上次移动的方向射击 左箭头:向左移动 右箭头:向右移动 向上箭头:向上移动 向下箭头:向下移动 游戏会一直进行,直到您成功射击对手或对手射击您为止。游戏得分显示在顶部。所有游戏功能均由 JavaScript 设置,而布局和其他次要功能则由 HTML 设置。 如何运行该项目? 要运行此项目,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要运行此游戏,首先,通过单击 index.html 文件在浏览器中打开项目。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白云千载尽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值