ROS代码

mac2026-02-06  0

写在前面:

环境: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

 

最新回复(0)