Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]
Messages
Services
Plugins
Recent questions tagged autoware_gyro_odometer at Robotics Stack Exchange
Package Summary
| Version | 1.10.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/autowarefoundation/autoware_core.git |
| VCS Type | git |
| VCS Version | main |
| Last Updated | 2026-10-07 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Yamato Ando
- Masahiro Sakamoto
- NGUYEN Viet Anh
- Taiki Yamada
Authors
- Yamato Ando
autoware_gyro_odometer
Overview
autoware_gyro_odometer is the package to estimate twist by combining imu and vehicle speed.
Design
autoware_gyro_odometer is part of the perception or localization stack, providing reliable motion estimates for navigation and control. It is designed to estimate the robot’s motion by combining vehicle twist data (linear and angular velocities) with angular velocity measurements from an IMU (Inertial Measurement Unit).
Data Handling and Synchronization:
- Message Queues: Uses queues to store vehicle twist and gyro messages to ensure data synchronization.
-
Message Timeouts: Checks for message timeouts to discard stale data, preventing incorrect estimations.
Error Checks and Logging:
- Timeout Handling: Logs errors and clears queues if messages exceed a defined time threshold.
- Transformation Checks: Verifies that TF transforms between IMU and base frames are available; logs errors if not.
Data Processing:
- Transformation: Converts gyro data into the base frame using TF to ensure accurate angular velocity measurements.
- Mean and Covariance Calculation: Averages multiple measurements to reduce noise and calculates covariances to represent data reliability.
Output and Publishing:
- Twist Estimation: Constructs output messages with estimated twist values and covariances.
- Stationary Handling: Zeros out certain twist components when the robot is stationary to avoid noise.
Inputs / Outputs
Input
| Name | Type | Description |
|---|---|---|
vehicle/twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
twist with covariance from vehicle |
imu |
sensor_msgs::msg::Imu |
imu from sensor |
Output
| Name | Type | Description |
|---|---|---|
twist_with_covariance |
geometry_msgs::msg::TwistWithCovarianceStamped |
estimated twist with covariance |
Parameters
{{ json_to_markdown(“localization/autoware_gyro_odometer/schema/gyro_odometer.schema.json”) }}
Assumptions / Known limits
-
[Assumption] The frame_id of input twist message must be set to base_link.
-
[Assumption] The covariance in the input messages must be properly assigned.
-
[Assumption] The header stamps of the two input topics are mutually comparable, i.e. produced by synchronized clocks. Staleness is judged between the inputs’ stamps, not against this node’s clock, so a pair whose stamps agree with each other is fused no matter how late it reaches this node; handling such delay is left to the consumers of the output (e.g. the EKF delay gate).
-
[Assumption] The angular velocity is set to zero if both the longitudinal vehicle velocity and the angular velocity around the yaw axis are sufficiently small. This is for suppression of the IMU angular velocity bias. Without this process, we misestimate the vehicle status when stationary.
-
[Limitation] The frequency of the output messages depends on the frequency of the input IMU message.
-
[Limitation] We cannot produce reliable values for the lateral and vertical velocities. Therefore we assign large values to the corresponding elements in the output covariance matrix.
Diagnostics

| Name | Description | Transition condition to Warning | Transition condition to Error |
|---|---|---|---|
topic_time_stamp |
the time stamp of service calling. [nano second] | none | none |
is_arrived_first_vehicle_twist |
whether the vehicle twist topic has been received even once. | not arrive yet | none |
is_arrived_first_imu |
whether the imu topic has been received even once. | not arrive yet | none |
vehicle_twist_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest vehicle twist stamp. [second] | none | the time is longer than message_timeout_sec
|
imu_time_stamp_dt |
the time difference between the newer of the two topics’ latest stamps and the latest imu stamp. [second] | none | the time is longer than message_timeout_sec
|
vehicle_twist_queue_size |
the size of vehicle_twist_queue. | none | none |
imu_queue_size |
the size of gyro_queue. | none | none |
is_succeed_transform_imu |
whether transform imu is succeed or not. | none | failed |
is_frame_id_consistent |
whether the two input topics carry the same frame_id. |
none | the two inputs carry different frames |
Changelog for package autoware_gyro_odometer
1.10.0 (2026-09-28)
-
Merge remote-tracking branch 'origin/main' into tmp/bot/bump_version_base
-
test(gyro_odometer): reorganized test suite (#1444) The logic class can now be tested without a ROS context, so ten scenarios move from the node suite to the logic suite and the superseded node suite is deleted. New tests cover the frame check and the staleness and standstill boundaries. The node suite now asserts the diagnostics level alone. No production file is touched.
-
feat(gyro_odometer): added frame consistency check and diag report (#1424)
* refactor(gyro_odometer): make OutputData a struct The four output messages were a tuple, so every caller had to know the order. Named fields say which message is which at the point of use.
* feat(gyro_odometer): check the shared frame assumption and report it The previous PR made "both inputs use the same frame" an assumption of the logic class. This adds the check and reports the result as a new diagnostics entry, is_frame_id_consistent, with an ERROR naming the frame the output is expected in.
* refactor(gyro_odometer): derive the reported ages instead of storing them latest_vehicle_twist_dt_ and latest_imu_dt_ were written in concat_gyro_and_odometer() and read again in take_status(). They are now locals, and take_status() works them out from the two latest stamps. The reported values do not change. Both are computed from the same two stamps, and the arrival flags never go back to false, so the only state where concat() skips the computation is the one before both sides have arrived, where the reported age was zero either way.
* refactor(gyro_odometer): move transform_covariance to its only caller The node applies it to the IMU sample it has just transformed, and nothing in the logic class calls it. It moves next to transform_imu(), and its test moves with it. What the logic class expects of an IMU sample is now stated on input_imu(). ---------
-
test(gyro_odometer): wait for connections and fused output (#1434) Wait for topic connections before the node tests publish their inputs. Repeat the fusion inputs until output arrives, with a five-second deadline. This handles callback order when the node discards samples before both inputs arrive.
-
feat(localization): add node designs for the pose/twist estimation nodes (#1409)
* feat(localization): add node designs for the pose/twist estimation nodes Declare NdtScanMatcher, EkfLocalizer, GyroOdometer, StopFilter and Twist2Accel node designs, with remap_target set to each node's hardcoded topic and service names, and extend PoseInitializer with the map, GNSS, stop-check inputs and the align/trigger/partial-map-load clients that pose_initializer.launch.xml remaps. These let a system designer module compose the localization stack directly from nodes.
* feat(localization): describe node designs and bump to format 0.4.0 ---------
-
feat(gyro_odometer): remove TF and the node clock from the logic class (#1398)
* test(gyro_odometer): pin what the reported transform status depends on The node transforms each IMU sample into the output frame before the logic class receives it. A sample the node cannot transform is skipped. The logic class no longer deals with TF. An input is now stale when the two latest stamps differ by more than message_timeout_sec. Before, each stamp was compared against the node clock. The input functions no longer take a current time, so GyroOdometer receives messages only. Two effects are visible on the twist topics. An IMU sample that cannot be transformed no longer drops the pending vehicle twist, and the next usable sample fuses with it. Two inputs whose stamps agree with each other are fused even when they reach the node late. ---------
-
refact(gyro_odometer): extracted logic part, which still uses TF inside (#1389)
* refactor(gyro_odometer): extract logic class still keeping transform_listener logic class still uses transform_listener directly, so dependency remains
* refactor(gyro_odometer): inject the gyro-queue transformation as a callback Replace the TransformListener argument with a std::function callback, so gyro_odometer.hpp no longer names any ROS or TF type. The lookup moves to a free function in the node layer; the sequence and behaviour are unchanged.
* refactor(gyro_odometer): take message_timeout_sec in the
File truncated at 100 lines see the full file
Package Dependencies
System Dependencies
| Name |
|---|
| fmt |
Dependant Packages
Launch files
- launch/gyro_odometer.launch.xml
-
- input_vehicle_twist_with_covariance_topic [default: /sensing/vehicle_velocity_converter/twist_with_covariance]
- input_imu_topic [default: /sensing/imu/imu_data]
- output_twist_raw_topic [default: gyro_twist_raw]
- output_twist_with_covariance_raw_topic [default: gyro_twist_with_covariance_raw]
- output_twist_topic [default: gyro_twist]
- output_twist_with_covariance_topic [default: gyro_twist_with_covariance]
- config_file [default: $(find-pkg-share autoware_gyro_odometer)/config/gyro_odometer.param.yaml]