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

news/2024/12/26 11:52:43/

一、新建项目

# 创建工作空间
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})

六、运行效果

服务端:

客户端:


http://www.ppmy.cn/news/1558258.html

相关文章

论文阅读--Variational quantum algorithms

文献类型&#xff1a;期刊论文 作者&#xff1a;M. Cerezo&#xff08;Los Alamos National Laboratory&#xff09; 年份&#xff1a;2021 期刊&#xff1a;Nature 影响因子&#xff1a;44.8 摘要&#xff1a;由于计算成本极高&#xff0c;模拟复杂量子系统或解决大规模线性代…

deepin 安装 zookeeper

deepin 安装 zookeeper 1、升级软件 sudo apt updatesudo apt -y dist-upgrade2、安装常用软件 sudo apt -y install gcc make openssl libssl-dev libpcre3 libpcre3-dev libgd-dev \rsync openssh-server vim man zip unzip net-tools tcpdump lrzsz tar wget3、开启ssh …

工业自动化通信方式解析:串口通信、网口通信与PLC通信

在工业自动化领域&#xff0c;通信是实现设备之间数据交互和控制的关键。常见的通信方式包括串口通信、网口通信和PLC通信。不同的通信方式有其独特的特点、优势和适用场景&#xff0c;本文将对这三种通信方式进行深入解析&#xff0c;帮助您在实际项目中选择合适的通信方式。 …

【UE5 C++课程系列笔记】11——FString、FName、FText的基本使用

目录 概念 常用操作示例 一、FString 1.1 创建字符串 1.2 字符串拼接 1.3 字符串长度 1.4 字符串查找 1.5 字符串替换 1.6 比较字符串 二、FName 2.1 创建FName 2.2 比较FName 2.3 在容器中使用 FName 三、FText 3.1 创建FText 3.2 格式化FText 3.3 显示文本…

【数据分析】层次贝叶斯

文章目录 一、 贝叶斯推理二、 层次贝叶斯模型三、 层次贝叶斯的特点四、 数学表述五、推断方法六、应用领域 层次贝叶斯&#xff08;Hierarchical Bayesian&#xff09;方法是一种基于贝叶斯推理的统计模型&#xff0c;用于处理具有多个层次结构的数据模型。 它允许我们在同一…

如何使用PSQL Tool还原pg数据库(sql格式)

新建一个数据库用来还原&#xff1b;选择新建的数据库&#xff0c;右键选择【PSQL Tool】&#xff0c;打开PSQL Tool命令行界面&#xff1b;赋予pg库对sql文件的执行权限&#xff0c;否则会报“Permission denied”的错误&#xff0c;命令如下&#xff1a; chmod urwx D://NoS…

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…

全国硕士研究生入学考试(考研)备考要点之具体科目

考研备考要点详解&#xff1a;具体科目复习策略与关键建议 在中国&#xff0c;考研&#xff08;研究生入学考试&#xff09;是本科生提升学历、深化专业知识和拓展职业发展的重要途径。考研备考过程中&#xff0c;各科目的复习策略与方法至关重要&#xff0c;直接影响考生的考…