ROSの基礎(通信編)
やりたいこと
ROSの復習がてら、基礎の部分で理解が浅い部分をまとめる
ピアツーピア設計方針
参考:ROS/Technical Overview - ROS Wiki
「ピアツーピア」ではコンピュータさんの役割が決まっていません。 すべてのコンピュータさんが必要に応じてサーバにもなればクライアントにもなるのです。
参考:http://wa3.i-3-i.info/word1306.html
ピアアドレスの確認
$ rosnode list -a
-> http://localhost:58031/ /rosout
これによってlocalhost:58031というピアアドレスが使用されていることがわかる
XML-RPC(eXtensible Markup Language Remote Procedure Cal)
まぁ「XML-RPC」って単語が出てきたら「XML形式のデータをHTTPでやり取りするんだな~」と、お考えください。
point通信プロトコルだよ
pointXML形式のデータをやり取りするよ
pointHTTPでやり取りするよ
pointPOSTメソッドを使ってやり取りするよ
参考:http://wa3.i-3-i.info/word15419.html
POSTメソッド
まぁ「POSTメソッド」って単語が出てきたら「見えない所に隠してサーバに送るんだな~」と、お考えください。
参考:http://wa3.i-3-i.info/word1496.html
TCP/IP通信のpython実装
client.py
# -*- coding:utf-8 -*- import socket host = "192.168.xxx.xxx" port = 2222 # 適当 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #オブジェクトの作成をします client.connect((host, port)) #これでサーバーに接続します client.send("from robonchu") #適当なデータを送信します(届く側にわかるように) response = client.recv(4096) #レシーブは適当な2の累乗にします(大きすぎるとダメ) print response
server.py
# -*- coding:utf-8 -*- import socket host ="192.168.xxx.xxx" port = 2222 # クライアントと揃える serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serversock.bind((host,port)) #IPとPORTを指定してバインドします serversock.listen(10) #接続の待ち受けをします(キューの最大数を指定) print 'Waiting for connections...' clientsock, client_address = serversock.accept() #接続されればデータを格納 while True: rcvmsg = clientsock.recv(1024) print 'Received -> %s' % (rcvmsg) if rcvmsg == '': break print 'Type message...' s_msg = raw_input() if s_msg == '': break print 'Wait...' clientsock.sendall(s_msg) #メッセージを返します clientsock.close()
UDP通信のpython実装
参考:Pythonでネットワークプログラミング | saito's memo
TODO
トピックの平均転送速度を求める
$ rostopic bw /turtle1/pose
トピックの配布速度を求める
$ rostopic hz /turtle1/pose
サービスの引数リストの表示
$ rosservice args /turtle1/set_pen