【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.有限状态机 的相关文章

  • gazebo通过sdf搭建仿真环境和机器人Husky

    具体格式要求可参考 http sdformat org spec ver 1 6 elem sdf
  • ROS系统基本功能的使用详解(基本指令/节点/服务/启动文件/动态参数)

    ROS系统基本功能的使用详解 一 创建工作空间 二 创建与编译ROS功能包 三 ROS的基本命令 3 1 节点 3 2 主题 3 3 服务 3 4 参数服务器 四 节点的创建与运行 4 1 创建源文件 4 2 修改CMakeLists tx
  • ROS中使用VLP16激光雷达获取点云数据

    ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为 Ubuntu20 04 ROS Noetic 需要将激光雷达与PC连接 然后在设置 gt 网络 gt 有线中将IPv4改为手动 并且地址为192 168 1 100
  • 思岚RPLIDAR A2 在ubuntu 16.04上的测试

    1 下载雷达ROS包 首先在github上下载rplidar的ros包 下载指令为 默认安装了git git clone https github com Slamtec rplidar ros git 在ubuntu上创建工作空间 并将该
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • GG-CNN代码学习

    文章目录 1 源码网址 https github com dougsm ggcnn 2 数据集格式转化 下载后的康奈尔数据集 解压完之后里面的格式 里面的 tiff图像通过 txt文件转化得到 python m utils dataset
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • ROS rosdep update 出错方法 不需要翻墙切换之类的解决方法 ‘https://raw.githubusercontent.com/ros/rosdistro/master/inde

    系统 ubuntu18 rosdep update参考的这篇文章 https blog csdn net weixin 43311920 article details 114796748 utm source app app versio
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • Ubuntu18.04配置Seetaface6

    目录 一 下载安装Qt软件 1 安装包下载 2 安装Qt 3 配置 二 下载源码 三 编译工具 四 编译 1 编译OpenRoleZoo 2 编译SeetaAuthorize 3 编译TenniS 五 运行 1 修改lib路径 2 buil
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • verilog之状态机详细解释(二)

    一 有限状态机设计的一般步骤 1 逻辑抽象 得出状态转换图 就是把给出的一个实际逻辑关系表示为时序逻辑函数 可以用状态转换表来描述 也可以用状态转换图来描述 这就需要 分析给定的逻辑问题 确定输入变量 输出变量以及电路的状态数 通常是取原因
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 服务数据的定义和使用

    1 自定义数据服务 在包下创建srv文件夹 在文件夹下创建Person srv 在Person srv下输入以下内容 代表数据类型 string name uint8 age uint8 sex uint8 unknown 0 uint8
  • 【ROS】usb_cam相机标定

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

    这是我的 Dockerfile FROM ros kinetic ros core xenial CMD bash 如果我跑docker build t ros docker run it ros 然后从容器内echo PATH 我去拿 o
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • catkin_make后找不到ROS包

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新

随机推荐

  • 【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