ROS1入门教程5:简单行为处理

一、新建项目

bash 复制代码
# 创建工作空间
mkdir -p demo5/src && cd demo5

# 初始化工作空间
catkin_make

# 创建功能包
cd src
catkin_create_pkg demo roscpp actionlib_msgs message_generation tf

二、创建行为

bash 复制代码
# 创建行为目录
mkdir action && cd action

# 创建行为文件
vim Move.action

# 定义行为内容
uint32 destination
---
bool arrived
---
uint32 distance

三、修改编译配置

bash 复制代码
# 添加行为文件
add_action_files(
  FILES
  Move.action
)

# 生成消息文件
generate_messages(
  DEPENDENCIES
  std_msgs
  actionlib_msgs
)

# 添加源文件
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)

# 添加依赖
add_dependencies(server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp)

# 链接catkin库
target_link_libraries(server ${catkin_LIBRARIES})
target_link_libraries(client ${catkin_LIBRARIES})

四、创建行为服务端

cpp 复制代码
#include <iostream>

#include "ros/ros.h"
#include "actionlib/server/simple_action_server.h"
#include "demo/MoveAction.h"

void ActionCallback(const demo::MoveGoalConstPtr &goal, actionlib::SimpleActionServer<demo::MoveAction> *server) {
    if (goal.get() != nullptr) {
        uint32_t destination = goal.get()->destination;
        ROS_INFO("destination: %d", destination);
        ros::Rate rate(1);
        for (uint32_t distance = 0; distance < destination; ++distance) {
            demo::MoveFeedback feedback;
            feedback.distance = distance;
            server->publishFeedback(feedback);
            rate.sleep();
        }
        demo::MoveResult result;
        result.arrived = destination;
        server->setSucceeded(result);
    }
}

int main(int argc, char* argv[]) {
    std::string nodeName = "Server";
    ros::init(argc, argv, nodeName);
    ros::NodeHandle nodeHandle;
    std::string actionName = "move";
    actionlib::SimpleActionServer<demo::MoveAction> actionServer(nodeHandle, actionName, boost::bind(&ActionCallback, _1, &actionServer), false);
    actionServer.start();
    ros::spin();

    return EXIT_SUCCESS;
}

五、创建行为客户端

cpp 复制代码
#include <iostream>

#include "ros/ros.h"
#include "actionlib/client/simple_action_client.h"
#include "demo/MoveAction.h"

void doneCallback(const actionlib::SimpleClientGoalState &state, const demo::MoveResultConstPtr &result, actionlib::SimpleActionClient<demo::MoveAction> *client) {
    ROS_INFO("MoveAction state: %s", state.toString().c_str());
    if (state == state.SUCCEEDED) {
        ros::shutdown();
    }
}

void activeCallback() {
    ROS_INFO("MoveAction active!!!");
}

void feedbackCallback(const demo::MoveFeedbackConstPtr &feedback) {
    ROS_INFO("MoveAction feedback: %d", feedback.get()->distance);
}

int main(int argc, char* argv[]) {
    std::string nodeName = "Client";
    ros::init(argc, argv, nodeName);
    ros::NodeHandle nodeHandle;
    std::string actionName = "move";
    actionlib::SimpleActionClient<demo::MoveAction> &&actionClient = actionlib::SimpleActionClient<demo::MoveAction>(nodeHandle, actionName);
    actionClient.waitForServer();
    demo::MoveGoal goal;
    goal.destination = 5;
    actionClient.sendGoal(goal, boost::bind(&doneCallback, _1, _2, &actionClient), boost::bind(&activeCallback), boost::bind(&feedbackCallback, _1));
    ros::spin();

    return EXIT_SUCCESS;
}
相关推荐
火车站卖橘子3 天前
Mac搭建ROS初始环境
ros
M-Robots echo3 天前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
M-Robots echo4 天前
安全机制架构解析:M-Robots 分层安全体系,筑牢机器人设备运行底座
机器人·ros·鸿蒙·开源社区·m-robots
M-Robots echo5 天前
驱动抽象层解析:标准化硬件接口,解决机器人硬件碎片化适配难题
人工智能·机器人·ros·开源社区·m-robots
M-Robots echo5 天前
M-CLAW,面向具身智能的机器人任务编排开发框架
机器人·ros·鸿蒙·开源社区·m-robots
M-Robots echo5 天前
王成录:机器人产业下一个十年,拼的是 “系统级智能化” 而非单点算法堆叠
机器人·ros·鸿蒙·开源社区·m-robots·王成录
M-Robots echo5 天前
M-Robots ROS 兼容适配方案,实现存量机器人项目低成本迁移
机器人·ros·鸿蒙·开源社区·m-robots
M-Robots echo7 天前
王成录:黑客松不只是赛事,是开源机器人生态快速试错、挖掘创新的试验场
机器人·ros·鸿蒙·具身智能·开源社区·m-robots
M-Robots echo9 天前
王成录:分布式软总线是 M-Robots 实现群体智能的技术内核
机器人·ros·鸿蒙·开源社区·m-robots
kobesdu21 天前
激光雷达运动畸变是怎么来的,FAST-LIO又如何用IMU反向传播消除它?
ros·slam·fastlio