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
---
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号