2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ROS2 robot_localizationがmap->odomをブロードキャストしている場所

2
Last updated at Posted at 2025-06-30

robot_localizationパッケージとは

コード:robot_localization
拡張カルマンフィルタ(EKF)や無香料カルマンフィルタ(UKF)を使って,センサ情報から自己位置推定を行うパッケージ
座標変換のtfをブロードキャストしてくれる.
(例)

  • odom->base_link
  • map->odom 

疑問

robot_localizationはどこでmap->odomをブロードキャストしているのか気になった.

なぜ知りたいと思ったか

(興味がない人は飛ばしてもらって大丈夫です)
robot_localization+(GPS+IMU+エンコーダ)を使って自己位置推定を行った.
"How to Use GPS With the Robot Localization Package – ROS 2"
を参考に,2つのekf_nodeとnavsat_transform_nodeを使って
map->odom->base_linkというtf構成を実現した.
mapフレームは
x=東,y=北, z=上
となっており,mapフレームは実際の地球と同じような座標系をしている.
だからmap->base_linkの角度は方位角にしたい.しかし,使っているIMUの都合上,方位角を取得できなかった.だからとりあえずmap->base_linkの初期角度は0として動かしてみた.感覚的には,ロボットが旋回してもその分だけmap->base_linkの角度が動くだけだと思っていた.しかし実際は動くにつれてmap->base_linkの角度が方位角に修正されていった.
つまり,パッケージがmap->odomのtfを修正して,角度を正しい方位角にしていた.
なんで修正できたのか…?
多分,GPSの動く方向から調整しているのだろうが,実際どうなっているのか気になった.

ブロードキャストを行っている場所

コードを全て追いたかったが,行数が多かった.そのためAIをつかって,変換をやっているところを探してもらった.map->base_linkとbase_link->odomのtfをかけて,map->odomの変換を得ていることが分かった.

src/ros_filter.cppの2180行~
else if (filtered_position->header.frame_id == map_frame_id_) {
        try {
          tf2::Transform world_base_link_trans;
          tf2::fromMsg(
            world_base_link_trans_msg_.transform,
            world_base_link_trans);//map->base_linkのtfをもらってくる.

          tf2::Transform base_link_odom_trans;
          tf2::fromMsg(
            tf_buffer_
            ->lookupTransform(
              base_link_frame_id_,
              odom_frame_id_,
              tf2::TimePointZero)
            .transform,
            base_link_odom_trans);//lookup_transformでbase_link->odomへの変換を探す.

          tf2::Transform map_odom_trans;
          map_odom_trans.mult(world_base_link_trans, base_link_odom_trans);

          geometry_msgs::msg::TransformStamped map_odom_trans_msg;
          map_odom_trans_msg.transform = tf2::toMsg(map_odom_trans);
          map_odom_trans_msg.header.stamp =
            static_cast<rclcpp::Time>(filtered_position->header.stamp) + tf_time_offset_;
          map_odom_trans_msg.header.frame_id = map_frame_id_;
          map_odom_trans_msg.child_frame_id = odom_frame_id_;

          world_transform_broadcaster_->sendTransform(map_odom_trans_msg);//ブロードキャスト
        } 

まとめ

robot_localizationは変換,逆変換を駆使してmap->odomをブロードキャストしている.

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?