LoginSignup
7
8

More than 1 year has passed since last update.

2章.ロボットを操作する

Last updated at Posted at 2020-01-29

本章の流れ

本章では以下の様な流れで書かせて頂きます。
 1. ROS対応の操作デバイス一例
 2. ROSで動かす際のnodeとtopicの概要 
 3. 1章でROS対応されたロボットの概要
 4. デバイスで操作している時のnodeの動き
 5. ROS topic通信によるロボット制御
ロボットの操作.png

実施環境

OS   : Ubuntu16.04LTS. , Ubuntu18.04LTS.
ROS環境 : kinetic , melodic
対象PC :LattepandaAlphaによる動作(Intel Core m3-7y30 程度の動作)を想定

1. ROS対応の操作デバイス一例

ROSに対応したデバイスは様々あり、ロボットを操作する上で大変助けになります。
ここでは私が使ったデバイスは以下の①〜④となります。それら①〜③の操作を行うに当たり、
ROS wikiにあるteleop_toolsとても役立ちました!
そのインストール方法と操作方法について説明します。

ROS wiki : teleop_tools

teleop_toolsインストール方法
cd ~/catkin_ws/src
git clone git https://github.com/ros-teleop/teleop_tools.git
cd ..
catkin_make

【デバイスの操作方法】
 ①キーボード :キータッチによる限られた方向の動作を出力するため、テスト走行を
        する際に距離や移動量を確認したするには便利。開発初期(調整
        作業時)に役立ちます。

キーボード操作 コマンド

rosrun teleop_tools key_teleop.py

 ②マウス :ウィンドウ内をマウスポインタでクリックしながら動かす。アナログ的な
       値でlinear.x方向直進)angle.z方向(旋回)を出力する。軽量に出来て
       いるためヌルヌル動かせます。使い易い。

マウス操作 コマンド

rosrun mouse_teleop mouse_teleop.py mouse_vel:=cmd_vel

 ③ジョイスティック :Dualshock4(PS4コントローラ)など、アナログスティックが
           2個以上あるジョイスティックであれば、でlinear.x方向
           (直進)、angle.z方向(旋回)に加え、linear.y方向(水平)も
           扱うことができ、メカナムホイールロボットやクアッドコプター
           などの操作にも使えます。ただし、キーの割り当てが必要
           (config.yamlを書き換えること)になります。また意外と沢山の
           操作内容がソースに含まれているため、topicの配信周期が少し
           遅くなる場合もあり、修正して簡素化するのも良さそうです。

ジョイスティック操作 コマンド
roslaunch joy_teleop example.launch

 

 
【その他 面白いデバイス】
④LeapMotion :人の手の動きを認識できる。手の位置やジェスチャによって操作
         することが出来ますが、簡単に扱える(/cmd_velをpublishして
         くれる)nodeがROS wiki等にないため、自分でnodeを作る
         (ライブラリを参考にして書き換える)必要があります。
 

2. ROSで動かす際のnodeとtopicの概要

 今回作成したロボットにおいてROSの機能としてtopic通信を使っています。このtopic通信によって様々な動作を実現しています。そのtopicの受け渡し方法について、概要を自分なりに書きます。
 まずは、ROS masterと呼ばれる管理機能(メッセージやサービスを登録、検索してくれたりする機能)があり、そこに複数のnodeと呼ばれる処理プロセスが繋がっています。topic通信の場合、nodeからはメッセージ(topic)が配布(publish)され、ROS masterに登録されます。これに対し購読(subscribe)したいnodeはROS masterで検索してメッセージ(topic)に書かれている内容を取得しています。

             ROS masterとnodeの関係
pub_sub1.png
ここでメッセージを配布するnodeをpublisher,メッセージを購読するnodeをsubscriberなどと呼び、publisher、subscriberと言った役割を持った複数の処理プロセス(node)が分散処理されながら動いています。時には一つのnodeが複数のpublisherやsubscriberになったりしますが、あまり役割が多すぎると負荷が大きくなってしまうため、なるべく小分けにした方が分散処理の恩恵を受けられると考えています。

3. 1章でROS対応されたロボットの概要

 先程のnodeとtopicの概要に対し、1章で作成したArduinoスケッ(mecanum_wheel_control.ino)によって、rosserialと言うnodeが作られます。今回作ったrosserial nodeはsubscribeとpublish両方の役割を持っています.

1章.ロボットのROS対応

【node名】
rosserial 

【topic名】
subscribe側:
/cmd_vel ←ロボットに対し要求される速度を読みに行く

publish側:
/tf   ←ロボットの位置座標を送る
/odometry ←ロボットの位置座標+速度を送る

     Arduinoスケッチから作り出されたrosserial nodeについて
rosserial.png

4. デバイスで操作している時のnodeの動き

【topicに準じたロボットの動作内容について】
 ①各デバイスのnodeから/cmd_velと言うtopicがpublishされる。ちなみに下図はキーボードで
  操作した時を想定し、kerboard_teleopと言うnodeが/cmd_velをpublishしています。
 ②rosserial nodeが操作したい速度の情報(/cmd_vel)を読み込む(subscribe)
 ③/cmd_velに書かれている速度情報に沿ってArduinoで演算し、モータ回転速度に
  変換した後モータへ出力する(Arduino内でモータ出力する)。

       topic:/cmd_velとnodeのやり取り(キーボード操作時)

cmd_vel1.png

 ④今回のロボットではステッピングモータを使っているため、モータが回転した分
  だけのステップパルスの量を記録して、ロボットの移動量、移動スピードを
  計算します(Arduino内で演算します)。
 ⑤先程の①とは変わって、今度はrosserialがpublisherとなり、ロボットの移動量より
  /tf(座標値)を送ります。
 ⑥/tfと同様にロボットの移動量+移動スピードより/odometryと言うtopicを
  送ります(publish)。

 ⑦ ⑤,⑥によってrosserialからは/tfと/odometryがpublishされ、グラフィック表示
  (rvizを使うことが)出来るようになります。rvizについては次章で更に説明します。

  ちなみにグラフィック表示する場合そのままrvizと打ち込めば動きます。

rvizの表示
rviz

          topic:/tf,/odometryとnodeのやり取り
tf1.png

5. ROS topic通信によるロボットの操作

 ここまでの状況からROSのtopic通信を使うことで、ロボットをかなり充実したデバイスで
 操作することが出来ます。まずこれが基本になると考えております。

             ROS topic通信による動作実現
topicによる動作実現1.png

次は3章.LiDARを動かす

次はLiDARを動かしてみます。様々な方向の角度と距離を一瞬で測長できるデバイスは
正しくロマンです!こうご期待!
3章.LiDARを動かす

今までの道のり

作って分かった「ROSを使う前のロボットと、ROSを使った後のロボットの変化」

序章 : ROSを使った自動航行ロボットをつくるまでの道のり ー序章 概要ー
前章 : 1章.ロボットのROS対応

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8