ロボット犬『Mini Pupperミニぷぱ』を BNO055で姿勢制御
前回まではラズパイ4でミニぷぱを楽しみました。
ここではまたマイコンによる制御に立ち戻って新たなIMUセンサを楽しみます。
目次
BNO055
以前はコントロールにATOM Matrixを用いて、内蔵のIMUセンサ MPU6886を用いて姿勢制御も楽しみました。
重力方向軸の回転角度 Yaw角を検出して床を回転させても常に同じ方向に旋回する制御も実施したかったのですが、MPU6886ではYaw角のドリフトがかなり大きく断念しました。
ここでは違うIMUセンサを採用してYaw角旋回制御を目指します。
6軸IMUのMPU6886がYaw角がとれないことはしょうがないのですが、同じ6軸でもMPU6050ではオフセット校正を施すと割とドリフトの小さいYaw角を得ることができます。
MPU6050を使用しても良かったのですがここでは9軸IMUセンサ BNO055を使ってみようと思います。
BNO055は正直内部でどういった処理をしているのか不明なのですが、正確な姿勢角を得ることができます。
以下のサンプルコードで校正や補正なしですぐに姿勢角を得ることができます。
https://github.com/adafruit/Adafruit_BNO055/blob/master/examples/rawdata/rawdata.ino
以下でIMUセンサを各種比較してますのでよろしければどうぞ
BNO055をミニぷぱに導入
以前のATOM Matrixの機構にBNO055を追加しても良かったのですが、MPU6886を搭載したATOM Matrixに更にIMUを追加するのが冗長でどうしても許せなかったのでコントローラにはATOM Liteを採用しました。
注意点
BNO055とはI2Cで通信するのですが、M5Stack ArduinoのM5Atom.hではI2Cピンを指定してAdafruit_BNO055ライブラリでのBNO055との通信ができませんでした。
ESP32でAdafruit_BNO055使いたいんだけどI2Cの設定の仕方わからん pic.twitter.com/umoCEu07O0
— HomeMadeGarbage (@H0meMadeGarbage) February 18, 2022
そこでここではM5Stack Arduinoライブラリは使用せずESP32 ArduinoライブラリでATOM Liteを使用することにしました。ESP32 ArduinoライブラリではI2Cピンを自由に指定してもBNO055と通信が問題なくできました。
ここではBNO055との通信はWire.begin(25, 21)で実施し、
サーボドライバ PCA9685とはWire1 .begin(22, 19)で実施しました。
これで問題なく動作を確認できました。
BNO055で姿勢センスできて
PCA9685でサーボ動かせて
Neopixel光らせる
理想のボードができた pic.twitter.com/6SyDj1cL3Y— HomeMadeGarbage (@H0meMadeGarbage) February 19, 2022
宴会芸
BNO055導入によって、正確な姿勢角を得ることが可能となりました。
ここではカルマンフィルタなど使用せず姿勢角の生データをそのまま使用しました。
BNO055が優秀で非常に楽です。
Yaw角を検出して旋回動作させて一方方向を保持する動作をさせてみました。
憧れの ぷぱぷぱ宴会芸#MiniPupper #ミニぷぱ #M5Stack #BNO055 pic.twitter.com/JvEYw2QWK9
— HomeMadeGarbage (@H0meMadeGarbage) February 19, 2022
いい感じ!!
以前仕込んだ動作も問題なくできています。
ATOM Lite版 ミニぷぱも非常に元気
ATOM Lite https://t.co/0BWKybiyvW #MiniPupper #ミニぷぱ #M5Stack #BNO055 pic.twitter.com/IFMrpkv6L7
— HomeMadeGarbage (@H0meMadeGarbage) February 19, 2022
床を傾けた時の足の高さでの平行制御もBNO055の姿勢角のみのP制御ですがスムーズに実現できています。
おわりに
ここでは9軸 IMUセンサ BNO055を用いてミニぷぱ制御を楽しみました。
BNO055が有能すぎて夢だったミニぷぱ宴会芸も実現できました!!
ミニぷぱがドンドン賢くなってくので大変嬉しいです!
引き続き勉強進めます!