当前位置: 首页 > 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})

六、运行效果

服务端:

客户端:

http://www.lryc.cn/news/509759.html

相关文章:

  • 碰撞检测算法之闵可夫斯基差集法(Minkowski Difference)
  • 【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能剖析
  • 2008-2020年各省技术服务水平相关指标数据
  • 机器学习DAY4续:梯度提升与 XGBoost (完)
  • ML-Agents:训练配置文件(一)
  • 【物联网技术与应用】 实验13:雨滴传感器实验
  • 帝国cms电脑pc站url跳转到手机站url的方法
  • Django models中的增删改查与MySQL SQL的对应关系
  • 双指针——快乐数
  • Docker 默认安装位置迁移
  • jmeter跨进程实现变量共享-全局变量
  • Vue.js组件(6):echarts组件
  • yolov3算法及其改进
  • Python + 深度学习从 0 到 1(02 / 99)
  • HTML+CSS+JS制作在线书城网站(内附源码,含5个页面)
  • 【FastAPI】中间件
  • 5个实用的设计相关的AI网站
  • STL 六大组件
  • Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
  • Python实现机器学习驱动的智能医疗预测模型系统的示例代码框架
  • AWS Certified AI Practitioner 自学考试心得
  • JQ中的each()方法与$.each()函数的使用区别
  • 滚珠丝杆与直线导轨的区别
  • 【Ovis】Ovis1.6的本地部署及推理
  • C语言结构体位定义(位段)的实际作用深入分析
  • 儿童影楼管理系统:基于SSM的创新设计与功能实现
  • 青蛇人工智能学家
  • uniapp+vue 前端防多次点击表单,防误触多次请求方法。
  • 【ES6复习笔记】rest参数(7)
  • Hive SQL 窗口函数 `ROW_NUMBER() ` 案例分析