はじめに
ROSで使いやすいIMUモジュールをさがしていたところ、Witmotion製のWT901CというモジュールがAmazonで入手できたので、ROS Noeticで動かしてみた。
ROSで使いやすいIMUの条件
- ROSパッケージが公開されている
- 9軸である(地磁気が使える)
- 姿勢(orientation)を内部で計算して出力してくれる
- シリアル通信でPCに直接接続して使える(SPIなどのI/Oが不要)
姿勢に関しては加速度と角速度の生データだけでは、sensor_msgs/Imuのorientationの情報をimu_filter_madgwick
などで自分で計算する必要があるので、モジュール内部でいい感じの値を推定して出力してくれた方が使いやすい。
また9軸に関しては平面を移動する自律移動ロボットにおいて最も重要なYaw角の姿勢情報がジャイロのみだと微妙なので、地磁気も搭載していた方がYaw角の推定精度が良い。
動作環境
OS : ubuntu20.04.3LTS
ROS : Noetic
動作確認用アプリ
Windows10
必要なもの
WT901C本体(RS232C版)
※同じ型番でRS485 Modbus版とTTL版があるので購入時に注意
USB - UART変換モジュール
(こちらは公式のものでなくても何でもよい)
WT901Cの動作確認
以下Windows10が必要
以下から公式のWindowsアプリケーションをダウンロード
Standard Software for Windows PC.zip
をダウンロードして解凍
MiniIMU.exe
をクリックして起動
3D
をクリックするとUnityアプリが立ち上がってモジュールを回転させると画面上のオブジェクトも回転する。
ROSで動かす準備
ROSパッケージのインストール
以下Witmotion IMUのROSパッケージをインストール
ros-ecl関係をインストール
$ sudo apt install ros-noetic-ecl*
wit_nodeのインストールとBuild
$ cd ~/catkin_ws/src
$ git clone https://github.com/yowlings/wit_node.git
$ cd ~/catkin_ws
$ catkin build
UARTの通信ボーレートの変更
先程のWindowsアプリから変更できる。
購入時のデフォルトのボーレート設定は9600bpsになっているが、ROSノード側では115200bpsになっている(include/parameter.hpp 8行目)。
そのため、WT901Cの設定を変更してボーレートを115200bpsに変更する。
(任意の通信速度で使用したい場合はこの部分を変更する)
- 上のconfigをクリック
- Communicationの欄からBaud RateとOutput Rateを選択して一番右のchangeをクリック
namespace wit {
class Parameter {
public:
Parameter() : port_("/dev/ttyUSB0"), baut_rate_(115200), ns("wit") {}
Pose Topicを出力するノードの作成(必要なら)
rvizのIMUプラグインは回転が分かりづらいので、imuトピックの回転をPoseStamped型に変換してPulishするノードを作成する。
#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import PoseStamped
from sensor_msgs.msg import Imu
def imu_callback(imu_msg):
ps_msg = PoseStamped()
ps_msg.header=imu_msg.header
ps_msg.pose.orientation=imu_msg.orientation
posestamped_pub.publish(ps_msg)
if __name__ == "__main__":
rospy.init_node("imu_to_pose")
#Publisher
posestamped_pub = rospy.Publisher("imu_pose", PoseStamped, queue_size=10)
#Subscriber
rospy.Subscriber("imu", Imu, imu_callback)
rospy.spin()
実行
PCにWT901Cを接続
実行権限を付与してlaunchファイルを実行
$ sudo chmod 777 /dev/ttyUSB0
$ roslaunch wit_node wit.launch
まずモジュールを動かしてIMUトピックの中身が変化しているかを確認
$ rostopic echo /imu
rvizで回転を見る
先ほど作成したPythonノードを実行
$ python3 imu_to_pose.py
rvizを起動してADD
からPoseを選択。
Topicで/imu_pose
を選択
ROS Noeticで9軸IMU WT901C使えるようになった#ros pic.twitter.com/SrcMaBhaES
— porizou (@porizou1) December 3, 2021
おわりに
ROSで使える9軸IMUとしてBNO055 などが有名であるが、近頃の半導体不足などの影響からか国内で入手しづらくなっている。
執筆時現在(2021/12/07)WitmotionのIMUモジュールはAmazonで簡単に入手できるようなのでROSで手軽に使えるIMUとしてWT901Cを検討してみてはどうでしょうか。
参考