Administrator
发布于 2026-04-06 / 5 阅读
0
0

ros2 service服务

  • 话题:异步流式通信,适合持续发图像、点云、检测结果

  • 服务:同步请求-响应,适合“开关控制”“查询状态”“触发一次动作”

topic 像广播
service 像函数调用
action 像长任务,有进度、有取消
#查看服务列表
ros2 service list
#查看某一个服务
ros2 service list | grep violation

#查看服务类型
ros2 service type /violation_srv 
  #如返回perception_msgs/srv/ViolationTask


查看服务接口:
ros2 interface show perception_msgs/srv/ViolationTask
  #bool switch_on  # 开启或者关闭
  #---
  #bool is_success  # 服务开启成功或者失败
  #string message   # 信息

开启服务
ros2 service call /violation_srv perception_msgs/srv/ViolationTask "{switch_on: true}"
关闭服务
ros2 service call /violation_srv perception_msgs/srv/ViolationTask "{switch_on: false}"

执行过程:

1.节点启动时调用 setupServiceCallback(),把 /violation_srv 注册到 ROS 图里;

2.rclcpp::spin()循环执行接收请求;

3.另一个节点或命令行工具作为客户端,向 /violation_srv 发请求;

4.执行服务的回调函数;在回调里读取request,写入response;

5.ROS2再把response发回客户端;

    MultiTaskPerceptionNode::MultiTaskPerceptionNode()
        : Node("multi_task_perception_node"),
        sensor_data_queue_(2, QueueOverflowPolicy::DROP_OLD)
    {
        initializeParams();
        advertiseTopics();
        subscribeTopics();
        setupServiceCallback();
        startProcessingThread();
        spdlog::info("MultiTaskPerceptionNode initialized");
    }


    void MultiTaskPerceptionNode::setupServiceCallback(){
        violation_task_srv_ = this->create_service<perception_msgs::srv::ViolationTask>("/violation_srv", 
            std::bind(&MultiTaskPerceptionNode::violationServiceCallback, this, std::placeholders::_1, std::placeholders::_2),
            rmw_qos_profile_services_default);
    }


评论