rviz中显示的点云与网格垂直,将保存的pcd文件转为点云在rviz中显示,并使用octomap_server将点云地图转化为八叉树地图和占据栅格地图

news2024/11/20 17:39:07

文章目录

      • 问题:点云与网格垂直
      • 背景
      • 解决方法:对点云坐标做变换,绕x轴旋转90度,将z轴指向上方
        • 将pcd转成点云,在RVIZ中显示点云图
        • 创建launch
      • rviz显示

问题:点云与网格垂直

用lego-loam建图时用rosbag录制相关点云的话题,建图结束后用rosbag play将.bag包在rviz中显示,但是由于该话题的点云发布的frame_id=/camera_init,但是rviz中默认的坐标系是base_link,并且camera_init与base_link有旋转关系,因此导致点云在rviz中显示时与rviz网格线呈垂直关系,虽然rviz可以将默认显示的xy平面改成xz平面,让点云显示正常,但是此时不能在水平状态下左右旋转点云地图。

背景

ubuntu18.04+melodic
lego-loam订阅话题/laser_cloud_surround后保存了四个.pcd文件:

在这里插入图片描述
pcd保存的路径在utility.h文件中设置

在这里插入图片描述

解决方法:对点云坐标做变换,绕x轴旋转90度,将z轴指向上方

从PCD创建PointCloud2点云,然后再在rviz中显示

将pcd转成点云,在RVIZ中显示点云图

创建pcl_xy2xz.cpp文件:

#include<ros/ros.h>  
#include<pcl/point_cloud.h>
#include<pcl_conversions/pcl_conversions.h>  
#include<sensor_msgs/PointCloud2.h>  
#include<pcl/common/transforms.h>
#include<pcl/io/pcd_io.h>
      
int main (int argc, char **argv)
{  
    ros::init (argc, argv, "lego_loam");  
    ros::NodeHandle nh;  
    ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("/lego_loam_with_c16/output", 10);  //待订阅的点云话题
    
    pcl::PointCloud<pcl::PointXYZ> cloud1,cloud2;  
    sensor_msgs::PointCloud2 output;  
    pcl::io::loadPCDFile ("/home/gyl/wheeltec_bag/lego-loam pcl/nosmog1/finalCloud.pcd", cloud1);	//自己的pcd路径

    Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();

    //绕x轴旋转一个theta角
    transform_2.rotate(Eigen::AngleAxisf(1.570795, Eigen::Vector3f::UnitX()));

    //执行变换
    //pcl::PointCloud<pcl::PointXYZ>::Ptr pPointCloudOut(new pcl::PointCloud<pcl::PointXYZ>());
    pcl::transformPointCloud(cloud1, cloud2, transform_2);

    pcl::toROSMsg(cloud2,output);// 转换成ROS下的数据类型 最终通过topic发布

    output.header.stamp=ros::Time::now();
    output.header.frame_id  ="/camera_init_xz";	//点云所在的坐标系,frame_id

    ros::Rate loop_rate(1);  
    while (ros::ok())  
    {  
        pcl_pub.publish(output);  
        ros::spinOnce();  
        loop_rate.sleep();  
    }  
    return 0;  
} 

catkin_make编译,结果报错:

CMakeFiles/urdf01_rviz_node.dir/src/pcl_xy2xz.cpp.o:在函数‘void pcl::createMapping<pcl::PointXYZ>(std::vector<pcl::PCLPointField, std::allocator<pcl::PCLPointField> > const&, std::vector<pcl::detail::FieldMapping, std::allocator<pcl::detail::FieldMapping> >&)’中:
/usr/include/pcl-1.8/pcl/conversions.h:108:对‘pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)’未定义的引用
/usr/include/pcl-1.8/pcl/conversions.h:108:对‘pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)’未定义的引用
/usr/include/pcl-1.8/pcl/conversions.h:108:对‘pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)’未定义的引用
CMakeFiles/urdf01_rviz_node.dir/src/pcl_xy2xz.cpp.o:在函数‘main’中:
/usr/include/pcl-1.8/pcl/io/pcd_io.h:56:对‘vtable for pcl::PCDReader’未定义的引用
/usr/include/pcl-1.8/pcl/io/pcd_io.h:208:对‘pcl::PCDReader::read(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2&, Eigen::Matrix<float, 4, 1, 0, 4, 1>&, Eigen::Quaternion<float, 0>&, int&, int)’未定义的引用

collect2: error: ld returned 1 exit status
urdf01_rviz/CMakeFiles/urdf01_rviz_node.dir/build.make:127: recipe for target '/home/gyl/hello_w/devel/lib/urdf01_rviz/urdf01_rviz_node' failed
make[2]: *** [/home/gyl/hello_w/devel/lib/urdf01_rviz/urdf01_rviz_node] Error 1
CMakeFiles/Makefile2:5439: recipe for target 'urdf01_rviz/CMakeFiles/urdf01_rviz_node.dir/all' failed
make[1]: *** [urdf01_rviz/CMakeFiles/urdf01_rviz_node.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j8 -l8" failed

在这里插入图片描述

原因就是CMakeLists.txt中没有配置好相关信息:

......

find_package(catkin REQUIRED COMPONENTS
  pcl_ros
  pcl_conversions
)
find_package(PCL REQUIRED QUIET)

catkin_package(
  DEPENDS PCL
)

include_directories(
  ${catkin_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
)

link_directories(
	include
	${PCL_LIBRARY_DIRS}
)

add_executable(自己的项目名称 src/pcl_xy2xz.cpp)
target_link_libraries(自己的项目名称 ${catkin_LIBRARIES} ${PCL_LIBRARIES})

重新catkin_make编译就成功了。

创建launch
<launch>
	<!-- 运行创建的pcl_xy2xz.cpp文件 -->
    <node pkg="urdf01_rviz" type="pcl_xy2xz" name="pcl_xy2xz" output="screen" respawn="false"/>
	
	<!-- 使用octomap_server将点云地图转化为八叉树地图和占据栅格地图 -->
    <node pkg="octomap_server" type="octomap_server_node" name="octomap_server">
        <!-- resolution in meters per pixel -->
        <param name="resolution" value="0.1" />
        <!-- name of the fixed frame, needs to be "/map" for SLAM -->
        <param name="frame_id" type="string" value="/camera_init_xz" />
        <!-- max range / depth resolution of the kinect in meter -->
        <param name="sensor_model/max_range" value="50.0" />
        <param name="latch" value="true" />
        <!-- max/min height for occupancy map, should be in meters -->
        <param name="pointcloud_max_z" value="1000" />
        <param name="pointcloud_min_z" value="-1000" />
        <param name="ground_filter_angle" value="3.14" />
        <!-- topic from where pointcloud2 messages are subscribed -->
        <remap from="cloud_in" to="/lego_loam_with_c16/output" />
    </node>
	
	<!-- 启动rviz -->
    <node pkg="rviz" type="rviz" name="rviz" />

</launch>

rviz显示

点击add 按钮添加 “PointCloud2模块”
设置topic为 “/lego_loam_with_c16/output”
设置FixedFram为 “camera_init_xz”

点云显示:

请添加图片描述请添加图片描述
八叉树地图显示:

请添加图片描述请添加图片描述

参考博客:

  1. 【激光SLAM】Lego_loam使用教程
  2. Octomap 在ROS环境下实时显示
  3. 使用octomap_server将点云地图转化为八叉树地图和占据栅格地图

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

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

相关文章

以哈战争或推动美国「屠杀」比特币

摘要&#xff1a;加密货币公司急于在国会对以色列被袭引发的审查之前采取行动。 作者&#xff1a;JASPER GOODMAN 来源&#xff1a;POLITICO 编译&#xff1a;WEEX Exchange 原文标题&#xff1a;How Elizabeth Warren is making Hamas crypto’s latest Washington woe 编者按…

Python万圣节蝙蝠

目录 系列文章 前言 蝙蝠 程序设计 程序分析 运行结果 尾声 系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want5…

架构师日记-33个常见编码漏洞大揭秘

一 前言 在软件编码的过程中&#xff0c;经常会遇到各种棘手的问题和挑战&#xff1a; •高并发、大数据引起的性能问题&#xff1b; •SQL注入、跨站脚本攻击的安全问题&#xff1b; •协议、编码的规范设计问题等&#xff1b; 本文就从最常见的性能、安全和设计等几个维…

2023.10.19 关于 单例模式 详解

目录 引言 单例模式 饿汉模式 懒汉模式 懒汉模式线程安全问题 分析原因 引言 设计模式为编写代码的 约定 和 规范 阅读下面文章前建议点击下方链接明白 对象 和 类对象 对象和类对象 单例模式 单个实例&#xff08;对象&#xff09;在某些场景中有特定的类&#xff0c;…

Python学习-----Day09

一、利用装饰器来获取函数运行的时间、 #导入time模块 import timedef decorated(fn):def inner():#time.time获取函数执行的时间a time.time() # func开始的时间fn()b time.time() # func结束的时间print(f"{fn.__name__}程序运行的总数时间:{b - a}秒")return…

View 自定义 - 绘制前的准备 DecorView

一、概念 图中可以看出 ViewRoot 最后一步是绘制&#xff0c;在绘制之前系统会有一些准备&#xff0c;即前面几个步骤&#xff1a;创建PhoneWindow、DecorView、ViewRootmpl。 二、DecorView 的创建 DecorView的创建开始是从 Activity 中 setContentView() 开始的。 创建抽象类…

项目管理的10个经典法则

大家好&#xff0c;我是老原。 前两天给大家更新了一篇实用文&#xff0c;分享了6张能搞定项目管理的思维导图&#xff0c;很多粉丝朋反馈对项目更有思路了。 那6张思维导图都需要建立在一定的项目管理法则上&#xff0c;今天我也给你们整了项目管理的10个经典法则。 建议大…

域控主机 带瘤

1.装环境 是dns环境 加入域 二.文件上传 2.cs木马生成 服务器 75.233 上传木马成功 上线

C语言之通讯录的实现篇优化版

目录 动态内存管理 通讯录声明 静态版本 动态版本 ​初始化通讯录 静态版本 动态版本 Add增加通讯录 静态版本 动态版本 Checkcapacity增容 DestroyContact释放动态空间 文件操作 SaveContact保存信息到文件中 初始化通讯录 旧版本 文件版本 LoadContact加载…

Hudi-源码-索引-bloom 索引

文章目录 前言问题原理TagLocation流程入口LookupIndexfindMatchingFilesForRecordKeysHoodieKeyLookupHandle 如何优化问题一 如何避免大量 IO问题二 如何减少计算 Hash问题三 使用什么结构优化比对结果如何初始化树查询 总结 前言 Hudi 系列文章在这个这里查看 https://gith…

图论与网络优化

2.概念与计算 2.1 图的定义 2.1.1 定义 图(graph) G G G 是一个有序的三元组&#xff0c;记作 G < V ( G ) , E ( G ) , ψ ( G ) > G<V(G),E(G),\psi (G)> G<V(G),E(G),ψ(G)>。 V ( G ) V(G) V(G) 是顶点集。 E ( G ) E(G) E(G) 是边集。 ψ ( G ) \…

【合集】Redis——Redis的入门到进阶 结合实际场景的Redis的应用

前言 Redis是一个开源的内存数据结构存储系统&#xff0c;也被称为键值存储系统。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了丰富的操作命令&#xff0c;可以对这些数据结构进行快速的读写操作。Redis具有高性能、高可用性…

驱动:驱动相关概念,内核模块编程,内核消息打印printk函数的使用

一、驱动相关概念 1.操作系统的功能 向下管理硬件&#xff0c;向上提供接口 操作系统向上提供的接口类型&#xff1a; 内存管理&#xff1a;内存申请&#xff08;malloc&#xff09; 内存释放&#xff08;free&#xff09;等 文件管理&#xff1a; 通过文件系统格式对文件ext2…

this指向详解

目录 一&#xff1a;严格模式与非严格模式 1.严格模式的开启 2.this指向的一些情况&#xff1a; 二&#xff1a;如何指定this的值&#xff1f; 1.在调用时指定this的值 2.在创建时指定this的值 ​编辑三&#xff1a; 结尾 一&#xff1a;严格模式与非严格模式 在非严格模…

项目管理之分析项目特点的方法

在管理项目时&#xff0c;了解项目的目标和实现方法可以帮助我们更好地规划和执行项目。根据项目的目标和实现方法的不同&#xff0c;可以将项目分为四种类型&#xff1a;地、水、火和气。 对于工程项目&#xff0c;采用基于活动任务的计划管理方法&#xff0c;使用活动网络图…

聊聊分布式架构08——SpringBoot开启微服务时代

目录 微服务架构时代 快速入门 入门详解 SpringBoot的自动配置 石器时代&#xff1a;XML配置bean 青铜时代&#xff1a;SpringConfig 铁器时代&#xff1a;AutoConfigurationImportSelector 手写简单Starter SpringApplication启动原理 微服务架构时代 Spring Boot的…

LabVIEW中将枚举与条件结构一起使用

LabVIEW中将枚举与条件结构一起使用 枚举是一个具有相应数值的字符串标签型列表。在LabVIEW&#xff08;U8 &#xff0c; U16-默认值和U32&#xff09;中以无符号整数形式应用。 例如&#xff0c;可以有一个枚举保存四个季节&#xff0c;在这种情况下&#xff0c;每个字符串都…

2022最新版-李宏毅机器学习深度学习课程-P26RNN-2

一、RNN网络结构 与时间有关的反向传播&#xff08;每次不同&#xff09; 损失函数 实验其实不容易跑&#xff0c;因为他的损失函数曲线幅度很大 画出来差不多是这个样子。突然一下升高是因为从右到左碰到陡峭的地方梯度一下变大了&#xff0c;所以弹回去了。 原作者在训练时…

JAVA反射(原理+使用)

引言 反射是一种机制&#xff0c;能够使java程序在运行过程中&#xff0c;检查&#xff0c;获取类的基本信息&#xff08;包&#xff0c;属性&#xff0c;方法等&#xff09;&#xff0c;并且可以操作对象的属性和方法 反射是框架实现的基础 反射的原理 讲述反射的原理之前&a…

covfefe 靶机/缓冲区溢出

covfefe 信息搜集 存活检测 详细扫描 后台网页扫描 80 端口 31337 端口 网页信息搜集 分别访问扫描出的网页 说有三个不允许看的内容 尝试访问 第一个 flag 访问 .ssh 文件 继续根据提示访问 获取了三个 ssh 文件 ssh 登录 在下载的 id_rsa_pub 公钥文件中发现了…