ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1

避开障碍物计算图如何呢?

该应用程序的计算图非常简单:订阅激光主题的节点向机器人发布速度命令。

控制逻辑解释:输入的感知信息并产生控制命令(输出)。这个逻辑就是要用FSM实现的。逻辑控制将以20 Hz反复运行。执行频率取决于发布控制命令。

通常,接收信息的频率与发布信息的频率不同(差异)。必须处理这个问题。不要抱怨问题,要解决问题。如果希望软件在不同的机器人上运行,不能为机器人指定特定的主题。在例子中,它订阅的主题是/input scan,并在/output vel中发布。这些主题不存在或与模拟机器人的主题相对应。当执行它时(在部署时),将重新映射端口以将它们连接到特定机器人的真实主题。

在这里讨论一点。为什么使用重映射而不是传递主题名称作为参数?嗯,这是许多ROS2开发人员提倡的一种替代方案。当一个节点不总是具有相同的订阅者/发布者时,这个替代方案可能更方便,并且只能在配置参数的YAML文件中指定。

一个好的方法是,如果节点中的发布者和订阅者的数量是已知的,则使用通用主题名称(如本示例中使用的名称),并执行重新映射。使用通用主题名称可能更好(/cmd_vel是许多机器人的通用控制速度主题)。经验丰富的ROS2程序员将在文档中阅读它使用的主题,了解ROS2节点信息,并快速使用remap,而不是寻找要在配置中设置的正确参数文件夹。

尽管本书主要使用C++,但在本章中,将提供两种类似的实现,一种是C++实现,另一种是Python实现,每种都包含在不同的包中:br2-fsm-bumpgo-cpp和br2-fsm bumpgo-py。

案例cpp:

#include <string>
#include <memory>#include "behaviortree_cpp_v3/behavior_tree.h"
#include "behaviortree_cpp_v3/bt_factory.h"
#include "behaviortree_cpp_v3/utils/shared_library.h"
#include "behaviortree_cpp_v3/loggers/bt_zmq_publisher.h"#include "ament_index_cpp/get_package_share_directory.hpp"#include "rclcpp/rclcpp.hpp"int main(int argc, char * argv[])
{rclcpp::init(argc, argv);auto node = rclcpp::Node::make_shared("patrolling_node");BT::BehaviorTreeFactory factory;BT::SharedLibrary loader;factory.registerFromPlugin(loader.getOSName("br2_forward_bt_node"));factory.registerFromPlugin(loader.getOSName("br2_back_bt_node"));factory.registerFromPlugin(loader.getOSName("br2_turn_bt_node"));factory.registerFromPlugin(loader.getOSName("br2_is_obstacle_bt_node"));std::string pkgpath = ament_index_cpp::get_package_share_directory("br2_bt_bumpgo");std::string xml_file = pkgpath + "/behavior_tree_xml/bumpgo.xml";auto blackboard = BT::Blackboard::create();blackboard->set("node", node);BT::Tree tree = factory.createTreeFromFile(xml_file, blackboard);auto publisher_zmq = std::make_shared<BT::PublisherZMQ>(tree, 10, 1666, 1667);rclcpp::Rate rate(10);bool finish = false;while (!finish && rclcpp::ok()) {finish = tree.rootNode()->executeTick() != BT::NodeStatus::RUNNING;rclcpp::spin_some(node);rate.sleep();}rclcpp::shutdown();return 0;
}

其中,如br2_is_obstacle_bt_node:

#include <string>
#include <utility>#include "br2_bt_bumpgo/IsObstacle.hpp"#include "behaviortree_cpp_v3/behavior_tree.h"#include "sensor_msgs/msg/laser_scan.hpp"
#include "rclcpp/rclcpp.hpp"namespace br2_bt_bumpgo
{using namespace std::chrono_literals;
using namespace std::placeholders;IsObstacle::IsObstacle(const std::string & xml_tag_name,const BT::NodeConfiguration & conf)
: BT::ConditionNode(xml_tag_name, conf)
{config().blackboard->get("node", node_);laser_sub_ = node_->create_subscription<sensor_msgs::msg::LaserScan>("/input_scan", 100, std::bind(&IsObstacle::laser_callback, this, _1));last_reading_time_ = node_->now();
}void
IsObstacle::laser_callback(sensor_msgs::msg::LaserScan::UniquePtr msg)
{last_scan_ = std::move(msg);
}BT::NodeStatus
IsObstacle::tick()
{if (last_scan_ == nullptr) {return BT::NodeStatus::FAILURE;}double distance = 1.0;getInput("distance", distance);if (last_scan_->ranges[last_scan_->ranges.size() / 2] < distance) {return BT::NodeStatus::SUCCESS;} else {return BT::NodeStatus::FAILURE;}
}}  // namespace br2_bt_bumpgo#include "behaviortree_cpp_v3/bt_factory.h"
BT_REGISTER_NODES(factory)
{factory.registerNodeType<br2_bt_bumpgo::IsObstacle>("IsObstacle");
}

后退:

vel_msgs.linear.x = -0.3;

前进:

vel_msgs.linear.x = 0.3;

转向:

vel_msgs.angular.z = 0.5;

ROS2机器人编程简述humble-第三章-COMPUTATION GRAPH .2相关推荐

  1. ROS2机器人编程简述humble-第一章-Introduction

    ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2 学习笔记流水账-推荐阅读原书. 第一章:简要介绍宏观概念,配 ...

  2. ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2

    参考链接: https://github.com/fmrico/book_ros2 封面: 简介: ROS2机器人编程简明教程 使用ROS2进行机器人编程的简明介绍为读者提供了通过编程实现机器人所需的 ...

  3. 程序员编程艺术:第三章续、Top K算法问题的实现

    程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha.     致谢:微软100题实现组,狂想曲创作组.     时间:2011年05月08日    ...

  4. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

  5. WPF编程基础入门 ——— 第三章 布局(五)布局面板WrapPanel

    WPF布局--布局面板WrapPanel WPF--WrapPanel布局控件 WrapPanel实例--十个按钮 WPF--WrapPanel布局控件 WrapPanel(自动折行面板),允许任意多 ...

  6. Javascript面向对象编程指南笔记 - 第三章 - 函数

    第三章 函数 第三章 函数 3-1 什么是函数 3-1-1 调用函数 3-1-2 参数 3-2 预定义函数 3-2-1 parseInt 3-2-2 parseFloat 3-2-3 isNaN 3- ...

  7. linux多线程服务端编程读书笔记——第三章

    本章作者主要是总结了一两种常用的线程模型.归纳了进程通信与线程同步的最佳实践 进程与线程的区别: 进程是文件系统中的最重要的两个概念之一(令一个是文件).简单地说,一个进程是内存中正在运行的程序.每个 ...

  8. windows网络编程第二版 第三章 Internet Protocol 读书笔记

    1. 本章主要讲述IP方面的东西,解释了IPv4, IPv6.在后面的两个章节中,讲述了地址和名字的解析(Address and Name Resolution),以及如何书写一个IPv4, IPv6 ...

  9. C语言编程入门之--第三章编写第一个C语言程序

      导读:一般学一门计算机语言的第一堂上机课("上机"顾名思义,上计算机,机你太美),就是往屏幕输出"hello world",本章也不例外. 3.1 Hell ...

最新文章

  1. reportNG定制化之失败截图及日志
  2. [置顶]       Javascript js中页面的重新加载
  3. 部队人员官兵请假管理系统
  4. 两数组的交集(无重复)Intersection of Two Arrays
  5. VMware 虚拟机 1、ubuntu 扩容(扩展硬盘容量)2、修改内存大小
  6. WSDM 2021 | 基于双向推理的多跳知识库问答技术
  7. 十、Hadoop学习笔记————Hive与Hbase以及RDBMS(关系型数据库)的关系
  8. 【discuz x3】源代码中的sql调用
  9. html-iframe内联框架
  10. idea 自动生产序列吗,IDEA自动生成序列化Id
  11. linux 命令行 播放器,Linux下基于命令行的音乐播放器
  12. UNIX 环境高级编程(八)—— fork 函数
  13. mysql call_关于Mysql “CALL语句”
  14. python做算法题优势_算法优点和缺点汇总(推荐AAA)
  15. 微信语音终于可以转发了,安卓用户优先!
  16. Win10怎么搜索文件内容?Win10通过文件内容查找文件的方法
  17. 计算机屏幕怎么设置键盘,[怎么用屏幕键盘]怎么用键盘调屏幕分辨率
  18. Mac M1 修改/usr/bin文件夹显示permission denied 没有权限的问题
  19. 解决pyspark的 Added jobs for time问题
  20. 关于 Vue.js 的那些事儿

热门文章

  1. 使用zinnia制作android手写输入功能(下)-------------------在项目中使用zinnia
  2. 比swagger更好用的工具?强烈推荐这款零代码侵入的接口管理神器
  3. 用matlab作地震波vsp图,用于深井VSP地震波检测的光纤配重装置的制作方法
  4. 小米电视机html,小米电视机功能详解 教你轻松使用
  5. NOKOV度量动捕软件教程(5):数据处理
  6. 快速入门FTP服务器:手把手教你搭建
  7. Ubuntu+OpenCV学习汉字点阵
  8. CVE-2022-26923域提权漏洞
  9. 跨平台开发方案的三个时代
  10. pd快充线无法连接计算机,一种PD快充高清连接线的制作方法