空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

ROSの基礎(通信編)

やりたいこと

ROSの復習がてら、基礎の部分で理解が浅い部分をまとめる

ピアツーピア設計方針

f:id:robonchu:20180126100735p:plain

参考: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実装

milestone-of-se.nesuke.com

参考:Pythonによる通信処理 - Qiita

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