在Gazebo Garden中创建一个机器人

背景

系统

Ubuntu20.04

ROS版本

ROS2 Foxy
安装教程

Gazebo版本

Gazebo Garden
安装教程

原版教程

Building Your Own Robot

提示

如果你直接复制下面各段的XML代码到自己的文件中,需要特别注意缩进的正确性,因为XML对缩进是严格要求的,子Tag必须相对于父Tag严格缩进,且同级别Tag的缩进要对齐。

创建你自己的机器人

在本教程中,我们将学习如何基于SDFormat格式构建自己的机器人。我们将构建一个简单的两轮机器人。
你可以在这里找到本教程的完成 SDF 文件。

什么是SDF格式

SDFormat(Simulation Description Format),有时缩写为 SDF,是一种用于机器人模拟器、可视化和控制的 XML 格式。

构建仿真世界

我们将从构建一个简单的世界开始,然后在其中构建我们的机器人。打开一个名为 building_robot.sdf 的新文件,并将以下代码复制到其中。

<?xml version="1.0" ?>
<sdf version="1.10">
    <world name="car_world">
        <physics name="1ms" type="ignored">
            <max_step_size>0.001</max_step_size>
            <real_time_factor>1.0</real_time_factor>
        </physics>
        <plugin
            filename="gz-sim-physics-system"
            name="gz::sim::systems::Physics">
        </plugin>
        <plugin
            filename="gz-sim-user-commands-system"
            name="gz::sim::systems::UserCommands">
        </plugin>
        <plugin
            filename="gz-sim-scene-broadcaster-system"
            name="gz::sim::systems::SceneBroadcaster">
        </plugin>

        <light type="directional" name="sun">
            <cast_shadows>true</cast_shadows>
            <pose>0 0 10 0 0 0</pose>
            <diffuse>0.8 0.8 0.8 1</diffuse>
            <specular>0.2 0.2 0.2 1</specular>
            <attenuation>
                <range>1000</range>
                <constant>0.9</constant>
                <linear>0.01</linear>
                <quadratic>0.001</quadratic>
            </attenuation>
            <direction>-0.5 0.1 -0.9</direction>
        </light>

        <model name="ground_plane">
            <static>true</static>
            <link name="link">
                <collision name="collision">
                <geometry>
                    <plane>
                    <normal>0 0 1</normal>
                    </plane>
                </geometry>
                </collision>
                <visual name="visual">
                <geometry>
                    <plane>
                    <normal>0 0 1</normal>
                    <size>100 100</size>
                    </plane>
                </geometry>
                <material>
                    <ambient>0.8 0.8 0.8 1</ambient>
                    <diffuse>0.8 0.8 0.8 1</diffuse>
                    <specular>0.8 0.8 0.8 1</specular>
                </material>
                </visual>
            </link>
        </model>
    </world>
</sdf>

保存文件,导航到保存文件的目录并启动模拟器:

gz sim building_robot.sdf

注意: 你可以将文件命名为任何名称,并将其保存在计算机上的任何位置。
你应该看到一个空的世界,只有一个地面和一个太阳光。查看 World demo 以了解如何构建自己的仿真世界。

构建模型

</model>标签下,我们将添加我们的机器人模型,如下所示:

定义模型

<model name='vehicle_blue' canonical_link='chassis'>
<pose relative_to='world'>0 0 0 0 0 0</pose>

在这里,我们定义了我们的模型名称为 vehicle_blue,它应该是其同级别的其他标签或模型中唯一的名称。每个模型可以有一个指定为 Canonical_link 的链接,模型的隐式框架将附加到该链接上。如果未定义,则选择第一个<link> 作为 Canonical_link。<pose>标签用于定义我们模型的位置和方向,以及 relative_to 属性用于定义模型相对于任何其他框架的姿态。如果未定义 relative_to,则模型的将相对于世界。
让我们将模型的姿态设置为相对于世界。pose 标签内的值如下:<pose>X Y Z R P Y</pose>,其中 X Y Z表示框架的位置,R P Y 表示滚动、俯仰和偏航的方向。我们将它们设置为零,这使得两个框架(模型和世界)相同。

链接形成我们的机器人

每个模型都是一组通过关节连接在一起的链接(可以只有一个链接)。

底盘

    <link name='chassis'>
        <pose relative_to='__model__'>0.5 0 0.4 0 0 0</pose>

我们定义第一个链接,即汽车的底盘,以及它相对于模型的姿态。

惯性属性

 <inertial> <!--inertial properties of the link mass, inertia matix-->
        <mass>1.14395</mass>
        <inertia>
            <ixx>0.095329</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.381317</iyy>
            <iyz>0</iyz>
            <izz>0.476646</izz>
        </inertia>
    </inertial>

在这里,我们定义了底盘的惯性特性,如<mass><inertia>矩阵。基本形状的惯性矩阵的值可以使用此工具计算。

视觉和碰撞

    <visual name='visual'>
        <geometry>
            <box>
                <size>2.0 1.0 0.5</size>
            </box>
        </geometry>
        <!--let's add color to our link-->
        <material>
            <ambient>0.0 0.0 1.0 1</ambient>
            <diffuse>0.0 0.0 1.0 1</diffuse>
            <specular>0.0 0.0 1.0 1</specular>
        </material>
    </visual>

顾名思义,<visual>标签负责我们的链接的外观。我们在<geometry>标签内定义链接的形状为<box>(立方体),然后在<size>标签内指定这个盒子的三个尺寸(以米为单位)。然后,在<material>标签内定义链接的材质。在这里,我们用一组四个数字(红/绿/蓝/alpha)定义了<ambient><diffuse><specular>颜色,每个颜色的值范围在[0, 1]之间。

        <collision name='collision'>
            <geometry>
                <box>
                    <size>2.0 1.0 0.5</size>
                </box>
            </geometry>
        </collision>
    </link>
</model>

<collision>标签定义了链接的碰撞属性,即链接如何与其他对象交互以及物理引擎对它的影响。
注意:<collision>可以与视觉属性不同,例如,通常使用更简单的碰撞模型来减少计算时间。
将上述所有部分按顺序复制到 world 文件中,然后再次启动 world:

gz sim building_robot.sdf

我们的模型应该是这样的:
在这里插入图片描述
在左上角的工具栏中,单击“Translate”图标,然后选择你的模型。你应该看到这样的三个轴:
在这里插入图片描述
这些是我们模型的坐标轴,其中红色是 x 轴,绿色是 y 轴,蓝色是 z 轴。

左轮

让我们给机器人添加轮子。下面的代码应该放在</link>标签之后和</model>标签之前。属于同一模型的所有链接和关节都应该在</model>之前定义。

<link name='left_wheel'>
    <pose relative_to="chassis">-0.5 0.6 0 -1.5707 0 0</pose>
    <inertial>
        <mass>1</mass>
        <inertia>
            <ixx>0.043333</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.043333</iyy>
            <iyz>0</iyz>
            <izz>0.08</izz>
        </inertia>
    </inertial>

我们定义了链接的名称 left_wheel,然后定义了它相对于 chassis链接的<pose>。轮子需要放在底盘的左侧后面,所以我们选择 pose 的值为-0.5 0.6 0。此外,我们的轮子是一个圆柱体,但在它的侧面。这就是为什么我们将方向值定义为-1.5707 0 0,这是围绕 x 轴旋转-90 度(角度以弧度为单位)。然后我们定义了轮子的惯性特性,即质量和惯性矩阵。

可视化和碰撞

    <visual name='visual'>
        <geometry>
            <cylinder>
                <radius>0.4</radius>
                <length>0.2</length>
            </cylinder>
        </geometry>
        <material>
            <ambient>1.0 0.0 0.0 1</ambient>
            <diffuse>1.0 0.0 0.0 1</diffuse>
            <specular>1.0 0.0 0.0 1</specular>
        </material>
    </visual>
    <collision name='collision'>
        <geometry>
            <cylinder>
                <radius>0.4</radius>
                <length>0.2</length>
            </cylinder>
        </geometry>
    </collision>
</link>

<visual><collision>属性与之前的链接类似,只是我们的链接形状为<cylinder>(圆柱体),它需要两个属性:圆柱体的<radius>(半径)和<length>(长度)。保存文件并再次运行世界,我们的模型应该是这样的:
在这里插入图片描述

右轮

<!--The same as left wheel but with different position-->
<link name='right_wheel'>
    <pose relative_to="chassis">-0.5 -0.6 0 -1.5707 0 0</pose> <!--angles are in radian-->
    <inertial>
        <mass>1</mass>
        <inertia>
            <ixx>0.043333</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.043333</iyy>
            <iyz>0</iyz>
            <izz>0.08</izz>
        </inertia>
    </inertial>
    <visual name='visual'>
        <geometry>
            <cylinder>
                <radius>0.4</radius>
                <length>0.2</length>
            </cylinder>
        </geometry>
        <material>
            <ambient>1.0 0.0 0.0 1</ambient>
            <diffuse>1.0 0.0 0.0 1</diffuse>
            <specular>1.0 0.0 0.0 1</specular>
        </material>
    </visual>
    <collision name='collision'>
        <geometry>
            <cylinder>
                <radius>0.4</radius>
                <length>0.2</length>
            </cylinder>
        </geometry>
    </collision>
</link>

右轮与左轮类似,只是位置不同。

定义任意框架

截至 SDF 1.7(Fortress 使用 SDF 1.8),我们可以定义任意Frame。它需要两个属性:

  • name:框架的名称
  • attached_to:该框架所附着的Frame或链接的名称。

让我们为我们的万向轮添加一个Frame,如下所示:

<frame name="caster_frame" attached_to='chassis'>
    <pose>0.8 0 -0.2 0 0 0</pose>
</frame>

我们给框架命名为 caster_frame,并将其附着在chassis链接上,然后使用<pose>标签定义Frame的位置和方向。我们没有使用 relative_to 属性,因此该姿态是相对于 attached_to 属性中指定的Frame的,在我们的例子中是 chassis

万向轮

<!--caster wheel-->
<link name='caster'>
    <pose relative_to='caster_frame'/>
    <inertial>
        <mass>1</mass>
        <inertia>
            <ixx>0.016</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.016</iyy>
            <iyz>0</iyz>
            <izz>0.016</izz>
        </inertia>
    </inertial>
    <visual name='visual'>
        <geometry>
            <sphere>
                <radius>0.2</radius>
            </sphere>
        </geometry>
        <material>
            <ambient>0.0 1 0.0 1</ambient>
            <diffuse>0.0 1 0.0 1</diffuse>
            <specular>0.0 1 0.0 1</specular>
        </material>
    </visual>
    <collision name='collision'>
        <geometry>
            <sphere>
                <radius>0.2</radius>
            </sphere>
        </geometry>
    </collision>
</link>

我们的最后一个链接是 caster_frame,它的姿态是相对于我们上面定义的 caster_frame 的。你可能已经注意到,我们关闭了 pose 标签,没有定义位置或方向;在这种情况下,链接的姿态与 relative_to 中的Frame相同(即身份)。
<visual><collision>标签中,我们定义了一个不同的形状<sphere>,它需要球体的<radius>

连接链接(关节)

我们需要将这些链接连接在一起;这就是<joint>标签的工作。关节标签将两个链接连接在一起,并定义了它们相对于彼此的移动方式。在<joint>标签内,我们需要定义要连接的两个链接及其关系(移动方式)。

左轮关节

<joint name='left_wheel_joint' type='revolute'>
    <pose relative_to='left_wheel'/>

我们的第一个关节是 left_wheel_joint。它有两个属性: name=‘left_wheel_joint’type=‘revolute’revolute 类型提供了 1 个旋转自由度和关节限制。关节的姿态与子链接Frame相同,即左轮Frame。

    <parent>chassis</parent>
    <child>left_wheel</child>

每个关节将两个链接(物体)连接在一起。在这里,我们将chassisleft_wheel连接起来。chassis是父链接,left_wheel是子链接。

    <axis>
        <xyz expressed_in='__model__'>0 1 0</xyz> <!--can be defined as any frame or even arbitrary frames-->
        <limit>
            <lower>-1.79769e+308</lower>    <!--negative infinity-->
            <upper>1.79769e+308</upper>     <!--positive infinity-->
        </limit>
    </axis>
</joint>

在这里,我们定义了旋转轴。旋转轴可以是任何Frame,而不仅仅是父链接子链接。我们选择了相对于模型Frame的 y 轴,因此在 y 元素中输入 1,其他元素中输入零。对于旋转关节,我们需要在<lower><upper>标签中定义旋转角度的<limits>
注意: 角度以弧度为单位。

右轮关节

right_wheel_joint 除了关节的位姿外,其他都非常相似。该关节将右轮与底盘连接。

<joint name='right_wheel_joint' type='revolute'>
    <pose relative_to='right_wheel'/>
    <parent>chassis</parent>
    <child>right_wheel</child>
    <axis>
        <xyz expressed_in='__model__'>0 1 0</xyz>
        <limit>
            <lower>-1.79769e+308</lower>    <!--negative infinity-->
            <upper>1.79769e+308</upper>     <!--positive infinity-->
        </limit>
    </axis>
</joint>

万向轮关节

对于万向轮,我们需要不同类型的关节(连接)。我们使用 type=‘ball’,它提供了 3 个旋转自由度。

<joint name='caster_wheel' type='ball'>
    <parent>chassis</parent>
    <child>caster</child>
</joint>

总结

启动这个世界模型:

gz sim building_robot.sdf

它应该看起来像这样:
在这里插入图片描述
祝贺你!我们构建了第一个机器人。你可以在这里了解更多关于 SDFormat 标签的详细信息。在下一个教程中,我们将学习如何移动我们的机器人。

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值