Lego-loam 算法三维建图

运行环境

  • Linux:Ubuntu18.04
  • ros:Melodic
  • Ceres Solver 2.0.0(Ubuntu18.04安装Ceres)
  • PCL 1.8.1(Ubuntu系统的PCL、Eigen卸载和安装)

====================== 运行数据集 lego-loam 39/39 ===========================

终端一:进入catkin_ws工作空间

1) source ./devel/setup.bash
2) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
3) roslaunch lego_loam run.launch   或  roslaunch lego_loam run_test.launch

终端二:进入catkin_ws工作空间

1)source ./devel/setup.bash
2) rosbag play 38.bag --clock  或  rosbag play 39.bag --clock
注意:
//(播放数据包的时候,使用的use_sim_time是仿真时间戳,所以要使用 --clock 进行数据播放。这边下载的数据包都要使用rosbag play *.bag --clock 这样的形式播放,不然,Lego-LOAM那边没法进行建图。自己录制的数据包也是要以这样的形式播放。)

//在rviz中把Fixed Frame : velodyne
//在Add中添加PointCloud2,topic:/velodyne_points 

运行结果如下:

================== 数据集 mick1.bag (mick_2021-01-27-21-34-13.bag) ===============

终端1:进入catkin_ws工作空间

1) source ./devel/setup.bash
2) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
3) roslaunch lego_loam mickx4.launch

 终端2:进入catkin_ws工作空间

1)source ./devel/setup.bash
2) rosbag play mick1.bag --clock --topic /rslidar_points /imu/data

 

 

运行 mick1.bag

 =========================数据集lego-loagm-demo =============================

终端1:进入catkin_ws工作空间

1) source ./devel/setup.bash
2) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
3) roslaunch lego_loam run.launch   或  roslaunch lego_loam run_test.launch

终端2:进入catkin_ws工作空间

1)source ./devel/setup.bash
2) rosbag play 39.bag --clock --topic /velodyne_points /imu/data

39-bag-velodyne

 ========================= 全流程 案例 ===================================

终端1:
进入catkin_ws工作空间
1) source ./devel/setup.bash
2) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
3)roslaunch lego_loam mickx4.launch   //把mickx4.launch文件换成run.launch   
// roslaunch lego_loam run.launch 

// 注意:mick4.launch 对应终端2中的 mick1.bag 
//       run.launch 对应终端2中的38.bag或39.bag
终端2:
进入catkin_ws工作空间
1)source ./devel/setup.bash           //把mick1.bag 文件 换成 38.bag/39.bag  
2) rosbag play mick1.bag --clock --topic /rslidar_points /imu/data      
// rosbag play 38.bag --clock --topic /velodyne_points /imu/data

// 注意:mick1.bag 对应 /rslidar_points    
//      38/39.bag 对应 /velodyne_points 

 如图所示 38.bag :

如图所示 mick1.bag 

/*********地图保存**********/

//LeGO-LOAM 的点云地图是发布在 /laser_cloud_surround 这个话题上的,在这篇博客[7]中提供了一种方法就是记录这个topic上的数据,然后利用 pcl_ros 包进行转换。

终端3:进入catkin_ws工作空间 source ./devel/setup.bash
//step1: 记录话题 /laser_cloud_surround 数据,这个可以在快结束的时候录制
1) rosbag record -o lego-loam-out /laser_cloud_surround
//然后录制完成后, ctrl+c 退出 ,发现 catkin_ws 目录下 .bag.active文件,变成 .bag 文件 



终端4:进入catkin_ws工作空间 source ./devel/setup.bash
//step2: 把 lego-loam-out* 这个bag的话题上的数据存为pcd文件
2) // rosrun pcl_ros bag_to_pcd lego-loam-out_2023-05-10-14-22-31.bag /laser_cloud_surround test
      rosrun pcl_ros bag_to_pcd  lego-loam-out_2024-03-07-14-48-36.bag /laser_cloud_surround test4

//这时候会在你的目录下生成一个test目录,里面会有很多个pcd文件,选最后一个就是最新的点云地图了



终端5:cd catkin_ws/test    
//pcl_viewer xxxxxx.pcd    此命令既可打开pcd文件 
3) pcl_viewer 1611754659.194505930.pcd

pcl_viewer 1611754659.082526922.pcd

run.launch

<launch>
    
    <!--- Sim Time -->
    <param name="/use_sim_time" value="true" />

    <!--- Run Rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find lego_loam)/launch/test.rviz" />

    <!--- TF -->
    <node pkg="tf" type="static_transform_publisher" name="camera_init_to_map"  args="0 0 0 1.570795   0        1.570795 /map    /camera_init 10" />
    <node pkg="tf" type="static_transform_publisher" name="base_link_to_camera" args="0 0 0 -1.570795 -1.570795 0        /camera /base_link   10" />

    <!--- LeGO-LOAM -->    
    <node pkg="lego_loam" type="imageProjection"    name="imageProjection"    output="screen"/>
    <node pkg="lego_loam" type="featureAssociation" name="featureAssociation" output="screen"/>
    <node pkg="lego_loam" type="mapOptmization"     name="mapOptmization"     output="screen"/>
    <node pkg="lego_loam" type="transformFusion"    name="transformFusion"    output="screen"/>

</launch>

 mickx4.launch

<launch>
    
    <!--- Sim Time -->
    <param name="/use_sim_time" value="true" />
 
    <node pkg="nodelet" type="nodelet" name="pcl_manager" args="manager" output="screen" />
    
    <!-- Run a passthrough filter to clean NaNs -->
    <node pkg="nodelet" type="nodelet" name="passthrough" args="load pcl/PassThrough pcl_manager" output="screen">
        <remap from="~input" to="/rslidar_points" />
        <remap from="/passthrough/output" to="/velodyne_points" />
        
        <rosparam>
        filter_field_name: z
        filter_limit_negative: True
        </rosparam>

    <rosparam>
        filter_field_name: x
        filter_limit_negative: True
        </rosparam>

    <rosparam>
        filter_field_name: y
        filter_limit_negative: True
       
        </rosparam>
    </node>

    <!--- Run Rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find lego_loam)/launch/test.rviz" />

    <!--- TF -->
    <node pkg="tf" type="static_transform_publisher" name="camera_init_to_map"  args="0 0 0 1.570795   0        1.570795 /map    /camera_init 10" />
    <node pkg="tf" type="static_transform_publisher" name="base_link_to_camera" args="0 0 0 -1.570795 -1.570795 0        /camera /base_link   10" />

 
    <!--- LeGO-LOAM -->    
    <node pkg="lego_loam" type="imageProjection"    name="imageProjection"    output="screen"/>
    <node pkg="lego_loam" type="featureAssociation" name="featureAssociation" output="screen"/>
    <node pkg="lego_loam" type="mapOptmization"     name="mapOptmization"     output="screen"/>
    <node pkg="lego_loam" type="transformFusion"    name="transformFusion"    output="screen"/>

</launch>

 

 

 

demo

lego-loam demo

参考文献
https://blog.csdn.net/weixin_42141088/article/details/115747989

https://blog.csdn.net/crp997576280/article/details/111657554?spm=1001.2014.3001.5506

https://blog.csdn.net/weixin_44444810/article/details/121659270?spm=1001.2014.3001.5506
 

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

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

相关文章

线程池不香了? 结构化并发才是王道!

我们先定义获取用户信息任务&#xff1a; 再定义获取订单信息任务&#xff1a; 然后再构造线程池并执行任务&#xff1a; 输出结果为&#xff1a; 看上去一切都刚刚好&#xff0c;但是&#xff0c;如果获取订单信息时出错了&#xff0c;此时会是什么现象呢&#xff1f;修改获取…

Java并发编程-实现多线程的四种方式

创建线程的四种方式 创建线程的四种方式包括使用继承 Thread 类、实现 Runnable 接口、使用 Callable 和 Future 接口以及利用线程池。每种方式都有其特定的优势和适用场景。通过继承 Thread 类或实现 Runnable 接口&#xff0c;可以定义线程要执行的任务&#xff0c;并通过调用…

计划任务和日志

一、计划任务 计划任务概念解析 在Linux操作系统中&#xff0c;除了用户即时执行的命令操作以外&#xff0c;还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务&#xff08;如定期备份、定期采集监测数据&#xff09;。RHEL6系统中默认已安装了at、crontab软件…

javascript中的强制类型转换和自动类型转换

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.转换函数2.强制类型转换&#xff08;1&#xff09;Number类型强转&…

【蓝桥杯】路径之谜(DFS)

一.题目描述 小明冒充 X 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走&#x…

Linux文件描述符剖析

文章目录 文件描述符文件描述符分配规则重定向软硬链接软链接&#xff08;Symbolic Link&#xff09;&#xff1a;硬链接&#xff08;Hard Link&#xff09;&#xff1a; 文件描述符 文件描述符&#xff08;File Descriptor&#xff09;是一个非负整数&#xff0c;用于标识打开…

OJ习题之——圆括号编码

圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码&#xff1a; &#xff08;1&#xff09;用一个整数序列Pp1 p2 … pn编码&#xff0c;pi代表在S中第i个右圆括号的左圆括号数量。&#xff08;记为…

C++——string(2)

5. string类非成员函数 上面的几个接口大家了解一下&#xff0c;下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的 操作&#xff0c;这里不一一列举&#xff0c;大家在需要用到时不明白了查文档即可。 试用rfind、substr、find、find_first_(not)_of void te…

WordPress供求插件API文档:用户登录

该文档为WordPress供求插件文档&#xff0c;详情请查看 WordPress供求插件&#xff1a;一款专注于同城生活信息发布的插件-CSDN博客文章浏览阅读67次。WordPress供求插件&#xff1a;sliver-urban-life 是一款专注于提供同城生活信息发布与查看的插件&#xff0c;该插件可以实…

Java中super关键字作用及解析

在 Java 中&#xff0c;super关键字主要有以下作用&#xff1a; 在子类构造方法中调用父类的构造方法&#xff1a;使用super关键字可以在子类的构造方法中显式调用父类的构造方法&#xff0c;以便继承父类的属性和行为。语法如下&#xff1a;这样可以确保父类的构造方法被正确…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

Vue+Vue CLI学习

1、Vue基础 1.1、Vue简介 &#xff08;1&#xff09;Javascript框架 &#xff08;2&#xff09;简化Dom操作 &#xff08;3&#xff09;响应式数据驱动 vue基础&#xff1b;vue-cli;vue-router;vuex;element-ui;vue3 vue文件包括html、css、js 1.2、第一个Vue程序 Vue …

python异常机制

当代码出现异常后底下代码都不会被执行了&#xff0c;也就是程序崩溃了。当然能避免异常的话尽量避免但是有的时候这个是没有办法避免的。 异常处理 &#xff08;注&#xff1a;异常处理是从上往下处理&#xff0c;所以编写代码时要注意&#xff09; 语法 try:可能出现异常…

ospf虚链路实验简述

1、ospf虚链路实验简述 ospf虚链路配置 为解决普通区域不在骨干区域旁&#xff0c;通过配置Vlink-peer实现不同区域网络设备之间建立逻辑上的连接。 实验拓扑图 r1: sys sysname r1 undo info enable int loopb 0 ip add 1.1.1.1 32 ip add 200.200.200.200 32 quit int e0/0/…

(sub)三次握手四次挥手

TCP的三次握手与四次挥手理解及面试题 序列号seq&#xff1a;占4个字节&#xff0c;用来标记数据段的顺序&#xff0c;TCP把连接中发送的所有数据字节都编上一个序号&#xff0c;第一个字节的编号由本地随机产生&#xff1b;给字节编上序号后&#xff0c;就给每一个报文段指派一…

男人的玩具系统wordpress外贸网站主题模板

垂钓用品wordpress外贸模板 鱼饵、鱼竿、支架、钓箱、渔线轮、鱼竿等垂钓用品wordpress外贸模板。 https://www.jianzhanpress.com/?p3973 身体清洁wordpress外贸网站模板 浴盐、防蚊液、足部护理、沐浴液、洗手液、泡澡用品wordpress外贸网站模板。 https://www.jianzhan…

Spring揭秘:BeanDefinitionRegistry应用场景及实现原理!

内容概要 BeanDefinitionRegistry接口提供了灵活且强大的Bean定义管理能力&#xff0c;通过该接口&#xff0c;开发者可以动态地注册、检索和移除Bean定义&#xff0c;使得Spring容器在应对复杂应用场景时更加游刃有余&#xff0c;增强了Spring容器的可扩展性和动态性&#xf…

鸿蒙ArkTS语言快速入门-TS(一)

ArkTS与TS的学习 ArkTS与TS的关系简述TypeScript&#xff08;TS&#xff09;简述基础类型1&#xff0c;let2&#xff0c;const3&#xff0c;布尔类型4&#xff0c;数字number5&#xff0c;字符串string6&#xff0c;数组Array7&#xff0c;元组 Tuple8&#xff0c;枚举 enum9&a…

【设计模式 05】原型模式

有的时候&#xff0c;我们创建对象&#xff0c;需要耗费大量时间在一些资源型操作上&#xff0c;这个时候&#xff0c;我们就可以先创建出一个模板&#xff0c;然后每次创建的时候直接从模板复制即可&#xff0c;不用反复进行耗时的资源型操作。 python代码&#xff1a; impo…

Vue-Router使用

1.安装 npm install vue-router4 2. 添加路由 新建router文件夹&#xff0c;新建文件 index.ts import { createRouter, createWebHashHistory,createWebHistory} from "vue-router";const routes [{path: /login,component: () > import("../views/Logi…