2022-06-07 ROS通信機(jī)制 服務(wù)通信 自定義srv 并發(fā)布 C++ 篇

1矾瘾、首先自定義 srv 文件

與自定義 msg 文件類似,在工作目錄下創(chuàng)建 srv 目錄
在目錄下創(chuàng)建 xxx.srv 文件
例: 創(chuàng)建 addints.srv 文件

編寫代碼

其中首先編寫客戶端發(fā)送的數(shù)據(jù)類型
以 --- 作分割符牲平,區(qū)分客戶端和服務(wù)端處理的數(shù)據(jù)類型
編寫服務(wù)端處理發(fā)送的數(shù)據(jù)

#客戶端發(fā)送的數(shù)據(jù)
int32 num1
int32 num2
---
#服務(wù)端發(fā)送的數(shù)據(jù)
int32 sum

修改package.xml文件

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

修改CMakeLists.txt文件

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

# Generate services in the 'srv' folder
add_service_files(
  FILES
  addints.srv
)

# Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

ctrl+shift+B編譯渊季,在工作空間下 devel 文件夾中可發(fā)現(xiàn)生成的中間文件 addints.h 頭文件等.

復(fù)制該地址唆涝,打開 c_cpp_properties.json 文件進(jìn)行添加 Path:

"/xxx/工作空間/devel/include/**"#根據(jù)自己的目錄自行填寫

服務(wù)端C++文件編寫

#include "ros/ros.h"
#include "server_client/addints.h"
bool doADD(server_client::addintsRequest& req,server_client::addintsResponse& resp)
{
    int num1 = req.num1;
    int num2 = req.num2;
    ROS_INFO("接收到的數(shù)據(jù)為%d,%d",num1,num2);

    if(num1<0||num2<0)                                      //判斷輸入數(shù)據(jù)是否合法
    {
        ROS_ERROR("請(qǐng)輸入兩個(gè)整數(shù)");
        return false;

    }
    else{
        int sum = num1+num2;
        resp.sum = sum;
        ROS_INFO("處理的結(jié)果為:%d",sum);
        return true;
    }
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc ,argv,"server");
    ros::NodeHandle nh;
    ros::ServiceServer server = nh.advertiseService("addints",doADD);
    ROS_INFO("啟動(dòng)成功");
    ros::spin();                                                      //因?yàn)樾枰幚矶啻瓮严郏源颂幮枰猻pin返回
    return 0;
}

客戶端C++文件編寫

#include "ros/ros.h"
#include "server_client/addints.h"
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    if(argc != 3)
    {
        ROS_ERROR("請(qǐng)輸入三個(gè)整數(shù)");
        return 1;
    }
    ros::init(argc,argv,"client");
    
    ros::NodeHandle nh;

    ros::ServiceClient client = nh.serviceClient<server_client::addints>("addints");

    ros::service::waitForService("addints");               //通過此函數(shù)可以保證服務(wù)端啟動(dòng)后再發(fā)送數(shù)據(jù)

    server_client::addints ai;                                      //組織信息傳送到服務(wù)端
    ai.request.num1 = atoi(argv[1]);
    ai.request.num2 = atoi(argv[2]);

    bool flag = client.call(ai);                                     //判斷數(shù)據(jù)是否已經(jīng)發(fā)送成功

    if(flag)
    {
        ROS_INFO("數(shù)據(jù)處理成功萝究,結(jié)果為:%d",ai.response.sum);
    }
    else{
        ROS_ERROR("數(shù)據(jù)處理失敗");
        return 1;
    }

    return 0;
}

編輯CMakeLists.txt文件

add_executable(server_c src/server.cpp)
add_executable(client_c src/client.cpp)

## Add cmake target dependencies of the executable
## same as for the library above
add_dependencies(server_c ${PROJECT_NAME}_gencpp)
add_dependencies(client_c ${PROJECT_NAME}_gencpp)


# Specify libraries to link a library or executable target against
target_link_libraries(server_c
  ${catkin_LIBRARIES}
)
target_link_libraries(client_c
  ${catkin_LIBRARIES}
)

Ctrl+Shift+B編譯通過后在工作空間打開終端

roscore啟動(dòng)ros核心

rosrun 功能包 服務(wù)端映射名

rosrun 功能包 客戶端映射名 num1 num2

Screenshot from 2022-06-07 18-35-59.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轻黑,隨后出現(xiàn)的幾起案子糊肤,更是在濱河造成了極大的恐慌,老刑警劉巖氓鄙,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異业舍,居然都是意外死亡抖拦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門舷暮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态罪,“玉大人,你說我怎么就攤上這事下面「淳保” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沥割,是天一觀的道長(zhǎng)耗啦。 經(jīng)常有香客問我,道長(zhǎng)机杜,這世上最難降的妖魔是什么帜讲? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮椒拗,結(jié)果婚禮上似将,老公的妹妹穿的比我還像新娘获黔。我一直安慰自己,他們只是感情好在验,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布玷氏。 她就那樣靜靜地躺著,像睡著了一般腋舌。 火紅的嫁衣襯著肌膚如雪盏触。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天侦厚,我揣著相機(jī)與錄音耻陕,去河邊找鬼。 笑死刨沦,一個(gè)胖子當(dāng)著我的面吹牛诗宣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播想诅,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼召庞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了来破?” 一聲冷哼從身側(cè)響起篮灼,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徘禁,沒想到半個(gè)月后诅诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡送朱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年娘荡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驶沼。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炮沐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回怜,到底是詐尸還是另有隱情大年,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布玉雾,位于F島的核電站翔试,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抹凳。R本人自食惡果不足惜遏餐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赢底。 院中可真熱鬧失都,春花似錦柏蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至庞溜,卻和暖如春革半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背流码。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工冤留, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吆豹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓜贾,于是被迫代替她去往敵國和親天揖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撑柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容