Ubuntu18.04(Melodic)とUbuntu20.04(Noetic)で確認。(書き込みはWindows11からでも確認)
M5Stack BasicとM5Stack Gray (IMU搭載。もう売ってない)で確認。
設定は色々怪しいところがあり、ソースをいじるところがありますので、他のプログラムやマイコンを使っている人は気をつけてください。
2023年3月に古いM5Stack BasicとM5Stack IMUでrosserialを使いたい用途があったので利用しようとしたときに、コンパイルエラーやらアップロードできたと思ったら再起動しまくり?な現象が発生したのでメモを取ります。
・ライブラリを手動で入れない(gitからダウンロードしてコンパイルしてインストールするのはNG?)
・IMUを使うときにMPU9250のヘッダーのIFDEFの設定が間違った方の利用になってしまう。
・APP版のAruduinoIDEとソースダウンロードして入れたArduinoIDEのライブラリのバッティング。
・ボードマネージャで最新のものを使わない。(2023/03/23時点:esp32の1.0.6が現時点最新だけど、1.0.4を使う。2.0.6が最新の人は2.0.4を使う)
・rosserialのnodehandlerでsetBaudの設定をすると通信がおかしくなる。(なぜ?)
説明するまでもないのですが、どのインストール方法も良いです。ただし、削除せずに2種類の入れ方を試してしまうと最新の方にパスが通っているにも関わらず、ライブラリパスだけ残っているのか使っていない方にも同じヘッダがあります。。。みたいなエラーでコンパイルが通らないので、使っていない方のArduinoIDEのlibrariesディレクトリは思い切って削除してください。きちんとアンインストールできているならそんなことはしなくてOK。
コンパイルしたときにSD.hとかWifiClient.hでエラーが出ていたときはメッセージを見ると2つあるとエラーメッセージがあるので、使っていない方法ArduinoIDEのディレクトリにあるファイルを思い切って消してください。librariesディレクトリごと削除してもOKかも。消すのが怖い人は一時的に別の場所に移動してください。
古いM5Stackでrosserialを使うときは、すでにesp32のボードマネージャを入れている人も確認する必要がある。(と思う)
esp32を初めて使う人は、「ファイル(file)」ー>「環境設定(Preferences...)」を選んで出てきたウィンドウの「追加のボードマネージャのURL (Additional boards manager URLs:)」のところに下記のURLを記載してから「OK」ボタンを押してウィンドウを閉じる。
https://dl.espressif.com/dl/package_esp32_index.json (こっちはversion1系)
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json(こっちはversion2系:ROS2のmicro-rosを使うときはこっちが必須)
次に、ToolsからBoardのメニューを見てBoards Managerを選択する。
ボードマネージャの検索フィルタのところに「esp32」を入力。
おそらく1つしか出てこないので、バージョンを「1.04」に変更して「インストール」ボタンを押す。
1.06と1.0.5だとM5Stackがリブートしまくる?状態になります。
なお、2.0.6が最新の状態で表示される場合は、バージョンを「2.0.4」に変更してインストールしてください。
たまに、起動すると新しいバージョンがあるのでアップデートしますか?みたいな親切なことを聞いてきますが、必ず無視してアップデートをしないようにしてください。もしおかしくなっていたら、ボードマネージャでesp32を確認して、1.04より上のバージョンが入っていたら1.0.4を選び直してインストールをし直してください。
次は、M5Stackのライブラリのインストール
「ツール(Tools)」ー>「ライブラリを管理...(Manage Libraries...)」を選択して開いた画面で右上のとろこに「M5stack」と入力して出てきたライブラリをインストールします。いっぱいライブラリがヒットしますが、下の方にある画面のように「M5Stack」を選んでインストールボタンを押してください。現時点の最新バージョン0.4.3でも問題はありませんでした。
「インストール」ボタンを押した後に他の依存?関連?ライブラリも色々入れるか聞かれましたが、よくわからないので一応全部いれることにして「OK」をしています。(面倒なので検証していません)
すでにrosserialをコマンドでインストールしている人は、Arduinoのディレクトリの中にあるlibrariesディレクトリの下に
ros_libというディレクトリがあると思います。これを削除してください。
私の場合は、~/Arduino/librariesのディレクトリの中にros_libを作ってしまっていたので、普通に削除してしまえばOK。
(コマンドでインストールする方法は書きません。やらないほうが良いので。)
次に、ArduinoIDEを立ち上げて「ツール(Tools)」ー>「ライブラリを管理...(Manage Libraries...)」でライブラリマネージャのウィンドウを開いてから、検索キーワードに「rosserial」を入力してください。現時点で0.9.1が最新バージョンですが、これで問題はありませんでした。
M5Stack BasicやM5Stack IMuという初期の古いものを使うときにインストールしたライブラリの条件に合わないコンパイルが行われてしまうので、強制的に設定を変更するためにArduino/libraries/Rosserial_Arduino_Library/src/ros.hを修正します。
ros.hを開くと下記の条件文があります。
#if defined(ESP8266) or defined(ESP32) or defined(ROSSERIAL_ARDUINO_TCP)
#include "ArduinoTcpHardware.h"
#else
#include "ArduinoHardware.h"
#endif
ArduinoHardware.hの方を使いたいので、if文をコメントアウトして「#include "ArduinoHardware.h"」を記載します。
/* ここから
#if defined(ESP8266) or defined(ESP32) or defined(ROSSERIAL_ARDUINO_TCP)
#include "ArduinoTcpHardware.h"
#else
#include "ArduinoHardware.h" //これを使いたい
#endif
ここまでコメントアウト */
#include "ArduinoHardware.h" //これを追加
忘れずに保存してください。
これをやらないと、wifi設定の方を利用しようとする?らしく強制リブートループします。
上記設定がうまく言っているか確かめたいときは、スケッチ例のRosserial Arduino Libraryの中にあるプログラムで実行できるか確かめてください。
例えば、Rosserial Arduino LibraryのpubsubをM5Stackに書き込む。
書き込むときは、/dev/ttyUSB0の権限を変更しておくこと。
$ chmod 666 /dev/ttyUSB0
書き込み時のArduinoIDEのボード設定は「M5Stack-Core-ESP32」を選びました。
ROS側で下記を実行するとrostopic echoで情報が確認できる。
$ roscore #1つ目の端末
$ rosrun rosserial_arduino serial_node.py /dev/ttyUSB0 _baud:=57600 #2つ目の端末
$ rostopic echo /chatter #3爪の端末
上記を実行すると3つ目の端末に「data: "hello world!"」が1秒に1回表示される。
ボーレートは57600に設定すると調子がいい。setBaudでノードハンドラで設定して115200とか同じ数字なのに57600をプログラム上で設定すると通信がおかしくなる。
どこかにやり方書いているかもしれませんが、何も書かないで57600bpsで十分だったのでこのままです。
他のESP32を使いたい人はコンパイルする前に忘れずに設定を戻してください。
ArduinoIDEのライブラリでインストールしたUtilityのMPU9250用のヘッダで#define設定が重なっているらしくエラーでコンパイルできないので下記のように修正。
まず、「Arduino/libraries/M5Stack/src/utility」の中を確認して「MPU9250.h」を開いてください。
開いたら、
上から22行目に(2023/03/23現在では)下記の記載があると思います。
#define INFO 0x01
これを下記のように修正
#define AK8963_INFO 0x01
忘れずに保存してコンパイルするとエラーがなく書き込みできるようになります。
これは下記の参考ページのソースコードを利用すれば、/imuのトピックで加速度とジャイロのデータを受信できるようになります。
リンクのページのソースコードの「M5StackFire_MPU9250_ROS.ino」の157行目に
imu_msg.header.stamp = nh.now();
を追記すると時間も送信できるようになるので修正すると良いと思います。
以上です。