【ROS教程 005】ROS可视化

在ROS系统中它可以通过一些通用工具轻松绘制标量数据图,它要求对每一个标量字段数据分别绘制成二维曲线。
(1)用rxplot画出时间趋势曲线
在ROS系统中,标量数据可以根据消息中提供的时间戳作为时间序列绘制图形,然后我们能够在y轴上使用rxplot工具绘制标量数据。为了展示rxplot工具我们使用example4节点。它在两个不同的主题中分别发布一个标量和一个矢量(非标量),这两个主题分别是温度(temp)和加速度(accel)。在这些消息中的值是随机生成的,所以它们没有实际意义,仅用于示范曲线绘制。首先运行节点

$ rosrun chapter3_tutorials example4

通过rostopic list能够看到两个活动主题temp和accel。对于标量数据,我们通常使用data作为字段名来表示实际的值。对于temp主题,以Int32为数据格式,使用命令:

$ rxplot /temp/data

如果节点正常运行,我们能够看到消息中的数值随时间变化的图形
【ROS教程 005】ROS可视化_第1张图片
在示例节点提供的accel主题里,我们看到一个Vector3的消息,我们可以在一个plot图中分别绘制三个字段的曲线,这是rxplot的优势,命令为:

$ rxplot /accel/x:y:z

【ROS教程 005】ROS可视化_第2张图片
我们还可以将每个字段分开绘制,运行

$ rxplot /accel/x /accel/y /accel/z

【ROS教程 005】ROS可视化_第3张图片
(2)显示单一图片
在ROS系统中我们可以创建一个节点,在节点中展示来自即插即用摄像头的图像。这里我使用罗技摄像头来完成这项工作。在example6节点中,通过调用OpenCV库插入一段基本的摄像头捕捉程序,在后在ROS中将采集到的cv::Mat图像转换到ROS图像,这样就可以在主题中发布了,这个节点会在/camera主题里发布图像帧。
example6.cpp中的程序:

#include <ros/ros.h>

#include <image_transport/image_transport.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>

#include <opencv2/highgui/highgui.hpp>

int main( int argc, char **argv )
{

  ros::init( argc, argv, "example6" );

  ros::NodeHandle n;

  // Open camera with CAMERA_INDEX (webcam is typically #0).
  const int CAMERA_INDEX = 0;
  cv::VideoCapture capture( CAMERA_INDEX );
  if( not capture.isOpened() )
  {
  ROS_ERROR_STREAM(
  "Failed to open camera with index " << CAMERA_INDEX << "!"
  );
  ros::shutdown();
  }

  image_transport::ImageTransport it( n );
  image_transport::Publisher pub_image = it.advertise( "camera", 1 );

  cv_bridge::CvImagePtr frame = boost::make_shared< cv_bridge::CvImage >();
  frame->encoding = sensor_msgs::image_encodings::BGR8;

  while( ros::ok() ) {
  capture >> frame->image;

  if( frame->image.empty() )
  {
  ROS_ERROR_STREAM( "Failed to capture frame!" );
  ros::shutdown();
  }

  frame->header.stamp = ros::Time::now();
  pub_image.publish( frame->toImageMsg() );

  cv::waitKey( 3 );

  ros::spinOnce();
  }

  capture.release();

  return EXIT_SUCCESS;

}

example6.launch中内容:



<launch>
  
  <node pkg="chapter3_tutorials" type="example6" name="example6"
  output="screen"/>
launch>

manifest.xml中的内容需要添加我们用到的其他库

<package>
  <description brief="chapter3_tutorials">

  chapter3_tutorials

  description>
  <author>Enriqueauthor>
  <license>BSDlicense>
  <review status="unreviewed" notes=""/>
  <url>http://ros.org/wiki/chapter3_tutorialsurl>
  <depend package="std_msgs"/>
  <depend package="geometry_msgs"/>
  <depend package="sensor_msgs"/>
  <depend package="visualization_msgs"/>
  <depend package="rospy"/>
  <depend package="roscpp"/>
  <depend package="opencv2"/>
  <depend package="cv_bridge"/>
  <depend package="image_transport"/>
  <depend package="pcl"/>
  <depend package="pcl_ros"/>

package>

CMakeLists.txt增加相关内容并编译通过后,我们将使用launch文件运行节点并进行图像捕捉和发布工作。
启动节点

$ roslaunch chapter3_tutorials example6.launch

显示单一图片

$ rosrun image_view image_view image:=/camera

【ROS教程 005】ROS可视化_第4张图片
(3)3D可视化
ROS系统中的rviz工具集成了能够完成3D数据处理的OpenGL接口,能够将传感器数据在模型化世界中展示。用以下命令来启动rviz

$ rosrun rviz rviz

Add部分参数项如下图所示:
【ROS教程 005】ROS可视化_第5张图片
(4)保存和回放数据
ROS能够存储所有节点通过主题发布的消息,消息记录包正是一个包含各个主题所发消息的容器,用于记录机器人各个节点间的会话过程。
step1 使用rosbag在包文件中记录数据,先运行节点

$ rosrun chapter3_tutorials example4

现在有两个选择,一个是记录所有的主题

$ rosbag record -a

第二是仅记录一些特定(用户自定义)的主题

$ rosbag record /temp /accel

step2 回放消息记录文件,移动到想要回放消息记录包文件所在的文件夹下,并输入以下命令:

$ rosbag play filename

References:
[1]. Aaron Martinez Enrique Fern andez, ROS机器人程序设计[B], P59-74, 2014.

你可能感兴趣的:(ROS机器人)