ros之service通讯

43 篇文章 1 订阅
14 篇文章 0 订阅

c++

1.main版

client.cpp

//
// Created by wt on 2020/6/30.
//
#include <iostream>
#include <ros/ros.h>
#include <roscpp_tutorials/TwoInts.h>
using namespace std;

int main(int argc,char *argv[]){
    //节点名
    string nodeName = "cpp_client";
    //初始化节点
    ros::init(argc,argv,nodeName,ros::init_options::AnonymousName);
    //创建节点
    ros::NodeHandle node;
    //service名字
    string serviceName = "cpp_service";
    //创建client
    ros::ServiceClient client = node.serviceClient<roscpp_tutorials::TwoInts>(serviceName);
    //等待server端上线
    client.waitForExistence();
    //定义数据
    roscpp_tutorials::TwoInts service;
    service.request.a = 12;
    service.request.b = 13;
    //调用service
    client.call(service);
    ROS_INFO_STREAM("result:"<<service.response.sum);
    //事件轮询
    ros::spin();
    return 0;
}

server.cpp

//
// Created by wt on 2020/6/30.
//
#include <iostream>
#include <ros/ros.h>
#include <roscpp_tutorials/TwoInts.h>
using namespace std;

bool callBack(roscpp_tutorials::TwoIntsRequest& req,roscpp_tutorials::TwoIntsResponse& res){
    //从请求中获取两个参数
    //把和通过res返回出去
    res.sum = req.a+req.b;
    return true;
}

int main(int argc,char *argv[]){
    //节点名
    string nodeName = "cpp_server";
    //初始化节点
    ros::init(argc,argv,nodeName);
    //创建节点
    ros::NodeHandle node;
    //service名字
    string serviceName = "cpp_service";
    //创建server端
    const ros::ServiceServer &server = node.advertiseService(serviceName, callBack);
    //事件轮询
    ros::spin();
    return 0;
}

1.gui版 操作小乌龟

MainWindow.h

//
// Created by wt on 2020/6/30.
//

#ifndef DEMO_TURTLE_SERVICE_MAINWINDOW_H
#define DEMO_TURTLE_SERVICE_MAINWINDOW_H
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QCheckBox>
#include <ros/ros.h>
#include <std_srvs/Empty.h>
#include <turtlesim/Spawn.h>
#include <turtlesim/Kill.h>
#include <turtlesim/SetPen.h>
#include <turtlesim/TeleportAbsolute.h>
#include <turtlesim/TeleportRelative.h>
#include <iostream>

using namespace std;
class MainWindow: public QWidget {
private:
    //整体布局
    QVBoxLayout wholeLayout;
    //清理画布按钮
    QPushButton clearBtn;
    //重置按钮
    QPushButton resetBtn;
    //创建小乌龟布局
    QHBoxLayout createLayout;
    //输入框
    QLineEdit xEdit;
    QLineEdit yEdit;
    QLineEdit thetaEdit;
    QLineEdit spawnNameEdit;
    QPushButton spawnBtn;
    //杀死小乌龟布局
    QHBoxLayout killLayout;
    QLineEdit killNameEdit;
    QPushButton killBtn;
    //设置画笔布局
    QHBoxLayout setPenLayout;
    QLineEdit setPenNameEdit;
    QLineEdit setPenREdit;
    QLineEdit setPenGEdit;
    QLineEdit setPenBEdit;
    QLineEdit setPenWidthEdit;
    QCheckBox setPenCloseCb;
    QPushButton setPenBtn;
    //设置绝对位置
    QHBoxLayout absLayout;
    QLineEdit absNameEdit;
    QLineEdit absXEdit;
    QLineEdit absYEdit;
    QLineEdit absThetaEdit;
    QPushButton absBtn;


    //设置绝对位置
    QHBoxLayout relLayout;
    QLineEdit relNameEdit;
    QLineEdit relLinearEdit;
    QLineEdit relAngularEdit;
    QPushButton relBtn;

    //node节点
    ros::NodeHandle node;
    //创建服务客户端
    ros::ServiceClient clearClient;
    ros::ServiceClient resetClient;
    ros::ServiceClient spawnClient;
    ros::ServiceClient killClient;
    ros::ServiceClient setPenClient;
    ros::ServiceClient absClient;
    ros::ServiceClient relClient;

public:
    explicit MainWindow(ros::NodeHandle node,QWidget* parent = Q_NULLPTR);

    ~MainWindow() override;
    //清理
    void clear();
    //重置
    void reset();
    //创建
    void spawn();
    //杀死
    void kill();
    //设置画笔
    void setPen();
    //绝对位置
    void abs();
    //相对位置
    void rel();
};


#endif //DEMO_TURTLE_SERVICE_MAINWINDOW_H

MainWindow.cpp

//
// Created by wt on 2020/6/30.
//

#include "MainWindow.h"

MainWindow::MainWindow(ros::NodeHandle node, QWidget *parent) : QWidget(parent), node(node), clearBtn("清理画布"),
                                                                resetBtn("重置"), spawnBtn("创建小乌龟"), killBtn("杀死小乌龟"),
                                                                setPenBtn("设置画笔"),
                                                                absBtn("设置绝对位置"), relBtn("设置相对位置") {
    //创建服务客户端
    clearClient = node.serviceClient<std_srvs::Empty>("/clear");
    resetClient = node.serviceClient<std_srvs::Empty>("/reset");
    spawnClient = node.serviceClient<turtlesim::Spawn>("/spawn");
    killClient = node.serviceClient<turtlesim::Kill>("/kill");

    //设置布局
    setLayout(&wholeLayout);
    //清理
    wholeLayout.addWidget(&clearBtn);
    wholeLayout.addWidget(&resetBtn);
    //创建小乌龟
    xEdit.setPlaceholderText("x");
    yEdit.setPlaceholderText("y");
    thetaEdit.setPlaceholderText("theta");
    spawnNameEdit.setPlaceholderText("名字");
    createLayout.addWidget(&xEdit);
    createLayout.addWidget(&yEdit);
    createLayout.addWidget(&thetaEdit);
    createLayout.addWidget(&spawnNameEdit);
    createLayout.addWidget(&spawnBtn);
    wholeLayout.addLayout(&createLayout);
    //杀死小乌龟
    killLayout.addWidget(&killNameEdit);
    killLayout.addWidget(&killBtn);
    wholeLayout.addLayout(&killLayout);
    //设置画笔
    setPenLayout.addWidget(&setPenNameEdit);
    setPenLayout.addWidget(&setPenREdit);
    setPenLayout.addWidget(&setPenGEdit);
    setPenLayout.addWidget(&setPenBEdit);
    setPenLayout.addWidget(&setPenWidthEdit);
    setPenLayout.addWidget(&setPenCloseCb);
    setPenLayout.addWidget(&setPenBtn);
    wholeLayout.addLayout(&setPenLayout);
    //绝对位置
    absLayout.addWidget(&absNameEdit);
    absLayout.addWidget(&absXEdit);
    absLayout.addWidget(&absYEdit);
    absLayout.addWidget(&absThetaEdit);
    absLayout.addWidget(&absBtn);
    wholeLayout.addLayout(&absLayout);

    //相对位置
    relLayout.addWidget(&relNameEdit);
    relLayout.addWidget(&relLinearEdit);
    relLayout.addWidget(&relAngularEdit);
    relLayout.addWidget(&relBtn);
    wholeLayout.addLayout(&relLayout);

    //信号和槽绑定
    connect(&clearBtn, &QPushButton::clicked, this, &MainWindow::clear);
    connect(&resetBtn, &QPushButton::clicked, this, &MainWindow::reset);
    connect(&spawnBtn, &QPushButton::clicked, this, &MainWindow::spawn);
    connect(&killBtn, &QPushButton::clicked, this, &MainWindow::kill);
    connect(&setPenBtn, &QPushButton::clicked, this, &MainWindow::setPen);
    connect(&absBtn, &QPushButton::clicked, this, &MainWindow::abs);
    connect(&relBtn, &QPushButton::clicked, this, &MainWindow::rel);
}

MainWindow::~MainWindow() {

}

void MainWindow::clear() {
    //等待服务
    clearClient.waitForExistence();
    //数据
    std_srvs::Empty data;
    //发送清理服务信号
    clearClient.call(data);
}

void MainWindow::reset() {
    //等待服务
    resetClient.waitForExistence();
    //数据
    std_srvs::Empty data;
    //发送清理服务信号
    resetClient.call(data);
}

void MainWindow::spawn() {
    //数据
    turtlesim::Spawn data;
    data.request.x = xEdit.text().toFloat();
    data.request.y = yEdit.text().toFloat();
    data.request.theta = thetaEdit.text().toFloat();
    data.request.name = spawnNameEdit.text().toStdString();
    spawnClient.waitForExistence();
    spawnClient.call(data);
}

void MainWindow::kill() {
    //数据
    turtlesim::Kill data;
    data.request.name = killNameEdit.text().toStdString();
    //等待
    killClient.waitForExistence();
    killClient.call(data);
}

void MainWindow::setPen() {
    //服务名
    string serviceName = "/" + setPenNameEdit.text().toStdString() + "/set_pen";
    //创建client
    ros::ServiceClient client = node.serviceClient<turtlesim::SetPen>(serviceName);
    client.waitForExistence();
    //数据
    turtlesim::SetPen data;
    data.request.r = setPenREdit.text().toUInt();
    data.request.g = setPenGEdit.text().toUInt();
    data.request.b = setPenBEdit.text().toUInt();
    data.request.width = setPenWidthEdit.text().toUInt();
    if (setPenCloseCb.isChecked()) {
        data.request.off = 1;
    } else {
        data.request.off = 0;
    }
    //发送
    client.call(data);
}

void MainWindow::abs() {
    //服务名
    string serviceName = "/" + absNameEdit.text().toStdString() + "/teleport_absolute";
    //创建client
    ros::ServiceClient client = node.serviceClient<turtlesim::TeleportAbsolute>(serviceName);
    client.waitForExistence();
    //数据
    turtlesim::TeleportAbsolute data;
    data.request.x = absXEdit.text().toFloat();
    data.request.y = absYEdit.text().toFloat();
    data.request.theta = absThetaEdit.text().toFloat();
    //发送
    client.call(data);
}

void MainWindow::rel() {
    //服务名
    string serviceName = "/" + relNameEdit.text().toStdString() + "/teleport_relative";
    //创建client
    ros::ServiceClient client = node.serviceClient<turtlesim::TeleportRelative>(serviceName);
    client.waitForExistence();
    //数据
    turtlesim::TeleportRelative data;
    data.request.linear = relLinearEdit.text().toFloat();
    data.request.angular = relAngularEdit.text().toFloat();
    //发送
    client.call(data);
}

main.cpp

//
// Created by wt on 2020/6/30.
//
#include <iostream>
#include <ros/ros.h>
#include "MainWindow.h"
#include <QApplication>
using namespace std;

int main(int argc,char *argv[]){
    //节点名
    string nodeName = "node_turtle_ctrl";
    //初始化节点
    ros::init(argc,argv,nodeName);
    //创建节点
    ros::NodeHandle node;

    //创建程序
    QApplication app(argc,argv);
    //创建窗口
    MainWindow w(node);
    //显示窗口
    w.show();

    return QApplication::exec();
}


 

python

1.main版

client.py

#!/usr/bin/env python
# coding:utf-8
import rospy
from roscpp_tutorials.srv import TwoInts,TwoIntsRequest

if __name__ == '__main__':
    # 创建节点
    rospy.init_node("py_client")
    # service名字
    serviceName = 'py_service'
    # 创建客户端
    proxy = rospy.ServiceProxy(serviceName, TwoInts)
    # 等待service上线
    proxy.wait_for_service()
    # 请求数据
    req = TwoIntsRequest()
    req.a = 12
    req.b = 13
    # 调用service
    result = proxy.call(req)
    print result

server.py

#!/usr/bin/env python
# coding:utf-8
import rospy
from roscpp_tutorials.srv import TwoInts

def callBack(req):
    return req.a+req.b

if __name__ == '__main__':
    # 创建节点
    rospy.init_node("py_server")
    # service名字
    serviceName = 'py_service'
    # 创建server端
    service = rospy.Service(serviceName, TwoInts, callBack)
    # 阻塞
    rospy.spin()

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_无往而不胜_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值