Open5

「第2版 ROS2とPythonで作って学ぶAIロボット入門」をやってみよー!

kakimochikakimochi

この記事は

  • 「第2版 ROS2とPythonで作って学ぶAIロボット入門」をさわって動かしてみる記録です
  • 興味の向くままに進めるので、本のChapterをすっ飛ばしたり、記載のないことを試したりします
  • ま、やってみよー!
  • ホストOSは「Ubuntu22.04」でやる (mac/Windowsはなぜかなにかとdockerのセットアップでつまづく
kakimochikakimochi

第1章 AIロボットをつくろう!

  • dockerインストール
    • じぶんは、もともとセットアップ済みのUbuntuで始める
    • UbuntuPCない人は、下記オプションもいいかもしれない
      • ラズパイにUbuntuインストール:おうちのそこらへんに転がってるラズパイを使う、動作重たいけどまあ動けば理解できるっしょ
      • https://www.theconstruct.ai/ :ROS2学習用にクラウド環境が使える、どこまで無料かよく知らない、ロボットの求人もあるw

  • dockerイメージのpull:
    $ sudo docker pull airobotbook/ros2-desktop-ai-robot-book-humble:latest
    
    でpullする。16.6GBダウンロードを待つ。

  • dockerイメージの確認
    下記にいるね、OK
$ sudo docker images
REPOSITORY                                          TAG                                                      IMAGE ID       CREATED         SIZE
airobotbook/ros2-desktop-ai-robot-book-humble       latest                                                   0380d72bdbae   6 days ago      16.6GB

ちなみに、このdocker imageを削除するには下記コマンド。
IMAGE IDの上4桁で指定。"rmi"は"remove image"なのかな、知らんけど。

$ sudo docker rmi 0380

  • dockerコンテナの起動
    • Dockerコンテナの起動 に便利な起動スクリプトがあるけど、
      中身わかりたい流派なので、下記コマンドで起動する。
      会社環境じゃない人はproxy設定なくても大丈夫かもしれない。
sudo docker run \
-e http_proxy=${http_proxy} \
-e https_proxy=${https_proxy} \
-e no_proxy=${no_proxy} \
-e HTTP_PROXY=${HTTP_PROXY} \
-e HTTPS_PROXY=${HTTPS_PROXY} \
-e NO_PROXY=${HTTPS_PROXY} \
-e RESOLUTION=1920x1080 \
--name ai_robot_book \
-p 6080:80 \
--shm-size=512m \
--privileged \
$* \
airobotbook/ros2-desktop-ai-robot-book-humble:latest
  • dockerコンテナ起動の確認
$ sudo docker container ls
CONTAINER ID   IMAGE                                                  COMMAND                  CREATED         STATUS         PORTS                                   NAMES
87cbccb06568   airobotbook/ros2-desktop-ai-robot-book-humble:latest   "/bin/bash -c /entry…"   3 minutes ago   Up 3 minutes   0.0.0.0:6080->80/tcp, :::6080->80/tcp   ai_robot_book
  • ブラウザアクセスの確認
    • じょーん

ちなみに、コンテナ起動うまくいかなくてオプション足したり引いたりしてdocker runの試行錯誤をした。
同じ名前のコンテナはrunできないので、sudo docker runしたターミナルで ctrl+c でコンテナ止めてから、

sudo docker stop ai_robot_book
sudo docker rm ai_robot_book

していちどコンテナ削除したら、オプション変えて sudo docker runを試行錯誤した。


  • dockerコンテナstop
    下記コマンドでブラウザでみえていたクラゲのデスクトップが切断される。

    $ sudo docker stop ai_robot_book
    
  • dockerコンテナstart
    下記コマンドでログイン画面が再び表示される。クラゲのデスクトップがみえるようになる。

$ sudo docker start ai_robot_book

大事なこと

dockerは仮想環境なので、コンテナをちゃんとstopしたりsaveしないと、コンテナ内でさっきまで書いていたファイルが消えたり戻ったりする。
ホストOSのボリュームをマウントするなど回避する方法はあるけど、まずは「仮想環境はセーブしないと消える」、そういうものだと思ってほしい。ゲームみたいだね。


  • 環境変数の確認

    • ターミナルを1つひらく
    • bashの環境変数をチラ見しておく
      $ cat ~/.bashrc
      ... (一部抜粋)
      export DONT_PROMPT_WSL_INSTALL=1
      export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
      source /usr/share/gazebo/setup.sh
      export TURTLEBOT3_MODEL=happy_mini
      export WORKSPACE_ROOT=~/airobot_ws
      source /opt/ros/humble/setup.bash
      source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash
      source ~/airobot_ws/install/setup.bash
      
  • サンプルを起動する

    • ターミナルを1つひらいて、下記を入力。これを起動したまま。
$ ros2 launch simple_arm_description display.launch.py
  • 起動した!

  • ノードの起動、トピックを確認

    • もう一つターミナルをひらいて、下記を入力
$ ros2 node list
/joint_state_publisher
/robot_state_publisher
/rviz2
/transform_listener_impl_55d9133aa730
$ ros2 topic list
/clicked_point
/goal_pose
/initialpose
/joint_states
/parameter_events
/robot_description
/rosout
/tf
/tf_static
ubuntu@87cbccb065

ふむふむ

kakimochikakimochi

第2章 はじめてのROS2

  • 初版本にはなかった「アクション通信」のサンプルコードを動かしてみる

  • おれはC++でいく (書籍はPython)

  • パッケージ作成

# ros2 の環境変数読み込み
$ source /opt/ros/humble/setup.bash

# ワークスペース作成
$ mkdir -p <workspace>/src
$ cd <workspace>/src

# パッケージ作成
$ ros2 pkg create --build-type ament_cmake --node-name my_amr_node my_amr_package
going to create a new package
package name: my_amr_package
destination directory: /mnt/hdd/ai-robot-book-humble/amr_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['XXX <XXXXXXX@XXX.com>']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
node_name: my_amr_node
creating folder ./my_amr_package
creating ./my_amr_package/package.xml
creating source and include folder
creating folder ./my_amr_package/src
creating folder ./my_amr_package/include/my_amr_package
creating ./my_amr_package/CMakeLists.txt
creating ./my_amr_package/src/my_amr_node.cpp

[WARNING]: Unknown license 'TODO: License declaration'.  This has been set in the package.xml, but no LICENSE file has been created.
It is recommended to use one of the ament license identitifers:
Apache-2.0
BSL-1.0
BSD-2.0
BSD-2-Clause
BSD-3-Clause
GPL-3.0-only
LGPL-3.0-only
MIT
MIT-0
  • ビルドしてみる
$ cd <workspace>
$ colcon build
Starting >>> my_amr_package
Finished <<< my_amr_package [1.17s]                     

Summary: 1 package finished [2.29s]
  • 実行してみる
# ビルドしたら、下記コマンドでビルドしたnodeを読み込む
$ source ./install/setup.bash
$ ros2 run my_amr_package my_amr_node
hello world my_amr_package package