Rviz教程-Marker:发送基本的形状(C++)
来源:互联网 发布:mysql删除数据库 编辑:程序博客网 时间:2024/06/11 13:20
描述:显示如何使用 visualization_msgs/Marker 消息发送基本形状(立方体,球体,圆柱体,矢量)到rviz。
1. 介绍
不像其他的显示,Maker Display让你能够在不知道数据的任何解释的情况下观察数据。反而,基本形状通过 visualization_msgs/Marker消息显示,例如箭头,盒子,球和线。
这个教程显示如何发送四个基本形状(立方体,圆球,圆柱体和箭头)。将会创建一个程序,每秒发送一个新的marker,用不同的形状替代上一个。
2. 创建一个包
在开始之前,创建一个名为using_markers的包,在包路径下的某处:
catkin_create_pkg using_markers roscpp visualization_msgs
3. 发送Markers
3.1 代码
粘贴下面代码到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 n; ros::Rate r(1); ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1); // Set our initial shape type to be a cube uint32_t shape = visualization_msgs::Marker::CUBE; while (ros::ok()) { visualization_msgs::Marker marker; // Set the frame ID and timestamp. See the TF tutorials for information on these. marker.header.frame_id = "/my_frame"; marker.header.stamp = ros::Time::now(); // Set the namespace and id for this marker. This serves to create a unique ID // Any marker sent with the same namespace and id will overwrite the old one marker.ns = "basic_shapes"; marker.id = 0; // Set the marker type. Initially this is CUBE, and cycles between that and SPHERE, ARROW, and CYLINDER marker.type = shape; // Set the marker action. Options are ADD, DELETE, and new in ROS Indigo: 3 (DELETEALL) marker.action = visualization_msgs::Marker::ADD; // Set the pose of the marker. This is a full 6DOF pose relative to the frame/time specified in the 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 = 1.0; // Set the scale of the marker -- 1x1x1 here means 1m on a side marker.scale.x = 1.0; marker.scale.y = 1.0; marker.scale.z = 1.0; // Set the color -- be sure to set alpha to something non-zero! marker.color.r = 0.0f; marker.color.g = 1.0f; marker.color.b = 0.0f; marker.color.a = 1.0; marker.lifetime = ros::Duration(); // Publish the marker while (marker_pub.getNumSubscribers() < 1) { if (!ros::ok()) { return 0; } ROS_WARN_ONCE("Please create a subscriber to the marker"); sleep(1); } marker_pub.publish(marker); // Cycle between different shapes 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(); }}
现在编辑包中的Cmakelist.txt文件,添加;
add_executable(basic_shapes src/basic_shapes.cpp)target_link_libraries(basic_shapes ${catkin_LIBRARIES})
3.2 代码解释
一点点拆解代码:
#include <ros/ros.h>#include <visualization_msgs/Marker.h>
rose被包括进来了,也看到消息信息也被包含。
int main( int argc, char** argv ){ ros::init(argc, argv, "basic_shapes"); ros::NodeHandle n; ros::Rate r(1); ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1);
看起来很熟悉,初始化rose,在话题 visualization_marker上创建一个ros::Publisher。
uint32_t shape = visualization_msgs::Marker::CUBE;
这里创建一个整数用作跟踪所发布的形状。这里将要使用的第四个类型都用同样的方式使用,所以我们能够简单的交换来展示四个不同的形状。
while (ros::ok()) { visualization_msgs::Marker marker; // Set the frame ID and timestamp. See the TF tutorials for information on these. marker.header.frame_id = "/my_frame"; marker.header.stamp = ros::Time::now();
程序的开始阶段,创建一个 visualization_msgs/Marker,并且开始填充它。这里的header是roslib/Header。设置frame_id为/my_frame。在运行着的系统中,这个坐标系和需要的marker的坐标系被插入坐标系相关联。
marker.ns = "basic_shapes"; marker.id = 0;
命名空间ns和id被用作创建这个marker的唯一的名字。如果一个marker消息被相同的ns和id的节点接受的话,那么新的marker将会取代之前的那个marker。
marker.type = shape;
type域指定发送的marker的种类。可用的type被集合在visualization_msgs/Marker中。这里设置type到shape变量,这个每次循环都会改变。
marker.action = visualization_msgs::Marker::ADD;
action域指定marker将会做什么。选项是 visualization_msgs::Marker::ADD
和visualization_msgs::Marker::DELETE. ADD有时会出错,真实的意思是创建或者改变。
在indigo中新的部分是:一个新的action被添加,用作删除特定Rviz显示中的所有marker,不管ID或者名称空间。值是3并且在未来的ROS版本中消息将会改变值为visualization_msgs::Marker::DELETEALL。
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;
这里设置marker的位姿。
marker.scale.x = 1.0; marker.scale.y = 1.0; marker.scale.z = 1.0;
现在指定marker的尺寸。
marker.color.r = 0.0f; marker.color.g = 1.0f; marker.color.b = 0.0f; marker.color.a = 1.0;
指定marker的颜色。每个成员应该在0和1之间。alpha值为0意味着完全透明,1意味着完全不透明。
marker.lifetime = ros::Duration();
lifetime域指定marker在被自动删除之前会坚持多久。ros::Duration()意味着从不自动删除。
如果一个新的marker消息在lifetime之前被接收,lifetime将会在新的marker消息中被重置为这个值。
while (marker_pub.getNumSubscribers() < 1) { if (!ros::ok()) { return 0; } ROS_WARN_ONCE("Please create a subscriber to the marker"); sleep(1); } marker_pub.publish(marker);
我们会等待marker的订阅,并且之后发布marker。注意你也能使用latched publisher作为替代代码。
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; }
这段代码显示所有的四个形状当发布一个marker消息时。基于当前的形状,设置接下来将要发布的形状。
r.sleep(); }
睡眠并且循环到顶部。
3.3 编译代码
$ cd %TOP_DIR_YOUR_CATKIN_WORKSPACE%$ catkin_make
3.4 运行代码
rosrun using_markers basic_shapes
4. 观察marker
- Rviz教程-Marker:发送基本的形状(C++)
- Rviz教程-Marker:点和线(C++)
- Rviz教程(五):Interactive Markers: Writing a Simple Interactive Marker Server
- Rviz教程(十一):Rviz in Stereo
- rviz--显示类型-Marker
- Rviz教程(二):Markers: Sending Basic Shapes (C++)
- Rviz教程(三):Markers: Points and Lines (C++)
- Rviz教程(一):用户指南
- 百度地图 Android SDK - 标注(Marker)的基本使用
- 百度地图 Android SDK - 标注(Marker)的基本使用
- ROS RViz基本学习笔记(一)
- ROS RViz基本学习笔记(二)
- (十)ROS在rviz中显示空间中的直线(visualization_msgs/Marker 消息)
- SVG中常用基本形状教程
- SVG中常用基本形状教程
- Rviz教程(十):Librviz: Incorporating RViz into a Custom GUI
- 2、ROS的rviz学习(1)
- Rviz教程(四):Interactive Markers: Getting Started
- HDFS中JAVA API的使用
- JVM调优总结(七)-典型配置举例1
- CAS自定义登录
- ubuntu16.04 编译和配置openni2 opencv2 libfreenect2(OpenKinect)
- Event Handing guide for iOS
- Rviz教程-Marker:发送基本的形状(C++)
- 在本地用命令行创建一个git仓库,并推送到远程
- js 创建map
- JVM调优总结(六)-分代垃圾回收详述2
- 开始
- Android中Socket大文件断点上传
- 常用网站分享
- Linux 下安装 numpy 和 scipy
- java异常体系____异常处理机制