本教程将向您展示如何发送四个基本形状(盒子、球体、圆柱体和箭头)。我们将创建一个程序,每秒发送一个新的标记,用不同的形状替换最后一个。
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 , 结果如下图:
本教程主要根据官方教程得来,如有侵权,请立即联系本人做出更改。