一、Camera的URDF文件
由于单个Camera模型比较简单,这里创建Camera的URDF而不是SDF文件,是考虑了后续该URDF模型可以被rviz加载显示,SDF模型无法被rviz加载显示。
创建工作空间
mkdir -p camera_ws/src
创建IMU的包
catkin_create_pkg my_camera_description
- 创建 ROS 包:
mkdir -p ~/camera_ws/src
cd ~/camera_ws/src
catkin_create_pkg my_camera_description
- 添加 URDF 文件:
新建 urdf
目录,并将下面提供的 URDF 文件保存该目录下
mkdir -p my_camera_description/urdf
cd my_camera_description/urdf
gedit /camera_robot.urdf
camera_robot.urdf
文件如下:
如下
<?xml version="1.0"?>
<robot name="camera_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- Define the Camera sensor -->
<link name="camera_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.05 0.05 0.05"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.05 0.05 0.05"/>
</geometry>
</collision>
<inertial>
<mass value="0.001"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia ixx="1e-06" ixy="0" ixz="0" iyy="1e-06" iyz="0" izz="1e-06"/>
</inertial>
</link>
<!-- camera -->
<gazebo reference="camera_link">
<sensor type="camera" name="camera1">
<update_rate>30.0</update_rate>
<camera name="head">
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>800</width>
<height>800</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
<noise>
<type>gaussian</type>
<!-- Noise is sampled independently per pixel on each frame.
That pixel's noise value is added to each of its color
channels, which at that point lie in the range [0,1]. -->
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>rrbot/camera1</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>
</robot>
二、代码解释
<gazebo reference="camera_link">
表示仿真元素绑定的关节是哪一个。机器人相机三维模型的link
名称,必须与此处的reference
属性的值camera_link
相匹配。
<sensor type="camera" name="camera1">
sensor标签代表添加传感器,是仿真元素,sensor
标签的type
属性表明传感器类型,只有有限的几种。name
属性“camera1”
必须与所有其他传感器名称不同。
<update_rate>30.0</update_rate>
Gazebo 中每秒拍摄新相机图像的次数。这是传感器在模拟过程中尝试的最大更新速率,但如果物理模拟的运行速度快于传感器生成的速度,则可能会落后于该目标速率。
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>800</width>
<height>800</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
填写这些值以匹配物理相机硬件制造商的规格,需要注意的一件事是像素被假定为正方形。
其中near
和far
是特定的仿真的参数,它们给出了摄像机在仿真中可以看到物体的距离的上限和下限。这是在相机的验光框架中指定的。
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
这是实际文件作为共享对象链接到的库名称。
<cameraName>rrbot/camera1</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
在这里,我们为图像主题和相机信息主题定义相机将发布到的 rostopic。对于 RRBot,应该订阅:
/rrbot/camera1/image_raw
/rrbot/camera1/camera_info
<frameName>camera_link</frameName>
图像在 tf 树中发布的坐标系。
三、创建 launch 文件
新建luanch
文件夹,并创建launch
文件来加载 Gazebo。
mkdir -p my_camera_description/launch
cd my_camera_description/launch
gedit gazebo.launch
gazebo.launch
文件如下:
<launch>
<!-- Launch Gazebo with the world and spawn the robot -->
<arg name="world_file" default="$(find my_camera_description)/worlds/empty.world"/>
<arg name="urdf_file" default="$(find my_camera_description)/urdf/camera_robot.urdf"/>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(arg world_file)"/>
<arg name="paused" value="false"/>
<arg name="gui" value="true"/>
</include>
<!-- Spawn robot -->
<node name="spawn_robot" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-file $(find my_camera_description)/urdf/camera_robot.urdf -urdf -model camera_robot"/>
</launch>
这个启动文件首先启动了 Gazebo(使用 empty_world.launch
),然后通过 spawn_model
节点将机器人加载到 Gazebo 中。确保调整 <arg>
标签中的文件路径,以适应的文件结构。
使用rosrun
命令来启动一个节点,该节点可以加载URDF模型到Gazebo仿真中。这通常是通过gazebo_ros
包提供的spawn_model
节点来完成的。以下是使用这个节点的一个基本命令示例:
rosrun gazebo_ros spawn_model -file /path/to/your/model.urdf -urdf -x 0 -y 0 -z 1 -model my_robot
在这个命令中:
-
-file
参数后跟URDF文件的路径。 -
-urdf
表明加载的文件格式为URDF。 -
-x
,-y
,-z
指定模型在Gazebo世界中的位置。 -
-model
后面跟的是你希望在Gazebo中为模型指定的名称。
启动 Gazebo:
在终端中运行以下命令来启动 Gazebo。
cd ~/camera_ws
source devel/setup.bash
roslaunch my_camera_description gazebo.launch
这将启动 Gazebo,并加载包含 camera插件的机器人模型。
注意:
1.相机需要原地旋转合适的角度才能看到画面,模型中没有可视化指示相机的视场角!
2.这是只是单个相机的插件配置,ros还有多个相机,立体相机的插件,有需要可以去了解,这里不再赘述。