ROS2机器人编程简述humble-第四章-COMPUTATION GRAPH .2

news2024/11/23 6:50:20

下图所示,机器人和障碍物直接距离:

可以看到如果是单线雷达,这种测距和传感器安装的位置密切相关。

chatgpt:
ROS2机器人的COMPUTATION GRAPH概念是指,通过构建一个图形结构,将机器人的计算任务分解成一系列的可执行步骤。其特点是具有易于理解、可扩展性强的特性,可以有效地提高机器人的计算性能。它的应用可以帮助机器人实现自主操作、自主导航等功能。
ROS2机器人激光测距系统的计算图是一种用于检测和定位物体的技术。它可以利用激光雷达发射的脉冲,经过反射后再次接收,从而测量物体到激光雷达的距离。它通常由一个传感器,一个处理器,一个控制器和一个软件组成,它们可以在ROS2机器人系统中实现自动控制和导航。

书中给出的图示:

使用rqt工具获取,与此一致:

测得距离等,成功会有一组数据显示。

例如,turtlebot

例如,tiago

检测障碍物:

加个箭头→标记:

绘制 "base_footprint", "detected_obstacle":

// 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 <tf2/transform_datatypes.h>
#include <tf2/LinearMath/Quaternion.h>

#include <memory>

#include "br2_tf2_detector/ObstacleMonitorNode.hpp"

#include "geometry_msgs/msg/transform_stamped.hpp"

#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"

#include "rclcpp/rclcpp.hpp"

namespace br2_tf2_detector
{

using namespace std::chrono_literals;

ObstacleMonitorNode::ObstacleMonitorNode()
: Node("obstacle_monitor"),
  tf_buffer_(),
  tf_listener_(tf_buffer_)
{
  marker_pub_ = create_publisher<visualization_msgs::msg::Marker>("obstacle_marker", 1);

  timer_ = create_wall_timer(
    500ms, std::bind(&ObstacleMonitorNode::control_cycle, this));
}

void
ObstacleMonitorNode::control_cycle()
{
  geometry_msgs::msg::TransformStamped robot2obstacle;

  try {
    robot2obstacle = tf_buffer_.lookupTransform(
      "base_footprint", "detected_obstacle", tf2::TimePointZero);
  } catch (tf2::TransformException & ex) {
    RCLCPP_WARN(get_logger(), "Obstacle transform not found: %s", ex.what());
    return;
  }

  double x = robot2obstacle.transform.translation.x;
  double y = robot2obstacle.transform.translation.y;
  double z = robot2obstacle.transform.translation.z;
  double theta = atan2(y, x);

  RCLCPP_INFO(
    get_logger(), "Obstacle detected at (%lf m, %lf m, , %lf m) = %lf rads",
    x, y, z, theta);

  visualization_msgs::msg::Marker obstacle_arrow;
  obstacle_arrow.header.frame_id = "base_footprint";
  obstacle_arrow.header.stamp = now();
  obstacle_arrow.type = visualization_msgs::msg::Marker::ARROW;
  obstacle_arrow.action = visualization_msgs::msg::Marker::ADD;
  obstacle_arrow.lifetime = rclcpp::Duration(1s);

  geometry_msgs::msg::Point start;
  start.x = 0.0;
  start.y = 0.0;
  start.z = 0.0;
  geometry_msgs::msg::Point end;
  end.x = x;
  end.y = y;
  end.z = z;
  obstacle_arrow.points = {start, end};

  obstacle_arrow.color.r = 1.0;
  obstacle_arrow.color.g = 0.0;
  obstacle_arrow.color.b = 0.0;
  obstacle_arrow.color.a = 1.0;

  obstacle_arrow.scale.x = 0.02;
  obstacle_arrow.scale.y = 0.1;
  obstacle_arrow.scale.z = 0.1;


  marker_pub_->publish(obstacle_arrow);
}

}  // namespace br2_tf2_detector

生成tf-detected_obstacle:

// 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

scan重命名等:

# 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.

from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    detector_cmd = Node(package='br2_tf2_detector',
                        executable='detector',
                        output='screen',
                        parameters=[{
                            'use_sim_time': True
                        }],
                        remappings=[
                            ('input_scan', '/scan_raw')
                        ])

    ld = LaunchDescription()
    ld.add_action(detector_cmd)

    return ld
remappings=[
('input_scan', '/scan_raw')
])

可以依据具体主题名称进行调整。

chatgpt:

要使用激光雷达数据,首先需要将激光雷达连接到你的机器人。然后,可以通过ROS2中的ROS2话题进行数据传输。激光雷达生成的数据通常是PointCloud2消息类型,该消息类型包含三维点的坐标信息。
接下来,可以通过创建一个ROS2节点来订阅并处理激光雷达生成的数据。您可以使用ROS2提供的函数,例如subscribe()和callback(),在该节点中实现这一点。回调函数可以访问接收到的数据,并对其进行处理。
最后,可以使用ROS2提供的函数,例如publish(),在该节点中发布处理后的数据,以便其他节点可以访问。
总而言之,使用ROS2中的激光雷达数据需要以下步骤:
连接激光雷达到机器人
通过ROS2话题传输数据
创建ROS2节点订阅和处理数据
在该节点中发布处理后的数据。

使用 ROS2 中的 tf2 库可以方便地处理坐标变换,包括平移和旋转。首先,需要安装 ROS2 中的 tf2 库,然后在代码中引入 tf2 的头文件。
接下来,需要创建一个 tf2 的 TransformBroadcaster 对象,它将负责广播坐标变换的数据。可以使用 TransformBroadcaster 对象的 sendTransform 函数来广播坐标变换的数据。
sendTransform 函数需要传入一些参数,例如:变换的时间戳、变换的原点坐标、变换的目标坐标、变换的平移量和旋转量。
最后,可以使用 tf2 的 TransformListener 对象来订阅坐标变换的数据。TransformListener 对象可以帮助计算从一个坐标系到另一个坐标系的变换。
以上是 ROS2 中使用 tf2 处理坐标数据的一般流程。详细的示例代码可以在 ROS2 官方文档中找到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯-最长公共子序列(线性dp)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知有两个数组a,b。已知每个数组的长度。要求求出两个数组的最长公共子序列 序列 1 2 3 4 5 序列 2 3 2 1 4 5 子序列&#xff1a;从其中抽掉某个或多个元素而产生的新…

libVLC 视频裁剪

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 裁剪是指去除图像的外部部分,也就是从图像的左,右,顶部和/或底部移除一些东西。通常在视频中,裁剪是一种通过剪切不需要的部分来改变宽高比的特殊方式。 尤其是在做视频墙时,往往需要处理多个 vlc 实例…

【排序算法】归并排序(Merge Sort)

将两个的有序数列合并成一个有序数列&#xff0c;我们称之为"归并"。归并排序(Merge Sort)就是利用归并思想对数列进行排序。归并排序介绍根据具体的实现&#xff0c;归并排序包括"从上往下"和"从下往上"2种方式。从下往上的归并排序将待排序的数…

Java常见的六种线程池、线程池-四种拒绝策略总结

点个关注&#xff0c;必回关 一、线程池的四种拒绝策略&#xff1a; CallerRunsPolicy - 当触发拒绝策略&#xff0c;只要线程池没有关闭的话&#xff0c;则使用调用线程直接运行任务。 一般并发比较小&#xff0c;性能要求不高&#xff0c;不允许失败。 但是&#xff0c;由于…

SpringCloud(20):Sentinel原理

1.Sentinel主要功能设计理念 1.1 流量控制 流量控制在网络传输中是一个常用的概念&#xff0c;它用于调整网络包的发送数据。然而&#xff0c;从系统稳定性角度考虑&#xff0c;在处理请求的速度上&#xff0c;也有非常多的讲究。任意时间到来的请求往往是随机不可控的&#…

排序:归并排序

一、归并 li[2,4,5,7,//1,3,6,8]#归并的前提是必须两部分排好序 def merge(li,low,mid,high):ilowjmid1ltmp[]while i<mid and j<high: #只要左右两边都有数if li[i]<li[j]:ltmp.append(li[i])i1else:ltmp.append(li[j])j1#while执行完&#xff0c;肯定有一部分没数…

MDB 5 UI-KIT Bootstrap 5 最新版放送

顶级开源 UI 套件&#xff0c;Bootstrap v5 和 v4 的材料设计&#xff0c;jQuery 版本&#xff0c;数百个优质组件和模板&#xff0c;所有一致的&#xff0c;有据可查的&#xff0c;可靠的超级简单&#xff0c;1分钟安装简单的主题和定制 受到超过 3,000,000 名开发人员和设计师…

工业互联网时代,VR工厂如何实现多媒体营销?

2023开年以来&#xff0c;国内消费复苏脚步逐渐加快&#xff0c;无论是餐饮、旅游还是电影市场人气逐渐旺盛&#xff0c;可以看到消费市场逐渐暖起来。而工业互联网将会是产业数字化的主要抓手&#xff0c;VR工厂是新时期、新形势下&#xff0c;运用“互联网”思维&#xff0c;…

ChatGPT简要解读(三) - ChatGPT发展历程及模型训练机制

&#x1f482; 个人主页: 同学来啦&#x1f91f; 版权: 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏和订阅专栏哦 文章目录&#x1f423; 一、发展历程&#x1f534; 1、基本概念&#x1f7e0…

Android图形显示流程简介

注&#xff1a;本文缩写说明本文代码都是基于Android S一、概述本文将对从App画出一帧画面到这帧画面是如何到达屏幕并最终被人眼看到的这一过程进行简要分析&#xff0c;并将这其中涉及到的各个流程与其在systrace上的体现对应起来&#xff0c;期望最终能够让读者对Android系统…

Geek Uninstaller:向流氓软件火力全开,超良心的软件彻底卸载工具

写在前面 我们在电脑上安装软件&#xff0c;以及在使用软件的过程中&#xff0c;会产生一些程序文件、注册表项和临时文件等&#xff0c;用来支持软件的正常使用&#xff0c;都是正常现象。 但是&#xff0c;在卸载软件时&#xff0c;很多软件自身的卸载程序很不负责任&#…

内网渗透(十六)之内网信息收集-powershell基础知识

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

chatGPT接入个人微信教程(国内可用)

chatGPT最近突然又大火起来了&#xff0c;而且这次不是一般的火&#xff0c;带有浓浓的商业气息火了。各个互联网大厂都开始进军了&#xff0c;感觉要来一场ChatGPT的军备竞赛一样&#xff0c;看看谁先获取国内的地盘。 作为吃瓜群众&#xff0c;我们也能个人使用ChatGPT&…

PCB设计中的正片和负片设计原理

PCB实际的最终目的 让需要导通的地方铺有铜&#xff0c;让不需要导通的地方没有铜 正片和负片的含义 参考&#xff1a;https://www.sohu.com/a/203224754_100012544&#xff0c;https://blog.csdn.net/weixin_42837669/article/details/110411765 查找资料中常见说法&#x…

力扣HOT100 (1-5)

目录 1.两数之和 2.两数相加 拓展到牛客的TOP101的BM11( 链表相加&#xff08;二&#xff09;) 3.无重复的最长子串&#xff08;牛客BM92&#xff09; 解法1&#xff1a; 解法2&#xff1a; 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 思路&#xff1a;用Has…

Centos7下安装单节点flink1.13

前置环境配置jdk可以参考博文&#xff1a;Centos7下安装hadoop单节点 。 如下图所示&#xff0c;这里我们将flink-1.13.0-bin-scala_2.12.tgz上传到如下路径&#xff1a; 解压安装文件到/opt/module下面 tar -zxvf flink-1.13.0-bin-scala_2.12.tgz -C /opt/module/将flink…

背包问题求方案数、具体方案

背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…

如何实现LFU缓存(最近最少频率使用)

目录 1.什么是LFU缓存&#xff1f; 2.LFU的使用场景有哪些&#xff1f; 3.LFU缓存的实现方式有哪些&#xff1f; 4.put/get 函数实现具体功能 1.什么是LFU缓存&#xff1f; LFU缓存是一个具有指定大小的缓存&#xff0c;随着添加元素的增加&#xff0c;达到容量的上限&…

为什么我们不再发明编程语言了?

上个世纪&#xff0c;数百种编程语言被发明出来&#xff0c;但是进入21世纪&#xff0c;当我们都进入互联网时代时&#xff0c;只剩那么寥寥几个了。 如果你翻一下TIOBE得编程语言排行榜&#xff0c;就会发现20年来&#xff0c;上蹿下跳的就是那几张老面孔&#xff1a;C , Java…

(片花)原汤话原食:从公共场所不知深浅的熊孩子聊聊边界感这事

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 伊姐 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 伊姐 产品统筹 / bobo 录音间 / 声湃轩天津站本期节目完整版请在各大音频平台搜索”原汤话原食“&#xff0c;找到原汤话原食栏目后订阅收听。刚刚过去的春节&#xff0c;许…