前言
本篇博客是自己的学习记录,不对任何言论负责!如果中间有任何错误欢迎指出。^ ^
简单介绍一下环境配置Ubuntu20.04 Gazebo11 PX4 1.13
1. 如何在已有的模型上添加东西
举例:在无人艇的船板上添加apriltag
笔者这里用的是sandisland.launch文件,无人艇作为可控对象,直接在launch文件中就有相关的模型的定义。
在这个场景下,对无人艇的定义如下:
<!-- Load robot model -->
<arg name="urdf" default="$(find wamv_gazebo)/urdf/wamv_gazebo.urdf.xacro"/>
<param name="$(arg namespace)/robot_description"
command="$(find xacro)/xacro --inorder '$(arg urdf)'
thruster_config:=$(arg thrust_config)
camera_enabled:=$(arg camera_enabled)
gps_enabled:=$(arg gps_enabled)
imu_enabled:=$(arg imu_enabled)
lidar_enabled:=$(arg lidar_enabled)
ground_truth_enabled:=$(arg ground_truth_enabled)
namespace:=$(arg namespace) "/>
根据这段代码,找到这个模型对应的相关的文件,此处为wamv_gazebo.urdf.xacro,再根据前面的路径找到该文件,有的时候文件重复的比较多,容易找错。
然后在这个文件当中,可以看到一段代码是对无人艇这个模型自身的定义,而不是其他的什么传感器。
<!-- === The WAM-V platform === -->
<xacro:include filename="$(find wamv_gazebo)/urdf/wamv_gazebo.xacro"/>
再进入wamv_gazebo.xacro这个文件。以下是这个文件的全部内容:
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro">
<!-- Macro to create a WAM-V with dyanmics plugins and a customizeable thruster layout -->
<xacro:macro name="wamv_gazebo" params="thruster_layout">
<!-- Include macros for dynamics plugins -->
<xacro:include filename="$(find wamv_gazebo)/urdf/macros.xacro" />
<!-- Defines the base vehicle -->
<xacro:include filename="$(find wamv_description)/urdf/wamv_base.urdf.xacro" />
<!-- Thruster Layout -->
<xacro:include filename="${thruster_layout}"/>
<!-- Attach hydrodynamics plugin -->
<xacro:usv_dynamics_gazebo name="wamv_dynamics_plugin"/>
</xacro:macro>
</robot>
大致看一下可以发现wamv_base.urdf.xacro这个文件就是封装这个无人艇模型的最终文件。
<?xml version="1.0"?>
<robot xmlns:xacro="http://ros.org/wiki/xacro" name="wam-v">
<!-- Macro for creating the main collisions as simple shapes. -->
<xacro:macro name="main_collisions" params="prefix reflect:=1">
<!-- Main float -->
<collision name="${prefix}_float">
<origin xyz="-0.4 ${1.03*reflect} 0.2" rpy="${0*reflect} 1.57 0" />
<geometry>
<cylinder length="4" radius="0.2" />
</geometry>
</collision>
<collision name="${prefix}_mid_float">
<origin xyz="1.85 ${1.03*reflect} 0.3" rpy="${0*reflect} 1.38 0" />
<geometry>
<cylinder length="0.5" radius="0.17" />
</geometry>
</collision>
<collision name="${prefix}_front_float">
<origin xyz="2.3 ${1.03*reflect} 0.4" rpy="${0*reflect} 1.3 0" />
<geometry>
<cylinder length="0.45" radius="0.12" />
</geometry>
</collision>
<!-- Front beam -->
<collision name="front_${prefix}_beam_lower">
<origin xyz="0.9 ${0.85*reflect} 1" rpy="${0.78*reflect} 0 0" />
<geometry>
<cylinder length="0.5" radius="0.04" />
</geometry>
</collision>
<collision name="front_${prefix}_beam_upper">
<origin xyz="0.9 ${0.6*reflect} 1.18" rpy="${1.35*reflect} 0 0" />
<geometry>
<cylinder length="0.2" radius="0.04" />
</geometry>
</collision>
<!-- Mid beam -->
<collision name="mid_${prefix}_beam_lower">
<origin xyz="-0.65 ${0.99*reflect} 0.7" rpy="${0.1*reflect} 0.25 0" />
<geometry>
<cylinder length="0.45" radius="0.03" />
</geometry>
</collision>
<collision name="mid_${prefix}_beam_medium">
<origin xyz="-0.57 ${0.87*reflect} 1.05" rpy="${0.75*reflect} 0.25 0" />
<geometry>
<cylinder length="0.32" radius="0.03" />
</geometry>
</collision>
<collision name="mid_${prefix}_beam_upper">
<origin xyz="-0.55 ${0.65*reflect} 1.17" rpy="${1.35*reflect} 0.25 0" />
<geometry>
<cylinder length="0.3" radius="0.03" />
</geometry>
</collision>
<!-- Rear beam -->
<collision name="rear_${prefix}_beam_lower">
<origin xyz="-0.74 ${1.03*reflect} 0.7" rpy="${0*reflect} -0.15 0" />
<geometry>
<cylinder length="0.45" radius="0.03" />
</geometry>
</collision>
<collision name="rear_${prefix}_beam_medium">
<origin xyz="-0.79 ${0.91*reflect} 1.05" rpy="${0.75*reflect} -0.15 0" />
<geometry>
<cylinder length="0.32" radius="0.03" />
</geometry>
</collision>
<collision name="rear_${prefix}_beam_upper">
<origin xyz="-0.81 ${0.67*reflect} 1.18" rpy="${1.45*reflect} -0.15 0" />
<geometry>
<cylinder length="0.3" radius="0.03" />
</geometry>
</collision>
<!-- Joint -->
<collision name="${prefix}_joint">
<origin xyz="0.58 ${1.03*reflect} 0.6" rpy="${0*reflect} -0.6 0" />
<geometry>
<box size="0.65 0.2 0.1" />
</geometry>
</collision>
</xacro:macro>
<link name="base_link">
</link>
<joint name="dummy_joint" type = "fixed">
<parent link="base_link"/>
<child link="dummy_link"/>
</joint>
<!-- Basic model of the 16' WAM-V USV -->
<link name="dummy_link">
<visual>
<geometry>
<mesh filename="package://wamv_description/models/WAM-V-Base/mesh/WAM-V-Base.dae"/>
</geometry>
</visual>
<!-- Left base collisions -->
<xacro:main_collisions prefix="left" reflect="1" />
<!-- Right side collisions -->
<xacro:main_collisions prefix="right" reflect="-1" />
<!-- Top base -->
<collision name="top_base">
<origin xyz="0 -0 1.25" rpy="0 0 0" />
<geometry>
<box size="1.85 1 0.1" />
</geometry>
</collision>
<inertial>
<!-- From WAM-V spec sheet -->
<mass value="180.0"/>
<inertia ixx="120.0" ixy="0.0" ixz="0.0" iyy="393" iyz="0.0" izz="446.0"/>
</inertial>
</link>
</robot>
这是wamv_base.urdf.xacro文件的全部代码,如果要另加上一个apriltag的话,只需要在最后,也就</robot>
前面添加一段代码:
<link name="apriltag0_link">
<visual>
<geometry>
<box size="1.0 1.0 0.01" rpy="0 0 0"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0.0" rpy="0 0 0" />
<geometry>
<box size="1.0 1.0 0.01" rpy="0 0 0"/>
</geometry>
</collision>
</link>
<joint name="apriltag0_link_joint" type="fixed">
<parent link="base_link" />
<child link="apriltag0_link" />
<origin xyz="0 0 1.3" rpy="0 0 0" />
</joint>
<gazebo reference="apriltag0_link">
<material>Apriltag36_11_00000</material>
</gazebo>
在旧模型上添加新模型就是会复杂一点,因为已经封装好的官方的模型文件嵌套比较多,所以需要比较细致地去找定义模型本身的文件是哪一个再进行修改。而且在对于这些可控的模型上一般都是在.xacro文件中进行修改。
除了直接添加link,还要有joint也就是关节代码的添加和原模型链接起来,可以让新添加的模型随之移动。
material就是相当于添加的模型表面的纹理材料,这里我添加的就是一个png图片,所以就会显示一个apriltag在无人艇上。
2. 如何直接在你的场景中添加模型
这个相对于前面简单一些,这里用的场景就是最简单的marvros_posix_sitl.launch。
<!-- vehicle model and world -->
<arg name="est" default="ekf2"/>
<arg name="vehicle" default="iris"/>
<arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world"/>
<arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/iris_downward_camera/iris_downward_camera.sdf"/>
在开始的这段代码中可以发现这个场景用的world是empty.world,然后进入这个文件。
在<world></world>
标签内添加模型代码,具体格式如下:
<model name='apriltag'>
<include>
<uri>model://apriltag</uri>
<pose> 1.8 2 0.05 0 0 0 </pose>
</include>
</model>
其中这个model://
就需要在model文件夹里添加相应的文件夹,我的launch文件的路径是写在px4文件夹里的,所以我的model文件的路径为/home/xxx/PX4_Firmware/Tools/sitl_gazebo/models
,文件目录的结构如下:
~/PX4_Firmware/
├── Tools/
│ ├── sitl_gazebo/
│ │ ├── models/
│ │ │ ├── apriltag/
│ │ │ │ ├── materials/
│ │ │ │ │ ├── scripts/
│ │ │ │ │ │ └── Apriltag.material
│ │ │ │ │ ├── textures/
│ │ │ │ │ │ └── tag36_11_00000.png
│ │ │ │ ├── model.config
│ │ │ │ ├── model.sdf
其中model.config
和model.sdf
可以参照其他model文件写,本Apriltag.material文件如下:
material Apriltag36_11_00000
{
technique
{
pass
{
lighting off
texture_unit
{
texture tag36_11_00000.png
scale 1.0 1.0
}
}
}
}
这样就算添加完成了