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()