【ros】8.有限状态机

2023-05-16

心口如一,犹不失为光明磊落丈夫之行也。——梁启超

文章目录

    • :smirk:1. 有限状态机认识
    • :blush:2. 一个简单的示例
    • :satisfied:3. 自动驾驶如何用有限状态机

😏1. 有限状态机认识

有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述某些系统或过程在不同状态下的行为和转移规则。它由有限个状态、转移条件和动作组成。

在一个状态机中,系统可以处于一系列可能的状态之一。当系统受到某些输入时,它会根据预定义的转移规则从当前状态转移到下一个状态。这个转移过程可以触发一些动作,例如修改系统内部变量或执行某些操作。

有限状态机被广泛应用于计算机科学领域,例如编译器设计、协议分析、电路设计以及人工智能等方面。它是一种简单但强大的抽象模型,可以帮助我们理解和设计复杂的系统。

😊2. 一个简单的示例

有三个状态:A、B和C。当输入符合状态转换规则时,状态会从当前状态转换到下一个状态。如果输入不符合规则,则保持在当前状态。

示例如下:

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;

// 状态枚举
enum State {
	STATE_A,
	STATE_B,
	STATE_C
};

int main() {
	// 初始化状态为A
	State currentState = STATE_A;
	cout << "当前状态: A" << endl;

	while (true) {
		// 获取输入值
		cout << "请输入下一个字符: ";
		char input;
		cin >> input;

		// 根据当前状态和输入值更新状态
		switch (currentState) {
		case STATE_A:
			if (input == 'a') {
				currentState = STATE_B;
				cout << "当前状态: B" << endl;
			}
			else {
				cout << "无效输入" << endl;
			}
			break;
		case STATE_B:
			if (input == 'b') {
				currentState = STATE_C;
				cout << "当前状态: C" << endl;
			}
			else {
				cout << "无效输入" << endl;
			}
			break;
		case STATE_C:
			if (input == 'c') {
				cout << "结束" << endl;
				return 0;
			}
			else {
				cout << "无效输入" << endl;
			}
			break;
		}
	}

	return 0;
}

😆3. 自动驾驶如何用有限状态机

自动驾驶技术中的决策过程可以使用有限状态机(FSM)来实现。

一个简单的自动驾驶决策FSM的ROS案例,可以包含以下几个状态:

初始状态:这个状态表示车辆在刚开始运行时的状态。在这个状态下,车辆将会等待接收来自传感器的数据。
道路跟踪状态:在这个状态下,车辆会根据传感器获取到的道路信息进行跟踪,确保车辆始终在道路上行驶。
目标检测状态:在这个状态下,车辆将会使用视觉传感器来检测周围的目标,如其他车辆、行人等。
碰撞检测状态:在这个状态下,车辆将会使用雷达或其他传感器来检测前方是否有障碍物,以避免与其他车辆或障碍物碰撞。
停车状态:如果车辆检测到需要停车的情况,它将会进入停车状态,并将车辆停止在安全位置上。
进行决策状态:在这个状态下,车辆将会根据上述状态的信息进行决策,如加速、减速、转向等。
完成状态:当车辆到达目的地或者停车时,它将会进入完成状态。

以上每个状态都有对应的状态转移条件,例如从初始状态到道路跟踪状态,需要传感器检测到道路信息。从道路跟踪状态到目标检测状态,需要传感器检测到目标物体等。

使用ROS可以方便地实现一个FSM,并将其与自动驾驶车辆的其他组件集成起来,从而实现自动驾驶决策过程。

示例如下:

#include <ros/ros.h>
#include <iostream>

enum State {
  INITIAL_STATE,
  TRACKING_STATE,
  DETECTING_STATE,
  COLLISION_STATE,
  PARKING_STATE,
  DECIDING_STATE,
  COMPLETION_STATE
};

State current_state = INITIAL_STATE;

void sensorCallback(const std_msgs::String::ConstPtr& msg)
{
  switch(current_state) {
    case INITIAL_STATE:
      // Wait for sensor data
      ROS_INFO_STREAM("Waiting for sensor data...");
      current_state = TRACKING_STATE;
      break;

    case TRACKING_STATE:
      // Track the road
      ROS_INFO_STREAM("Tracking the road...");
      current_state = DETECTING_STATE;
      break;

    case DETECTING_STATE:
      // Detect targets
      ROS_INFO_STREAM("Detecting targets...");
      current_state = COLLISION_STATE;
      break;

    case COLLISION_STATE:
      // Avoid collision
      ROS_INFO_STREAM("Avoiding collision...");
      current_state = PARKING_STATE;
      break;

    case PARKING_STATE:
      // Park the vehicle
      ROS_INFO_STREAM("Parking the vehicle...");
      current_state = DECIDING_STATE;
      break;

    case DECIDING_STATE:
      // Make a decision based on sensor data
      ROS_INFO_STREAM("Making a decision...");
      current_state = COMPLETION_STATE;
      break;

    case COMPLETION_STATE:
      // Task completed
      ROS_INFO_STREAM("Task completed!");
      break;
    }
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "fsm_node");
  ros::NodeHandle nh;

  // Subscribe to sensor topic
  ros::Subscriber sub = nh.subscribe<std_msgs::String>("sensor_topic", 10, sensorCallback);

  // Spin the node to process callbacks
  ros::spin();

  return 0;
}

以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ros】8.有限状态机 的相关文章

  • ros+arduino学习(六):重构ros_lib库文件

    前言 ros lib是arduino程序和ros连接的库文件 通过使用这些库文件和相关函数 可以在arduino上通过编程使得arduino硬件开ros节点程序 这样arduino硬件就可以与上位机通过话题进行通讯 从而把arduino从传
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • Ubuntu16.04安装ROS Kinetic详细步骤

    文章目录 ROS安装 配置Ubuntu软件仓库 设置sources list 设置密钥 更新Debian软件包索引 安装ROS 初始化 rosdep 环境配置 构建工厂依赖 测试安装 开发环境 ROS安装 ROS Kinetic只支持Wil
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • 解决ros安装 使用roscore命令测试问题

    本人安装教程完成ROS的安装后 在进行测试如图1命令 出现 解决办法输入完命令1后要输入命令2才行 即可测试成功 测试成功的界面如下
  • Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件

    ROS 服务 现在 想象一下你在你的电脑后面 你想从这个服务中获取天气 你 在你身边 被认为是客户端 在线天气服务是服务器 您将能够通过带有 URL 的 HTTP 请求访问服务器 将 HTTP URL 视为 ROS 服务 首先 您的计算机将
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • 无法在 ROS 中使用本地安装的 Protocol Buffer

    我已经安装了协议缓冲区 https developers google com protocol buffers 本地 ROS包的目录结构如下 CMakeLists txt package xml include addressbook p
  • 如何访问 Heroku 中的 docker 容器?

    我已按照此处构建图像的说明进行操作 https devcenter heroku com articles container registry and runtime getting started https devcenter her
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐

  • 【Autoware规控】OpenPlanner规划节点

    文章目录 1 OpenPlanner介绍2 相关代码 1 OpenPlanner介绍 OpenPlanner是Autoware种使用的一种运动规划算法 xff0c 通过对全局路径采样后生成一系列的候选路径 xff0c 结合矢量地图 传感器结
  • 【C++】8.高效编程:Effective C++学习

    Effective C 43 43 改变程序与设计的55个具体做法 文章目录 1 将C 43 43 视为federation of languages xff08 语言联合体 xff09 2 用consts enums 和 inlines取
  • 【Qt web】内嵌CEF制作浏览器

    文章目录 1 CEF介绍2 环境配置3 示例程序 1 CEF介绍 Qt自带QWebEngine模块 xff0c 可以快速实现浏览器 xff0c 但在实际使用中 xff0c 某些AMD显卡电脑运行使用了QWebEngine的qt软件 xff0
  • 【C++】9.web应用:oatpp-web框架入门

    说到web开发 xff0c 大家肯定会想到JS Python xff0c 甚至Java xff0c 但应该不会想到C 43 43 用C 43 43 开发web也不是不行 xff0c 这不 xff0c oatpp就是一个轻量 跨平台 高性能的
  • 【Python】Excel数据上下翻转

    遇到一个问题 xff0c 需要将excel表格的数据上下翻转 xff0c 不是升序或者降序 xff0c 不然就不需要程序来实现了 网上也看了有些插件有这个功能 xff0c 但插件过于老旧 xff0c 下载都有问题 记录一下程序实现的过程 x
  • 【IPOPT】Ubuntu安装IPOPT非线性优化求解器

    IPOPT Interior Point OPTimizer 是一款开源的非线性优化求解器 xff0c 在自动驾驶规控中会用到 xff0c 之前在这里卡了很久 xff0c 现在终于装上了 ipopt文档 xff1a https coin o
  • 使用systemback制作Ubuntu自定义系统镜像和系统备份

    原链接 xff1a https community bwbot org topic 167 运行测试平台 小强ROS机器人 Systemback是一个Ubuntu系统中用于发布自定义系统镜像和系统备份的软件 有时候我们对自己的Ubuntu做
  • orangePi3 TLS tf卡分区、格式化、手动挂载和开机自动挂载

    orangePi3 TLS tf卡分区 格式化 手动挂载和开机自动挂载 适用于所有linux系统 TF卡新建分区 查看磁盘情况 fdisk l root 64 orangepi3 lts fdisk l Disk dev mmcblk0 5
  • 【PyQt】PyQt5开发环境搭建

    PyQt是基于python来开发Qt可视化窗口的简称 xff0c Qt本身是基于C 43 43 开发 xff0c 性能较好 xff0c Qt与Python结合后 xff0c 在Python的支持下可以快速地开发桌面应用程序 文章目录 1 P
  • 【C++】9.GIS应用:开源GIS平台开发入门(MapServer+QGIS+PostGIS+OpenLayers)

    GIS地理信息处理相关 文章目录 1 GIS软件工具2 MapServer服务器3 QGIS桌面软件QGIS加载csv数据 4 PostGIS数据库5 OpenLayers JS 浏览器客户端 1 GIS软件工具 在GIS数据处理时 xff
  • 【C++】6.网络编程:socket实现通信(文字、语音)

    常见的通信方式有文本 语音 xff0c 下面用C 43 43 实现 xff1a 参考 xff1a https blog csdn net Robot hfut article details 102862052 https blog csd
  • 【ros】6.ros激光雷达SLAM(建图定位)

    百行业为先 xff0c 万恶懒为首 梁启超 文章目录 smirk 1 激光SLAM blush 2 二维激光SLAM satisfied 3 三维激光SLAM x1f60f 1 激光SLAM SLAM xff08 同步定位与地图构建 xff
  • 【ros】7.ros导航navigation(定位规划)

    物竞天择 xff0c 优胜劣汰 xff1b 苟不自新 xff0c 何以获存 梁启超 文章目录 smirk 1 ros导航 blush 2 2d导航 satisfied 3 3d导航 x1f60f 1 ros导航 ros机器人有个导航功能 x
  • 【两周年】我的创作纪念日(水)

    机缘 两年前的今天 xff0c 处于离职状态 xff0c 准备去另一个城市工作 xff0c 同时开始学习编程知识 IT技能 xff0c CSDN让我发现了一群热爱学习和分享的小伙伴 xff0c 也萌发了在这里扎根的想法 收获 不知不觉已经两
  • AI模型部署概述

    心口如一 xff0c 犹不失为光明磊落丈夫之行也 梁启超 文章目录 smirk 1 AI模型部署方法 blush 2 AI模型部署框架ONNXNCNNOpenVINOTensorRTMediapipe如何选择 satisfied 3 AI模
  • 【C++】1.语言基础:八股文

    心口如一 xff0c 犹不失为光明磊落丈夫之行也 梁启超 文章目录 smirk 1 语言基础内存分配指针参数传递和引用参数传递四种强制转换面向对象的三大特性并举例 define 和别名 typedef 的区别 blush 2 标准库STL介
  • 【VSLAM】ORB-SLAM3安装部署与运行

    心口如一 xff0c 犹不失为光明磊落丈夫之行也 梁启超 文章目录 smirk 1 ORB SLAM3介绍 blush 2 代码安装部署1 安装ros与opencv2 安装Pangolin作为可视化和用户界面3 安装Eigen3一个开源线性
  • 【Linux运维】ACPI BIOS Error问题解决

    今天帮朋友装个ubuntu系统 xff0c 遇到一个问题记录一下 报错与现象 xff1a ACPI BIOS Error 电脑花屏 解决方法 xff1a 插入启动盘 xff0c 当进入引导界面后 xff0c 键盘输入 e xff0c 编辑L
  • catkin_make的时候发生了什么

    原链接http community bwbot org topic 182 运行测试平台 小强ROS机器人 这是一个比较复杂的问题 xff0c 但是有时候会有莫名其妙的编译错误 xff0c 在找错误的过程中会非常需要了解这个过程 首先说一下
  • 【ros】8.有限状态机

    心口如一 xff0c 犹不失为光明磊落丈夫之行也 梁启超 文章目录 smirk 1 有限状态机认识 blush 2 一个简单的示例 satisfied 3 自动驾驶如何用有限状态机 x1f60f 1 有限状态机认识 有限状态机 xff08