こんにちは!!
ご存じの方も多いかもしれないのですが…
この数か月、ロボットの自立走行制御プログラムの作成で、ROSという開発プラットフォームを使って仕事をさせてもらっております(◦ω◦ )
つい先日もその関連で出張があったのですが……
今回は、このロボット制御の中で出てきてかなり悩んだ機材との通信をざっくりまとめておこうと思います
※ アイキャッチ画像はROSですが、ROSに限ったことではありません
これまで、ほぼほぼWEBの開発しかしてなかったので、
そんな基本的なことかーいっ、って言われそうですけど、お付き合いください笑
接続方法
今回出てきた接続方法はこんな感じ
- シリアル通信 ……よくわからないけれども、どうやら機材に送る電気のon/offでデータを送るらしい。
- ソケット通信 …… TCP/IP通信。聞いたことはある。
すでにあるロボット制御プログラムの改変、という仕事だったので、手元にほわっとした通信プログラムのサンプルはあったのですが、特にシリアル通信で悩みました……
シリアル通信
旧コードを読んでいたところ、どうやら、シリアルポートとボードレート(通信速度)?を指定して通信するらしい。あと、ネットを見たところ、どうやら機材に送る電気のon/offでデータを送るらしい。
二進数いやだなぁ、と思いながら、使う機材の説明書を見ました。
……?
どうやら、
- 1 ~ 16 bitに割り当てられた役割があるらしい。
- “アドレス”があって、アドレスごとに役割があるらしい
- サンプルコードは”0x”から始まる数字が書かれている。16進数な気がする
基本情報で16進数-2進数の使われ方~、みたいなのは読んだなぁと思ったんですけど、まぁ初見ではつながりませんでした。
仕様書の書き方には機材ごとに差はありそうですが、基本的には、シリアル通信の中身は2進数なようです。
2進数で発信するとなると、可読性が…とかなんですかね?
今度からは、2進数めんどくさいなぁと思っても、シリアル通信が来たら16進数でも10進数でも、これは2進数…普段見知った数字ではない…2進数を変換してるだけ…on/offのデータだ…と、意識しないとなぁ…と思いました
まぁ、仕様書で0x8D、とか書かれても所見ではこれは2進数で…とはならないですよね。ね…?(0xで始めるとそれ以下の文字が16進数の扱いになる、とかも初めて知りました)
このことを教えていただいてから、10進数バージョンの機材との接続にも出会いましたが、2進数で考えたら難なくいけました!!基本情報やっててよかったです。今まで、WEBだけだったからなんであんなに進数の変換とかしてたんだろうなぁ、とか思っててごめんなさい、ってなりました。笑
ちなみに、実際にコードで一番詰まっていたのは、
シリアル通信で使用する、
ボードレートは通信する機材同士で一致させなければならない、
ということを知らなかったことにありました。最初にちゃんとシリアル通信を調べてなかったせいですね笑
適当に設定して、Connectは成功、というメッセージが出ていたので疑っていませんでした。
(16進数の件については、仕様書を開いて1日ぐらい悩んで、これは無理!ってなって聞いたので…。もっと早く聞けばよかった。)
コード自体はC++で、シリアル通信用のライブラリを使いました
そんなに難しくはなかったはず……。指令の送信はwriteでいいのか??と迷いましたが、それ以外にないですしね笑
使いやすかったです
ソケット通信
こっちは今のところ、そんなに困って混乱して…とかはあまりないですね
参考にできるコードがあったからというのもあると思います
また何かあればまとめてみたいなぁと思います。
今回は以上です……!
そういえば、改行時の表示幅が減ったような気がしますね……。
まぁいいんですけど。