Replies: 4 comments 7 replies
-
|
Thank you for the proposal. |
Beta Was this translation helpful? Give feedback.
-
|
Hi. Thank you for the proposal. I am considering dividing the role of initial position estimation into global position estimation and local position estimation, allowing the user to choose which method to use or whether to use none at all for each. I am envisioning the structure of the launch parameters as follows: ※ In the case of And the structure of the ADAPI service as follows: I believe it would be simpler and clearer to explicitly let the user specify which estimation method they want to use, rather than relying on whether the covariance is zero or not. Please let me know if you have any feedback. @xmfcx @yukkysaito @mitsudome-r |
Beta Was this translation helpful? Give feedback.
-
|
I am not conviced the On the other hand, using the covariance can definitely lead to unexpected behavior. For example, imagine the user gets a |
Beta Was this translation helpful? Give feedback.
-
|
If we can implement the functionality of directly using GNSS position for initial position estimation without making significant changes to the existing structure, I agree with @SakodaShintaro 's suggestion |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Proposal for Simplifying Pose Initialization in Autoware
The current pose initialization architecture in Autoware is complex and contains redundant parameters. Specifically, the use of an explicit
methodparameter in theInitializeLocalization.srvservice leads to unnecessary complexity.This proposal aims to simplify the initialization process by inferring the initialization method from the covariance values of the provided pose, thereby eliminating the need for the
methodparameter.Related PRs and Issues:
These PRs/Issues were made before this proposal, we'll close them. Let's discuss and come to a consensus first.
Initialization service
We currently use tier4_localization_msgs/srv/InitializeLocalization.srv
There is no need for the
methodparameter. We can infer the method from the covariance values of thepose_with_covarianceparameter.This makes sense because the covariance values can define the search space for the pose. If it's very small, it means that the pose is very accurate and we can use it directly.
We can use autoware_adapi_v1_msgs/localization/srv/InitializeLocalization.srv as it is.
Utilize the existing AD API service definition to maintain consistency and reduce redundancy.
Maybe we can just add 2 comment lines to make it clear that the covariance values are used to infer the initialization method.
Pose initialization architecture changes
Existing architecture
flowchart TD subgraph pose_initializer["Pose Initializer"] init_method{{"service parameter:<br/>initialization method"}} Auto Direct trigger_ekf_and_ndt["trigger ekf and ndt"] end subgraph Auto["AUTO"] init_pose_is_filled{{"service call contains a pose"}} get_gnss_pose["get gnss pose"] use_service_pose2["use the service pose"] override_gnss_cov(["override gnss cov<br/>from config"]) ndt_align_pose["ndt->align_pose()"] end subgraph Direct["DIRECT"] use_service_pose["use the service pose"] end gnss_poser -- /sensing/gnss/pose_with_covariance --> get_gnss_pose["get gnss pose"] pose_via_cli["Pose via CLI"] -- /localization/initialize--> init_method ad_api["AD API"] -- /localization/initialize --> init_method init_method -- AUTO --> Auto init_method -- DIRECT --> Direct init_pose_is_filled -- yes --> use_service_pose2 init_pose_is_filled -- no --> get_gnss_pose get_gnss_pose --> override_gnss_cov override_gnss_cov --> ndt_align_pose use_service_pose2 --> ndt_align_pose ndt_align_pose --> trigger_ekf_and_ndt use_service_pose --> trigger_ekf_and_ndt ndt_align_pose <-- /localization/pose_estimator/ndt_align_srv --> ndt_scan_matcher["ndt_scan_matcher"] trigger_ekf_and_ndt -->|/localization/pose_estimator/trigger_node| ndt_scan_matcher trigger_ekf_and_ndt --> |/localization/pose_twist_fusion_filter/trigger_node| ekf_localizer["ekf_localizer"] pose_initializer -->|/initialpose3D| ekf_localizer init_method:::cl_conditional use_service_pose:::cl_purple Auto:::cl_output Direct:::cl_output trigger_ekf_and_ndt:::cl_purple init_pose_is_filled:::cl_conditional get_gnss_pose:::cl_purple use_service_pose2:::cl_purple override_gnss_cov:::cl_rose ndt_align_pose:::cl_purple pose_via_cli:::cl_node ad_api:::cl_node ndt_scan_matcher:::cl_node ekf_localizer:::cl_node pose_initializer:::cl_node gnss_poser:::cl_node classDef cl_node fill:#FFF2CC, stroke:#D6B656, stroke-width:3px classDef cl_conditional fill:#FFE6CC, stroke:#D79B00, stroke-width:3px classDef cl_output fill:#D5E8D4, stroke:#82B366, stroke-width:3px classDef cl_purple fill:#E1D5E7, stroke:#9673A6, stroke-width:3px classDef cl_rose fill:#FFDFE5, stroke:#FF5978, stroke-width:3pxProposal
flowchart TD subgraph pose_initializer["Pose Initializer"] init_pose_is_filled{{"service call contains a pose"}} get_gnss_pose["get gnss pose"] load_cov_param{{"load covariance from param"}} use_gnss_cov(["use gnss cov"]) use_service_pose2["use the service pose"] cov_zero{{"covariance is zero"}} override_gnss_cov(["override gnss cov<br/>from config"]) ndt_align_pose["ndt->align_pose()"] trigger_ekf_and_ndt["trigger ekf and ndt"] initialize_directly["initialize directly"] end gnss_poser -- /sensing/gnss/pose_with_covariance --> get_gnss_pose["get gnss pose"] pose_via_cli["Pose via CLI"] -- /localization/initialize--> init_pose_is_filled ad_api["AD API"] -- /localization/initialize --> init_pose_is_filled init_pose_is_filled -- yes --> use_service_pose2 init_pose_is_filled -- no --> get_gnss_pose get_gnss_pose --> load_cov_param load_cov_param -- yes --> override_gnss_cov load_cov_param -- no --> use_gnss_cov use_gnss_cov --> cov_zero override_gnss_cov --> cov_zero use_service_pose2 --> cov_zero cov_zero -- no --> ndt_align_pose cov_zero -- yes --> initialize_directly ndt_align_pose --> trigger_ekf_and_ndt initialize_directly --> trigger_ekf_and_ndt ndt_scan_matcher["ndt_scan_matcher"] ndt_align_pose <-- /localization/pose_estimator/ndt_align_srv --> ndt_scan_matcher trigger_ekf_and_ndt -->|/localization/pose_estimator/trigger_node| ndt_scan_matcher trigger_ekf_and_ndt --> |/localization/pose_twist_fusion_filter/trigger_node| ekf_localizer["ekf_localizer"] pose_initializer -->|/initialpose3D| ekf_localizer initialize_directly:::cl_purple trigger_ekf_and_ndt:::cl_purple init_pose_is_filled:::cl_conditional get_gnss_pose:::cl_purple use_service_pose2:::cl_purple override_gnss_cov:::cl_rose ndt_align_pose:::cl_purple pose_via_cli:::cl_node ad_api:::cl_node ndt_scan_matcher:::cl_node ekf_localizer:::cl_node pose_initializer:::cl_node gnss_poser:::cl_node load_cov_param:::cl_conditional cov_zero:::cl_conditional use_gnss_cov:::cl_rose classDef cl_node fill:#FFF2CC, stroke:#D6B656, stroke-width:3px classDef cl_conditional fill:#FFE6CC, stroke:#D79B00, stroke-width:3px classDef cl_output fill:#D5E8D4, stroke:#82B366, stroke-width:3px classDef cl_purple fill:#E1D5E7, stroke:#9673A6, stroke-width:3px classDef cl_rose fill:#FFDFE5, stroke:#FF5978, stroke-width:3pxComparison of Existing vs. Proposed Architecture:
Existing Architecture
AUTOorDIRECT).Proposed Architecture
Benefits of the Proposed Changes
methodparameter reduces redundancy and simplifies the service interface.Considerations
We've prepared this with @meliketanrikulu and I'm happy to hear your thoughts.
cc. @YamatoAndo @isamu-takagi @yukkysaito @mitsudome-r @SakodaShintaro
Beta Was this translation helpful? Give feedback.
All reactions