在Gazebo Garden中使创建好的机器人动起来

背景

系统

Ubuntu20.04

ROS版本

ROS2 Foxy
安装教程

Gazebo版本

Gazebo Garden
安装教程

在Gazebo中创建好一个机器人模型

创建教程

原版教程

Moving The Robot

移动机器人

在本教程中,我们将学习如何移动我们的机器人。我们将使用在“在Gazebo Garden中创建一个机器人”教程中构建的机器人。你可以从这里下载机器人。你也可以在这里找到本教程的成品世界描述文件。

什么是插件

为了让我们的机器人动起来,我们将使用 diff_drive 插件。但在此之前,让我们先回答一个问题:“什么是插件?”插件是作为共享库编译的代码块,并插入到模拟中。插件使我们能够控制模拟的许多方面,如世界、模型等。

Diff_drive 插件

diff_drive 插件可以帮助我们控制机器人,特别是可以进行差动驱动的机器人。让我们在机器人上设置该插件。打开 building_robot.sdf,并在 vehicle_blue 模型标签内添加以下代码:

<plugin
    filename="gz-sim-diff-drive-system"
    name="gz::sim::systems::DiffDrive">
    <left_joint>left_wheel_joint</left_joint>
    <right_joint>right_wheel_joint</right_joint>
    <wheel_separation>1.2</wheel_separation>
    <wheel_radius>0.4</wheel_radius>
    <odom_publish_frequency>1</odom_publish_frequency>
    <topic>cmd_vel</topic>
</plugin>

<plugin> 标签有两个属性,filename 表示库文件名,name 表示插件名。在<left_joint> <right_joint> 标签中,我们定义了连接机器人左右车轮和车身的关节,在我们的例子中是 left_wheel_jointright_wheel_joint<wheel_separation>表示两个车轮之间的距离。我们的机器人的左车轮在 y 轴上相对于底盘的位置是 0.6 米,右车轮在 y 轴上相对于底盘的位置是-0.6 米,因此轮距是 1.2 米。<wheel_radius>表示车轮的半径,它是在车轮链接的 <radius>标签下定义的。<odom_publish_frequency>设置了发布里程计数据的频率,发布到 /model/vehicle_blue/odometry 路径下。cmd_vel 是 DiffDrive 插件的输入 <topic>

话题和消息

现在我们的模型已经准备好了。我们只需要向它发送命令(消息)。这些消息将发布(发送)到上面定义的 cmd_vel 主题上。
topic只是为特定的一组消息或特定的服务定义的名称。我们的模型将订阅(监听)发送到 cmd_vel 主题上的消息。
启动机器人仿真世界:

gz sim building_robot.sdf

在另一个终端,让我们向我们的机器人发送一条消息:

gz topic -t "/cmd_vel" -m gz.msgs.Twist -p "linear: {x: 0.5}, angular: {z: 0.05}"

现在你应该看到你的机器人在仿真器中移动了。
注意: 别忘了在仿真器中按播放按钮启动仿真,不然机器人是不会有反应的。

该命令使用 -t 选项指定要发布到的主题。在 -m 之后,我们指定消息类型。我们的机器人期望 Twist 类型的消息,它由两个组件组成,线性和角度。在 -p 选项之后,我们指定消息的内容(值):线速度 x: 0.5 和角速度 z: 0.05。
提示:你可以使用这个命令来了解每个gz topic命令选项的作用:

gz topic -h

有关 Gazebo 中主题和消息的更多信息,请查看传输库教程

使用键盘移动机器人

我们将使用键盘按键来发送消息,而不是从终端发送消息。为此,我们将添加两个新的插件:KeyPublisherTriggeredPublisher

Key Publisher

KeyPublisher 是一个 gz-gui 插件,用于读取键盘按键并将其发送到默认主题 /keyboard/keypress 上。我们可以按以下方式尝试此插件:

  • 在一个终端中输入:
    gz sim building_robot.sdf
    
    在右上角点击插件下拉列表(垂直省略号),然后点击 Key Publisher
  • 在另一个终端中输入:
    gz topic -e -t /keyboard/keypress
    
    最后一个命令将显示发送到 /keyboard/keypress 主题的所有消息。

在 Gazebo 窗口中按不同的键,你应该会在运行 gz topic -e -t /keyboard/keypress 命令的终端上看到数据(数字)。
在这里插入图片描述
我们希望将这些按键映射为 Twist 类型的消息,并将其发布到我们的模型正在监听的 /cmd_vel 主题上。TriggeredPublisher 插件将执行此操作。

Triggered Publisher

TriggeredPublisher 插件根据用户指定的条件,在响应输入消息时在输出主题上发布用户指定的消息。让我们在<world>标签下添加以下代码:

<!-- Moving Forward-->
<plugin filename="gz-sim-triggered-publisher-system"
        name="gz::sim::systems::TriggeredPublisher">
    <input type="gz.msgs.Int32" topic="/keyboard/keypress">
        <match field="data">16777235</match>
    </input>
    <output type="gz.msgs.Twist" topic="/cmd_vel">
        linear: {x: 0.5}, angular: {z: 0.0}
    </output>
</plugin>

这段代码定义了触发发布插件。它接受类型为 gz.msgs.Int32/keyboard/keypress 主题上的消息,如果数据字段中的值与 16777235(向上箭头键)匹配,则在 cmd_vel 主题上输出一个 Twist 消息,其中 x 值为 0.5,z 值为 0.0。

现在启动 building_robot.sdf,然后添加 Key Publisher 插件,我们的机器人应该在我们按下向上箭头键 ↑ 时向前移动(确保你通过按下播放按钮启动仿真,以便在按下向上箭头键后看到机器人向前移动)。

接下来我们通过一个demo解释触发发布插件如何起作用。

通过方向键移动机器人

要查看按箭头键时在 /keyboard/keypress 主题上发送的值,可以使用 –echo-e 选项。

  • 在一个终端中运行模型:

    gz sim building_robot.sdf
    

    在右上角点击插件下拉列表(垂直省略号),然后点击 Key Publisher

  • 在另一个终端中运行以下命令:

    gz topic -e -t /keyboard/keypress
    

    开始按箭头键,看看它们给出的值:

    • Left ← : 16777234
    • Up ↑ : 16777235
    • Right → : 16777236
    • Down ↓ : 16777237

我们将为每个箭头键添加触发发布插件。例如,对于向下箭头:

<!-- Moving Backward-->
<plugin filename="gz-sim-triggered-publisher-system"
        name="gz::sim::systems::TriggeredPublisher">
    <input type="gz.msgs.Int32" topic="/keyboard/keypress">
        <match field="data">16777237</match>
    </input>
    <output type="gz.msgs.Twist" topic="/cmd_vel">
        linear: {x: -0.5}, angular: {z: 0.0}
    </output>
</plugin>

将每个箭头(按键)与所需的消息(移动)映射,就像我们对向后箭头所做的那样:

  • Left ➞ 16777234 ➞ linear: {x: 0.0}, angular: {z: 0.5}
  • Up ➞ 16777235 ➞ linear: {x: 0.5}, angular: {z: 0.0}
  • Right ➞ 16777236 ➞ linear: {x: 0.0}, angular: {z: -0.5}
  • Down ➞ 16777237 ➞ linear: {x: -0.5}, angular: {z: 0.0}

现在轮到你尝试使用不同的键来移动机器人了。
在下一个教程中,你将学习如何使用 SDF 创建自己的仿真世界。

Gazebo创建自定义的水下机器人模型可以按照以下步骤进行: 1. **安装必要的软件**: - 安装Gazebo和ROS(机器人操作系统),确保它们兼容。 - 安装必要的ROS包,例如`gazebo_ros_pkgs`。 2. **创建机器人描述文件**: - 在ROS工作空间的`src`目录下创建一个新的包,例如`my_underwater_robot`。 - 在包中创建一个`urdf`文件夹,用于存放机器人描述文件(URDF或XACRO)。 3. **编写URDF/XACRO文件**: - 使用XML格式编写机器人的描述文件,定义机器人的各个部件,如机身、推进器、传感器等。 - 可以使用XACRO文件来简化URDF文件的编写,通过宏定义和参数化来提高可维护性。 4. **添加物理属性和材料**: - 在URDF文件中添加物理属性,如质量、惯性矩阵等。 - 定义材料的颜色和纹理,以便在Gazebo中正确显示。 5. **定义关节和传动装置**: - 定义机器人各个部件之间的关节类型和参数,例如旋转关节、固定关节等。 - 添加传动装置参数,如关节限制、摩擦力等。 6. **添加传感器和插件**: - 在URDF文件中添加传感器模型,例如声呐、摄像头等。 - 使用Gazebo插件来模拟传感器数据和控制机器人行为。 7. **启动Gazebo并加载模型**: - 使用ROS启动文件或命令行启动Gazebo,并加载自定义的机器人模型。 - 可以编写一个ROS启动文件来自动启动Gazebo并加载模型。 8. **测试和调试**: - 在Gazebo中测试机器人的运动和控制。 - 根据需要调整URDF文件和参数,确保模型在Gazebo中正确显示和运动。 以下是一个简单的示例,展示了如何在URDF文件中定义一个简单的水下机器人模型: ```xml <?xml version="1.0"?> <robot name="underwater_robot" xmlns:xacro="http://ros.org/wiki/xacro"> <link name="base_link"> <visual> <geometry> <cylinder length="0.5" radius="0.2"/> </geometry> <material name="blue"/> </visual> <collision> <geometry> <cylinder length="0.5" radius="0.2"/> </geometry> </collision> <inertial> <mass value="10.0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> </link> <joint name="propeller_joint" type="revolute"> <parent link="base_link"/> <child link="propeller_link"/> <origin xyz="0 0 0.25" rpy="0 0 0"/> <axis xyz="0 0 1"/> <limit effort="10" velocity="10"/> </joint> <link name="propeller_link"> <visual> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> <material name="black"/> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> <transmission name="propeller_transmission"> <type>transmission_interface/SimpleTransmission</type> <joint name="propeller_joint"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> </joint> <actuator name="propeller_motor"> <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface> <mechanicalReduction>1</mechanicalReduction> </actuator> </transmission> <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <ros> <namespace>/</namespace> <argument>update_rate</argument> <value>100.0</value> </ros> <updateRate>100.0</updateRate> <leftJoint>propeller_joint</leftJoint> <rightJoint>propeller_joint</rightJoint> <wheelSeparation>0.5</wheelSeparation> <wheelDiameter>0.1</wheelDiameter> <torque>5</torque> <commandTopic>cmd_vel</commandTopic> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_link</robotBaseFrame> </plugin> </gazebo> </robot> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值