< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-传感器噪声模型

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传感器会有合理的噪声值和偏置值。

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程