ROS之service传输图片

别再只用话题了!ROS服务(Service)实战:从WordCount服务到真实机器人任务调度 本文深入探讨了ROS服务(Service)在机器人开发中的实战应用,从基础的WordCount服务到复杂的机器人任务调度系统。通过对比话题(Topic)通信机制,详细解析了服务的同步RPC特性及其在离散任务触发、状态查询等场景的优势,并提供了相机服务、任务调度等实际案例的完整实现方案。 阅读详情

之前一直用Topic来进行图片的传输,近期由于项目需要,需要用service进行图片的传输,查了不少博客很少有详细的解释,故写博客记录一下方便后续查询,也为了帮助大家。

topic和service对于图片的传输格式是一样的,只不过两者的通信方式不一样。

在此只介绍源码的编写,对于如何创建service工作空间,如何编译在我的上一篇博客中有详细的介绍。

srv文件

img.srv

sensor_msgs/Image image    // 图像转换到sensor_msgs/Image格式进行传输
---
string a
string b

C++版本

ros和opencv之间图片如何传输详见:Converting between ROS images and OpenCV images (C++)

客户端程序

client_img.cpp

#include <ros/ros.h>
#include <opencv2/opencv.hpp>
#include <cv_bridge/cv_bridge.h>
#include "learn_service/img.h"

int main(int argc, char** argv)
{
	ros::init(argc, argv, "client_img");
	ros::NodeHandle node;

    // 发现/cam服务后,创建一个服务客户端,连接名为/service_img的service
	ros::service::waitForService("/cam");
	ros::ServiceClient img_client = node.serviceClient<learn_service::img>("/cam");

	//读取图片
	cv::Mat image = cv::imread("../data/6.png");
	sensor_msgs::ImagePtr image_srv = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();  //图片转换成消息格式进行传输

    // 初始化learn_service::img的请求数据
	learn_service::img srv;

	srv.request.image = *image_srv;

    // 请求服务调用
	img_client .call(srv);

	// TO-DO: 处理服务调用结果

	return 0;
};

服务端程序

server_img.cpp

#include <ros/ros.h>
#include "learn_service/img.h"
#include <opencv2/opencv.hpp>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>

// service回调函数,输入参数req,输出参数res
bool cam_result_callback(learn_service::img::Request  &req,
         		 learn_service::img::Response &res)
{

    cv_bridge::CvImagePtr cv_ptr;
    //图像有消息格式转换成Mat格式
	cv_ptr = cv_bridge::toCvCopy(req.image, sensor_msgs::image_encodings::BGR8);
	cv::imshow("view", cv_ptr->image);
	cv::waitKey(0);

    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "server_img");
    ros::NodeHandle node;

    // 创建一个名为/cam的server,注册回调函数cam_result_callback
    ros::ServiceServer img_service = node.advertiseService("/cam", cam_result_callback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

python版本

ros和opencv之间图片如何传输详见:Converting between ROS images and OpenCV images (Python)

客户端程序

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import rospy
import cv2
from cv_bridge import CvBridge
from sensor_msgs.msg import Image
from learn_service.srv import img, imgRequest

def Img_client():
    # ROS节点初始化
    rospy.init_node('client_img')    
    # 发现/img服务后,创建一个服务客户端,连接名为/img的service
    rospy.wait_for_service('/img')
    bridge = CvBridge()
    #读取图片
    image = cv2.imread('/home/ubuntu/ros_practice/src/learn_service/data/6.png')
    #转换图片为消息格式
    image_message = bridge.cv2_to_imgmsg(image, "bgr8")

    # try:
    img_client = rospy.ServiceProxy('/img', img)
    # 请求服务调用,输入请求数据
    response = img_client(image_message)
    return response.a
	
    # except rospy.ServiceException, e:
    #     print "Service call failed: %s"%e

if __name__ == "__main__":
	#服务调用并显示调用结果
    Img_client()

服务端程序

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import rospy
import cv2
from learn_service.srv import img, imgResponse
from cv_bridge import CvBridge
from sensor_msgs.msg import Image

def ImgCallback(req):
    bridge = CvBridge()
    cv_image = bridge.imgmsg_to_cv2(req.image, "bgr8")
    cv2.imshow("view", cv_image)
    cv2.waitKey(0)
	# 反馈数据
    #return imgResponse("OK1", "OK2")

def img_server():
	# ROS节点初始化
    rospy.init_node('server_img')

	# 创建一个名为/show_person的server,注册回调函数personCallback
    s = rospy.Service('/img', img, ImgCallback)

	# 循环等待回调函数
    print("Ready to show img informtion")
    rospy.spin()

if __name__ == "__main__":
    img_server()
go连接ROS2,实现发布和订阅自定义消息,发布service服务的功能 ROS2 的标准消息类型(如)仅支持基础数据格式,因此我们定义CustomData结构体封装业务数据(检测结果Detect+ 图片字节Pic),并实现序列化 / 反序列化方法,确保数据能在 ROS2 话题中传输。// CustomData 自定义ROS2消息结构Detect []byte `json:"detect"` // 检测结果(JSON字符串字节)Pic []byte `json:"pic"` // 图片字节数据。 阅读详情

相关推荐

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 206

通过ROS2服务通信完成图片传输功能(C++和python代码都有)然后再使用python调用YOLOV8模型识别图片后传输

记录一下如何通过服务通信完成图像处理

baidu_40624101的博客 4163

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5674

ROS高效图传的一些方法

原链接图传是大家经常会遇到的一个问题,ROS中图传的方法也有很多。下面就总结一下常用到的方法。1.设置ROS_MASTER_URI的方式 通过设置ROS_MASTER_URI,我们能够直接和远程主机进行通信。这样只要在远程端发出 image topic 然后在本地订阅这个 topic 就可以显示了。下面是一个具体例子 假设远程端已经有一个image topic 名称为 /camera_node/

bluewhalerobot的博客 6063

MATLAB 2026最新版免费下载安装教程:许可证激活与报错排查

科学计算与仿真在工程实践中扮演着核心角色,MATLAB 作为业界标准平台,凭借矩阵运算、数据可视化和 Simulink 仿真能力,成为高校课程设计与科研实验中的高频工具。理解其许可证机制是正确安装与持续使用的关键:官方提供试用版、学生版、家庭版及校园许可证等多种合法获取途径,安装包由引导器、工具箱文件与授权信息组成。掌握从下载到激活的完整流程,并根据操作系统进行环境配置与工具组件选装,不仅能规避安全风险,还能显著提升工程效率。针对安装过程中常见的许可证校验失败或工具箱不可用等问题,提供系统化排查思路与命令行

weixin_30702441的博客 2459

深度排查:网讯网卡WX1860AL4千兆网口降速百兆的硬件陷阱

本文详细剖析了网讯网卡WX1860AL4千兆网口降速至百兆的硬件故障排查过程。通过分析千兆以太网硬件原理,提供从网线、供电到PCB走线、焊接残留的标准化检修流程,并分享两种典型硬件陷阱(线序错误与焊锡短路)的实战修复案例,为硬件工程师解决类似传输速率问题提供系统性的诊断思路与方法。

a3b4c5的博客 1109

在ROS中传递图像消息(一)

最近在学习如何在ROS中传递图像,在这里将自己的拙见与大家分享,希望大家多多指教。如果有错误的地方,希望各位大神不吝赐教。

退休码农飞伯德 2万+

别再到处搜了!高德地图瓦片URL参数(lang、style、ltype)全解析与实战搭配指南

本文全面解析高德地图瓦片URL参数(lang、style、ltype)的核心逻辑与实战应用,提供18种实用参数组合方案,帮助开发者实现从基础到高阶的定制化地图渲染。涵盖语言控制、地图样式、图层类型等关键参数,并分享WebGIS项目中的优化技巧与常见问题解决方案。

weixin_33724046的博客 117

ROS 定义复杂服务消息类型并传递图像

作业:ROS 定义复杂服务消息类型并传递图像

weixin_63181292的博客 834

5分钟搞定PettingZoo多智能体环境搭建:从安装到运行第一个Demo

本文详细介绍了如何在5分钟内完成PettingZoo多智能体环境的搭建,从安装到运行第一个Demo。通过精准的版本控制和常见问题解决方案,帮助开发者快速上手多智能体强化学习(MARL)环境配置,并提供了实战案例和性能优化技巧。

backprop5master的博客 221

26届数字IC秋招笔试面试全攻略-ASIC设计流程全解析

本文系统介绍了ASIC芯片设计的全流程。前端设计包括规格制定、架构设计、RTL编码和功能验证;后端设计完成物理实现,涵盖布局规划、时钟树综合、布线和物理验证等步骤;Tapeout阶段完成制造数据准备和交付。文章详细说明了各阶段的关键任务、验证方法和设计指标,并列举了典型工具链,为ASIC设计提供了全面的流程指导。通过严格的检查清单和验证步骤,确保芯片设计符合制造要求和性能目标。

2301_79143213的博客 365

ROS 服务Server

ROS 服务

TTTTTTTTTSS的博客 2068

Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

Vue-高效简洁列表拖曳排序/鼠标拖动改变顺序排列组件支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无BUG列表拖曳排序插件vuedraggable拉动拽动拖动顺序改变排序js,vue.js,nuxt.js列表如何实现鼠标拖曳改变顺序排列支持滚动条内复杂数据对象带拖动效果动画排序完毕自动排列数组位置克隆Vue.Draggable官方文档教程SortableJS与vuedraggable列表拖动排序Vue拖拽组件库vuedraggable的安装与使用用户用鼠标拖动排序功能源码最好

🏆 前端领域优质创作者 4847

【ROS2】 核心概念5——服务(service)

话题和服务是ROS中最为常用的两种数据通信方法, 话题(topic)适合传感器、控制指令等周期性、单向传输的数据 服务(service)适合一问一答,同步性要求更高,比如获取机器视觉识别到的目标位置

进一寸有一寸的欢喜 1373

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ROS service in roscpp 通信 (简介+实例+测试)

service in roscpp1、service通信简介2、service demo 实例(1)创建service_demo package(2)创建.srv文件(3)创建服务 提供节点 server.cpp(4)创建服务请求节点(client.cpp) 1、service通信简介 topic是ROS中的一种单向的异步通信方式。Service是一种请求-反馈的通信机制。请求的一方通常被称为客...

月照银海似蛟龙的博客 1958

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

rosbridge_suit、roslibpy 源码阅读与简单测试 —— 图片编解码与传输

Title: rosbridge_suit、roslibpy 简单源码阅读与测试 —— 图片编解码与传输。

Robotics_Notes 1199

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ROS基础操作

本文涵盖了ros操作系统的大部分基础操作,适合想要学习ros的新手阅读。

Edith Cai的博客 1568

ROS2话题、服务、动作通讯

介绍了如何在工作空间中,创建包,并在包中创建一个或多个可执行程序,程序里定义了单个或多个节点类对象,以便可执行程序运行起来的时候,类对象能够执行动作,干一些事情。那多个可执行程序运行起来时,他们之间靠什么来通讯呢,常规是走tcp/ip通讯、共享内存等其它,但在ROS2中,已定定义了一些现成的方式,封装好了三种标准通信方式:话题,服务,动作通讯。注:话题,服务,动作通讯其实是在填充节点对象的功能,后面的节点对象就不再像前面博客演示那样,只打印几句话而已。为什么要有动作,它和话题,服务的区别是什么?

jiugeshao的专栏 339

ROS 服务(Service)机制与自定义服务

创建服务文件:在功能包中创建srv文件夹,新建.srv文件。编写服务定义:定义请求和响应部分。配置:添加和依赖。配置调用包含。使用声明 srv 文件。调用生成代码。在中加入。添加可执行文件(服务端和客户端)并链接库。编译生成。编写服务端与客户端节点代码。运行测试。服务是 ROS 中实现同步双向通信的机制,适用于请求-响应模式。服务定义文件(.srv)使用---分隔请求和响应。查看服务使用等命令。自定义服务流程类似于自定义消息,需配置和,并生成代码。服务端通过。

weixin_42019995的博客 362

ROS 入门教程笔记

ROS 入门教程笔记

W1H1J1的博客 583

ROS 运行时简介

学习了下ROS,简单总结下。 其他博文见ROS系列 本文记录ROS逻辑视图。 ROS采用分布式设计思想,以节点为单位运行和处理数据。简要思想如上图: 服务器:物理服务器 Node :运行节点,每个节点是一个可执行文件 roscore : 一种节点 是ROS系统在本机的信息处理中枢,所有ROS消息都经由本机的 roscore 转发 每个物理服务器必须启动并保持其运行 NodeHandle :ROS提供的类,节点的句柄,作为服务或话题的载体 ROS通过此类处理不同节点间的交互 销毁时自动回收资源

LaineGates的专栏 373

《动手学ROS2》4.5ROS2通信接口介绍

本系列教程作者:小鱼 公众号:鱼香ROS QQ交流群:139707339 教学视频地址:小鱼的B站 完整文档地址:鱼香ROS官网 版权声明:如非允许禁止转载与商业用途。 4.3 ROS2接口介绍 本节小鱼将会带你认识一个新的概念,叫做interface,即接口。 1.什么是接口 接口其实是一种规范 你还记得前面几节的示例中,李四和王二分别使用了下面两种数据类型来传递小说和钱,这两种数据类型分别代表字符串和32位二进制的整型数据。 std_msgs/msg/String std_msgs/msg/UIn.

生活不止眼前的苟且 3852

ROS2入门介绍

多个模块(感知/算法/控制)之间如何高效通信 + 解耦协作。

xiangxiang2017的博客 260

ros入门教程(四)-- 通信架构(下)

文章目录通信方式(接上)ServiceTopic VS Servicesrv注意常用命令Parameter Server在命令行中的操作在launch文件中的操作在API修改Actionaction举例 本节沿上节继续介绍通信架构方面的内容 通信方式(接上) Service 之前所说的topic是采用发布订阅的方式,但有些时候这种单向的消息传输不能满足我们的需求。 ROS中的同步通信方式,Node...

动次打次动次打次 523

ROS基础

ROS 学习笔记

Ray Home 355
上一篇: opencv之图像二值化处理
下一篇: 解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22‘ not found
xp_fangfei
博客等级 码龄11年 3535粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xp_fangfei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值