版本是melodic
官网链接:
rviz/UserGuide - ROS Wiki
学习参考:
SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz | 古月居
直观认识rviz的效果:
ROS学习(七):三维可视化工具(RViz) - 豌豆ip代理
安装:
sudo apt-get install ros-melodic-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,没有则说明虚拟机没有正确连接到摄像头设备。
解决1:关闭虚拟机,打开虚拟机设置,设置显示所有USB输入设备。完成后在主机打开摄像头,再打开虚拟机连接摄像头设备。这样就不会cannot identify '/dev/video0’了,若要连接自带摄像头以外的其他摄像头,要修改launch文件中的设备编号。
Error2:虚拟机连接摄像头报错
解决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设备问题
默认的启动文件如下。
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>
<!-- other node -->
<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>
<!-- other node -->
<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:<node … …>最后要加/,即<node … … /> -
报错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
报错参考
官方说明
官方: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