ROS2与Gazebo11入门教程-传感器噪声模型
说明:
- 介绍如何使用和修改传感器
简介
Gazebo提供了许多常见传感器的模型。在现实世界中,传感器会表现出噪声,因为它们无法完美地观察世界。默认情况下,Gazebo中的传感器会完美地观察仿真世界(但IMU不会完美地观察仿真世界,详见下文)。为了提供一个更接近现实世界的仿真环境来测试感知代码,需要向Gazebo传感器生成的数据中显式地添加噪声
在撰写本教程时,Gazebo可以向下面三类传感器添加噪声:
- 射线(例如激光)
- 相机
- IMU(惯性测量单元)
射线(激光)噪声
对于射线传感器,可以将高斯噪声添加到每个光束范围内。可以设置高斯分布的平均值和标准差,噪声值将会从该高斯分布中进行采样。会针对每个光束独立地对噪声值进行采样。添加噪声后,产生的值域范围会介于传感器的最小值和最大值(包括最小值和最大值)之间
要测试射线噪声模型,请执行以下操作步骤:
新建一个模型目录,命令为:
mkdir -p ~/.gazebo/models/noisy_laser
- 创建一个模型配置文件,命令为:
gedit ~/.gazebo/models/noisy_laser/model.config
- 将以下内容复制粘贴到该模型配置文件中:
<?xml version="1.0"?>
<model>
<name>Noisy laser</name>
<version>1.0</version>
<sdf version='1.6'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>me@my.email</email>
</author>
<description>
My noisy laser.
</description>
</model>
- 创建一个~/.gazebo/models/noisy_laser/model.sdf文件,命令为:
gedit ~/.gazebo/models/noisy_laser/model.sdf
- 将下面的代码粘贴到该model.sdf文件中,该代码块是一个标准的Hokuyo模型副本,但增加了噪声:
<?xml version="1.0" ?>
<sdf version="1.6">
<model name="hokuyo">
<link name="link">
<gravity>false</gravity>
<inertial>
<mass>0.1</mass>
</inertial>
<visual name="visual">
<geometry>
<mesh>
<uri>model://hokuyo/meshes/hokuyo.dae</uri>
</mesh>
</geometry>
</visual>
<sensor name="laser" type="ray">
<pose>0.01 0 0.03 0 -0 0</pose>
<ray>
<scan>
<horizontal>
<samples>640</samples>
<resolution>1</resolution>
<min_angle>-2.26889</min_angle>
<max_angle>2.268899</max_angle>
</horizontal>
</scan>
<range>
<min>0.08</min>
<max>10</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="laser" filename="libRayPlugin.so" />
<always_on>1</always_on>
<update_rate>30</update_rate>
<visualize>true</visualize>
</sensor>
</link>
</model>
</sdf>
- 启动Gazebo,命令为:
gazebo
- 插入一个有噪声的激光器模型,方法为:在左面板中,选择“插入(Insert)”选项卡,然后点击“Noisy laser”模型。将该激光器模型拖放到仿真世界中的某个位置上释放,并在它的前方放置一个方盒(见下图)
- 可视化有噪声的激光器,方法为:点击“窗口(Window)”->“话题可视化(Topic Visualization)”菜单项(或按下Ctrl + T组合键)以打开“话题选择(Topic Selector)”对话框。
- 找到名称类似于/gazebo/default/hokuyo/link/laser/scan的话题,并单击该话题,然后点击“确定(Okay)”按钮。这样就会出现一个“激光器浏览(Laser View)”窗口,该窗口会显示激光器数据(见下图)。
- 如您所见,该扫描数据是有噪声的。要调整噪声,只需在model.sdf文件中修改噪声均值和标准差值(单位为米)即可:
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
- Hokuyo激光器有合理的噪声均值和标准差值。
相机噪声
对于相机传感器,下面会对输出放大器噪声进行模拟,这会将高斯采样方法获得的干扰信号独立添加到每个像素上。可以设置高斯分布的平均值和标准差,噪声值将会从该高斯分布中进行采样。会为每个像素独立地进行噪声值采样,然后将该噪声值独立地添加到该像素的每个颜色通道上。添加噪声之后得到的颜色通道值会介于0.0到1.0之间;该浮点数颜色值最后在图像中将会以无符号整数形式出现,通常其值在0到255之间(每个颜色通道使用8比特)。
这个噪声模型是在GLSL着色器中实现的,并且需要GPU才能运行。
要测试相机噪声模型,请执行以下操作步骤:
新建一个模型目录,命令为:
mkdir -p ~/.gazebo/models/noisy_camera
- 在该目录下创建一个模型配置文件,命令为:
gedit ~/.gazebo/models/noisy_camera/model.config
- 将以下内容复制粘贴到该配置文件中:
<?xml version="1.0"?>
<model>
<name>Noisy camera</name>
<version>1.0</version>
<sdf version='1.6'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>me@my.email</email>
</author>
<description>
My noisy camera.
</description>
</model>
- 在该目录下创建一个模型SDF文件,命令为:
gedit ~/.gazebo/models/noisy_camera/model.sdf
- 将以下代码块粘贴到该SDF文件中,该代码块是标准相机模型的一个副本,但增加了噪声:
<?xml version="1.0" ?>
<sdf version="1.6">
<model name="camera">
<link name="link">
<gravity>false</gravity>
<pose>0.05 0.05 0.05 0 0 0</pose>
<inertial>
<mass>0.1</mass>
</inertial>
<visual name="visual">
<geometry>
<box>
<size>0.1 0.1 0.1</size>
</box>
</geometry>
</visual>
<sensor name="camera" type="camera">
<camera>
<horizontal_fov>1.047</horizontal_fov>
<image>
<width>1024</width>
<height>1024</height>
</image>
<clip>
<near>0.1</near>
<far>100</far>
</clip>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.07</stddev>
</noise>
</camera>
<always_on>1</always_on>
<update_rate>30</update_rate>
<visualize>true</visualize>
</sensor>
</link>
</model>
</sdf>
- 启动Gazebo:
gazebo
插入带噪声的相机模型,方法为:在左面板中,选择“插入(Insert)”选项卡,然后点击“Noisy camera”模型。将该相机模型拖到仿真世界中的某个位置并释放。
对该带噪声的相机进行可视化,方法为:点击“窗口(Window)”->“话题可视化(Topic Visualization)”菜单项(或者按下Ctrl + T组合键)来打开“话题选择(Topic Selector)”对话框。
找到名称类似于/gazebo/default/camera/link/camera/image的话题并点击该话题,然后单击“确定(Okay)”按钮。这样就会打开一个“图像浏览(Image View)”窗口,该窗口会显示图像数据(见下图)
如果仔细观察,可以看到该图像噪声很强。要调整噪声,只需在model.sdf中修改噪声的平均值和标准差值即可。它们都是没有单位的值。噪声会添加到每个颜色通道上,这些颜色通道的值域范围为[0.0,1.0]。
上面的示例具有很高的标准差值
。尝试减小该值:
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
- 正规的数码相机都有合理的噪声均值和标准差值。
IMU噪声
对于IMU传感器,会对角速度和线性加速度数据模拟以下两种干扰:噪声和偏置。角速度和线性加速度是分别考虑的,这样就会出现该模型的下列4组参数:速度噪声、速度偏置、加速度噪声和加速度偏置。不会对IMU的方向数据应用任何噪声,因为IMU的方向数据会被抽取为仿真世界坐标系的理想值(这方面将来可能会有变化)。
噪声是可累加的,是从高斯分布中采样的。可以设置高斯分布的平均值和标准差(一个用于速度,一个用于加速度),然后从该高斯分布中对噪声值进行采样。会为每个样本的每个分量(X,Y,Z)单独采集一个噪声值样本,并将其添加到该分量上。
偏置也是可累加的,但偏置仅在仿真开始时采样一次。可以设置高斯分布的平均值和标准差(一个用于速度,一个用于加速度),然后从该高斯分布中对偏置值进行采样。会根据给出的参数对偏置进行采样,然后以等概率取反;其假设条件是:提供的均值可以表示偏置的幅度,且在任何一个方向上均可能存在偏置。其结果就是,偏置是一个固定值,会添加到每个样本的每个分量(X,Y,Z)上。
取决于被仿真的系统及物理引擎的配置,可能会发生这种情况:仿真的IMU数据的噪声已经相当强,因为该系统并没有完全解决收敛问题。因此,取决于您的应用,可能没有必要添加噪音
要测试IMU噪声模型,请执行以下操作步骤:
新建一个模型目录,命令为:
mkdir -p ~/.gazebo/models/noisy_imu
- 在该目录下创建一个模型配置文件,命令为:
gedit ~/.gazebo/models/noisy_imu/model.config
- 将以下内容复制粘贴到该模型配置文件中:
<?xml version="1.0"?>
<model>
<name>Noisy IMU</name>
<version>1.0</version>
<sdf version='1.6'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>me@my.email</email>
</author>
<description>
My noisy IMU.
</description>
</model>
- 创建一个~/.gazebo/models/noisy_imu/model.sdf文件,命令为:
gedit ~/.gazebo/models/noisy_imu/model.sdf
- 将以下代码粘贴到该SDF文件中:
<?xml version="1.0" ?>
<sdf version="1.6">
<model name="imu">
<link name="link">
<inertial>
<mass>0.1</mass>
</inertial>
<visual name="visual">
<geometry>
<box>
<size>0.1 0.1 0.1</size>
</box>
</geometry>
</visual>
<collision name="collision">
<geometry>
<box>
<size>0.1 0.1 0.1</size>
</box>
</geometry>
</collision>
<sensor name="imu" type="imu">
<imu>
<angular_velocity>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</x>
<y>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</y>
<z>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</z>
</angular_velocity>
<linear_acceleration>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</x>
<y>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</y>
<z>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</z>
</linear_acceleration>
</imu>
<always_on>1</always_on>
<update_rate>1000</update_rate>
</sensor>
</link>
</model>
</sdf>
- 启动Gazebo:
gazebo
插入一个有噪声的IMU模型,方法为:在左面板中,选择“插入(Insert)”选项卡,然后点击“Noisy IMU”模型。将该IMU模型拖放至仿真世界中的某个位置上释放
可视化有噪声的IMU模型,方法为:点击“窗口(Window)”->“话题可视化(Topic Visualization)”菜单项(或者按下Ctrl + T组合键)来打开“话题选择(Topic Selector)”对话框
找到名称类似于/gazebo/default/imu/link/imu/imu的话题,并单击该话题,然后点击“确定(Okay)”按钮。这样就会打开一个“文本浏览(Text View)”窗口,该窗口可以显示您的IMU数据
在像IMU之类的高速率传感器上很难欣赏噪声,尤其是在复杂系统中。应该能够在噪声和/或偏置参数中看到较大的非零均值的影响作用。
要调整噪声,只需在model.sdf中修改平均值和标准差值即可。 速度噪声和速度偏置的单位为rad/s,加速度噪声和加速度偏置的单位为m/s2。
<angular_velocity>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</x>
<y>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</y>
<z>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>2e-4</stddev>
<bias_mean>0.0000075</bias_mean>
<bias_stddev>0.0000008</bias_stddev>
</noise>
</z>
</angular_velocity>
<linear_acceleration>
<x>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</x>
<y>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</y>
<z>
<noise type="gaussian">
<mean>0.0</mean>
<stddev>1.7e-2</stddev>
<bias_mean>0.1</bias_mean>
<bias_stddev>0.001</bias_stddev>
</noise>
</z>
</linear_acceleration>
- 高质量的IMU传感器会有合理的噪声值和偏置值。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号