この記事は私が金沢工業大学ロボティクス学科で担当している講義ロボットプログラミングⅡ用です。シミュレータGAZEBOを使い、Turtlebot3を動かします。次のTurtleBot3 Official Wikiを参考にしています。
0. VirtualBoxの3Dアクセラレーション無効化
VirtualBox->設定->ディスプレイ->3Dアクセレーション有効化のチェックを外す。
この作業をしてからVirtualBoxを起動しないとシミュレータを起動できません。
1. Turtlebot3 リモートPC用のパッケージインストール
まず、Turtlebot用のパッケージをインストール。端末を開き、次のコマンドを実行。2番目は長いのでコピペする。$はコマンドプロンプトなので入力しない。
$ sudo apt-get update
$ sudo apt-get install ros-kinetic-joy ros-kinetic-teleop-twist-joy ros-kinetic-teleop-twist-keyboard ros-kinetic-laser-proc ros-kinetic-rgbd-launch ros-kinetic-depthimage-to-laserscan ros-kinetic-rosserial-arduino ros-kinetic-rosserial-python ros-kinetic-rosserial-server ros-kinetic-rosserial-client ros-kinetic-rosserial-msgs ros-kinetic-amcl ros-kinetic-map-server ros-kinetic-move-base ros-kinetic-urdf ros-kinetic-xacro ros-kinetic-compressed-image-transport ros-kinetic-rqt-image-view ros-kinetic-gmapping ros-kinetic-navigation
$ cd ~/catkin_ws/src/
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
$ cd ~/catkin_ws && catkin_make
2. シミュレータのインストール
$ cd ~/catkin_ws/src/
$ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
$ cd ~/catkin_ws && catkin_make
3. rvizの起動
端末を開き次のコマンドを実行
$ export TURTLEBOT3_MODEL=burger roslaunch turtlebot3_fake
$ turtlebot3_fake.launch
別の端末を開き、次のコマンドを実行
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
演習1で実施したようにキーボードでROSの視覚化ツールrviz上でturtlebot3を動かせます。動かしてみましょう!
4. Simulator GAZEBOを動かそう
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
初回はネットからモデルを取得するので、私の環境で5分程度かかった。しばらくすると次のようなウインドウが開く。下のロボットがturtlebot3。
別の端末を開き、次のコマンドを入力するとキーボードからロボットを操縦するためのlaunchファイルを起動。
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
端末に下のように表示される。w a s d x , .キーでロボットを操作できる。いずれかのキーを押してロボットを動かそう!マウスのカーソルがturtlebot3_teleop.launchを起動した端末上になければ動かないので注意。
3. キーボードから動かすプログラムを作ろう!
次に、キーボードからロボットを操縦するmy_teleopパッケージを作ろう。
ROS演習2と同じ要領でmy_teleopパッケージを作る。忘れた人はROS演習2を見ながらやろう。今週の例ではhello, hello_nodeをmy_teleopに置き換える。
以下のプログラムはmy_teleop.cpp。なお、このプログラムはトピック通信のpublisher(配信者)プログラムの簡単な例になっている。プログラムの説明はソースコード内のコメントを参照。テキストエディタ(gedit)にコピペして名前を付けて保存。
保存ディレクトリは~/catkin_ws/src/my_teleop/srcの中。
#include "ros/ros.h" // rosで必要はヘッダーファイル #include <geometry_msgs/Twist.h> // ロボットを動かすために必要 using namespace std; int main(int argc, char **argv) { ros::init(argc, argv, "my_teleop"); // initでROSを初期化し、my_teleopという名前をノードにつける // 同じ名前のノードが複数あるとだめなので、ユニークな名前をつける ros::NodeHandle nh; // ノードハンドラの作成。ハンドラは必要時に起動される。 ros::Publisher pub; // パブリッシャの作成。トピックに対してデータを送信。 ros::Rate rate(10); // ループの頻度を設定。この場合は10Hz、1秒間に10回数、1ループ100ms。 geometry_msgs::Twist vel; // geometry_msgs::Twist この型は並進速度と回転速度(vector3:3次元ベクトル) を合わせたもので、速度指令によく使われる pub= nh.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop", 10); // マスターにgeometry_msgs::Twist型のデータを送ることを伝える // マスターは/cmd_vel_mux/input/teleopトピック(1番目の引数)を購読する // 全てのノードにトピックができたことを知らせる(advertise)。 // 2番目の引数はデータのバッファサイズ std::cout << "f: forward, b: backward, r: right, l:left" << std::endl; while (ros::ok()) // このノードが使える間は無限ループ { char key; // 入力キーの値 cin >> key; cout << key << endl; switch (key) { case 'f': vel.linear.x = 0.5; break; case 'b': vel.linear.x = -0.5; break; case 'l': vel.angular.z = 1.0; break; case 'r': vel.angular.z = -1.0; break; // linear.xは前後方向の並進速度(m/s) // angular.zは回転速度(rad/s) } pub.publish(vel); // 速度メッセージを送信 ros::spinOnce(); // コールバック関数を呼ぶ vel.linear.x = 0.0; // 並進速度の初期化 vel.angular.z = 0.0; // 回転速度の初期化 rate.sleep(); // 指定した周期でループするよう寝て待つ } return 0; }
では、以下のコマンドでビルドして実行しよう。
$ cd ~/catkin_ws
$ catkin_make
先ほどの、roslaunch turtlebot3_teleop keyboard3_teleop.launch の代わりに、次のコマンドを実行する。keyboard3_teleop.launchを起動した端末は閉じる。
$ rosrun my_teleop my_teleop
f, b, l, rキーでロボットが移動したら成功。キーを押した後はエンターキーを押す。お疲れ様!
終わり