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");
サブスクライバーがデータを返すまで待機し、そのデータを抽出して変数 x
、y
、z
に代入します。
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 の向きは、pose
の Orientation
プロパティに 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を参照してください。