diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 12ad752b3ef29..6b4daaa4b1773 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,7 +1,7 @@
### Copied from .github/CODEOWNERS-manual ###
### Automatically generated from package.xml ###
-common/autoware_ad_api_specs/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp
+common/autoware_ad_api_specs/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp
common/autoware_auto_common/** opensource@apex.ai satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
common/autoware_auto_geometry/** satoshi.ota@tier4.jp
common/autoware_auto_perception_rviz_plugin/** opensource@apex.ai satoshi.tanaka@tier4.jp taiki.tanaka@tier4.jp takeshi.miura@tier4.jp
@@ -9,9 +9,9 @@ common/autoware_auto_tf2/** jit.ray.c@gmail.com satoshi.ota@tier4.jp shumpei.wak
common/autoware_point_types/** taichi.higashide@tier4.jp
common/autoware_testing/** adam.dabrowski@robotec.ai satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
common/bag_time_manager_rviz_plugin/** taiki.tanaka@tier4.jp
-common/component_interface_specs/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp yukihiro.saito@tier4.jp
-common/component_interface_tools/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp
-common/component_interface_utils/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp yukihiro.saito@tier4.jp
+common/component_interface_specs/** isamu.takagi@tier4.jp yukihiro.saito@tier4.jp
+common/component_interface_tools/** isamu.takagi@tier4.jp
+common/component_interface_utils/** isamu.takagi@tier4.jp yukihiro.saito@tier4.jp
common/cuda_utils/** daisuke.nishimatsu@tier4.jp manato.hirabayashi@tier4.jp
common/fake_test_node/** opensource@apex.ai satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
common/geography_utils/** koji.minoda@tier4.jp
@@ -24,7 +24,7 @@ common/kalman_filter/** koji.minoda@tier4.jp takeshi.ishita@tier4.jp yukihiro.sa
common/motion_utils/** fumiya.watanabe@tier4.jp kosuke.takeuchi@tier4.jp mamoru.sobue@tier4.jp satoshi.ota@tier4.jp taiki.tanaka@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
common/object_recognition_utils/** satoshi.tanaka@tier4.jp shunsuke.miura@tier4.jp takayuki.murooka@tier4.jp yusuke.muramatsu@tier4.jp
common/osqp_interface/** fumiya.watanabe@tier4.jp maxime.clement@tier4.jp satoshi.ota@tier4.jp takayuki.murooka@tier4.jp
-common/path_distance_calculator/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp
+common/path_distance_calculator/** isamu.takagi@tier4.jp
common/perception_utils/** satoshi.tanaka@tier4.jp shunsuke.miura@tier4.jp yusuke.muramatsu@tier4.jp
common/polar_grid/** yukihiro.saito@tier4.jp
common/qp_interface/** fumiya.watanabe@tier4.jp maxime.clement@tier4.jp satoshi.ota@tier4.jp takayuki.murooka@tier4.jp
@@ -32,16 +32,16 @@ common/rtc_manager_rviz_plugin/** taiki.tanaka@tier4.jp tomoya.kimura@tier4.jp
common/signal_processing/** ali.boyali@tier4.jp fumiya.watanabe@tier4.jp kyoichi.sugahara@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp
common/tensorrt_common/** daisuke.nishimatsu@tier4.jp dan.umeda@tier4.jp manato.hirabayashi@tier4.jp
common/tier4_adapi_rviz_plugin/** hiroki.ota@tier4.jp isamu.takagi@tier4.jp kosuke.takeuchi@tier4.jp
-common/tier4_api_utils/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp
+common/tier4_api_utils/** isamu.takagi@tier4.jp
common/tier4_automatic_goal_rviz_plugin/** dawid.moszynski@robotec.ai shumpei.wakabayashi@tier4.jp
common/tier4_autoware_utils/** mamoru.sobue@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp
common/tier4_calibration_rviz_plugin/** tomoya.kimura@tier4.jp
common/tier4_camera_view_rviz_plugin/** makoto.ybauta@tier4.jp uken.ryu@tier4.jp
common/tier4_control_rviz_plugin/** taiki.tanaka@tier4.jp
-common/tier4_datetime_rviz_plugin/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp
+common/tier4_datetime_rviz_plugin/** isamu.takagi@tier4.jp
common/tier4_debug_rviz_plugin/** takayuki.murooka@tier4.jp
common/tier4_debug_tools/** ryohsuke.mitsudome@tier4.jp
-common/tier4_localization_rviz_plugin/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp takamasa.horibe@tier4.jp
+common/tier4_localization_rviz_plugin/** isamu.takagi@tier4.jp takamasa.horibe@tier4.jp
common/tier4_logging_level_configure_rviz_plugin/** kosuke.takeuchi@tier4.jp satoshi.ota@tier4.jp takamasa.horibe@tier4.jp
common/tier4_perception_rviz_plugin/** yukihiro.saito@tier4.jp
common/tier4_planning_rviz_plugin/** takayuki.murooka@tier4.jp yukihiro.saito@tier4.jp
@@ -54,7 +54,7 @@ common/tier4_traffic_light_rviz_plugin/** satoshi.ota@tier4.jp
common/tier4_vehicle_rviz_plugin/** yukihiro.saito@tier4.jp
common/time_utils/** christopherj.ho@gmail.com shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
common/traffic_light_recognition_marker_publisher/** shumpei.wakabayashi@tier4.jp takeshi.miura@tier4.jp tomoya.kimura@tier4.jp
-common/traffic_light_utils/** mingyu.li@tier4.jp shunsuke.miura@tier4.jp
+common/traffic_light_utils/** mingyu.li@tier4.jp satoshi.ota@tier4.jp shunsuke.miura@tier4.jp
common/tvm_utility/** ambroise.vincent@arm.com xinyu.wang@tier4.jp
control/autonomous_emergency_braking/** takamasa.horibe@tier4.jp tomoya.kimura@tier4.jp
control/control_performance_analysis/** berkay@leodrive.ai fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp taiki.tanaka@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
@@ -76,9 +76,9 @@ evaluator/diagnostic_converter/** kyoichi.sugahara@tier4.jp maxime.clement@tier4
evaluator/kinematic_evaluator/** dominik.jargot@robotec.ai fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
evaluator/localization_evaluator/** dominik.jargot@robotec.ai koji.minoda@tier4.jp
evaluator/planning_evaluator/** kyoichi.sugahara@tier4.jp maxime.clement@tier4.jp
-launch/tier4_autoware_api_launch/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp
+launch/tier4_autoware_api_launch/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp
launch/tier4_control_launch/** takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp
-launch/tier4_localization_launch/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp ryu.yamamoto@tier4.jp yamato.ando@tier4.jp
+launch/tier4_localization_launch/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
launch/tier4_map_launch/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp ryohsuke.mitsudome@tier4.jp ryu.yamamoto@tier4.jp
launch/tier4_perception_launch/** shunsuke.miura@tier4.jp yoshi.ri@tier4.jp yukihiro.saito@tier4.jp
launch/tier4_planning_launch/** fumiya.watanabe@tier4.jp kosuke.takeuchi@tier4.jp kyoichi.sugahara@tier4.jp makoto.kurihara@tier4.jp mamoru.sobue@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp taiki.tanaka@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp zhe.shen@tier4.jp zulfaqar.azmi@tier4.jp
@@ -86,29 +86,29 @@ launch/tier4_sensing_launch/** yukihiro.saito@tier4.jp
launch/tier4_simulator_launch/** keisuke.shima@tier4.jp taiki.tanaka@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
launch/tier4_system_launch/** fumihito.ito@tier4.jp tetsuhiro.kawaguchi@tier4.jp
launch/tier4_vehicle_launch/** yukihiro.saito@tier4.jp
-localization/ekf_localizer/** koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp takamasa.horibe@tier4.jp takeshi.ishita@tier4.jp yamato.ando@tier4.jp
-localization/geo_pose_projector/** koji.minoda@tier4.jp yamato.ando@tier4.jp
-localization/gyro_odometer/** masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/landmark_based_localizer/ar_tag_based_localizer/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp shintaro.sakoda@tier4.jp yamato.ando@tier4.jp
-localization/landmark_based_localizer/landmark_manager/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp shintaro.sakoda@tier4.jp yamato.ando@tier4.jp
-localization/localization_error_monitor/** koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/localization_util/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp shintaro.sakoda@tier4.jp yamato.ando@tier4.jp
-localization/ndt_scan_matcher/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/pose2twist/** masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/pose_initializer/** isamu.takagi@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/pose_instability_detector/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
-localization/stop_filter/** koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/tree_structured_parzen_estimator/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp shintaro.sakoda@tier4.jp yamato.ando@tier4.jp
-localization/twist2accel/** koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-localization/yabloc/yabloc_common/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp
-localization/yabloc/yabloc_image_processing/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp
-localization/yabloc/yabloc_monitor/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp
-localization/yabloc/yabloc_particle_filter/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp
-localization/yabloc/yabloc_pose_initializer/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp
-map/map_height_fitter/** isamu.takagi@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-map/map_loader/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryohsuke.mitsudome@tier4.jp ryu.yamamoto@tier4.jp
-map/map_projection_loader/** kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
-map/map_tf_generator/** kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp yamato.ando@tier4.jp
+localization/ekf_localizer/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp takamasa.horibe@tier4.jp takeshi.ishita@tier4.jp yamato.ando@tier4.jp
+localization/geo_pose_projector/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/gyro_odometer/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/landmark_based_localizer/ar_tag_based_localizer/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/landmark_based_localizer/landmark_manager/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/localization_error_monitor/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/localization_util/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/ndt_scan_matcher/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/pose2twist/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/pose_initializer/** anh.nguyen.2@tier4.jp isamu.takagi@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/pose_instability_detector/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/stop_filter/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/tree_structured_parzen_estimator/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/twist2accel/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/yabloc/yabloc_common/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/yabloc/yabloc_image_processing/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/yabloc/yabloc_monitor/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/yabloc/yabloc_particle_filter/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+localization/yabloc/yabloc_pose_initializer/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+map/map_height_fitter/** anh.nguyen.2@tier4.jp isamu.takagi@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+map/map_loader/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryohsuke.mitsudome@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp
+map/map_projection_loader/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
+map/map_tf_generator/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
map/util/lanelet2_map_preprocessor/** ryohsuke.mitsudome@tier4.jp
perception/bytetrack/** manato.hirabayashi@tier4.jp
perception/cluster_merger/** dai.nguyen@tier4.jp shunsuke.miura@tier4.jp yukihiro.saito@tier4.jp
@@ -156,6 +156,7 @@ perception/traffic_light_ssd_fine_detector/** daisuke.nishimatsu@tier4.jp
perception/traffic_light_visualization/** yukihiro.saito@tier4.jp
planning/behavior_path_avoidance_by_lane_change_module/** fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp zulfaqar.azmi@tier4.jp
planning/behavior_path_avoidance_module/** fumiya.watanabe@tier4.jp kyoichi.sugahara@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp takamasa.horibe@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp
+planning/behavior_path_dynamic_avoidance_module/** kosuke.takeuchi@tier4.jp satoshi.ota@tier4.jp takayuki.murooka@tier4.jp yuki.takagi@tier4.jp
planning/behavior_path_external_request_lane_change_module/** fumiya.watanabe@tier4.jp kosuke.takeuchi@tier4.jp shumpei.wakabayashi@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp zulfaqar.azmi@tier4.jp
planning/behavior_path_goal_planner_module/** kosuke.takeuchi@tier4.jp kyoichi.sugahara@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_path_lane_change_module/** fumiya.watanabe@tier4.jp kosuke.takeuchi@tier4.jp shumpei.wakabayashi@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp zulfaqar.azmi@tier4.jp
@@ -166,6 +167,7 @@ planning/behavior_path_start_planner_module/** kosuke.takeuchi@tier4.jp kyoichi.
planning/behavior_velocity_blind_spot_module/** mamoru.sobue@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_crosswalk_module/** kyoichi.sugahara@tier4.jp mamoru.sobue@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp yuki.takagi@tier4.jp
planning/behavior_velocity_detection_area_module/** kyoichi.sugahara@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
+planning/behavior_velocity_dynamic_obstacle_stop_module/** mamoru.sobue@tier4.jp maxime.clement@tier4.jp
planning/behavior_velocity_intersection_module/** kyoichi.sugahara@tier4.jp mamoru.sobue@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_no_drivable_lane_module/** ahmed.ebrahim@leodrive.ai fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_no_stopping_area_module/** kosuke.takeuchi@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
@@ -173,7 +175,7 @@ planning/behavior_velocity_occlusion_spot_module/** shumpei.wakabayashi@tier4.jp
planning/behavior_velocity_out_of_lane_module/** maxime.clement@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_planner/** kosuke.takeuchi@tier4.jp kyoichi.sugahara@tier4.jp makoto.kurihara@tier4.jp mamoru.sobue@tier4.jp maxime.clement@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp taiki.tanaka@tier4.jp takayuki.murooka@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_planner_common/** fumiya.watanabe@tier4.jp isamu.takagi@tier4.jp mamoru.sobue@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
-planning/behavior_velocity_run_out_module/** makoto.kurihara@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp
+planning/behavior_velocity_run_out_module/** kosuke.takeuchi@tier4.jp makoto.kurihara@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomohito.ando@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_speed_bump_module/** mdogru@leodrive.ai shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp
planning/behavior_velocity_stop_line_module/** fumiya.watanabe@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp zhe.shen@tier4.jp
planning/behavior_velocity_template_module/** daniel.sanchez@tier4.jp
@@ -223,11 +225,11 @@ simulator/fault_injection/** keisuke.shima@tier4.jp
simulator/simple_planning_simulator/** takamasa.horibe@tier4.jp tomoya.kimura@tier4.jp
system/autoware_auto_msgs_adapter/** isamu.takagi@tier4.jp mfc@leodrive.ai
system/bluetooth_monitor/** fumihito.ito@tier4.jp
-system/component_state_monitor/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp
-system/default_ad_api/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
-system/default_ad_api_helpers/ad_api_adaptors/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
-system/default_ad_api_helpers/ad_api_visualizers/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
-system/default_ad_api_helpers/automatic_pose_initializer/** isamu.takagi@tier4.jp kahhooi.tan@tier4.jp makoto.yabuta@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
+system/component_state_monitor/** isamu.takagi@tier4.jp
+system/default_ad_api/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
+system/default_ad_api_helpers/ad_api_adaptors/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
+system/default_ad_api_helpers/ad_api_visualizers/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
+system/default_ad_api_helpers/automatic_pose_initializer/** isamu.takagi@tier4.jp ryohsuke.mitsudome@tier4.jp yukihiro.saito@tier4.jp
system/diagnostic_graph_aggregator/** isamu.takagi@tier4.jp
system/dummy_diag_publisher/** fumihito.ito@tier4.jp tetsuhiro.kawaguchi@tier4.jp
system/dummy_infrastructure/** ryohsuke.mitsudome@tier4.jp
diff --git a/common/autoware_ad_api_specs/package.xml b/common/autoware_ad_api_specs/package.xml
index d4d82faf4ee78..0d14ccff758b0 100644
--- a/common/autoware_ad_api_specs/package.xml
+++ b/common/autoware_ad_api_specs/package.xml
@@ -5,8 +5,6 @@
0.0.0
The autoware_ad_api_specs package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Ryohsuke Mitsudome
Apache License 2.0
diff --git a/common/autoware_auto_perception_rviz_plugin/CMakeLists.txt b/common/autoware_auto_perception_rviz_plugin/CMakeLists.txt
index dd5f88d4caae8..8d0469e78c3ac 100644
--- a/common/autoware_auto_perception_rviz_plugin/CMakeLists.txt
+++ b/common/autoware_auto_perception_rviz_plugin/CMakeLists.txt
@@ -13,18 +13,18 @@ set(OD_PLUGIN_LIB_SRC
)
set(OD_PLUGIN_LIB_HEADERS
- include/visibility_control.hpp
+ include/autoware_auto_perception_rviz_plugin/visibility_control.hpp
)
set(OD_PLUGIN_LIB_HEADERS_TO_WRAP
- include/object_detection/detected_objects_display.hpp
- include/object_detection/tracked_objects_display.hpp
- include/object_detection/predicted_objects_display.hpp
+ include/autoware_auto_perception_rviz_plugin/object_detection/detected_objects_display.hpp
+ include/autoware_auto_perception_rviz_plugin/object_detection/tracked_objects_display.hpp
+ include/autoware_auto_perception_rviz_plugin/object_detection/predicted_objects_display.hpp
)
set(COMMON_HEADERS
- include/common/color_alpha_property.hpp
- include/object_detection/object_polygon_detail.hpp
- include/object_detection/object_polygon_display_base.hpp
+ include/autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp
+ include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp
+ include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp
)
set(COMMON_SRC
diff --git a/common/autoware_auto_perception_rviz_plugin/include/common/color_alpha_property.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp
similarity index 84%
rename from common/autoware_auto_perception_rviz_plugin/include/common/color_alpha_property.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp
index 8c43192a26bd6..10dc46e55ec70 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/common/color_alpha_property.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp
@@ -11,13 +11,14 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef COMMON__COLOR_ALPHA_PROPERTY_HPP_
-#define COMMON__COLOR_ALPHA_PROPERTY_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__COMMON__COLOR_ALPHA_PROPERTY_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__COMMON__COLOR_ALPHA_PROPERTY_HPP_
+
+#include "autoware_auto_perception_rviz_plugin/visibility_control.hpp"
#include
#include
#include
-#include
#include
@@ -55,4 +56,4 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ColorAlphaProperty
} // namespace rviz_plugins
} // namespace autoware
-#endif // COMMON__COLOR_ALPHA_PROPERTY_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__COMMON__COLOR_ALPHA_PROPERTY_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/object_detection/detected_objects_display.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/detected_objects_display.hpp
similarity index 76%
rename from common/autoware_auto_perception_rviz_plugin/include/object_detection/detected_objects_display.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/detected_objects_display.hpp
index 67dac25c796bb..97479fb68ca9b 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/object_detection/detected_objects_display.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/detected_objects_display.hpp
@@ -11,10 +11,10 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
-#define OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp"
#include
@@ -43,4 +43,4 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC DetectedObjectsDisplay
} // namespace rviz_plugins
} // namespace autoware
-#endif // OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__DETECTED_OBJECTS_DISPLAY_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_detail.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp
similarity index 78%
rename from common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_detail.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp
index b661010c19a4d..5f9da8531d2ab 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_detail.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp
@@ -12,12 +12,15 @@
// See the License for the specific language governing permissions and
// limitations under the License.
/// \brief This file defines some helper functions used by ObjectPolygonDisplayBase class
-#ifndef OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
-#define OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
+#include "autoware_auto_perception_rviz_plugin/visibility_control.hpp"
+
+#include
+#include
#include
#include
-#include
#include
#include
@@ -83,13 +86,15 @@ AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::Sha
get_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width);
+ const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width,
+ const bool & is_orientation_available = true);
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
get_2d_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width);
+ const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width,
+ const bool & is_orientation_available = true);
/// \brief Convert the given polygon into a marker representing the shape in 3d
/// \param centroid Centroid position of the shape in Object.header.frame_id frame
@@ -110,8 +115,14 @@ get_uuid_marker_ptr(
const std_msgs::msg::ColorRGBA & color_rgba);
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
-get_pose_with_covariance_marker_ptr(
- const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance);
+get_pose_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const double & confidence_interval_coefficient);
+
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
+get_yaw_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance, const double & length,
+ const double & confidence_interval_coefficient, const double & line_width);
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
get_velocity_text_marker_ptr(
@@ -128,6 +139,23 @@ get_twist_marker_ptr(
const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance, const double & line_width);
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
+get_twist_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & confidence_interval_coefficient);
+
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
+get_yaw_rate_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance, const double & line_width);
+
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
+get_yaw_rate_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & confidence_interval_coefficient, const double & line_width);
+
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC visualization_msgs::msg::Marker::SharedPtr
get_predicted_path_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape,
@@ -139,14 +167,33 @@ get_path_confidence_marker_ptr(
const autoware_auto_perception_msgs::msg::PredictedPath & predicted_path,
const std_msgs::msg::ColorRGBA & path_confidence_color);
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_arc_line_strip(
+ const double start_angle, const double end_angle, const double radius,
+ std::vector & points);
+
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_line_list_from_points(
+ const double point_list[][3], const int point_pairs[][2], const int & num_pairs,
+ std::vector & points);
+
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_covariance_eigen_vectors(
+ const Eigen::Matrix2d & matrix, double & sigma1, double & sigma2, double & yaw);
+
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_bounding_box_line_list(
const autoware_auto_perception_msgs::msg::Shape & shape,
std::vector & points);
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_bounding_box_direction_line_list(
+ const autoware_auto_perception_msgs::msg::Shape & shape,
+ std::vector & points);
+
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_2d_bounding_box_bottom_line_list(
const autoware_auto_perception_msgs::msg::Shape & shape,
std::vector & points);
+AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_2d_bounding_box_bottom_direction_line_list(
+ const autoware_auto_perception_msgs::msg::Shape & shape,
+ std::vector & points);
+
AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC void calc_cylinder_line_list(
const autoware_auto_perception_msgs::msg::Shape & shape,
std::vector & points);
@@ -238,4 +285,4 @@ AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC
} // namespace rviz_plugins
} // namespace autoware
-#endif // OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DETAIL_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_display_base.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp
similarity index 77%
rename from common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_display_base.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp
index 223611520b2fc..4290fdff49bb3 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/object_detection/object_polygon_display_base.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp
@@ -11,19 +11,19 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
-#define OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
-#include "common/color_alpha_property.hpp"
+#include "autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp"
+#include "autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp"
+#include "autoware_auto_perception_rviz_plugin/visibility_control.hpp"
-#include
#include
#include
#include
#include
#include
#include
-#include
#include
#include
@@ -64,14 +64,22 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
// m_display_type_property{"Polygon Type", "3d", "Type of the polygon to display object", this},
m_display_label_property{"Display Label", true, "Enable/disable label visualization", this},
m_display_uuid_property{"Display UUID", true, "Enable/disable uuid visualization", this},
- m_display_pose_with_covariance_property{
- "Display PoseWithCovariance", true, "Enable/disable pose with covariance visualization",
- this},
m_display_velocity_text_property{
"Display Velocity", true, "Enable/disable velocity text visualization", this},
m_display_acceleration_text_property{
"Display Acceleration", true, "Enable/disable acceleration text visualization", this},
+ m_display_pose_covariance_property{
+ "Display Pose Covariance", true, "Enable/disable pose covariance visualization", this},
+ m_display_yaw_covariance_property{
+ "Display Yaw Covariance", false, "Enable/disable yaw covariance visualization", this},
m_display_twist_property{"Display Twist", true, "Enable/disable twist visualization", this},
+ m_display_twist_covariance_property{
+ "Display Twist Covariance", false, "Enable/disable twist covariance visualization", this},
+ m_display_yaw_rate_property{
+ "Display Yaw Rate", false, "Enable/disable yaw rate visualization", this},
+ m_display_yaw_rate_covariance_property{
+ "Display Yaw Rate Covariance", false, "Enable/disable yaw rate covariance visualization",
+ this},
m_display_predicted_paths_property{
"Display Predicted Paths", true, "Enable/disable predicted paths visualization", this},
m_display_path_confidence_property{
@@ -96,6 +104,13 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
"Visualization Type", "Normal", "Simplicity of the polygon to display object.", this);
m_simple_visualize_mode_property->addOption("Normal", 0);
m_simple_visualize_mode_property->addOption("Simple", 1);
+ // Confidence interval property
+ m_confidence_interval_property = new rviz_common::properties::EnumProperty(
+ "Confidence Interval", "95%", "Confidence interval of state estimations.", this);
+ m_confidence_interval_property->addOption("70%", 0);
+ m_confidence_interval_property->addOption("85%", 1);
+ m_confidence_interval_property->addOption("95%", 2);
+ m_confidence_interval_property->addOption("99%", 3);
// iterate over default values to create and initialize the properties.
for (const auto & map_property_it : detail::kDefaultObjectPropertyValues) {
@@ -170,14 +185,16 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
std::optional get_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const ClassificationContainerT & labels, const double & line_width) const
+ const ClassificationContainerT & labels, const double & line_width,
+ const bool & is_orientation_available) const
{
const std_msgs::msg::ColorRGBA color_rgba = get_color_rgba(labels);
if (m_display_type_property->getOptionInt() == 0) {
- return detail::get_shape_marker_ptr(shape_msg, centroid, orientation, color_rgba, line_width);
+ return detail::get_shape_marker_ptr(
+ shape_msg, centroid, orientation, color_rgba, line_width, is_orientation_available);
} else if (m_display_type_property->getOptionInt() == 1) {
return detail::get_2d_shape_marker_ptr(
- shape_msg, centroid, orientation, color_rgba, line_width);
+ shape_msg, centroid, orientation, color_rgba, line_width, is_orientation_available);
} else {
return std::nullopt;
}
@@ -187,7 +204,8 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
visualization_msgs::msg::Marker::SharedPtr get_2d_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width);
+ const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width,
+ const bool & is_orientation_available);
/// \brief Convert given shape msg into a Marker to visualize label name
/// \tparam ClassificationContainerT List type with ObjectClassificationMsg
@@ -235,11 +253,23 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
}
}
- std::optional get_pose_with_covariance_marker_ptr(
+ std::optional get_pose_covariance_marker_ptr(
const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance) const
{
- if (m_display_pose_with_covariance_property.getBool()) {
- return detail::get_pose_with_covariance_marker_ptr(pose_with_covariance);
+ if (m_display_pose_covariance_property.getBool()) {
+ return detail::get_pose_covariance_marker_ptr(pose_with_covariance, get_confidence_region());
+ } else {
+ return std::nullopt;
+ }
+ }
+
+ std::optional get_yaw_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance, const double & length,
+ const double & line_width) const
+ {
+ if (m_display_yaw_covariance_property.getBool()) {
+ return detail::get_yaw_covariance_marker_ptr(
+ pose_with_covariance, length, get_confidence_interval(), line_width);
} else {
return std::nullopt;
}
@@ -283,6 +313,44 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
}
}
+ std::optional get_twist_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance) const
+ {
+ if (m_display_twist_covariance_property.getBool()) {
+ return detail::get_twist_covariance_marker_ptr(
+ pose_with_covariance, twist_with_covariance, get_confidence_region());
+ } else {
+ return std::nullopt;
+ }
+ }
+
+ std::optional get_yaw_rate_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & line_width) const
+ {
+ if (m_display_yaw_rate_property.getBool()) {
+ return detail::get_yaw_rate_marker_ptr(
+ pose_with_covariance, twist_with_covariance, line_width);
+ } else {
+ return std::nullopt;
+ }
+ }
+
+ std::optional get_yaw_rate_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & line_width) const
+ {
+ if (m_display_yaw_rate_covariance_property.getBool()) {
+ return detail::get_yaw_rate_covariance_marker_ptr(
+ pose_with_covariance, twist_with_covariance, get_confidence_interval(), line_width);
+ } else {
+ return std::nullopt;
+ }
+ }
+
std::optional get_predicted_path_marker_ptr(
const unique_identifier_msgs::msg::UUID & uuid,
const autoware_auto_perception_msgs::msg::Shape & shape,
@@ -405,6 +473,46 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
double get_line_width() { return m_line_width_property.getFloat(); }
+ double get_confidence_interval() const
+ {
+ switch (m_confidence_interval_property->getOptionInt()) {
+ case 0:
+ // 70%
+ return 1.036;
+ case 1:
+ // 85%
+ return 1.440;
+ case 2:
+ // 95%
+ return 1.960;
+ case 3:
+ // 99%
+ return 2.576;
+ default:
+ return 1.960;
+ }
+ }
+
+ double get_confidence_region() const
+ {
+ switch (m_confidence_interval_property->getOptionInt()) {
+ case 0:
+ // 70%
+ return 1.552;
+ case 1:
+ // 85%
+ return 1.802;
+ case 2:
+ // 95%
+ return 2.448;
+ case 3:
+ // 99%
+ return 3.035;
+ default:
+ return 2.448;
+ }
+ }
+
private:
// All rviz plugins should have this. Should be initialized with pointer to this class
MarkerCommon m_marker_common;
@@ -416,18 +524,28 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
rviz_common::properties::EnumProperty * m_display_type_property;
// Property to choose simplicity of visualization polygon
rviz_common::properties::EnumProperty * m_simple_visualize_mode_property;
+ // Property to set confidence interval of state estimations
+ rviz_common::properties::EnumProperty * m_confidence_interval_property;
// Property to enable/disable label visualization
rviz_common::properties::BoolProperty m_display_label_property;
// Property to enable/disable uuid visualization
rviz_common::properties::BoolProperty m_display_uuid_property;
- // Property to enable/disable pose with covariance visualization
- rviz_common::properties::BoolProperty m_display_pose_with_covariance_property;
// Property to enable/disable velocity text visualization
rviz_common::properties::BoolProperty m_display_velocity_text_property;
// Property to enable/disable acceleration text visualization
rviz_common::properties::BoolProperty m_display_acceleration_text_property;
+ // Property to enable/disable pose with covariance visualization
+ rviz_common::properties::BoolProperty m_display_pose_covariance_property;
+ // Property to enable/disable yaw covariance visualization
+ rviz_common::properties::BoolProperty m_display_yaw_covariance_property;
// Property to enable/disable twist visualization
rviz_common::properties::BoolProperty m_display_twist_property;
+ // Property to enable/disable twist covariance visualization
+ rviz_common::properties::BoolProperty m_display_twist_covariance_property;
+ // Property to enable/disable yaw rate visualization
+ rviz_common::properties::BoolProperty m_display_yaw_rate_property;
+ // Property to enable/disable yaw rate covariance visualization
+ rviz_common::properties::BoolProperty m_display_yaw_rate_covariance_property;
// Property to enable/disable predicted paths visualization
rviz_common::properties::BoolProperty m_display_predicted_paths_property;
// Property to enable/disable predicted path confidence visualization
@@ -446,4 +564,4 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC ObjectPolygonDisplayBase
} // namespace rviz_plugins
} // namespace autoware
-#endif // OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__OBJECT_POLYGON_DISPLAY_BASE_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/object_detection/predicted_objects_display.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/predicted_objects_display.hpp
similarity index 92%
rename from common/autoware_auto_perception_rviz_plugin/include/object_detection/predicted_objects_display.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/predicted_objects_display.hpp
index 2896286970217..775c18db6ba5c 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/object_detection/predicted_objects_display.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/predicted_objects_display.hpp
@@ -11,10 +11,10 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
-#define OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp"
#include
@@ -153,4 +153,4 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC PredictedObjectsDisplay
} // namespace rviz_plugins
} // namespace autoware
-#endif // OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__PREDICTED_OBJECTS_DISPLAY_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/object_detection/tracked_objects_display.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/tracked_objects_display.hpp
similarity index 89%
rename from common/autoware_auto_perception_rviz_plugin/include/object_detection/tracked_objects_display.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/tracked_objects_display.hpp
index a4cf8a703dff1..4e86a5ee93fd8 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/object_detection/tracked_objects_display.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/object_detection/tracked_objects_display.hpp
@@ -11,10 +11,10 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
-#define OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/object_polygon_display_base.hpp"
#include
@@ -114,4 +114,4 @@ class AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_PUBLIC TrackedObjectsDisplay
} // namespace rviz_plugins
} // namespace autoware
-#endif // OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__OBJECT_DETECTION__TRACKED_OBJECTS_DISPLAY_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/include/visibility_control.hpp b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/visibility_control.hpp
similarity index 89%
rename from common/autoware_auto_perception_rviz_plugin/include/visibility_control.hpp
rename to common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/visibility_control.hpp
index bce7351572375..47cb8383fdada 100644
--- a/common/autoware_auto_perception_rviz_plugin/include/visibility_control.hpp
+++ b/common/autoware_auto_perception_rviz_plugin/include/autoware_auto_perception_rviz_plugin/visibility_control.hpp
@@ -14,8 +14,8 @@
//
// Co-developed by Tier IV, Inc. and Apex.AI, Inc.
-#ifndef VISIBILITY_CONTROL_HPP_
-#define VISIBILITY_CONTROL_HPP_
+#ifndef AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__VISIBILITY_CONTROL_HPP_
+#define AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__VISIBILITY_CONTROL_HPP_
#if defined(__WIN32)
#if defined(AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN_BUILDING_DLL) || \
@@ -40,4 +40,4 @@
#error "Unsupported Build Configuration"
#endif // defined(_WINDOWS)
-#endif // VISIBILITY_CONTROL_HPP_
+#endif // AUTOWARE_AUTO_PERCEPTION_RVIZ_PLUGIN__VISIBILITY_CONTROL_HPP_
diff --git a/common/autoware_auto_perception_rviz_plugin/src/common/color_alpha_property.cpp b/common/autoware_auto_perception_rviz_plugin/src/common/color_alpha_property.cpp
index 57a42c95f9d34..b3e542a02243b 100644
--- a/common/autoware_auto_perception_rviz_plugin/src/common/color_alpha_property.cpp
+++ b/common/autoware_auto_perception_rviz_plugin/src/common/color_alpha_property.cpp
@@ -14,7 +14,7 @@
//
// Co-developed by Tier IV, Inc. and Apex.AI, Inc.
-#include "common/color_alpha_property.hpp"
+#include "autoware_auto_perception_rviz_plugin/common/color_alpha_property.hpp"
#include
diff --git a/common/autoware_auto_perception_rviz_plugin/src/object_detection/detected_objects_display.cpp b/common/autoware_auto_perception_rviz_plugin/src/object_detection/detected_objects_display.cpp
index 5dcdce791c585..53e935fa1850a 100644
--- a/common/autoware_auto_perception_rviz_plugin/src/object_detection/detected_objects_display.cpp
+++ b/common/autoware_auto_perception_rviz_plugin/src/object_detection/detected_objects_display.cpp
@@ -14,7 +14,7 @@
//
// Co-developed by Tier IV, Inc. and Apex.AI, Inc.
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/detected_objects_display.hpp"
#include
@@ -38,7 +38,9 @@ void DetectedObjectsDisplay::processMessage(DetectedObjects::ConstSharedPtr msg)
auto shape_marker = get_shape_marker_ptr(
object.shape, object.kinematics.pose_with_covariance.pose.position,
object.kinematics.pose_with_covariance.pose.orientation, object.classification,
- get_line_width());
+ get_line_width(),
+ object.kinematics.orientation_availability ==
+ autoware_auto_perception_msgs::msg::DetectedObjectKinematics::AVAILABLE);
if (shape_marker) {
auto shape_marker_ptr = shape_marker.value();
shape_marker_ptr->header = msg->header;
@@ -57,6 +59,27 @@ void DetectedObjectsDisplay::processMessage(DetectedObjects::ConstSharedPtr msg)
add_marker(label_marker_ptr);
}
+ // Get marker for pose covariance
+ auto pose_with_covariance_marker =
+ get_pose_covariance_marker_ptr(object.kinematics.pose_with_covariance);
+ if (pose_with_covariance_marker) {
+ auto marker_ptr = pose_with_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = id++;
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for yaw covariance
+ auto yaw_covariance_marker = get_yaw_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.shape.dimensions.x * 0.65,
+ get_line_width() * 0.5);
+ if (yaw_covariance_marker) {
+ auto marker_ptr = yaw_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = id++;
+ add_marker(marker_ptr);
+ }
+
// Get marker for existence probability
geometry_msgs::msg::Point existence_probability_position;
existence_probability_position.x = object.kinematics.pose_with_covariance.pose.position.x + 0.5;
@@ -97,6 +120,38 @@ void DetectedObjectsDisplay::processMessage(DetectedObjects::ConstSharedPtr msg)
twist_marker_ptr->id = id++;
add_marker(twist_marker_ptr);
}
+
+ // Get marker for twist covariance
+ auto twist_covariance_marker = get_twist_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance);
+ if (twist_covariance_marker) {
+ auto marker_ptr = twist_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = id++;
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for yaw rate
+ auto yaw_rate_marker = get_yaw_rate_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance,
+ get_line_width() * 0.4);
+ if (yaw_rate_marker) {
+ auto marker_ptr = yaw_rate_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = id++;
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for yaw rate covariance
+ auto yaw_rate_covariance_marker = get_yaw_rate_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance,
+ get_line_width() * 0.3);
+ if (yaw_rate_covariance_marker) {
+ auto marker_ptr = yaw_rate_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = id++;
+ add_marker(marker_ptr);
+ }
}
}
diff --git a/common/autoware_auto_perception_rviz_plugin/src/object_detection/object_polygon_detail.cpp b/common/autoware_auto_perception_rviz_plugin/src/object_detection/object_polygon_detail.cpp
index d87541b7840a9..11a0bbbe57d53 100644
--- a/common/autoware_auto_perception_rviz_plugin/src/object_detection/object_polygon_detail.cpp
+++ b/common/autoware_auto_perception_rviz_plugin/src/object_detection/object_polygon_detail.cpp
@@ -12,9 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License..
+#include "autoware_auto_perception_rviz_plugin/object_detection/object_polygon_detail.hpp"
+
#include
#include
-#include
#include
@@ -100,17 +101,16 @@ visualization_msgs::msg::Marker::SharedPtr get_twist_marker_ptr(
marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
marker_ptr->pose = pose_with_covariance.pose;
- geometry_msgs::msg::Point pt_s;
- pt_s.x = 0.0;
- pt_s.y = 0.0;
- pt_s.z = 0.0;
- marker_ptr->points.push_back(pt_s);
-
- geometry_msgs::msg::Point pt_e;
- pt_e.x = twist_with_covariance.twist.linear.x;
- pt_e.y = twist_with_covariance.twist.linear.y;
- pt_e.z = twist_with_covariance.twist.linear.z;
- marker_ptr->points.push_back(pt_e);
+ // velocity line
+ geometry_msgs::msg::Point point;
+ point.x = 0.0;
+ point.y = 0.0;
+ point.z = 0.0;
+ marker_ptr->points.push_back(point);
+ point.x = twist_with_covariance.twist.linear.x;
+ point.y = twist_with_covariance.twist.linear.y;
+ point.z = twist_with_covariance.twist.linear.z;
+ marker_ptr->points.push_back(point);
marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
marker_ptr->color.a = 0.999;
@@ -121,6 +121,168 @@ visualization_msgs::msg::Marker::SharedPtr get_twist_marker_ptr(
return marker_ptr;
}
+visualization_msgs::msg::Marker::SharedPtr get_twist_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & confidence_interval_coefficient)
+{
+ auto marker_ptr = std::make_shared();
+ marker_ptr->type = visualization_msgs::msg::Marker::CYLINDER;
+ marker_ptr->ns = std::string("twist covariance");
+ marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
+ marker_ptr->pose = pose_with_covariance.pose;
+
+ // position is the tip of the velocity vector
+ const double velocity = std::sqrt(
+ twist_with_covariance.twist.linear.x * twist_with_covariance.twist.linear.x +
+ twist_with_covariance.twist.linear.y * twist_with_covariance.twist.linear.y);
+ const double velocity_angle =
+ std::atan2(twist_with_covariance.twist.linear.y, twist_with_covariance.twist.linear.x);
+ const double pos_yaw_angle = 2.0 * std::atan2(
+ pose_with_covariance.pose.orientation.z,
+ pose_with_covariance.pose.orientation.w); // [rad]
+ marker_ptr->pose.position.x += velocity * std::cos(pos_yaw_angle + velocity_angle);
+ marker_ptr->pose.position.y += velocity * std::sin(pos_yaw_angle + velocity_angle);
+
+ // velocity covariance
+ // extract eigen values and eigen vectors
+ Eigen::Matrix2d eigen_twist_covariance;
+ eigen_twist_covariance << twist_with_covariance.covariance[0],
+ twist_with_covariance.covariance[1], twist_with_covariance.covariance[6],
+ twist_with_covariance.covariance[7];
+ double phi, sigma1, sigma2;
+ calc_covariance_eigen_vectors(eigen_twist_covariance, sigma1, sigma2, phi);
+ phi = pos_yaw_angle + phi;
+ double area = sigma1 * sigma2;
+ double alpha = std::min(0.5, 1.0 / area);
+ alpha = std::max(0.1, alpha);
+
+ // ellipse orientation
+ marker_ptr->pose.orientation.x = 0.0;
+ marker_ptr->pose.orientation.y = 0.0;
+ marker_ptr->pose.orientation.z = std::sin(phi / 2.0);
+ marker_ptr->pose.orientation.w = std::cos(phi / 2.0);
+
+ // ellipse size
+ marker_ptr->scale.x = sigma1 * confidence_interval_coefficient;
+ marker_ptr->scale.y = sigma2 * confidence_interval_coefficient;
+ marker_ptr->scale.z = 0.05;
+
+ marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
+ marker_ptr->color.a = alpha;
+ marker_ptr->color.r = 1.0;
+ marker_ptr->color.g = 0.2;
+ marker_ptr->color.b = 0.4;
+
+ return marker_ptr;
+}
+
+visualization_msgs::msg::Marker::SharedPtr get_yaw_rate_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance, const double & line_width)
+{
+ auto marker_ptr = std::make_shared();
+ marker_ptr->type = visualization_msgs::msg::Marker::LINE_STRIP;
+ marker_ptr->ns = std::string("yaw rate");
+ marker_ptr->scale.x = line_width;
+ marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
+ marker_ptr->pose = pose_with_covariance.pose;
+
+ // yaw rate
+ const double yaw_rate = twist_with_covariance.twist.angular.z;
+ const double velocity = std::sqrt(
+ twist_with_covariance.twist.linear.x * twist_with_covariance.twist.linear.x +
+ twist_with_covariance.twist.linear.y * twist_with_covariance.twist.linear.y +
+ twist_with_covariance.twist.linear.z * twist_with_covariance.twist.linear.z);
+ const double velocity_angle =
+ std::atan2(twist_with_covariance.twist.linear.y, twist_with_covariance.twist.linear.x);
+ const double yaw_mark_length = velocity * 0.8;
+
+ geometry_msgs::msg::Point point;
+ // first point
+ point.x = 0;
+ point.y = 0;
+ point.z = 0;
+ marker_ptr->points.push_back(point);
+ // yaw rate arc
+ calc_arc_line_strip(
+ velocity_angle, velocity_angle + yaw_rate, yaw_mark_length, marker_ptr->points);
+ // last point
+ point.x = 0;
+ point.y = 0;
+ point.z = 0;
+ marker_ptr->points.push_back(point);
+
+ marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
+ marker_ptr->color.a = 0.9;
+ marker_ptr->color.r = 1.0;
+ marker_ptr->color.g = 0.0;
+ marker_ptr->color.b = 0.0;
+
+ return marker_ptr;
+}
+
+visualization_msgs::msg::Marker::SharedPtr get_yaw_rate_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const geometry_msgs::msg::TwistWithCovariance & twist_with_covariance,
+ const double & confidence_interval_coefficient, const double & line_width)
+{
+ auto marker_ptr = std::make_shared();
+ marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
+ marker_ptr->ns = std::string("yaw rate covariance");
+ marker_ptr->scale.x = line_width;
+ marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
+ marker_ptr->pose = pose_with_covariance.pose;
+
+ // yaw rate covariance
+ const double yaw_rate_covariance = twist_with_covariance.covariance[35];
+ const double yaw_rate_sigma = std::sqrt(yaw_rate_covariance) * confidence_interval_coefficient;
+ const double yaw_rate = twist_with_covariance.twist.angular.z;
+ const double velocity = std::sqrt(
+ twist_with_covariance.twist.linear.x * twist_with_covariance.twist.linear.x +
+ twist_with_covariance.twist.linear.y * twist_with_covariance.twist.linear.y +
+ twist_with_covariance.twist.linear.z * twist_with_covariance.twist.linear.z);
+ const double velocity_angle =
+ std::atan2(twist_with_covariance.twist.linear.y, twist_with_covariance.twist.linear.x);
+ const double yaw_mark_length = velocity * 0.8;
+ const double bar_width = std::max(velocity * 0.05, 0.1);
+ const double velocity_yaw_angle = velocity_angle + yaw_rate;
+ const double velocity_yaw_p_sigma_angle = velocity_yaw_angle + yaw_rate_sigma;
+ const double velocity_yaw_n_sigma_angle = velocity_yaw_angle - yaw_rate_sigma;
+
+ const double point_list[7][3] = {
+ {yaw_mark_length * std::cos(velocity_yaw_angle), yaw_mark_length * std::sin(velocity_yaw_angle),
+ 0},
+ {yaw_mark_length * std::cos(velocity_yaw_p_sigma_angle),
+ yaw_mark_length * std::sin(velocity_yaw_p_sigma_angle), 0},
+ {yaw_mark_length * std::cos(velocity_yaw_n_sigma_angle),
+ yaw_mark_length * std::sin(velocity_yaw_n_sigma_angle), 0},
+ {(yaw_mark_length + bar_width) * std::cos(velocity_yaw_p_sigma_angle),
+ (yaw_mark_length + bar_width) * std::sin(velocity_yaw_p_sigma_angle), 0},
+ {(yaw_mark_length - bar_width) * std::cos(velocity_yaw_p_sigma_angle),
+ (yaw_mark_length - bar_width) * std::sin(velocity_yaw_p_sigma_angle), 0},
+ {(yaw_mark_length + bar_width) * std::cos(velocity_yaw_n_sigma_angle),
+ (yaw_mark_length + bar_width) * std::sin(velocity_yaw_n_sigma_angle), 0},
+ {(yaw_mark_length - bar_width) * std::cos(velocity_yaw_n_sigma_angle),
+ (yaw_mark_length - bar_width) * std::sin(velocity_yaw_n_sigma_angle), 0},
+ };
+ const int point_pairs[4][2] = {
+ {0, 1},
+ {0, 2},
+ {3, 4},
+ {5, 6},
+ };
+ calc_line_list_from_points(point_list, point_pairs, 4, marker_ptr->points);
+
+ marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
+ marker_ptr->color.a = 0.9;
+ marker_ptr->color.r = 1.0;
+ marker_ptr->color.g = 0.2;
+ marker_ptr->color.b = 0.4;
+
+ return marker_ptr;
+}
+
visualization_msgs::msg::Marker::SharedPtr get_velocity_text_marker_ptr(
const geometry_msgs::msg::Twist & twist, const geometry_msgs::msg::Point & vis_pos,
const std_msgs::msg::ColorRGBA & color_rgba)
@@ -163,47 +325,117 @@ visualization_msgs::msg::Marker::SharedPtr get_acceleration_text_marker_ptr(
return marker_ptr;
}
-visualization_msgs::msg::Marker::SharedPtr get_pose_with_covariance_marker_ptr(
- const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance)
+void calc_arc_line_strip(
+ const double start_angle, const double end_angle, const double radius,
+ std::vector & points)
+{
+ geometry_msgs::msg::Point point;
+ // arc points
+ const double maximum_delta_angle = 10.0 * M_PI / 180.0;
+ const int num_points =
+ std::max(3, static_cast(std::abs(end_angle - start_angle) / maximum_delta_angle));
+ for (int i = 0; i < num_points; ++i) {
+ const double angle = start_angle + (end_angle - start_angle) * static_cast(i) /
+ static_cast(num_points - 1);
+ point.x = radius * std::cos(angle);
+ point.y = radius * std::sin(angle);
+ point.z = 0;
+ points.push_back(point);
+ }
+}
+
+void calc_covariance_eigen_vectors(
+ const Eigen::Matrix2d & matrix, double & sigma1, double & sigma2, double & yaw)
+{
+ Eigen::SelfAdjointEigenSolver solver(matrix);
+ Eigen::Vector2d eigen_values = solver.eigenvalues();
+ // eigen values
+ sigma1 = std::sqrt(eigen_values.x());
+ sigma2 = std::sqrt(eigen_values.y());
+ // orientation of covariance ellipse
+ Eigen::Vector2d e1 = solver.eigenvectors().col(0);
+ yaw = std::atan2(e1.y(), e1.x());
+}
+
+visualization_msgs::msg::Marker::SharedPtr get_pose_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance,
+ const double & confidence_interval_coefficient)
{
auto marker_ptr = std::make_shared();
- marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
+ marker_ptr->type = visualization_msgs::msg::Marker::CYLINDER;
marker_ptr->ns = std::string("position covariance");
- marker_ptr->scale.x = 0.03;
marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
marker_ptr->pose = pose_with_covariance.pose;
+
+ // position covariance
+ // extract eigen values and eigen vectors
+ Eigen::Matrix2d eigen_pose_covariance;
+ eigen_pose_covariance << pose_with_covariance.covariance[0], pose_with_covariance.covariance[1],
+ pose_with_covariance.covariance[6], pose_with_covariance.covariance[7];
+ double yaw, sigma1, sigma2;
+ calc_covariance_eigen_vectors(eigen_pose_covariance, sigma1, sigma2, yaw);
+
+ // ellipse orientation
marker_ptr->pose.orientation.x = 0.0;
marker_ptr->pose.orientation.y = 0.0;
- marker_ptr->pose.orientation.z = 0.0;
- marker_ptr->pose.orientation.w = 1.0;
+ marker_ptr->pose.orientation.z = std::sin(yaw / 2.0);
+ marker_ptr->pose.orientation.w = std::cos(yaw / 2.0);
+
+ // ellipse size
+ marker_ptr->scale.x = sigma1 * confidence_interval_coefficient;
+ marker_ptr->scale.y = sigma2 * confidence_interval_coefficient;
+ marker_ptr->scale.z = 0.05;
+
+ // ellipse color density
+ double area = sigma1 * sigma2;
+ double alpha = std::min(0.5, 3.0 / area);
+ alpha = std::max(0.1, alpha);
+
+ // marker configuration
+ marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
+ marker_ptr->color.a = alpha;
+ marker_ptr->color.r = 1.0;
+ marker_ptr->color.g = 1.0;
+ marker_ptr->color.b = 1.0;
+ return marker_ptr;
+}
+
+visualization_msgs::msg::Marker::SharedPtr get_yaw_covariance_marker_ptr(
+ const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance, const double & length,
+ const double & confidence_interval_coefficient, const double & line_width)
+{
+ auto marker_ptr = std::make_shared();
+ marker_ptr->type = visualization_msgs::msg::Marker::LINE_STRIP;
+ marker_ptr->ns = std::string("yaw covariance");
+ marker_ptr->scale.x = line_width;
+ marker_ptr->action = visualization_msgs::msg::Marker::MODIFY;
+ marker_ptr->pose = pose_with_covariance.pose;
geometry_msgs::msg::Point point;
- Eigen::Matrix2d eigen_pose_with_covariance;
- eigen_pose_with_covariance << pose_with_covariance.covariance[0],
- pose_with_covariance.covariance[1], pose_with_covariance.covariance[6],
- pose_with_covariance.covariance[7];
- Eigen::SelfAdjointEigenSolver solver(eigen_pose_with_covariance);
- double sigma1 = 2.448 * std::sqrt(solver.eigenvalues().x()); // 2.448 sigma is 95%
- double sigma2 = 2.448 * std::sqrt(solver.eigenvalues().y()); // 2.448 sigma is 95%
- Eigen::Vector2d e1 = solver.eigenvectors().col(0);
- Eigen::Vector2d e2 = solver.eigenvectors().col(1);
- point.x = -e1.x() * sigma1;
- point.y = -e1.y() * sigma1;
- point.z = 0;
- marker_ptr->points.push_back(point);
- point.x = e1.x() * sigma1;
- point.y = e1.y() * sigma1;
- point.z = 0;
- marker_ptr->points.push_back(point);
- point.x = -e2.x() * sigma2;
- point.y = -e2.y() * sigma2;
+
+ // orientation covariance
+ double yaw_vector_length = std::max(length, 1.0);
+ double yaw_sigma =
+ std::sqrt(pose_with_covariance.covariance[35]) * confidence_interval_coefficient;
+ // get arc points
+ if (yaw_sigma > M_PI) {
+ yaw_vector_length = 1.0;
+ }
+ // first point
+ point.x = 0;
+ point.y = 0;
point.z = 0;
marker_ptr->points.push_back(point);
- point.x = e2.x() * sigma2;
- point.y = e2.y() * sigma2;
+ // arc points
+ calc_arc_line_strip(-yaw_sigma, yaw_sigma, yaw_vector_length, marker_ptr->points);
+ // last point
+ point.x = 0;
+ point.y = 0;
point.z = 0;
marker_ptr->points.push_back(point);
+
+ // marker configuration
marker_ptr->lifetime = rclcpp::Duration::from_seconds(0.5);
- marker_ptr->color.a = 0.999;
+ marker_ptr->color.a = 0.9;
marker_ptr->color.r = 1.0;
marker_ptr->color.g = 1.0;
marker_ptr->color.b = 1.0;
@@ -262,7 +494,8 @@ visualization_msgs::msg::Marker::SharedPtr get_existence_probability_marker_ptr(
visualization_msgs::msg::Marker::SharedPtr get_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width)
+ const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width,
+ const bool & is_orientation_available)
{
auto marker_ptr = std::make_shared();
marker_ptr->ns = std::string("shape");
@@ -271,6 +504,9 @@ visualization_msgs::msg::Marker::SharedPtr get_shape_marker_ptr(
if (shape_msg.type == Shape::BOUNDING_BOX) {
marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
calc_bounding_box_line_list(shape_msg, marker_ptr->points);
+ if (is_orientation_available) {
+ calc_bounding_box_direction_line_list(shape_msg, marker_ptr->points);
+ }
} else if (shape_msg.type == Shape::CYLINDER) {
marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
calc_cylinder_line_list(shape_msg, marker_ptr->points);
@@ -294,7 +530,8 @@ visualization_msgs::msg::Marker::SharedPtr get_shape_marker_ptr(
visualization_msgs::msg::Marker::SharedPtr get_2d_shape_marker_ptr(
const autoware_auto_perception_msgs::msg::Shape & shape_msg,
const geometry_msgs::msg::Point & centroid, const geometry_msgs::msg::Quaternion & orientation,
- const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width)
+ const std_msgs::msg::ColorRGBA & color_rgba, const double & line_width,
+ const bool & is_orientation_available)
{
auto marker_ptr = std::make_shared();
marker_ptr->ns = std::string("shape");
@@ -303,6 +540,9 @@ visualization_msgs::msg::Marker::SharedPtr get_2d_shape_marker_ptr(
if (shape_msg.type == Shape::BOUNDING_BOX) {
marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
calc_2d_bounding_box_bottom_line_list(shape_msg, marker_ptr->points);
+ if (is_orientation_available) {
+ calc_2d_bounding_box_bottom_direction_line_list(shape_msg, marker_ptr->points);
+ }
} else if (shape_msg.type == Shape::CYLINDER) {
marker_ptr->type = visualization_msgs::msg::Marker::LINE_LIST;
calc_2d_cylinder_bottom_line_list(shape_msg, marker_ptr->points);
@@ -323,163 +563,120 @@ visualization_msgs::msg::Marker::SharedPtr get_2d_shape_marker_ptr(
return marker_ptr;
}
+void calc_line_list_from_points(
+ const double point_list[][3], const int point_pairs[][2], const int & num_pairs,
+ std::vector & points)
+{
+ geometry_msgs::msg::Point point;
+ for (int i = 0; i < num_pairs; ++i) {
+ point.x = point_list[point_pairs[i][0]][0];
+ point.y = point_list[point_pairs[i][0]][1];
+ point.z = point_list[point_pairs[i][0]][2];
+ points.push_back(point);
+ point.x = point_list[point_pairs[i][1]][0];
+ point.y = point_list[point_pairs[i][1]][1];
+ point.z = point_list[point_pairs[i][1]][2];
+ points.push_back(point);
+ }
+}
+
void calc_bounding_box_line_list(
const autoware_auto_perception_msgs::msg::Shape & shape,
std::vector & points)
{
+ const double length_half = shape.dimensions.x / 2.0;
+ const double width_half = shape.dimensions.y / 2.0;
+ const double height_half = shape.dimensions.z / 2.0;
geometry_msgs::msg::Point point;
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- // up surface
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = shape.dimensions.z / 2.0;
- points.push_back(point);
-
- // down surface
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
+
+ // bounding box corner points
+ // top and bottom surface, clockwise
+ const double point_list[8][3] = {
+ {length_half, width_half, height_half}, {length_half, -width_half, height_half},
+ {-length_half, -width_half, height_half}, {-length_half, width_half, height_half},
+ {length_half, width_half, -height_half}, {length_half, -width_half, -height_half},
+ {-length_half, -width_half, -height_half}, {-length_half, width_half, -height_half},
+ };
+ const int point_pairs[12][2] = {
+ {0, 1}, {1, 2}, {2, 3}, {3, 0}, {4, 5}, {5, 6}, {6, 7}, {7, 4}, {0, 4}, {1, 5}, {2, 6}, {3, 7},
+ };
+ calc_line_list_from_points(point_list, point_pairs, 12, points);
+}
+
+void calc_bounding_box_direction_line_list(
+ const autoware_auto_perception_msgs::msg::Shape & shape,
+ std::vector & points)
+{
+ // direction triangle
+ const double length_half = shape.dimensions.x / 2.0;
+ const double width_half = shape.dimensions.y / 2.0;
+ const double height_half = shape.dimensions.z / 2.0;
+ const double triangle_size_half = shape.dimensions.y / 1.4;
+ geometry_msgs::msg::Point point;
+
+ // triangle-shaped direction indicator
+ const double point_list[6][3] = {
+ {length_half, 0, height_half},
+ {length_half - triangle_size_half, width_half, height_half},
+ {length_half - triangle_size_half, -width_half, height_half},
+ {length_half, 0, -height_half},
+ {length_half, width_half, height_half},
+ {length_half, -width_half, height_half},
+ };
+ const int point_pairs[5][2] = {
+ {0, 1}, {1, 2}, {0, 2}, {3, 4}, {3, 5},
+ };
+ calc_line_list_from_points(point_list, point_pairs, 5, points);
}
void calc_2d_bounding_box_bottom_line_list(
const autoware_auto_perception_msgs::msg::Shape & shape,
std::vector & points)
{
+ const double length_half = shape.dimensions.x / 2.0;
+ const double width_half = shape.dimensions.y / 2.0;
+ const double height_half = shape.dimensions.z / 2.0;
geometry_msgs::msg::Point point;
- // down surface
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = -shape.dimensions.x / 2.0;
- point.y = shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
-
- point.x = shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
- point.x = -shape.dimensions.x / 2.0;
- point.y = -shape.dimensions.y / 2.0;
- point.z = -shape.dimensions.z / 2.0;
- points.push_back(point);
+
+ // bounding box corner points
+ // top surface, clockwise
+ const double point_list[4][3] = {
+ {length_half, width_half, -height_half},
+ {length_half, -width_half, -height_half},
+ {-length_half, -width_half, -height_half},
+ {-length_half, width_half, -height_half},
+ };
+ const int point_pairs[4][2] = {
+ {0, 1},
+ {1, 2},
+ {2, 3},
+ {3, 0},
+ };
+ calc_line_list_from_points(point_list, point_pairs, 4, points);
+}
+
+void calc_2d_bounding_box_bottom_direction_line_list(
+ const autoware_auto_perception_msgs::msg::Shape & shape,
+ std::vector & points)
+{
+ const double length_half = shape.dimensions.x / 2.0;
+ const double width_half = shape.dimensions.y / 2.0;
+ const double height_half = shape.dimensions.z / 2.0;
+ const double triangle_size_half = shape.dimensions.y / 1.4;
+ geometry_msgs::msg::Point point;
+
+ // triangle-shaped direction indicator
+ const double point_list[6][3] = {
+ {length_half, 0, -height_half},
+ {length_half - triangle_size_half, width_half, -height_half},
+ {length_half - triangle_size_half, -width_half, -height_half},
+ };
+ const int point_pairs[3][2] = {
+ {0, 1},
+ {1, 2},
+ {0, 2},
+ };
+ calc_line_list_from_points(point_list, point_pairs, 3, points);
}
void calc_cylinder_line_list(
diff --git a/common/autoware_auto_perception_rviz_plugin/src/object_detection/predicted_objects_display.cpp b/common/autoware_auto_perception_rviz_plugin/src/object_detection/predicted_objects_display.cpp
index 438d70f052b4a..24b21a15732c3 100644
--- a/common/autoware_auto_perception_rviz_plugin/src/object_detection/predicted_objects_display.cpp
+++ b/common/autoware_auto_perception_rviz_plugin/src/object_detection/predicted_objects_display.cpp
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/predicted_objects_display.hpp"
#include
#include
@@ -77,12 +77,12 @@ std::vector PredictedObjectsDisplay:
auto shape_marker = get_shape_marker_ptr(
object.shape, object.kinematics.initial_pose_with_covariance.pose.position,
object.kinematics.initial_pose_with_covariance.pose.orientation, object.classification,
- get_line_width());
+ get_line_width(), true);
if (shape_marker) {
- auto shape_marker_ptr = shape_marker.value();
- shape_marker_ptr->header = msg->header;
- shape_marker_ptr->id = uuid_to_marker_id(object.object_id);
- markers.push_back(shape_marker_ptr);
+ auto marker_ptr = shape_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
}
// Get marker for label
@@ -90,10 +90,10 @@ std::vector PredictedObjectsDisplay:
object.kinematics.initial_pose_with_covariance.pose.position,
object.kinematics.initial_pose_with_covariance.pose.orientation, object.classification);
if (label_marker) {
- auto label_marker_ptr = label_marker.value();
- label_marker_ptr->header = msg->header;
- label_marker_ptr->id = uuid_to_marker_id(object.object_id);
- markers.push_back(label_marker_ptr);
+ auto marker_ptr = label_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
}
// Get marker for id
@@ -111,14 +111,25 @@ std::vector PredictedObjectsDisplay:
markers.push_back(id_marker_ptr);
}
- // Get marker for pose with covariance
+ // Get marker for pose covariance
auto pose_with_covariance_marker =
- get_pose_with_covariance_marker_ptr(object.kinematics.initial_pose_with_covariance);
+ get_pose_covariance_marker_ptr(object.kinematics.initial_pose_with_covariance);
if (pose_with_covariance_marker) {
- auto pose_with_covariance_marker_ptr = pose_with_covariance_marker.value();
- pose_with_covariance_marker_ptr->header = msg->header;
- pose_with_covariance_marker_ptr->id = uuid_to_marker_id(object.object_id);
- markers.push_back(pose_with_covariance_marker_ptr);
+ auto marker_ptr = pose_with_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
+ }
+
+ // Get marker for yaw covariance
+ auto yaw_covariance_marker = get_yaw_covariance_marker_ptr(
+ object.kinematics.initial_pose_with_covariance, object.shape.dimensions.x * 0.65,
+ get_line_width() * 0.5);
+ if (yaw_covariance_marker) {
+ auto marker_ptr = yaw_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
}
// Get marker for existence probability
@@ -181,6 +192,39 @@ std::vector PredictedObjectsDisplay:
markers.push_back(twist_marker_ptr);
}
+ // Get marker for twist covariance
+ auto twist_covariance_marker = get_twist_covariance_marker_ptr(
+ object.kinematics.initial_pose_with_covariance,
+ object.kinematics.initial_twist_with_covariance);
+ if (twist_covariance_marker) {
+ auto marker_ptr = twist_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
+ }
+
+ // Get marker for yaw rate
+ auto yaw_rate_marker = get_yaw_rate_marker_ptr(
+ object.kinematics.initial_pose_with_covariance,
+ object.kinematics.initial_twist_with_covariance, get_line_width() * 0.4);
+ if (yaw_rate_marker) {
+ auto marker_ptr = yaw_rate_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for twist covariance
+ auto yaw_rate_covariance_marker = get_yaw_rate_covariance_marker_ptr(
+ object.kinematics.initial_pose_with_covariance,
+ object.kinematics.initial_twist_with_covariance, get_line_width() * 0.3);
+ if (yaw_rate_covariance_marker) {
+ auto marker_ptr = yaw_rate_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ markers.push_back(marker_ptr);
+ }
+
// Add marker for each candidate path
int32_t path_count = 0;
for (const auto & predicted_path : object.kinematics.predicted_paths) {
diff --git a/common/autoware_auto_perception_rviz_plugin/src/object_detection/tracked_objects_display.cpp b/common/autoware_auto_perception_rviz_plugin/src/object_detection/tracked_objects_display.cpp
index 75b094b49a762..504b51f850444 100644
--- a/common/autoware_auto_perception_rviz_plugin/src/object_detection/tracked_objects_display.cpp
+++ b/common/autoware_auto_perception_rviz_plugin/src/object_detection/tracked_objects_display.cpp
@@ -14,7 +14,7 @@
//
// Co-developed by Tier IV, Inc. and Apex.AI, Inc.
-#include
+#include "autoware_auto_perception_rviz_plugin/object_detection/tracked_objects_display.hpp"
#include
@@ -55,11 +55,13 @@ void TrackedObjectsDisplay::processMessage(TrackedObjects::ConstSharedPtr msg)
for (const auto & object : msg->objects) {
// Filter by object dynamic status
if (!is_object_to_show(showing_dynamic_status, object)) continue;
- const auto line_width = get_line_width();
// Get marker for shape
auto shape_marker = get_shape_marker_ptr(
object.shape, object.kinematics.pose_with_covariance.pose.position,
- object.kinematics.pose_with_covariance.pose.orientation, object.classification, line_width);
+ object.kinematics.pose_with_covariance.pose.orientation, object.classification,
+ get_line_width(),
+ object.kinematics.orientation_availability ==
+ autoware_auto_perception_msgs::msg::DetectedObjectKinematics::AVAILABLE);
if (shape_marker) {
auto shape_marker_ptr = shape_marker.value();
shape_marker_ptr->header = msg->header;
@@ -93,15 +95,27 @@ void TrackedObjectsDisplay::processMessage(TrackedObjects::ConstSharedPtr msg)
add_marker(id_marker_ptr);
}
- // Get marker for pose with covariance
+ // Get marker for pose covariance
auto pose_with_covariance_marker =
- get_pose_with_covariance_marker_ptr(object.kinematics.pose_with_covariance);
+ get_pose_covariance_marker_ptr(object.kinematics.pose_with_covariance);
if (pose_with_covariance_marker) {
- auto pose_with_covariance_marker_ptr = pose_with_covariance_marker.value();
- pose_with_covariance_marker_ptr->header = msg->header;
- pose_with_covariance_marker_ptr->id = uuid_to_marker_id(object.object_id);
- add_marker(pose_with_covariance_marker_ptr);
+ auto marker_ptr = pose_with_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
}
+
+ // Get marker for yaw covariance
+ auto yaw_covariance_marker = get_yaw_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.shape.dimensions.x * 0.65,
+ get_line_width() * 0.5);
+ if (yaw_covariance_marker) {
+ auto marker_ptr = yaw_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
+ }
+
// Get marker for existence probability
geometry_msgs::msg::Point existence_probability_position;
existence_probability_position.x = object.kinematics.pose_with_covariance.pose.position.x + 0.5;
@@ -148,13 +162,46 @@ void TrackedObjectsDisplay::processMessage(TrackedObjects::ConstSharedPtr msg)
// Get marker for twist
auto twist_marker = get_twist_marker_ptr(
- object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance, line_width);
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance,
+ get_line_width());
if (twist_marker) {
auto twist_marker_ptr = twist_marker.value();
twist_marker_ptr->header = msg->header;
twist_marker_ptr->id = uuid_to_marker_id(object.object_id);
add_marker(twist_marker_ptr);
}
+
+ // Get marker for twist covariance
+ auto twist_covariance_marker = get_twist_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance);
+ if (twist_covariance_marker) {
+ auto marker_ptr = twist_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for yaw rate
+ auto yaw_rate_marker = get_yaw_rate_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance,
+ get_line_width() * 0.4);
+ if (yaw_rate_marker) {
+ auto marker_ptr = yaw_rate_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
+ }
+
+ // Get marker for twist covariance
+ auto yaw_rate_covariance_marker = get_yaw_rate_covariance_marker_ptr(
+ object.kinematics.pose_with_covariance, object.kinematics.twist_with_covariance,
+ get_line_width() * 0.5);
+ if (yaw_rate_covariance_marker) {
+ auto marker_ptr = yaw_rate_covariance_marker.value();
+ marker_ptr->header = msg->header;
+ marker_ptr->id = uuid_to_marker_id(object.object_id);
+ add_marker(marker_ptr);
+ }
}
}
diff --git a/common/component_interface_specs/package.xml b/common/component_interface_specs/package.xml
index 93f77c651869d..67279d0ae2b7f 100644
--- a/common/component_interface_specs/package.xml
+++ b/common/component_interface_specs/package.xml
@@ -5,8 +5,6 @@
0.0.0
The component_interface_specs package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Yukihiro Saito
Apache License 2.0
diff --git a/common/component_interface_tools/package.xml b/common/component_interface_tools/package.xml
index ebf0684d0066c..cff1829473e86 100644
--- a/common/component_interface_tools/package.xml
+++ b/common/component_interface_tools/package.xml
@@ -5,8 +5,6 @@
0.1.0
The component_interface_tools package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Apache License 2.0
ament_cmake_auto
diff --git a/common/component_interface_utils/package.xml b/common/component_interface_utils/package.xml
index dc82fda3f5c64..7a6a6d12880ad 100755
--- a/common/component_interface_utils/package.xml
+++ b/common/component_interface_utils/package.xml
@@ -5,8 +5,6 @@
0.0.0
The component_interface_utils package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Yukihiro Saito
Apache License 2.0
diff --git a/common/geography_utils/src/lanelet2_projector.cpp b/common/geography_utils/src/lanelet2_projector.cpp
index 3e982ac2ccf4d..532606248cd1f 100644
--- a/common/geography_utils/src/lanelet2_projector.cpp
+++ b/common/geography_utils/src/lanelet2_projector.cpp
@@ -34,6 +34,7 @@ std::unique_ptr get_lanelet2_projector(const MapProjectorInf
} else if (projector_info.projector_type == MapProjectorInfo::MGRS) {
lanelet::projection::MGRSProjector projector{};
+ projector.setMGRSCode(projector_info.mgrs_grid);
return std::make_unique(projector);
} else if (projector_info.projector_type == MapProjectorInfo::TRANSVERSE_MERCATOR) {
diff --git a/common/motion_utils/include/motion_utils/trajectory/trajectory.hpp b/common/motion_utils/include/motion_utils/trajectory/trajectory.hpp
index d81f75815ecc6..b9136bc4002e3 100644
--- a/common/motion_utils/include/motion_utils/trajectory/trajectory.hpp
+++ b/common/motion_utils/include/motion_utils/trajectory/trajectory.hpp
@@ -952,7 +952,10 @@ calcArcLength>(
template
std::vector calcCurvature(const T & points)
{
- std::vector curvature_vec(points.size());
+ std::vector curvature_vec(points.size(), 0.0);
+ if (points.size() < 3) {
+ return curvature_vec;
+ }
for (size_t i = 1; i < points.size() - 1; ++i) {
const auto p1 = tier4_autoware_utils::getPoint(points.at(i - 1));
diff --git a/common/path_distance_calculator/package.xml b/common/path_distance_calculator/package.xml
index b5e770a0ea624..e796bbd0d20f7 100644
--- a/common/path_distance_calculator/package.xml
+++ b/common/path_distance_calculator/package.xml
@@ -5,8 +5,6 @@
0.0.0
The path_distance_calculator package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Apache License 2.0
ament_cmake
diff --git a/common/tier4_api_utils/package.xml b/common/tier4_api_utils/package.xml
index 091f512480150..d05b810caf904 100644
--- a/common/tier4_api_utils/package.xml
+++ b/common/tier4_api_utils/package.xml
@@ -5,8 +5,6 @@
0.0.0
The tier4_api_utils package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Apache License 2.0
ament_cmake_auto
diff --git a/common/tier4_datetime_rviz_plugin/package.xml b/common/tier4_datetime_rviz_plugin/package.xml
index 6dc0c09b32a3b..82e1e82c61ba2 100644
--- a/common/tier4_datetime_rviz_plugin/package.xml
+++ b/common/tier4_datetime_rviz_plugin/package.xml
@@ -5,8 +5,6 @@
0.0.0
The tier4_datetime_rviz_plugin package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Apache License 2.0
ament_cmake_auto
diff --git a/common/tier4_debug_rviz_plugin/CMakeLists.txt b/common/tier4_debug_rviz_plugin/CMakeLists.txt
index 05cf35b93ef9f..02e65ad759ed6 100644
--- a/common/tier4_debug_rviz_plugin/CMakeLists.txt
+++ b/common/tier4_debug_rviz_plugin/CMakeLists.txt
@@ -12,7 +12,9 @@ add_definitions(-DQT_NO_KEYWORDS)
ament_auto_add_library(tier4_debug_rviz_plugin SHARED
include/tier4_debug_rviz_plugin/float32_multi_array_stamped_pie_chart.hpp
include/tier4_debug_rviz_plugin/jsk_overlay_utils.hpp
+ include/tier4_debug_rviz_plugin/string_stamped.hpp
src/float32_multi_array_stamped_pie_chart.cpp
+ src/string_stamped.cpp
src/jsk_overlay_utils.cpp
)
diff --git a/common/tier4_debug_rviz_plugin/icons/classes/StringStampedOverlayDisplay.png b/common/tier4_debug_rviz_plugin/icons/classes/StringStampedOverlayDisplay.png
new file mode 100644
index 0000000000000..6a67573717ae1
Binary files /dev/null and b/common/tier4_debug_rviz_plugin/icons/classes/StringStampedOverlayDisplay.png differ
diff --git a/common/tier4_debug_rviz_plugin/include/tier4_debug_rviz_plugin/string_stamped.hpp b/common/tier4_debug_rviz_plugin/include/tier4_debug_rviz_plugin/string_stamped.hpp
new file mode 100644
index 0000000000000..0960875d7eee2
--- /dev/null
+++ b/common/tier4_debug_rviz_plugin/include/tier4_debug_rviz_plugin/string_stamped.hpp
@@ -0,0 +1,107 @@
+// Copyright 2023 TIER IV, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright (c) 2014, JSK Lab
+// All rights reserved.
+//
+// Software License Agreement (BSD License)
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of {copyright_holder} nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.S SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef TIER4_DEBUG_RVIZ_PLUGIN__STRING_STAMPED_HPP_
+#define TIER4_DEBUG_RVIZ_PLUGIN__STRING_STAMPED_HPP_
+
+#include
+#include
+
+#ifndef Q_MOC_RUN
+#include "tier4_debug_rviz_plugin/jsk_overlay_utils.hpp"
+
+#include
+#include
+#include
+#include
+
+#endif
+
+#include
+
+namespace rviz_plugins
+{
+class StringStampedOverlayDisplay
+: public rviz_common::RosTopicDisplay
+
+{
+ Q_OBJECT
+
+public:
+ StringStampedOverlayDisplay();
+ ~StringStampedOverlayDisplay() override;
+
+ void onInitialize() override;
+ void onEnable() override;
+ void onDisable() override;
+
+private Q_SLOTS:
+ void updateVisualization();
+
+protected:
+ void update(float wall_dt, float ros_dt) override;
+ void processMessage(const tier4_debug_msgs::msg::StringStamped::ConstSharedPtr msg_ptr) override;
+ jsk_rviz_plugins::OverlayObject::Ptr overlay_;
+ rviz_common::properties::ColorProperty * property_text_color_;
+ rviz_common::properties::IntProperty * property_left_;
+ rviz_common::properties::IntProperty * property_top_;
+ rviz_common::properties::IntProperty * property_value_height_offset_;
+ rviz_common::properties::FloatProperty * property_value_scale_;
+ rviz_common::properties::IntProperty * property_font_size_;
+ rviz_common::properties::IntProperty * property_max_letter_num_;
+ // QImage hud_;
+
+private:
+ static constexpr int line_width_ = 2;
+ static constexpr int hand_width_ = 4;
+
+ std::mutex mutex_;
+ tier4_debug_msgs::msg::StringStamped::ConstSharedPtr last_msg_ptr_;
+};
+} // namespace rviz_plugins
+
+#endif // TIER4_DEBUG_RVIZ_PLUGIN__STRING_STAMPED_HPP_
diff --git a/common/tier4_debug_rviz_plugin/plugins/plugin_description.xml b/common/tier4_debug_rviz_plugin/plugins/plugin_description.xml
index c1158465e1cf1..e18900afc8d84 100644
--- a/common/tier4_debug_rviz_plugin/plugins/plugin_description.xml
+++ b/common/tier4_debug_rviz_plugin/plugins/plugin_description.xml
@@ -4,4 +4,9 @@
base_class_type="rviz_common::Display">
Display drivable area of tier4_debug_msgs::msg::Float32MultiArrayStamped
+
+ Display drivable area of tier4_debug_msgs::msg::StringStamped
+
diff --git a/common/tier4_debug_rviz_plugin/src/string_stamped.cpp b/common/tier4_debug_rviz_plugin/src/string_stamped.cpp
new file mode 100644
index 0000000000000..538dc0cbe7069
--- /dev/null
+++ b/common/tier4_debug_rviz_plugin/src/string_stamped.cpp
@@ -0,0 +1,198 @@
+// Copyright 2023 TIER IV, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Copyright (c) 2014, JSK Lab
+// All rights reserved.
+//
+// Software License Agreement (BSD License)
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of {copyright_holder} nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.S SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+#include "tier4_debug_rviz_plugin/string_stamped.hpp"
+
+#include "tier4_debug_rviz_plugin/jsk_overlay_utils.hpp"
+
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+
+namespace rviz_plugins
+{
+StringStampedOverlayDisplay::StringStampedOverlayDisplay()
+{
+ const Screen * screen_info = DefaultScreenOfDisplay(XOpenDisplay(NULL));
+
+ constexpr float hight_4k = 2160.0;
+ const float scale = static_cast(screen_info->height) / hight_4k;
+ const auto left = static_cast(std::round(1024 * scale));
+ const auto top = static_cast(std::round(128 * scale));
+
+ property_text_color_ = new rviz_common::properties::ColorProperty(
+ "Text Color", QColor(25, 255, 240), "text color", this, SLOT(updateVisualization()), this);
+ property_left_ = new rviz_common::properties::IntProperty(
+ "Left", left, "Left of the plotter window", this, SLOT(updateVisualization()), this);
+ property_left_->setMin(0);
+ property_top_ = new rviz_common::properties::IntProperty(
+ "Top", top, "Top of the plotter window", this, SLOT(updateVisualization()));
+ property_top_->setMin(0);
+
+ property_value_height_offset_ = new rviz_common::properties::IntProperty(
+ "Value height offset", 0, "Height offset of the plotter window", this,
+ SLOT(updateVisualization()));
+ property_font_size_ = new rviz_common::properties::IntProperty(
+ "Font Size", 15, "Font Size", this, SLOT(updateVisualization()), this);
+ property_font_size_->setMin(1);
+ property_max_letter_num_ = new rviz_common::properties::IntProperty(
+ "Max Letter Num", 100, "Max Letter Num", this, SLOT(updateVisualization()), this);
+ property_max_letter_num_->setMin(10);
+}
+
+StringStampedOverlayDisplay::~StringStampedOverlayDisplay()
+{
+ if (initialized()) {
+ overlay_->hide();
+ }
+}
+
+void StringStampedOverlayDisplay::onInitialize()
+{
+ RTDClass::onInitialize();
+
+ static int count = 0;
+ rviz_common::UniformStringStream ss;
+ ss << "StringOverlayDisplayObject" << count++;
+ auto logger = context_->getRosNodeAbstraction().lock()->get_raw_node()->get_logger();
+ overlay_.reset(new jsk_rviz_plugins::OverlayObject(scene_manager_, logger, ss.str()));
+
+ overlay_->show();
+
+ const int texture_size = property_font_size_->getInt() * property_max_letter_num_->getInt();
+ overlay_->updateTextureSize(texture_size, texture_size);
+ overlay_->setPosition(property_left_->getInt(), property_top_->getInt());
+ overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
+}
+
+void StringStampedOverlayDisplay::onEnable()
+{
+ subscribe();
+ overlay_->show();
+}
+
+void StringStampedOverlayDisplay::onDisable()
+{
+ unsubscribe();
+ reset();
+ overlay_->hide();
+}
+
+void StringStampedOverlayDisplay::update(float wall_dt, float ros_dt)
+{
+ (void)wall_dt;
+ (void)ros_dt;
+
+ std::lock_guard message_lock(mutex_);
+ if (!last_msg_ptr_) {
+ return;
+ }
+
+ // Display
+ QColor background_color;
+ background_color.setAlpha(0);
+ jsk_rviz_plugins::ScopedPixelBuffer buffer = overlay_->getBuffer();
+ QImage hud = buffer.getQImage(*overlay_);
+ hud.fill(background_color);
+
+ QPainter painter(&hud);
+ painter.setRenderHint(QPainter::Antialiasing, true);
+
+ const int w = overlay_->getTextureWidth() - line_width_;
+ const int h = overlay_->getTextureHeight() - line_width_;
+
+ // text
+ QColor text_color(property_text_color_->getColor());
+ text_color.setAlpha(255);
+ painter.setPen(QPen(text_color, static_cast(2), Qt::SolidLine));
+ QFont font = painter.font();
+ font.setPixelSize(property_font_size_->getInt());
+ font.setBold(true);
+ painter.setFont(font);
+
+ // same as above, but align on right side
+ painter.drawText(
+ 0, std::min(property_value_height_offset_->getInt(), h - 1), w,
+ std::max(h - property_value_height_offset_->getInt(), 1), Qt::AlignLeft | Qt::AlignTop,
+ last_msg_ptr_->data.c_str());
+ painter.end();
+ updateVisualization();
+}
+
+void StringStampedOverlayDisplay::processMessage(
+ const tier4_debug_msgs::msg::StringStamped::ConstSharedPtr msg_ptr)
+{
+ if (!isEnabled()) {
+ return;
+ }
+
+ {
+ std::lock_guard message_lock(mutex_);
+ last_msg_ptr_ = msg_ptr;
+ }
+
+ queueRender();
+}
+
+void StringStampedOverlayDisplay::updateVisualization()
+{
+ const int texture_size = property_font_size_->getInt() * property_max_letter_num_->getInt();
+ overlay_->updateTextureSize(texture_size, texture_size);
+ overlay_->setPosition(property_left_->getInt(), property_top_->getInt());
+ overlay_->setDimensions(overlay_->getTextureWidth(), overlay_->getTextureHeight());
+}
+
+} // namespace rviz_plugins
+
+#include
+PLUGINLIB_EXPORT_CLASS(rviz_plugins::StringStampedOverlayDisplay, rviz_common::Display)
diff --git a/common/tier4_localization_rviz_plugin/package.xml b/common/tier4_localization_rviz_plugin/package.xml
index e103db19f1d43..f2482b2d45a3b 100644
--- a/common/tier4_localization_rviz_plugin/package.xml
+++ b/common/tier4_localization_rviz_plugin/package.xml
@@ -5,8 +5,6 @@
0.1.0
The tier4_localization_rviz_plugin package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Takamasa Horibe
Apache License 2.0
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc.hpp
index 186481e92cdc4..2e83c5ab847c4 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc.hpp
@@ -221,6 +221,7 @@ class MPC
double m_min_prediction_length = 5.0; // Minimum prediction distance.
+ rclcpp::Publisher::SharedPtr m_debug_frenet_predicted_trajectory_pub;
/**
* @brief Get variables for MPC calculation.
* @param trajectory The reference trajectory.
@@ -333,6 +334,19 @@ class MPC
const MPCMatrix & m, const MatrixXd & x0, const MatrixXd & Uex, const double u_filtered,
const float current_steer, const double predict_dt) const;
+ /**
+ * @brief calculate predicted trajectory
+ * @param mpc_matrix The MPC matrix used in the mpc problem.
+ * @param x0 initial state used in the mpc problem.
+ * @param Uex optimized input.
+ * @param mpc_resampled_ref_traj reference trajectory resampled in the mpc time-step
+ * @param dt delta time used in the mpc problem.
+ * @return predicted path
+ */
+ Trajectory calculatePredictedTrajectory(
+ const MPCMatrix & mpc_matrix, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & mpc_resampled_ref_traj, const double dt) const;
+
/**
* @brief Check if the MPC matrix has any invalid values.
* @param m The MPC matrix to check.
@@ -352,18 +366,6 @@ class MPC
: m_param.nominal_weight;
}
- /**
- * @brief Calculate the predicted trajectory for the ego vehicle based on the MPC result.
- * @param mpc_resampled_reference_trajectory The resampled reference trajectory.
- * @param mpc_matrix The MPC matrix used for optimization.
- * @param x0_delayed The delayed initial state vector.
- * @param Uex The optimized input vector.
- * @return The predicted trajectory.
- */
- Trajectory calcPredictedTrajectory(
- const MPCTrajectory & mpc_resampled_reference_trajectory, const MPCMatrix & mpc_matrix,
- const VectorXd & x0_delayed, const VectorXd & Uex) const;
-
/**
* @brief Generate diagnostic data for debugging purposes.
* @param reference_trajectory The reference trajectory.
@@ -424,8 +426,10 @@ class MPC
double ego_nearest_dist_threshold = 3.0; // Threshold for nearest index search based on distance.
double ego_nearest_yaw_threshold = M_PI_2; // Threshold for nearest index search based on yaw.
+ bool m_debug_publish_predicted_trajectory = false; // Flag to publish debug predicted trajectory
+
//!< Constructor.
- MPC() = default;
+ explicit MPC(rclcpp::Node & node);
/**
* @brief Calculate control command using the MPC algorithm.
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_lateral_controller.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_lateral_controller.hpp
index 441101abfc243..92b01247105c6 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_lateral_controller.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_lateral_controller.hpp
@@ -91,7 +91,7 @@ class MpcLateralController : public trajectory_follower::LateralControllerBase
// trajectory buffer for detecting new trajectory
std::deque m_trajectory_buffer;
- MPC m_mpc; // MPC object for trajectory following.
+ std::unique_ptr m_mpc; // MPC object for trajectory following.
// Check is mpc output converged
bool m_is_mpc_history_filled{false};
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_trajectory.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_trajectory.hpp
index f77ef72608edd..7e1c7ebdf1348 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_trajectory.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_trajectory.hpp
@@ -85,6 +85,12 @@ class MPCTrajectory
*/
size_t size() const;
+ /**
+ * @brief get trajectory point at index i
+ * @return trajectory point at index i
+ */
+ MPCTrajectoryPoint at(const size_t i) const;
+
/**
* @return true if the components sizes are all 0 or are inconsistent
*/
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_utils.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_utils.hpp
index 036e6a32a9b83..9062ff1ea34e3 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_utils.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/mpc_utils.hpp
@@ -92,6 +92,13 @@ Trajectory convertToAutowareTrajectory(const MPCTrajectory & input);
*/
void calcMPCTrajectoryArcLength(const MPCTrajectory & trajectory, std::vector & arc_length);
+/**
+ * @brief calculate the arc length of the given trajectory
+ * @param [in] trajectory trajectory for which to calculate the arc length
+ * @return total arc length
+ */
+double calcMPCTrajectoryArcLength(const MPCTrajectory & trajectory);
+
/**
* @brief resample the given trajectory with the given fixed interval
* @param [in] input trajectory to resample
@@ -194,6 +201,14 @@ double calcStopDistance(const Trajectory & current_trajectory, const int origin)
void extendTrajectoryInYawDirection(
const double yaw, const double interval, const bool is_forward_shift, MPCTrajectory & traj);
+/**
+ * @brief clip trajectory size by length
+ * @param [in] trajectory original trajectory
+ * @param [in] length clip length
+ * @return clipped trajectory
+ */
+MPCTrajectory clipTrajectoryByLength(const MPCTrajectory & trajectory, const double length);
+
/**
* @brief Updates the value of a parameter with the given name.
* @tparam T The type of the parameter value.
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_dynamics.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_dynamics.hpp
index 29cab73826f31..488a3c7ab8be2 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_dynamics.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_dynamics.hpp
@@ -103,6 +103,16 @@ class DynamicsBicycleModel : public VehicleModelInterface
std::string modelName() override { return "dynamics"; };
+ MPCTrajectory calculatePredictedTrajectoryInWorldCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
+ MPCTrajectory calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
private:
double m_lf; //!< @brief length from center of mass to front wheel [m]
double m_lr; //!< @brief length from center of mass to rear wheel [m]
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics.hpp
index fb113d5e30df7..e2f66e95ab0e3 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics.hpp
@@ -91,6 +91,16 @@ class KinematicsBicycleModel : public VehicleModelInterface
std::string modelName() override { return "kinematics"; };
+ MPCTrajectory calculatePredictedTrajectoryInWorldCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
+ MPCTrajectory calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
private:
double m_steer_lim; //!< @brief steering angle limit [rad]
double m_steer_tau; //!< @brief steering time constant for 1d-model [s]
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.hpp
index 93d84caa89992..b503ad8eb1d13 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.hpp
@@ -87,6 +87,16 @@ class KinematicsBicycleModelNoDelay : public VehicleModelInterface
std::string modelName() override { return "kinematics_no_delay"; };
+ MPCTrajectory calculatePredictedTrajectoryInWorldCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
+ MPCTrajectory calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const override;
+
private:
double m_steer_lim; //!< @brief steering angle limit [rad]
};
diff --git a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_interface.hpp b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_interface.hpp
index 808ec1b7def2c..68806ff5a00dc 100644
--- a/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_interface.hpp
+++ b/control/mpc_lateral_controller/include/mpc_lateral_controller/vehicle_model/vehicle_model_interface.hpp
@@ -15,6 +15,8 @@
#ifndef MPC_LATERAL_CONTROLLER__VEHICLE_MODEL__VEHICLE_MODEL_INTERFACE_HPP_
#define MPC_LATERAL_CONTROLLER__VEHICLE_MODEL__VEHICLE_MODEL_INTERFACE_HPP_
+#include "mpc_lateral_controller/mpc_trajectory.hpp"
+
#include
#include
@@ -55,25 +57,25 @@ class VehicleModelInterface
* @brief get state x dimension
* @return state dimension
*/
- int getDimX();
+ int getDimX() const;
/**
* @brief get input u dimension
* @return input dimension
*/
- int getDimU();
+ int getDimU() const;
/**
* @brief get output y dimension
* @return output dimension
*/
- int getDimY();
+ int getDimY() const;
/**
* @brief get wheelbase of the vehicle
* @return wheelbase value [m]
*/
- double getWheelbase();
+ double getWheelbase() const;
/**
* @brief set velocity
@@ -109,6 +111,42 @@ class VehicleModelInterface
* @brief returns model name e.g. kinematics, dynamics
*/
virtual std::string modelName() = 0;
+
+ /**
+ * @brief Calculate the predicted trajectory for the ego vehicle based on the MPC result in world
+ * coordinate
+ * @param a_d The MPC A matrix used for optimization.
+ * @param b_d The MPC B matrix used for optimization.
+ * @param c_d The MPC C matrix used for optimization.
+ * @param w_d The MPC W matrix used for optimization.
+ * @param x0 initial state vector.
+ * @param Uex The optimized input vector.
+ * @param reference_trajectory The resampled reference trajectory.
+ * @param dt delta time used in the optimization
+ * @return The predicted trajectory.
+ */
+ virtual MPCTrajectory calculatePredictedTrajectoryInWorldCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const = 0;
+
+ /**
+ * @brief Calculate the predicted trajectory for the ego vehicle based on the MPC result in Frenet
+ * Coordinate
+ * @param a_d The MPC A matrix used for optimization.
+ * @param b_d The MPC B matrix used for optimization.
+ * @param c_d The MPC C matrix used for optimization.
+ * @param w_d The MPC W matrix used for optimization.
+ * @param x0 initial state vector.
+ * @param Uex The optimized input vector.
+ * @param reference_trajectory The resampled reference trajectory.
+ * @param dt delta time used in the optimization
+ * @return The predicted trajectory.
+ */
+ virtual MPCTrajectory calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d, const Eigen::MatrixXd & c_d,
+ const Eigen::MatrixXd & w_d, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const = 0;
};
} // namespace autoware::motion::control::mpc_lateral_controller
#endif // MPC_LATERAL_CONTROLLER__VEHICLE_MODEL__VEHICLE_MODEL_INTERFACE_HPP_
diff --git a/control/mpc_lateral_controller/param/lateral_controller_defaults.param.yaml b/control/mpc_lateral_controller/param/lateral_controller_defaults.param.yaml
index 59d3f759c9c2f..182458d532c8a 100644
--- a/control/mpc_lateral_controller/param/lateral_controller_defaults.param.yaml
+++ b/control/mpc_lateral_controller/param/lateral_controller_defaults.param.yaml
@@ -83,3 +83,5 @@
mass_rr: 600.0
cf: 155494.663
cr: 155494.663
+
+ debug_publish_predicted_trajectory: false # publish debug predicted trajectory in Frenet coordinate
diff --git a/control/mpc_lateral_controller/src/mpc.cpp b/control/mpc_lateral_controller/src/mpc.cpp
index 153c2ae61d076..8fa95f4b3b87b 100644
--- a/control/mpc_lateral_controller/src/mpc.cpp
+++ b/control/mpc_lateral_controller/src/mpc.cpp
@@ -17,6 +17,7 @@
#include "interpolation/linear_interpolation.hpp"
#include "motion_utils/trajectory/trajectory.hpp"
#include "mpc_lateral_controller/mpc_utils.hpp"
+#include "rclcpp/rclcpp.hpp"
#include "tier4_autoware_utils/math/unit_conversion.hpp"
#include
@@ -28,6 +29,12 @@ using tier4_autoware_utils::calcDistance2d;
using tier4_autoware_utils::normalizeRadian;
using tier4_autoware_utils::rad2deg;
+MPC::MPC(rclcpp::Node & node)
+{
+ m_debug_frenet_predicted_trajectory_pub = node.create_publisher(
+ "~/debug/predicted_trajectory_in_frenet_coordinate", rclcpp::QoS(1));
+}
+
bool MPC::calculateMPC(
const SteeringReport & current_steer, const Odometry & current_kinematics,
AckermannLateralCommand & ctrl_cmd, Trajectory & predicted_trajectory,
@@ -97,9 +104,9 @@ bool MPC::calculateMPC(
m_raw_steer_cmd_pprev = m_raw_steer_cmd_prev;
m_raw_steer_cmd_prev = Uex(0);
- // calculate predicted trajectory
+ /* calculate predicted trajectory */
predicted_trajectory =
- calcPredictedTrajectory(mpc_resampled_ref_trajectory, mpc_matrix, x0_delayed, Uex);
+ calculatePredictedTrajectory(mpc_matrix, x0, Uex, mpc_resampled_ref_trajectory, prediction_dt);
// prepare diagnostic message
diagnostic =
@@ -108,30 +115,6 @@ bool MPC::calculateMPC(
return true;
}
-Trajectory MPC::calcPredictedTrajectory(
- const MPCTrajectory & mpc_resampled_ref_trajectory, const MPCMatrix & mpc_matrix,
- const VectorXd & x0_delayed, const VectorXd & Uex) const
-{
- const VectorXd Xex = mpc_matrix.Aex * x0_delayed + mpc_matrix.Bex * Uex + mpc_matrix.Wex;
- MPCTrajectory mpc_predicted_traj;
- const auto & traj = mpc_resampled_ref_trajectory;
- for (int i = 0; i < m_param.prediction_horizon; ++i) {
- const int DIM_X = m_vehicle_model_ptr->getDimX();
- const double lat_error = Xex(i * DIM_X);
- const double yaw_error = Xex(i * DIM_X + 1);
- const double x = traj.x.at(i) - std::sin(traj.yaw.at(i)) * lat_error;
- const double y = traj.y.at(i) + std::cos(traj.yaw.at(i)) * lat_error;
- const double z = traj.z.at(i);
- const double yaw = traj.yaw.at(i) + yaw_error;
- const double vx = traj.vx.at(i);
- const double k = traj.k.at(i);
- const double smooth_k = traj.smooth_k.at(i);
- const double relative_time = traj.relative_time.at(i);
- mpc_predicted_traj.push_back(x, y, z, yaw, vx, k, smooth_k, relative_time);
- }
- return MPCUtils::convertToAutowareTrajectory(mpc_predicted_traj);
-}
-
Float32MultiArrayStamped MPC::generateDiagData(
const MPCTrajectory & reference_trajectory, const MPCData & mpc_data,
const MPCMatrix & mpc_matrix, const AckermannLateralCommand & ctrl_cmd, const VectorXd & Uex,
@@ -794,6 +777,35 @@ VectorXd MPC::calcSteerRateLimitOnTrajectory(
return steer_rate_limits;
}
+Trajectory MPC::calculatePredictedTrajectory(
+ const MPCMatrix & mpc_matrix, const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const
+{
+ const auto predicted_mpc_trajectory =
+ m_vehicle_model_ptr->calculatePredictedTrajectoryInWorldCoordinate(
+ mpc_matrix.Aex, mpc_matrix.Bex, mpc_matrix.Cex, mpc_matrix.Wex, x0, Uex, reference_trajectory,
+ dt);
+
+ // do not over the reference trajectory
+ const auto predicted_length = MPCUtils::calcMPCTrajectoryArcLength(reference_trajectory);
+ const auto clipped_trajectory =
+ MPCUtils::clipTrajectoryByLength(predicted_mpc_trajectory, predicted_length);
+
+ const auto predicted_trajectory = MPCUtils::convertToAutowareTrajectory(clipped_trajectory);
+
+ // Publish trajectory in relative coordinate for debug purpose.
+ if (m_debug_publish_predicted_trajectory) {
+ const auto frenet = m_vehicle_model_ptr->calculatePredictedTrajectoryInFrenetCoordinate(
+ mpc_matrix.Aex, mpc_matrix.Bex, mpc_matrix.Cex, mpc_matrix.Wex, x0, Uex, reference_trajectory,
+ dt);
+ const auto frenet_clipped = MPCUtils::convertToAutowareTrajectory(
+ MPCUtils::clipTrajectoryByLength(frenet, predicted_length));
+ m_debug_frenet_predicted_trajectory_pub->publish(frenet_clipped);
+ }
+
+ return predicted_trajectory;
+}
+
bool MPC::isValid(const MPCMatrix & m) const
{
if (
diff --git a/control/mpc_lateral_controller/src/mpc_lateral_controller.cpp b/control/mpc_lateral_controller/src/mpc_lateral_controller.cpp
index 3d19104112a71..7eca1481ba921 100644
--- a/control/mpc_lateral_controller/src/mpc_lateral_controller.cpp
+++ b/control/mpc_lateral_controller/src/mpc_lateral_controller.cpp
@@ -42,7 +42,9 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
const auto dp_bool = [&](const std::string & s) { return node.declare_parameter(s); };
const auto dp_double = [&](const std::string & s) { return node.declare_parameter(s); };
- m_mpc.m_ctrl_period = node.get_parameter("ctrl_period").as_double();
+ m_mpc = std::make_unique(node);
+
+ m_mpc->m_ctrl_period = node.get_parameter("ctrl_period").as_double();
auto & p_filt = m_trajectory_filtering_param;
p_filt.enable_path_smoothing = dp_bool("enable_path_smoothing");
@@ -52,10 +54,10 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
p_filt.traj_resample_dist = dp_double("traj_resample_dist");
p_filt.extend_trajectory_for_end_yaw_control = dp_bool("extend_trajectory_for_end_yaw_control");
- m_mpc.m_admissible_position_error = dp_double("admissible_position_error");
- m_mpc.m_admissible_yaw_error_rad = dp_double("admissible_yaw_error_rad");
- m_mpc.m_use_steer_prediction = dp_bool("use_steer_prediction");
- m_mpc.m_param.steer_tau = dp_double("vehicle_model_steer_tau");
+ m_mpc->m_admissible_position_error = dp_double("admissible_position_error");
+ m_mpc->m_admissible_yaw_error_rad = dp_double("admissible_yaw_error_rad");
+ m_mpc->m_use_steer_prediction = dp_bool("use_steer_prediction");
+ m_mpc->m_param.steer_tau = dp_double("vehicle_model_steer_tau");
/* stop state parameters */
m_stop_state_entry_ego_speed = dp_double("stop_state_entry_ego_speed");
@@ -70,7 +72,7 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
const auto vehicle_info = vehicle_info_util::VehicleInfoUtil(node).getVehicleInfo();
const double wheelbase = vehicle_info.wheel_base_m;
constexpr double deg2rad = static_cast(M_PI) / 180.0;
- m_mpc.m_steer_lim = vehicle_info.max_steer_angle_rad;
+ m_mpc->m_steer_lim = vehicle_info.max_steer_angle_rad;
// steer rate limit depending on curvature
const auto steer_rate_lim_dps_list_by_curvature =
@@ -78,7 +80,7 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
const auto curvature_list_for_steer_rate_lim =
node.declare_parameter>("curvature_list_for_steer_rate_lim");
for (size_t i = 0; i < steer_rate_lim_dps_list_by_curvature.size(); ++i) {
- m_mpc.m_steer_rate_lim_map_by_curvature.emplace_back(
+ m_mpc->m_steer_rate_lim_map_by_curvature.emplace_back(
curvature_list_for_steer_rate_lim.at(i),
steer_rate_lim_dps_list_by_curvature.at(i) * deg2rad);
}
@@ -89,26 +91,26 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
const auto velocity_list_for_steer_rate_lim =
node.declare_parameter>("velocity_list_for_steer_rate_lim");
for (size_t i = 0; i < steer_rate_lim_dps_list_by_velocity.size(); ++i) {
- m_mpc.m_steer_rate_lim_map_by_velocity.emplace_back(
+ m_mpc->m_steer_rate_lim_map_by_velocity.emplace_back(
velocity_list_for_steer_rate_lim.at(i), steer_rate_lim_dps_list_by_velocity.at(i) * deg2rad);
}
/* vehicle model setup */
auto vehicle_model_ptr =
- createVehicleModel(wheelbase, m_mpc.m_steer_lim, m_mpc.m_param.steer_tau, node);
- m_mpc.setVehicleModel(vehicle_model_ptr);
+ createVehicleModel(wheelbase, m_mpc->m_steer_lim, m_mpc->m_param.steer_tau, node);
+ m_mpc->setVehicleModel(vehicle_model_ptr);
/* QP solver setup */
- m_mpc.setVehicleModel(vehicle_model_ptr);
+ m_mpc->setVehicleModel(vehicle_model_ptr);
auto qpsolver_ptr = createQPSolverInterface(node);
- m_mpc.setQPSolver(qpsolver_ptr);
+ m_mpc->setQPSolver(qpsolver_ptr);
/* delay compensation */
{
const double delay_tmp = dp_double("input_delay");
- const double delay_step = std::round(delay_tmp / m_mpc.m_ctrl_period);
- m_mpc.m_param.input_delay = delay_step * m_mpc.m_ctrl_period;
- m_mpc.m_input_buffer = std::deque(static_cast(delay_step), 0.0);
+ const double delay_step = std::round(delay_tmp / m_mpc->m_ctrl_period);
+ m_mpc->m_param.input_delay = delay_step * m_mpc->m_ctrl_period;
+ m_mpc->m_input_buffer = std::deque(static_cast(delay_step), 0.0);
}
/* steering offset compensation */
@@ -120,7 +122,7 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
{
const double steering_lpf_cutoff_hz = dp_double("steering_lpf_cutoff_hz");
const double error_deriv_lpf_cutoff_hz = dp_double("error_deriv_lpf_cutoff_hz");
- m_mpc.initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
+ m_mpc->initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
}
// ego nearest index search
@@ -129,8 +131,10 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
};
m_ego_nearest_dist_threshold = check_and_get_param("ego_nearest_dist_threshold");
m_ego_nearest_yaw_threshold = check_and_get_param("ego_nearest_yaw_threshold");
- m_mpc.ego_nearest_dist_threshold = m_ego_nearest_dist_threshold;
- m_mpc.ego_nearest_yaw_threshold = m_ego_nearest_yaw_threshold;
+ m_mpc->ego_nearest_dist_threshold = m_ego_nearest_dist_threshold;
+ m_mpc->ego_nearest_yaw_threshold = m_ego_nearest_yaw_threshold;
+
+ m_mpc->m_debug_publish_predicted_trajectory = dp_bool("debug_publish_predicted_trajectory");
m_pub_predicted_traj = node.create_publisher("~/output/predicted_trajectory", 1);
m_pub_debug_values =
@@ -144,10 +148,10 @@ MpcLateralController::MpcLateralController(rclcpp::Node & node)
m_set_param_res =
node.add_on_set_parameters_callback(std::bind(&MpcLateralController::paramCallback, this, _1));
- m_mpc.initializeSteeringPredictor();
+ m_mpc->initializeSteeringPredictor();
- m_mpc.setLogger(logger_);
- m_mpc.setClock(clock_);
+ m_mpc->setLogger(logger_);
+ m_mpc->setClock(clock_);
}
MpcLateralController::~MpcLateralController()
@@ -244,7 +248,7 @@ trajectory_follower::LateralOutput MpcLateralController::run(
m_is_ctrl_cmd_prev_initialized = true;
}
- const bool is_mpc_solved = m_mpc.calculateMPC(
+ const bool is_mpc_solved = m_mpc->calculateMPC(
m_current_steering, m_current_kinematic_state, ctrl_cmd, predicted_traj, debug_values);
// reset previous MPC result
@@ -253,7 +257,7 @@ trajectory_follower::LateralOutput MpcLateralController::run(
// After the recovery, the previous value of the optimization may deviate greatly from
// the actual steer angle, and it may make the optimization result unstable.
if (!is_mpc_solved) {
- m_mpc.resetPrevResult(m_current_steering);
+ m_mpc->resetPrevResult(m_current_steering);
} else {
setSteeringToHistory(ctrl_cmd);
}
@@ -284,11 +288,11 @@ trajectory_follower::LateralOutput MpcLateralController::run(
if (isStoppedState()) {
// Reset input buffer
- for (auto & value : m_mpc.m_input_buffer) {
+ for (auto & value : m_mpc->m_input_buffer) {
value = m_ctrl_cmd_prev.steering_tire_angle;
}
// Use previous command value as previous raw steer command
- m_mpc.m_raw_steer_cmd_prev = m_ctrl_cmd_prev.steering_tire_angle;
+ m_mpc->m_raw_steer_cmd_prev = m_ctrl_cmd_prev.steering_tire_angle;
return createLateralOutput(m_ctrl_cmd_prev, false);
}
@@ -323,15 +327,15 @@ bool MpcLateralController::isReady(const trajectory_follower::InputData & input_
m_current_kinematic_state = input_data.current_odometry;
m_current_steering = input_data.current_steering;
- if (!m_mpc.hasVehicleModel()) {
+ if (!m_mpc->hasVehicleModel()) {
info_throttle("MPC does not have a vehicle model");
return false;
}
- if (!m_mpc.hasQPSolver()) {
+ if (!m_mpc->hasQPSolver()) {
info_throttle("MPC does not have a QP solver");
return false;
}
- if (m_mpc.m_reference_trajectory.empty()) {
+ if (m_mpc->m_reference_trajectory.empty()) {
info_throttle("trajectory size is zero.");
return false;
}
@@ -354,7 +358,7 @@ void MpcLateralController::setTrajectory(
return;
}
- m_mpc.setReferenceTrajectory(msg, m_trajectory_filtering_param, current_kinematics);
+ m_mpc->setReferenceTrajectory(msg, m_trajectory_filtering_param, current_kinematics);
// update trajectory buffer to check the trajectory shape change.
m_trajectory_buffer.push_back(m_current_trajectory);
@@ -504,12 +508,12 @@ bool MpcLateralController::isMpcConverged()
void MpcLateralController::declareMPCparameters(rclcpp::Node & node)
{
- m_mpc.m_param.prediction_horizon = node.declare_parameter("mpc_prediction_horizon");
- m_mpc.m_param.prediction_dt = node.declare_parameter("mpc_prediction_dt");
+ m_mpc->m_param.prediction_horizon = node.declare_parameter("mpc_prediction_horizon");
+ m_mpc->m_param.prediction_dt = node.declare_parameter("mpc_prediction_dt");
const auto dp = [&](const auto & param) { return node.declare_parameter(param); };
- auto & nw = m_mpc.m_param.nominal_weight;
+ auto & nw = m_mpc->m_param.nominal_weight;
nw.lat_error = dp("mpc_weight_lat_error");
nw.heading_error = dp("mpc_weight_heading_error");
nw.heading_error_squared_vel = dp("mpc_weight_heading_error_squared_vel");
@@ -521,7 +525,7 @@ void MpcLateralController::declareMPCparameters(rclcpp::Node & node)
nw.terminal_lat_error = dp("mpc_weight_terminal_lat_error");
nw.terminal_heading_error = dp("mpc_weight_terminal_heading_error");
- auto & lcw = m_mpc.m_param.low_curvature_weight;
+ auto & lcw = m_mpc->m_param.low_curvature_weight;
lcw.lat_error = dp("mpc_low_curvature_weight_lat_error");
lcw.heading_error = dp("mpc_low_curvature_weight_heading_error");
lcw.heading_error_squared_vel = dp("mpc_low_curvature_weight_heading_error_squared_vel");
@@ -530,12 +534,12 @@ void MpcLateralController::declareMPCparameters(rclcpp::Node & node)
lcw.lat_jerk = dp("mpc_low_curvature_weight_lat_jerk");
lcw.steer_rate = dp("mpc_low_curvature_weight_steer_rate");
lcw.steer_acc = dp("mpc_low_curvature_weight_steer_acc");
- m_mpc.m_param.low_curvature_thresh_curvature = dp("mpc_low_curvature_thresh_curvature");
+ m_mpc->m_param.low_curvature_thresh_curvature = dp("mpc_low_curvature_thresh_curvature");
- m_mpc.m_param.zero_ff_steer_deg = dp("mpc_zero_ff_steer_deg");
- m_mpc.m_param.acceleration_limit = dp("mpc_acceleration_limit");
- m_mpc.m_param.velocity_time_constant = dp("mpc_velocity_time_constant");
- m_mpc.m_param.min_prediction_length = dp("mpc_min_prediction_length");
+ m_mpc->m_param.zero_ff_steer_deg = dp("mpc_zero_ff_steer_deg");
+ m_mpc->m_param.acceleration_limit = dp("mpc_acceleration_limit");
+ m_mpc->m_param.velocity_time_constant = dp("mpc_velocity_time_constant");
+ m_mpc->m_param.min_prediction_length = dp("mpc_min_prediction_length");
}
rcl_interfaces::msg::SetParametersResult MpcLateralController::paramCallback(
@@ -546,7 +550,7 @@ rcl_interfaces::msg::SetParametersResult MpcLateralController::paramCallback(
result.reason = "success";
// strong exception safety wrt MPCParam
- MPCParam param = m_mpc.m_param;
+ MPCParam param = m_mpc->m_param;
auto & nw = param.nominal_weight;
auto & lcw = param.low_curvature_weight;
@@ -587,15 +591,15 @@ rcl_interfaces::msg::SetParametersResult MpcLateralController::paramCallback(
// initialize input buffer
update_param(parameters, "input_delay", param.input_delay);
- const double delay_step = std::round(param.input_delay / m_mpc.m_ctrl_period);
- const double delay = delay_step * m_mpc.m_ctrl_period;
+ const double delay_step = std::round(param.input_delay / m_mpc->m_ctrl_period);
+ const double delay = delay_step * m_mpc->m_ctrl_period;
if (param.input_delay != delay) {
param.input_delay = delay;
- m_mpc.m_input_buffer = std::deque(static_cast(delay_step), 0.0);
+ m_mpc->m_input_buffer = std::deque(static_cast(delay_step), 0.0);
}
// transaction succeeds, now assign values
- m_mpc.m_param = param;
+ m_mpc->m_param = param;
} catch (const rclcpp::exceptions::InvalidParameterTypeException & e) {
result.successful = false;
result.reason = e.what();
diff --git a/control/mpc_lateral_controller/src/mpc_trajectory.cpp b/control/mpc_lateral_controller/src/mpc_trajectory.cpp
index 3c799722494b9..b7fed942375e8 100644
--- a/control/mpc_lateral_controller/src/mpc_trajectory.cpp
+++ b/control/mpc_lateral_controller/src/mpc_trajectory.cpp
@@ -58,6 +58,22 @@ MPCTrajectoryPoint MPCTrajectory::back()
return p;
}
+MPCTrajectoryPoint MPCTrajectory::at(const size_t i) const
+{
+ MPCTrajectoryPoint p;
+
+ p.x = x.at(i);
+ p.y = y.at(i);
+ p.z = z.at(i);
+ p.yaw = yaw.at(i);
+ p.vx = vx.at(i);
+ p.k = k.at(i);
+ p.smooth_k = smooth_k.at(i);
+ p.relative_time = relative_time.at(i);
+
+ return p;
+}
+
void MPCTrajectory::clear()
{
x.clear();
diff --git a/control/mpc_lateral_controller/src/mpc_utils.cpp b/control/mpc_lateral_controller/src/mpc_utils.cpp
index d3fc5fba0b014..01a81d9015b47 100644
--- a/control/mpc_lateral_controller/src/mpc_utils.cpp
+++ b/control/mpc_lateral_controller/src/mpc_utils.cpp
@@ -89,6 +89,15 @@ void calcMPCTrajectoryArcLength(const MPCTrajectory & trajectory, std::vector resampleMPCTrajectoryByDistance(
const MPCTrajectory & input, const double resample_interval_dist, const size_t nearest_seg_idx,
const double ego_offset_to_segment)
@@ -458,5 +467,22 @@ void extendTrajectoryInYawDirection(
}
}
+MPCTrajectory clipTrajectoryByLength(const MPCTrajectory & trajectory, const double length)
+{
+ MPCTrajectory clipped_trajectory;
+ clipped_trajectory.push_back(trajectory.at(0));
+
+ double current_length = 0.0;
+ for (size_t i = 1; i < trajectory.size(); ++i) {
+ current_length += calcDistance3d(trajectory, i, i - 1);
+ if (current_length > length) {
+ break;
+ }
+ clipped_trajectory.push_back(trajectory.at(i));
+ }
+
+ return clipped_trajectory;
+}
+
} // namespace MPCUtils
} // namespace autoware::motion::control::mpc_lateral_controller
diff --git a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_dynamics.cpp b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_dynamics.cpp
index 576907e79da4b..2467b1f0c2311 100644
--- a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_dynamics.cpp
+++ b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_dynamics.cpp
@@ -86,4 +86,48 @@ void DynamicsBicycleModel::calculateReferenceInput(Eigen::MatrixXd & u_ref)
m_lr * m_mass / (2 * m_cf * m_wheelbase) - m_lf * m_mass / (2 * m_cr * m_wheelbase);
u_ref(0, 0) = m_wheelbase * m_curvature + Kv * vel * vel * m_curvature;
}
+
+MPCTrajectory DynamicsBicycleModel::calculatePredictedTrajectoryInWorldCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, [[maybe_unused]] const double dt) const
+{
+ RCLCPP_ERROR(
+ rclcpp::get_logger("control.trajectory_follower.lateral_controller"),
+ "Predicted trajectory calculation in world coordinate is not supported in dynamic model. "
+ "Calculate in the Frenet coordinate instead.");
+ return calculatePredictedTrajectoryInFrenetCoordinate(
+ a_d, b_d, c_d, w_d, x0, Uex, reference_trajectory, dt);
+}
+
+MPCTrajectory DynamicsBicycleModel::calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, [[maybe_unused]] const double dt) const
+{
+ // state = [e, de, th, dth]
+ // e : lateral error
+ // de : derivative of lateral error
+ // th : heading angle error
+ // dth : derivative of heading angle error
+ // steer : steering angle (input)
+
+ Eigen::VectorXd Xex = a_d * x0 + b_d * Uex + w_d;
+ MPCTrajectory mpc_predicted_trajectory;
+ const auto DIM_X = getDimX();
+ const auto & t = reference_trajectory;
+
+ for (size_t i = 0; i < reference_trajectory.size(); ++i) {
+ const auto lateral_error = Xex(i * DIM_X); // model dependent
+ const auto yaw_error = Xex(i * DIM_X + 2); // model dependent
+ const auto x = t.x.at(i) - std::sin(t.yaw.at(i)) * lateral_error;
+ const auto y = t.y.at(i) + std::cos(t.yaw.at(i)) * lateral_error;
+ const auto yaw = t.yaw.at(i) + yaw_error;
+ mpc_predicted_trajectory.push_back(
+ x, y, t.z.at(i), yaw, t.vx.at(i), t.k.at(i), t.smooth_k.at(i), t.relative_time.at(i));
+ }
+ return mpc_predicted_trajectory;
+}
} // namespace autoware::motion::control::mpc_lateral_controller
diff --git a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics.cpp b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics.cpp
index 35bef667125c5..cd52dd4f79314 100644
--- a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics.cpp
+++ b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics.cpp
@@ -68,4 +68,85 @@ void KinematicsBicycleModel::calculateReferenceInput(Eigen::MatrixXd & u_ref)
{
u_ref(0, 0) = std::atan(m_wheelbase * m_curvature);
}
+
+MPCTrajectory KinematicsBicycleModel::calculatePredictedTrajectoryInWorldCoordinate(
+ [[maybe_unused]] const Eigen::MatrixXd & a_d, [[maybe_unused]] const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, [[maybe_unused]] const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const
+{
+ // Calculate predicted state in world coordinate since there is modeling errors in Frenet
+ // Relative coordinate x = [lat_err, yaw_err, steer]
+ // World coordinate x = [x, y, yaw, steer]
+
+ const auto & t = reference_trajectory;
+
+ // create initial state in the world coordinate
+ Eigen::VectorXd state_w = [&]() {
+ Eigen::VectorXd state = Eigen::VectorXd::Zero(4);
+ const auto lateral_error_0 = x0(0);
+ const auto yaw_error_0 = x0(1);
+ state(0, 0) = t.x.at(0) - std::sin(t.yaw.at(0)) * lateral_error_0; // world-x
+ state(1, 0) = t.y.at(0) + std::cos(t.yaw.at(0)) * lateral_error_0; // world-y
+ state(2, 0) = t.yaw.at(0) + yaw_error_0; // world-yaw
+ state(3, 0) = x0(2); // steering
+ return state;
+ }();
+
+ // update state in the world coordinate
+ const auto updateState = [&](
+ const Eigen::VectorXd & state_w, const Eigen::MatrixXd & input,
+ const double dt, const double velocity) {
+ const auto yaw = state_w(2);
+ const auto steer = state_w(3);
+ const auto desired_steer = input(0);
+
+ Eigen::VectorXd dstate = Eigen::VectorXd::Zero(4);
+ dstate(0) = velocity * std::cos(yaw);
+ dstate(1) = velocity * std::sin(yaw);
+ dstate(2) = velocity * std::tan(steer) / m_wheelbase;
+ dstate(3) = -(steer - desired_steer) / m_steer_tau;
+
+ // Note: don't do "return state_w + dstate * dt", which does not work due to the lazy evaluation
+ // in Eigen.
+ const Eigen::VectorXd next_state = state_w + dstate * dt;
+ return next_state;
+ };
+
+ MPCTrajectory mpc_predicted_trajectory;
+ const auto DIM_U = getDimU();
+
+ for (size_t i = 0; i < reference_trajectory.size(); ++i) {
+ state_w = updateState(state_w, Uex.block(i * DIM_U, 0, DIM_U, 1), dt, t.vx.at(i));
+ mpc_predicted_trajectory.push_back(
+ state_w(0), state_w(1), t.z.at(i), state_w(2), t.vx.at(i), t.k.at(i), t.smooth_k.at(i),
+ t.relative_time.at(i));
+ }
+ return mpc_predicted_trajectory;
+}
+
+MPCTrajectory KinematicsBicycleModel::calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, [[maybe_unused]] const double dt) const
+{
+ // Relative coordinate x = [lat_err, yaw_err, steer]
+
+ Eigen::VectorXd Xex = a_d * x0 + b_d * Uex + w_d;
+ MPCTrajectory mpc_predicted_trajectory;
+ const auto DIM_X = getDimX();
+ const auto & t = reference_trajectory;
+
+ for (size_t i = 0; i < reference_trajectory.size(); ++i) {
+ const auto lateral_error = Xex(i * DIM_X); // model dependent
+ const auto yaw_error = Xex(i * DIM_X + 1); // model dependent
+ const auto x = t.x.at(i) - std::sin(t.yaw.at(i)) * lateral_error;
+ const auto y = t.y.at(i) + std::cos(t.yaw.at(i)) * lateral_error;
+ const auto yaw = t.yaw.at(i) + yaw_error;
+ mpc_predicted_trajectory.push_back(
+ x, y, t.z.at(i), yaw, t.vx.at(i), t.k.at(i), t.smooth_k.at(i), t.relative_time.at(i));
+ }
+ return mpc_predicted_trajectory;
+}
} // namespace autoware::motion::control::mpc_lateral_controller
diff --git a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.cpp b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.cpp
index 1536beba9cd00..8f4510510aca9 100644
--- a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.cpp
+++ b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.cpp
@@ -59,4 +59,82 @@ void KinematicsBicycleModelNoDelay::calculateReferenceInput(Eigen::MatrixXd & u_
{
u_ref(0, 0) = std::atan(m_wheelbase * m_curvature);
}
+
+MPCTrajectory KinematicsBicycleModelNoDelay::calculatePredictedTrajectoryInWorldCoordinate(
+ [[maybe_unused]] const Eigen::MatrixXd & a_d, [[maybe_unused]] const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, [[maybe_unused]] const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, const double dt) const
+{
+ // Calculate predicted state in world coordinate since there is modeling errors in Frenet
+ // Relative coordinate x = [lat_err, yaw_err]
+ // World coordinate x = [x, y, yaw]
+
+ const auto & t = reference_trajectory;
+
+ // create initial state in the world coordinate
+ Eigen::VectorXd state_w = [&]() {
+ Eigen::VectorXd state = Eigen::VectorXd::Zero(3);
+ const auto lateral_error_0 = x0(0);
+ const auto yaw_error_0 = x0(1);
+ state(0, 0) = t.x.at(0) - std::sin(t.yaw.at(0)) * lateral_error_0; // world-x
+ state(1, 0) = t.y.at(0) + std::cos(t.yaw.at(0)) * lateral_error_0; // world-y
+ state(2, 0) = t.yaw.at(0) + yaw_error_0; // world-yaw
+ return state;
+ }();
+
+ // update state in the world coordinate
+ const auto updateState = [&](
+ const Eigen::VectorXd & state_w, const Eigen::MatrixXd & input,
+ const double dt, const double velocity) {
+ const auto yaw = state_w(2);
+ const auto steer = input(0);
+
+ Eigen::VectorXd dstate = Eigen::VectorXd::Zero(3);
+ dstate(0) = velocity * std::cos(yaw);
+ dstate(1) = velocity * std::sin(yaw);
+ dstate(2) = velocity * std::tan(steer) / m_wheelbase;
+
+ // Note: don't do "return state_w + dstate * dt", which does not work due to the lazy evaluation
+ // in Eigen.
+ const Eigen::VectorXd next_state = state_w + dstate * dt;
+ return next_state;
+ };
+
+ MPCTrajectory mpc_predicted_trajectory;
+ const auto DIM_U = getDimU();
+ for (size_t i = 0; i < t.size(); ++i) {
+ state_w = updateState(state_w, Uex.block(i * DIM_U, 0, DIM_U, 1), dt, t.vx.at(i));
+ mpc_predicted_trajectory.push_back(
+ state_w(0), state_w(1), t.z.at(i), state_w(2), t.vx.at(i), t.k.at(i), t.smooth_k.at(i),
+ t.relative_time.at(i));
+ }
+
+ return mpc_predicted_trajectory;
+}
+
+MPCTrajectory KinematicsBicycleModelNoDelay::calculatePredictedTrajectoryInFrenetCoordinate(
+ const Eigen::MatrixXd & a_d, const Eigen::MatrixXd & b_d,
+ [[maybe_unused]] const Eigen::MatrixXd & c_d, const Eigen::MatrixXd & w_d,
+ const Eigen::MatrixXd & x0, const Eigen::MatrixXd & Uex,
+ const MPCTrajectory & reference_trajectory, [[maybe_unused]] const double dt) const
+{
+ // Relative coordinate x = [lat_err, yaw_err]
+
+ Eigen::VectorXd Xex = a_d * x0 + b_d * Uex + w_d;
+ MPCTrajectory mpc_predicted_trajectory;
+ const auto DIM_X = getDimX();
+ const auto & t = reference_trajectory;
+
+ for (size_t i = 0; i < reference_trajectory.size(); ++i) {
+ const auto lateral_error = Xex(i * DIM_X); // model dependent
+ const auto yaw_error = Xex(i * DIM_X + 1); // model dependent
+ const auto x = t.x.at(i) - std::sin(t.yaw.at(i)) * lateral_error;
+ const auto y = t.y.at(i) + std::cos(t.yaw.at(i)) * lateral_error;
+ const auto yaw = t.yaw.at(i) + yaw_error;
+ mpc_predicted_trajectory.push_back(
+ x, y, t.z.at(i), yaw, t.vx.at(i), t.k.at(i), t.smooth_k.at(i), t.relative_time.at(i));
+ }
+ return mpc_predicted_trajectory;
+}
} // namespace autoware::motion::control::mpc_lateral_controller
diff --git a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_interface.cpp b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_interface.cpp
index 97e3f2742f546..f54a5e325bead 100644
--- a/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_interface.cpp
+++ b/control/mpc_lateral_controller/src/vehicle_model/vehicle_model_interface.cpp
@@ -20,19 +20,19 @@ VehicleModelInterface::VehicleModelInterface(int dim_x, int dim_u, int dim_y, do
: m_dim_x(dim_x), m_dim_u(dim_u), m_dim_y(dim_y), m_wheelbase(wheelbase)
{
}
-int VehicleModelInterface::getDimX()
+int VehicleModelInterface::getDimX() const
{
return m_dim_x;
}
-int VehicleModelInterface::getDimU()
+int VehicleModelInterface::getDimU() const
{
return m_dim_u;
}
-int VehicleModelInterface::getDimY()
+int VehicleModelInterface::getDimY() const
{
return m_dim_y;
}
-double VehicleModelInterface::getWheelbase()
+double VehicleModelInterface::getWheelbase() const
{
return m_wheelbase;
}
diff --git a/control/mpc_lateral_controller/test/test_mpc.cpp b/control/mpc_lateral_controller/test/test_mpc.cpp
index dade035daf26c..ba145b5dd146c 100644
--- a/control/mpc_lateral_controller/test/test_mpc.cpp
+++ b/control/mpc_lateral_controller/test/test_mpc.cpp
@@ -19,6 +19,7 @@
#include "mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_dynamics.hpp"
#include "mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics.hpp"
#include "mpc_lateral_controller/vehicle_model/vehicle_model_bicycle_kinematics_no_delay.hpp"
+#include "rclcpp/rclcpp.hpp"
#include "autoware_auto_control_msgs/msg/ackermann_lateral_command.hpp"
#include "autoware_auto_planning_msgs/msg/trajectory.hpp"
@@ -48,6 +49,22 @@ using geometry_msgs::msg::Pose;
using geometry_msgs::msg::PoseStamped;
using tier4_debug_msgs::msg::Float32MultiArrayStamped;
+TrajectoryPoint makePoint(const double x, const double y, const float vx)
+{
+ TrajectoryPoint p;
+ p.pose.position.x = x;
+ p.pose.position.y = y;
+ p.longitudinal_velocity_mps = vx;
+ return p;
+}
+
+nav_msgs::msg::Odometry makeOdometry(const geometry_msgs::msg::Pose & pose, const double velocity)
+{
+ nav_msgs::msg::Odometry odometry;
+ odometry.pose.pose = pose;
+ odometry.twist.twist.linear.x = velocity;
+ return odometry;
+}
class MPCTest : public ::testing::Test
{
protected:
@@ -86,16 +103,7 @@ class MPCTest : public ::testing::Test
TrajectoryFilteringParam trajectory_param;
- TrajectoryPoint makePoint(const double x, const double y, const float vx)
- {
- TrajectoryPoint p;
- p.pose.position.x = x;
- p.pose.position.y = y;
- p.longitudinal_velocity_mps = vx;
- return p;
- }
-
- void SetUp() override
+ void initParam()
{
param.prediction_horizon = 50;
param.prediction_dt = 0.1;
@@ -168,259 +176,268 @@ class MPCTest : public ::testing::Test
mpc.setReferenceTrajectory(dummy_straight_trajectory, trajectory_param, current_kinematics);
}
- nav_msgs::msg::Odometry makeOdometry(const geometry_msgs::msg::Pose & pose, const double velocity)
+ void SetUp() override
{
- nav_msgs::msg::Odometry odometry;
- odometry.pose.pose = pose;
- odometry.twist.twist.linear.x = velocity;
- return odometry;
+ rclcpp::init(0, nullptr);
+ initParam();
}
+
+ void TearDown() override { rclcpp::shutdown(); }
}; // class MPCTest
/* cppcheck-suppress syntaxError */
TEST_F(MPCTest, InitializeAndCalculate)
{
- MPC mpc;
- EXPECT_FALSE(mpc.hasVehicleModel());
- EXPECT_FALSE(mpc.hasQPSolver());
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ EXPECT_FALSE(mpc->hasVehicleModel());
+ EXPECT_FALSE(mpc->hasQPSolver());
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Init parameters and reference trajectory
- initializeMPC(mpc);
+ initializeMPC(*mpc);
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, InitializeAndCalculateRightTurn)
{
- MPC mpc;
- EXPECT_FALSE(mpc.hasVehicleModel());
- EXPECT_FALSE(mpc.hasQPSolver());
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ EXPECT_FALSE(mpc->hasVehicleModel());
+ EXPECT_FALSE(mpc->hasQPSolver());
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Init parameters and reference trajectory
- initializeMPC(mpc);
+ initializeMPC(*mpc);
const auto current_kinematics =
makeOdometry(dummy_right_turn_trajectory.points.front().pose, 0.0);
- mpc.setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
+ mpc->setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_LT(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_LT(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, OsqpCalculate)
{
- MPC mpc;
- initializeMPC(mpc);
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ initializeMPC(*mpc);
const auto current_kinematics = makeOdometry(dummy_straight_trajectory.points.front().pose, 0.0);
- mpc.setReferenceTrajectory(dummy_straight_trajectory, trajectory_param, current_kinematics);
+ mpc->setReferenceTrajectory(dummy_straight_trajectory, trajectory_param, current_kinematics);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared(logger);
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- EXPECT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ EXPECT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, OsqpCalculateRightTurn)
{
- MPC mpc;
- initializeMPC(mpc);
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ initializeMPC(*mpc);
const auto current_kinematics =
makeOdometry(dummy_right_turn_trajectory.points.front().pose, 0.0);
- mpc.setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
+ mpc->setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared(logger);
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_LT(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_LT(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, KinematicsNoDelayCalculate)
{
- MPC mpc;
- initializeMPC(mpc);
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ initializeMPC(*mpc);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Init filters
- mpc.initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
+ mpc->initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
// Init trajectory
const auto current_kinematics = makeOdometry(dummy_straight_trajectory.points.front().pose, 0.0);
- mpc.setReferenceTrajectory(dummy_straight_trajectory, trajectory_param, current_kinematics);
+ mpc->setReferenceTrajectory(dummy_straight_trajectory, trajectory_param, current_kinematics);
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, KinematicsNoDelayCalculateRightTurn)
{
- MPC mpc;
- initializeMPC(mpc);
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ initializeMPC(*mpc);
const auto current_kinematics =
makeOdometry(dummy_right_turn_trajectory.points.front().pose, 0.0);
- mpc.setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
+ mpc->setReferenceTrajectory(dummy_right_turn_trajectory, trajectory_param, current_kinematics);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Init filters
- mpc.initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
+ mpc->initializeLowPassFilters(steering_lpf_cutoff_hz, error_deriv_lpf_cutoff_hz);
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_LT(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_LT(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, DynamicCalculate)
{
- MPC mpc;
- initializeMPC(mpc);
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
+ initializeMPC(*mpc);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, mass_fl, mass_fr, mass_rl, mass_rr, cf, cr);
- mpc.setVehicleModel(vehicle_model_ptr);
- ASSERT_TRUE(mpc.hasVehicleModel());
+ mpc->setVehicleModel(vehicle_model_ptr);
+ ASSERT_TRUE(mpc->hasVehicleModel());
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
- ASSERT_TRUE(mpc.hasQPSolver());
+ mpc->setQPSolver(qpsolver_ptr);
+ ASSERT_TRUE(mpc->hasQPSolver());
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
}
TEST_F(MPCTest, MultiSolveWithBuffer)
{
- MPC mpc;
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
+ mpc->setVehicleModel(vehicle_model_ptr);
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
+ mpc->setQPSolver(qpsolver_ptr);
// Init parameters and reference trajectory
- initializeMPC(mpc);
+ initializeMPC(*mpc);
- mpc.m_input_buffer = {0.0, 0.0, 0.0};
+ mpc->m_input_buffer = {0.0, 0.0, 0.0};
// Calculate MPC
AckermannLateralCommand ctrl_cmd;
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_zero, default_velocity);
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
- EXPECT_EQ(mpc.m_input_buffer.size(), size_t(3));
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ EXPECT_EQ(mpc->m_input_buffer.size(), size_t(3));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
- EXPECT_EQ(mpc.m_input_buffer.size(), size_t(3));
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ EXPECT_EQ(mpc->m_input_buffer.size(), size_t(3));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
- EXPECT_EQ(mpc.m_input_buffer.size(), size_t(3));
- ASSERT_TRUE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ EXPECT_EQ(mpc->m_input_buffer.size(), size_t(3));
+ ASSERT_TRUE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
EXPECT_EQ(ctrl_cmd.steering_tire_angle, 0.0f);
EXPECT_EQ(ctrl_cmd.steering_tire_rotation_rate, 0.0f);
- EXPECT_EQ(mpc.m_input_buffer.size(), size_t(3));
+ EXPECT_EQ(mpc->m_input_buffer.size(), size_t(3));
}
TEST_F(MPCTest, FailureCases)
{
- MPC mpc;
+ auto node = rclcpp::Node("mpc_test_node", rclcpp::NodeOptions{});
+ auto mpc = std::make_unique(node);
std::shared_ptr vehicle_model_ptr =
std::make_shared(wheelbase, steer_limit, steer_tau);
- mpc.setVehicleModel(vehicle_model_ptr);
+ mpc->setVehicleModel(vehicle_model_ptr);
std::shared_ptr qpsolver_ptr = std::make_shared();
- mpc.setQPSolver(qpsolver_ptr);
+ mpc->setQPSolver(qpsolver_ptr);
// Init parameters and reference trajectory
- initializeMPC(mpc);
+ initializeMPC(*mpc);
// Calculate MPC with a pose too far from the trajectory
Pose pose_far;
@@ -430,10 +447,10 @@ TEST_F(MPCTest, FailureCases)
Trajectory pred_traj;
Float32MultiArrayStamped diag;
const auto odom = makeOdometry(pose_far, default_velocity);
- EXPECT_FALSE(mpc.calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
+ EXPECT_FALSE(mpc->calculateMPC(neutral_steer, odom, ctrl_cmd, pred_traj, diag));
// Calculate MPC with a fast velocity to make the prediction go further than the reference path
- EXPECT_FALSE(mpc.calculateMPC(
+ EXPECT_FALSE(mpc->calculateMPC(
neutral_steer, makeOdometry(pose_far, default_velocity + 10.0), ctrl_cmd, pred_traj, diag));
}
} // namespace autoware::motion::control::mpc_lateral_controller
diff --git a/control/trajectory_follower_node/param/lateral/mpc.param.yaml b/control/trajectory_follower_node/param/lateral/mpc.param.yaml
index 4222082d40deb..9998b6aadf656 100644
--- a/control/trajectory_follower_node/param/lateral/mpc.param.yaml
+++ b/control/trajectory_follower_node/param/lateral/mpc.param.yaml
@@ -74,3 +74,5 @@
update_steer_threshold: 0.035
average_num: 1000
steering_offset_limit: 0.02
+
+ debug_publish_predicted_trajectory: false # publish debug predicted trajectory in Frenet coordinate
diff --git a/launch/tier4_autoware_api_launch/package.xml b/launch/tier4_autoware_api_launch/package.xml
index 4d41ad0ac4a83..c55f1c8038e83 100644
--- a/launch/tier4_autoware_api_launch/package.xml
+++ b/launch/tier4_autoware_api_launch/package.xml
@@ -5,8 +5,6 @@
0.0.0
The tier4_autoware_api_launch package
Takagi, Isamu
- yabuta
- Kah Hooi Tan
Ryohsuke Mitsudome
Apache License 2.0
diff --git a/launch/tier4_localization_launch/launch/localization.launch.xml b/launch/tier4_localization_launch/launch/localization.launch.xml
index 3fba4bd773e68..f4d6679291849 100644
--- a/launch/tier4_localization_launch/launch/localization.launch.xml
+++ b/launch/tier4_localization_launch/launch/localization.launch.xml
@@ -15,14 +15,15 @@
-
-
+
-
+
+
+
diff --git a/launch/tier4_localization_launch/launch/pose_twist_estimator/ndt_scan_matcher.launch.xml b/launch/tier4_localization_launch/launch/pose_twist_estimator/ndt_scan_matcher.launch.xml
index e4b04d3d4a32e..bee300c587816 100644
--- a/launch/tier4_localization_launch/launch/pose_twist_estimator/ndt_scan_matcher.launch.xml
+++ b/launch/tier4_localization_launch/launch/pose_twist_estimator/ndt_scan_matcher.launch.xml
@@ -2,13 +2,16 @@
-
-
+
+
+
+
+
diff --git a/launch/tier4_localization_launch/launch/pose_twist_estimator/pose_twist_estimator.launch.xml b/launch/tier4_localization_launch/launch/pose_twist_estimator/pose_twist_estimator.launch.xml
index 7733b4e3117a1..02c6da20e17da 100644
--- a/launch/tier4_localization_launch/launch/pose_twist_estimator/pose_twist_estimator.launch.xml
+++ b/launch/tier4_localization_launch/launch/pose_twist_estimator/pose_twist_estimator.launch.xml
@@ -23,7 +23,9 @@
-
+
+
+
@@ -142,7 +144,9 @@
-
+
+
+
diff --git a/launch/tier4_localization_launch/launch/util/util.launch.py b/launch/tier4_localization_launch/launch/util/util.launch.py
index 1a34429f438ed..22a45fe7b8530 100644
--- a/launch/tier4_localization_launch/launch/util/util.launch.py
+++ b/launch/tier4_localization_launch/launch/util/util.launch.py
@@ -15,8 +15,6 @@
import launch
from launch.actions import DeclareLaunchArgument
from launch.actions import OpaqueFunction
-from launch.conditions import LaunchConfigurationNotEquals
-from launch.conditions import UnlessCondition
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import LoadComposableNodes
from launch_ros.descriptions import ComposableNode
@@ -71,16 +69,9 @@ def load_composable_node_param(param_path):
random_downsample_component,
]
- target_container = (
- "/sensing/lidar/top/pointcloud_preprocessor/pointcloud_container"
- if UnlessCondition(LaunchConfiguration("use_pointcloud_container")).evaluate(context)
- else LaunchConfiguration("pointcloud_container_name")
- )
-
load_composable_nodes = LoadComposableNodes(
- condition=LaunchConfigurationNotEquals(target_container, ""),
composable_node_descriptions=composable_nodes,
- target_container=target_container,
+ target_container=LaunchConfiguration("lidar_container_name"),
)
return [load_composable_nodes]
@@ -115,11 +106,10 @@ def add_launch_arg(name: str, default_value=None, description=None):
"path to the parameter file of random_downsample_filter",
)
add_launch_arg("use_intra_process", "true", "use ROS 2 component container communication")
- add_launch_arg("use_pointcloud_container", "True", "use pointcloud container")
add_launch_arg(
- "pointcloud_container_name",
- "/pointcloud_container",
- "container name",
+ "lidar_container_name",
+ "/sensing/lidar/top/pointcloud_preprocessor/pointcloud_container",
+ "container name of main lidar used for localization",
)
add_launch_arg(
diff --git a/launch/tier4_localization_launch/package.xml b/launch/tier4_localization_launch/package.xml
index c4de9c04dcaf2..9b4f727c9ce52 100644
--- a/launch/tier4_localization_launch/package.xml
+++ b/launch/tier4_localization_launch/package.xml
@@ -8,6 +8,9 @@
Koji Minoda
Kento Yabuuchi
Ryu Yamamoto
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
Apache License 2.0
Yamato Ando
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_fusion_based_detection.launch.xml b/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_fusion_based_detection.launch.xml
index 227aac50d6d90..4cb648852a03c 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_fusion_based_detection.launch.xml
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_fusion_based_detection.launch.xml
@@ -6,15 +6,12 @@
-
+
-
-
-
@@ -65,7 +62,7 @@
-
+
@@ -113,6 +110,7 @@
+
@@ -167,9 +165,7 @@
-
-
-
+
@@ -271,6 +267,8 @@
+
+
@@ -305,6 +303,7 @@
+
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_radar_fusion_based_detection.launch.xml b/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_radar_fusion_based_detection.launch.xml
index 65caad54876ff..ba86bc1e334ff 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_radar_fusion_based_detection.launch.xml
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/camera_lidar_radar_fusion_based_detection.launch.xml
@@ -6,7 +6,7 @@
-
+
@@ -91,7 +91,7 @@
-
+
@@ -139,6 +139,7 @@
+
@@ -193,9 +194,7 @@
-
-
-
+
@@ -297,6 +296,8 @@
+
+
@@ -344,6 +345,7 @@
+
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/detection.launch.xml b/launch/tier4_perception_launch/launch/object_recognition/detection/detection.launch.xml
index 0649d8c5d5116..885fa80ed7004 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/detection.launch.xml
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/detection.launch.xml
@@ -8,7 +8,7 @@
-
+
@@ -34,11 +34,6 @@
-
-
-
-
-
@@ -64,15 +59,15 @@
-
-
-
-
+
+
+
+
@@ -101,7 +96,7 @@
-
+
@@ -116,7 +111,7 @@
-
+
@@ -131,7 +126,7 @@
-
+
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_based_detection.launch.xml b/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_based_detection.launch.xml
index 2c8b7d6581c53..04c4264b70e5f 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_based_detection.launch.xml
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_based_detection.launch.xml
@@ -6,7 +6,7 @@
-
+
@@ -25,7 +25,7 @@
-
+
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_radar_based_detection.launch.xml b/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_radar_based_detection.launch.xml
index ed37f6270c913..adedc2312677f 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_radar_based_detection.launch.xml
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/lidar_radar_based_detection.launch.xml
@@ -5,7 +5,7 @@
-
+
@@ -23,7 +23,7 @@
-
+
diff --git a/launch/tier4_perception_launch/launch/object_recognition/detection/pointcloud_map_filter.launch.py b/launch/tier4_perception_launch/launch/object_recognition/detection/pointcloud_map_filter.launch.py
index 93d395ca3e466..1dcb9cfc90daf 100644
--- a/launch/tier4_perception_launch/launch/object_recognition/detection/pointcloud_map_filter.launch.py
+++ b/launch/tier4_perception_launch/launch/object_recognition/detection/pointcloud_map_filter.launch.py
@@ -141,7 +141,7 @@ def launch_setup(context, *args, **kwargs):
components = []
components.extend(pipeline.create_pipeline())
individual_container = ComposableNodeContainer(
- name=LaunchConfiguration("container_name"),
+ name=LaunchConfiguration("individual_container_name"),
namespace="",
package="rclcpp_components",
executable=LaunchConfiguration("container_executable"),
@@ -151,7 +151,7 @@ def launch_setup(context, *args, **kwargs):
)
pointcloud_container_loader = LoadComposableNodes(
composable_node_descriptions=components,
- target_container=LaunchConfiguration("container_name"),
+ target_container=LaunchConfiguration("pointcloud_container_name"),
condition=IfCondition(LaunchConfiguration("use_pointcloud_container")),
)
return [individual_container, pointcloud_container_loader]
@@ -168,7 +168,8 @@ def add_launch_arg(name: str, default_value=None):
add_launch_arg("use_multithread", "False")
add_launch_arg("use_intra_process", "True")
add_launch_arg("use_pointcloud_container", "False")
- add_launch_arg("container_name", "pointcloud_map_filter_pipeline_container")
+ add_launch_arg("pointcloud_container_name", "pointcloud_container")
+ add_launch_arg("individual_container_name", "pointcloud_map_filter_container")
add_launch_arg("use_pointcloud_map", "true")
set_container_executable = SetLaunchConfiguration(
"container_executable",
diff --git a/launch/tier4_perception_launch/launch/obstacle_segmentation/ground_segmentation/ground_segmentation.launch.py b/launch/tier4_perception_launch/launch/obstacle_segmentation/ground_segmentation/ground_segmentation.launch.py
index fecdd29bcb7e9..66a0bb4d0fb63 100644
--- a/launch/tier4_perception_launch/launch/obstacle_segmentation/ground_segmentation/ground_segmentation.launch.py
+++ b/launch/tier4_perception_launch/launch/obstacle_segmentation/ground_segmentation/ground_segmentation.launch.py
@@ -474,13 +474,7 @@ def get_single_frame_obstacle_segmentation_concatenated_component(input_topics,
def launch_setup(context, *args, **kwargs):
pipeline = GroundSegmentationPipeline(context)
- glog_component = ComposableNode(
- package="glog_component",
- plugin="GlogComponent",
- name="glog_component",
- )
-
- components = [glog_component]
+ components = []
components.extend(
pipeline.create_single_frame_obstacle_segmentation_components(
input_topic=LaunchConfiguration("input/pointcloud"),
@@ -511,7 +505,7 @@ def launch_setup(context, *args, **kwargs):
)
)
individual_container = ComposableNodeContainer(
- name=LaunchConfiguration("container_name"),
+ name=LaunchConfiguration("individual_container_name"),
namespace="",
package="rclcpp_components",
executable=LaunchConfiguration("container_executable"),
@@ -521,7 +515,7 @@ def launch_setup(context, *args, **kwargs):
)
pointcloud_container_loader = LoadComposableNodes(
composable_node_descriptions=components,
- target_container=LaunchConfiguration("container_name"),
+ target_container=LaunchConfiguration("pointcloud_container_name"),
condition=IfCondition(LaunchConfiguration("use_pointcloud_container")),
)
return [individual_container, pointcloud_container_loader]
@@ -537,7 +531,8 @@ def add_launch_arg(name: str, default_value=None):
add_launch_arg("use_multithread", "False")
add_launch_arg("use_intra_process", "True")
add_launch_arg("use_pointcloud_container", "False")
- add_launch_arg("container_name", "perception_pipeline_container")
+ add_launch_arg("pointcloud_container_name", "pointcloud_container")
+ add_launch_arg("individual_container_name", "ground_segmentation_container")
add_launch_arg("input/pointcloud", "/sensing/lidar/concatenated/pointcloud")
set_container_executable = SetLaunchConfiguration(
diff --git a/launch/tier4_perception_launch/launch/occupancy_grid_map/probabilistic_occupancy_grid_map.launch.xml b/launch/tier4_perception_launch/launch/occupancy_grid_map/probabilistic_occupancy_grid_map.launch.xml
index 281a52a85af71..244e0940acb70 100644
--- a/launch/tier4_perception_launch/launch/occupancy_grid_map/probabilistic_occupancy_grid_map.launch.xml
+++ b/launch/tier4_perception_launch/launch/occupancy_grid_map/probabilistic_occupancy_grid_map.launch.xml
@@ -7,7 +7,7 @@
-
+
@@ -24,7 +24,7 @@
-
+
@@ -40,7 +40,7 @@
-
+
@@ -56,7 +56,7 @@
-
+
diff --git a/launch/tier4_perception_launch/launch/perception.launch.xml b/launch/tier4_perception_launch/launch/perception.launch.xml
index 1b5753fb4d5c4..528038c5158b2 100644
--- a/launch/tier4_perception_launch/launch/perception.launch.xml
+++ b/launch/tier4_perception_launch/launch/perception.launch.xml
@@ -10,6 +10,9 @@
+
+
+
@@ -31,6 +34,9 @@
+
+
+
@@ -99,11 +105,6 @@
description="options: `ped_traffic_light_classifier_mobilenetv2_batch_*` or `ped_traffic_light_classifier_efficientNet_b1_batch_*`. The batch number must be either one of 1, 4, 6"
/>
-
-
-
-
-
@@ -126,7 +127,7 @@
-
+
@@ -141,7 +142,7 @@
-
+
@@ -177,6 +178,9 @@
+
+
+
@@ -189,10 +193,7 @@
-
-
-
-
+
diff --git a/launch/tier4_planning_launch/launch/planning.launch.xml b/launch/tier4_planning_launch/launch/planning.launch.xml
index bf81125286256..e02ba883d5115 100644
--- a/launch/tier4_planning_launch/launch/planning.launch.xml
+++ b/launch/tier4_planning_launch/launch/planning.launch.xml
@@ -7,6 +7,8 @@
+
+
@@ -21,7 +23,9 @@
-
+
+
+
diff --git a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving.launch.xml b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving.launch.xml
index 73e466afc0bda..bae084f80b51e 100644
--- a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving.launch.xml
+++ b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving.launch.xml
@@ -1,4 +1,6 @@
+
+
@@ -8,6 +10,7 @@
+
diff --git a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml
index 1c7643359c496..a297697234ef2 100644
--- a/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml
+++ b/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml
@@ -4,6 +4,7 @@
+
@@ -195,6 +196,7 @@
+
@@ -235,6 +237,7 @@
+
diff --git a/launch/tier4_planning_launch/launch/scenario_planning/scenario_planning.launch.xml b/launch/tier4_planning_launch/launch/scenario_planning/scenario_planning.launch.xml
index 66c90ef2ff833..e673d28804480 100644
--- a/launch/tier4_planning_launch/launch/scenario_planning/scenario_planning.launch.xml
+++ b/launch/tier4_planning_launch/launch/scenario_planning/scenario_planning.launch.xml
@@ -1,4 +1,5 @@
+
@@ -50,7 +51,9 @@
-
+
+
+
diff --git a/launch/tier4_vehicle_launch/launch/vehicle.launch.xml b/launch/tier4_vehicle_launch/launch/vehicle.launch.xml
index 0493e1ae0bbcf..0e1d22bfd1827 100644
--- a/launch/tier4_vehicle_launch/launch/vehicle.launch.xml
+++ b/launch/tier4_vehicle_launch/launch/vehicle.launch.xml
@@ -6,6 +6,7 @@
+
@@ -21,6 +22,7 @@
+
diff --git a/localization/ekf_localizer/README.md b/localization/ekf_localizer/README.md
index 87cc510c5fe14..02f14a86cd7df 100644
--- a/localization/ekf_localizer/README.md
+++ b/localization/ekf_localizer/README.md
@@ -83,6 +83,7 @@ The parameters are set in `launch/ekf_localizer.launch` .
| show_debug_info | bool | Flag to display debug info | false |
| predict_frequency | double | Frequency for filtering and publishing [Hz] | 50.0 |
| tf_rate | double | Frequency for tf broadcasting [Hz] | 10.0 |
+| publish_tf | bool | Whether to publish tf | true |
| extend_state_step | int | Max delay step which can be dealt with in EKF. Large number increases computational cost. | 50 |
| enable_yaw_bias_estimation | bool | Flag to enable yaw bias estimation | true |
diff --git a/localization/ekf_localizer/config/ekf_localizer.param.yaml b/localization/ekf_localizer/config/ekf_localizer.param.yaml
index 1db45db411b0c..9de7f56f5c006 100644
--- a/localization/ekf_localizer/config/ekf_localizer.param.yaml
+++ b/localization/ekf_localizer/config/ekf_localizer.param.yaml
@@ -4,6 +4,7 @@
enable_yaw_bias_estimation: true
predict_frequency: 50.0
tf_rate: 50.0
+ publish_tf: true
extend_state_step: 50
# for Pose measurement
diff --git a/localization/ekf_localizer/include/ekf_localizer/ekf_localizer.hpp b/localization/ekf_localizer/include/ekf_localizer/ekf_localizer.hpp
index ba18b7dadd599..6925e8b63c66b 100644
--- a/localization/ekf_localizer/include/ekf_localizer/ekf_localizer.hpp
+++ b/localization/ekf_localizer/include/ekf_localizer/ekf_localizer.hpp
@@ -199,7 +199,7 @@ class EKFLocalizer : public rclcpp::Node
/**
* @brief update predict frequency
*/
- void updatePredictFrequency();
+ void updatePredictFrequency(const rclcpp::Time & current_time);
/**
* @brief get transform from frame_id
@@ -219,7 +219,7 @@ class EKFLocalizer : public rclcpp::Node
/**
* @brief publish diagnostics message
*/
- void publishDiagnostics();
+ void publishDiagnostics(const rclcpp::Time & current_time);
/**
* @brief update simple1DFilter
diff --git a/localization/ekf_localizer/include/ekf_localizer/hyper_parameters.hpp b/localization/ekf_localizer/include/ekf_localizer/hyper_parameters.hpp
index e0e34f382e3dc..5139f900a339e 100644
--- a/localization/ekf_localizer/include/ekf_localizer/hyper_parameters.hpp
+++ b/localization/ekf_localizer/include/ekf_localizer/hyper_parameters.hpp
@@ -28,6 +28,7 @@ class HyperParameters
ekf_rate(node->declare_parameter("predict_frequency", 50.0)),
ekf_dt(1.0 / std::max(ekf_rate, 0.1)),
tf_rate_(node->declare_parameter("tf_rate", 10.0)),
+ publish_tf_(node->declare_parameter("publish_tf", true)),
enable_yaw_bias_estimation(node->declare_parameter("enable_yaw_bias_estimation", true)),
extend_state_step(node->declare_parameter("extend_state_step", 50)),
pose_frame_id(node->declare_parameter("pose_frame_id", std::string("map"))),
@@ -60,6 +61,7 @@ class HyperParameters
const double ekf_rate;
const double ekf_dt;
const double tf_rate_;
+ const bool publish_tf_;
const bool enable_yaw_bias_estimation;
const int extend_state_step;
const std::string pose_frame_id;
diff --git a/localization/ekf_localizer/package.xml b/localization/ekf_localizer/package.xml
index 4101bae88b6e2..e9d756e547f26 100644
--- a/localization/ekf_localizer/package.xml
+++ b/localization/ekf_localizer/package.xml
@@ -9,6 +9,11 @@
Yamato Ando
Takeshi Ishita
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Takamasa Horibe
diff --git a/localization/ekf_localizer/src/ekf_localizer.cpp b/localization/ekf_localizer/src/ekf_localizer.cpp
index 0ab88202e0c0d..f77481d45a534 100644
--- a/localization/ekf_localizer/src/ekf_localizer.cpp
+++ b/localization/ekf_localizer/src/ekf_localizer.cpp
@@ -60,9 +60,11 @@ EKFLocalizer::EKFLocalizer(const std::string & node_name, const rclcpp::NodeOpti
this, get_clock(), rclcpp::Duration::from_seconds(ekf_dt_),
std::bind(&EKFLocalizer::timerCallback, this));
- timer_tf_ = rclcpp::create_timer(
- this, get_clock(), rclcpp::Rate(params_.tf_rate_).period(),
- std::bind(&EKFLocalizer::timerTFCallback, this));
+ if (params_.publish_tf_) {
+ timer_tf_ = rclcpp::create_timer(
+ this, get_clock(), rclcpp::Rate(params_.tf_rate_).period(),
+ std::bind(&EKFLocalizer::timerTFCallback, this));
+ }
pub_pose_ = create_publisher("ekf_pose", 1);
pub_pose_cov_ =
@@ -102,14 +104,14 @@ EKFLocalizer::EKFLocalizer(const std::string & node_name, const rclcpp::NodeOpti
/*
* updatePredictFrequency
*/
-void EKFLocalizer::updatePredictFrequency()
+void EKFLocalizer::updatePredictFrequency(const rclcpp::Time & current_time)
{
if (last_predict_time_) {
- if (get_clock()->now() < *last_predict_time_) {
+ if (current_time < *last_predict_time_) {
warning_->warn("Detected jump back in time");
} else {
/* Measure dt */
- ekf_dt_ = (get_clock()->now() - *last_predict_time_).seconds();
+ ekf_dt_ = (current_time - *last_predict_time_).seconds();
DEBUG_INFO(
get_logger(), "[EKF] update ekf_dt_ to %f seconds (= %f hz)", ekf_dt_, 1 / ekf_dt_);
@@ -131,7 +133,7 @@ void EKFLocalizer::updatePredictFrequency()
proc_cov_yaw_d_ = std::pow(params_.proc_stddev_yaw_c * ekf_dt_, 2.0);
}
}
- last_predict_time_ = std::make_shared(get_clock()->now());
+ last_predict_time_ = std::make_shared(current_time);
}
/*
@@ -139,17 +141,19 @@ void EKFLocalizer::updatePredictFrequency()
*/
void EKFLocalizer::timerCallback()
{
+ const rclcpp::Time current_time = this->now();
+
if (!is_activated_) {
warning_->warnThrottle(
"The node is not activated. Provide initial pose to pose_initializer", 2000);
- publishDiagnostics();
+ publishDiagnostics(current_time);
return;
}
DEBUG_INFO(get_logger(), "========================= timer called =========================");
/* update predict frequency with measured timer rate */
- updatePredictFrequency();
+ updatePredictFrequency(current_time);
/* predict model in EKF */
stop_watch_.tic();
@@ -173,7 +177,7 @@ void EKFLocalizer::timerCallback()
stop_watch_.tic();
// save the initial size because the queue size can change in the loop
- const auto t_curr = this->now();
+ const auto t_curr = current_time;
const size_t n = pose_queue_.size();
for (size_t i = 0; i < n; ++i) {
const auto pose = pose_queue_.pop_increment_age();
@@ -208,7 +212,7 @@ void EKFLocalizer::timerCallback()
stop_watch_.tic();
// save the initial size because the queue size can change in the loop
- const auto t_curr = this->now();
+ const auto t_curr = current_time;
const size_t n = twist_queue_.size();
for (size_t i = 0; i < n; ++i) {
const auto twist = twist_queue_.pop_increment_age();
@@ -226,15 +230,15 @@ void EKFLocalizer::timerCallback()
const double roll = roll_filter_.get_x();
const double pitch = pitch_filter_.get_x();
const geometry_msgs::msg::PoseStamped current_ekf_pose =
- ekf_module_->getCurrentPose(this->now(), z, roll, pitch, false);
+ ekf_module_->getCurrentPose(current_time, z, roll, pitch, false);
const geometry_msgs::msg::PoseStamped current_biased_ekf_pose =
- ekf_module_->getCurrentPose(this->now(), z, roll, pitch, true);
+ ekf_module_->getCurrentPose(current_time, z, roll, pitch, true);
const geometry_msgs::msg::TwistStamped current_ekf_twist =
- ekf_module_->getCurrentTwist(this->now());
+ ekf_module_->getCurrentTwist(current_time);
/* publish ekf result */
publishEstimateResult(current_ekf_pose, current_biased_ekf_pose, current_ekf_twist);
- publishDiagnostics();
+ publishDiagnostics(current_time);
}
/*
@@ -254,10 +258,12 @@ void EKFLocalizer::timerTFCallback()
const double roll = roll_filter_.get_x();
const double pitch = pitch_filter_.get_x();
+ const rclcpp::Time current_time = this->now();
+
geometry_msgs::msg::TransformStamped transform_stamped;
transform_stamped = tier4_autoware_utils::pose2transform(
- ekf_module_->getCurrentPose(this->now(), z, roll, pitch, false), "base_link");
- transform_stamped.header.stamp = this->now();
+ ekf_module_->getCurrentPose(current_time, z, roll, pitch, false), "base_link");
+ transform_stamped.header.stamp = current_time;
tf_br_->sendTransform(transform_stamped);
}
@@ -338,15 +344,13 @@ void EKFLocalizer::publishEstimateResult(
const geometry_msgs::msg::PoseStamped & current_biased_ekf_pose,
const geometry_msgs::msg::TwistStamped & current_ekf_twist)
{
- rclcpp::Time current_time = this->now();
-
/* publish latest pose */
pub_pose_->publish(current_ekf_pose);
pub_biased_pose_->publish(current_biased_ekf_pose);
/* publish latest pose with covariance */
geometry_msgs::msg::PoseWithCovarianceStamped pose_cov;
- pose_cov.header.stamp = current_time;
+ pose_cov.header.stamp = current_ekf_pose.header.stamp;
pose_cov.header.frame_id = current_ekf_pose.header.frame_id;
pose_cov.pose.pose = current_ekf_pose.pose;
pose_cov.pose.covariance = ekf_module_->getCurrentPoseCovariance();
@@ -361,7 +365,7 @@ void EKFLocalizer::publishEstimateResult(
/* publish latest twist with covariance */
geometry_msgs::msg::TwistWithCovarianceStamped twist_cov;
- twist_cov.header.stamp = current_time;
+ twist_cov.header.stamp = current_ekf_twist.header.stamp;
twist_cov.header.frame_id = current_ekf_twist.header.frame_id;
twist_cov.twist.twist = current_ekf_twist.twist;
twist_cov.twist.covariance = ekf_module_->getCurrentTwistCovariance();
@@ -369,13 +373,13 @@ void EKFLocalizer::publishEstimateResult(
/* publish yaw bias */
tier4_debug_msgs::msg::Float64Stamped yawb;
- yawb.stamp = current_time;
+ yawb.stamp = current_ekf_twist.header.stamp;
yawb.data = ekf_module_->getYawBias();
pub_yaw_bias_->publish(yawb);
/* publish latest odometry */
nav_msgs::msg::Odometry odometry;
- odometry.header.stamp = current_time;
+ odometry.header.stamp = current_ekf_pose.header.stamp;
odometry.header.frame_id = current_ekf_pose.header.frame_id;
odometry.child_frame_id = "base_link";
odometry.pose = pose_cov.pose;
@@ -383,7 +387,7 @@ void EKFLocalizer::publishEstimateResult(
pub_odom_->publish(odometry);
}
-void EKFLocalizer::publishDiagnostics()
+void EKFLocalizer::publishDiagnostics(const rclcpp::Time & current_time)
{
std::vector diag_status_array;
@@ -419,7 +423,7 @@ void EKFLocalizer::publishDiagnostics()
diag_merged_status.hardware_id = this->get_name();
diagnostic_msgs::msg::DiagnosticArray diag_msg;
- diag_msg.header.stamp = this->now();
+ diag_msg.header.stamp = current_time;
diag_msg.status.push_back(diag_merged_status);
pub_diag_->publish(diag_msg);
}
diff --git a/localization/geo_pose_projector/package.xml b/localization/geo_pose_projector/package.xml
index d424ff14b9c99..c0e2db59deb64 100644
--- a/localization/geo_pose_projector/package.xml
+++ b/localization/geo_pose_projector/package.xml
@@ -6,6 +6,12 @@
The geo_pose_projector package
Yamato Ando
Koji Minoda
+ Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Koji Minoda
diff --git a/localization/gyro_odometer/package.xml b/localization/gyro_odometer/package.xml
index ad4a865a2014a..a0a982ddedc16 100644
--- a/localization/gyro_odometer/package.xml
+++ b/localization/gyro_odometer/package.xml
@@ -6,6 +6,11 @@
The gyro_odometer package as a ROS 2 node
Yamato Ando
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Yamato Ando
diff --git a/localization/landmark_based_localizer/ar_tag_based_localizer/package.xml b/localization/landmark_based_localizer/ar_tag_based_localizer/package.xml
index 857ec4f16f051..072479cc7aaf5 100644
--- a/localization/landmark_based_localizer/ar_tag_based_localizer/package.xml
+++ b/localization/landmark_based_localizer/ar_tag_based_localizer/package.xml
@@ -8,6 +8,9 @@
Masahiro Sakamoto
Yamato Ando
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Ryu Yamamoto
Apache License 2.0
ament_cmake
diff --git a/localization/landmark_based_localizer/landmark_manager/include/landmark_manager/landmark_manager.hpp b/localization/landmark_based_localizer/landmark_manager/include/landmark_manager/landmark_manager.hpp
index 7e78ed713dddc..c2b0751d91f9a 100644
--- a/localization/landmark_based_localizer/landmark_manager/include/landmark_manager/landmark_manager.hpp
+++ b/localization/landmark_based_localizer/landmark_manager/include/landmark_manager/landmark_manager.hpp
@@ -44,6 +44,8 @@ class LandmarkManager
const autoware_auto_mapping_msgs::msg::HADMapBin::ConstSharedPtr & msg,
const std::string & target_subtype);
+ [[nodiscard]] std::vector get_landmarks() const;
+
[[nodiscard]] visualization_msgs::msg::MarkerArray get_landmarks_as_marker_array_msg() const;
[[nodiscard]] geometry_msgs::msg::Pose calculate_new_self_pose(
diff --git a/localization/landmark_based_localizer/landmark_manager/package.xml b/localization/landmark_based_localizer/landmark_manager/package.xml
index 2e0e252386d1f..be19de9334e84 100644
--- a/localization/landmark_based_localizer/landmark_manager/package.xml
+++ b/localization/landmark_based_localizer/landmark_manager/package.xml
@@ -8,6 +8,9 @@
Masahiro Sakamoto
Yamato Ando
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Ryu Yamamoto
Apache License 2.0
ament_cmake
diff --git a/localization/landmark_based_localizer/landmark_manager/src/landmark_manager.cpp b/localization/landmark_based_localizer/landmark_manager/src/landmark_manager.cpp
index 7ddd66efea0a6..57bfcde461af6 100644
--- a/localization/landmark_based_localizer/landmark_manager/src/landmark_manager.cpp
+++ b/localization/landmark_based_localizer/landmark_manager/src/landmark_manager.cpp
@@ -83,6 +83,22 @@ void LandmarkManager::parse_landmarks(
}
}
+std::vector LandmarkManager::get_landmarks() const
+{
+ std::vector landmarks;
+
+ landmark_manager::Landmark landmark;
+ for (const auto & [landmark_id_str, landmark_poses] : landmarks_map_) {
+ for (const auto & pose : landmark_poses) {
+ landmark.id = landmark_id_str;
+ landmark.pose = pose;
+ landmarks.push_back(landmark);
+ }
+ }
+
+ return landmarks;
+}
+
visualization_msgs::msg::MarkerArray LandmarkManager::get_landmarks_as_marker_array_msg() const
{
int32_t id = 0;
diff --git a/localization/localization_error_monitor/package.xml b/localization/localization_error_monitor/package.xml
index 266ae6c848834..a1b352d911a0d 100644
--- a/localization/localization_error_monitor/package.xml
+++ b/localization/localization_error_monitor/package.xml
@@ -7,6 +7,11 @@
Yamato Ando
Koji Minoda
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Taichi Higashide
diff --git a/localization/localization_util/package.xml b/localization/localization_util/package.xml
index 20f9b160212b5..fa8da2aa1231a 100644
--- a/localization/localization_util/package.xml
+++ b/localization/localization_util/package.xml
@@ -8,6 +8,9 @@
Masahiro Sakamoto
Shintaro Sakoda
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Ryu Yamamoto
Apache License 2.0
Yamato Ando
diff --git a/localization/ndt_scan_matcher/include/ndt_scan_matcher/ndt_scan_matcher_core.hpp b/localization/ndt_scan_matcher/include/ndt_scan_matcher/ndt_scan_matcher_core.hpp
index e9aa265c78f34..71895c59ec37d 100644
--- a/localization/ndt_scan_matcher/include/ndt_scan_matcher/ndt_scan_matcher_core.hpp
+++ b/localization/ndt_scan_matcher/include/ndt_scan_matcher/ndt_scan_matcher_core.hpp
@@ -127,6 +127,8 @@ class NDTScanMatcher : public rclcpp::Node
const double & transform_probability, const double & nearest_voxel_transformation_likelihood);
static int count_oscillation(const std::vector & result_pose_msg_array);
+ std::array rotate_covariance(
+ const std::array & src_covariance, const Eigen::Matrix3d & rotation) const;
std::array estimate_covariance(
const pclomp::NdtResult & ndt_result, const Eigen::Matrix4f & initial_pose_matrix,
const rclcpp::Time & sensor_ros_time);
diff --git a/localization/ndt_scan_matcher/launch/ndt_scan_matcher.launch.xml b/localization/ndt_scan_matcher/launch/ndt_scan_matcher.launch.xml
index 891d172aaf8fd..cbcb0a9f74bc4 100644
--- a/localization/ndt_scan_matcher/launch/ndt_scan_matcher.launch.xml
+++ b/localization/ndt_scan_matcher/launch/ndt_scan_matcher.launch.xml
@@ -2,27 +2,27 @@
-
-
-
+
+
+
-
+
-
-
+
+
+
-
-
+
diff --git a/localization/ndt_scan_matcher/package.xml b/localization/ndt_scan_matcher/package.xml
index dcfdd77cb5a18..0913ee04174f5 100644
--- a/localization/ndt_scan_matcher/package.xml
+++ b/localization/ndt_scan_matcher/package.xml
@@ -8,6 +8,10 @@
Kento Yabuuchi
Koji Minoda
Masahiro Sakamoto
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Yamato Ando
diff --git a/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp b/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp
index 0f6fdbc15db26..942df03410165 100644
--- a/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp
+++ b/localization/ndt_scan_matcher/src/ndt_scan_matcher_core.cpp
@@ -486,7 +486,15 @@ void NDTScanMatcher::callback_sensor_points(
}
// covariance estimation
- std::array ndt_covariance = output_pose_covariance_;
+ const Eigen::Quaterniond map_to_base_link_quat = Eigen::Quaterniond(
+ result_pose_msg.orientation.w, result_pose_msg.orientation.x, result_pose_msg.orientation.y,
+ result_pose_msg.orientation.z);
+ const Eigen::Matrix3d map_to_base_link_rotation =
+ map_to_base_link_quat.normalized().toRotationMatrix();
+
+ std::array ndt_covariance =
+ rotate_covariance(output_pose_covariance_, map_to_base_link_rotation);
+
if (is_converged && use_cov_estimation_) {
const auto estimated_covariance =
estimate_covariance(ndt_result, initial_pose_matrix, sensor_ros_time);
@@ -766,6 +774,28 @@ int NDTScanMatcher::count_oscillation(
return max_oscillation_cnt;
}
+std::array NDTScanMatcher::rotate_covariance(
+ const std::array & src_covariance, const Eigen::Matrix3d & rotation) const
+{
+ std::array ret_covariance = src_covariance;
+
+ Eigen::Matrix3d src_cov;
+ src_cov << src_covariance[0], src_covariance[1], src_covariance[2], src_covariance[6],
+ src_covariance[7], src_covariance[8], src_covariance[12], src_covariance[13],
+ src_covariance[14];
+
+ Eigen::Matrix3d ret_cov;
+ ret_cov = rotation * src_cov * rotation.transpose();
+
+ for (Eigen::Index i = 0; i < 3; ++i) {
+ ret_covariance[i] = ret_cov(0, i);
+ ret_covariance[i + 6] = ret_cov(1, i);
+ ret_covariance[i + 12] = ret_cov(2, i);
+ }
+
+ return ret_covariance;
+}
+
std::array NDTScanMatcher::estimate_covariance(
const pclomp::NdtResult & ndt_result, const Eigen::Matrix4f & initial_pose_matrix,
const rclcpp::Time & sensor_ros_time)
diff --git a/localization/pose2twist/package.xml b/localization/pose2twist/package.xml
index 83bce5a718334..16c49bb51c218 100644
--- a/localization/pose2twist/package.xml
+++ b/localization/pose2twist/package.xml
@@ -6,6 +6,11 @@
The pose2twist package
Yamato Ando
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Yamato Ando
diff --git a/localization/pose_initializer/package.xml b/localization/pose_initializer/package.xml
index 1a1a8e48b7e3b..85c9c26bd6c8c 100644
--- a/localization/pose_initializer/package.xml
+++ b/localization/pose_initializer/package.xml
@@ -7,6 +7,11 @@
Yamato Ando
Takagi, Isamu
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Yamato Ando
Takagi, Isamu
diff --git a/localization/pose_instability_detector/package.xml b/localization/pose_instability_detector/package.xml
index 7774407a7990d..bf57e5589b747 100644
--- a/localization/pose_instability_detector/package.xml
+++ b/localization/pose_instability_detector/package.xml
@@ -10,6 +10,7 @@
Taiki Yamada
Ryu Yamamoto
Shintaro Sakoda
+ NGUYEN Viet Anh
Apache License 2.0
Shintaro Sakoda
diff --git a/localization/stop_filter/package.xml b/localization/stop_filter/package.xml
index b17809aaa9948..83eaf1b9fa821 100644
--- a/localization/stop_filter/package.xml
+++ b/localization/stop_filter/package.xml
@@ -7,6 +7,11 @@
Koji Minoda
Yamato Ando
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Koji Minoda
diff --git a/localization/tree_structured_parzen_estimator/package.xml b/localization/tree_structured_parzen_estimator/package.xml
index b699d5c69e610..96d2b9ecf54cc 100644
--- a/localization/tree_structured_parzen_estimator/package.xml
+++ b/localization/tree_structured_parzen_estimator/package.xml
@@ -8,6 +8,9 @@
Masahiro Sakamoto
Shintaro Sakoda
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Ryu Yamamoto
Apache License 2.0
Shintaro Sakoda
diff --git a/localization/twist2accel/package.xml b/localization/twist2accel/package.xml
index c44cd9d144566..08dacf9185769 100644
--- a/localization/twist2accel/package.xml
+++ b/localization/twist2accel/package.xml
@@ -7,6 +7,11 @@
Koji Minoda
Yamato Ando
Masahiro Sakamoto
+ Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Koji Minoda
diff --git a/localization/yabloc/yabloc_common/package.xml b/localization/yabloc/yabloc_common/package.xml
index d7e94ebefa24b..710ec0aeb75f8 100644
--- a/localization/yabloc/yabloc_common/package.xml
+++ b/localization/yabloc/yabloc_common/package.xml
@@ -5,6 +5,11 @@
YabLoc common library
Kento Yabuuchi
Masahiro Sakamoto
+ Yamato Ando
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_ros
diff --git a/localization/yabloc/yabloc_image_processing/launch/image_processing.launch.xml b/localization/yabloc/yabloc_image_processing/launch/image_processing.launch.xml
index aa6fc10ee6667..a0cad16302c2b 100644
--- a/localization/yabloc/yabloc_image_processing/launch/image_processing.launch.xml
+++ b/localization/yabloc/yabloc_image_processing/launch/image_processing.launch.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/localization/yabloc/yabloc_image_processing/package.xml b/localization/yabloc/yabloc_image_processing/package.xml
index ffdcea25b4b6d..209f09fdaa7ac 100644
--- a/localization/yabloc/yabloc_image_processing/package.xml
+++ b/localization/yabloc/yabloc_image_processing/package.xml
@@ -6,6 +6,11 @@
YabLoc image processing package
Kento Yabuuchi
Masahiro Sakamoto
+ Yamato Ando
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake
diff --git a/localization/yabloc/yabloc_monitor/package.xml b/localization/yabloc/yabloc_monitor/package.xml
index 8c92c3c6a4303..22a5d0eded6b6 100644
--- a/localization/yabloc/yabloc_monitor/package.xml
+++ b/localization/yabloc/yabloc_monitor/package.xml
@@ -7,6 +7,11 @@
Kento Yabuuchi
Koji Minoda
Masahiro Sakamoto
+ Yamato Ando
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_ros
diff --git a/localization/yabloc/yabloc_particle_filter/README.md b/localization/yabloc/yabloc_particle_filter/README.md
index 41ab7b1b10039..d42ce4647bc95 100644
--- a/localization/yabloc/yabloc_particle_filter/README.md
+++ b/localization/yabloc/yabloc_particle_filter/README.md
@@ -46,6 +46,12 @@ This package contains some executable nodes related to particle filter.
| `prediction_rate` | double | frequency of forecast updates, in Hz |
| `cov_xx_yy` | vector\ | the covariance of initial pose |
+### Services
+
+| Name | Type | Description |
+| -------------------- | ------------------------ | ------------------------------------------------ |
+| `yabloc_trigger_srv` | `std_srvs::srv::SetBool` | activation and deactivation of yabloc estimation |
+
## gnss_particle_corrector
### Purpose
diff --git a/localization/yabloc/yabloc_particle_filter/include/yabloc_particle_filter/prediction/predictor.hpp b/localization/yabloc/yabloc_particle_filter/include/yabloc_particle_filter/prediction/predictor.hpp
index c7794a2be9f51..e02393ee14db6 100644
--- a/localization/yabloc/yabloc_particle_filter/include/yabloc_particle_filter/prediction/predictor.hpp
+++ b/localization/yabloc/yabloc_particle_filter/include/yabloc_particle_filter/prediction/predictor.hpp
@@ -27,6 +27,7 @@
#include
#include
#include
+#include
#include
#include
@@ -46,6 +47,7 @@ class Predictor : public rclcpp::Node
using TwistCovStamped = geometry_msgs::msg::TwistWithCovarianceStamped;
using TwistStamped = geometry_msgs::msg::TwistStamped;
using Marker = visualization_msgs::msg::Marker;
+ using SetBool = std_srvs::srv::SetBool;
Predictor();
@@ -62,6 +64,7 @@ class Predictor : public rclcpp::Node
const std::vector cov_xx_yy_;
// Subscriber
+ rclcpp::Subscription::SharedPtr ekf_pose_sub_;
rclcpp::Subscription::SharedPtr initialpose_sub_;
rclcpp::Subscription::SharedPtr twist_cov_sub_;
rclcpp::Subscription::SharedPtr particles_sub_;
@@ -73,11 +76,15 @@ class Predictor : public rclcpp::Node
rclcpp::Publisher::SharedPtr pose_cov_pub_;
rclcpp::Publisher::SharedPtr marker_pub_;
std::unique_ptr tf2_broadcaster_;
+ // Server
+ rclcpp::Service::SharedPtr yabloc_trigger_server_;
// Timer callback
rclcpp::TimerBase::SharedPtr timer_;
float ground_height_{0};
+ bool yabloc_activated_{true};
+ PoseCovStamped::ConstSharedPtr latest_ekf_pose_ptr_{nullptr};
std::optional particle_array_opt_{std::nullopt};
std::optional latest_twist_opt_{std::nullopt};
@@ -92,6 +99,8 @@ class Predictor : public rclcpp::Node
void on_twist_cov(const TwistCovStamped::ConstSharedPtr twist);
void on_weighted_particles(const ParticleArray::ConstSharedPtr weighted_particles);
void on_timer();
+ void on_trigger_service(
+ SetBool::Request::ConstSharedPtr request, SetBool::Response::SharedPtr response);
//
void initialize_particles(const PoseCovStamped & initialpose);
diff --git a/localization/yabloc/yabloc_particle_filter/launch/yabloc_particle_filter.launch.xml b/localization/yabloc/yabloc_particle_filter/launch/yabloc_particle_filter.launch.xml
index f38264b828d34..5dd483f142174 100644
--- a/localization/yabloc/yabloc_particle_filter/launch/yabloc_particle_filter.launch.xml
+++ b/localization/yabloc/yabloc_particle_filter/launch/yabloc_particle_filter.launch.xml
@@ -16,6 +16,9 @@
+
+
+
diff --git a/localization/yabloc/yabloc_particle_filter/package.xml b/localization/yabloc/yabloc_particle_filter/package.xml
index aabb6009c2148..5db4aa0c29e88 100644
--- a/localization/yabloc/yabloc_particle_filter/package.xml
+++ b/localization/yabloc/yabloc_particle_filter/package.xml
@@ -6,6 +6,11 @@
YabLoc particle filter package
Kento Yabuuchi
Masahiro Sakamoto
+ Yamato Ando
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_ros
diff --git a/localization/yabloc/yabloc_particle_filter/src/prediction/predictor.cpp b/localization/yabloc/yabloc_particle_filter/src/prediction/predictor.cpp
index b16905ba19b41..764ef88bbde18 100644
--- a/localization/yabloc/yabloc_particle_filter/src/prediction/predictor.cpp
+++ b/localization/yabloc/yabloc_particle_filter/src/prediction/predictor.cpp
@@ -52,7 +52,12 @@ Predictor::Predictor()
auto on_initial = std::bind(&Predictor::on_initial_pose, this, _1);
auto on_twist_cov = std::bind(&Predictor::on_twist_cov, this, _1);
auto on_particle = std::bind(&Predictor::on_weighted_particles, this, _1);
- auto on_height = [this](std_msgs::msg::Float32 m) -> void { this->ground_height_ = m.data; };
+ auto on_height = [this](std_msgs::msg::Float32::ConstSharedPtr msg) -> void {
+ this->ground_height_ = msg->data;
+ };
+ auto on_ekf_pose = [this](PoseCovStamped::ConstSharedPtr msg) -> void {
+ this->latest_ekf_pose_ptr_ = msg;
+ };
initialpose_sub_ = create_subscription("~/input/initialpose", 1, on_initial);
particles_sub_ =
@@ -60,6 +65,7 @@ Predictor::Predictor()
height_sub_ = create_subscription("~/input/height", 10, on_height);
twist_cov_sub_ =
create_subscription("~/input/twist_with_covariance", 10, on_twist_cov);
+ ekf_pose_sub_ = create_subscription("~/input/ekf_pose", 10, on_ekf_pose);
// Timer callback
const double prediction_rate = declare_parameter("prediction_rate");
@@ -67,12 +73,41 @@ Predictor::Predictor()
timer_ = rclcpp::create_timer(
this, this->get_clock(), rclcpp::Rate(prediction_rate).period(), std::move(on_timer));
+ // Service server
+ using std::placeholders::_2;
+ auto on_trigger_service = std::bind(&Predictor::on_trigger_service, this, _1, _2);
+ yabloc_trigger_server_ = create_service("~/yabloc_trigger_srv", on_trigger_service);
+
// Optional modules
if (declare_parameter("visualize", false)) {
visualizer_ptr_ = std::make_unique(*this);
}
}
+void Predictor::on_trigger_service(
+ SetBool::Request::ConstSharedPtr request, SetBool::Response::SharedPtr response)
+{
+ if (request->data) {
+ RCLCPP_INFO_STREAM(get_logger(), "yabloc particle filter is activated");
+ } else {
+ RCLCPP_INFO_STREAM(get_logger(), "yabloc particle filter is deactivated");
+ }
+
+ const bool before_activated_ = yabloc_activated_;
+ yabloc_activated_ = request->data;
+ response->success = true;
+
+ if (yabloc_activated_ && (!before_activated_)) {
+ RCLCPP_INFO_STREAM(get_logger(), "restart particle filter");
+ if (latest_ekf_pose_ptr_) {
+ on_initial_pose(latest_ekf_pose_ptr_);
+ } else {
+ yabloc_activated_ = false;
+ response->success = false;
+ }
+ }
+}
+
void Predictor::on_initial_pose(const PoseCovStamped::ConstSharedPtr initialpose)
{
// Publish initial pose marker
@@ -181,6 +216,10 @@ void Predictor::on_timer()
{
// ==========================================================================
// Pre-check section
+ // Return if yabloc is not activated
+ if (!yabloc_activated_) {
+ return;
+ }
// Return if particle_array is not initialized yet
if (!particle_array_opt_.has_value()) {
return;
diff --git a/localization/yabloc/yabloc_pose_initializer/package.xml b/localization/yabloc/yabloc_pose_initializer/package.xml
index 4e3ca1c1e61d1..e9921db50093e 100644
--- a/localization/yabloc/yabloc_pose_initializer/package.xml
+++ b/localization/yabloc/yabloc_pose_initializer/package.xml
@@ -5,6 +5,11 @@
The pose initializer
Kento Yabuuchi
Masahiro Sakamoto
+ Yamato Ando
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_ros
diff --git a/map/map_height_fitter/package.xml b/map/map_height_fitter/package.xml
index 2dc864b0cb925..85258a8e54b22 100644
--- a/map/map_height_fitter/package.xml
+++ b/map/map_height_fitter/package.xml
@@ -8,6 +8,10 @@
Yamato Ando
Masahiro Sakamoto
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
Takagi, Isamu
diff --git a/map/map_loader/package.xml b/map/map_loader/package.xml
index c8fcce6f7002f..0103c7d2b74a7 100644
--- a/map/map_loader/package.xml
+++ b/map/map_loader/package.xml
@@ -9,6 +9,9 @@
Koji Minoda
Masahiro Sakamoto
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
Apache License 2.0
diff --git a/map/map_loader/src/lanelet2_map_loader/lanelet2_map_visualization_node.cpp b/map/map_loader/src/lanelet2_map_loader/lanelet2_map_visualization_node.cpp
index e14defcb47f26..a0c57759d51a6 100644
--- a/map/map_loader/src/lanelet2_map_loader/lanelet2_map_visualization_node.cpp
+++ b/map/map_loader/src/lanelet2_map_loader/lanelet2_map_visualization_node.cpp
@@ -215,6 +215,12 @@ void Lanelet2MapVisualizationNode::onMapBin(
insertMarkerArray(
&map_marker_array,
lanelet::visualization::autowareTrafficLightsAsMarkerArray(aw_tl_reg_elems, cl_trafficlights));
+ insertMarkerArray(
+ &map_marker_array, lanelet::visualization::generateTrafficLightRegulatoryElementIdMaker(
+ road_lanelets, cl_trafficlights));
+ insertMarkerArray(
+ &map_marker_array, lanelet::visualization::generateTrafficLightRegulatoryElementIdMaker(
+ crosswalk_lanelets, cl_trafficlights));
insertMarkerArray(
&map_marker_array,
lanelet::visualization::generateTrafficLightIdMaker(aw_tl_reg_elems, cl_trafficlights));
diff --git a/map/map_projection_loader/package.xml b/map/map_projection_loader/package.xml
index 76e40d4379de4..475881577bd58 100644
--- a/map/map_projection_loader/package.xml
+++ b/map/map_projection_loader/package.xml
@@ -8,6 +8,10 @@
Yamato Ando
Masahiro Sakamoto
Kento Yabuuchi
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_auto
diff --git a/map/map_tf_generator/package.xml b/map/map_tf_generator/package.xml
index 6e266b0ad82f0..6f08da169309e 100644
--- a/map/map_tf_generator/package.xml
+++ b/map/map_tf_generator/package.xml
@@ -7,6 +7,10 @@
Yamato Ando
Kento Yabuuchi
Masahiro Sakamoto
+ NGUYEN Viet Anh
+ Taiki Yamada
+ Shintaro Sakoda
+ Ryu Yamamoto
Apache License 2.0
ament_cmake_auto
diff --git a/perception/map_based_prediction/README.md b/perception/map_based_prediction/README.md
index ec2f57963332f..2419cdb010799 100644
--- a/perception/map_based_prediction/README.md
+++ b/perception/map_based_prediction/README.md
@@ -124,7 +124,7 @@ See paper [2] for more details.
`lateral_control_time_horizon` parameter supports the tuning of the lateral path shape. This parameter is used to calculate the time to reach the reference path. The smaller the value, the more the path will be generated to reach the reference path quickly. (Mostly the center of the lane.)
-#### Pruning predicted paths with lateral acceleration constraint
+#### Pruning predicted paths with lateral acceleration constraint (for vehicle obstacles)
It is possible to apply a maximum lateral acceleration constraint to generated vehicle paths. This check verifies if it is possible for the vehicle to perform the predicted path without surpassing a lateral acceleration threshold `max_lateral_accel` when taking a curve. If it is not possible, it checks if the vehicle can slow down on time to take the curve with a deceleration of `min_acceleration_before_curve` and comply with the constraint. If that is also not possible, the path is eliminated.
@@ -136,11 +136,47 @@ Currently we provide three parameters to tune the lateral acceleration constrain
You can change these parameters in rosparam in the table below.
-| param name | default value |
-| ----------------------------------------- | -------------- |
-| `check_lateral_acceleration_constraints_` | `false` [bool] |
-| `max_lateral_accel` | `2.0` [m/s^2] |
-| `min_acceleration_before_curve` | `-2.0` [m/s^2] |
+| param name | default value |
+| ---------------------------------------- | -------------- |
+| `check_lateral_acceleration_constraints` | `false` [bool] |
+| `max_lateral_accel` | `2.0` [m/s^2] |
+| `min_acceleration_before_curve` | `-2.0` [m/s^2] |
+
+## Using Vehicle Acceleration for Path Prediction (for Vehicle Obstacles)
+
+By default, the `map_based_prediction` module uses the current obstacle's velocity to compute its predicted path length. However, it is possible to use the obstacle's current acceleration to calculate its predicted path's length.
+
+### Decaying Acceleration Model
+
+Since this module tries to predict the vehicle's path several seconds into the future, it is not practical to consider the current vehicle's acceleration as constant (it is not assumed the vehicle will be accelerating for `prediction_time_horizon` seconds after detection). Instead, a decaying acceleration model is used. With the decaying acceleration model, a vehicle's acceleration is modeled as:
+
+$\ a(t) = a\_{t0} \cdot e^{-\lambda \cdot t} $
+
+where $\ a\_{t0} $ is the vehicle acceleration at the time of detection $\ t0 $, and $\ \lambda $ is the decay constant $\ \lambda = \ln(2) / hl $ and $\ hl $ is the exponential's half life.
+
+Furthermore, the integration of $\ a(t) $ over time gives us equations for velocity, $\ v(t) $ and distance $\ x(t) $ as:
+
+$\ v(t) = v*{t0} + a*{t0} \* (1/\lambda) \cdot (1 - e^{-\lambda \cdot t}) $
+
+and
+
+$\ x(t) = x*{t0} + (v*{t0} + a*{t0} \* (1/\lambda)) \cdot t + a*{t0}(1/λ^2)(e^{-\lambda \cdot t} - 1) $
+
+With this model, the influence of the vehicle's detected instantaneous acceleration on the predicted path's length is diminished but still considered. This feature also considers that the obstacle might not accelerate past its road's speed limit (multiplied by a tunable factor).
+
+Currently, we provide three parameters to tune the use of obstacle acceleration for path prediction:
+
+- `use_vehicle_acceleration`: to enable the feature.
+- `acceleration_exponential_half_life`: The decaying acceleration model considers that the current vehicle acceleration will be halved after this many seconds.
+- `speed_limit_multiplier`: Set the vehicle type obstacle's maximum predicted speed as the legal speed limit in that lanelet times this value. This value should be at least equal or greater than 1.0.
+
+You can change these parameters in `rosparam` in the table below.
+
+| Param Name | Default Value |
+| ------------------------------------ | -------------- |
+| `use_vehicle_acceleration` | `false` [bool] |
+| `acceleration_exponential_half_life` | `2.5` [s] |
+| `speed_limit_multiplier` | `1.5` [] |
### Path prediction for crosswalk users
diff --git a/perception/map_based_prediction/config/map_based_prediction.param.yaml b/perception/map_based_prediction/config/map_based_prediction.param.yaml
index fe4d2a51ec6f3..fdd64174de9be 100644
--- a/perception/map_based_prediction/config/map_based_prediction.param.yaml
+++ b/perception/map_based_prediction/config/map_based_prediction.param.yaml
@@ -16,6 +16,9 @@
check_lateral_acceleration_constraints: false # whether to check if the predicted path complies with lateral acceleration constraints
max_lateral_accel: 2.0 # [m/ss] max acceptable lateral acceleration for predicted vehicle paths
min_acceleration_before_curve: -2.0 # [m/ss] min acceleration a vehicle might take to decelerate before a curve
+ use_vehicle_acceleration: false # whether to consider current vehicle acceleration when predicting paths or not
+ speed_limit_multiplier: 1.5 # When using vehicle acceleration. Set vehicle's maximum predicted speed as the legal speed limit in that lanelet times this value
+ acceleration_exponential_half_life: 2.5 # [s] When using vehicle acceleration. The decaying acceleration model considers that the current vehicle acceleration will be halved after this many seconds
# parameter for shoulder lane prediction
prediction_time_horizon_rate_for_validate_shoulder_lane_length: 0.8
diff --git a/perception/map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp b/perception/map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp
index 02ca62a61717c..f61dc75ffb85b 100644
--- a/perception/map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp
+++ b/perception/map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp
@@ -22,6 +22,7 @@
#include
#include
+#include
#include
#include "autoware_auto_planning_msgs/msg/trajectory_point.hpp"
@@ -89,6 +90,7 @@ struct LaneletData
struct PredictedRefPath
{
float probability;
+ double speed_limit;
PosePath path;
Maneuver maneuver;
};
@@ -175,6 +177,10 @@ class MapBasedPredictionNode : public rclcpp::Node
double max_lateral_accel_;
double min_acceleration_before_curve_;
+ bool use_vehicle_acceleration_;
+ double speed_limit_multiplier_;
+ double acceleration_exponential_half_life_;
+
// Stop watch
StopWatch stop_watch_;
@@ -231,7 +237,8 @@ class MapBasedPredictionNode : public rclcpp::Node
void addReferencePaths(
const TrackedObject & object, const lanelet::routing::LaneletPaths & candidate_paths,
const float path_probability, const ManeuverProbability & maneuver_probability,
- const Maneuver & maneuver, std::vector & reference_paths);
+ const Maneuver & maneuver, std::vector & reference_paths,
+ const double speed_limit = 0.0);
std::vector convertPathType(const lanelet::routing::LaneletPaths & paths);
void updateFuturePossibleLanelets(
@@ -316,8 +323,11 @@ class MapBasedPredictionNode : public rclcpp::Node
};
inline bool isLateralAccelerationConstraintSatisfied(
- const TrajectoryPoints & trajectory [[maybe_unused]], const double delta_time)
+ const TrajectoryPoints & trajectory, const double delta_time)
{
+ constexpr double epsilon = 1E-6;
+ if (delta_time < epsilon) throw std::invalid_argument("delta_time must be a positive value");
+
if (trajectory.size() < 3) return true;
const double max_lateral_accel_abs = std::fabs(max_lateral_accel_);
@@ -343,19 +353,17 @@ class MapBasedPredictionNode : public rclcpp::Node
delta_theta += 2.0 * M_PI;
}
- const double yaw_rate = std::max(delta_theta / delta_time, 1.0E-5);
+ const double yaw_rate = std::max(std::abs(delta_theta / delta_time), 1.0E-5);
const double current_speed = std::abs(trajectory.at(i).longitudinal_velocity_mps);
// Compute lateral acceleration
const double lateral_acceleration = std::abs(current_speed * yaw_rate);
if (lateral_acceleration < max_lateral_accel_abs) continue;
-
const double v_curvature_max = std::sqrt(max_lateral_accel_abs / yaw_rate);
const double t =
(v_curvature_max - current_speed) / min_acceleration_before_curve_; // acc is negative
const double distance_to_slow_down =
current_speed * t + 0.5 * min_acceleration_before_curve_ * std::pow(t, 2);
-
if (distance_to_slow_down > arc_length) return false;
}
return true;
diff --git a/perception/map_based_prediction/include/map_based_prediction/path_generator.hpp b/perception/map_based_prediction/include/map_based_prediction/path_generator.hpp
index 4da4f62be2ede..6dfc4a8db9e20 100644
--- a/perception/map_based_prediction/include/map_based_prediction/path_generator.hpp
+++ b/perception/map_based_prediction/include/map_based_prediction/path_generator.hpp
@@ -91,7 +91,7 @@ class PathGenerator
PredictedPath generatePathForOffLaneVehicle(const TrackedObject & object);
PredictedPath generatePathForOnLaneVehicle(
- const TrackedObject & object, const PosePath & ref_paths);
+ const TrackedObject & object, const PosePath & ref_paths, const double speed_limit = 0.0);
PredictedPath generatePathForCrosswalkUser(
const TrackedObject & object, const CrosswalkEdgePoints & reachable_crosswalk) const;
@@ -99,17 +99,30 @@ class PathGenerator
PredictedPath generatePathToTargetPoint(
const TrackedObject & object, const Eigen::Vector2d & point) const;
+ void setUseVehicleAcceleration(const bool use_vehicle_acceleration)
+ {
+ use_vehicle_acceleration_ = use_vehicle_acceleration;
+ }
+
+ void setAccelerationHalfLife(const double acceleration_exponential_half_life)
+ {
+ acceleration_exponential_half_life_ = acceleration_exponential_half_life;
+ }
+
private:
// Parameters
double time_horizon_;
double lateral_time_horizon_;
double sampling_time_interval_;
double min_crosswalk_user_velocity_;
+ bool use_vehicle_acceleration_;
+ double acceleration_exponential_half_life_;
// Member functions
PredictedPath generateStraightPath(const TrackedObject & object) const;
- PredictedPath generatePolynomialPath(const TrackedObject & object, const PosePath & ref_path);
+ PredictedPath generatePolynomialPath(
+ const TrackedObject & object, const PosePath & ref_path, const double speed_limit = 0.0);
FrenetPath generateFrenetPath(
const FrenetPoint & current_point, const FrenetPoint & target_point, const double max_length);
@@ -125,7 +138,8 @@ class PathGenerator
const TrackedObject & object, const FrenetPath & frenet_predicted_path,
const PosePath & ref_path);
- FrenetPoint getFrenetPoint(const TrackedObject & object, const PosePath & ref_path);
+ FrenetPoint getFrenetPoint(
+ const TrackedObject & object, const PosePath & ref_path, const double speed_limit = 0.0);
};
} // namespace map_based_prediction
diff --git a/perception/map_based_prediction/src/map_based_prediction_node.cpp b/perception/map_based_prediction/src/map_based_prediction_node.cpp
index 75c1d61e0a19c..c949eae21aeff 100644
--- a/perception/map_based_prediction/src/map_based_prediction_node.cpp
+++ b/perception/map_based_prediction/src/map_based_prediction_node.cpp
@@ -24,7 +24,6 @@
#include
#include
#include
-#include
#include
@@ -385,11 +384,7 @@ bool withinRoadLanelet(
const TrackedObject & object, const lanelet::LaneletMapPtr & lanelet_map_ptr,
const bool use_yaw_information = false)
{
- using Point = boost::geometry::model::d2::point_xy;
-
const auto & obj_pos = object.kinematics.pose_with_covariance.pose.position;
- const Point p_object{obj_pos.x, obj_pos.y};
-
lanelet::BasicPoint2d search_point(obj_pos.x, obj_pos.y);
// nearest lanelet
constexpr double search_radius = 10.0; // [m]
@@ -613,16 +608,16 @@ ObjectClassification::_label_type changeLabelForPrediction(
case ObjectClassification::BICYCLE: { // if object is within road lanelet and satisfies yaw
// constraints
const bool within_road_lanelet = withinRoadLanelet(object, lanelet_map_ptr_, true);
- const float high_speed_threshold =
+ // if the object is within lanelet, do the same estimation with vehicle
+ if (within_road_lanelet) return ObjectClassification::MOTORCYCLE;
+
+ constexpr float high_speed_threshold =
tier4_autoware_utils::kmph2mps(25.0); // High speed bicycle 25 km/h
// calc abs speed from x and y velocity
const double abs_speed = std::hypot(
object.kinematics.twist_with_covariance.twist.linear.x,
object.kinematics.twist_with_covariance.twist.linear.y);
const bool high_speed_object = abs_speed > high_speed_threshold;
-
- // if the object is within lanelet, do the same estimation with vehicle
- if (within_road_lanelet) return ObjectClassification::MOTORCYCLE;
// high speed object outside road lanelet will move like unknown object
// return ObjectClassification::UNKNOWN; // temporary disabled
if (high_speed_object) return label; // Do nothing for now
@@ -788,10 +783,18 @@ MapBasedPredictionNode::MapBasedPredictionNode(const rclcpp::NodeOptions & node_
prediction_time_horizon_rate_for_validate_lane_length_ =
declare_parameter("prediction_time_horizon_rate_for_validate_shoulder_lane_length");
+ use_vehicle_acceleration_ = declare_parameter("use_vehicle_acceleration");
+ speed_limit_multiplier_ = declare_parameter("speed_limit_multiplier");
+ acceleration_exponential_half_life_ =
+ declare_parameter("acceleration_exponential_half_life");
+
path_generator_ = std::make_shared(
prediction_time_horizon_, lateral_control_time_horizon_, prediction_sampling_time_interval_,
min_crosswalk_user_velocity_);
+ path_generator_->setUseVehicleAcceleration(use_vehicle_acceleration_);
+ path_generator_->setAccelerationHalfLife(acceleration_exponential_half_life_);
+
sub_objects_ = this->create_subscription(
"~/input/objects", 1,
std::bind(&MapBasedPredictionNode::objectsCallback, this, std::placeholders::_1));
@@ -817,6 +820,13 @@ rcl_interfaces::msg::SetParametersResult MapBasedPredictionNode::onParam(
updateParam(parameters, "min_acceleration_before_curve", min_acceleration_before_curve_);
updateParam(
parameters, "check_lateral_acceleration_constraints", check_lateral_acceleration_constraints_);
+ updateParam(parameters, "use_vehicle_acceleration", use_vehicle_acceleration_);
+ updateParam(parameters, "speed_limit_multiplier", speed_limit_multiplier_);
+ updateParam(
+ parameters, "acceleration_exponential_half_life", acceleration_exponential_half_life_);
+
+ path_generator_->setUseVehicleAcceleration(use_vehicle_acceleration_);
+ path_generator_->setAccelerationHalfLife(acceleration_exponential_half_life_);
rcl_interfaces::msg::SetParametersResult result;
result.successful = true;
@@ -1010,7 +1020,7 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt
for (const auto & ref_path : ref_paths) {
PredictedPath predicted_path = path_generator_->generatePathForOnLaneVehicle(
- yaw_fixed_transformed_object, ref_path.path);
+ yaw_fixed_transformed_object, ref_path.path, ref_path.speed_limit);
if (predicted_path.path.empty()) continue;
if (!check_lateral_acceleration_constraints_) {
@@ -1555,14 +1565,63 @@ std::vector MapBasedPredictionNode::getPredictedReferencePath(
object.kinematics.twist_with_covariance.twist.linear.x,
object.kinematics.twist_with_covariance.twist.linear.y);
+ // Using a decaying acceleration model. Consult the README for more information about the model.
+ const double obj_acc = (use_vehicle_acceleration_)
+ ? std::hypot(
+ object.kinematics.acceleration_with_covariance.accel.linear.x,
+ object.kinematics.acceleration_with_covariance.accel.linear.y)
+ : 0.0;
+ const double t_h = prediction_time_horizon_;
+ const double λ = std::log(2) / acceleration_exponential_half_life_;
+
+ auto get_search_distance_with_decaying_acc = [&]() -> double {
+ const double acceleration_distance =
+ obj_acc * (1.0 / λ) * t_h + obj_acc * (1.0 / std::pow(λ, 2)) * (std::exp(-λ * t_h) - 1);
+ double search_dist = acceleration_distance + obj_vel * t_h;
+ return search_dist;
+ };
+
+ auto get_search_distance_with_partial_acc = [&](const double final_speed) -> double {
+ constexpr double epsilon = 1E-5;
+ if (std::abs(obj_acc) < epsilon) {
+ // Assume constant speed
+ return obj_vel * t_h;
+ }
+ // Time to reach final speed
+ const double t_f = (-1.0 / λ) * std::log(1 - ((final_speed - obj_vel) * λ) / obj_acc);
+ // It is assumed the vehicle accelerates until final_speed is reached and
+ // then continues at constant speed for the rest of the time horizon
+ const double search_dist =
+ // Distance covered while accelerating
+ obj_acc * (1.0 / λ) * t_f + obj_acc * (1.0 / std::pow(λ, 2)) * (std::exp(-λ * t_f) - 1) +
+ obj_vel * t_f +
+ // Distance covered at constant speed
+ final_speed * (t_h - t_f);
+ return search_dist;
+ };
+
std::vector all_ref_paths;
+
for (const auto & current_lanelet_data : current_lanelets_data) {
- // parameter for lanelet::routing::PossiblePathsParams
- const double search_dist = prediction_time_horizon_ * obj_vel +
- lanelet::utils::getLaneletLength3d(current_lanelet_data.lanelet);
+ const lanelet::traffic_rules::SpeedLimitInformation limit =
+ traffic_rules_ptr_->speedLimit(current_lanelet_data.lanelet);
+ const double legal_speed_limit = static_cast(limit.speedLimit.value());
+
+ double final_speed_after_acceleration =
+ obj_vel + obj_acc * (1.0 / λ) * (1.0 - std::exp(-λ * t_h));
+
+ const double final_speed_limit = legal_speed_limit * speed_limit_multiplier_;
+ const bool final_speed_surpasses_limit = final_speed_after_acceleration > final_speed_limit;
+ const bool object_has_surpassed_limit_already = obj_vel > final_speed_limit;
+
+ double search_dist = (final_speed_surpasses_limit && !object_has_surpassed_limit_already)
+ ? get_search_distance_with_partial_acc(final_speed_limit)
+ : get_search_distance_with_decaying_acc();
+ search_dist += lanelet::utils::getLaneletLength3d(current_lanelet_data.lanelet);
+
lanelet::routing::PossiblePathsParams possible_params{search_dist, {}, 0, false, true};
const double validate_time_horizon =
- prediction_time_horizon_ * prediction_time_horizon_rate_for_validate_lane_length_;
+ t_h * prediction_time_horizon_rate_for_validate_lane_length_;
// lambda function to get possible paths for isolated lanelet
// isolated is often caused by lanelet with no connection e.g. shoulder-lane
@@ -1644,7 +1703,8 @@ std::vector MapBasedPredictionNode::getPredictedReferencePath(
// Step4. add candidate reference paths to the all_ref_paths
const float path_prob = current_lanelet_data.probability;
const auto addReferencePathsLocal = [&](const auto & paths, const auto & maneuver) {
- addReferencePaths(object, paths, path_prob, maneuver_prob, maneuver, all_ref_paths);
+ addReferencePaths(
+ object, paths, path_prob, maneuver_prob, maneuver, all_ref_paths, final_speed_limit);
};
addReferencePathsLocal(left_paths, Maneuver::LEFT_LANE_CHANGE);
addReferencePathsLocal(right_paths, Maneuver::RIGHT_LANE_CHANGE);
@@ -1966,7 +2026,8 @@ void MapBasedPredictionNode::updateFuturePossibleLanelets(
void MapBasedPredictionNode::addReferencePaths(
const TrackedObject & object, const lanelet::routing::LaneletPaths & candidate_paths,
const float path_probability, const ManeuverProbability & maneuver_probability,
- const Maneuver & maneuver, std::vector & reference_paths)
+ const Maneuver & maneuver, std::vector & reference_paths,
+ const double speed_limit)
{
if (!candidate_paths.empty()) {
updateFuturePossibleLanelets(object, candidate_paths);
@@ -1976,6 +2037,7 @@ void MapBasedPredictionNode::addReferencePaths(
predicted_path.probability = maneuver_probability.at(maneuver) * path_probability;
predicted_path.path = converted_path;
predicted_path.maneuver = maneuver;
+ predicted_path.speed_limit = speed_limit;
reference_paths.push_back(predicted_path);
}
}
diff --git a/perception/map_based_prediction/src/path_generator.cpp b/perception/map_based_prediction/src/path_generator.cpp
index 5cb7e186b7cc4..413a0e233186b 100644
--- a/perception/map_based_prediction/src/path_generator.cpp
+++ b/perception/map_based_prediction/src/path_generator.cpp
@@ -149,20 +149,20 @@ PredictedPath PathGenerator::generatePathForOffLaneVehicle(const TrackedObject &
}
PredictedPath PathGenerator::generatePathForOnLaneVehicle(
- const TrackedObject & object, const PosePath & ref_paths)
+ const TrackedObject & object, const PosePath & ref_paths, const double speed_limit)
{
if (ref_paths.size() < 2) {
return generateStraightPath(object);
}
- return generatePolynomialPath(object, ref_paths);
+ return generatePolynomialPath(object, ref_paths, speed_limit);
}
PredictedPath PathGenerator::generateStraightPath(const TrackedObject & object) const
{
const auto & object_pose = object.kinematics.pose_with_covariance.pose;
const auto & object_twist = object.kinematics.twist_with_covariance.twist;
- const double ep = 0.001;
+ constexpr double ep = 0.001;
const double duration = time_horizon_ + ep;
PredictedPath path;
@@ -178,11 +178,11 @@ PredictedPath PathGenerator::generateStraightPath(const TrackedObject & object)
}
PredictedPath PathGenerator::generatePolynomialPath(
- const TrackedObject & object, const PosePath & ref_path)
+ const TrackedObject & object, const PosePath & ref_path, const double speed_limit)
{
// Get current Frenet Point
const double ref_path_len = motion_utils::calcArcLength(ref_path);
- const auto current_point = getFrenetPoint(object, ref_path);
+ const auto current_point = getFrenetPoint(object, ref_path, speed_limit);
// Step1. Set Target Frenet Point
// Note that we do not set position s,
@@ -384,7 +384,8 @@ PredictedPath PathGenerator::convertToPredictedPath(
return predicted_path;
}
-FrenetPoint PathGenerator::getFrenetPoint(const TrackedObject & object, const PosePath & ref_path)
+FrenetPoint PathGenerator::getFrenetPoint(
+ const TrackedObject & object, const PosePath & ref_path, const double speed_limit)
{
FrenetPoint frenet_point;
const auto obj_point = object.kinematics.pose_with_covariance.pose.position;
@@ -400,10 +401,82 @@ FrenetPoint PathGenerator::getFrenetPoint(const TrackedObject & object, const Po
static_cast(tf2::getYaw(ref_path.at(nearest_segment_idx).orientation));
const float delta_yaw = obj_yaw - lane_yaw;
+ const float ax =
+ (use_vehicle_acceleration_)
+ ? static_cast(object.kinematics.acceleration_with_covariance.accel.linear.x)
+ : 0.0;
+ const float ay =
+ (use_vehicle_acceleration_)
+ ? static_cast(object.kinematics.acceleration_with_covariance.accel.linear.y)
+ : 0.0;
+
+ // Using a decaying acceleration model. Consult the README for more information about the model.
+ const double t_h = time_horizon_;
+ const float λ = std::log(2) / acceleration_exponential_half_life_;
+
+ auto have_same_sign = [](double a, double b) -> bool {
+ return (a >= 0.0 && b >= 0.0) || (a < 0.0 && b < 0.0);
+ };
+
+ auto get_acceleration_adjusted_velocity = [&](const double v, const double a) {
+ constexpr double epsilon = 1E-5;
+ if (std::abs(a) < epsilon) {
+ // Assume constant speed
+ return v;
+ }
+ // Get velocity after time horizon
+ const auto terminal_velocity = v + a * (1.0 / λ) * (1 - std::exp(-λ * t_h));
+
+ // If vehicle is decelerating, make sure its speed does not change signs (we assume it will, at
+ // most stop, not reverse its direction)
+ if (!have_same_sign(terminal_velocity, v)) {
+ // we assume a forwards moving vehicle will not decelerate to 0 and then move backwards
+ // if the velocities don't have the same sign, calculate when the vehicle reaches 0 speed ->
+ // time t_stop
+
+ // 0 = Vo + acc(1/λ)(1-e^(-λt_stop))
+ // e^(-λt_stop) = 1 - (-Vo* λ)/acc
+ // t_stop = (-1/λ)*ln(1 - (-Vo* λ)/acc)
+ // t_stop = (-1/λ)*ln(1 + (Vo* λ)/acc)
+ auto t_stop = (-1.0 / λ) * std::log(1 + (v * λ / a));
+
+ // Calculate the distance traveled until stopping
+ auto distance_to_reach_zero_speed =
+ v * t_stop + a * t_stop * (1.0 / λ) + a * (1.0 / std::pow(λ, 2)) * (std::exp(-λ * t_h) - 1);
+ // Output an equivalent constant speed
+ return distance_to_reach_zero_speed / t_h;
+ }
+
+ // if the vehicle speed limit is not surpassed we return an equivalent speed = x(T) / T
+ // alternatively, if the vehicle is still accelerating and has surpassed the speed limit.
+ // assume it will continue accelerating (reckless driving)
+ const bool object_has_surpassed_limit_already = v > speed_limit;
+ if (terminal_velocity < speed_limit || object_has_surpassed_limit_already)
+ return v + a * (1.0 / λ) + (a / (t_h * std::pow(λ, 2))) * (std::exp(-λ * t_h) - 1);
+
+ // It is assumed the vehicle accelerates until final_speed is reached and
+ // then continues at constant speed for the rest of the time horizon
+ // So, we calculate the time it takes to reach the speed limit and compute how far the vehicle
+ // would go if it accelerated until reaching the speed limit, and then continued at a constant
+ // speed.
+ const double t_f = (-1.0 / λ) * std::log(1 - ((speed_limit - v) * λ) / a);
+ const double distance_covered =
+ // Distance covered while accelerating
+ a * (1.0 / λ) * t_f + a * (1.0 / std::pow(λ, 2)) * (std::exp(-λ * t_f) - 1) + v * t_f +
+ // Distance covered at constant speed for the rest of the horizon time
+ speed_limit * (t_h - t_f);
+ return distance_covered / t_h;
+ };
+
+ const float acceleration_adjusted_velocity_x = get_acceleration_adjusted_velocity(vx, ax);
+ const float acceleration_adjusted_velocity_y = get_acceleration_adjusted_velocity(vy, ay);
+
frenet_point.s = motion_utils::calcSignedArcLength(ref_path, 0, nearest_segment_idx) + l;
frenet_point.d = motion_utils::calcLateralOffset(ref_path, obj_point);
- frenet_point.s_vel = vx * std::cos(delta_yaw) - vy * std::sin(delta_yaw);
- frenet_point.d_vel = vx * std::sin(delta_yaw) + vy * std::cos(delta_yaw);
+ frenet_point.s_vel = acceleration_adjusted_velocity_x * std::cos(delta_yaw) -
+ acceleration_adjusted_velocity_y * std::sin(delta_yaw);
+ frenet_point.d_vel = acceleration_adjusted_velocity_x * std::sin(delta_yaw) +
+ acceleration_adjusted_velocity_y * std::cos(delta_yaw);
frenet_point.s_acc = 0.0;
frenet_point.d_acc = 0.0;
diff --git a/perception/probabilistic_occupancy_grid_map/include/cost_value.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/cost_value.hpp
similarity index 95%
rename from perception/probabilistic_occupancy_grid_map/include/cost_value.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/cost_value.hpp
index e0f18cedcdff1..880297a1210ed 100644
--- a/perception/probabilistic_occupancy_grid_map/include/cost_value.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/cost_value.hpp
@@ -48,8 +48,8 @@
* Author: Eitan Marder-Eppstein
*********************************************************************/
-#ifndef COST_VALUE_HPP_
-#define COST_VALUE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__COST_VALUE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__COST_VALUE_HPP_
#include
@@ -103,4 +103,4 @@ static const CostTranslationTable cost_translation_table;
static const InverseCostTranslationTable inverse_cost_translation_table;
} // namespace occupancy_cost_value
-#endif // COST_VALUE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__COST_VALUE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/fusion/single_frame_fusion_policy.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp
similarity index 88%
rename from perception/probabilistic_occupancy_grid_map/include/fusion/single_frame_fusion_policy.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp
index 13829b4910d96..1f0553878ef5a 100644
--- a/perception/probabilistic_occupancy_grid_map/include/fusion/single_frame_fusion_policy.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
-#define FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
-#include "cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
#include
#include
@@ -63,4 +63,4 @@ unsigned char singleFrameOccupancyFusion(
const std::vector & reliability);
} // namespace fusion_policy
-#endif // FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SINGLE_FRAME_FUSION_POLICY_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/fusion/synchronized_grid_map_fusion_node.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/synchronized_grid_map_fusion_node.hpp
similarity index 87%
rename from perception/probabilistic_occupancy_grid_map/include/fusion/synchronized_grid_map_fusion_node.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/synchronized_grid_map_fusion_node.hpp
index 6bea5b2a16f72..8f09764688055 100644
--- a/perception/probabilistic_occupancy_grid_map/include/fusion/synchronized_grid_map_fusion_node.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/fusion/synchronized_grid_map_fusion_node.hpp
@@ -12,13 +12,13 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
-#define FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
-#include "fusion/single_frame_fusion_policy.hpp"
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp"
-#include "updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp"
-#include "updater/occupancy_grid_map_updater_interface.hpp"
+#include "probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp"
#include
#include
@@ -124,4 +124,4 @@ class GridMapFusionNode : public rclcpp::Node
} // namespace synchronized_grid_map_fusion
-#endif // FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__FUSION__SYNCHRONIZED_GRID_MAP_FUSION_NODE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp
similarity index 84%
rename from perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp
index 3a0f1f5ea7433..a8adea6e700e5 100644
--- a/perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp
@@ -12,12 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
-#define LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
-#include "laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp"
-#include "updater/occupancy_grid_map_binary_bayes_filter_updater.hpp"
-#include "updater/occupancy_grid_map_updater_interface.hpp"
+#include "probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp"
#include
#include
@@ -102,4 +102,4 @@ class LaserscanBasedOccupancyGridMapNode : public rclcpp::Node
} // namespace occupancy_grid_map
-#endif // LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp
similarity index 92%
rename from perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp
index a9bbc3fda6ab4..d2210cf9c348a 100644
--- a/perception/probabilistic_occupancy_grid_map/include/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp
@@ -49,8 +49,8 @@
* David V. Lu!!
*********************************************************************/
-#ifndef LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
-#define LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
#include
#include
@@ -91,4 +91,4 @@ class OccupancyGridMap : public nav2_costmap_2d::Costmap2D
} // namespace costmap_2d
-#endif // LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__LASERSCAN_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp
similarity index 92%
rename from perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp
index 8f8e1e503d388..f01b2d74e160b 100644
--- a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp
@@ -49,8 +49,8 @@
* David V. Lu!!
*********************************************************************/
-#ifndef POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
-#define POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
#include
#include
@@ -92,4 +92,4 @@ class OccupancyGridMapInterface : public nav2_costmap_2d::Costmap2D
} // namespace costmap_2d
-#endif // POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_BASE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp
similarity index 75%
rename from perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp
index 5755cd2c889be..298f327d632d7 100644
--- a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
-#define POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
namespace costmap_2d
{
@@ -44,4 +44,4 @@ class OccupancyGridMapFixedBlindSpot : public OccupancyGridMapInterface
} // namespace costmap_2d
-#endif // POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_FIXED_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp
similarity index 78%
rename from perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp
index bc278772e9737..67b51d6184c8c 100644
--- a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
-#define POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
#include
@@ -52,4 +52,4 @@ class OccupancyGridMapProjectiveBlindSpot : public OccupancyGridMapInterface
} // namespace costmap_2d
-#endif // POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__OCCUPANCY_GRID_MAP_PROJECTIVE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp
similarity index 83%
rename from perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp
index e34899bb98b0c..93486e0ca56af 100644
--- a/perception/probabilistic_occupancy_grid_map/include/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.hpp
@@ -12,12 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
-#define POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
-#include "updater/occupancy_grid_map_binary_bayes_filter_updater.hpp"
-#include "updater/occupancy_grid_map_updater_interface.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp"
#include
#include
@@ -95,4 +95,4 @@ class PointcloudBasedOccupancyGridMapNode : public rclcpp::Node
} // namespace occupancy_grid_map
-#endif // POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP__POINTCLOUD_BASED_OCCUPANCY_GRID_MAP_NODE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp
similarity index 75%
rename from perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp
index d8f3cb6556bf2..3a921035ef219 100644
--- a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_binary_bayes_filter_updater.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
-#define UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
-#include "updater/occupancy_grid_map_updater_interface.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp"
#include
#include
@@ -39,4 +39,4 @@ class OccupancyGridMapBBFUpdater : public OccupancyGridMapUpdaterInterface
} // namespace costmap_2d
-#endif // UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_BINARY_BAYES_FILTER_UPDATER_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp
similarity index 71%
rename from perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp
index 306f8988acab7..f9f100f285d38 100644
--- a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_log_odds_bayes_filter_updater.hpp
@@ -12,12 +12,12 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
-#define UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
-#include "fusion/single_frame_fusion_policy.hpp"
-#include "updater/occupancy_grid_map_updater_interface.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp"
+#include "probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
#include
#include
@@ -45,4 +45,4 @@ class OccupancyGridMapLOBFUpdater : public OccupancyGridMapUpdaterInterface
} // namespace costmap_2d
-#endif // UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_LOG_ODDS_BAYES_FILTER_UPDATER_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_updater_interface.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp
similarity index 78%
rename from perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_updater_interface.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp
index 9305313ddc2fc..e85edf2245ef3 100644
--- a/perception/probabilistic_occupancy_grid_map/include/updater/occupancy_grid_map_updater_interface.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/updater/occupancy_grid_map_updater_interface.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
-#define UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
-#include "cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
#include
#include
@@ -38,4 +38,4 @@ class OccupancyGridMapUpdaterInterface : public nav2_costmap_2d::Costmap2D
} // namespace costmap_2d
-#endif // UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__UPDATER__OCCUPANCY_GRID_MAP_UPDATER_INTERFACE_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/include/utils/utils.hpp b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/utils/utils.hpp
similarity index 93%
rename from perception/probabilistic_occupancy_grid_map/include/utils/utils.hpp
rename to perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/utils/utils.hpp
index 46bd14b843dae..0950272dac470 100644
--- a/perception/probabilistic_occupancy_grid_map/include/utils/utils.hpp
+++ b/perception/probabilistic_occupancy_grid_map/include/probabilistic_occupancy_grid_map/utils/utils.hpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef UTILS__UTILS_HPP_
-#define UTILS__UTILS_HPP_
+#ifndef PROBABILISTIC_OCCUPANCY_GRID_MAP__UTILS__UTILS_HPP_
+#define PROBABILISTIC_OCCUPANCY_GRID_MAP__UTILS__UTILS_HPP_
-#include "cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
#include
#include
@@ -119,4 +119,4 @@ bool extractCommonPointCloud(
unsigned char getApproximateOccupancyState(const unsigned char & value);
} // namespace utils
-#endif // UTILS__UTILS_HPP_
+#endif // PROBABILISTIC_OCCUPANCY_GRID_MAP__UTILS__UTILS_HPP_
diff --git a/perception/probabilistic_occupancy_grid_map/launch/laserscan_based_occupancy_grid_map.launch.py b/perception/probabilistic_occupancy_grid_map/launch/laserscan_based_occupancy_grid_map.launch.py
index b99335b0e09ef..62cfa4bcb5228 100644
--- a/perception/probabilistic_occupancy_grid_map/launch/laserscan_based_occupancy_grid_map.launch.py
+++ b/perception/probabilistic_occupancy_grid_map/launch/laserscan_based_occupancy_grid_map.launch.py
@@ -115,7 +115,7 @@ def launch_setup(context, *args, **kwargs):
]
occupancy_grid_map_container = ComposableNodeContainer(
- name=LaunchConfiguration("container_name"),
+ name=LaunchConfiguration("individual_container_name"),
namespace="",
package="rclcpp_components",
executable=LaunchConfiguration("container_executable"),
@@ -126,7 +126,7 @@ def launch_setup(context, *args, **kwargs):
load_composable_nodes = LoadComposableNodes(
composable_node_descriptions=composable_nodes,
- target_container=LaunchConfiguration("container_name"),
+ target_container=LaunchConfiguration("pointcloud_container_name"),
condition=IfCondition(LaunchConfiguration("use_pointcloud_container")),
)
@@ -174,7 +174,8 @@ def add_launch_arg(name: str, default_value=None):
add_launch_arg("input_obstacle_pointcloud", "false"),
add_launch_arg("input_obstacle_and_raw_pointcloud", "true"),
add_launch_arg("use_pointcloud_container", "false"),
- add_launch_arg("container_name", "occupancy_grid_map_container"),
+ add_launch_arg("pointcloud_container_name", "pointcloud_container"),
+ add_launch_arg("individual_container_name", "occupancy_grid_map_container"),
set_container_executable,
set_container_mt_executable,
]
diff --git a/perception/probabilistic_occupancy_grid_map/launch/pointcloud_based_occupancy_grid_map.launch.py b/perception/probabilistic_occupancy_grid_map/launch/pointcloud_based_occupancy_grid_map.launch.py
index 49bf228905dcc..29435c4ea8e24 100644
--- a/perception/probabilistic_occupancy_grid_map/launch/pointcloud_based_occupancy_grid_map.launch.py
+++ b/perception/probabilistic_occupancy_grid_map/launch/pointcloud_based_occupancy_grid_map.launch.py
@@ -64,7 +64,7 @@ def launch_setup(context, *args, **kwargs):
]
occupancy_grid_map_container = ComposableNodeContainer(
- name=LaunchConfiguration("container_name"),
+ name=LaunchConfiguration("individual_container_name"),
namespace="",
package="rclcpp_components",
executable=LaunchConfiguration("container_executable"),
@@ -75,7 +75,7 @@ def launch_setup(context, *args, **kwargs):
load_composable_nodes = LoadComposableNodes(
composable_node_descriptions=composable_nodes,
- target_container=LaunchConfiguration("container_name"),
+ target_container=LaunchConfiguration("pointcloud_container_name"),
condition=IfCondition(LaunchConfiguration("use_pointcloud_container")),
)
@@ -103,7 +103,8 @@ def add_launch_arg(name: str, default_value=None):
add_launch_arg("use_multithread", "false"),
add_launch_arg("use_intra_process", "true"),
add_launch_arg("use_pointcloud_container", "false"),
- add_launch_arg("container_name", "occupancy_grid_map_container"),
+ add_launch_arg("pointcloud_container_name", "pointcloud_container"),
+ add_launch_arg("individual_container_name", "occupancy_grid_map_container"),
add_launch_arg("input/obstacle_pointcloud", "no_ground/oneshot/pointcloud"),
add_launch_arg("input/raw_pointcloud", "concatenated/pointcloud"),
add_launch_arg("output", "occupancy_grid"),
diff --git a/perception/probabilistic_occupancy_grid_map/src/fusion/single_frame_fusion_policy.cpp b/perception/probabilistic_occupancy_grid_map/src/fusion/single_frame_fusion_policy.cpp
index 75e8791a04bca..6ac681eff4916 100644
--- a/perception/probabilistic_occupancy_grid_map/src/fusion/single_frame_fusion_policy.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/fusion/single_frame_fusion_policy.cpp
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "fusion/single_frame_fusion_policy.hpp"
+#include "probabilistic_occupancy_grid_map/fusion/single_frame_fusion_policy.hpp"
namespace fusion_policy
{
diff --git a/perception/probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp b/perception/probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp
index 6738286ae5592..a88e65e712ac1 100644
--- a/perception/probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "fusion/synchronized_grid_map_fusion_node.hpp"
+#include "probabilistic_occupancy_grid_map/fusion/synchronized_grid_map_fusion_node.hpp"
-#include "cost_value.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
namespace synchronized_grid_map_fusion
{
diff --git a/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.cpp b/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.cpp
index b4505eedddd21..777c180fe1a3a 100644
--- a/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.cpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp"
+#include "probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/laserscan_based_occupancy_grid_map_node.hpp"
-#include "cost_value.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
#include
diff --git a/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/occupancy_grid_map.cpp b/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/occupancy_grid_map.cpp
index 59f562cb58f35..3d02be9ca7156 100644
--- a/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/occupancy_grid_map.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/laserscan_based_occupancy_grid_map/occupancy_grid_map.cpp
@@ -49,9 +49,9 @@
* David V. Lu!!
*********************************************************************/
-#include "laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp"
+#include "probabilistic_occupancy_grid_map/laserscan_based_occupancy_grid_map/occupancy_grid_map.hpp"
-#include "cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
#include
diff --git a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.cpp b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.cpp
index 8652cfa34d96c..3d176e41583a0 100644
--- a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.cpp
@@ -49,10 +49,10 @@
* David V. Lu!!
*********************************************************************/
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_base.hpp"
-#include "cost_value.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
#include
#include
diff --git a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.cpp b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.cpp
index 56aeea30e0773..00b3e42fdf392 100644
--- a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.cpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_fixed.hpp"
-#include "cost_value.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
#include
#include
diff --git a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.cpp b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.cpp
index 20a5770e37fdb..64b76a2488e24 100644
--- a/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.cpp
+++ b/perception/probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.cpp
@@ -12,10 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#include "pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp"
+#include "probabilistic_occupancy_grid_map/pointcloud_based_occupancy_grid_map/occupancy_grid_map_projective.hpp"
-#include "cost_value.hpp"
-#include "utils/utils.hpp"
+#include "probabilistic_occupancy_grid_map/cost_value.hpp"
+#include "probabilistic_occupancy_grid_map/utils/utils.hpp"
#include