1. 程式人生 > >ROS學習(二)server和client的編寫總結

ROS學習(二)server和client的編寫總結

ROS學習(二)serverclient的編寫總結

東南大學 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__()函式裡做一些初始化;

        後面就是一些類成員函數了:

       (1self.s=rospy.Service('add2',add,self.handle)

        這句話我們定義了一個名為“add2”的服務,資料型別是add,這與我們定義的.srv檔案是同名的。因為在catkin_make的時候會建立程需要的標頭檔案【這些標頭檔案放在/工作空間

/devel/include//目錄下,與 .srv檔案同名,所以第二個引數必需與之同名】,最後一個引數是此服務呼叫的函式控制代碼。

       (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()函式,首先等待服務可用,之後判斷客戶端輸入的引數是否符合條件:


        注意pythonsys.argv的用法,比方說你在執行節點的時候輸入的引數是4 5 6三個數,則程式會報錯。

        之後再呼叫服務求解結果並將結果返回。


        總結:

        通過這樣的總結反思,比較詳細的瞭解了編寫過程。我覺得,有時候官網的教程如果直接照著搬過來的話理解可能不深入(程式設計大神自動跳過),所以自己把變數還有程式設計形式改一改,可能會更有助於理解程式,為以後的開發打好基礎。【比如,我就是把官網的python教程豆試用面向物件的思想重新寫了一遍!附上官網連結:http://wiki.ros.org/rospy_tutorials/Tutorials/WritingServiceClient


  

相關推薦

ROS學習serverclient編寫總結

ROS學習(二)server和client的編寫總結 東南大學 ZSCSEU         今天,總結了一下ROS中使用python編寫服務端和客戶端的栗子。         首先,定義了一個名

Java SpringMVC框架學習httpServeltRequestModel傳值的區別

urn ont ppi mode array style att 區別 () 為什麽大多程序在controller中給jsp傳值時使用model.addAttribute()而不使用httpServeletRequest.setAttribute()? 事實上model數

JSP的學習——ELJSTL表示式

一、EL表示式 ①基本概念 EL表示式: expression language表示式語言 EL(Expression Language) 是為了使JSP寫起來更加簡單。表示式語言的靈感來自於 ECMAScript 和 XPath 表示式語言,它提供了在 JSP 中簡化

Spark原始碼學習---MasterWorker的啟動以及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.mkApplication.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學習筆記parseIntvalueOf 以及字串+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框架的一大特色就是它通過元件化的方式來構建和渲染前端頁面,瞭解

機器學習之numpymatplotlib學習

第二天更新 今天我們來學習怎麼使用matplotlib和numpy來做一個簡單的影象。 先從程式碼入手,程式碼介紹如下: 我們要做一個y=x*x的影象,也就是初中經常學的一元二次函式的影象。 x

git的使用學習github遠端庫的連線同步操作

1.github遠端庫的連線 開啟github官網github. 登入之後 點選這個 然後 輸入名字點選建立就會跳轉到這個介面 我們用紅色箭頭指的現有的庫 然後開啟git 1.這是把本地庫主分支的內容匯入到遠端庫 git push -u origin master 注