ROS Melodic rviz工具包学习笔记

版本是melodic

官网链接:
rviz/UserGuide - ROS Wiki
学习参考:
SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz | 古月居
直观认识rviz的效果:
ROS学习(七):三维可视化工具(RViz) - 豌豆ip代理

安装:

sudo apt-get install ros-melodic-rviz

文章目录

      • rviz插件
        • PointCloud2
        • Camera
        • Image
        • launch启动文件
        • Markers
      • 报错参考
        • 官方说明
        • 保存rviz配置及报错解决

rviz插件

rviz的操作基本上围绕插件,点击Add就可知道默认支持的插件有哪些。大多插件需要订阅自己编写的话题,达到显示的目的。
许多插件的中文资料还不全,不易查找,还需阅读官方的英文说明。

PointCloud2

注意,PointCloud2与PointCloud的消息类型不同,需区分开。(PointCloud)
Add->PointCloud2

选项 描述
Topic 订阅的话题
Unreliable
Selectable Whether or not this cloud is selectable using the selection tool.是否能用选取工具选择点云
Style 点显示类型,共5种Points, squares, Flat Squares, Spheres, Boxes
Size 显示点大小
Alpha 透明度[0,1],1是不透明
Decay Time 延时时间(可能做出运动线条)
Position Transfrom 坐标转换的轴
Color Transfrom 颜色转换
Queue Size 队列大小
Channel Name 通道
Use rainbow 是否用RGB颜色,或灰度颜色
Invert Rainbow
Autocompute Intensity Whether or not to auto-compute the “Min Intensity” and “Max Intensity” properties.是否自动计算最小强度和最大强度
Min Intensity 最小强度
Max Intensity 最大强度

详见:rviz/DisplayTypes/PointCloud - ROS Wiki
If you’re using a LaserScan display, the only available channel will be the “Intensity” channel.
对于激光扫描的显示,唯一有效的通道就是强度通道。

PointCloud2消息类型:link

# This message holds a collection of N-dimensional points, which may
# contain additional information such as normals, intensity, etc. The
# point data is stored as a binary blob, its layout described by the
# contents of the "fields" array.

# The point cloud data may be organized 2d (image-like) or 1d
# (unordered). Point clouds organized as 2d images may be produced by
# camera depth sensors such as stereo or time-of-flight.

# Time of sensor data acquisition, and the coordinate frame ID (for 3d
# points).
Header header

# 2D structure of the point cloud. If the cloud is unordered, height is
# 1 and width is the length of the point cloud.
uint32 height
uint32 width

# Describes the channels and their layout in the binary data blob.
PointField[] fields

bool    is_bigendian # Is this data bigendian?
uint32  point_step   # Length of a point in bytes
uint32  row_step     # Length of a row in bytes
uint8[] data         # Actual point data, size is (row_step*height)

bool is_dense        # True if there are no invalid points

Compact Message Definition:

std_msgs/Header header
uint32 height
uint32 width
sensor_msgs/PointField[] fields
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense

Camera

rviz/DisplayTypes/Camera - ROS Wiki http://wiki.ros.org/rviz/DisplayTypes/Camera

用到两种消息类型:
sensor_msgs/Image Message
(sensor_msgs/Image Documentation)
sensor_msgs/CameraInfo Message
(sensor_msgs/CameraInfo Documentation)

摄像机显示从摄像机的角度创建一个新的渲染窗口,并将来自摄像机的图像覆盖在其顶部。 为了使此显示正常工作,预订的sensor_msgs / Image话题必须是相机的一部分,并且旁边必须有一个名为camera_info的sensor_msgs / CameraInfo话题。 例如:
/ wide_stereo / left / image_rect
/ wide_stereo / left / camera_info

The Camera display assumes a z-forward x-right frame, rather than the normal x-forward y-left robot frame.
摄像机显示采用的是z朝前方向x朝右边框,而不是一般的x朝前方向y朝左边。(?没看懂?)

可配置:
在这里插入图片描述

Name Description
Alpha 透明度
Image 订阅的话题
Topic 基于订阅的Image话题生成CameraInfo话题

rviz目前支持RGB8、RGBA8、BGR8、BGRA8、MONO8、MONO16、bayer编码(按MONO8处理)、8UC4和8SC4(按BGRA8处理)、8UC3和8SC3(按BGR8处理)、8UC1和8SC1(按MONO8处理)、16UC1和16SC1(按MONO16处理)。

Image

用图像创建一个新的渲染窗口。

消息类型:
sensor_msgs/Image Message
(sensor_msgs/Image Documentation)


下面的链接是获取摄像头数据的补充资料.

ROS下利用Python和OpenCVC分别实现笔记本摄像头/USB摄像头/监控IP摄像头数据的获取_Amazingren的博客-CSDN博客

ROS学习——读取摄像头数据image_just_do_it567的博客-CSDN博客

ROS:OpenCV读取摄像头并发布话题_Find的博客-CSDN博客

ROS&OpenCV进行摄像头数据的采集与订阅发布(转)_Find的博客-CSDN博客

ROS(二):读取摄像头图像节点并发布topic以及订阅_Kiitos的博客-CSDN博客->包含几个链接

视频处理及OpenCV入门:
1 处理
2 opencv
3 Ubuntu 安装opencv


image实例:调用笔记本本地摄像头数据,在rviz中显示
(其他设备的摄像头需要修改launch文件中的设备编号)
参考:ROS学习笔记——调用本地摄像头数据并在rviz显示_jcsm__的博客-CSDN博客
仅在rviz上显示摄像头画面,暂时不知道怎么选取其中固定帧和采集数据。

# 安装功能包usb_cam
cd catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git 
cd ..
catkin_make

虚拟机连接设备后可在终端用ls /dev/video*查看是否有设备连接上,不管是电脑自带摄像头还是外部连接的摄像头,都需要手动连接。

下面在虚拟机上打开摄像头(不可跳过,否则rviz上没有画面)。

# 启动摄像头
roscore
cd catkin_ws/src/usb_cam/launch
roslaunch usb_cam-test.launch

正常情况下,会在虚拟机界面上弹出摄像头的画面。
打开rviz,订阅image的话题 /usb_cam/image_raw(不同摄像头话题名称可能不同),正常情况会有Image窗口弹出并显示画面。

操作期间遇到的报错与解决方法。
Error1:启动usb_cam_node节点时,Cannot identify ‘/dev/video0’: 2, No such file or directory
打不开摄像头,找不到定标文件。
打开新终端,输入ls /dev/video*,查看是否有/dev/video0 /dev/video1,没有则说明虚拟机没有正确连接到摄像头设备。
ROS Melodic rviz工具包学习笔记_第1张图片

解决1:关闭虚拟机,打开虚拟机设置,设置显示所有USB输入设备。完成后在主机打开摄像头,再打开虚拟机连接摄像头设备。这样就不会cannot identify '/dev/video0’了,若要连接自带摄像头以外的其他摄像头,要修改launch文件中的设备编号。
ROS Melodic rviz工具包学习笔记_第2张图片
Error2:虚拟机连接摄像头报错
ROS Melodic rviz工具包学习笔记_第3张图片
解决2:在主机打开摄像头后再连接,自动下载驱动。

Error3:用链接中的方法二一样找不到定标文件
解决3:忽略警告,不影响

Error4:v4l2-ctl: not found
解决4:sudo apt-get install v4l-utils

Error5:unknown control ‘focus_auto’
解决5:忽略警告,不影响

Error6:select timeout
解决6:关闭虚拟机,修改USB兼容性为USb 3.0
参考:虚拟机中无法识别摄像头USB设备问题
ROS Melodic rviz工具包学习笔记_第4张图片
默认的启动文件如下。
usb_can-test.launch:

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  node>
launch>

参数名称与描述:

名称 解读
usb_cam 节点名称
video_device 摄像头设备号
image_width 显示图像的宽度,分辨率
image_height 显示图像的高度,分辨率
pixel_format 像素编码格式,包括yuyv,uyvy,mjpeg
camera_frame_id 摄像头坐标系
io_method IO通道,包括mmap,read,userptr
framerate 帧率
brightness 亮度
saturation 饱和度
contrast 对比度
sharpness 清晰度
focus 对焦(非自动对焦时有效)
camera_info_url 摄像头校准文件路径
camera_name 摄像头名称

下面对摄像头相关的术语进行简要介绍:

  • mmap (memorymap 即地址的映射,一种内存映射文件的方法)
    作用系统Linux or Unix
    Linux通过内存映像机制来提供用户程序对内存直接访问的能力。使用mmap方式获取磁盘上的文件信息,只需要将磁盘上的数据拷贝至那块共享内存中去,用户进程可以直接获取到信息,而相对于传统的write/read IO系统调用, 必须先把数据从磁盘拷贝至到内核缓冲区中(页缓冲),然后再把数据拷贝至用户进程中。两者相比,mmap会少一次拷贝数据,这样带来的性能提升是巨大的。(链接)

launch启动文件

参考:ROS 初级 - 解析 roslaunch 文件 - 知乎

launch文件的作用是代替在多个终端执行roscore和多个rosrun命令,简化运行命令为roslaunch。
使用方法重点看下面的两个例子。roslaunch是XML格式的文档,需要遵循一定的规则,具体参考上面链接。

launch的嵌套:
对于有多个launch的文件,可以用一个launch复用,代替多个launch。
添加标签

<include file="$(dirname)/other.launch" />

下面举例,用launch文件打开rviz
假设功能包名称:package
假设launch文件launch.launch保存在package下的launch文件夹下

将rviz的当前配置文件defaultt.rviz保存在自定义功能包package文件夹下的config文件夹下。具体文件夹根据实际情况对应于程序。

<launch>
	
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find package)/config/defaultt.rviz" respawn="true" />
launch>

保存好后,在终端输入:launch package launch.launch,即可运行了。
注意:打开rviz不需要修改name, pkg, type,只要确定args就可以了,也就是配置文件及路径。

再举一例,用launch文件运行某节点
假设功能包名称:package
假设launch文件launch.launch保存在package下的launch文件夹下
假设要run的是turtle.py,保存在package下的src文件夹

<launch>
	
	<node name="sim" pkg="package" type="turtle.py" />
launch>

保存好后,在终端输入:launch package launch.launch,即可运行了。等效于roscore和rosrun package turtle.py两个终端的两个命令。在功能包内的节点不用设置args。

注: 启动一个节点至少需要3个属性:pkg,type和name。pkg是节点所在功能包名称,type是节点的可执行文件名称,这两个属性等同于用rosrun执行节点时的两个输入参数。name是节点的运行名称,会覆盖节点中init()赋予节点的名称。
注: 属性arg,argument,类似于launch内的局部变量,仅限与launch内部使用,与ROS节点的实现无关。

常用属性args:

  • respawn为true时开启复位属性,在关闭rviz窗口(节点停止)时会自动打开rviz窗口,只有在终端Ctrl-C才能关闭。
  • required=“true”,说明为必要节点,该节点终止时,launch中的其他节点也被终止。
  • output=“screen”,将节点的标准输出打印到终端,默认输出日志文档。
  • … …

launch的标签元素还有很多:

元素 描述
param ROS运行参数,储存在参数服务器中,launch执行后参数就加载到ROS的参数服务器,每个活跃的节点都可以通过ros::param::get()接口获得ROS参数值。用户也可以通过终端命令rosparam获取参数。
rosparam 多个参数时,可以将一个YAML格式文件的参数全部加载到ROS参数服务器,需设置command属性为load
remap 重映射

参考官网:http://wiki.ros.org/roslaunch/XML


遇到过的错误与解决方法如下。

  • 报错1:
    RLException: Invalid roslaunch XML syntax: mismatched tag: line 6, column 2
    The traceback for the exception was written to the log file
    解决1:最后要加/,即

  • 报错2:
    RLException: Invalid < node> tag: respawn and required cannot both be set to true.
    Node xml is < node args="-d $(find txtread)/config/defaultt.rviz" name=“rviz” pkg=“rviz” required=“true” respawn=“true” type=“rviz”/>
    The traceback for the exception was written to the log file
    解决2:required和respawn互斥,根据需求选择其一required="true"或respawn=“true”。

Markers

  • Markers: Sending Basic Shapes (C++)
    Description: Shows how to use visualization_msgs/Marker messages to send basic shapes (cube, sphere, cylinder, arrow) to rviz.
    Tutorial Level: BEGINNER
    官方例程:
    rviz/Tutorials/Markers: Basic Shapes - ROS Wiki

  • Markers: Points and Lines (C++)
    Description: Teaches how to use the visualization_msgs/Marker message to send points and lines to rviz.
    Tutorial Level: BEGINNER
    官方例程:
    rviz/Tutorials/Markers: Points and Lines - ROS Wiki

  • 其他官方教程:visualization/Tutorials - ROS Wiki

报错参考

官方说明

官方:rviz/Troubleshooting - ROS Wiki
全英文的,说明了一些可能碰到的报错和解决方法,但是不是很全,对很多问题不一定有用。

保存rviz配置及报错解决

rviz的配置按道理应该在正常退出时自动覆盖默认配置文件,再次打开时保持上次的配置,或者可以Save Config As保存配置,下次Open Config选择即可。

**错误:**操作不仅没有正常保存上次的配置,而且Save Config和Save Config As都会报错,显示不能写文件。
尝试修改文件的权限为可读可写,但并没有用。
**解决:**将/opt/ros/melodic/share/rviz/default.rviz 复制到主机,重命名后粘贴到虚拟机的某个文件夹下(不能是rviz文件夹内),打开rviz配置好后Save Config As重命名后的.rviz文件即可。下次打开rviz找到该配置打开。

保存的配置defaultt.rviz在目录 ~/catkin_ws/src/ 下,以该配置打开rviz:

rviz -d ~/catkin_ws/src/defaultt.rviz

ROS Melodic rviz工具包学习笔记_第5张图片

你可能感兴趣的:(ROS)