0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在ROS下面的一个组件实现Octomap显示

工程师邓生 来源:CSDN 作者:熊猫飞天 2022-09-05 10:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

常在别人论文的demo演示视频中看到能够实时显示Octomap, 在经过几番查找以后发现这个功能可以通过rviz(ROS下面的一个组件)实现。

实现的思路是将点云数据通过ROS发布到某个topic上面比如"/outputCloud",再启动 octomap 节点将数据读入该topic并发布到另一个新的topic 上面去。最后在rviz 里面接收这个新topic 达到实时显示的目的.

注:使用平台是 ubuntu14.04 ROS Indigo 版本

1.安装octomap

这个功能需要借助ros,因此我们打开一个终端.(ctrl+alt+T)输入下面指令安装octomap (可以直接使用sudo apt-get install ros-indigo-octomap* ,如果你是Ubuntu16 的把 “indigo” 替换 “kinetic” 即可)

sudo apt-get install ros-indigo-octomap-ros #安装octomap

sudo apt-get install ros-indigo-octomap-msgs

sudo apt-get install ros-indigo-octomap-server

安装octomap 在 rviz 中的插件

sudo apt-get install ros-indigo-octomap-rviz-plugins
安装上这个插件以后你可以启动 rviz ,这时候这个模块会多一个octo打头的模组.如下图所示:


79e74c9e-2ca7-11ed-ba43-dac502259ad0.png    

2.发布点云数据

这里我先使用一个我自己在实验室跑ORB生成的稠密点云文件,把这个点云文件加载然后通过一个topic发布出去。 如果你手头没有现成的点云文件可以在这个地方下载点云文件作为测试使用(test.pcd),完整的代码和数据我已经打包放在了github上,源文件代码如下:

/**
*
* 函数功能:读取pcl点云文件并发布到topic上去
* maker: crp
* data: 2016-6-8
*/

#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include

using namespace std;

int main (int argc, char **argv)
{
std::string topic,path,frame_id;
int hz=5;

ros::init (argc, argv, "publish_pointcloud");
ros::NodeHandle nh;

nh.param("path", path, "/home/crp/catkin_ws/test.pcd");
nh.param("frame_id", frame_id, "camera");
nh.param("topic", topic, "/pointcloud/output");
nh.param("hz", hz, 5);

ros::Publisher pcl_pub = nh.advertise (topic, 10);

pcl::PointCloud cloud;
sensor_msgs::PointCloud2 output;
pcl::io::loadPCDFile (path, cloud);
pcl::toROSMsg(cloud,output);// 转换成ROS下的数据类型 最终通过topic发布

output.header.stamp=ros::Time::now();
output.header.frame_id =frame_id;

cout<<"path = "<

我们通过如下代码单独启动点云发布节点

rosrun publish_pointcloud publish_pointcloud
注意: 这里你需要把path修改为你电脑上存放test.pcd文件的路径,同时注意我们使用的坐标系是“camera” (这里需要和后面和octomaptransform.launch 文件中的 frame_id 参数一致,否则你会出现Octomap没有发布数据的情况)

启动这个代码就可以看到发布的点云数据的topic.你可以使用rostopic echo 来检查是否有数据输出。我发布的点云数据的topic是“/pointcloud/output”

79fa8a98-2ca7-11ed-ba43-dac502259ad0.png

因此我用的命令为:(如果有数据输出表示你正确的读取并发布了点云数据)

rostopic echo /pointcloud/output

然后再打开新的终端运行RVIZ:
rosrun rviz rviz

点击add 按钮添加 "PointCloud2模块"

设置topic为 "/pointcloud/output"

设置FixedFram为"camera"

设置完成以后你可以看到界面中会显示出topic 发布的点云数据,如下图一样:

(一定要确保topic上面有数据,后面需要读取这个topic 转换成octomap,原来版本中使用的坐标系为“camera_rgb_frame”,修订后的坐标系为"camera")

7a086226-2ca7-11ed-ba43-dac502259ad0.png    

3.Octomap 实时显示

接下来的工作就简单了,我们自己写一个launch文件去启动 octomap_server ,创建 octomaptransform.launch 文件,填入下面代码:

poYBAGMVYWuAAkoEAAFGIQCPdp0979.jpg

注意,这个文件里面有的frame_id 和 remap topic 的值必须和发布节点中的frame_id以及数据发布的topic一致。

接下来首先启动点云发布节点

rosrun publish_pointcloud publish_pointcloud

其次启动了这个节点以后,我们再去启动Octomap服务节点, 正确启动以后会有几个 octomap 相关的 topic 发布: (如下图)
roslaunch publish_pointcloud octomaptransform.launch

7a18c0f8-2ca7-11ed-ba43-dac502259ad0.png

最后在rviz 中添加一个 “OccupancyGrid” 模块(三维格点). 设置 topic 为"/octomap_full",即可以得到如下结果:

7a38a06c-2ca7-11ed-ba43-dac502259ad0.png


如果你直接下载的我的代码【3】和数据应该的得到的是如下的效果图:

7a62c004-2ca7-11ed-ba43-dac502259ad0.png


最后我们将所有的启动命令写入到一个launch文件中,我们在publish_pointcloud 包中的 launch 文件夹下面编辑一个名为demo.launch的文件,填入下面代码:

pYYBAGMVYQmAM8HAAAEuEEZVY0M644.jpg

就可以通过上面的launch文件一键启动节点以及RVIZ了。启动命令为:

roslaunch publish_pointcloud demo.launch
到这里你已经可以将点云数据发布到一个指定的 topic 上,然后调用 Octomap 在ROS下的srv组件进行实时转换,并发布到另外一个 Octomap topic 上去.最后通过可视化工具 rviz 进行显示Octomap。

如果你在其他节点发布点云的数据,然后使用cotomap服务节点进行转换是,最重要的是要注意octomap的输入话题(topic)和数据的坐标系(frame_id)两个参数的设置,通常octomap 没有数据输出都是由于这两个参数设置错误导致的。 注意,对于实现增量式的Octomap构建(也就是像SLAM构建点云一样,一边走一边生成全局的octomap),有两种方法实现。

第一种方法是你把每次SLAM计算得到的当前时刻位姿和点云数据(当前彩色帧和深度帧)进行处理,利用这个位姿把当前时刻的点云旋转到世界坐标系下发布给Octomap 节点。

由于Octomap 本身具有维护地图的功能,它自己会去拼接八叉树地图,这可以省去很多事情。

另外一种思路就是你使用点云库自带的地图维护工具,把Octomap只当做一个转换工具,每次都发布全局的点云地图给octomap节点(随着点云数据的增大会出现程序崩溃的现象)。

第二种方法下你可以将ORB的关键帧生成点云然后一直发布更新后的点云,这个代码高博以及写过了,可在github找到. 你将这个包编译到ROS上以后,再将这个算法生成的全局点云地图发布到octomap节点上,也就可以实现实时的Octomap 啦,再做导航什么的就方便了。

以上两种思路都可以实现环境Octomap的构建,。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SLAM
    +关注

    关注

    24

    文章

    456

    浏览量

    33189
  • ROS
    ROS
    +关注

    关注

    1

    文章

    290

    浏览量

    18480
  • orb
    orb
    +关注

    关注

    0

    文章

    21

    浏览量

    10155

原文标题:Octomap 在ROS环境下实时显示

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何基于翼辉信息SylixOS开发ROS 2应用

    算法的站式解决方案,同时辅以功能强大的开发工具,助力工程师与研究人员高效完成项目开发。ROS 2 实时性、安全性、灵活性和跨平台支持等方面进行了显著的改进,为现代机器人开发提供了
    的头像 发表于 08-14 15:44 1665次阅读
    如何基于翼辉信息SylixOS开发<b class='flag-5'>ROS</b> 2应用

    【汇思博SEEK100开发板试用体验】06 天气app--使用组件导航实现设置页及页面跳转

    ,支持不同组件间传递跳转参数,提供灵活的跳转栈操作,从而更便捷地实现对不同页面的访问和复用。本文将从组件导航(Navigation)的
    发表于 07-09 16:57

    如何监听组件再次显示的事件?

    (即4子页面,为了方便理解就统讲子组件了),有叫Page1.ets的子组件,我希望
    发表于 06-30 18:02

    如何实现组件截图 -- componentSnapshot

    等,文字和图片都是根据用户信息动态生成的,整个证书显示的时候是通过Stack组件去完成的,如果只是程序里显示那么当然很简单,但是还需要将
    发表于 06-30 17:45

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了OptiSystem中调用MATLAB代码实现振幅调制。 、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 06-13 08:46

    ros2教程

    电子发烧友网站提供《ros2教程.pdf》资料免费下载
    发表于 05-23 09:12 1次下载

    【「# ROS 2智能机器人开发实践」阅读体验】视觉实现的基础算法的应用

    、机器人视觉:从理论到实践 第7章详细介绍了ROS2机器视觉领域的应用,涵盖了相机标定、OpenCV集成、视觉巡线、二维码识别以及深度学习目标检测等内容。通过学习,我认识到: 相机标定的重要性
    发表于 05-03 19:41

    【「# ROS 2智能机器人开发实践」阅读体验】机器人入门的引路书

    的快速开发的目的 ROS把功能分为一个个节点,节点之间用公用的通信接口连接 比如电机可以提供操控,转速监测,ipd控制等功能,方便各种情况调用 项目就是工作空间
    发表于 04-30 01:05

    【「# ROS 2智能机器人开发实践」阅读体验】+ROS2应用案例

    的应用。书中详细介绍了如何在ROS 2中实现二维码识别,包括二维码扫描库Zbar的使用,以及如何通过相机识别二维码。 通过学习这部分,我了解到二维码识别的基本原理和实现步骤。首先,需
    发表于 04-27 11:42

    【「# ROS 2智能机器人开发实践」阅读体验】+内容初识

    机器人技术的飞速发展,ROS 2 作为其核心工具之,为开发者提供了强大的支持。与传统的理论书籍不同,本书深入浅出地讲解了 ROS 2 的架构、开发流程以及智能机器人项目中的应用,以
    发表于 04-27 11:24

    KaihongOS操作系统:页面的生命周期介绍

    有且仅有@Entry。 只有被@Entry装饰的组件才可以调用页面的生命周期。 页面的生命周期接口包括onPageShow、onPage
    发表于 04-25 08:18

    激光焊接技术焊接血糖仪组件的工艺应用

    医疗科技领域,血糖仪作为种重要的便携式医疗检测设备,其准确性和可靠性直接关系到患者的健康监测效果。而在血糖仪的生产过程中,焊接工艺是确保组件之间稳固连接、实现电气导通的关键环节。
    的头像 发表于 03-19 14:18 467次阅读
    激光焊接技术<b class='flag-5'>在</b>焊接血糖仪<b class='flag-5'>组件</b>的工艺应用

    「极速探索HarmonyOS NEXT 」阅读体验】+Web组件

    ,则源于web开发。尽管Web应用在性能上略逊筹,但由于其庞大的用户使用基数,诸多场景下仍不可或缺。 应用中显示 Web 页面 开发
    发表于 03-10 10:39

    名单公布!【书籍评测活动NO.58】ROS 2智能机器人开发实践

    ,问题也越来越多,为了打造款能够成为通用机器人标准化软件平台的“操作系统”,ROS 22014年第次被提出,之后推出多个测试版本,并于2017 年年底发布第
    发表于 03-03 14:18

    OptiSystem应用:用MATLAB组件实现振幅调制

    本案例展示了OptiSystem中调用MATLAB代码实现振幅调制。 、建模目标 案例中,我们生成两束功率为0dBm,频率分别为192.7THz、191THz的载波,合束之后经过自定义脉冲的调制
    发表于 02-14 09:39