【Ubuntu16.04】ROS · Python · 一个客户端请求两个服务「Client · Server」

项目场景:

在室内服务机器人项目中,需要先通过目标检测获取目标点的位置,之后控制机器人移动到目标点,进而完成后续抓取的任务。因此,通过调用ROS中的client/server 来实现目标检测和机器人移动的任务。
在此,将项目目标检测简化为输入为图片,输出为坐标的过程,将机器人移动简化为输入为坐标,输出为成功的执行结果。其中目标检测和机器人移动为两个服务,主程序为客户端。

实现过程:

1. 创建srv文件

在功能包中创建srv文件夹,在srv文件夹中建立检测和移动服务对应的文件:detect.srv 和 move.srv 。
detect服务的输入为图像,类型为Image。 输出为目标点坐标,类型为int.。detect.srv文件内容如下:

sensor_msgs/Image rgb_image
---
uint16  x
uint16  y

move服务的输入为目标点坐标,类型为int。 输出为执行结果,类型为string.。move.srv文件内容如下:

uint16  x
uint16  y
---
string result

“- - -”在服务的数据结构中是用来分割Request和Response两个部分的数据,可以理解为输入数据和输出数据的划分。

2.修改 CMakeList 文件

在功能包里打开 CMakeList.txt 文件

  1. 在文件开头做如下修改:
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  sensor_msgs
)
find_package(OpenCV REQUIRED)
  1. 在 ## Declare ROS messages, services and actions ## 部分里添加如下代码,来调用刚才创建的srv文件。
add_service_files(
  FILES
  detect.srv
  move.srv
)

generate_messages(
  DEPENDENCIES
  std_msgs
  sensor_msgs
)
  1. 在 ## build ## 部分,做如下修改:
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)
3.修改 package文件

在功能包里打开 package.xml 文件,在文件末尾添加以下两行代码:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

4.添加 service 程序代码:

在功能包中src 文件夹中添加各部分代码,或创建scripts文件夹 单独存放python 文件。src 文件夹中包含:

  • target_detection.py ——目标检测server
  • robot_move.py ——机器人移动server
  • master.py ——主程序client

target_detection.py

#!/usr/bin/env python2
# -*- encoding: utf-8 -*-
import os
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge,CvBridgeError
from robot.srv import detect, detectResponse #robot为功能包名,需要添加检测服务响应的头文件!
import cv2

def detectCallback(req):
	# 提取输入数据
    data = req.rgb_image
	# 图片格式转换
	bridge = CvBridge()
    cv_image = bridge.imgmsg_to_cv2(data, "bgr8")#转换后的待处理的图片
	print("The image is received!")

	#################################目标检测算法#####################################

	#/----------------------输入待检测图片,输出目标位置坐标。--------------------------/

	#################################目标检测算法#####################################
	
	# 反馈数据
	x,y=571,107
    return detectResponse(x,y)

def detect_server():
	# ROS节点初始化
    rospy.init_node('detect_server')
	# 创建一个server,注册回调函数
    s = rospy.Service('/target_detection', detect, detectCallback)
	# 循环等待回调函数
    print "Ready to show image reception result :"
    rospy.spin()

if __name__ == "__main__":
    	detect_server()

robot_move.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import cv2
import rospy
import numpy as np
from std_msgs.msg import Header
from sensor_msgs.msg import Image
from cv_bridge import CvBridge,CvBridgeError
from robot.srv import move, moveResponse #robot为功能包名,需要添加移动服务响应的头文件!
import time

def moveCallback(req):
	# 显示请求数据
    rospy.loginfo("The received position is : x :%d  y:%d", req.x, req.y)

	##################################机器人移动算法#######################################
	
	#/-----------------------输入目标位置坐标,输出执行成功的结果。------------------------/

	##################################机器人移动算法#######################################


	# 反馈数据
    return moveResponse("successful !")

def move_server():
	# ROS节点初始化
   	rospy.init_node('move_server')
	# 创建一个server,注册回调函数
   	s = rospy.Service('/robot_move', move, moveCallback)
	# 循环等待回调函数
    print "Ready to show data reception result :"
   	rospy.spin()

if __name__ == "__main__":
   	 move_server()

master.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import cv2
import rospy
import numpy as np
from std_msgs.msg import Header
from sensor_msgs.msg import Image
from cv_bridge import CvBridge,CvBridgeError
from robot.srv import detect, detectRequest #robot为功能包名,需要添加检测服务请求的头文件!
from robot.srv import move, moveRequest #robot为功能包名,需要添加移动服务请求的头文件!
import time

def detect_client():
	# 发现服务后,创建一个服务客户端,连接service
	rospy.wait_for_service('/target_detection')
	detect_client = rospy.ServiceProxy('/target_detection', detect)

	###########################数据处理/算法部分###############################


	bridge = CvBridge()
	cv_img = cv2.imread('/home/zhy/catkin_ws/src/robot/scripts/test.png')
	img = bridge.cv2_to_imgmsg(cv_img, "bgr8")


	###########################数据处理/算法部分###############################
	
	############请求:输入数据(Image), 响应:输出数据(int,int)###################
	response = detect_client(img)
	rospy.loginfo("the result is : %d, %d", response.x,response.y)

def move_client():
	# 发现服务后,创建一个服务客户端,连接service
	rospy.wait_for_service('/robot_move')
    move_client = rospy.ServiceProxy('/robot_move', move)

	###########################数据处理/算法部分#############################


	###########################数据处理/算法部分#############################
	
	#############请求:输入数据(int,int), 响应:输出数据(string)##############
	response = move_client(571,107)
    rospy.loginfo("the result is : %s", response.result)

if __name__ == "__main__":
	# ROS节点初始化
	rospy.init_node('master_client')
	
	#调用服务
	detect_client()
	move_client()

提示:在放代码文件的目录中需要放入需要处理的图片!

5.编译/运行程序:
  1. 切换到工作空间目录,编译工作空间
cd catkin_ws/
catkin_make

之后会在 / catkin_ws / devel / include 中对应的功能包中生成srv的 .h 文件。
python 文件不需要编译可直接运行,但要先修改python 的权限,选择python文件右键点击选择属性 -> 权限 -> 执行,在方框上打勾,允许作为程序执行文件。如图:
在这里插入图片描述

  1. 启动ROS
roscore
  1. 另外打开三个终端,通过执行以下命令,运行相应的 python 文件
cd catkin_ws/
source devel/setup.bash 
rosrun robot master.py
cd catkin_ws/
source devel/setup.bash 
rosrun robot target_detection.py
cd catkin_ws/
source devel/setup.bash 
rosrun robot robot_move.py

最后运行结果如图所示:

在这里插入图片描述


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Ubuntu 16.04 ROS 安装教程: 1. 首先,打开终端,更新软件包列表: sudo apt-get update 2. 安装 ROS Kinetic: sudo apt-get install ros-kinetic-desktop-full 3. 初始化 ROS: sudo rosdep init rosdep update 4. 设置环境变量: echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc source ~/.bashrc 5. 安装 ROS 工具: sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential 6. 创建工作空间: mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make 7. 设置环境变量: echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc 8. 安装 ROS 包: cd ~/catkin_ws/src git clone https://github.com/ros/ros_tutorials.git cd ~/catkin_ws/ catkin_make 9. 测试安装: roslaunch roscpp_tutorials talker_listener.launch 以上就是 Ubuntu 16.04 ROS 安装教程的全部内容。 ### 回答2: Ubuntu16.04是一款非常流行的开源操作系统,它可以让用户轻松进行各种开发任务。其中ROS是一款非常强大的机器人操作系统,它可以帮助用户在实现机器人的开发、控制、监管等各个方面。在这里,我们将为大家介绍Ubuntu16.04ROS的安装教程。 一、前期准备 在开始配置ROS系统之前,我们需要先做好一些准备工作。首先确保你的Ubuntu已经更新到最新版,这可以通过以下命令来完成。 sudo apt-get update sudo apt-get upgrade 然后我们需要安装ROS的软件源。 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' 接着,我们需要下载ROS的秘钥。 sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116 最后,更新你的软件清单。 sudo apt-get update 二、安装ROS 在上面的准备工作完成之后,我们可以开始安装ROS了。如果你想要安装完整版的ROS系统,那么可以通过以下命令来完成安装。 sudo apt-get install ros-kinetic-desktop-full 在安装过程中,你需要输入一些配置信息,例如ROS的版本号和安装目录等。在完成安装之后,我们需要初始化ROS系统。 sudo rosdep init rosdep update echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc source ~/.bashrc 三、创建工作空间 接下来,我们需要创建一个ROS的工作空间。这个工作空间是用来存储ROS的程序和代码的。 首先,创建一个工作空间的目录。 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src 然后,初始化ROS工作空间。 catkin_init_workspace cd ~/catkin_ws/ catkin_make 在以上的命令执行完毕之后,你就已经成功地创建了ROS的工作空间。 四、添加依赖项 在开始编写ROS程序之前,我们需要添加一些依赖项来辅助我们进行程序的编写工作。以下是添加依赖项的命令。 sudo apt-get install ros-kinetic-ros-tutorials sudo apt-get install ros-kinetic-geometry-msgs sudo apt-get install ros-kinetic-rosbag sudo apt-get install ros-kinetic-tf 五、测试ROS系统 在完成以上的步骤之后,我们来测试一下ROS系统。使用以下命令启动ROS系统。 roscore 接着,打开新的终端,并输入以下命令启动ROS回声程序。 rosrun roscpp_tutorials talker 在新的终端中再次输入以下命令启动ROS回声程序。 rosrun roscpp_tutorials listener 最后,运行一下以下命令,确认ROS回声程序是否正确运行。 rostopic echo /chatter 在你输入以上命令之后,可以看到ROS回声程序的输出信息。 通过以上步骤,我们已经成功地在Ubuntu16.04上安装了ROS系统,并进行了基本的测试工作。同时,你还可以通过ROS来进行更加全面和强大的机器人开发工作。 ### 回答3: Ubuntu操作系统是开源免费的操作系统,其中ROS是开源机器人操作系统,可以用于控制、仿真和编程机器人。下面将介绍如何在Ubuntu16.04上安装ROS。 1. 更新Ubuntu:首先需要更新Ubuntu操作系统,运行以下命令: sudo apt-get update sudo apt-get upgrade 2. 添加ROS软件源:运行以下命令添加ROS源 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 3. 安装ROS:安装ROS时,可以选择ROS版本(Kinetic / Melodic / Noetic等),其中Kinetic较为稳定,我们选择Kinetic进行安装,运行以下命令: sudo apt-get update sudo apt-get install ros-kinetic-desktop-full 4. 初始化ROS:安装完成后,需要先初始化ROS环境变量,运行以下命令: echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc source ~/.bashrc 5. 安装ROS工具包:根据需求安装相关的ROS工具包,例如rosdep和rosinstall等。 sudo apt-get install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential 6. 初始化rosdep:运行以下命令初始化rosdep。 sudo rosdep init rosdep update 7. 测试ROS:安装完毕后,可以运行以下命令来测试ROS是否正常运行: roscore 以上为在Ubuntu16.04上安装ROS的通用步骤,但在安装ROS的过程中可能会出现各种各样的问题,可以通过ROS社区和其他相关的技术支持网站了解相关的解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值