< >
Home » PX4与仿真入门教程 » PX4与仿真入门教程-dronedoc-在无人机上配备距离传感器

PX4与仿真入门教程-dronedoc-在无人机上配备距离传感器

PX4与仿真入门教程-dronedoc-在无人机上配备距离传感器

说明:

  • 介绍如何在在无人机上配备距离传感器

距离传感器:

  • 如果同时使用激光高度计(如Lidar Lite)和Ray sensor(如Lidar),Gazebo 会因为分段错误(#9156)而无法启动,所以这次我们将使用超声波传感器作为距离传感器。
  • 看来GpuRay传感器可以毫无问题地启动,所以如果你真的想使用激光高度计,你应该使用GpuRay传感器。
  • 但是,GpuRay 传感器在没有 GPU 的情况下似乎无法正常工作,因此仅当您有 GPU 时才使用它。

SDF文件

  • 可以包含iris_2d_lidar模型并附加一个超声波传感器,但是命名空间变得复杂(iris_2d_lidar::iris::base_link等)并且TF设置很麻烦,所以复制iris_2d_lidar模型的SDF文件。
  • 并添加一个超声波传感器。
  • 添加超声波传感器的model.sdf如下。
<?xml version='1.0'?>
<sdf version='1.6'>
  <model name='iris_sonar'>

    <include>
      <uri>model://iris</uri>
    </include>

    <!-- Sonar -->
    <include>
      <uri>model://sonar</uri>
      <pose>0 0 -0.04 0 -1.57 0</pose>
    </include>
    <joint name="sonar_joint" type="fixed">
      <child>sonar::link</child>
      <parent>iris::base_link</parent>
    </joint>

    <link name="lidar_link">
      <pose>0 0 0.05 0 -0.0085 0</pose>

      <inertial>
        <pose>0 0 0 0 -0 0</pose>
        <mass>0.01</mass>
        <inertia>
          <ixx>2.1733e-6</ixx>
          <ixy>0</ixy>
          <ixz>0</ixz>
          <iyy>2.1733e-6</iyy>
          <iyz>0</iyz>
          <izz>1.8e-7</izz>
        </inertia>
      </inertial>

      <visual name="lidar_visual">
        <geometry>
          <cylinder>
            <radius>0.01</radius>
            <length>0.05</length>
          </cylinder>
        </geometry>
        <material>
          <script>
            <name>Gazebo/DarkGrey</name>
            <uri>file://media/materials/scripts/gazebo.material</uri>
          </script>
        </material>
      </visual>

      <sensor name="laser" type="ray">
        <pose>0 0 0.02 0 0 0</pose>
        <ray>
          <scan>
            <horizontal>
              <samples>720</samples>
              <resolution>1</resolution>
              <min_angle>-2.0944</min_angle>
              <max_angle>2.0944</max_angle>
            </horizontal>
          </scan>
          <range>
            <min>0.1</min>
            <max>15</max>
            <resolution>0.01</resolution>
          </range>
          <noise>
            <type>gaussian</type>
            <mean>0.0</mean>
            <stddev>0.01</stddev>
          </noise>
        </ray>
        <plugin name="LaserPlugin" filename="libgazebo_ros_laser.so">
            <topicName>/laser/scan</topicName>
            <frameName>/lidar_link</frameName>
          </plugin>
        <always_on>1</always_on>
        <update_rate>40</update_rate>
        <visualize>true</visualize>
      </sensor>
    </link>

    <joint name="lidar_joint" type="fixed">
      <child>lidar_link</child>
      <parent>iris::base_link</parent>
    </joint>

  </model>
</sdf>
  • 注意:dronedoc里面使用了sonar_model::link 在gazebo9下使用sonar::link才能正确显示。

配置文件

  • 创建一个如下所示的model.config,在models目录下创建一个iris_sonar目录,并将其保存在该目录中。
  • 请根据需要更改作者标签的内容model.config。
<?xml version="1.0"?>
<model>
  <name>iris_sonar</name>
  <version>1.0</version>
  <sdf>model.sdf</sdf>

  <author>
   <name>Takaki Ueno</name>
   <email>t_ueno@eis.hokudai.ac.jp</email>
  </author>

  <description>
    Iris with 2d horizontal lidar and sonar rangefinder.
  </description>
</model>

查看模型

  • 创建一个如下所示的 Launch 文件并检查模型是否正确创建。
  • mymodel_sonar.launch内容如下:
<launch>

    <node pkg="tf" name="base2sonar" type="static_transform_publisher" args="0 0 0 0 -1.57 0 base_link link 100"/>

    <include file="$(find px4_sim_pkg)/launch/mymodel_sitl_tf.launch" >
        <arg name="vehicle" value="iris_2d_lidar"/>
        <arg name="sdf" value="$(find px4_sim_pkg)/models/iris_sonar/model.sdf" />
    </include>

</launch>
  • 启动启动文件。
roslaunch px4_sim_pkg mymodel_sonar.launch
  • 我不知道什么时候在地面上,但是当我起飞时,我可以看到超声波传感器安装正确(蓝色锥体)。

请输入图片描述

  • 发布距离传感器的值
  • 要在无人机上发布距离传感器的值,请使用 mavros_extras 包中的 distance_sensor 插件。
  • mavros_extras 包中还有其他几个用于附加传感器的插件,包括将数据从 px4_flow 发布到 ROS 主题的插件。

从黑名单中删除插件

  • 默认情况下, distance_sensor 插件被列入黑名单且未加载,因此您需要将其拉出黑名单。
  • 插件的黑名单和白名单可以在 px4_pluginlists.yaml 文件中找到。
  • 黑名单和白名单通过在mavros节点启动时读取这个文件的内容作为ROS参数来体现。
  • 可以直接在 mavros 包下编辑 px4_pluginlists.yaml,但是更改这个可能会影响其他 Launch 文件等,所以复制现有文件并进行编辑。
  • 使用以下命令将 px4_pluginlists.yaml 复制到 mavros 包目录中。
roscp mavros px4_pluginlists.yaml ~/dronedoc_ws/src/px4_sim_pkg/config/
  • 注释掉plugin_blacklist下的distance_sensor,px4_pluginlists.yaml文件如下图。
plugin_blacklist:
# common
- safety_area
# extras
- image_pub
- vibration
# distance_sensor
- rangefinder

plugin_whitelist: []
# 'sys_*'

参数设置

  • 接下来,创建一个描述 distance_sensor 的 ROS 参数的文件。
  • 每个参数的含义如下。
sonar_pub
传感器名称。 来自该传感器的数据发布到 /mavros/distance_sensor/sonar_pub。

ID
传感器的 ID。 您可以从 QGC 的 MAV Link Inspector 中的 DISTANCE SENSOR 项目中检查它。

frame_id
传感器的基本框架名称。

field_of_view
视野 (FOV)

发送_tf
是否发送传感器TF

传感器位置
传感器的位置
  • distance_sensor.yaml文件内容
distance_sensor:
  sonar_pub:
    id: 0
    frame_id: "sonar::link"
    field_of_view: 0
    send_tf: false
    sensor_position: {x: 0.0, y: 0.0, z: -0.04}
  • 您可以检查 ID,如下面的视频所示。

请输入图片描述

  • 创建启动文件
  • 创建一个如下所示的 Launch 文件。
  • 由于省略了发布TF等的设置,因此在使用move_base等时请进行适当的更改。
  • mymodel_sonar.launch内容如下:
<launch>

    <!-- Static TF Publisher -->
    <node pkg="tf" name="base2sonar" type="static_transform_publisher" args="0 0 -0.04 0 -1.57 0 base_link sonar::link 100"/>
    <node pkg="tf" name="base2lidar" type="static_transform_publisher" args="0 0 0.1 0 0 0 base_link lidar_link 100"/>

    <!-- PX4 SITL -->
    <arg name="vehicle" default="iris_2d_lidar"/>
    <arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/empty.world" />
    <arg name="sdf" default="$(find px4_sim_pkg)/models/iris_sonar/model.sdf" />
    <arg name="verbose" default="false"/>
    <arg name="debug" default="false"/>

    <include file="$(find px4)/launch/posix_sitl.launch" >
        <arg name="sdf" value="$(arg sdf)" />
        <arg name="vehicle" value="$(arg vehicle)" />
        <arg name="verbose" value="$(arg verbose)" />
        <arg name="debug" value="$(arg debug)" />
        <arg name="world" value="$(arg world)" />
    </include>

    <!-- mavros -->
    <arg name="fcu_url" default="udp://:14540@localhost:14557" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="1" />
    <arg name="log_output" default="screen" />
    <arg name="fcu_protocol" default="v2.0" />
    <arg name="respawn_mavros" default="false" />

    <include file="$(find mavros)/launch/node.launch">
        <arg name="pluginlists_yaml" value="$(find px4_sim_pkg)/config/px4_pluginlists.yaml" />
        <arg name="config_yaml" value="$(find px4_sim_pkg)/config/distance_sensor.yaml" />

        <arg name="fcu_url" value="$(arg fcu_url)" />
        <arg name="gcs_url" value="$(arg gcs_url)" />
        <arg name="tgt_system" value="$(arg tgt_system)" />
        <arg name="tgt_component" value="$(arg tgt_component)" />
        <arg name="log_output" value="$(arg log_output)" />
        <arg name="fcu_protocol" value="$(arg fcu_protocol)" />
        <arg name="respawn_mavros" default="$(arg respawn_mavros)" />
    </include>

</launch>

测试:

  • 执行创建的 Launch 文件。
cd ~/tools/dronedoc/
source load_environment.sh
roslaunch px4_sim_pkg mymodel_sonar.launch
  • 输出距离传感器主题的值。
rostopic echo /mavros/distance_sensor/sonar_pub
  • 如果得到如下输出,则设置完成。
header:
seq: 145
stamp:
    secs: 16
    nsecs: 276000000
frame_id: "sonar::link"
radiation_type: 0
field_of_view: 0.0
min_range: 0.00999999977648
max_range: 5.0
range: 1.99000000954
---
header:
seq: 146
stamp:
    secs: 16
    nsecs: 380000000
frame_id: "sonar::link"
radiation_type: 0
field_of_view: 0.0
min_range: 0.00999999977648
max_range: 5.0
range: 1.95000004768
---
header:
seq: 147
stamp:
    secs: 16
    nsecs: 480000000
frame_id: "sonar::link"
radiation_type: 0
field_of_view: 0.0
min_range: 0.00999999977648
max_range: 5.0
range: 1.94000005722
---

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: px4与仿真入门教程