最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

TurtleBot との通信

この例では、TurtleBot® プラットフォームについて、また、MATLAB® ユーザーが TurtleBot を操作する方法について説明します。具体的には、この例のコードでは、TurtleBot に対してメッセージ (速度など) をパブリッシュする方法と、TurtleBot がパブリッシュするトピック (オドメトリなど) をサブスクライブする方法を示します。

"この例を機能させるには、TurtleBot が動作していなければなりません。"

必要条件: Gazebo およびシミュレートされた TurtleBot の入門または実際の TurtleBot 入門

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

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

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

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

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

TurtleBot への接続

"TurtleBot が動作していなければなりません。"実際の TurtleBot を使用していて、実際の TurtleBot 入門のハードウェア設定手順に従った場合、ロボットは動作しています。シミュレーションで TurtleBot を使用していて、Gazebo およびシミュレートされた TurtleBot の入門の設定手順に従った場合は、デスクトップからいずれかの Gazebo® ワールド (Gazebo TurtleBot World など) を起動します。

ホスト コンピューター上の MATLAB インスタンスで、次のコマンドを実行します。ipaddress は、TurtleBot の IP アドレスに置き換えてください。この行により、ROS が初期化され、TurtleBot に接続します。

ipaddress = '192.168.203.129';
rosinit(ipaddress)
Initializing global node /matlab_global_node_43053 with NodeURI http://192.168.203.1:55724/

TurtleBot への接続に使用するネットワークが既定のネットワーク アダプターではない場合は、ロボットへの接続に使用するアダプターの IP アドレスを手動で指定できます。この状況が発生するのは、ワイヤレス ネットワークを使用していて、アクティブなイーサネット接続も存在する場合です。IP_OF_TURTLEBOT は TurtleBot の IP アドレスに、IP_OF_HOST_COMPUTER はロボットへの接続に使用するホスト アダプターの IP アドレスに置き換えてください。

rosinit('IP_OF_TURTLEBOT','NodeHost','IP_OF_HOST_COMPUTER');

次のコマンドを入力して、使用可能なすべての ROS トピックを表示します。

rostopic list

トピックが何も表示されない場合は、ネットワークが適切に設定されていません。ネットワークの設定手順については、このドキュメントの冒頭を参照してください。

ロボットの動作と音声の再生

/mobile_base/commands/velocity トピックに対してメッセージをパブリッシュすることにより、TurtleBot の動きを制御できます。メッセージは、タイプが geometry_msgs/Twist で、必要な線形速度と角速度を指定するデータが含まれていなければなりません。TurtleBot の動きは 2 つの異なる値で制御できます。X 軸に沿った線形速度は前後の運動を制御し、Z 軸を中心とする角速度はロボットのベースの回転速度を制御します。

TurtleBot の短時間の動きに使用する変数 velocity を設定します。

velocity = 0.1;     % meters per second

/mobile_base/commands/velocity トピックのパブリッシャーと、速度値を含む対応するメッセージを作成します。

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

velocity 変数に基づいてロボットの前方向の (x 軸に沿った) 速度を設定し、ロボットにコマンドをパブリッシュします。TurtleBot は前方向に少し移動してから停止します。

velmsg.Linear.X = velocity;
send(robot,velmsg);

安全上の理由から、TurtleBot は、/mobile_base/commands/velocity トピックで速度データを継続的に受信する場合にのみ動作を続けます。

velocity トピックによってパブリッシュされたメッセージのタイプを表示するには、以下を実行します。

rostopic type /mobile_base/commands/velocity
geometry_msgs/Twist

このトピックで想定されるメッセージのタイプは geometry_msgs/Twist ですが、これは、上記で作成した velmsg のタイプと同じです。

特定のトピックにパブリッシュおよびサブスクライブしているノードを表示するには、コマンド rostopic info TOPICNAME を使用します。次のコマンドは、velocity トピックのパブリッシャーとサブスクライバーのリストを表示します。MATLAB がパブリッシャーの 1 つとして表示されます。

  rostopic info /mobile_base/commands/velocity
Type: geometry_msgs/Twist
 
Publishers:
* /matlab_global_node_43053 (http://192.168.203.1:55724/)
* /mobile_base_nodelet_manager (http://192.168.203.129:45425/)
 
Subscribers:
* /gazebo (http://192.168.203.129:40018/)

オプション: 実際の TurtleBot を使用している場合は、音声コマンドを送信できます。

  soundpub = rospublisher('/mobile_base/commands/sound', 'kobuki_msgs/Sound')
  soundmsg = rosmessage('kobuki_msgs/Sound');
  soundmsg.Value = 6;      % Any number 0-6
  send(soundpub,soundmsg);

ロボットの位置と向きの受信

TurtleBot は、/odom トピックを使用して、現在の位置と向き (まとめて姿勢と表現) をパブリッシュします。TurtleBot には GPS システムが備えられていないため、姿勢は、ロボットの電源がはじめてオンになったときの姿勢と相対的に表現されます。

オドメトリ メッセージのサブスクライバーを作成します。

odom = rossubscriber('/odom');

サブスクライバーがデータを返すまで待機し、データを抽出して変数 x、y および z に割り当てます。

odomdata = receive(odom,3);
pose = odomdata.Pose.Pose;
x = pose.Position.X;
y = pose.Position.Y;
z = pose.Position.Z;

メモ: エラーが表示される場合は、receive コマンドがタイム アウトしている可能性があります。オドメトリがパブリッシュされていることと、ネットワークが適切に設定されていることを確認します。

x、y および z の値を表示します。

[x,y,z]
ans = 1×3

    1.8626   -0.0309         0

TurtleBot の向きは、四元数として変数 pose.Orientation に保存されます。quat2eul を使用して、より便利なオイラー角表現に変換します。ロボットの現在の向き、theta を度単位で表示するには、次の行を実行します。

quat = pose.Orientation;
angles = quat2eul([quat.W quat.X quat.Y quat.Z]);
theta = rad2deg(angles(1))
theta = 4.4540

イメージ データの受信

Kinect® カメラが動作していることを確認します。rostopic list を使用してトピックを再度表示すると、/camera から始まる多数のトピックが挙げられていることを確認できます。実際の TurtleBot ハードウェアの場合は、次のトピックが見つかります。

/camera/rgb/image_color/compressed

圧縮イメージ トピックをサブスクライブします。

if ismember('/camera/rgb/image_color/compressed', rostopic('list'))
    imsub = rossubscriber('/camera/rgb/image_color/compressed');
end

Gazebo を使用している場合は、トピック リストは異なります。代わりに次のトピックを使用してください。

/camera/rgb/image_raw

イメージの生のトピックをサブスクライブします。

if ismember('/camera/rgb/image_raw', rostopic('list'))
    imsub = rossubscriber('/camera/rgb/image_raw');
end

イメージ トピックをサブスクライブしたら、データを待ち、imshow を使用して表示します。

img = receive(imsub);
figure
imshow(readImage(img));

Kinect カメラからの実際のワールド イメージの例は次のようになります。

Kinect カメラからの継続的に更新されるイメージを表示するには、次の while ループを使用します。

tic;
while toc < 20
  img = receive(imsub);
  imshow(readImage(img))
end

ロボットからの切断

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

clear

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

rosshutdown
Shutting down global node /matlab_global_node_43053 with NodeURI http://192.168.203.1:55724/

次のステップ

TurtleBot の基本動作の確認の例を参照してください。