福州企业做网站,权威的徐州网站建设,尚义网站建设,大型网站建站ROS笔记之visualization_msgs-Marker学习 code review! 文章目录 ROS笔记之visualization_msgs-Marker学习一.line_strip例程二.line_list例程一二.line_list例程二二.TEXT_VIEW_FACING例程三.附CMakeLists.txt和package.xml五.关于odom、base_link和map坐标系六.关于visualiz…ROS笔记之visualization_msgs-Marker学习 code review! 文章目录 ROS笔记之visualization_msgs-Marker学习一.line_strip例程二.line_list例程一二.line_list例程二二.TEXT_VIEW_FACING例程三.附CMakeLists.txt和package.xml五.关于odom、base_link和map坐标系六.关于visualization_msgs/Marker 的 frame_locked七.visualization_msgs/Marker 的 lifetime八.visualization_msgs/Marker 的action九.visualization_msgs/Marker消息的一些重要字段十.visualization_msgs/Marker 的 Line Strip 和 Line List十一.visualization_msgs::MarkerArray详解十一.visualization_msgs::MarkerArray例程一十二.visualization_msgs::MarkerArray例程二 一.line_strip例程
运行
main.cc
#include geometry_msgs/Point.h
#include ros/ros.h
#include visualization_msgs/Marker.hint main(int argc, char **argv) {ros::init(argc, argv, marker_publisher);ros::NodeHandle nh;ros::Publisher marker_pub nh.advertisevisualization_msgs::Marker(visualization_marker, 10);// 创建一个Line Stripvisualization_msgs::Marker line_strip;line_strip.header.frame_id base_link;line_strip.header.stamp ros::Time::now();line_strip.ns line_strip;line_strip.action visualization_msgs::Marker::ADD;line_strip.type visualization_msgs::Marker::LINE_STRIP;line_strip.pose.orientation.w 1.0;line_strip.scale.x 0.1; // 线宽度line_strip.color.r 1.0; // 线颜色为红色line_strip.color.a 1.0; // 不透明度为1.0// 添加线段的点geometry_msgs::Point point1;point1.x 0.0;point1.y 0.0;point1.z 0.0;line_strip.points.push_back(point1);geometry_msgs::Point point2;point2.x 1.0;point2.y 1.0;point2.z 0.0;line_strip.points.push_back(point2);geometry_msgs::Point point3;point3.x 2.0;point3.y -1.0;point3.z 0.0;line_strip.points.push_back(point3);while (ros::ok()) {// 发布Line List消息marker_pub.publish(line_strip);ros::spinOnce();}return 0;
}二.line_list例程一
运行
main.cc
#include ros/ros.h
#include visualization_msgs/Marker.hint main(int argc, char** argv)
{ros::init(argc, argv, line_list_publisher);ros::NodeHandle nh;ros::Publisher marker_pub nh.advertisevisualization_msgs::Marker(visualization_marker, 10);// 创建Line List消息visualization_msgs::Marker line_list;line_list.header.frame_id map; // 设置坐标系line_list.header.stamp ros::Time::now();line_list.ns line_list;line_list.action visualization_msgs::Marker::ADD;line_list.type visualization_msgs::Marker::LINE_LIST;line_list.scale.x 0.1; // 设置线段宽度line_list.color.r 0.0;line_list.color.g 1.0;line_list.color.b 0.0;line_list.color.a 1.0;// 添加线段1的顶点geometry_msgs::Point p1, p2;p1.x 0.0;p1.y 0.0;p1.z 0.0;p2.x 1.0;p2.y 0.0;p2.z 0.0;// 添加线段2的顶点geometry_msgs::Point p3, p4;p3.x 1.0;p3.y 1.0;p3.z 0.0;p4.x 0.0;p4.y 1.0;p4.z 0.0;// 添加线段1的两个顶点line_list.points.push_back(p1);line_list.points.push_back(p2);// 添加线段2的两个顶点line_list.points.push_back(p3);line_list.points.push_back(p4);ros::Rate rate(10); // 发布频率为10Hzwhile (ros::ok()) {// 发布Line List消息marker_pub.publish(line_list);ros::spinOnce();rate.sleep();}return 0;
}二.line_list例程二
运行
main.cc
#include ros/ros.h
#include visualization_msgs/Marker.hint main(int argc, char** argv)
{ros::init(argc, argv, line_list_publisher);ros::NodeHandle nh;ros::Publisher marker_pub nh.advertisevisualization_msgs::Marker(visualization_marker, 10);// 创建Line List消息visualization_msgs::Marker line_list;line_list.header.frame_id map; // 设置坐标系line_list.header.stamp ros::Time::now();line_list.ns line_list;line_list.action visualization_msgs::Marker::ADD;line_list.type visualization_msgs::Marker::LINE_LIST;line_list.scale.x 0.1; // 设置线段宽度line_list.color.r 0.0;line_list.color.g 1.0;line_list.color.b 0.0;line_list.color.a 1.0;// 添加线段的顶点geometry_msgs::Point p1, p2, p3, p4;p1.x 0.0;p1.y 0.0;p1.z 0.0;p2.x 1.0;p2.y 0.0;p2.z 0.0;p3.x 1.0;p3.y 1.0;p3.z 0.0;p4.x 0.0;p4.y 1.0;p4.z 0.0;// 添加线段的顶点到Line List消息中line_list.points.push_back(p1);line_list.points.push_back(p2);line_list.points.push_back(p2);line_list.points.push_back(p3);line_list.points.push_back(p3);line_list.points.push_back(p4);line_list.points.push_back(p4);line_list.points.push_back(p1);ros::Rate rate(10); // 发布频率为10Hzwhile (ros::ok()) {// 发布Line List消息marker_pub.publish(line_list);ros::spinOnce();rate.sleep();}return 0;
}二.TEXT_VIEW_FACING例程
运行
main.cc
#include ros/ros.h
#include visualization_msgs/Marker.hint main(int argc, char** argv)
{ros::init(argc, argv, text_marker_publisher);ros::NodeHandle nh;ros::Publisher marker_pub nh.advertisevisualization_msgs::Marker(visualization_marker, 10);// 创建Marker消息visualization_msgs::Marker text_marker;text_marker.header.frame_id map; // 设置坐标系text_marker.header.stamp ros::Time::now();text_marker.ns text_marker;text_marker.action visualization_msgs::Marker::ADD;text_marker.type visualization_msgs::Marker::TEXT_VIEW_FACING;text_marker.pose.position.x 1.0; // 设置文字位置text_marker.pose.position.y 1.0;text_marker.pose.position.z 0.0;text_marker.pose.orientation.w 1.0;text_marker.scale.z 0.5; // 设置文字大小text_marker.color.r 0.0; // 设置颜色为红色text_marker.color.g 1.0;text_marker.color.b 1.0;text_marker.color.a 1.0;text_marker.text Hello, RViz!; // 设置要显示的文字内容ros::Rate rate(10); // 发布频率为10Hzwhile (ros::ok()) {// 发布Marker消息marker_pub.publish(text_marker);ros::spinOnce();rate.sleep();}return 0;
}三.附CMakeLists.txt和package.xml
文件结构
附CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(ros_templete) # Replace with your package namefind_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)catkin_package(INCLUDE_DIRS src/incCATKIN_DEPENDS roscpp std_msgs
)include_directories(${catkin_INCLUDE_DIRS}src/inc
)add_executable(visualization_nodesrc/cc/main.cc
)target_link_libraries(visualization_node${catkin_LIBRARIES}
)install(TARGETS visualization_nodeRUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)附package.xml
?xml version1.0?
package format2nameros_templete/nameversion0.0.0/versiondescriptionROS package for handling messages/descriptionmaintainer emailusertodo.todouser/maintainerlicenseTODO/licensebuild_export_dependmessage_generation/build_export_dependexec_dependmessage_runtime/exec_dependbuild_dependnewrizon_msgs/build_dependbuild_export_dependnewrizon_msgs/build_export_dependexec_dependnewrizon_msgs/exec_dependbuildtool_dependcatkin/buildtool_dependbuild_dependroscpp/build_dependbuild_dependstd_msgs/build_depend!-- 添加其他功能包的依赖项如果需要的话 --exec_dependroscpp/exec_dependexec_dependstd_msgs/exec_depend!-- 添加其他功能包的依赖项如果需要的话 --
/package五.关于odom、base_link和map坐标系
在ROS中odom、base_link和map是常见的坐标系frame用于机器人定位和导航。 odomodometry坐标系odom坐标系是机器人的里程计坐标系表示机器人相对于起始位置的运动。odom坐标系通常由里程计传感器如编码器提供的运动信息计算得出并且在运动过程中会累积误差。因此odom坐标系相对于真实世界可能存在一些漂移或误差。在机器人导航中通常使用odom坐标系作为局部坐标系。 base_link坐标系base_link坐标系是机器人的本体坐标系或称为机器人坐标系它是与机器人自身的物理结构对应的坐标系。base_link坐标系通常位于机器人的底盘或底座的几何中心用于表示机器人的位置和姿态。它是机器人的本体参考坐标系与机器人的移动无关。 map坐标系map坐标系是全局地图坐标系表示机器人所在的全局环境或地图。map坐标系的原点通常是事先设定好的参考点可以是某个固定的地标或起始位置。map坐标系提供了一个固定的参考框架用于定位和导航机器人在全局环境中的位置。
在机器人导航中通常会使用传感器数据如激光雷达、视觉传感器等来感知周围环境并使用算法如SLAM来建立地图并定位机器人。通过将base_link坐标系相对于odom坐标系的运动与地图进行对齐可以得到机器人在全局环境中的位置估计即机器人在map坐标系中的位姿。
总结
odom坐标系是机器人的里程计坐标系相对于起始位置的运动。base_link坐标系是机器人的本体坐标系与机器人的移动无关。map坐标系是机器人所在的全局地图坐标系提供了固定的参考框架用于定位和导航机器人在全局环境中的位置。
六.关于visualization_msgs/Marker 的 frame_locked
在RViz中visualization_msgs/Marker消息的frame_locked字段用于指定Marker是否锁定其坐标系框架。
当frame_locked字段设置为true时表示Marker的坐标系框架将被锁定即Marker将始终在其指定的坐标系中显示无论相机如何移动或旋转。
当frame_locked字段设置为false时表示Marker的坐标系框架将与相机坐标系相对即Marker将随着相机的移动和旋转而相应地调整其位置和姿态。
以下是一个示例展示了如何设置frame_locked字段
visualization_msgs::Marker marker;
// 设置其他字段
marker.frame_locked true; // 锁定Marker的坐标系框架
marker_pub.publish(marker);在上述示例中我们创建了一个visualization_msgs::Marker对象并设置了其他字段。然后我们将frame_locked字段设置为true以锁定Marker的坐标系框架。最后我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上。
通过设置适当的frame_locked值可以控制Marker在RViz中是否锁定其坐标系框架。这可以影响Marker的位置和姿态如何与相机的移动和旋转相对应。
请注意默认情况下frame_locked字段的值为false这意味着Marker的坐标系框架将与相机坐标系相对。如果需要固定Marker在其指定的坐标系中显示可以将frame_locked字段设置为true。
总结起来通过设置frame_locked字段您可以控制Marker是否锁定其坐标系框架以便在RViz中根据需要调整Marker的位置和姿态。
七.visualization_msgs/Marker 的 lifetime
在RViz中visualization_msgs/Marker消息的lifetime字段用于指定Marker的显示时间。lifetime字段是一个rospy.Duration类型的值表示Marker在RViz中显示的持续时间。
当发布一个Marker消息时RViz将根据lifetime字段的值来确定Marker的显示时间。一旦超过指定的持续时间RViz将自动将Marker从显示中移除。
以下是一个示例展示了如何设置lifetime字段
visualization_msgs::Marker marker;
// 设置其他字段
marker.lifetime ros::Duration(5.0); // 设置显示时间为5秒
marker_pub.publish(marker);在上述示例中我们创建了一个visualization_msgs::Marker对象并设置了其他字段。然后我们使用ros::Duration类创建一个持续时间为5秒的ros::Duration对象并将其赋值给lifetime字段。最后我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上。
通过设置适当的lifetime值可以控制Marker在RViz中显示的持续时间。一旦超过指定的时间RViz将自动将Marker从显示中移除。
请注意如果将lifetime字段设置为0表示Marker应该一直保持显示直到通过发布DELETE操作或DELETEALL操作来明确删除它。这对于需要手动控制Marker的显示和隐藏非常有用。
总结起来lifetime字段允许您控制在RViz中显示Marker的持续时间使您能够根据需要定制Marker的显示时间。
八.visualization_msgs/Marker 的action
在ROS中visualization_msgs/Marker消息的action字段用于指定在RViz中如何处理Marker。action字段的值可以是以下几种之一
visualization_msgs::Marker::ADD将Marker添加到可视化工具中。如果指定的id在可视化工具中已经存在将替换现有的Marker。visualization_msgs::Marker::DELETE删除指定id的Marker。如果指定的id在可视化工具中不存在操作被忽略。visualization_msgs::Marker::DELETEALL删除所有属于该命名空间ns字段的Marker。
通过使用不同的action值可以在RViz中动态地添加、更新或删除Marker。
以下是一些示例展示了如何使用不同的action值操作Marker
添加一个新的Marker
visualization_msgs::Marker marker;
// 设置其他字段
marker.action visualization_msgs::Marker::ADD;
marker_pub.publish(marker);更新现有的Marker
visualization_msgs::Marker marker;
// 设置其他字段
marker.action visualization_msgs::Marker::ADD; // 使用ADD操作确保更新现有Marker
marker_pub.publish(marker);删除特定id的Marker
visualization_msgs::Marker marker;
marker.id 1; // 要删除的Marker的id
// 其他字段可以为空因为删除操作不需要其他信息
marker.action visualization_msgs::Marker::DELETE;
marker_pub.publish(marker);删除所有属于特定命名空间的Marker
visualization_msgs::Marker marker;
marker.ns my_namespace; // 要删除的Marker所属的命名空间
// 其他字段可以为空因为删除操作不需要其他信息
marker.action visualization_msgs::Marker::DELETEALL;
marker_pub.publish(marker);在上述示例中我们创建了一个visualization_msgs/Marker对象并设置了其他字段然后将action字段设置为适当的值。最后我们使用marker_pub.publish(marker)将Marker发布到visualization_marker话题上以便在RViz中执行所需的操作。
请注意当使用DELETE或DELETEALL操作删除Marker时只需设置id或ns字段即可。其他字段可以为空因为删除操作不需要这些信息。
通过使用适当的action值您可以根据需要在RViz中添加、更新或删除Marker从而实现对可视化对象的动态控制。
九.visualization_msgs/Marker消息的一些重要字段
下面是visualization_msgs/Marker消息的一些重要字段
header消息的头部信息包括frame_id和timestamp等。ns命名空间用于将Marker分组。idMarker的唯一标识符用于标识不同的Marker。typeMarker的类型指定要显示的形状。可以使用visualization_ms- gs/Marker消息定义的常量来设置如visualization_msgs::Marker::S- PHERE表示球体。actionMarker的操作类型指定在RViz中如何处理该Marker。常见的- 操作类型包括ADD、DELETE和DELETEALL。poseMarker的位姿指定Marker在三维空间中的位置和方向。scaleMarker的尺寸用于控制Marker的大小或线宽等属性。colorMarker的颜色可以设置RGBA值来指定颜色和不透明度。points用于线条和多边形等形状的点列表。每个点由geometry_msgs/- Point消息表示。text用于文本形状的字符串内容。lifetimeMarker的生命周期用于控制Marker在RViz中的显示时间。
十.visualization_msgs/Marker 的 Line Strip 和 Line List
在RViz中visualization_msgs/Marker消息类型可用于可视化各种图形对象包括线条Line Strip和线段列表Line List。这些对象用于在3D环境中呈现线条或连接多个线段。 Line Strip线条Line Strip由一系列连接的线段组成线段之间按照顺序连接。在RViz中它们通常用于表示路径、轨迹或连续的线条。每个线段都由两个点定义相邻线段之间共享一个点。 Line List线段列表Line List由多个独立的线段组成每个线段由两个点定义。在RViz中它们通常用于表示离散的线段集合每个线段之间都是独立的。可以使用Line List来可视化多个不相连的线段。
十一.visualization_msgs::MarkerArray详解
visualization_msgs::MarkerArray是ROS中的消息类型用于在RViz中发布多个Marker的数组。
visualization_msgs::MarkerArray消息由以下字段组成
markersstd::vectorvisualization_msgs::Marker包含多个visualization_msgs::Marker对象的数组。每个Marker对象都描述了一个可视化元素如点、线、箭头、文本等。
通过使用visualization_msgs::MarkerArray消息您可以同时发布多个Marker并在RViz中以数组的形式显示它们。
以下是一个示例展示了如何创建和使用visualization_msgs::MarkerArray消息
#include ros/ros.h
#include visualization_msgs/MarkerArray.hint main(int argc, char** argv)
{ros::init(argc, argv, marker_array_publisher);ros::NodeHandle nh;ros::Publisher marker_array_pub nh.advertisevisualization_msgs::MarkerArray(marker_array_topic, 10);visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;// 设置marker1的各种字段marker_array.markers.push_back(marker1);// 创建第二个Markervisualization_msgs::Marker marker2;// 设置marker2的各种字段marker_array.markers.push_back(marker2);// 发布MarkerArraymarker_array_pub.publish(marker_array);ros::spin();return 0;
}在上述示例中我们包含了所需的头文件和ROS节点的初始化。然后我们创建了一个ros::Publisher对象来发布visualization_msgs::MarkerArray消息。接下来我们创建了一个visualization_msgs::MarkerArray对象并向其中添加两个visualization_msgs::Marker对象。每个Marker对象可以设置其字段例如type、pose、scale等。最后我们使用marker_array_pub.publish(marker_array)将MarkerArray消息发布到marker_array_topic话题上。
通过发布visualization_msgs::MarkerArray消息RViz将会显示数组中的每个Marker并根据各自的参数进行渲染和显示。
总结起来visualization_msgs::MarkerArray消息允许您在RViz中同时发布和显示多个Marker。您可以通过填充markers字段来创建Marker数组并通过发布MarkerArray消息将其发送到适当的话题上。
十一.visualization_msgs::MarkerArray例程一
运行
main.cc
#include ros/ros.h
#include visualization_msgs/MarkerArray.hint main(int argc, char** argv)
{ros::init(argc, argv, marker_array_publisher);ros::NodeHandle nh;ros::Publisher marker_array_pub nh.advertisevisualization_msgs::MarkerArray(marker_array, 10);// 创建MarkerArray消息visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;marker1.header.frame_id map;marker1.header.stamp ros::Time::now();marker1.ns marker_array;marker1.id 1;marker1.type visualization_msgs::Marker::SPHERE;marker1.pose.position.x 1.0;marker1.pose.position.y 2.0;marker1.pose.position.z 0.0;marker1.pose.orientation.w 1.0;marker1.scale.x 0.5;marker1.scale.y 0.5;marker1.scale.z 0.5;marker1.color.r 1.0;marker1.color.g 0.0;marker1.color.b 0.0;marker1.color.a 1.0;marker_array.markers.push_back(marker1);// 创建第二个Markervisualization_msgs::Marker marker2;marker2.header.frame_id map;marker2.header.stamp ros::Time::now();marker2.ns marker_array;marker2.id 2;marker2.type visualization_msgs::Marker::CUBE;marker2.pose.position.x -1.0;marker2.pose.position.y 2.0;marker2.pose.position.z 0.0;marker2.pose.orientation.w 1.0;marker2.scale.x 0.5;marker2.scale.y 0.5;marker2.scale.z 0.5;marker2.color.r 0.0;marker2.color.g 1.0;marker2.color.b 0.0;marker2.color.a 1.0;marker_array.markers.push_back(marker2);ros::Rate rate(1); // 发布频率为1Hzwhile (ros::ok()) {// 发布MarkerArray消息marker_array_pub.publish(marker_array);ros::spinOnce();rate.sleep();}return 0;
}十二.visualization_msgs::MarkerArray例程二
运行
main.cc
#include ros/ros.h
#include visualization_msgs/MarkerArray.h
#include visualization_msgs/Marker.hint main(int argc, char** argv)
{ros::init(argc, argv, marker_publisher);ros::NodeHandle nh;ros::Publisher marker_array_pub nh.advertisevisualization_msgs::MarkerArray(marker_array, 10);ros::Publisher marker_pub nh.advertisevisualization_msgs::Marker(marker, 10);// 创建MarkerArray消息visualization_msgs::MarkerArray marker_array;// 创建第一个Markervisualization_msgs::Marker marker1;marker1.header.frame_id map;marker1.header.stamp ros::Time::now();marker1.lifetime ros::Duration(); // 设置持久化属性为falsemarker1.ns marker1;marker1.id 1;marker1.type visualization_msgs::Marker::SPHERE;marker1.pose.position.x 1.0;marker1.pose.position.y 2.0;marker1.pose.position.z 0.0;marker1.pose.orientation.w 1.0;marker1.scale.x 0.5;marker1.scale.y 0.5;marker1.scale.z 0.5;marker1.color.r 1.0;marker1.color.g 0.0;marker1.color.b 0.0;marker1.color.a 1.0;// 创建第二个Markervisualization_msgs::Marker marker2;marker2.header.frame_id map;marker2.header.stamp ros::Time::now();marker2.lifetime ros::Duration(); // 设置持久化属性为falsemarker2.ns marker2;marker2.id 2;marker2.type visualization_msgs::Marker::CUBE;marker2.pose.position.x -1.0;marker2.pose.position.y 2.0;marker2.pose.position.z 0.0;marker2.pose.orientation.w 1.0;marker2.scale.x 0.5;marker2.scale.y 0.5;marker2.scale.z 0.5;marker2.color.r 0.0;marker2.color.g 1.0;marker2.color.b 0.0;marker2.color.a 1.0;marker_array.markers.clear();marker_array.markers.push_back(marker1);marker_array.markers.push_back(marker2);ros::Rate rate(1); // 发布频率为1Hzwhile (ros::ok()) {// 发布MarkerArray消息marker_array_pub.publish(marker_array);// 发布单个Marker消息marker_pub.publish(marker1);ros::spinOnce();rate.sleep();}return 0;
}