ROS estudo notas oito (implementação de programação do cliente cliente)

Modelo de serviço

A imagem abaixo é do livro "21 Lectures on ROS Introduction" de Gu Yue
Insira a descrição da imagem aqui

Por meio do nó de gerenciamento ROS Master, o cliente turtle_spawn emite uma solicitação, gera uma nova turtle, envia para o servidor turtlesim e o servidor processa a solicitação e retorna uma resposta indicando o resultado do processamento.

Criar pacote de recursos

$ cd~/catkin_ws/src
$ catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim

Crie o código do cliente (C ++)

/**
 * 该例程将请求/spawn服务,服务数据类型为turtlesim::Spawn
 */
 
#include <ros/ros.h>
#include <turtlesim/Spawn.h>
//引入头文件

int main(int argc, char** argv)
{
    
    
	//初始化ROS节点
	ros::init(argc, argv, "turtle_spawn");
	
	//创建节点句柄
	ros::NodeHandle node;
	
	//发现/spawn服务后,创建一个服务客户端,连接名为/spwan的service
	
	//阻塞性函数,经会一直等待直到系统出现/spawn服务
	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
	
	//初始化turtlesim::Spawn的请求数据
	turtlesim::Spawn srv;
	srv.request.x = 2.0;
	srv.request.y = 2.0;
	srv.request.name = "turtle2";
	
	//请求服务调用
	ROS_INFO("Call service to spawn turtle[x:%0.6f, y:%0.6f, name:%s]",
			 srv.request.x, srv.request.y, srv.request.name.c_str());
	
	//阻塞性函数,直至请求成功,返回新海龟的名称,或长时间未回应,返回错误信息
	add_turtle.call(srv);
	
	//显示服务调用结果
	ROS_INFO("Spawn turtle sucessfully [name:%s]", srv.response.name.c_str());
	
	return 0;
	
}

Pentear de processo

  • Inicialize o nó ROS
  • Crie uma instância de cliente
  • Publicar dados de solicitação de serviço
  • Aguardando o resultado da resposta após o processamento do servidor

Configure as regras de compilação do código do cliente

  • Defina o código a ser compilado e o arquivo executável gerado
  • Configure a biblioteca de links
add_executable(turtle_spwan src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

Compile e execute o cliente

$ cd~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun learning_service turtle_spawn

Os resultados são os seguintes:
Insira a descrição da imagem aqui

Código do cliente (Python)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn

import sys
import rospy
from turtlesim.srv import Spawn

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

	# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
    rospy.wait_for_service('/spawn')
    try:
        add_turtle = rospy.ServiceProxy('/spawn', Spawn)

		# 请求服务调用,输入请求数据
        response = add_turtle(2.0, 2.0, 0.0, "turtle2")
        return response.name
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

if __name__ == "__main__":
	#服务调用并显示调用结果
    print "Spwan turtle successfully [name:%s]" %(turtle_spawn())


Parte do código neste artigo vem de Gu Yue "21 Lectures on ROS Introduction"

Link anterior

Notas de estudo de ROS sete (definição e uso de mensagens de tópico)
Notas de estudo de ROS seis (implementação de programação de assinantes)
Notas de estudo de ROS cinco (implementação de programação de editores)
Notas de estudo de ROS quatro (criação de espaços de trabalho e pacotes funcionais)
Nota de aprendizagem de ROS três (uso de Ferramentas de linha de comando ROS)
Notas de estudo de ROS dois (conceitos centrais de ROS )
Notas de estudo de ROS um (operação básica do sistema Linux)

Acho que você gosta

Origin blog.csdn.net/weixin_44911075/article/details/114222595
Recomendado
Clasificación