当前位置: 首页 > news >正文

ROS1入门教程6:复杂行为处理

一、新建项目

# 创建工作空间
mkdir -p demo6/src && cd demo6# 创建功能包
catkin_create_pkg demo roscpp rosmsg actionlib_msgs message_generation tf

二、创建行为

# 创建行为文件夹
mkdir action && cd action# 创建行为文件
vim Move.action# 定义行为
uint32 goal
---
uint32 result
---
uint32 feedback

三、创建服务端

#include <iostream>
#include <thread>
#include <atomic>#include "ros/ros.h"
#include "actionlib/server/action_server.h"
#include "demo/MoveAction.h"std::atomic<bool> g_isCanceled{false};void done_cb(actionlib::ServerGoalHandle<demo::MoveAction> goalHandle) {ROS_INFO("==> done_cb");if (goalHandle.getGoal()->destination > 100) {goalHandle.setRejected(); // 拒绝请求return;}goalHandle.setAccepted(); // 同意请求ros::Rate rate(1);uint32_t distance = 0;while (ros::ok() && distance < goalHandle.getGoal()->destination) {if (g_isCanceled) {goalHandle.setCanceled(); // 取消任务return;}demo::MoveFeedback feedback;feedback.distance = distance;goalHandle.publishFeedback(feedback);ROS_INFO("==> distance: %d", distance);rate.sleep();++distance;}demo::MoveResult result;result.result = distance;goalHandle.setSucceeded(result); // 执行成功
}void goal_cb(actionlib::ServerGoalHandle<demo::MoveAction> goalHandle) {ROS_INFO("==> goal_cb, goal: %d", goalHandle.getGoal()->destination);g_isCanceled = false;std::thread t(done_cb, goalHandle);t.detach();
}void cancel_cb(actionlib::ServerGoalHandle<demo::MoveAction> goalHandle) {ROS_INFO("==> cancel_cb");g_isCanceled = true;
}int main(int argc, char* argv[]) {ros::init(argc, argv, "server");ros::NodeHandle nodeHandle;std::string actionName = "demo6";actionlib::ActionServer<demo::MoveAction> server(nodeHandle,actionName,boost::bind(goal_cb, _1),boost::bind(cancel_cb, _1),false);server.start();ros::spin();return EXIT_SUCCESS;
}

四、创建客户端

#include <iostream>#include "ros/ros.h"
#include "actionlib/client/action_client.h"
#include "demo/MoveAction.h"void transition_cb(actionlib::ClientGoalHandle<demo::MoveAction> goalHandle) {ROS_INFO("==> transition_cb, state: %s", goalHandle.getCommState().toString().c_str());
}void feedback_cb(actionlib::ClientGoalHandle<demo::MoveAction> goalHandle, const demo::MoveFeedbackConstPtr &feedback) {ROS_INFO("==> feedback_cb, distance: %d", feedback->distance);
}int main(int argc, char* argv[]) {ros::init(argc, argv, "client");ros::AsyncSpinner spinner(1);spinner.start();ros::NodeHandle nodeHandle;std::string actionName = "demo6";actionlib::ActionClient<demo::MoveAction> client(nodeHandle, actionName); // 创建行为客户端client.waitForActionServerToStart(); // 等待行为服务器启动demo::MoveGoal goal;goal.destination = 5;// 注意:必须赋值给一个对象,否则会被释放掉const actionlib::ActionClient<demo::MoveAction>::GoalHandle &goalHandle = client.sendGoal( // 发送目标goal,boost::bind(transition_cb, _1),boost::bind(feedback_cb, _1, _2));ros::waitForShutdown();return EXIT_SUCCESS;
}

五、修改编译配置

# 查找catkin库
find_package(catkin REQUIRED COMPONENTSactionlib_msgsmessage_generationroscpprosmsgtf
)# 添加行为文件
add_action_files(FILESMove.action
)# 编译行为文件
generate_messages(DEPENDENCIESactionlib_msgs
)# 添加源文件
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)# 链接catkin库
target_link_libraries(server ${catkin_LIBRARIES})
target_link_libraries(client ${catkin_LIBRARIES})

六、运行效果

服务端:

客户端:

相关文章:

ROS1入门教程6:复杂行为处理

一、新建项目 # 创建工作空间 mkdir -p demo6/src && cd demo6# 创建功能包 catkin_create_pkg demo roscpp rosmsg actionlib_msgs message_generation tf二、创建行为 # 创建行为文件夹 mkdir action && cd action# 创建行为文件 vim Move.action# 定义行为…...

碰撞检测算法之闵可夫斯基差集法(Minkowski Difference)

在游戏开发和机器人路径规划乃至于现在比较火的自动驾驶中&#xff0c;我们常常需要确定两个物体是否发生碰撞&#xff0c;有一种通过闵可夫斯基差集法求是否相交的算法&#xff0c;下面将介绍一下 闵可夫斯基差集法的优势 闵可夫斯基差集法优势&#xff1a; 可以处理复杂的…...

【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析

引言 在数据排序的世界里&#xff0c;选择排序是一类简单而直观的算法&#xff0c;它通过不断选取未排序部分中的最小&#xff08;或最大&#xff09;元素来逐步构建有序序列。今天&#xff0c;我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序&#xff0c;…...

2008-2020年各省技术服务水平相关指标数据

2008-2020年各省技术服务水平相关指标数据 1.时间&#xff1a;2008-2020年 2.指标&#xff1a;行政区划代码、地区、年份、信息传输、软件和信息技术服务业城镇单位就业人员(万人)、软件业务收入(万元)、高技术产品出口额占商品出口额比重&#xff08;%&#xff09; 3.范围&…...

机器学习DAY4续:梯度提升与 XGBoost (完)

本文将通过 XGBoost 框架来实现回归、分类和排序任务&#xff0c;帮助理解和掌握使用 XGBoost 解决实际问题的能力。我们将从基本的数据处理开始&#xff0c;逐步深入到模型训练、评估以及预测。最后&#xff0c;将模型进行保存和加载训练好的模型。 知识点 回归任务分类任务…...

ML-Agents:训练配置文件(一)

注&#xff1a;本文章为官方文档翻译&#xff0c;如有侵权行为请联系作者删除 Training Configuration File - Unity ML-Agents Toolkit–原文链接 常见训练器配置 关于训练&#xff0c;您需要做出的首要决定之一是使用哪种训练器&#xff1a;PPO、SAC 还是 POCA。有些训练配置…...

【物联网技术与应用】 实验13:雨滴传感器实验

实验13 雨滴传感器实验 【实验介绍】 雨滴传感器或雨滴检测传感器用于检测是否下雨以及降雨。广泛应用于汽车的雨刷系统、智能照明系统和天窗系统。 【实验组件】 ● Arduino Uno主板* 1 ● USB数据线*1 ● 雨滴传感器* 1 ● 雨滴传感器调理板* 1 ● 面包板*1 ● 9V方型…...

帝国cms电脑pc站url跳转到手机站url的方法

本文讲解一下帝国cms电脑网站跳转到手机动态网站和手机静态网站的方法,笔者以古诗词网 www.gushichi.com为例&#xff0c;为大家介绍操作步骤。方法一&#xff1a;帝国pc站跳转到手机静态站 1、假设我们有帝国cms 电脑网站www.XXX.com&#xff0c;手机网站m.XXX.com &#xf…...

Django models中的增删改查与MySQL SQL的对应关系

在 Django 中&#xff0c;models 提供了一种高层次的抽象来与数据库进行交互&#xff0c;使得开发者可以使用 Python 代码而非直接编写 SQL 来执行增删改查&#xff08;CRUD&#xff09;操作。下面将详细介绍 Django 的 ORM&#xff08;对象关系映射&#xff09;操作如何对应到…...

双指针——快乐数

一.题目描述 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 我们要判断一个数是不是快乐数要通过它的三个性质来进行判断。这个数会一直变化&#xff0c;由它的各个位的平方和重新构成这个数。如果这个数在变化的过程中变成了1&#xff0c;那么就是快乐数…...

Docker 默认安装位置迁移

一、找到 Docker 默认安装位置 [roothost-192-168-0-1 ~]# docker info Client:Version: 26.1.0Context: defaultDebug Mode: falseServer:Containers: 31Running: 31Paused: 0Stopped: 0Images: 128Server Version: 26.1.0Storage Driver: overlay2Backing Filesystem:…...

jmeter跨进程实现变量共享-全局变量

jmeter跨进程实现变量共享-全局变量 例如&#xff1a;登录一次&#xff0c;后面业务进行多线程并发场景 新增一个setUp线程组&#xff0c;在setUp线程组下&#xff0c;添加登录接口 使用json提取器&#xff0c;提取token Authorization $.token 0添加BeanShell 后置处理程序…...

Vue.js组件(6):echarts组件

1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网&#xff1a;Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性&#xff1a;chartId&#xff0c;指定图表挂载div的id&#xff0c;注意不…...

yolov3算法及其改进

yolov3算法及其改进 1、yolov3简介2、yolov3的改进2.1、backbone的改进2.1.1、darknet19相对于vgg16有更少的参数,同时具有更快的速度和更高的精度2.1.2、resnet101和darknet53,同样具有残差结构,精度也类似,但是darknet具有更高的速度2.2、FPN2.3、anchor-base与grid-cell…...

Python + 深度学习从 0 到 1(02 / 99)

希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持&#xff01; ⭐ 手写数字分类: Keras MNIST 数据集 手写数字分类…...

HTML+CSS+JS制作在线书城网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个在线书城网站&#xff0c;包含首页、分类页、排行榜页、新书上架页、特惠专区页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部导航栏 包含网站Logo、搜索框、用户登录/注册入口、购物车图…...

【FastAPI】中间件

【FastAPI】中间件 一、概述二、作用2.1 日志记录与监控2.2 身份验证与授权2.3 CORS&#xff08;跨域资源共享&#xff09;2.4 Gzip压缩2.5 会话管理2.6 自定义功能2.7 执行顺序 三、 总结四、相关链接 一、概述 FastAPI的中间件提供了一种强大的机制&#xff0c;允许开发者在…...

5个实用的设计相关的AI网站

在这个日新月异的数字时代&#xff0c;我们不断面临着新的挑战和机遇。随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的AI工具开始融入到设计相关的工作流程中&#xff0c;极大地提升了工作效率和创作能力。今天&#xff0c;我非常兴奋地向大家介…...

STL 六大组件

C STL&#xff08;标准模板库&#xff09;主要由六大组件构成&#xff0c;它们相互协作&#xff0c;为C程序员提供了功能强大且高效的通用数据结构和算法工具&#xff0c;以下是对这六大组件的详细介绍&#xff1a; 1. 容器&#xff08;Containers&#xff09; 概述&#xff…...

Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验

一、引言 随着人工智能技术的不断进步&#xff0c;传统的教学方式已经逐渐向智能化、互动化转变。在众多英语测试题型中&#xff0c;选择题作为一种高效的方式被广泛应用于各类培训与考试中。为了帮助学生高效学习与自测&#xff0c;本篇文章将采用Python编写一款基于 Python …...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...