Main Content

TurtleBot との通信

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

この例が機能するには、TurtleBot が実行されている必要があります。

前提条件:Gazebo およびシミュレートされた TurtleBot の入門または実際の TurtleBot の使用開始

TurtleBot への接続

TurtleBot が実行されている必要があります。実際の TurtleBot を使用しており、実際の TurtleBot の使用開始のハードウェア セットアップ手順に従った場合、ロボットは実行されています。シミュレーションで TurtleBot を使用しており、Gazebo およびシミュレートされた TurtleBot の入門のセットアップ手順に従った場合は、デスクトップから Gazebo® ワールドのいずれか (Gazebo Office など) を起動します。

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

ipaddress = "http://192.168.178.133:11311";
rosinit(ipaddress)
Initializing global node /matlab_global_node_88195 with NodeURI http://192.168.178.1:59934/

TurtleBot への接続に使用しているネットワークが既定のネットワーク アダプターでない場合は、ロボットへの接続に使用するアダプターの IP アドレスを手動で指定できます。このような状況は、無線ネットワークを使用しているもののイーサネット接続もアクティブである場合に見られることがあります。IP_OF_TURTLEBOT を TurtleBot の IP アドレスに置き換え、IP_OF_HOST_COMPUTER をロボットへの接続に使用するホスト アダプターの IP アドレスに置き換えます。

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

次を使用して、使用可能なすべての ROS トピックを表示します。

rostopic list

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

ロボットの移動

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

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

velocity = 0.1;     % meters per second

/cmd_vel トピックと速度の値を含む対応するメッセージのためのパブリッシャーを作成します。パフォーマンス向上のために、構造体形式メッセージを指定したパブリッシャーを使用します。

robotCmd = rospublisher("/cmd_vel","DataFormat","struct") ;
velMsg = rosmessage(robotCmd);

変数 velocity に基づいてロボットの ("X" 軸に沿った) 前進速度を設定し、コマンドをロボットにパブリッシュします。少しの間動いてから停止するようにします。

velMsg.Linear.X = velocity;
send(robotCmd,velMsg)
pause(4)
velMsg.Linear.X = 0;
send(robotCmd,velMsg)

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

rostopic type /cmd_vel
geometry_msgs/Twist

このトピックではメッセージ タイプが geometry_msgs/Twist である必要があります。これは、上で作成した velMsg のタイプと正確に一致します。

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

  rostopic info /cmd_vel
Type: geometry_msgs/Twist
 
Publishers:
* /matlab_global_node_88195 (http://192.168.178.1:59934/)
 
Subscribers:
* /gazebo (http://192.168.178.133:39227/)

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

TurtleBot は /odom トピックを使用して、その現在の位置と向き (まとめて姿勢として表わされる) をパブリッシュします。TurtleBot は GPS システムを備えていないため、その姿勢は、ロボットが最初にオンになったときの姿勢を基準とします。

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

odomSub = rossubscriber("/odom","DataFormat","struct");

サブスクライバーがデータを返すまで待機し、そのデータを抽出して変数 xyz に代入します。

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

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

"x""y""z" の値を表示します。

[x y z]
ans = 1×3

   -2.6176    1.0007   -0.0010

TurtleBot の向きは、poseOrientation プロパティに quaternion として格納されます。quat2eul (Robotics System Toolbox)を使用して、より便利なオイラー角の表現に変換します。ロボットの現在の向き theta を度単位で表示するには、次の行を実行します。

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

LiDAR データの受信

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

lidarSub = rossubscriber("/scan","DataFormat","struct");

LiDAR トピックをサブスクライブしたら、データを待機してから rosPlot で表示します。

scanMsg = receive(lidarSub);
figure
rosPlot(scanMsg)

ロボットが短時間で向きを変える間の LiDAR スキャンの更新を継続的に表示するには、次の while ループを使用します。

velMsg.Angular.Z = velocity;
send(robotCmd,velMsg)
tic
while toc < 20
  scanMsg = receive(lidarSub);
  rosPlot(scanMsg)
end

velMsg.Angular.Z = 0;
send(robotCmd,velMsg)

ロボットからの切断

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

clear

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

rosshutdown
Shutting down global node /matlab_global_node_88195 with NodeURI http://192.168.178.1:59934/

次のステップ

次の例Explore Basic Behavior of the TurtleBotを参照してください。