ROS显示路径之visualization/Marker

本教程将向您展示如何发送四个基本形状(盒子、球体、圆柱体和箭头)。我们将创建一个程序,每秒发送一个新的标记,用不同的形状替换最后一个。
1.在工作空间创建一个usingmarker的功能包:

catkin_create_pkg using_markers roscpp visualization_msgs

2.在src/basic _ shapes. cpp中粘贴以下内容:

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>

int main(int argc, char  *argv[])
{
        //初始化
        ros::init(argc, argv, "basic_shapes");
        ros::NodeHandle  nh;

        ros::Rate   r(1);
        ros::Publisher   marker_pub = nh.advertise<visualization_msgs::Marker>("visualization_maker", 1);

        //设置你的初始形状为正方体
        uint32_t  shape = visualization_msgs::Marker::CUBE;  //enum visualization_msgs::Marker::<unnamed>::CUBE = 1

        while(ros::ok())
        {
                visualization_msgs::Marker marker;    //Marker是一个结构体模板
                //设置frame ID 和 timstamp ,具体信息可以参考TF 教程
                marker.header.frame_id = "/my_frame";
                marker.header.stamp = ros::Time::now();

                //为marker设置命名空间和ID,创建不同的ID
                //任何带有相同的命名空间和ID被发送,都会覆盖先前的那个marker
                marker.ns = "basic_shapes";
                marker.id = 0;

                //设置marker的类型。初始化是CUBE, 接着循环SPHERE,ARROW,CYLINDER
                marker.type = shape;

                //设置marker的操作:ADD, DELETE, and new in ROS indigo:3(DELETEALL)
                marker.action = visualization_msgs::Marker::ADD;

                //设置marker的位姿。这是6个自由度,相对于header中特定的坐标系和时间戳
                marker.pose.position.x = 0;
                marker.pose.position.y = 0;
                marker.pose.position.z = 0;
                marker.pose.orientation.x = 0.0;
                marker.pose.orientation.y = 0.0;
                marker.pose.orientation.z = 0.0;
                marker.pose.orientation.w = 0.0;

                //设定marker的大小----- 1x1x1 表示边长为1m
                marker.scale.x = 1.0;
                marker.scale.y = 1.0;
                marker.scale.z = 1.0;

                //设定颜色----- 确保将  alpha  设置为非零值
                marker.color.r = 0.0f;
                marker.color.g = 1.0f;
                marker.color.b = 0.0f;
                marker.color.a = 1.0;

                marker.lifetime = ros::Duration();

                //发布marker
                while (marker_pub.getNumSubscribers() < 1)  //返回与当前发布者建立连接的订阅者的数量
                {
                        if(!ros::ok())
                        {
                                return 0;
                        }
                        ROS_WARN_ONCE("Please create a subsciber to the marker");
                        sleep(1);
                }
                marker_pub.publish(marker);
                
                //不同形状之间循环
                switch (shape)
                {
                case visualization_msgs::Marker::CUBE:
                        shape = visualization_msgs::Marker::SPHERE;
                        break;
                case visualization_msgs::Marker::SPHERE:
                        shape = visualization_msgs::Marker::ARROW;
                        break;
                case visualization_msgs::Marker::ARROW:
                        shape = visualization_msgs::Marker::CYLINDER;
                        break;
                case visualization_msgs::Marker::CYLINDER:
                        shape = visualization_msgs::Marker::CUBE;
                        break;
                }
                r.sleep();
        }
        return 0;
}

3.在CMakeLists.txt文件中加入:

add_executable(basic_shape src/basic_shape.cpp)

target_link_libraries(basic_shape
  ${catkin_LIBRARIES}
)

4.编译执行文件,并启动rviz来订阅话题:visualization_maker,并将坐标系改为:my_frame , 结果如下图:
在这里插入图片描述
本教程主要根据官方教程得来,如有侵权,请立即联系本人做出更改。