RoboMasterS1を解析してROSで動かせるように頑張ってみる（購入前準備編）

#はじめに
最近DJIから発売されたRoboMasterS1が、ロボットの自律移動開発のプラットフォームとしてとても使えそうということで、まずは以下の動画をご覧ください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">DJI - ROBOMASTER S1 紹介映像 <a href="https://t.co/bLQRJOxWl2">https://t.co/bLQRJOxWl2</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; Tatsuya Ishikawa (@tatsuyai713) <a href="https://twitter.com/tatsuyai713/status/1162757539882127362?ref_src=twsrc%5Etfw">August 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
これ単体で遊ぶだけでも十分面白いわけですが、このメカナムホイールの安定した走行には正直びっくりします。

まあでもこれを改造しようだなんてそうそう思わないわけです。なんせ6万円もしますので。。。

#きっかけはこの記事
まあそう思ってたわけですが、こんな記事が出てしまったんです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">機体内の通信にはCAN-BUSを採用している。<br>機体内の通信にはCAN-BUSを採用している。<br>大事なことなので2回言いました😎<br><br>DJI、戦車型教育用ロボット「RoboMaster S1」体験会を実施。レースや対戦でプログラミングを楽しく学べる - PC Watch <a href="https://t.co/kEh8jW5A33">https://t.co/kEh8jW5A33</a></p>&mdash; Tatsuya Ishikawa (@tatsuyai713) <a href="https://twitter.com/tatsuyai713/status/1161092943567941632?ref_src=twsrc%5Etfw">August 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
CAN-BUS通信ということであれば、モータードライバー基板を改造するとかそんな不可逆な改造ではなくてケーブルをつなげるだけでROSと繋がるんじゃないかと考えたわけです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ふむふむ🤔<br>やるならインテリジェントコントローラーの接続をブリッジしてmROSでCANーROS変換やな😎 <a href="https://t.co/kJPfv9bibX">pic.twitter.com/kJPfv9bibX</a></p>&mdash; Tatsuya Ishikawa (@tatsuyai713) <a href="https://twitter.com/tatsuyai713/status/1161177240232587271?ref_src=twsrc%5Etfw">August 13, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#システム構成を考える
基本的にCAN-BUSポートがあったとしても、そこから制御信号を送り込んで制御を乗っ取ることはできません。だいたいのCAN通信（車とか）は周期的に信号のやり取りをしているため、指示の信号を上書きするということができないからです。
では、どうするべきかというとCAN-BUSといえば車なので、車のHackの方法を調べてみればよいのです。
で、かの有名なOpenPilotの方式を取ることにしました。
https://github.com/commaai/openpilot
簡単に言うとインテリジェントコントローラーが出しているCANを解析して、それて同じものを別のUnitから出力すれば良いというわけです。
ただこれだけだと、スマートフォンからの操作などの通常の操作が全くできなくなります。なので、必要なときだけ、信号を乗っとって、それ以外は通常動作とするために以下のようなシステム構成で行こうと思います（これでいけるかは、そもそももってないのでしらない
![無題 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179542/122c381f-a4f6-bd75-5336-cc160522897c.jpeg)

#DJIのCANってどうなってるん
車のCANに関しては、先ほどのOpenPilotでいろいろと解析されていることもあり、乗っ取ることもできるわけですが、そもそもDJIのCANがどうなっているかを調べないといけません。

CANの通信については詳しくは他の記事に譲るとして、一般的に使われている方法では、大雑把に言うとブロードキャストだけのEthernetみたいなもんです（雑）
もうちょっと詳しく言うと、CANのデータフレームにはIDがあり、そのIDの数字の小さいものが送信優先度が高く、CANの通信に流すことができます。そして、CANのネットワーク上に存在するUnitすべてがそのメッセージを読むことができる仕組みとなっているので、全員が優先度をつけてブロードキャストしまくっているという構図になります。

なので、まずやるべきことは、はじめから備わっているCANポートから通信内容を盗み見ることになります。実際にやるのは以下の手順です。

1.ネットワークに流れているCAN IDのリストを作る（OpenPilotではFinger Printと呼んでいるようです）
2.ユニットを一個ずつ外していって、どのIDがなくなるかを調べることで、送信しているユニットを特定する
3.インテリジェントコントローラーの送信しているIDがわかれば、前進・旋回などのコマンドを送ってみて、その際のCANのデータの変化をみて、データ配置を決める
4.CANのメッセージ内にChecksumやインクリメントするカウンターが存在しないか確認する
5.もしChecksumなどがあればそれの計算式を頑張って推定する（絶望）

ただ、さすがのDJIでも、RoboMasterS1のためだけにCANのデータフォーマットのルールを決めたりするとは思えません。なので、Droneで使われているCANメッセージを解析している人がいるようなので、これも参考にしながら解析することになります。
https://www.rcgroups.com/forums/showthread.php?2071772-DJI-NAZA-Phantom-A2-CAN-bus-communication-protocol-NazaCanDecoder-Arduino-library
ちなみにCANのデータの解析自体は違法性はないと言われています。理由は、そもそも暗号化されていないものを見ているだけなので、違法もへったくれもないということです。車のCANはこれから暗号化が進むようですが、暗号化されるとそれを解読するのはほぼ不可能としても、暗号を解除するようなことは不正競争防止法？に抵触するかもしれません（間違ってたらすみません・・）

#まだまだつづくよ
とりあえず、ざーーーーとまとめてみました。
次はmROSを使ってCANとROSの世界を通信する方法について書きたいと思います（うまく行けばですが・・・）