1. 程式人生 > >ROS服務程式設計::2,建立server

ROS服務程式設計::2,建立server

#include"ros/ros.h"
#include"my_package/AddTwoInts.h"

bool add(my_package::AddTwoInts::Request &req,
         my_package::AddTwoInts::Response &res)
{
    res.sum = req.a + req.b;
    ROS_INFO("request:x=%ld,y=%ld",(long int)req.a,(long int)req.b);
    ROS_INFO("sending back response:[%ld]",(long int)res.sum);
    return true;
}

int main(int argc,char **argv)
{
    ros::init(argc, argv, "add_two_ints_server");
    ros::NodeHandle n;
    ros::ServiceServer service = n.advertiseService("add_two_ints",add);
    ROS_INFO("Ready to add two ints.");
    ros::spin();
    return 0;
}

 程式碼解析:

1,標頭檔案

#include"ros/ros.h"
#include"my_package/AddTwoInts.h"

使用ros中的服務必須包含的標頭檔案,其中“my_package/AddTwoInts.h"由之前建立的服務檔案AddTwoInts.srv自動生成。

2,主函式

ros::init(argc, argv, "add_two_ints_server");

ros節點初始化,add_two_ints_server是節點名稱,在ros的執行中必須獨一無二,

 ros::ServiceServer service = n.advertiseService("add_two_ints",add);

建立一個服務的Sever,指定服務的名稱add_two_ints,以及收到資料的回撥函式 add.然後迴圈等待服務請求,一旦有服務請求,Sever就跳入回撥函式進行處理。

3,回撥函式部分

bool add(my_package::AddTwoInts::Request &req,
         my_package::AddTwoInts::Response &res)

回撥函式是實現服務功能的部分,add()完成兩個函式相加的功能,其傳入引數便是我們在服務資料型別描述檔案(srv)宣告的資料結構。

res.sum = req.a + req.b;
    ROS_INFO("request:x=%ld,y=%ld",(long int)req.a,(long int)req.b);
    ROS_INFO("sending back response:[%ld]",(long int)res.sum);
    return true;

完成加法運算後,求和結果會放入到應答資料中,反饋到Client,回撥函式返回true。

服務中的Server類似於話題中的Subscriber,流程如下:

1,初始化ros節點

2,建立Server例項

3,迴圈等待服務請求,進入回撥函式

4,在回撥函式中完成服務功能的處理並反饋應答資料。