ROS學習(二)server和client的編寫總結
ROS學習(二)server和client的編寫總結
東南大學 ZSCSEU
今天,總結了一下ROS中使用python編寫服務端和客戶端的栗子。
首先,定義了一個名為add.srv的檔案,裡面的內容如下:
然後,編寫add_two.py(服務端)程式碼如下
#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy from beginner_test.srv import * class add_ser(): def __init__(self): rospy.init_node('add_s',anonymous=False) r=rospy.Rate(10) rospy.on_shutdown(self.shutdown) self.add_two() def add_two(self): rospy.loginfo('Ready...') self.s=rospy.Service('add2',add,self.handle) def handle(self,req): print '結果是[%s+%s=%s]'%(req.a,req.b,(req.a+req.b)) return addResponse(req.a+req.b) def shutdown(self): rospy.loginfo('Stop...') rospy.sleep(1) if __name__=='__main__': try: add_ser() rospy.spin() except: rospy.loginfo('Error...')
我覺得有必要對程式碼做一些解釋,因為自己寫的時候由於是初學者,感覺很亂。可能是程式設計能力低的緣故,我覺得梳理一下會比較清楚。
首先,我們先定義一個add_ser()的類,並在__init__()函式裡做一些初始化;
後面就是一些類成員函數了:
(1)self.s=rospy.Service('add2',add,self.handle)
這句話我們定義了一個名為“add2”的服務,資料型別是add,這與我們定義的.srv檔案是同名的。因為在catkin_make的時候會建立程需要的標頭檔案【這些標頭檔案放在/工作空間
(2)關於函式 handle()
這個函式是服務add2呼叫的函式,處理從客戶端傳輸過來的引數;
注意return時,addResponse也必須要和“/工作空間/devel/include/包/”目錄下的名字對應一致。
完成了伺服器的編寫,下面我們要進行客戶端的程式設計,程式碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- import rospy import sys #from std_msgs.msg import int64 from beginner_test.srv import * class client(): def __init__(self): rospy.init_node('cli',anonymous=False) r=rospy.Rate(10) rospy.on_shutdown(self.shutdown) self.add_two() def add_two(self): rospy.wait_for_service('add2') if len(sys.argv)==3: x=int(sys.argv[1]) y=int(sys.argv[2]) print x,y else: rospy.loginfo('failed...') try: self.add1=rospy.ServiceProxy('add2',add) self.res=self.add1(x,y) print self.res.sum return self.res.sum except: rospy.loginfo('service call failed!') # def use(self): # return "%s [x,y]"%sys.argv[0] # def shutdown(self): rospy.loginfo('Stop..') rospy.sleep(1) if __name__=='__main__': try: client() rospy.spin() except: rospy.loginfo('baba')
客戶端程式碼主要注意add_two()函式,首先等待服務可用,之後判斷客戶端輸入的引數是否符合條件:
注意python中sys.argv的用法,比方說你在執行節點的時候輸入的引數是4 5 6三個數,則程式會報錯。
之後再呼叫服務求解結果並將結果返回。
總結:
通過這樣的總結反思,比較詳細的瞭解了編寫過程。我覺得,有時候官網的教程如果直接照著搬過來的話理解可能不深入(程式設計大神自動跳過),所以自己把變數還有程式設計形式改一改,可能會更有助於理解程式,為以後的開發打好基礎。【比如,我就是把官網的python教程豆試用面向物件的思想重新寫了一遍!附上官網連結:http://wiki.ros.org/rospy_tutorials/Tutorials/WritingServiceClient】
相關推薦
ROS學習(二)server和client的編寫總結
ROS學習(二)server和client的編寫總結 東南大學 ZSCSEU 今天,總結了一下ROS中使用python編寫服務端和客戶端的栗子。 首先,定義了一個名
Java SpringMVC框架學習(二)httpServeltRequest和Model傳值的區別
urn ont ppi mode array style att 區別 () 為什麽大多程序在controller中給jsp傳值時使用model.addAttribute()而不使用httpServeletRequest.setAttribute()? 事實上model數
JSP的學習(二)——EL和JSTL表示式
一、EL表示式 ①基本概念 EL表示式: expression language表示式語言 EL(Expression Language) 是為了使JSP寫起來更加簡單。表示式語言的靈感來自於 ECMAScript 和 XPath 表示式語言,它提供了在 JSP 中簡化
Spark原始碼學習(二)---Master和Worker的啟動以及Actor通訊流程
在《Spark原始碼學習(一)》中通過Spark的啟動指令碼,我們看到Spark啟動Master的時候實際上是啟動了org.apache.spark.deploy.master.Master,下面我們就從這2個類入手,通過閱讀Spark的原始碼,瞭解Spark的啟動流程。
OAuth2.0 學習(二) Server 設計
伺服器端的資料儲存方案 OAuth2.0 機制的核心工作流程,大部分資訊,如APP 資訊、使用者和APP 之間的授權關係、Access Token等,需要永久性儲存,儲存在資料庫中。一些不需要永久儲存的資訊,如臨時授權碼,只使用一次,而且,在很短的時間內就要使其失效,就沒
cocos creator學習(七)觸控和鍵盤事件總結
1、處理事件在節點(cc.Node)中完成的。對於元件可以通過訪問節點this.node來註冊和監聽事件。監聽事件可以通過this.mode.on()函式來進行 this.node.on('mousedown',function(event){ conso
JAVA學習(二) String使用equals方法和==分別比較的是什麽?(轉)
找到 基礎上 stirng print 大小 obj lis 分配 ret String使用的equals方法和==的區別 equals方法和==的區別 首先大家知道,String既可以作為一個對象來使用,又可以作為一個基本類型來使用。這裏指的作為一個基本類型來使用只是
Android NDK學習(二):編譯腳本語法Android.mk和Application.mk
GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義
JS學習(二)物件屬性的獲取和訪問
var array = ["one","two","three"];//陣列 var obj = {//物件 field : "self", printInfo : function (){  
ubuntu16.04下ROS作業系統學習(二)命令工具
ROS常用命令: 命令 作用 catkin_create_pkg 建立功能包 rospack 獲取功能包的資訊 catkin_make 編譯工作空間中的功
java學習筆記(二)parseInt和valueOf 以及字串+和StringBuilder的區別
parseInt和valueOf 我們平時應該都用過或者見過parseInt和valueOf這兩個方法。一般我們是想把String型別的字元數字轉成int型別。從這個功能層面來說,這兩個方法都一樣,都可以勝任這個功能。 但是,我們進入原始碼,看下Integer類下這兩個方法 pars
高效學習(二)深度、歸納和堅持實踐
所有內容均來自左耳朵耗子的極客專欄 系統性學習 只有把這個學習模板中的內容都填實了,我才罷休。這個模板如下。 (一)這個技術出現的背景、初衷和要達到什麼樣的目標或是要解決什麼樣的問題。這個問題非常關鍵,也就是說,你在學習一個技術的時候,需要知道這個技術的成因和目
TensorFlow學習(二):tf.random_normal() 和 tf.random_unform()
1. tf.random_normal() #正態分佈 tf.random_normal( shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None ) Args:
TensorFlow 學習(二) 張量和基本運算
tensor: 張量 operation: 專門運算的操作節點 graph: 整個程式的結構, 圖 TensorBoard: 視覺化學習 run() : 運算程式的圖、會話 張量的階: 0 階:
web前端學習(二)html學習筆記部分(10)-- HTML5構建應用佈局和頁面
1.2.25 HTML5構建應用佈局和頁面 1.2.25.1 HTML5在移動開發中的準則 1.儘量使用單頁面開發 2.慎重選擇前端UI框架 3.動畫、特效使用準則(60fps) 瀏覽器消耗最小的css屬性 位置 -&n
Vue學習(二)——內容顯示和繫結事件
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Vue入門</title> <script src="./vue.js"
Java NIO 學習筆記(二)----聚集和分散,通道到通道
目錄: Java NIO 學習筆記(一)----概述,Channel/Buffer Java NIO 學習筆記(二)----聚集和分散,通道到通道 Scatter / Gather 通道的聚集和分散操作 NIO 具有內建的 scatter/gather 支援,用於描述讀取和寫入通道的操作。 分散(
React學習(二)——元件的運用和資料傳遞
大家好,我是凱文,本篇文章主要圍繞React框架的元件以及元件之間資料的傳遞展開,並通過例項來實現特定的功能。下面先來簡單介紹一下React的元件,由本人學習實踐所得,用於做筆記,僅供參考。 React框架的一大特色就是它通過元件化的方式來構建和渲染前端頁面,瞭解
機器學習之numpy和matplotlib學習(二)
第二天更新 今天我們來學習怎麼使用matplotlib和numpy來做一個簡單的影象。 先從程式碼入手,程式碼介紹如下: 我們要做一個y=x*x的影象,也就是初中經常學的一元二次函式的影象。 x
git的使用和學習(二)github遠端庫的連線和同步操作
1.github遠端庫的連線 開啟github官網github. 登入之後 點選這個 然後 輸入名字點選建立就會跳轉到這個介面 我們用紅色箭頭指的現有的庫 然後開啟git 1.這是把本地庫主分支的內容匯入到遠端庫 git push -u origin master 注