首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ROS -将超声数据添加到range_sensor_layer时出现问题

ROS -将超声数据添加到range_sensor_layer时出现问题
EN

Stack Overflow用户
提问于 2021-09-09 21:41:37
回答 1查看 292关注 0票数 2

我需要一些帮助来解决我在向已经配备了RPlidar的机器人(松散地基于Linorobot)添加超声波传感器时遇到的问题。硬件/软件: Raspi3B与Ubuntu16.04.6LTS,ROS动态,一个Teensy,2纳米。

机器人只用激光雷达就能很好地工作,但我需要能够正确地检测玻璃和一些反射表面,所以我添加了超声波传感器。硬件和微控制器(rosserial)部分似乎工作正常,我怀疑这是我那部分的错误,可能与命名空间或转换帧有关……也许我错过了一些巨大的东西。我一遍又一遍地对照在线教程、示例和其他类似的问题进行检查,但我找不到罪魁祸首。

执行启动文件后,我得到标准消息(与尝试设置超声波传感器之前相同),外加:

代码语言:javascript
运行
复制
[ INFO] [1631195261.554945536]: global_costmap/sonar_layer: ALL as input_sensor_type given
[ INFO] [1631195261.596176257]: RangeSensorLayer: subscribed to topic /ultrasound_front

我想这很好。不幸的是,从那一刻起,我得到了(当然,随着数字越来越高):

代码语言:javascript
运行
复制
[ WARN] [1631195265.533631740]: No range readings received for 4.02 seconds, while expected at least every 2.00 seconds.

这里有一条传感器消息(来自"rostopic echo /ultrasound_front"):

代码语言:javascript
运行
复制
----
header: 
  seq: 1124
  stamp: 
    secs: 1631192726
    nsecs: 301432058
  frame_id: "sonar_front"
radiation_type: 0
field_of_view: 0.259999990463
min_range: 0.0
max_range: 100.0
range: 52.0
----

所以,主题发布了,消息应该是ok的…

我的costmap_common_params.yaml:

代码语言:javascript
运行
复制
map_type: costmap

transform_tolerance: 1

footprint: [[-0.25, -0.25], [-0.25, 0.25], [0.25, 0.25], [0.25, -0.25]]

inflation_layer:
  inflation_radius: 0.28
  cost_scaling_factor: 3

obstacle_layer:
  obstacle_range: 2.5
  raytrace_range: 3.0
  observation_sources: scan
  observation_persistence: 0.0
  scan:
    data_type: LaserScan
    topic: scan
    marking: true
    clearing: true

sonar_layer:
  frame: sonar_front
  topics: ["/ultrasound_front"]
  no_readings_timeout: 2.0
  clear_on_max_reading: true
  clear_threshold: 0.2
  mark_threshold: 0.80

我的global_costmap_params.yaml:

代码语言:javascript
运行
复制
global_costmap:
  global_frame: /map
  robot_base_frame: /base_footprint
  update_frequency: 1
  publish_frequency: 0.5
  static_map: true
  transform_tolerance: 1
  plugins:
    - {name: static_layer,    type: "costmap_2d::StaticLayer"}
    - {name: sonar_layer,   type: "range_sensor_layer::RangeSensorLayer"}
    - {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}
    - {name: inflation_layer, type: "costmap_2d::InflationLayer"}

我的local_costmap_params.yaml:

代码语言:javascript
运行
复制
local_costmap:
  global_frame: /odom
  robot_base_frame: /base_footprint
  update_frequency: 1
  publish_frequency: 5.0
  static_map: false
  rolling_window: true
  width: 3
  height: 3
  resolution: 0.02
  transform_tolerance: 1
  observation_persistence: 0.0

  plugins:
    - {name: obstacle_layer,  type: "costmap_2d::ObstacleLayer"}
    - {name: sonar_layer, type: "range_sensor_layer::RangeSensorLayer"}
    - {name: inflation_layer, type: "costmap_2d::InflationLayer"}

和我的barebone URDF:

代码语言:javascript
运行
复制
<?xml version="1.0"?>
   <robot name="linorobot">

    <link name="base_link">
      <visual>
        <geometry>
          <box size="0.50 0.33 0.09"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0.0 0.00 0.085"/>
        <material name="blue">
          <color rgba="0 0 .8 1"/>
        </material>
      </visual>
    </link>

    <link name="perception_deck">
      <visual>
        <geometry>
          <box size="0.18 0.33 0.08"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0.0 0.0 0.17"/>
        <material name="blue">
          <color rgba="0 0 .8 1"/>
        </material>
      </visual>
    </link>


    <link name="wheel_left_front">
      <visual>
        <geometry>
          <cylinder length="0.03" radius="0.06"/>
        </geometry>
        <origin rpy="1.57 0 0" xyz="0.163 0.222 0.03"/>
        <material name="black">
          <color rgba="0 0 0 1"/>
        </material>
      </visual>
    </link>

    <link name="wheel_right_front">
      <visual>
        <geometry>
          <cylinder length="0.03" radius="0.06"/>
        </geometry>
        <origin rpy="1.57 0 0" xyz="0.163 -0.222 0.03"/>
        <material name="black">
          <color rgba="0 0 0 1"/>
        </material>
      </visual>
    </link>

    <link name="wheel_left_rear">
      <visual>
        <geometry>
          <cylinder length="0.03" radius="0.06"/>
        </geometry>
        <origin rpy="1.57 0 0" xyz="-0.163 0.222 0.03"/>
        <material name="black">
          <color rgba="0 0 0 1"/>
        </material>
      </visual>
    </link>

    <link name="wheel_right_rear">
      <visual>
        <geometry>
          <cylinder length="0.03" radius="0.06"/>
        </geometry>
        <origin rpy="1.57 0 0" xyz="-0.163 -0.222 0.03"/>
        <material name="black">
          <color rgba="0 0 0 1"/>
        </material>
      </visual>
    </link>

    <link name="laser">
      <visual>
        <geometry>
          <cylinder length="0.065" radius="0.035"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0.0 0.0 0.2825"/>
        <material name="black"/>
      </visual>
    </link>

    <link name="chassis">
      <visual>
        <geometry>
          <box size="0.5 0.5 0.8"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0.0 0.0 0.0"/>
        <material name="silver">
          <color rgba="192 192 192 0.6"/>
        </material>
      </visual>
    </link>

    <link name="sonar_front">
      <visual>
       </geometry>
        <origin rpy="1.5708 0.2618 0" xyz="-0.21 0.0 0.235"/>
        <material name="silver">
          <color rgba="192 192 192 0.6"/>
        </material>
      </visual>
    </link>

    <link name="sonar_rear">
      <visual>
        <geometry>
          <box size="0.02 0.025 0.07"/>
        </geometry>
        <origin rpy="1.5708 0.2618 3.1416" xyz="0.23 0.0 0.235"/>
        <material name="silver">
          <color rgba="192 192 192 0.6"/>
        </material>
      </visual>
    </link>

    <link name="sonar_left">
      <visual>
        <geometry>
          <box size="0.02 0.025 0.07"/>
        </geometry>
        <origin rpy="1.5708 -0.2618 1.5708" xyz="0.0 0.18 0.235"/>
        <material name="silver">
          <color rgba="192 192 192 0.6"/>
        </material>
      </visual>
    </link>

    <link name="sonar_right">
      <visual>
        <geometry>
          <box size="0.02 0.025 0.07"/>
        </geometry>
        <origin rpy="1.5708 -0.2618 -1.5708" xyz="0.0 -0.19 0.235"/>
        <material name="silver">
          <color rgba="192 192 192 0.6"/>
        </material>
      </visual>
    </link>

    <joint name="base_to_wheel_left_front" type="fixed">
      <parent link="base_link"/>
      <child link="wheel_left_front"/>
      <origin xyz="0 0 0"/>
    </joint>

    <joint name="base_to_wheel_right_front" type="fixed">
      <parent link="base_link"/>
      <child link="wheel_right_front"/>
      <origin xyz="0 0 0"/>
    </joint>

    <joint name="base_to_wheel_left_rear" type="fixed">
      <parent link="base_link"/>
      <child link="wheel_left_rear"/>
      <origin xyz="0 0 0"/>
    </joint>

    <joint name="base_to_wheel_right_rear" type="fixed">
      <parent link="base_link"/>
      <child link="wheel_right_rear"/>
      <origin xyz="0 0 0"/>
    </joint>

    <joint name="base_to_laser" type="fixed">
      <parent link="base_link"/>
      <child link="laser"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_left_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_left"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_right_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_right"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_rear_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_rear"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_front_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_front"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_perception_deck" type="fixed">
      <parent link="base_link"/>
    <joint name="base_to_laser" type="fixed">
      <parent link="base_link"/>
      <child link="laser"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_left_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_left"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_right_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_right"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_rear_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_rear"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_front_sonar" type="fixed">
      <parent link="base_link"/>
      <child link="sonar_front"/>
      <origin xyz="0.0 0.0 0.0"/>
    </joint>

    <joint name="base_to_perception_deck" type="fixed">
      <parent link="base_link"/>
      <child link="perception_deck"/>
      <origin xyz="0 0 0.0"/>
    </joint>

    <joint name="base_to_chassis" type="fixed">
      <parent link="base_link"/>
      <child link="chassis"/>
      <origin xyz="0 0 0.44"/>
    </joint>
  </robot>

谢谢!

编辑

收到消息后,"rostopic hz /ultrasound_front“给出:

代码语言:javascript
运行
复制
subscribed to [/ultrasound_front]
average rate: 3.494
    min: 0.267s max: 0.305s std dev: 0.01919s window: 3
average rate: 3.384
    min: 0.250s max: 0.353s std dev: 0.03533s window: 6
average rate: 3.362
    min: 0.250s max: 0.353s std dev: 0.02813s window: 9
average rate: 3.352
    min: 0.250s max: 0.353s std dev: 0.02625s window: 13
average rate: 3.349
    min: 0.250s max: 0.353s std dev: 0.02447s window: 16
average rate: 3.344
    min: 0.250s max: 0.353s std dev: 0.02547s window: 20
average rate: 3.341
    min: 0.250s max: 0.353s std dev: 0.02368s window: 23
average rate: 3.256
    min: 0.250s max: 0.490s std dev: 0.04349s window: 26
average rate: 3.336
    min: 0.110s max: 0.490s std dev: 0.05406s window: 30
average rate: 3.335
    min: 0.110s max: 0.490s std dev: 0.05176s window: 33

诸若此类。MCU代码中的发布间隔为250ms。

已更正"rostopic echo /ultrasound_front“中的"max_range:1.0”(原单片机代码中的错误),行为不变。我修改了上面的输出以反映当前版本。

"rostopic info /ultrasound_front",在消息开始后,给出:(谢谢@BTables!)

代码语言:javascript
运行
复制
Type: sensor_msgs/Range

Publishers: 
 * /rosserial_NANO_sensors (http://192.168.2.54:34525/)

Subscribers: 
 * /move_base (http://192.168.2.54:40149/)
EN

回答 1

Stack Overflow用户

发布于 2021-10-01 14:40:36

我终于解决了添加超声波传感器后出现的一些问题。由于错误的性质,以及可能存在的大量不同的硬件/软件配置,我将把我的发现和一些更一般的信息放在这里,希望能对其他人有所帮助:

  • 仔细检查微控制器代码的范围字段中使用的测量单位。例如,我使用和引用的库和示例都包含在cm中。

这对ROS导航层不好,在消息中传递的距离/距离数字应该以米为单位(min_range,max_range,range)。

然而,微控制器代码可能正在传递数据,并使用一些内部计算或逻辑,单位为厘米(例如这里的'https://www.intorobotics.com/how-to-use-sensor_msgs-range-ros-for-multiple-sensors-with-rosserial/' ),因此可能需要进行一些更改(也涉及清除成本图背后的逻辑,但这是另一个问题的问题)。

  • 20 to的消息速率应该可以,它应该不会产生丢失的数据消息,同步错误等。但是请注意,这个频率可能需要修改。取决于所涉及的硬件。

  • 成本图YAML参数clear_on_max_reading行为取决于您的超声传感器(或传感器) MCU代码如何呈现数据。这是一个好主意,尝试这两个设置,并检查哪一个更适合您的情况。然后,您可以修改MCU代码以适应此设置背后的库逻辑(或者反过来,修改libraries).

  • Verify,即您的RVIZ配置包含可视化超声(距离)传感器数据所需的所有信息) (http://wiki.ros.org/rviz/DisplayTypes/Range)

  • The URDF通常会给出清晰的消息,如果与变换和相关数据相关的内容不起作用,一旦实际问题得到解决,就可以在Rviz中看到圆锥体和轴(如果测量单位不是太小!),

  • 使用check_urdf验证URDF文件(http://wiki.ros.org/urdf#Verification)的有效性,urdf_to_graphiz使用包含更多数据的可视化表示,这可以为故障或错误(http://wiki.ros.org/urdf#Visualization)提供一些线索。此外,将(http://wiki.ros.org/rqt_graph).

enable_statistics设置为"true“的rqt_graph也可以提供有用的线索

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69125009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档