【可视化】娱乐一下,rviz上画个3D框
搞点云3D目标检测少不了要将检测结果展示出来秀一把,这时候rviz就可以发挥重要作用了。借助于rviz的Marker,允许通过发送visualization_msgs/Marker或者visualization_msgs/MarkerArray消息以可编程的形式添加各种基本形状在rviz中进行3D展示。说到底,marker它就是一个用来标记的东西。如果我们给定marker一个position和orientation(位置和姿态),rviz就会在画图区域的指定位置生成一个指定方向的marker,这个marker的形状我们可以在程序中自由选择,可以是立方体,箭头等。如何给marker一个orientation和position那自然就是一方发布消息,由marker来接收消息,消息里面包含了marker的位置和姿态等信息。
这篇小文章就演示一下我们常用的一个功能,在rviz上画3D检测框。要求不高,我们也就先画一个孤零零的3D框。 Marker是通过接受消息进而在rviz上展示,这基本上就归纳了我们要做的事情:1).创建消息发布者;2).创建消息;3).发布与接收消息。
#include "ros/ros.h"
#include "visualization_msgs/Marker.h"class MarkerPublisher{
public:MarkerPublisher(ros::NodeHandle& nh){pub_marker_ = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);//initialize marker publisherset_marker_fixed_property();};void Publish(){while (pub_marker_.getNumSubscribers() < 1) {sleep(1);}marker_.header.stamp = ros::Time();pub_marker_.publish(marker_);};void set_marker_fixed_property(){/*decide from which view we can see the marker*/marker_.header.frame_id = "livox_frame";marker_.ns = "my_namespace";marker_.id = 0;//set marker typemarker_.type = visualization_msgs::Marker::CUBE;//set marker positionmarker_.pose.position.x = 0;marker_.pose.position.y = 0;marker_.pose.position.z = 0;//set marker scalemarker_.scale.x = 2.0; //mmarker_.scale.y = 2.0;marker_.scale.z = 2.0;//decide the color of the markermarker_.color.a = 1.0; // Don't forget to set the alpha!marker_.color.r = 0.0;marker_.color.g = 1.0;marker_.color.b = 0.0;//set marker actionmarker_.action = visualization_msgs::Marker::ADD;marker_.lifetime = ros::Duration(); //(sec,nsec),0 forever};private:ros::Publisher pub_marker_;visualization_msgs::Marker marker_;
};int main(int argc, char **argv){ros::init(argc, argv, "marker_worker");ros::NodeHandle nh;MarkerPublisher mp(nh);//ros::Rate rate(50);//while (ros::ok()) {mp.Publish();// rate.sleep();//}ros::spin();return 0;
}
我们首先是创建了一个消息发布者,要发布的消息类型为visualization_msgs::Marker,消息topic为"visualization_marker"。
pub_marker_ = nh.advertise<visualization_msgs::Marker>("visualization_marker", 10);//initialize marker publisher
然后是填充消息各个字段的内容。
marker.header.frame_id = "livox_frame"
用于表示和此数据关联的帧,在坐标系变化中可以理解为数据所在的坐标系名称。
marker.ns = "my_namespace";
marker.id = 0;
id和命名空间关联起来,形成唯一的id,用于将各个标志物区分开来。我这里只显示一个标志物,id为0就可以了。
marker_.type = visualization_msgs::Marker::CUBE;
标志物的形状类型,可供选择的类型有很多,譬如:
uint8 ARROW=0//箭头
uint8 CUBE=1//立方体
uint8 SPHERE=2//球
uint8 CYLINDER=3//圆柱体
uint8 LINE_STRIP=4//线条(点的连线)
uint8 LINE_LIST=5//线条序列
uint8 CUBE_LIST=6//立方体序列
uint8 SPHERE_LIST=7//球序列
uint8 POINTS=8//点集
uint8 TEXT_VIEW_FACING=9//显示3D的文字
uint8 MESH_RESOURCE=10//网格
uint8 TRIANGLE_LIST=11//三角形序列
//set marker position
marker_.pose.position.x = 0;
marker_.pose.position.y = 0;
marker_.pose.position.z = 0;
标志物在坐标系中的位置。
//set marker scale
marker_.scale.x = 2.0; //m
marker_.scale.y = 2.0;
marker_.scale.z = 2.0;
标志物在各个方向上的尺寸,这里以m为单位。
//decide the color of the marker
marker_.color.a = 1.0; // Don't forget to set the alpha!
marker_.color.r = 0.0;
marker_.color.g = 1.0;
marker_.color.b = 0.0;
设置颜色,但是要注意这里还有一个透明度(marker_.color.a)的设置。
//set marker action
marker_.action = visualization_msgs::Marker::ADD;
对标志物的动作,有一下几种:
uint8 ADD=0
uint8 MODIFY=0
uint8 DELETE=2
uint8 DELETEALL=3
marker_.lifetime = ros::Duration(); //(sec,nsec),0 forever
标志物显示持续的时间,roscpp
里有两种时间表示方法:时刻 (ros::Time)
和时长(ros::Duration)
。其中Duration可以是负数。
ros::Duration::Duration(uint32_t _sec, uint32_t _nsec)
ros::Duration::Duration(double t)
//_sec是秒,_nsec是纳秒
定义完了消息,我们就可以发布消息了。这里我仅仅发布了一次消息,让标志物永久显示。最后在rviz上看到的标志物就是下面这个样子的。
【参考文献】
https://www.jianshu.com/p/acbe1b8631dc
https://blog.csdn.net/zhanghm1995/article/details/84644984
https://blog.csdn.net/u013834525/article/details/80447931
【可视化】娱乐一下,rviz上画个3D框相关推荐
- html中矩形坐标,js怎么根据坐标在图片上画出矩形框?
如图本地上传的图片,并点击获取到这个图片里每个地方的坐标,根据4个角坐标在图片上画出矩形框,该怎么画?大神支招. 我图片是显示在div里的,是不是应该用canvas显示图片? 代码: Document ...
- 【目标检测】在图像上画bounding box框,生成带真实标签gt的图片
[目标检测]在图像上画bounding box框,生成带真实标签gt的图片 问题/Motivation 数据格式 用到的库 实际代码` 结果展示 问题/Motivation 在制作完数据集后,想看一下 ...
- Matlab 在图片上画虚线矩形框
matlab在图片上rectangle详解 Rectangle 属性 矩形的外观和行为 矩形属性控制矩形对象的外观和行为.通过更改属性值,您可以修改矩形的特定方面.使用圆点表示法查询和设置属性. h ...
- Cesium在地球上添加一个3D立方体
接此: https://blog.csdn.net/bcbobo21cn/article/details/110300047 var redBox = viewer.entities.add({nam ...
- label和velodyne数据通过mayavi在点云图上画3D标注框并可视化
公司的label和velodyne数据参考自kitti数据集格式,算法主要集成自pointpillar+second,但只做雷达数据,没有kitti中各种相机的配合,所以不需要calib文件,这时就需 ...
- VR线上智能园区3D可视化电子沙盘工厂大数据平台
随着"一带一路"的成功建设以及"全球科技化4.0"的到来.使得我国经济快速发展,同时VR线上3D展示与电子沙盘3D可视化技术随着高兴技术产业的不断发展,商迪3D ...
- 3D建模可视化公司VR线上全景展厅
现如今传统的平面房产展示已经难以满足客户的需求了,疫情当下VR线上虚拟展厅无疑是当下最受关注的一项技术,VR全景线上展示是基于虚拟现实3D可视化技术结合3D全景建模去还原真实场景.可在Web端720° ...
- matplotlib柱状图上方显示数据_可视化技能之Matplotlib(上)|可视化系列01
作者:蜇虫适航 来源:蜇虫适航 Matplotlib可以说是Python最声名远扬的可视化库了,也是Python数据分析库的"三驾马车"之一.Matplotli ...
- matlab绘制棒棒糖,可视化技能之Matplotlib(上)|可视化系列01
简介 Matplotlib可以说是Python最声名远扬的可视化库了,也是Python数据分析库的"三驾马车"之一.Matplotlib是基础而非常强大的可视化库,Seaborn等 ...
最新文章
- 一张图看懂华为2018年年报
- 一个电脑能装几块固态_花了20000块给电脑升级了磁盘阵列,速度达到10G连续读写...
- 淘宝用了mysql,您呢?
- 树形结构:使用栈实现,快排,先序遍历,归并排序,后序遍历
- 判断一个int数组中的元素是否存在重复
- 【读书笔记】--- 《码出高效:java开发手册》
- 指点聚源码论坛全站源码 WordPress内核
- “智享未来 知行合一”,开为科技助力企业开启人工智能新时代
- Linux下ip route、ip rule、iptables的关系(转
- html中怎么让图片做背景透明背景图片,透明背景图片怎么做?
- 3U VPX高性能数据处理板(XC7K325T FMC载板)
- 相机存储卡不小心格式化怎么恢复呢?
- 街篮中服务器维修什么时候能结束,街头篮球手游1月6日微信iOS维护公告 服务器扩容...
- 关键20小时,快速学会任何技能
- Win10如何取消开机密码?Win10取消开机密码步骤
- strong标签和b标签,dfn标签,abbr和acronym标签,em和i标签完整介绍
- IDEA 断点调试,为啥断点没有起作用
- 齐岳定制1, 8-萘酰亚胺类荧光化合物,基于萘酰亚胺的fluorogenic荧光探针,双光子、内质网ER靶向双光子荧光探针NI-OPD
- 文献《MDA: A Formal Approach to Game Design and Game Research 》笔记整理
- Kubernetes新近kubectl及CNI漏洞修复,Rancher 2.2.1发布
热门文章
- 自己动手写一个分库分表中间件(三)数据源路由实现
- JAVA中的延时队列DelayQueue
- 豆瓣电影api接口数据
- 【PyTorch深度学习实践】08_Softmax分类器(多分类)
- 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现多种手机打电话...
- 独立开发变现周刊(第39期):在线表情包生成器,月流览量1千2百万
- Lichee_RV学习系列---认识Lichee Rv Dock、环境搭建和编译第一个程序
- Mythtype公式对齐和分栏分节符后删除空白页
- Java调用阿里OCR接口实现印刷文字识别
- 内卷时代,华为云引领移动办公新潮流