Help us understand the problem. What is going on with this article?

MPU6050をROS2で動かす

気づいたらクリスマスイブだった(過ぎてた)。

遅れてすみません、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についてめっちゃまとめられていて素晴らしかった。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした