気づいたらクリスマスイブだった(過ぎてた)。
遅れてすみません、ROS2 Advent Calender24日目の記事となります。
@youtalkさんのROS2本でROS2のお勉強をしていたのですが、せっかくだし何かしらROS2のパッケージを作りたいなと思い立って本記事を書きました。初心者なので「作ってみたよ」というだけの記事なってしまうかと思いますが、許してください...
使用する環境
ubuntu 18.04、ROS2 Dashing
MPU6050のROS2対応
以下のレポジトリを元に、ROS2へポーティングを行いました。ボードはArduinoです。事前に書込しておく必要があります。
シリアル通信をするにあたり、serialというパッケージが必要ですが、こちらのレポジトリにてROS2版が公開されてたので使用させて頂きました。
こちらにMPU6050のROS2コードを置いています。
インストールと動作確認
まずserialパッケージをcloneします。
$ cd ~/ros2_ws/src && git clone https://github.com/RoverRobotics-forks/serial-ros2
mpu6050のパッケージをcloneし、ビルドします。
$ git clone https://github.com/RyuYamamoto/mpu6050_serial_to_imu
$ cd ../ && colcon build
実際に起動して確認してみます。
$ ros2 run mpu6050_serial_to_imu mpu6050_imu_node
トピックが出てるか確認
$ ros2 topic echo /imu/data
こんな感じで出てたらOK
---
header:
stamp:
sec: 1577263533
nanosec: 749580149
frame_id: imu_link
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
orientation_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
angular_velocity:
x: -0.7456851052221867
y: 0.15978966540475428
z: 0.07989483270237714
angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
linear_acceleration:
x: 0.0622705078125
y: 0.0383203125
z: 9.60642333984375
linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---
ちょっとだけハマったところ
parameterの設定方法どうやるのかでちょっとだけハマった。ROS1だと
ros::NodeHandle nh("~");
nh.param<std::string>("frame_id", _frame_id, "imu_link");
とかで設定できた気がするけどROS2だと
auto node_handle = rclcpp::Node::make_shared("hoge_node");
node_handle->declare_parameter("frame_id", "imu_link");
node_handle->get_parameter("frame_id", _frame_id);
になるらしい。ノードを実行した段階で
$ ros2 topic list
/mpu6050_imu_node:
frame_id
port
tf_frame_id
tf_parent_frame_id
use_sim_tim
とするとパラメータの一覧をみることが出来る。ノードが持つパラメータの取得・設定は
$ ros2 param get /hoge_node foo
$ ros2 param set /hoge_node bar "hogehoge"
で行う。
(名前空間とパラメータ名くっつけるのかと思ったらそうじゃなくてここでもハマった)
ROS2ではroscoreが廃止され、パラメータサーバーをノードごとに持つようになった。上記のパラメータの設定はServer側だが、別ノードからClient経由してパラメータの取得・設定を行う場合はrclcpp::SyncParametersClientやrclcpp::AsyncParameterClientを用いて行うらしい(こちらを参照)。パラメータ取得・設定を同期・非同期で行うかどうかの違い。
(※今回コンポーネントで実装してみようとしたがコンパイル時にserial周りでこけてできなかった。主に共有ライブラリの生成部分でコケてる感じか)
まとめ
一個パッケージを作るとやっぱり理解が深まる気がしました。結構ROS1とROS2で書き方が違うけど、慣れてきたらROS2の方が書きやすいのかも。早く慣れたいところです。
ちょっと時間なくて姿勢推定のコードのROS2ポーティング間に合わなかったのでそこらへんは年末までにやりたい。あとeloquent移行したい。xmlでlaunchかけるのやっぱいいな。
参考
ROS2導入&レクチャー
→ROS2についてめっちゃまとめられていて素晴らしかった。