HC-SR04の超音波の距離センサ(ultrasonic sensor)をサーボで左右に振ってROSで使える平面のレンジスキャナを作ってみます。
一般的なスキャナはレーザーレンジファインダ(LRF)ですが、定番であるhokuyoのURGなどは個人で遊ぶには高価で手が届きません。。(誰かちょうだい!)
作ってはみたものの、超音波センサの特徴として点ではなく面で応答が返ってくるため、部屋の角などを正確に計測することはできませんでした。
何かの参考になればと思い、記録として残しておきます。
コードは https://github.com/atotto/ultrasonic_scanner に置いておきました。
前提
- ROSがセットアップ済みであること
- 本記事ではubuntu 16.04、ROS kinetic (ros-kinetic-desktop-full)を利用
- arduinoが使えること
材料
- HC-SR04
- サーボ
- HC-04をサーボに取り付けるためのマウント
- HC-SR04とサーボ、マウントがセットになったのがあります→ amazon
- arduino (本記事ではUNO)
作り方
- HC-SR04をサーボに対して直角に取り付ける
- 図の通りに配線する
- スケッチをarduinoにアップロードする
動作確認
$ cd <your_catkin_ws>/src
$ git clone https://github.com/atotto/ultrasonic_scanner.git
$ cd ..
$ catkin_make
$ roslaunch ultrasonic_scanner ultrasonic_scanner_demo.launch
注意:
-
/dev/ttyUSB0
にパーミッションがない場合はsudo chmod 666 /dev/ttyUSB0
を実施してください
解説
arduinoでサーボを-90〜90の間を2度ずつ振り、90点のデータをシリアルでホストPCへ送信します。
ホストPCでarduinoからシリアルで送られてくるデータをROSのLaserScanのデータへ変換します。
(arduinoでROSSerialを使いたかったのですが、kineticのためかうまく動かせませんでした)
LaserScanデータを/scan
トピックでpublishし、rvizを使って視覚化します。
センサをサーボで左右に振るため、スキャンの方向をLaserScanのヘッダ情報を反転することで左右どちらからのスキャンデータでも活用できるようにしています。
1スキャンに4sec程度かかります。チューニング次第ではもう少し速くなるかも?
LaserScan型を利用し、/scan
トピックでpublishしているので、ROS上からはURGと同じように利用できます。
なんで作ったの?
ROS勉強してみた→せっかくだし自分で移動ロボットを組んでみよう→平面スキャナないとSLAMできないやん→LRF高い…→子供いるし安全な超音波の距離センサええやん→イマココ
独り言
LRF、なんで安くならないの。