March 04, 2012

野沢 スキー

[Timely]

先日、野沢温泉にスキーに行ってきました。まずまずの天気でした。

2012_nozawa.jpg
(注)右下の板は違う方のです(笑)

今季はもう打ち止めな気がします。結局、5回(白馬五竜、水上、ガーラ(石内丸山)、高畑、野沢)です。一番滑ったのは高畑かな。穴場的なとても滑りやすいスキー場でした。次点は水上。

23:48 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/837

March 29, 2012

Super Sylphide 進捗状況(49) -- Sylphide通信プロトコル

ご無沙汰しています。オートパイロットシステム Super Sylphide、およびその後継機のTiny Featherでは、無線を使って地上からモニタおよび指令を行うことができますが、独自規格ながら通信データのプロトコルを定めて運用してきました。このたび @henshiru 氏がメインで開発していたSuper Sylphide用地上モニタソフトのMaeve(メイヴ)がオープンソース化(MIT Licenseだと思う)されたことを受けて、このプロトコルの話を少し書こうと思います。

maeve_screen_shot.jpg
動作中のMeave

世の中には色々なプロトコルがあるので、既存の規格にあわせることも考えたのですが、なかなかお手ごろなシンプルなものがありません。僕が欲しいと思ったのは、流れてくるデータを意味単位に切り分けられること、簡単なエラー検出、この2つがあればいいと思いました。エラー訂正など、より機能を充実させるためにはTCP/IP方式で、このプロトコルをさらに上位プロトコルで包んであげればよいという思想も背景にあります。

結局、独自規格として以下に定めるSylphideプロトコル(固定長と可変長の2タイプ)を定めました。

0/32bytes 固定長プロトコル

インデックス 内容
0 0xF7 (ヘッダ, 8bits)
1 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='0')
2, 3 シーケンス番号(2bytes)
(4 - 35) ペイロード(32 bytes)
(36, 37) or (4, 5 : ペイロードなしの場合) CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(3か35)まで)

N bytes 可変長プロトコル

インデックス 内容
0 0xF7 (ヘッダ, 8bits)
1 0xE (ヘッダ, 4bits) & 4 bits (ACK要求,ACK返答,ペイロード非所有,RESERVED='1')
2, 3 シーケンス番号(2bytes)
4, 5 ペイロードサイズ
(6 - (6 + (N - 1))) ペイロード(N bytes)
(6 + N, 6 + (N + 1)) CRC-16 2bytes (CRCの計算範囲はインデックス2から直前(6 + (N - 1))まで)

転送効率やエラー検出能力について詳細に検証したことはないのですが、これまで使ってきて大きな問題は発生していません。ちよっとした補足としては、ヘッダ(0xF7, 0xEX)については、ペイロードを調べて出現確率が最も低い組み合わせを算出しました。

現在、このプロトコルのパーサとしてC++版、およびJava版があります。拡張は簡単にできるよう、それぞれstd::[i/o]streamとJava.io.Filter[Input/Output]Streamに準拠させてました。なおJava版は、ある目的のために最近作ったもので、近いうちに成果物をださればよいなと考えています。

※次の進捗記事は、通信プロトコルのペイロードにあたる部分について書きました。

07:06 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/838