前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS2机器人编程简述humble-第四章-AN OBSTACLE DETECTOR THAT USES TF2 .1

ROS2机器人编程简述humble-第四章-AN OBSTACLE DETECTOR THAT USES TF2 .1

作者头像
zhangrelay
发布2023-02-26 18:52:58
3350
发布2023-02-26 18:52:58
举报

如何检测一个障碍物呢?

视觉、雷达?

可视化效果如何?

机器人所装备的传感器例如感知设备,主要负责环境的获取和识别。

然后,结果发送给电机控制运动,在环境中自主、智能决策和规划。

需要先简单看一下仿真可视化效果。

书中给出两幅图:

ROS2机器人Gazebo是一个专门为机器人应用开发的三维模拟器,它可以帮助机器人开发人员更快、更容易地设计和调试机器人应用。Gazebo提供了一个可视化的环境,可以模拟真实世界的物理环境,并且可以通过ROS2接口与其他机器人应用进行通信。使用Gazebo,可以更快、更容易地开发机器人应用,并且可以在实际环境中更好地测试和调试机器人应用。

机器人Tiago用激光传感器探测障碍物。红色箭头突出显示检测到障碍物的中心读数。

ROS2机器人Rviz2是一个可视化工具,用于显示机器人环境中的消息,提供3D视角来查看机器人的状态和活动。它可以帮助开发者更好地理解机器人当前的状态和活动,以及其他可视化消息。Rviz2提供了一系列的可视化工具,可以帮助开发者更好地理解机器人的状态和活动,比如可视化坐标系、激光扫描消息、点云消息、机器人模型等等。使用Rviz2,可以轻松地查看和调试机器人系统,从而更好地实现机器人目标。

可用于视觉调试的视觉标记

可以用turtlebot复现一下。

打开一个空白的环境:

ros2 launch turtlebot3_gazebo empty_world.launch.py

这时候,如果用topic查看数据可以得到:

网络中,所有计算机和机器人节点都能正常通信,支持windows、linux。

其中/scan

数据太多只看一组:

代码语言:javascript
复制
---
header:
  stamp:
    sec: 140
    nanosec: 162000000
  frame_id: base_scan
angle_min: 0.0
angle_max: 6.28000020980835
angle_increment: 0.01749303564429283
time_increment: 0.0
scan_time: 0.0
range_min: 0.11999999731779099
range_max: 3.5
ranges:
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- .inf
- '...'
intensities:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- '...'
---

其中,.inf代表此时传感器最大量程中,没有检测到障碍物。

各类障碍物有典型特征。如下分别举例。

机器人正前方有方形障碍物。

数据:

代码语言:javascript
复制
header:
  stamp:
    sec: 266
    nanosec: 306000000
  frame_id: base_scan
angle_min: 0.0
angle_max: 6.28000020980835
angle_increment: 0.01749303564429283
time_increment: 0.0
scan_time: 0.0
range_min: 0.11999999731779099
range_max: 3.5
ranges:
- 0.631385326385498
- 0.6107633709907532
- 0.6275626420974731
- 0.6091671586036682
- 0.6179323196411133
- 0.629402220249176
- 0.6138762831687927
- 0.6203798055648804
- 0.6130021810531616
- 0.6370837688446045
- 0.6302768588066101
- 0.6479257345199585
- 0.6441364288330078
- 0.6394597887992859
- 0.6609111428260803
- 0.6480688452720642
- 0.6676570773124695
- 0.6556036472320557
- 0.6597179770469666
- 0.6508679389953613
- 0.6702691912651062
- 0.671261727809906
- 0.6567016243934631
- 0.6737935543060303
- 0.6872966289520264
- 0.6952883005142212
- 0.7050795555114746
- 0.6851144433021545
- 0.7049869298934937
- 0.6912679076194763
- 0.7239711284637451
- 0.7069382071495056
- 0.7477790713310242
- 0.7354172468185425
- .inf
- .inf
- .inf
- .inf

圆柱体:

数据:

代码语言:javascript
复制
header:
  stamp:
    sec: 408
    nanosec: 739000000
  frame_id: base_scan
angle_min: 0.0
angle_max: 6.28000020980835
angle_increment: 0.01749303564429283
time_increment: 0.0
scan_time: 0.0
range_min: 0.11999999731779099
range_max: 3.5
ranges:
- 1.1339192390441895
- 1.1576037406921387
- 1.1470191478729248
- 1.1520755290985107
- 1.1525921821594238
- 1.1922894716262817
- 1.1875109672546387
- 1.1898000240325928
- 1.2374821901321411
- 1.2563176155090332
- 1.27926504611969
- 1.31011164188385
- 1.366029143333435
- 1.4372227191925049
- .inf
- .inf
- .inf
- .inf
- .inf

这样数据不便于分析和查看,rviz2可以可视化此类数据。

点:

球:

此部分内容需要全面掌握好的。

比如坐标角度与仿真不同?

调整一下

完全对应:

这一章主要内容后续会将障碍物与TF做一个案例。

书中给出的检测转TF代码:

代码语言:javascript
复制
// Copyright 2021 Intelligent Robotics Lab
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include <memory>

#include "br2_tf2_detector/ObstacleDetectorNode.hpp"

#include "sensor_msgs/msg/laser_scan.hpp"
#include "geometry_msgs/msg/transform_stamped.hpp"

#include "rclcpp/rclcpp.hpp"

namespace br2_tf2_detector
{

using std::placeholders::_1;

ObstacleDetectorNode::ObstacleDetectorNode()
: Node("obstacle_detector")
{
  scan_sub_ = create_subscription<sensor_msgs::msg::LaserScan>(
    "input_scan", rclcpp::SensorDataQoS(),
    std::bind(&ObstacleDetectorNode::scan_callback, this, _1));

  tf_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(*this);
}

void
ObstacleDetectorNode::scan_callback(sensor_msgs::msg::LaserScan::UniquePtr msg)
{
  double dist = msg->ranges[msg->ranges.size() / 2];

  if (!std::isinf(dist)) {
    geometry_msgs::msg::TransformStamped detection_tf;

    detection_tf.header = msg->header;
    detection_tf.child_frame_id = "detected_obstacle";
    detection_tf.transform.translation.x = msg->ranges[msg->ranges.size() / 2];

    tf_broadcaster_->sendTransform(detection_tf);
  }
}

}  // namespace br2_tf2_detector
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档