ROS与Arduino学习(五)客户端与服务器

ROS与Arduino学习(五)客户端与服务器

ROS与Arduino学习(五)客户端与服务器

 

Tutorial Level:用ROS中的Cmake编译程序

Next Tutorial:Logging日志

 

Tips 1 服务器

 

ros::ServiceServer<Test::Request,TestResponse> server("TEST",&CallBack);

 服务器对象声明,后面两个参数,一个是服务器名称,另一个是收到客户端内容后所调用的函数。对应的类型分别是Test::Request和TestResponse

void callback(const ::Request & req, Test::Response & res){
  if((i++)%2)
    res.output = "hello";
  else
    res.output = "world";
}

 回调函数,返回值为“hello world”

  nh.advertiseService(server);

 在setup函数中需要对服务器进行绑定。

 

案例程序如下

/*
 * rosserial Service Server
 */

#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Int16.h>
#include <rosserial_arduino/Test.h>

ros::NodeHandle  nh;
using rosserial_arduino::Test;

int i;
void callback(const ::Request & req, Test::Response & res){
  if((i++)%2)
    res.output = "hello";
  else
    res.output = "world";
}

ros::ServiceServer<Test::Request, Test::Response> server("test_srv",&callback);

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  nh.initNode();
  nh.advertiseService(server);
  nh.advertise(chatter);
}

void loop()
{
  str_msg.data = hello;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(10);
}

 

测试程序:

此程序完成的操作是服务器接受到指令后实现返回给客户段hello与word交替返回。

#新终端打开
$ roscore
#新终端打开
$  rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
#新终端打开
$ rosservice call test_srv ""

 

Tips 2 客户端

 

ros::ServiceClient<Test::Request, Test::Response> client("test_srv");

 客户端对象声明    client是客户端的名称,“test_srv”是它所链接的服务器名称

nh.serviceClient(client);

 节点句柄绑定客户端。

Test::Request req;
Test::Response res;
client.call(req, res);

Test::Response res;
client.call(req, res);

 服务器发送消息到客户端  req是发送参数,res是返回参数

 

测试程序

/*
 * rosserial Service Client
 */

#include <ros.h>
#include <std_msgs/String.h>
#include <rosserial_arduino/Test.h>

ros::NodeHandle  nh;
using rosserial_arduino::Test;

ros::ServiceClient<Test::Request, Test::Response> client("test_srv");

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  nh.initNode();
  nh.serviceClient(client);
  nh.advertise(chatter);
  while(!nh.connected()) nh.spinOnce();
  nh.loginfo("Startup complete");
}

void loop()
{
  Test::Request req;
  Test::Response res;
  req.input = hello;
  client.call(req, res);
  str_msg.data = res.output;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(100);
}

 

测试程序

#新终端打开
$ roscore
#新终端打开
$  rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
#新终端打开
$ rosservice call test_srv ""

 

posted @ 2018-04-25 19:43 #Cloud 阅读(...) 评论(...) 编辑 收藏

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值