ROS2机器人编程简述humble-第三章-BUMP AND GO IN C++ .3

news2025/7/6 7:54:19

简述本章项目,参考如下:

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

流程图绘制,参考如下:

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

然后,在3.3和3.4分别用C++和Python编程实现

(br2_fsm_bumpgo_cpp/ + br2_fsm_bumpgo_py/)。

br2 fsm bumpgo cpp功能包组成如下:

.
├── CMakeLists.txt
├── include
│   └── br2_fsm_bumpgo_cpp
│       └── BumpGoNode.hpp
├── launch
│   └── bump_and_go.launch.py
├── package.xml
└── src
    ├── br2_fsm_bumpgo_cpp
    │   └── BumpGoNode.cpp
    └── bumpgo_main.cpp

5 directories, 6 files

头文件:BumpGoNode.hpp
功能实现:BumpGoNode.cpp
主文件:bumpgo_main.cpp
启动文件:bump_and_go.launch.py

输入Subscription和输出Publisher:

  rclcpp::Subscription<sensor_msgs::msg::LaserScan>::SharedPtr scan_sub_;
  rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr vel_pub_;

回调支持:

void scan_callback(const sensor_msgs::msg::LaserScan & msg);

void scan_callback(sensor_msgs::msg::LaserScan::UniquePtr msg);

void scan_callback(sensor_msgs::msg::LaserScan::SharedConstPtr msg);

void scan_callback(const sensor_msgs::msg::LaserScan::SharedConstPtr & msg);

void scan_callback(sensor_msgs::msg::LaserScan::SharedPtr msg);

依据需要选择,如:

  void scan_callback(sensor_msgs::msg::LaserScan::UniquePtr msg);
  void control_cycle();

更具体一些:

void
BumpGoNode::scan_callback(sensor_msgs::msg::LaserScan::UniquePtr msg)
{
  last_scan_ = std::move(msg);
}

void
BumpGoNode::control_cycle()
{
  // Do nothing until the first sensor read
  if (last_scan_ == nullptr) {
    return;
  }

  geometry_msgs::msg::Twist out_vel;

  switch (state_) {
    case FORWARD:
      out_vel.linear.x = SPEED_LINEAR;

      if (check_forward_2_stop()) {
        go_state(STOP);
      }

      if (check_forward_2_back()) {
        go_state(BACK);
      }
      break;
    case BACK:
      out_vel.linear.x = -SPEED_LINEAR;

      if (check_back_2_turn()) {
        go_state(TURN);
      }
      break;
    case TURN:
      out_vel.angular.z = SPEED_ANGULAR;

      if (check_turn_2_forward()) {
        go_state(FORWARD);
      }

      break;
    case STOP:
      if (check_stop_2_forward()) {
        go_state(FORWARD);
      }
      break;
  }

  vel_pub_->publish(out_vel);
}

里面可以看到四种状态切换:

  static const int FORWARD = 0;
  static const int BACK = 1;
  static const int TURN = 2;
  static const int STOP = 3;

状态对应和切换:

void
BumpGoNode::go_state(int new_state)
{
  state_ = new_state;
  state_ts_ = now();
}

bool
BumpGoNode::check_forward_2_back()
{
  // going forward when deteting an obstacle
  // at 0.5 meters with the front laser read
  size_t pos = last_scan_->ranges.size() / 2;
  return last_scan_->ranges[pos] < OBSTACLE_DISTANCE;
}

bool
BumpGoNode::check_forward_2_stop()
{
  // Stop if no sensor readings for 1 second
  auto elapsed = now() - rclcpp::Time(last_scan_->header.stamp);
  return elapsed > SCAN_TIMEOUT;
}

bool
BumpGoNode::check_stop_2_forward()
{
  // Going forward if sensor readings are available
  // again
  auto elapsed = now() - rclcpp::Time(last_scan_->header.stamp);
  return elapsed < SCAN_TIMEOUT;
}

bool
BumpGoNode::check_back_2_turn()
{
  // Going back for 2 seconds
  return (now() - state_ts_) > BACKING_TIME;
}

bool
BumpGoNode::check_turn_2_forward()
{
  // Turning for 2 seconds
  return (now() - state_ts_) > TURNING_TIME;
}

例如:

bool
BumpGoNode::check_forward_2_back()
{
  // going forward when deteting an obstacle
  // at 0.5 meters with the front laser read
  size_t pos = last_scan_->ranges.size() / 2;
  return last_scan_->ranges[pos] < OBSTACLE_DISTANCE;
}

检查机器人前方是否有障碍物。

主程序main:

#include <memory>

#include "br2_fsm_bumpgo_cpp/BumpGoNode.hpp"
#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);

  auto bumpgo_node = std::make_shared<br2_fsm_bumpgo_cpp::BumpGoNode>();
  rclcpp::spin(bumpgo_node);

  rclcpp::shutdown();

  return 0;
}

执行

启动仿真,参考:

ROS2机器人编程简述humble-第二章-SIMULATED ROBOT SETUP .4

ros2 launch br2_tiago sim.launch.py

加载避障程序:

ros2 run br2_fsm_bumpgo_cpp bumpgo --ros-args -r output_vel:=/nav_vel -r input_scan:=/scan_raw -p use_sim_time:=true

或者使用启动文件:

ros2 launch br2_fsm_bumpgo_cpp bump_and_go.launch.py

from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():

    bumpgo_cmd = Node(package='br2_fsm_bumpgo_cpp',
                      executable='bumpgo',
                      output='screen',
                      parameters=[{
                        'use_sim_time': True
                      }],
                      remappings=[
                        ('input_scan', '/scan_raw'),
                        ('output_vel', '/nav_vel')
                      ])

    ld = LaunchDescription()
    ld.add_action(bumpgo_cmd)

    return ld

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

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

相关文章

Bus Hound 工具抓取串口数据(PC端抓取USB转串口数据)

测试环境&#xff1a; PC端 USB转串口 链接终端板卡串口 目标&#xff1a;抓取通信过程中的通信数据 工具介绍&#xff1a;Bus Hound是是由美国perisoft公司研制的一款超级软件总线协议分析器&#xff0c;它是一种专用于PC机各种总线数据包监视和控制的开发工具软件&#xff0c…

通信原理简明教程 | 数字调制传输

文章目录1 二进制数字调制和解调1.1 二进制数字调制的基本原理1.2 二进制数字调制信号的特性1.3 解调方法2 二进制差分相移键控2.1 2PSK的倒π现象2.2 2DPSK调制和解调3 二进制调制系统的抗噪性能3.1 2ASK系统的抗噪声性能3.2 2FSK系统的抗噪声性能4 二进制数字调制系统性能比较…

服务器配置定时脚本 crontab + Python;centos6或centos 7或centos8 实现定时执行 python 脚本

一、crontab的安装 默认情况下,CentOS 7中已经安装有crontab,如果没有安装,可以通过yum进行安装。 yum install crontabs 二、crontab的定时语法说明 corntab中,一行代码就是一个定时任务,其语法结构可以通过这个图来理解。 字符含义如下: * 代表取值范围内的数字 /…

Linux内核驱动初探(三) 以太网卡

目录 0. 前言 1. menuconfig 2. 设备树 0. 前言 这次的网卡驱动就比较顺利&#xff0c;基本就是参考 4.19.x 内核以及 imx6qdl-sabrelite.dtsi、imx6qdl-sabreauto.dtsi 中的设备树&#xff0c;来设置以太网各项参数。 1. menuconfig 其实笔者接手的时候&#xff0c;网口这…

本质安全设备标准(IEC60079-11)的理解(三)

本质安全设备标准&#xff08;IEC60079-11&#xff09;的理解&#xff08;三&#xff09; 对于标准中“fault”的理解 第一&#xff0c;标准中对fault的定义是这样的&#xff1a; 3.7.2 fault any defect of any component, separation, insulation or connection between c…

C++空间命名

前言 提示&#xff1a;由于C是在C语言基础之上&#xff0c;增加了很多新的东西。 本文讲解命名空间的具体使用方法 文章目录 目录 前言 一、命名空间 二、命名空间定义 1.嵌套性 2.和并性 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一…

【华为上机真题】区间交集

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

CleanMyMac X真的有必要买吗?CleanMyMac2023最新版下载

CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器&#xff0c;只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac为您喜爱的东西腾出空间。它不仅有着赏心悦目的UI交互页面&#xff0c;更有着强大的“超能力…

HTB-BountyHunter

HTB-BountyHunter信息收集开机提权信息收集 80端口的网页如下。 注意有一个db.php&#xff0c;虽然现在打不开&#xff0c;估计后面会用上。 还有resources里面的readme文件。 完成了tracker提交编写和developer组权限。没有完成portal的test用户禁用、选择哈希加密的密码以…

Webshell(网页后门)

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 一、Webshell简介 01 什么是 Webshell webshell是以 asp、php、jsp或者cgi等网页文…

【数据结构与算法】第十九篇:回溯,剪枝,N皇后问题

知识导航一、回溯思想概述二、八皇后问题引入八皇后问题的解决思路(1)思路一&#xff1a;暴力出奇迹(2&#xff09;思路二&#xff1a;根据题意减小暴力程度(3&#xff09;思路三&#xff1a;回溯法剪枝三、四皇后问题八皇后问题四、N皇后的实现1.实现方法一&#xff1a;利用数…

程序员的自我修养第七章——动态链接 (上)

继续更新《程序员的自我修养》这个系列&#xff0c;主要是夏天没把它看完&#xff0c;补上遗憾。本篇来自书中第七章。 再说动态链接前&#xff0c;我们先阐明为什么要动态链接&#xff1a; 动态链接的产生来自静态链接的局限性。随着静态链接的发展&#xff0c;其限制也越来越…

十二、创建和管理表

文章目录一、基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 数据类型及数据库操作二、创建表三、查看表结构3.1 使用 SHOW COLUMNS 语句查看3.2 使用 DESCRIBE 语句查看3.3 查看表详细结构语句 SHOW CREATE TABLE四、修改表结构4.1 添加新字段和修改字段定义4.2 修改字…

用户画像增量更新系列二

进行用户日志数据处理 原始日志数据 结果: 思路&#xff1a;按照user_id的行为一条条处理&#xff0c;根据用户的行为类型判别。 由于sqlDF每条数据可能会返回多条结果&#xff0c;我们可以使用rdd.flatMap函数或者yield 格式&#xff1a;["user_id", "action…

总结:计算机中字符串比较大小的规则

总结&#xff1a;计算机中字符串比较大小的规则一背景&#xff1a;二Unicode编码表&#xff1a;字符越靠后&#xff0c;对应的十进制值越大三单个字符之间比较规则&#xff1a;四案例演示&#xff1a;单个字符与单个字符之间比较大小1.前提&#xff1a;汉字“一”与汉字“万”&…

Elasticsearch:Elasticsearch percolate 查询

Elasticsearch 通常如何工作&#xff1f; 我们将文档索引到 Elasticsearch 中并对其运行查询以获得满足提供的搜索条件的文档。 我们构造一个匹配或术语查询作为输入&#xff0c;匹配查询的文档作为结果返回。 但这不是 percolate query 的情况..... 让我们看看这篇文章中的 p…

10.Java方法学习知识点大全

文章目录前言一、什么是方法1.什么是方法?2.实际开发中,什么时候用到方法?3.实际开发中,方法有什么好处?二、最简单的方法定义和调用1.方法的格式2.方法的调用3.看代码说结果4.为什么要有带参数的方法呢?三、带参数的方法定义和调用1.带参数的方法定义和调用2.形参和实参3.…

NuSphere PhpED Pro 19.5 Crack

PhpED是PHP&#xff08;PHP IDE&#xff09;&#xff0c;HTML&#xff0c;CSS&#xff0c;XML&#xff0c;SMARTY&#xff0c;XHTML等的I ntegated Development Environment。 高级代码编辑器、可靠的 dbg 调试器、高效的数据库连接客户端以及快速安全的部署能力的平衡组合使 P…

90. 注意力分数及代码实现

1. 注意力分数 2. 拓展到高维度 3. Additive Attention ps&#xff1a; 这种的好处是&#xff0c;key&#xff0c;value&#xff0c;query的长度可以不一样 4. Scaled Dot-Product Attention n个query&#xff0c;m个key-value 对最后的结果是n x m的矩阵&#xff0c;第i行就表…

LeetCode[684]冗余连接

难度&#xff1a;中等题目&#xff1a;树可以看成是一个连通且 无环 的 无向 图。给定往一棵 n个节点 (节点值 1&#xff5e;n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1到 n中间&#xff0c;且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n的二维数组…