このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

TurtleBot の基本動作の確認

この例は、TurtleBot® の基本的な自律性を調べる上で役立ちます。記述された動作によりロボットは前方に駆動され、障害物があるとその向きを変更します。レーザー スキャン トピックをサブスクライブし、速度トピックをパブリッシュして TurtleBot を制御します。

必要条件: TurtleBot との通信

TurtleBot のハードウェア サポート パッケージ

この例では、ネイティブの ROS インターフェイスを使用した TurtleBot の操作の概要を示します。TurtleBot® ベースのロボット向けの Robotics System Toolbox™ サポート パッケージは、TurtleBot に対するより効率のよいインターフェイスを提供します。次を行うことができます。

  • ROS コマンドを明示的に呼び出すことなくセンサー データを取得し、制御コマンドを送信

  • Gazebo のシミュレートされたロボットまたは物理的な TurtleBot と透過的に通信

サポート パッケージをインストールするには、MATLAB® の [ホーム] タブで [アドオン]、[ハードウェア サポート パッケージの入手] を開いて、[TurtleBot-Based Robots] を選択します。あるいは、roboticsAddons コマンドを使用します。

TurtleBot への接続

Gazebo® でのシミュレーション内で、または実際のハードウェア上で TurtleBot が実行されていることを確認します。起動手順については、Gazebo およびシミュレートされた TurtleBot の入門または実際の TurtleBot 入門を参照してください。シミュレーションの実行にはいずれの Gazebo ワールドも機能しますが、この例の目的に関して最も興味深いのは Gazebo TurtleBot World です。

ROS を初期化します。ipaddress を TurtleBot の IP アドレスに置き換えて、TurtleBot に接続します。

ipaddress = '192.168.203.129'
ipaddress = 
'192.168.203.129'
rosinit(ipaddress)
Initializing global node /matlab_global_node_60181 with NodeURI http://192.168.203.1:50771/

ロボットの速度のパブリッシャーを作成し、そのトピックのメッセージを作成します。

robot = rospublisher('/mobile_base/commands/velocity');
velmsg = rosmessage(robot);

スキャン データの受信

実際の TurtleBot ハードウェアを操作する場合は、必ず Kinect® カメラを起動します。そのコマンドは roslaunch turtlebot_bringup 3dsensor.launch です。

TurtleBot のターミナルでこのコマンドを実行しなければなりません。TurtleBot は Kinect データを使用して、/scan トピックでパブリッシュされるレーザー スキャンをシミュレートします。この例の以降の部分で、"レーザー スキャン" という用語はこのトピックでパブリッシュされたデータを指します。

/scan トピックをサブスクライブします。

laser = rossubscriber('/scan');

1 つのレーザー スキャン メッセージの到着を待ってから、そのメッセージを表示します。

scan = receive(laser,3)
scan = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1×1 Header]
          AngleMin: -0.5216
          AngleMax: 0.5243
    AngleIncrement: 0.0016
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640×1 single]
       Intensities: [0×1 single]

  Use showdetails to show the contents of the message

figure
plot(scan);

エラーが表示された場合、レーザー スキャン トピックがデータをまったく受信していない可能性があります。シミュレーションを実行している場合は、Gazebo を再起動してみます。ハードウェアを使用する場合は、Kinect カメラが適切に起動されていることを確認します。

以下のコード行を実行します。これは 10 秒間、ライブのレーザー スキャン フィードをプロットします。TurtleBot の前方でオブジェクトを動かし、プロット ウィンドウに表示されなくなるまで近付けます。Kinect カメラのハードウェアの制限により、レーザー スキャンの探知距離は限られています。Kinect の最小検出距離は 0.8 m で、最大距離は 4 m です。この範囲外にあるオブジェクトは、センサーで検出されません。

tic;
while toc < 10
  scan = receive(laser,3);
  plot(scan);
end

シンプルな障害物回避

レーザー スキャンからの距離の読み取りに基づいて、シンプルな障害物回避アルゴリズムを実装できます。この動作を実装するには、シンプルな while ループを使用します。

処理ループで使用されるいくつかのパラメーターを設定します。異なる動作に対してはこれらの値を変更できます。

spinVelocity = 0.6;       % Angular velocity (rad/s)
forwardVelocity = 0.1;    % Linear velocity (m/s)
backwardVelocity = -0.02; % Linear velocity (reverse) (m/s)
distanceThreshold = 0.6;  % Distance threshold (m) for turning

ループを実行してロボットを前方に動かし、ロボットに最も近い障害物を計算します。障害物が distanceThreshold の範囲内になると、ロボットは向きを変えます。このループは実行時間 20 秒後に停止します。Ctrl + C キー (Mac では Control + C キー) でもこのループは停止します。

  tic;
  while toc < 20
      % Collect information from laser scan
      scan = receive(laser);
      plot(scan);
      data = readCartesian(scan);
      x = data(:,1);
      y = data(:,2);
      % Compute distance of the closest obstacle
      dist = sqrt(x.^2 + y.^2);
      minDist = min(dist);     
      % Command robot action
      if minDist < distanceThreshold
          % If close to obstacle, back up slightly and spin
          velmsg.Angular.Z = spinVelocity;
          velmsg.Linear.X = backwardVelocity;
      else
          % Continue on forward path
          velmsg.Linear.X = forwardVelocity;
          velmsg.Angular.Z = 0;
      end   
      send(robot,velmsg);
  end

ロボットからの切断

作業が終了したら、パブリッシャー、サブスクライバー、およびその他 ROS 関連のオブジェクトをワークスペースからクリアすることをお勧めします。

clear

ROS ネットワークでの作業が完了したら、rosshutdown を使用します。グローバル ノードをシャットダウンして TurtleBot から切断します。

rosshutdown
Shutting down global node /matlab_global_node_60181 with NodeURI http://192.168.203.1:50771/

詳細

レーザー スキャンには最小探知距離があり、前方にあるオブジェクトはそこで確認できなくなります。この最小値は、Kinect カメラから約 0.5 m ほどです。

レーザー スキャンはガラスの壁を検出できません。Kinect カメラからのイメージを次に示します。

これに対応するレーザー スキャンを次に示します。

ごみ箱は見えていますが、ガラスの壁は確認できません。TurtleBot で検出できない可能性のある窓や壁が存在する領域で TurtleBot を使用するときには、レーザー スキャンの限界に注意してください。

次のステップ

遠隔操作による TurtleBot の制御の例を参照してください。