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の変換を得ていることが分かった.
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をブロードキャストしている.