はじめに
Teensy4.1でROS2を使うための環境構築を書いていきます.マイコンでROS2を使う場合,micro-ROSとros2arduinoを使うことになると思いますが,その2つの違いについて触れます.
Teensyduinoのインストール
こちらを読んでね
teensy4.1完全に理解した
ROS2の通信
まず,ROS2の通信方式についてです.
プロトコルにMicro-XRCE-DDSを使用し,基本的に通信方式はTCPまたはUDP通信です.つまり,Wi-FIまたは有線LANということです.他にはSerial通信が使用できます.
USB Serialは有線LANよりも低速となりますので,高速通信が必要な場合は有線LANが必要になるでしょう.
Teensy4.1のイーサネット
Teensy4.1にはLANポートが使用できます.Arduinoや他のマイコンではイーサネットシールドやWIZNETなどの追加基板が必要になります.
公式のLANポートはこちらから購入が可能です.
しかし,輸入ものなので時と場合により高額のときがあります.
イーサネットポート,もっと言うとRJ45 MagJackがあればいいのでもっと安く,早く済むはず!
例えば,Sparkfunが販売しているこれ
しかし,LANポートの配線は統一化されていないので,公式のLANポートと同じピンに配線しても通信は出来ません.LANポートはトランスの塊で素人が見ても意味不明.等価回路をつくることも大変です.
公式がこれで,
https://www.pjrc.com/store/ethernet_kit.html
SparkFunのがこれ
Sparkfun RJ45 MagJackデータシート
わけわかめですね.
と思いきや,Sparkfunの製品で配線している方がいました.神
https://forum.core-electronics.com.au/t/wiring-teensy4-1-to-magjack/8598
LANポートを安く実装したい方は是非参考にしてみて下さい.
micro-rosとros2arduino
micro-rosはマイコンでROS2を動かすために開発されているミドルウェアです.Renesusも力入れています
ros2arduinoはArduinoでROS2を動かすためのライブラリです.とはいえ,Arduino IDEが幅広いマイコンをサポートしているため,Arduino以外のマイコンでros2arduinoを動作させることができます.
何が違うのか
まず,対応しているROS2のバージョンが違います.
ros2arduinoはROS2 Dashingまでのサポート,Micro-XRCE-DDSはv1.3.0です.
一方,micro-rosは開発が精力的であり,現在の(2021/12/13) ROS2 の最新バージョンGalacticまでサポートしています.
次に,ros2arduinoはArduinoなどのマイコンだけを対象としていますが,micro-rosはその名の通り最小限のROS2のことで位置づけもROS2と同じく「ミドルウェア」であり,「ライブラリ」のros2arduinoとは違います.
使いやすさ
安定感は,サポートが終わっているDashingを対象としているros2arduinoでしょう.これ以上の発展はありませんから,変更もありません.一方で,将来性と構築のしやすさはmicro-rosです.Dockerコマンド一つでAgentが入るのが魅力的です.最新バージョンまでサポートしているため,使いやすくなったROS2ライブラリも実装できます.
今回は,モダンなROS2のバージョンまで入るmicro-rosをTeensy4.1にインストールします.
micro-rosをインストール
基本的に公式のREADMEを見ていけば大丈夫です.
https://github.com/micro-ROS/micro_ros_arduino
Arduino IDEを使う場合
Arduino環境にmicro-rosのライブラリのZIPをダウンロードするだけです.以下リンク先の「Source code (zip)」をダウンロードして,Arduino IDEのSketch -> Include library -> Add .ZIP Library...
を選択し,ダウンロードしたZIPファイルを選択します.
https://github.com/micro-ROS/micro_ros_arduino/releases
出来るならパッチも当てましょう.
$ export ARDUINO_PATH=[Your Arduino + Teensiduino path]
$ cd $ARDUINO_PATH/hardware/teensy/avr/
$ curl https://raw.githubusercontent.com/micro-ROS/micro_ros_arduino/galactic/extras/patching_boards/platform_teensy.txt > platform.txt
PlatformIOを使う場合
PlatformIOでは,まずはボードをTeensy4.1を選んでプロジェクトを作ります.
その後,platformio.iniファイルに以下のように,lib_depsにmicro-rosのGitHubリポジトリを含めれば大丈夫です.
[env:teensy41]
platform = teensy
board = teensy41
framework = arduino
upload_protocol = teensy-cli
lib_deps = https://github.com/micro-ROS/micro_ros_arduino
build_flags =
-L ./.pio/libdeps/teensy41/micro_ros_arduino/src/cortex-m7/fpv5-sp-d16-hardfp/
-l microros
platformio.iniを書いたあと,以下コマンドでライブラリをプロジェクトにインポートします.
$ pio lib install # Install dependencies
あとは普通にアップロードすれば大丈夫です.と思いきや,自分の環境ではトピックが受信できませんでした.要検証
micro-ros-agentのインストール
Micro-ROSのAgentをDockerでダウンロードします.
# Serial micro-ROS Agent
docker run -it --rm -v /dev:/dev --privileged --net=host microros/micro-ros-agent:galactic serial --dev YOUR_BOARD_PORT -v6
YOUR_BOAD_PORTはTeensy4.1が接続されているポートを選択します.以下コマンドなどでわかります.
$ lsusb
または
$ dmesg
だいたいは /dev/ttyACM0 だと思います.
これで準備はできました.
テストラン
試しに動作確認をしてみましょう.
ここでは,Arduino IDEで書き込みを行ないます. ファイルー>スケッチ例ー> 互換性なしー>micro_ros_arduinoー>micro-ris_pubscriber
を開き,Teensy4.1に書き込みます.
次に,Teensy4.1を繋いでいるUSBを一度抜き,再度ラズパイに刺して下さい.すると,コンソール上に信号が来ていることが確認できるはずです.
別に新しくターミナルを開いてROS2も起動してみましょう.下記コマンドを打つとROS2 Galacticが起動します.ホストにインストール済みであればDockerで起動する必要はありません.ちなみに,Dockerの場合は--net=host
オプションは必須ですのでお忘れずに.
$ docker run -it --rm --privileged --net=host osrf/ros:galactic-desktop
ROS2が起動したら以下のコマンドを打ってTeensy4.1から来ているトピックを確認しましょう.
ros2 topic listコマンドを打つと,/micro_ros_arduino_nodeというトピックが来ていると思います.
$ source /opt/ros/galactic/setup.bash
$ ros2 topic list
$ ros2 topic echo /micro_ros_arduino_node
data: 1
data: 2
........
と,表示されれば成功です.
おめでとうございます!Teensy4.1のROS2のノードから送られてくるトピックを読み取ることができました!
ROS2がTeensy4.1で動かすことができましたので,次はサーボを動かすことにも挑戦しましょう.