仿真实现lio_sam建图和ndt_matching定位

news2024/11/22 13:32:19

文章目录

  • 一、仿真环境
  • 二、lio_sam建图
    • 1.修改配置文件
    • 2.开始建图
  • 三、ndt_matching定位
    • 1.新建启动文件
    • 2.启动
  • 总结


一、仿真环境

使用现有开源的仿真环境—从零开始搭建一台ROS开源迷你无人车,作者已经配置好小车模型以及gazebo环境,imu频率已改为200HZ,文中也有详细的说明,这里就不再介绍。

启动仿真

roslaunch steer_mini_gazebo steer_mini_sim_sensors_VLP16_lio_sam.launch 

在这里插入图片描述话题如下:

/ackermann_steering_controller/cmd_vel
/ackermann_steering_controller/odom
/clock
/gains/left_rear_joint/parameter_descriptions
/gains/left_rear_joint/parameter_updates
/gains/right_rear_joint/parameter_descriptions
/gains/right_rear_joint/parameter_updates
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
/imu/data
/joint_states
/rosout
/rosout_agg
/tf
/tf_static
/velodyne_points

控制小车移动,打开一个终端,录制所有话题(也可录制需要的话题),会自动在终端所在的文件夹下根据当前时间产生bag文件。

rosbag record -a

二、lio_sam建图

lio_sam的安装测试可参考Lego-LOAM和LIO_SAM的使用及地图的处理

1.修改配置文件

在LIO-SAM/config下的params.yaml文件中

修改为自己小车的话题

  # Topics
  pointCloudTopic: "/velodyne_points"              
  imuTopic: "/imu/data"                         
  odomTopic: "/odometry/imu"                   
  gpsTopic: "odometry/gpsz"                   

修改保存路径

  # Export settings
  savePCD: true                              
  savePCDDirectory: "/Downloads/"        

修改imu到雷达的坐标变换

  # Extrinsics: T_lb (lidar -> imu)
  extrinsicTrans: [0.0, 0.0, 0.0]
  extrinsicRot: [1, 0, 0,
                  0, 1, 0,
                  0, 0, 1]
  extrinsicRPY: [1, 0, 0,
                  0, 1, 0,
                  0, 0, 1]

其它的保持默认即可。

2.开始建图

	roslaunch lio_sam run.launch 
	rosbag play your.bag 

在这里插入图片描述
保存的PCD—GlobalMap.pcd

在这里插入图片描述

三、ndt_matching定位

1.新建启动文件

使用Autoware.ai中的ndt_matching定位模块。为了适配前方,需要对应仿真的数据进行如下修改

autoware.ai/src/autoware/documentation/autoware_quickstart_examples/config路径:
新建headless_setup_steer_mini.yaml 内容如下:

tf_x: 0
tf_y: 0
tf_z: 0.115
tf_yaw: 0
tf_pitch: 0
tf_roll: 0

localizer: velodyne
use_sim_time: false

.autoware/data/tf 路径:
新建tf_steer_mini.launch

<launch>
<!-- worldからmapへのtf -->
<node pkg="tf2_ros"  type="static_transform_publisher" name="world_to_map" args="0 0 0 0 0 0 /world /map" />
<!-- mapからmobilityへのtf -->
<!-- <node pkg="tf2_ros"  type="static_transform_publisher" name="map_to_mobility" args="0 0 0 0 0 0 /map /mobility" />-->
<node pkg="tf2_ros"  type="static_transform_publisher" name="base_link_to_velodyne" args="0 0 0.115 0 0 0 /base_link /velodyne" />
</launch>

autoware.ai/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo路径下:
新建my_map_steer_mini.launch内容如下

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

  <include file="$(env HOME)/.autoware/data/tf/tf_steer_mini.launch"/>
  
  <node pkg="map_file" type="points_map_loader" name="points_map_loader" args="noupdate $(env HOME)/.autoware/data/map/pointcloud_map/GlobalMap.pcd"/>


</launch>

autoware.ai/src/autoware/core_perception/lidar_localizer/launch路径下:
新建ndt_matching_steer_mini.launch内容如下:

<launch>

  <arg name="method_type" default="0" /> <!-- pcl_generic=0, pcl_anh=1, pcl_anh_gpu=2, pcl_openmp=3 -->
  <arg name="use_gnss" default="0" />
  <arg name="use_odom" default="true" />
  <arg name="use_imu" default="true" />
  <arg name="imu_upside_down" default="false" />
  <arg name="imu_topic" default="/imu/data" />
  <arg name="queue_size" default="1" />
  <arg name="offset" default="linear" />
  <arg name="get_height" default="false" />
  <arg name="use_local_transform" default="false" />
  <arg name="sync" default="false" />
  <arg name="output_log_data" default="false" />
  <arg name="gnss_reinit_fitness" default="500.0" />

  <node pkg="lidar_localizer" type="ndt_matching" name="ndt_matching" output="log">
    <param name="method_type" value="$(arg method_type)" />
    <param name="use_gnss" value="$(arg use_gnss)" />
    <param name="use_odom" value="$(arg use_odom)" />
    <param name="use_imu" value="$(arg use_imu)" />
    <param name="imu_upside_down" value="$(arg imu_upside_down)" />
    <param name="imu_topic" value="$(arg imu_topic)" />
    <param name="queue_size" value="$(arg queue_size)" />
    <param name="offset" value="$(arg offset)" />
    <param name="get_height" value="$(arg get_height)" />
    <param name="use_local_transform" value="$(arg use_local_transform)" />
    <param name="output_log_data" value="$(arg output_log_data)" />
    <param name="gnss_reinit_fitness" value="$(arg gnss_reinit_fitness)" />
    <remap from="/points_raw" to="/sync_drivers/points_raw" if="$(arg sync)" />
  </node>

</launch>

同时修改ndt_matching.cpp中的里程计接收话题

  // ros::Subscriber odom_sub = nh.subscribe("/vehicle/odom", _queue_size * 10, odom_callback);  //default
  ros::Subscriber odom_sub = nh.subscribe("/ackermann_steering_controller/odom", _queue_size * 10, odom_callback);

autoware.ai/src/autoware/core_perception/points_downsampler/launch路径下:
新建points_downsample_steer_mini.launch

<launch>
  <arg name="sync" default="false" />
  <arg name="node_name" default="voxel_grid_filter" />
  <arg name="points_topic" default="/velodyne_points" />
  <arg name="output_log" default="false" />
  <arg name="measurement_range" default="200" />

  <node pkg="points_downsampler" name="$(arg node_name)" type="$(arg node_name)">
    <param name="points_topic" value="$(arg points_topic)" />
    <remap from="/points_raw" to="/sync_drivers/points_raw" if="$(arg sync)" />
    <param name="output_log" value="$(arg output_log)" />
    <param name="measurement_range" value="$(arg measurement_range)" />
  </node>
</launch>

autoware.ai/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo路径下:
新建my_localization_steer_mini.launch

<launch>

  <!-- setting path parameter -->
  <arg name="get_height" value="true" />

  <!-- Setup 
  <include file="$(find runtime_manager)/launch_files/setup_tf.launch">
    <arg name="x" value="1.2" />
    <arg name="y" value="0.0" />
    <arg name="z" value="2.0" />
    <arg name="yaw" value="0.0" />
    <arg name="pitch" value="0.0" />
    <arg name="roll" value="0.0" />
    <arg name="frame_id" value="/base_link" />
    <arg name="child_frame_id" value="/velodyne" />
    <arg name="period_in_ms" value="10"/>
  </include>-->
  
<!-- <include file="$(find vehicle_description)/launch/vehicle_model.launch" />  -->

  <!-- points downsampler -->
  <include file="$(find points_downsampler)/launch/points_downsample_steer_mini.launch" />

  <!-- nmea2tfpose -->
  <!-- <include file="$(find gnss_localizer)/launch/nmea2tfpose.launch"/>  -->

  <!-- ndt_matching -->
  <include file="$(find lidar_localizer)/launch/ndt_matching_steer_mini.launch">
    <arg name="get_height" value="$(arg get_height)" />
  </include>

</launch>

2.启动

roslaunch autoware_quickstart_examples my_map_steer_mini.launch
roslaunch autoware_quickstart_examples my_localization_steer_mini.launch
rviz
给定初始位姿(必须)
rosbag play your.bag

效果图:

在这里插入图片描述


总结

以上实现了仿真场景下使用lio_sam建图以及ndt_matching定位的过程,仅仅作为测试使用,存在仿真场景较小,没有在机器人模型中添加gps数据的问题,整体上达到定位的要求。

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

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

相关文章

Leetcode—2586.统计范围内的元音字符串数【简单】

2023每日刷题&#xff08;二十二&#xff09; Leetcode—2586.统计范围内的元音字符串数 实现代码 class Solution { public:int vowelStrings(vector<string>& words, int left, int right) {int ans 0;for(int i left; i < right; i) {string s words[i];i…

原子化 CSS 真能减少体积么?

前言 最近看到这样一篇文章&#xff1a;《要喷也得先做做功课吧&#xff1f;驳Tailwind不好论》 个人觉得说的还是有一定道理的&#xff0c;就是该作者的语气态度可能稍微冲了点&#xff1a; 不过他说的确实有道理&#xff0c;如果这种原子化工具真的如评论区里那帮人说的那么…

苹果手机的警示!电子产品无线升级=救命的机会

大家日常使用手机都知道&#xff0c;手机系统和软件三天两头就收到更新提醒。 只要用户手机联网&#xff0c;就可以想更新就更新&#xff0c;觉得原本使用顺手也可以不更新。 可各大厂商的初衷是好的&#xff0c;希望改善系统的一些bug问题&#xff0c;也会给我们带来一些全新功…

强化学习中的基本术语

0.引言 本篇文章主要介绍强化学习中最基本的术语&#xff08;不包含具体算法&#xff09;&#xff0c;主要提供给刚入门强化学习的朋友们&#xff0c;让大家快速掌握一些基本术语&#xff0c;之后对看强化学习算法内容有着更好地理解。 1.基本术语 1.1.state 中文称为“状态…

基于ssm企业人事管理系统

功能如图所示 摘要 基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架的企业人事管理系统是一种高效、可定制化的人力资源管理解决方案。该系统整合了现代企业的人力资源需求&#xff0c;提供了一套功能丰富的工具&#xff0c;用于管理员工信息、薪资、考勤、招聘…

C语言--typedef的使用

前言 在C语言中使用结构体时必须加上struct这个关键字,那有没有办法省略这个呢?要想达到这个目的就 需要用到关键字typedef,顾名思义”类型定义”。 typedef 数据类型 新的别名; 它是用来操作数据类型。其主要作用有两个: 1.给一个较长较复杂的类型取一个简单的别名。 2.给类…

python 之字典的相关知识

文章目录 字典的基本特点&#xff1a;1. 定义2. 键唯一性3. 可变性4. 键的类型 基本操作&#xff1a;字典的创建1. 花括号 {}2. dict() 构造函数3. 键值对的 dict() 构造函数使用 zip() 函数创建字典&#xff1a;注意事项访问字典中的值修改和添加键值对删除键值对 字典方法&am…

平衡树相关笔记

引入 二叉查找树 二叉查找树&#xff08;Binary Search Tree&#xff09;&#xff0c;又名二叉搜索树。满足以下性质&#xff1a; 对于非空的左子树&#xff0c;左子树点权值小于根节点。对于非空的右子树&#xff0c;左子树点权值大于根节点。二叉查找树的左右子树均是二叉…

Android修行手册 - 模板匹配函数matchTemplate详解,从N张图片中找到是否包含五星

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

麒麟v10 安装jenkins

1.想安装哪个版本&#xff1f; https://pkg.jenkins.io/redhat-stable/ 我们查看我们想要哪个版本&#xff1a; 4年前安装的是 Jenkins2.279 版本 现在在docker 上安装的是Version 2.425 版本 2.碰到到的问题 1.安装老版本的Jenkins&#xff0c;会出现安装的插件不兼容&…

win版redis详细安装教程

一、下载 github下载地址 https://github.com/MicrosoftArchive/redis/releases 可选择&#xff1a;下载msi包或zip压缩包 这里我选择的是zip压缩包&#xff0c;直接通过cmd命令窗口操作即可。 二、安装步骤 1、解压Redis压缩包 选中压缩包&#xff0c;右键选择解压&#…

WordPress 主题QUX DUX加强版

模板简介&#xff1a; QUX主题是由轻语博客在大前端DU主题的基础上集成了Ucenter&Market插件后修改加强版&#xff0c;在原有主题的基础上迎合市场增加了很多的功能。主题已解密去授权。 更新内容&#xff1a; 新增关闭注册验证码&#xff08;主题设置–会员中心&#xff…

【黑马程序员】SpringCloud——微服务

文章目录 前言一、服务架构演变1. 单体架构2. 分布式架构2.1 服务治理 3. 微服务3.1 微服务结构3.2 微服务技术对比3.3 企业需求 二、SpringCloud兼容性 三、服务拆分及远程调用1. 服务拆分1.1 服务拆分注意事项1.2 导入服务拆分 Demo 2. 远程调用2.1 根据订单 id 查询订单功能…

2023年10月CSDN客服月报|解决9个重大问题、12个次要问题、12个一般问题,处理5个用户需求

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉报告》第25期&#xff0c;接下来就请大家一同回顾我们10月份解决的bug&#xff5e; 一、重大问题 1、全站无法访问 反馈量&#xff1a;90问题原因&#xff1a;DDOS攻击具体表现&…

day3 ARM

【昨日作业】 .text .global start _start: mov r0,#0 存放sum mov r1,#1 存放相加的数值 loop: cmp r1,#100 bhi wh add r0,r0,r1 add r1,r1,#1 b loop wh: b wh .end 【内存读写指令】 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 c语言内存…

【Python3】【力扣题】231. 2 的幂

【力扣题】题目描述&#xff1a; 此题&#xff1a;n为整数&#xff08;32位有符号整数&#xff09;&#xff0c;x为整数。 2 的幂次方都大于0。若幂为负数&#xff0c;则0<n<1&#xff0c;n不为整数。 因此&#xff0c;n为正整数&#xff0c;x为0和正整数。 若二进制表示…

学为贵雅思写作备考

准确通顺&#xff0c;言之有物 两次读不懂&#xff0c;6分以下&#xff0c; 6分没有印象&#xff0c;味同嚼蜡&#xff0c;但是没错&#xff08;书面语过关&#xff09; 英语比较过关 8-9分&#xff0c;很有见地 6-7单个的句子读得懂&#xff0c;前后是贯通的、逻辑是通顺…

决策式AI与生成式AI

人工智能中深度学习&#xff0c;是一种受人脑的生物神经网络机制启发&#xff0c;并模仿人脑来解释、处理数据的机器学习技术&#xff0c;它能自动对数据进行特征提取、识别、决策和生成。它可以从不同的维度进行划分&#xff0c;如果按模型的特点来划分可分为决策式AI和生成式…

open clip论文阅读摘要

看下open clip论文 Learning Transferable Visual Models From Natural Language Supervision These results suggest that the aggregate supervision accessible to modern pre-training methods within web-scale collections of text surpasses that of high-quality crowd…

我的AIGC部署实践02

我的AIGC部署实践02 上次的教程我们实现了在趋势云平台上创建项目并运行对应的代码。虽然有比较好的结果&#xff0c;不过很多时候我们往往需要根据自己的需要更改代码&#xff0c;那么代码运行及部署的流程是怎么样的呢&#xff1f;让我们继续往下看吧。 1.学习准备 官方代码…