写在前面:
环境:ubuntu 16.04
IDE:roboware studio
1、收发消息(topic)
(1). publisher
#include <ros/ros.h>
#include <roscpp_topic_demo/gps.h>
int main(int argc, char ** argv){
//解析函数,命名结点
ros::init(argc, argv, "publisher");
//创建句柄,用于初始化node
ros::NodeHandle nh;
//自定义msg的内容
roscpp_topic_demo::gps msg;
msg.x = 1.0;
msg.y = 1.2;
msg.state = "working";
//创建publisher
ros::Publisher pub = nh.advertise<roscpp_topic_demo::gps>("gps_info",1);
//定义发布的频率
ros::Rate loop_rate(1.0);
while(ros::ok()){
ROS_INFO("Talker:GPS: x = %f, y = %f", msg.x, msg.y);
msg.x = msg.x * 1.03;
msg.y = msg.y * 1.02;
pub.publish(msg);
loop_rate.sleep();
}
return 0;
}
2.subscriber
#include <ros/ros.h>
#include <std_msgs/Float32.h>
#include <roscpp_topic_demo/gps.h>
void gpsCallback(const roscpp_topic_demo::gps::ConstPtr &msg){
//计算距离原点的距离
std_msgs::Float32 distance;
//注意这里使用的ros自带的float32类型,distance是一个结构体,具体数值保存在data中
distance.data = sqrt(pow(msg->x,2)+pow(msg->y,2));
ROS_INFO("Listener:Distance to origin = %f, state: %s", distance.data,msg->state.c_str());
}
int main(int argc, char ** argv){
//解析函数,命名结点
ros::init(argc, argv, "subscriber");
//创建句柄,初始化结点
ros::NodeHandle nh;
//创建subscriber,创建回调函数
ros::Subscriber sub = nh.subscribe("gps_info",1,gpsCallback);
//堵塞函数,使得其一直处于监听状态
ros::spin();
return 0;
}
(3)gps.msg
string state
float32 x
float32 y
2、请求和响应服务(service)
(1).client
#include "ros/ros.h"
#include "roscpp_service_demo/Greetings.h"
int main(int argc, char ** argv){
//解析参数,命名结点
ros::init(argc, argv, "client");
//创建句柄,创建client
ros::NodeHandle nh;
//创建客户机
ros::ServiceClient client = nh.serviceClient<roscpp_service_demo::Greetings>("greetings_info");
//实例化服务对象,向服务机发出请求
roscpp_service_demo::Greetings srv;
//srv中有两部分,一部分是客户机的request,另一部分是服务机的response,这里需要的客户机的request
srv.request.name = "Han";
srv.request.age = 20;
//客户机发送请求,call的返回值是由服务机的回调函数返回的
if(client.call(srv)){
//服务机返回了响应,并响应的内容打印下来
ROS_INFO("Request from server: %s", srv.response.feedback.c_str());
}else{
//服务机没有返回响应,说明出现了错误
ROS_ERROR("Failed to call service");
return 1;
}
return 0;
}
(2)server
# include "ros/ros.h"
# include "roscpp_service_demo/Greetings.h"
# include "string"
bool handle_function(roscpp_service_demo::Greetings::Request &req, roscpp_service_demo::Greetings::Response &res){
//直接将服务输出打印
ROS_INFO("Request from %s with age %d", req.name.c_str(),req.name);
//重置反馈的内容
res.feedback = "Hi" + req.name + ".i'm server!";
return true;
}
int main(int argc, char ** argv){
//解析参数,命名结点
ros::init(argc, argv, "server");
//创建句柄,用于创建service
ros::NodeHandle nh;
//创建server的实例对象
ros::ServiceServer server = nh.advertiseService("greetings_info", handle_function);
ros::spin();
return 0;
}
(3)Greetings.srv
string name
int32 age
---
string feedback