No version for distro humble showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro jazzy showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro kilted showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro lyrical showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro rolling showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro galactic showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro iron showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro melodic showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).
No version for distro noetic showing github. Known supported distros are highlighted in the buttons above.

Repository Summary

Description
Checkout URI https://github.com/rsasaki0109/kalman_filter_localization.git
VCS Type git
VCS Version devel
Last Updated 2026-10-24
Dev Status UNKNOWN
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

Kalman Filter Localization

Real UrbanNav Odaiba GNSS, IMU and wheel-speed data replayed through the ROS 2 ESKF

Real UrbanNav Odaiba data (MIT) · actual ROS 2 output · reference-seeded initialization. Reproduce the real-data demo · Full measured results and assumptions · Synthetic 6DoF demo

A 6DoF error-state EKF for ROS 2, fusing IMU, absolute pose and velocity observations, with GNSS and odometry input modes. It estimates position, velocity, attitude, and IMU biases.

Development target: a general 6DoF localizer for Autoware and Nav2. See the integration contracts and roadmap for current capabilities, TF ownership and remaining replacement requirements. Autoware/Nav2 launch and activation provides runnable entry points with topic/service remappings and startup instructions.

Localization pipeline

Features

  • GNSS pose / NavSatFix / Doppler velocity
  • Gyroscope and accelerometer bias estimation
  • GNSS NIS gating and Huber/Cauchy robust losses
  • GNSS antenna lever arm and delayed-measurement rewind/replay
  • Wheel speed, NHC, ZUPT, and ZIHR
  • Continuous-time process noise and second-order discretization
  • CSV evaluation and UrbanNav Tokyo ablation tools

Build and run

source /opt/ros/$ROS_DISTRO/setup.bash
colcon build --symlink-install
source install/setup.bash
ros2 launch kalman_filter_localization ekf.launch.py

Main topics:

Direction Topic Type
input /ekf_localization/initial_pose geometry_msgs/PoseStamped
input (optional, configured) pose_measurement_topic geometry_msgs/PoseWithCovarianceStamped
input (optional, configured) twist_measurement_topic geometry_msgs/TwistWithCovarianceStamped
input /gnss_pose geometry_msgs/PoseStamped
input /sensing/imu/imu_data sensor_msgs/Imu
input /wheel_speed (optional) geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_pose geometry_msgs/PoseStamped
output /ekf_localization/current_pose_with_covariance geometry_msgs/PoseWithCovarianceStamped
output /ekf_localization/current_twist geometry_msgs/TwistStamped
output /ekf_localization/current_twist_with_covariance geometry_msgs/TwistWithCovarianceStamped
output /ekf_localization/current_odometry nav_msgs/Odometry

Health and typed diagnostics are always published:

Topic Type Purpose
/ekf_localization/status kalman_filter_localization_msgs/EstimatorStatus health, mode, freshness, counters, covariance summary
/ekf_localization/diagnostics diagnostic_msgs/DiagnosticArray standard ROS diagnostic status
/ekf_localization/debug/measurement_quality_typed kalman_filter_localization_msgs/MeasurementQuality accepted/rejected measurement and NIS
/ekf_localization/debug/observability_typed kalman_filter_localization_msgs/ObservabilityStatus stationary, turning/slip, NHC scale, bias learning
/ekf_localization/debug/replay_timing_typed kalman_filter_localization_msgs/ReplayTiming sensor/arrival/filter/apply timing

The legacy Float64MultiArray debug topics remain available when publish_debug_topics is enabled. The typed interfaces are defined in the separate kalman_filter_localization_msgs package and are intended for monitoring tools and long-term API use. Detailed field definitions and health-state transitions are in docs/diagnostics.md.

An optional joint 6DoF pose input preserves correlated position/attitude covariance, transforms reference frames at the sensor timestamp, and supports delayed replay and six-dimensional NIS gating. The linear Twist input adds correlated 3D velocity observations with sensor-origin transport and replay. Pose freshness is monitored independently of IMU arrival. Twist axes can be selected for forward-speed-only inputs. See initialization and reset for full correlated initial covariance and the reset service.

See ekf.yaml for the default parameters and param/profiles for dataset-specific configurations.

Configuration diagnosis

Run kf_doctor before tuning a new bag. It discovers common GNSS/IMU/wheel/odometry topics, checks sensor timestamps, frame IDs, covariance validity, IMU rate and stationary-window statistics, then writes a machine-readable report and a conservative profile skeleton:

ros2 run kalman_filter_localization kf_doctor \
  --bag input_bag \
  --output-report .data/doctor/report.json \
  --output-profile .data/doctor/profile.yaml

Fixed-lag smoothing oracle

File truncated at 100 lines see the full file

CONTRIBUTING

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that license.

Any contribution that you make to this repository will be under the BSD license 2.0, as dictated by that [license](https://opensource.org/licenses/BSD-3-Clause).