在 Gazebo 模拟中投射在相机传感器上可见的线激光
Project a line laser visible on camera sensor on Gazebo simulation
我正在尝试创建一个单线激光传感器来投射到物体中,并能够在 Gazebo 模拟环境中通过相机图像可视化激光,但我无法使其工作。
我在互联网上找到的唯一示例是 this Gazebo 的答案,但不幸的是它没有工作,甚至没有生成一些错误日志。有没有人已经在 Gazebo 的相机图像上制作了可见的线激光?
下面是上面 link 中的示例。
<gazebo reference="your_link">
<projector name="projector_wg6802418">
<pose>0 0 0 0 0 ${pi/2}</pose>
<texture>your_img.png</texture>
<fov>0.5</fov>
<near_clip>1</near_clip>
<far_clip>10</far_clip>
</projector>
</gazebo>
<gazebo>
<plugin name="projector" filename="libgazebo_ros_projector.so">
<projector>projector_wg6802418</projector>
<alwaysOn>true</alwaysOn>
<updateRate>10.0</updateRate>
<!-- Apparently the 2 lines below does not affect anything -->
<textureName></textureName>
<filterTextureName></filterTextureName>
<!-- end -->
<textureTopicName>/projector/image</textureTopicName>
<projectorTopicName>/projector/projector</projectorTopicName>
</plugin>
</gazebo>
也许您应该尝试在您的 URDF 文件中添加一个新关节和 link,如此处所解释的 http://gazebosim.org/tutorials?tut=ros_gzplugins。
之后,您必须将您的插件添加到您的 gazebo 文件中,以便它可以导入 URDF 和 xacro 文件。
插件:
<joint name="hokuyo_joint" type="fixed">
<axis xyz="0 1 0" />
<origin xyz="0 0 ${height3 - axel_offset/2}" rpy="0 0 0"/>
<parent link="link3"/>
<child link="hokuyo_link"/>
</joint>
<!-- Hokuyo Laser -->
<link name="hokuyo_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
Gazebo 文件:
<gazebo reference="hokuyo_link">
<sensor type="gpu_ray" name="head_hokuyo_sensor">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>40</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<!-- Noise parameters based on published spec for Hokuyo laser
achieving "+-30mm" accuracy at range < 10m. A mean of 0.0m and
stddev of 0.01m will put 99.7% of samples within 0.03m of the true
reading. -->
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
<topicName>/rrbot/laser/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
您可以根据需要更改。
至于标签,如 Gazebo 教程所述,当“semi-translucent 激光射线在扫描区域内可视化时”为真。
不知道你是否想测量距离,但如果你想测量,并且如果障碍物在激光 FOV 前面,你应该在 LaserScan 中打印 ranges[] 数组的中间值,像这样:
from sensor_msgs.msg import LaserScan
def callback(data):
distance = data.ranges[360]
print(distance)
def listener():
rospy.init_node(node_nome)
rospy.Subscriber('/scan',callback)
rospy.spin()
if __name__ == '__main__':
listener()
我找到了解决方法。
我正在使用名为 projection 的凉亭传感器作为下面的代码,但是当您调用纹理时,您必须将其添加到凉亭根文件中。当我使用 Gazebo 7 时,我创建了一个纹理并将其移动到文件夹 /usr/share/gazebo-7/media/materials/textures 并且它可以正常工作。
我能够在物体表面投射纹理,并能够看到投射在相机传感器上的纹理。
<gazebo reference="projector_sensor_link">
<!--sensor type="projector" name="projector_tester"-->
<projector name="projector_test">
<pose>0 0 0 0 0 0</pose>
<texture>your_texture.png</texture>
<fov>${fov}</fov>
<near_clip>0.1</near_clip>
<far_clip>10</far_clip>
</projector>
</gazebo>
在/usr/share/gazebo-11/worlds中有一个projector.world gazebo world文件,它显示了一切。
有趣的是,投影适用于对象的“双”面,而不仅仅是投影仪的一侧。
为了创建“线性激光”(我的意思是创建一个平面,而不是一条线),我制作了一个黑色 png 图像,大小为 1024x1024,上面有一条 1 像素高的水平红线。
我将它命名为“red_line.png”并放入 /usr/share/gazebo-11/media/materials/textures.
其实在gazebo世界红线是垂直的,但是投影仪是可以滚动的
您可以在屏幕截图中看到相机屏幕上的红线。
我正在尝试创建一个单线激光传感器来投射到物体中,并能够在 Gazebo 模拟环境中通过相机图像可视化激光,但我无法使其工作。
我在互联网上找到的唯一示例是 this Gazebo 的答案,但不幸的是它没有工作,甚至没有生成一些错误日志。有没有人已经在 Gazebo 的相机图像上制作了可见的线激光?
下面是上面 link 中的示例。
<gazebo reference="your_link">
<projector name="projector_wg6802418">
<pose>0 0 0 0 0 ${pi/2}</pose>
<texture>your_img.png</texture>
<fov>0.5</fov>
<near_clip>1</near_clip>
<far_clip>10</far_clip>
</projector>
</gazebo>
<gazebo>
<plugin name="projector" filename="libgazebo_ros_projector.so">
<projector>projector_wg6802418</projector>
<alwaysOn>true</alwaysOn>
<updateRate>10.0</updateRate>
<!-- Apparently the 2 lines below does not affect anything -->
<textureName></textureName>
<filterTextureName></filterTextureName>
<!-- end -->
<textureTopicName>/projector/image</textureTopicName>
<projectorTopicName>/projector/projector</projectorTopicName>
</plugin>
</gazebo>
也许您应该尝试在您的 URDF 文件中添加一个新关节和 link,如此处所解释的 http://gazebosim.org/tutorials?tut=ros_gzplugins。 之后,您必须将您的插件添加到您的 gazebo 文件中,以便它可以导入 URDF 和 xacro 文件。
插件:
<joint name="hokuyo_joint" type="fixed">
<axis xyz="0 1 0" />
<origin xyz="0 0 ${height3 - axel_offset/2}" rpy="0 0 0"/>
<parent link="link3"/>
<child link="hokuyo_link"/>
</joint>
<!-- Hokuyo Laser -->
<link name="hokuyo_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
Gazebo 文件:
<gazebo reference="hokuyo_link">
<sensor type="gpu_ray" name="head_hokuyo_sensor">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>40</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<!-- Noise parameters based on published spec for Hokuyo laser
achieving "+-30mm" accuracy at range < 10m. A mean of 0.0m and
stddev of 0.01m will put 99.7% of samples within 0.03m of the true
reading. -->
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
<topicName>/rrbot/laser/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
您可以根据需要更改。 至于标签,如 Gazebo 教程所述,当“semi-translucent 激光射线在扫描区域内可视化时”为真。
不知道你是否想测量距离,但如果你想测量,并且如果障碍物在激光 FOV 前面,你应该在 LaserScan 中打印 ranges[] 数组的中间值,像这样:
from sensor_msgs.msg import LaserScan
def callback(data):
distance = data.ranges[360]
print(distance)
def listener():
rospy.init_node(node_nome)
rospy.Subscriber('/scan',callback)
rospy.spin()
if __name__ == '__main__':
listener()
我找到了解决方法。
我正在使用名为 projection 的凉亭传感器作为下面的代码,但是当您调用纹理时,您必须将其添加到凉亭根文件中。当我使用 Gazebo 7 时,我创建了一个纹理并将其移动到文件夹 /usr/share/gazebo-7/media/materials/textures 并且它可以正常工作。
我能够在物体表面投射纹理,并能够看到投射在相机传感器上的纹理。
<gazebo reference="projector_sensor_link">
<!--sensor type="projector" name="projector_tester"-->
<projector name="projector_test">
<pose>0 0 0 0 0 0</pose>
<texture>your_texture.png</texture>
<fov>${fov}</fov>
<near_clip>0.1</near_clip>
<far_clip>10</far_clip>
</projector>
</gazebo>
在/usr/share/gazebo-11/worlds中有一个projector.world gazebo world文件,它显示了一切。
有趣的是,投影适用于对象的“双”面,而不仅仅是投影仪的一侧。
为了创建“线性激光”(我的意思是创建一个平面,而不是一条线),我制作了一个黑色 png 图像,大小为 1024x1024,上面有一条 1 像素高的水平红线。 我将它命名为“red_line.png”并放入 /usr/share/gazebo-11/media/materials/textures.
其实在gazebo世界红线是垂直的,但是投影仪是可以滚动的
您可以在屏幕截图中看到相机屏幕上的红线。