【可视化】娱乐一下,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 publisher
        set_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 type
        marker_.type = visualization_msgs::Marker::CUBE;

        //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;

        //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;

        //set marker action
        marker_.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

  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RViz是ROS(机器人操作系统)中的一个可工具,它可以用于显示机器人的状态信息,包括传感器数据、运动状态、地图等。其中,点云(PointCloud)是一种常见的传感器数据类型,用于表示三维空间中的离散点云。下面介绍如何在RViz中可点云: 1. 启动ROS系统 首先需要启动ROS系统,可以使用以下命令: ``` roscore ``` 2. 启动点云生成器 使用ROS中的点云生成器(PointCloud Generator)生成点云数据。例如,使用深度相机可以得到点云数据。启动点云生成器的命令可以根据具体的硬件设备和软件实现而不同。 3. 启动RViz 启动RViz,输入以下命令: ``` rosrun rviz rviz ``` 4. 添加点云显示器 在RViz中,可以添加不同类型的显示器来显示不同的信息。要显示点云数据,需要添加点云显示器。 在RViz左侧的“Displays”面板中,选择“Add”按钮,然后选择“By topic”选项卡。在“Topic”下拉列表中选择点云数据的话题(Topic),例如“/camera/depth/points”,然后选择“PointCloud2”作为消息类型(Message Type)。单击“Ok”按钮,将会在RViz场景中添加一个新的点云显示器。 5. 调整点云显示器参数 可以通过“Displays”面板中的“Properties”选项卡来调整点云显示器的参数。例如,可以调整点云的颜色、透明度、大小等。 6. 可点云数据 现在,可以在RViz中可点云数据了。如果点云数据已经在话题(Topic)中发布了,将会在RViz中看到点云的三维模型。可以通过鼠标操作来旋转、平移和缩放点云模型。 总之,使用RViz点云是一个相对简单的过程,只需要几个简单的步骤即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值