话题:异步流式通信,适合持续发图像、点云、检测结果
服务:同步请求-响应,适合“开关控制”“查询状态”“触发一次动作”
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);
}