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

ops/2024/12/25 15:18:11/

一、新建项目

# 创建工作空间
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/ops/144877.html

相关文章

关于redis锁的简单实现

新建RedisLock类。 public class RedisLock implements Serializable {private static final long serialVersionUID 3077854413624876404L;private static final Log LOG LogFactory.get(RedisLock.class);/*** 锁标志对应的key*/private String lockKey;/*** 将key 的值设…

Android Studio打开一个外部的Android app程序

背景描述&#xff1a; 由于Android Studio环境的差异&#xff0c;从网上或者Git下载的一个Android开源项目&#xff0c;用自己的Android Studio加载打开时经常遇到各种问题。那么&#xff0c;有没有什么方法或者步骤可以快速的将一个已存在的android项目导入到自己的Android S…

云手机方案总结

精准把握账号基础设置 1.环境配置要合规真实&#xff1a;无论是在哪个国家或地区开展 TikTok 营销&#xff0c;都要确保云手机的网络环境、语言、时区、GPS 定位等设置与当地实际相符&#xff0c;选择稳定可靠的海外 IP 服务提供商&#xff0c;配置纯净独立的 IP&#xff0c;避…

【算法】一维二维数组前缀和,以及计算二维矩阵中的子矩阵和

前缀和的概念 通过构建一个前缀和数组&#xff0c;我们可以在常数时间&#xff08;O(1)&#xff09;内使用前缀和数组计算任意子数组或子矩阵的和。 简单来说&#xff0c;就是把前面的项加在一起&#xff0c;使得新构建的前缀和数组中每一项都是原数组对应项之前的总和。 一…

Java文字识别OCR API-手写文字识别-生僻字识别-应用场景

在信息爆炸的今天&#xff0c;数据如同氧气一般渗透到生活的每一个角落。而如何高效地获取、处理和利用这些海量的数据&#xff0c;则成为了推动社会进步的关键因素之一。文字识别&#xff08;OCR, Optical Character Recognition&#xff09;接口技术的出现&#xff0c;就像一…

【HTML】动态闪烁圣诞树+雪花+音效

效果展示 使用方法&#xff1a; 1、桌面新建文本文档.txt 2、下述代码复制至文本文档中 3、修改t后缀txt修改为html 4、双击点开 完整代码自取 <!DOCTYPE html> <html lang"en" ><head><meta charset"UTF-8"><title>M…

无人设备遥控器之定向天线篇

一、定义与功能 定向天线&#xff0c;顾名思义&#xff0c;是通过改变天线的辐射方向&#xff0c;实现信号发射、接收和增强的天线。它可以让信号以更高的功率、更远的距离传输到指定区域&#xff0c;同时也能够降低与周围天线之间的干扰。在无人设备遥控器中&#xff0c;定向天…

Linux Shell 基础教程⑧

Shell 教程 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Ke…