ros1, 不用include 头文件 geometry_msgs/Point.h, 但是依赖了geometry_msgs功能包
#include
//单独一个marker的头文件
#include
//marker vector的头文件
#include
ros2
#include
//单独一个marker的头文件
#include
//marker vector的头文件
#include
//形点的头文件
#include
visualization_msgs::MarkerArray markerArray;
visualization_msgs::Marker marker;
geometry_msgs::Point pt;
markerArray.markers.reserve(n);//根据需求确定n的值
marker.action=visualization_msgs::Marker::DELETEALL;
markerArray.markers.emplace_back(marker);
DELETEALL 操作是在ROS Indigo版本中新增加的,用来删除某个topic前一周期中的所有的Marker显示,所以一般在MarkerArray的第一个元素就push这个marker_delete。注意删除的是所有的,无论namespace 和id是多少。action设置了这个操作后不需要设置其他参数,
//选择系统自带的基础坐标系
marker.frame_id="base_link";
//ros1的获取方式ros::Time::now()
//ros2的获取方式 node.get_clock()->now()
marker.header.stamp=ros::Time::now();
//生命周期,ROS1时间段函数ros::Duration(1),单位秒
//ROS2时间段函数rclcpp::Duration::from_nanoseconds(1*10^9),单位纳秒
marker.lifetime = ros::Duration();//这里没有设置时间参数,表示无限长,系统不会自动删除。
//命名空间
marker.ns="hdmap_lines";
//id
marker.id=0;
注意:
//类型
marker.type=visualization_msgs::Marker::LINE_STRIP;
//操作:ADD,DELETE,DELETEALL,一共三种
marker.action=visualization_msgs::Marker::ADD;
类型有:LINE_STRIP 实线、 LINE_LIST 虚线 CUBE 圆柱体、 ARROW 箭头、CYLINDER SPHERE、TEXT_VIEW_FACING文字
注意:
操作:ADD,DELETE,DELETEALL
注意:DELETEALL是用来删除一个topic中所有的marker,DELETE是删除指定命名空间和id的marker.
//位置
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 = 1.0;//一般是1
注意:
marker.scale.x = 1.0;
marker.scale.y = 1.0;
marker.scale.z = 1.0;
该数字表示各个方向的尺寸大小,单位是m, 都取1表示一立方米的大小
marker.color.r = 0.0f;
marker.color.g = 1.0f;
marker.color.b = 0.0f;
marker.color.a = 1.0;//设置透明度
注意:color.a等于0时,marker是完全透明的,无法看见
pt.x=1;
pt.y=1;
marker.points.emplace_back(pt);
pt.y+=1;
marker.points.emplace_back(pt);
markerArray.emplace_back(std::move(marker));
注意:用了std::move后,marker里面的字符串以及容器类变量就变成空的了,需要重新赋值。
如果marker的action选择TEXT_VIEW_FACING,那么需要给marker.text赋值,是个string,若是显示固定的字符串,那么可以直接用如下赋值
marker.text="adbcd";//直接赋值
若是想实时地显示某个变量地值,那么可以用stringstream类对象来将变量的值转换成字符串,若是多次转换用同一个对象,记得每次要提前清空,用str(" ")或clear()
int count=6;
int value=7;
std::stringstream context;//定义一个字符串流
context<<"count: "<<count<<std::endl
<<"value: "<<value<<std::endl;
//str()成员函数用来获取内容,或者重设内容,str("")表示清空内容
marker.text=context.str();