今回はJetsonNanoにROS(Melodic)をインストールし、Jetbotを動かすところまで説明したいと思います。
参考サイト
今回は以下の記事の手順を参考にしています。
ROS nodes and Gazebo model for NVIDIA JetBot with Jetson Nano
Jetbot for ROS Rotsonを作ろう! Jetson NanoにROSをセッティングするよ
ROS(Melodic)のインストール
何はともあれ、まずはROS(Melodic)のインストールを行っていきます。今回はスクリプトなどを作成せずに一行ずつ丁寧に実行していきます。
ROS(Melodic)のインストール
ターミナルで以下のコマンドを実行し、ROS(Melodic)をインストールします。今回バージョンは「Melodic」を使用します。
1 2 3 4 5 6 7 8 9 10 11 |
sudo apt-add-repository universe sudo apt-add-repository multiverse sudo apt-add-repository restricted sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt-get update sudo apt-get install ros-melodic-ros-base sudo sh -c 'echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc' |
Adafruitライブラリをインストール
ターミナルで以下のコマンドを実行してAdafruitライブラリをインストールします。
1 2 3 4 |
sudo apt-get install python-pip pip install Adafruit-MotorHAT pip install Adafruit-SSD1306 |
ユーザーにi2cバスへのアクセスを許可します。
1 |
sudo usermod -aG i2c $USER |
catkinワークスペースを作成
catkinワークスペースを作成します。今回は「workspace」というフォルダの下に「catkin_ws」というワークスペースを作成しました。こちらのフォルダ名は任意で設定することができます。必要なパッケージやソースがあれば以下のワークスペースの中に格納していきます。
1 2 3 4 5 |
mkdir -p ~/workspace/catkin_ws/src cd ~/workspace/catkin_ws catkin_make sudo sh -c 'echo "source ~/workspace/catkin_ws/devel/setup.bash" >> ~/.bashrc' |
上記まで実行したら最後に再起動を行います。
ROSの起動確認
再起動したらターミナルを立ち上げてROSを起動させてみます。
1 |
roscore |
サンプル「turtlesim」の起動確認
新しいターミナルを起動させて以下を実行し、カメを表示できたら正常にROSが動いていることを確認できます。
1 |
rosrun turtlesim turtlesim_node |
キーボードでカメを操作してみます。新しいターミナルを起動して以下を実行すると矢印キーでカメを操作できるようになります。動かない場合はターミナルを選択してから動かしてみてください。
1 |
rosrun turtlesim turtle_teleop_key |
次はトピックに直接パブリッシュしてカメを操作してみます。以下を実行するとカメがグルグル回るようになります。
1 |
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2, 0.0, 0.0]' '[0.0, 0.0, 1.8]' |
トピックのパラメータについてはこちらの記事が分かりやすいのでご参照ください。
3D可視化ツール「RViz」の起動確認
3D可視化ツール「RViz」が起動するか確認してみます。
1 |
rviz |
バーチャルシミュレータ「Gazebo」のインストール
バーチャルシミュレータの「Gazebo」もよく利用するのでこちらもインストールしておきます。
1 2 3 |
sudo apt-get install ros-melodic-desktop-full sudo apt-get install ros-melodic-gazebo-ros-control sudo apt-get install ros-melodic-ros-control ros-melodic-ros-controllers |
バーチャルシミュレータ「Gazebo」の起動確認
バーチャルシミュレータ「Gazebo」が起動するか確認してみます。
1 |
gazebo |
Jetbotの環境構築
ROSのインストールまでは完了しましたので、次にJetbotの環境構築を実施していきます。ROSが起動している状態なら「Ctrl+C」で一度終了してしまいます。
以下を実行してROSのパスを確認してみましょう。
1 |
echo $ROS_PACKAGE_PATH |
jetson-inferenceの構築
jetson-inferenceリポジトリをクローンしてビルドします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo apt-get install git cmake cd ~/workspace git clone https://github.com/dusty-nv/jetson-inference cd jetson-inference git submodule update --init mkdir build cd build cmake ../ make sudo make install |
ros_deep_learningをビルドする
ros_deep_learningリポジトリをクローンしてビルドします。
1 2 3 4 5 6 7 |
sudo apt-get install ros-melodic-vision-msgs ros-melodic-image-transport ros-melodic-image-publisher cd ~/workspace/catkin_ws/src git clone https://github.com/dusty-nv/ros_deep_learning cd ../ catkin_make |
jetbot_rosをビルドする
jetbot_rosリポジトリをクローンしてビルドします。
1 2 3 4 5 |
cd ~/workspace/catkin_ws/src git clone https://github.com/dusty-nv/jetbot_ros cd ../ # cd ~/workspace/catkin_ws catkin_make |
jetbot_rosがインストールされたか確認
新しくターミナルを起動して以下を実行してみます。
1 |
rospack find jetbot_ros |
以下が表示されればjetbot_rosがインストールされていることになります。
1 |
/home/nvidia/workspace/catkin_ws/src/jetbot_ros |
jetbot_rosを動かす方法
新規ターミナルを起動させてROSを起動しておきます。
1 |
roscore |
Jetbotのモータを動かす
上記とは別にターミナルを立ち上げて以下を実行します。
1 |
rosrun jetbot_ros jetbot_motors.py |
これでROSのJetbotが動く状態になりましたので以下のコマンドを実行して動かしてみます。
1 2 3 4 5 |
rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "forward" rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "backward" rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "left" rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "right" rostopic pub /jetbot_motors/cmd_str std_msgs/String --once "stop" |
jetbot_motorsノードの補足
jetbot_motorsノードを実行すると以下のトピックをリッスンするようになります。ただし、現在は③のcmd_strメソッドのみが実装されているそうなので、例えば左右のモーターをそれぞれ動かしたいという場合は自分で実装する必要がありそうです。
トピック① /jetbot_motors/cmd_dir ⇒相対方位(度[-180.0, 180.0]、速度[-1.0, 1.0])
トピック② /jetbot_motors/cmd_raw ⇒生のL / Rモーターコマンド(速度[-1.0, 1.0]、速度[-1.0, 1.0])
トピック③ /jetbot_motors/cmd_str ⇒単純な文字列コマンド(左/右/前方/後方/停止)
ノードからJetbotを動かす
上記ではコマンドを直接入力してJetbotを操作しました。こちらだと多少物足りない感じがします。
なので別途ノードを作成し、その中にJetbotの動作を記述して動かしてみたいと思います。
まずは以下のディレクトリに移動して「publish_motor.py」というファイルを作成します。私は「nano」エディタをよく利用しているのでこちらで編集しています。nanoをインストールしていない方は他のエディタでファイルを作成してみてください。
1 2 |
cd ~/workspace/catkin_ws/src/jetbot_ros/scripts nano publish_motor.py |
ファイルの中身に以下を書き込んで保存します。処理としては「前進→後進→左旋回→右旋回→停止」の順でJetbotを動かすようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#!/usr/bin/env python import rospy from std_msgs.msg import String def run(): motor = rospy.Publisher('/jetbot_motors/cmd_str', String, queue_size=10) rospy.init_node('run', anonymous=True) print 'run:forward' motor.publish("forward") rospy.sleep(3.) print 'run:backward' motor.publish("backward") rospy.sleep(3.) print 'run:left' motor.publish("left") rospy.sleep(3.) print 'run:right' motor.publish("right") rospy.sleep(3.) print 'run:stop' motor.publish("stop") if __name__ == '__main__': run() |
ファイルを保存したらワークスペースまで戻ってビルドを再度実行します。rosを起動しっぱなしのときは「Ctrl+C」で停止してからビルドを行います。
1 2 |
cd ~/workspace/catkin_ws catkin_make |
これでノードからJetbotを動かす準備ができました。まずはマスタを起動しておきます。
1 |
roscore |
次にサブスクライブ側のノードを実行しておきます。
1 |
rosrun jetbot_ros jetbot_motors.py |
作成したパブリッシュ側のノードを実行します。これでJetbotが「前進→後進→左旋回→右旋回→停止」の順で動くと思います。
1 |
rosrun jetbot_ros publish_motor.py |
実際に動かしてみた様子がこちらです。左旋回と右旋回が逆になっていました。。配線を間違えていたかもしれないので確認する予定です。
JetbotにROSを導入して動かしてみました。 pic.twitter.com/rn1mKPGlsE
— Kazuki (@RoomKazuki) June 6, 2020
OLEDの点灯確認
次にOLEDの点灯確認も行ってみます。別のターミナルを立ち上げて以下を実行します。
1 |
rosrun jetbot_ros jetbot_oled.py |
さらに別のターミナルを立ち上げて以下を入力します。HELLOという文字が液晶に表示されることを確認します。
1 |
rostopic pub /jetbot_oled/user_text std_msgs/String --once "HELLO!" |
カメラを使う
「ros-melodic-image-view」をインストールしておきます。
1 |
sudo apt-get install ros-melodic-image-view |
1 |
rosrun jetbot_ros jetbot_camera |
1 |
rosrun image_view image_view image:=/jetbot_camera/raw |
コメントを残す