From 452e076d7659efe19a413da3716979a2c537cf28 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 26 Dec 2024 12:14:56 +0900 Subject: [PATCH 001/127] feat(autoware_overlay_rviz_plugin): add plugin to show string stamped (#9683) * feat(autoware_overlay_rviz_plugin): add plugin to show string stamped Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * better visualization Signed-off-by: Takayuki Murooka * update Signed-off-by: Takayuki Murooka * fix cpp check and typo Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../CMakeLists.txt | 28 +++ .../README.md | 7 + .../package.xml | 30 +++ .../plugins/plugins_description.xml | 5 + .../src/jsk_overlay_utils.cpp | 225 +++++++++++++++++ .../src/jsk_overlay_utils.hpp | 143 +++++++++++ .../src/string_stamped_overlay_display.cpp | 237 ++++++++++++++++++ .../src/string_stamped_overlay_display.hpp | 110 ++++++++ 8 files changed, 785 insertions(+) create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/CMakeLists.txt create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/README.md create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/plugins/plugins_description.xml create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.cpp create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.hpp create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.cpp create mode 100644 visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.hpp diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/CMakeLists.txt b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/CMakeLists.txt new file mode 100644 index 0000000000000..7ff4e19c69419 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/CMakeLists.txt @@ -0,0 +1,28 @@ +cmake_minimum_required(VERSION 3.8) +project(autoware_string_stamped_rviz_plugin) + +# find dependencies +find_package(autoware_cmake REQUIRED) +autoware_package() + +find_package(Qt5 REQUIRED Core Widgets) +set(QT_LIBRARIES Qt5::Widgets) +set(CMAKE_AUTOMOC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +add_definitions(-DQT_NO_KEYWORDS) + +ament_auto_add_library(${PROJECT_NAME} SHARED + DIRECTORY src +) + +target_link_libraries(${PROJECT_NAME} + ${QT_LIBRARIES} +) + +# Export the plugin to be imported by rviz2 +pluginlib_export_plugin_description_file(rviz_common plugins/plugins_description.xml) + +ament_auto_package( + INSTALL_TO_SHARE + plugins +) diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/README.md b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/README.md new file mode 100644 index 0000000000000..e5add261325f4 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/README.md @@ -0,0 +1,7 @@ +# autoware_string_stamped_rviz_plugin + +Plugin for displaying 2D overlays over the RViz2 3D scene. + +## Purpose + +This plugin displays the ROS message whose topic type is `autoware_internal_debug_msgs::msg::StringStamped` in rviz. diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml new file mode 100644 index 0000000000000..c22bc75f55290 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml @@ -0,0 +1,30 @@ + + + + autoware_string_stamped_rviz_plugin + 0.39.0 + + RViz2 plugin for 2D overlays in the 3D view. Mainly a port of the JSK overlay plugin + (https://github.com/jsk-ros-pkg/jsk_visualization). + + Takayuki Murooka + Satoshi Ota + + Apache License 2.0 + + ament_cmake_auto + autoware_cmake + + ament_index_cpp + autoware_internal_debug_msgs + rviz_common + rviz_ogre_vendor + rviz_rendering + + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/plugins/plugins_description.xml b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/plugins/plugins_description.xml new file mode 100644 index 0000000000000..302bcc629b892 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/plugins/plugins_description.xml @@ -0,0 +1,5 @@ + + + String stamped overlay plugin for the 3D view. + + diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.cpp b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.cpp new file mode 100644 index 0000000000000..03fd8bca5aee8 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.cpp @@ -0,0 +1,225 @@ +// Copyright 2024 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 "jsk_overlay_utils.hpp" + +#include + +namespace jsk_rviz_plugins +{ +ScopedPixelBuffer::ScopedPixelBuffer(Ogre::HardwarePixelBufferSharedPtr pixel_buffer) +: pixel_buffer_(pixel_buffer) +{ + pixel_buffer_->lock(Ogre::HardwareBuffer::HBL_NORMAL); +} + +ScopedPixelBuffer::~ScopedPixelBuffer() +{ + pixel_buffer_->unlock(); +} + +Ogre::HardwarePixelBufferSharedPtr ScopedPixelBuffer::getPixelBuffer() +{ + return pixel_buffer_; +} + +QImage ScopedPixelBuffer::getQImage(unsigned int width, unsigned int height) +{ + const Ogre::PixelBox & pixelBox = pixel_buffer_->getCurrentLock(); + Ogre::uint8 * pDest = static_cast(pixelBox.data); + memset(pDest, 0, width * height); + return QImage(pDest, width, height, QImage::Format_ARGB32); +} + +QImage ScopedPixelBuffer::getQImage(unsigned int width, unsigned int height, QColor & bg_color) +{ + QImage Hud = getQImage(width, height); + for (unsigned int i = 0; i < width; i++) { + for (unsigned int j = 0; j < height; j++) { + Hud.setPixel(i, j, bg_color.rgba()); + } + } + return Hud; +} + +QImage ScopedPixelBuffer::getQImage(OverlayObject & overlay) +{ + return getQImage(overlay.getTextureWidth(), overlay.getTextureHeight()); +} + +QImage ScopedPixelBuffer::getQImage(OverlayObject & overlay, QColor & bg_color) +{ + return getQImage(overlay.getTextureWidth(), overlay.getTextureHeight(), bg_color); +} + +OverlayObject::OverlayObject( + Ogre::SceneManager * manager, rclcpp::Logger logger, const std::string & name) +: name_(name), logger_(logger) +{ + rviz_rendering::RenderSystem::get()->prepareOverlays(manager); + std::string material_name = name_ + "Material"; + Ogre::OverlayManager * mOverlayMgr = Ogre::OverlayManager::getSingletonPtr(); + overlay_ = mOverlayMgr->create(name_); + panel_ = static_cast( + mOverlayMgr->createOverlayElement("Panel", name_ + "Panel")); + panel_->setMetricsMode(Ogre::GMM_PIXELS); + + panel_material_ = Ogre::MaterialManager::getSingleton().create( + material_name, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); + panel_->setMaterialName(panel_material_->getName()); + overlay_->add2D(panel_); +} + +OverlayObject::~OverlayObject() +{ + hide(); + panel_material_->unload(); + Ogre::MaterialManager::getSingleton().remove(panel_material_->getName()); + // Ogre::OverlayManager* mOverlayMgr = Ogre::OverlayManager::getSingletonPtr(); + // mOverlayMgr->destroyOverlayElement(panel_); + // delete panel_; + // delete overlay_; +} + +std::string OverlayObject::getName() +{ + return name_; +} + +void OverlayObject::hide() +{ + if (overlay_->isVisible()) { + overlay_->hide(); + } +} + +void OverlayObject::show() +{ + if (!overlay_->isVisible()) { + overlay_->show(); + } +} + +bool OverlayObject::isTextureReady() +{ + return static_cast(texture_); +} + +void OverlayObject::updateTextureSize(unsigned int width, unsigned int height) +{ + const std::string texture_name = name_ + "Texture"; + if (width == 0) { + RCLCPP_WARN(logger_, "width=0 is specified as texture size"); + width = 1; + } + if (height == 0) { + RCLCPP_WARN(logger_, "height=0 is specified as texture size"); + height = 1; + } + if (!isTextureReady() || ((width != texture_->getWidth()) || (height != texture_->getHeight()))) { + if (isTextureReady()) { + Ogre::TextureManager::getSingleton().remove(texture_name); + panel_material_->getTechnique(0)->getPass(0)->removeAllTextureUnitStates(); + } + texture_ = Ogre::TextureManager::getSingleton().createManual( + texture_name, // name + Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, + Ogre::TEX_TYPE_2D, // type + width, height, // width & height of the render window + 0, // number of mipmaps + Ogre::PF_A8R8G8B8, // pixel format chosen to match a format Qt can use + Ogre::TU_DEFAULT // usage + ); + panel_material_->getTechnique(0)->getPass(0)->createTextureUnitState(texture_name); + + panel_material_->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA); + } +} + +ScopedPixelBuffer OverlayObject::getBuffer() +{ + if (isTextureReady()) { + return ScopedPixelBuffer(texture_->getBuffer()); + } else { + return ScopedPixelBuffer(Ogre::HardwarePixelBufferSharedPtr()); + } +} + +void OverlayObject::setPosition(double left, double top) +{ + panel_->setPosition(left, top); +} + +void OverlayObject::setDimensions(double width, double height) +{ + panel_->setDimensions(width, height); +} + +bool OverlayObject::isVisible() +{ + return overlay_->isVisible(); +} + +unsigned int OverlayObject::getTextureWidth() +{ + if (isTextureReady()) { + return texture_->getWidth(); + } else { + return 0; + } +} + +unsigned int OverlayObject::getTextureHeight() +{ + if (isTextureReady()) { + return texture_->getHeight(); + } else { + return 0; + } +} + +} // namespace jsk_rviz_plugins diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.hpp b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.hpp new file mode 100644 index 0000000000000..e69abed49f371 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/jsk_overlay_utils.hpp @@ -0,0 +1,143 @@ +// Copyright 2024 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 JSK_OVERLAY_UTILS_HPP_ +#define JSK_OVERLAY_UTILS_HPP_ + +#include +#include +#include +#include +#include +#include + +#include +#include +// see OGRE/OgrePrerequisites.h +// #define OGRE_VERSION +// ((OGRE_VERSION_MAJOR << 16) | (OGRE_VERSION_MINOR << 8) | OGRE_VERSION_PATCH) +#if OGRE_VERSION < ((1 << 16) | (9 << 8) | 0) +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#endif + +#include +#include +#include +#include +#include +#include + +namespace jsk_rviz_plugins +{ +class OverlayObject; + +class ScopedPixelBuffer +{ +public: + explicit ScopedPixelBuffer(Ogre::HardwarePixelBufferSharedPtr pixel_buffer); + virtual ~ScopedPixelBuffer(); + virtual Ogre::HardwarePixelBufferSharedPtr getPixelBuffer(); + virtual QImage getQImage(unsigned int width, unsigned int height); + virtual QImage getQImage(OverlayObject & overlay); + virtual QImage getQImage(unsigned int width, unsigned int height, QColor & bg_color); + virtual QImage getQImage(OverlayObject & overlay, QColor & bg_color); + +protected: + Ogre::HardwarePixelBufferSharedPtr pixel_buffer_; + +private: +}; + +// this is a class for put overlay object on rviz 3D panel. +// This class suppose to be instantiated in onInitialize method +// of rviz::Display class. +class OverlayObject +{ +public: + typedef std::shared_ptr Ptr; + + OverlayObject(Ogre::SceneManager * manager, rclcpp::Logger logger, const std::string & name); + virtual ~OverlayObject(); + + virtual std::string getName(); + /*virtual*/ void hide(); // remove "virtual" for cppcheck + virtual void show(); + virtual bool isTextureReady(); + virtual void updateTextureSize(unsigned int width, unsigned int height); + virtual ScopedPixelBuffer getBuffer(); + virtual void setPosition(double left, double top); + virtual void setDimensions(double width, double height); + virtual bool isVisible(); + virtual unsigned int getTextureWidth(); + virtual unsigned int getTextureHeight(); + +protected: + const std::string name_; + rclcpp::Logger logger_; + Ogre::Overlay * overlay_; + Ogre::PanelOverlayElement * panel_; + Ogre::MaterialPtr panel_material_; + Ogre::TexturePtr texture_; + +private: +}; + +// Ogre::Overlay* createOverlay(std::string name); +// Ogre::PanelOverlayElement* createOverlayPanel(Ogre::Overlay* overlay); +// Ogre::MaterialPtr createOverlayMaterial(Ogre::Overlay* overlay); +} // namespace jsk_rviz_plugins + +#endif // JSK_OVERLAY_UTILS_HPP_ diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.cpp b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.cpp new file mode 100644 index 0000000000000..d5746e99ff084 --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.cpp @@ -0,0 +1,237 @@ +// Copyright 2024 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 "string_stamped_overlay_display.hpp" + +#include "jsk_overlay_utils.hpp" + +#include +#include + +#include + +#include +#include +#include +#include +#include + +namespace autoware::string_stamped_rviz_plugin +{ +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); + + property_last_diag_keep_time_ = new rviz_common::properties::FloatProperty( + "Time To Keep Last Diag", 1.0, "Time To Keep Last Diag", this, SLOT(updateVisualization()), + this); + property_last_diag_keep_time_->setMin(0); + + property_last_diag_erase_time_ = new rviz_common::properties::FloatProperty( + "Time To Erase Last Diag", 2.0, "Time To Erase Last Diag", this, SLOT(updateVisualization()), + this); + property_last_diag_erase_time_->setMin(0.001); +} + +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_non_empty_msg_ptr_) { + return; + } + } + + // calculate text and alpha + const auto text_with_alpha = [&]() { + std::lock_guard message_lock(mutex_); + if (last_msg_text_.empty()) { + const auto current_time = context_->getRosNodeAbstraction().lock()->get_raw_node()->now(); + const auto duration = (current_time - last_non_empty_msg_ptr_->stamp).seconds(); + if ( + duration < + property_last_diag_keep_time_->getFloat() + property_last_diag_erase_time_->getFloat()) { + const int dynamic_alpha = static_cast(std::max( + (1.0 - std::max(duration - property_last_diag_keep_time_->getFloat(), 0.0) / + property_last_diag_erase_time_->getFloat()) * + 255, + 0.0)); + return std::make_pair(last_non_empty_msg_ptr_->data, dynamic_alpha); + } + } + return std::make_pair(last_msg_text_, 255); + }(); + + // 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(text_with_alpha.second); + 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, + text_with_alpha.first.c_str()); + painter.end(); + updateVisualization(); +} + +void StringStampedOverlayDisplay::processMessage( + const autoware_internal_debug_msgs::msg::StringStamped::ConstSharedPtr msg_ptr) +{ + if (!isEnabled()) { + return; + } + + { + std::lock_guard message_lock(mutex_); + last_msg_text_ = msg_ptr->data; + + // keep the non empty last message for visualization + if (!msg_ptr->data.empty()) { + last_non_empty_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 autoware::string_stamped_rviz_plugin + +#include +PLUGINLIB_EXPORT_CLASS( + autoware::string_stamped_rviz_plugin::StringStampedOverlayDisplay, rviz_common::Display) diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.hpp b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.hpp new file mode 100644 index 0000000000000..6f7cd84b91aaa --- /dev/null +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/src/string_stamped_overlay_display.hpp @@ -0,0 +1,110 @@ +// Copyright 2024 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 STRING_STAMPED_OVERLAY_DISPLAY_HPP_ +#define STRING_STAMPED_OVERLAY_DISPLAY_HPP_ + +#include +#include +#include + +#ifndef Q_MOC_RUN +#include "jsk_overlay_utils.hpp" + +#include +#include +#include +#include + +#endif + +#include + +namespace autoware::string_stamped_rviz_plugin +{ +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 autoware_internal_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::IntProperty * property_font_size_; + rviz_common::properties::IntProperty * property_max_letter_num_; + rviz_common::properties::FloatProperty * property_last_diag_keep_time_; + rviz_common::properties::FloatProperty * property_last_diag_erase_time_; + +private: + static constexpr int line_width_ = 2; + static constexpr int hand_width_ = 4; + + std::mutex mutex_; + std::string last_msg_text_; + autoware_internal_debug_msgs::msg::StringStamped::ConstSharedPtr last_non_empty_msg_ptr_; +}; +} // namespace autoware::string_stamped_rviz_plugin + +#endif // STRING_STAMPED_OVERLAY_DISPLAY_HPP_ From ee93be1fe1ecb1721a3f4dab118d814d1263a193 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 26 Dec 2024 14:35:11 +0900 Subject: [PATCH 002/127] refactor(behavior_velocity_planner): independent of plugin packages (#9760) Signed-off-by: Takayuki Murooka --- .../CMakeLists.txt | 3 +- .../behavior_velocity_planner}/node.hpp | 8 +- .../planner_manager.hpp | 6 +- .../behavior_velocity_planner/test_utils.hpp | 47 ++++++++ .../package.xml | 13 --- .../src/node.cpp | 2 +- .../src/planner_manager.cpp | 2 +- .../test_utils.cpp} | 108 ++++-------------- .../test/test_node_interface.cpp | 61 ++++++++++ 9 files changed, 144 insertions(+), 106 deletions(-) rename planning/behavior_velocity_planner/autoware_behavior_velocity_planner/{src => include/autoware/behavior_velocity_planner}/node.hpp (96%) rename planning/behavior_velocity_planner/autoware_behavior_velocity_planner/{src => include/autoware/behavior_velocity_planner}/planner_manager.hpp (91%) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/test_utils.hpp rename planning/behavior_velocity_planner/autoware_behavior_velocity_planner/{test/src/test_node_interface.cpp => src/test_utils.cpp} (50%) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/test_node_interface.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt index 37a02b844dfe9..31900a23d00e5 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt @@ -16,6 +16,7 @@ autoware_package() ament_auto_add_library(${PROJECT_NAME}_lib SHARED src/node.cpp src/planner_manager.cpp + src/test_utils.cpp ) rclcpp_components_register_node(${PROJECT_NAME}_lib @@ -34,7 +35,7 @@ endif() if(BUILD_TESTING) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} - test/src/test_node_interface.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} gtest_main diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp similarity index 96% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.hpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp index 4efb58e38b74f..4c1f10c355226 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef NODE_HPP_ -#define NODE_HPP_ +#ifndef AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__NODE_HPP_ +#define AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__NODE_HPP_ +#include "autoware/behavior_velocity_planner/planner_manager.hpp" #include "autoware/universe_utils/ros/logger_level_configure.hpp" #include "autoware/universe_utils/ros/polling_subscriber.hpp" -#include "planner_manager.hpp" #include #include @@ -150,4 +150,4 @@ class BehaviorVelocityPlannerNode : public rclcpp::Node }; } // namespace autoware::behavior_velocity_planner -#endif // NODE_HPP_ +#endif // AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__NODE_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/planner_manager.hpp similarity index 91% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.hpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/planner_manager.hpp index fddd658cef06e..9bd423ecfef21 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/planner_manager.hpp @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef PLANNER_MANAGER_HPP_ -#define PLANNER_MANAGER_HPP_ +#ifndef AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__PLANNER_MANAGER_HPP_ +#define AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__PLANNER_MANAGER_HPP_ #include #include @@ -57,4 +57,4 @@ class BehaviorVelocityPlannerManager }; } // namespace autoware::behavior_velocity_planner -#endif // PLANNER_MANAGER_HPP_ +#endif // AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__PLANNER_MANAGER_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/test_utils.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/test_utils.hpp new file mode 100644 index 0000000000000..f34182e77e6f1 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/test_utils.hpp @@ -0,0 +1,47 @@ +// Copyright 2024 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. + +#ifndef AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__TEST_UTILS_HPP_ +#define AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__TEST_UTILS_HPP_ + +#include "autoware/behavior_velocity_planner/node.hpp" + +#include + +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +using autoware::behavior_velocity_planner::BehaviorVelocityPlannerNode; +using autoware::planning_test_manager::PlanningInterfaceTestManager; + +struct PluginInfo +{ + std::string module_name; // e.g. crosswalk + std::string plugin_name; // e.g. autoware::behavior_velocity_planner::CrosswalkModulePlugin +}; + +std::shared_ptr generateTestManager(); + +std::shared_ptr generateNode( + const std::vector & plugin_info_vec); + +void publishMandatoryTopics( + std::shared_ptr test_manager, + std::shared_ptr test_target_node); +} // namespace autoware::behavior_velocity_planner + +#endif // AUTOWARE__BEHAVIOR_VELOCITY_PLANNER__TEST_UTILS_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml index e051374ed3dda..04b4cf0328fd1 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml @@ -64,19 +64,6 @@ ament_cmake_ros ament_lint_auto - autoware_behavior_velocity_blind_spot_module - autoware_behavior_velocity_crosswalk_module - autoware_behavior_velocity_detection_area_module - autoware_behavior_velocity_intersection_module - autoware_behavior_velocity_no_drivable_lane_module - autoware_behavior_velocity_no_stopping_area_module - autoware_behavior_velocity_occlusion_spot_module - autoware_behavior_velocity_run_out_module - autoware_behavior_velocity_speed_bump_module - autoware_behavior_velocity_stop_line_module - autoware_behavior_velocity_traffic_light_module - autoware_behavior_velocity_virtual_traffic_light_module - autoware_behavior_velocity_walkway_module autoware_lint_common diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp index d78bc883e6b35..5f78e4c670b49 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "node.hpp" +#include "autoware/behavior_velocity_planner/node.hpp" #include #include diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.cpp index 4820c340058ff..45ee83260d53a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/planner_manager.cpp @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "planner_manager.hpp" +#include "autoware/behavior_velocity_planner/planner_manager.hpp" #include #include diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/src/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp similarity index 50% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/src/test_node_interface.cpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp index fe79450d0def8..ee1bb8f89fc46 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/src/test_node_interface.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp @@ -1,4 +1,4 @@ -// Copyright 2023 Tier IV, Inc. +// Copyright 2024 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. @@ -12,22 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "node.hpp" +#include "autoware/behavior_velocity_planner/test_utils.hpp" #include #include #include -#include - -#include #include #include #include -using autoware::behavior_velocity_planner::BehaviorVelocityPlannerNode; -using autoware::planning_test_manager::PlanningInterfaceTestManager; - +namespace autoware::behavior_velocity_planner +{ std::shared_ptr generateTestManager() { auto test_manager = std::make_shared(); @@ -45,7 +41,8 @@ std::shared_ptr generateTestManager() return test_manager; } -std::shared_ptr generateNode() +std::shared_ptr generateNode( + const std::vector & plugin_info_vec) { auto node_options = rclcpp::NodeOptions{}; @@ -64,49 +61,29 @@ std::shared_ptr generateNode() return package_path + "/config/" + module + ".param.yaml"; }; - std::vector module_names; - module_names.emplace_back("autoware::behavior_velocity_planner::CrosswalkModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::WalkwayModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::TrafficLightModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::IntersectionModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::MergeFromPrivateModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::BlindSpotModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::DetectionAreaModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::VirtualTrafficLightModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::NoStoppingAreaModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::StopLineModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::OcclusionSpotModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::RunOutModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::SpeedBumpModulePlugin"); - module_names.emplace_back("autoware::behavior_velocity_planner::NoDrivableLaneModulePlugin"); + std::vector plugin_names; + for (const auto & plugin_info : plugin_info_vec) { + plugin_names.emplace_back(plugin_info.plugin_name); + } std::vector params; - params.emplace_back("launch_modules", module_names); + params.emplace_back("launch_modules", plugin_names); params.emplace_back("is_simulation", false); node_options.parameter_overrides(params); - autoware::test_utils::updateNodeOptions( - node_options, - {autoware_test_utils_dir + "/config/test_common.param.yaml", - autoware_test_utils_dir + "/config/test_nearest_search.param.yaml", - autoware_test_utils_dir + "/config/test_vehicle_info.param.yaml", - velocity_smoother_dir + "/config/default_velocity_smoother.param.yaml", - velocity_smoother_dir + "/config/Analytical.param.yaml", - behavior_velocity_planner_common_dir + "/config/behavior_velocity_planner_common.param.yaml", - behavior_velocity_planner_dir + "/config/behavior_velocity_planner.param.yaml", - get_behavior_velocity_module_config("blind_spot"), - get_behavior_velocity_module_config("crosswalk"), - get_behavior_velocity_module_config("walkway"), - get_behavior_velocity_module_config("detection_area"), - get_behavior_velocity_module_config("intersection"), - get_behavior_velocity_module_config("no_stopping_area"), - get_behavior_velocity_module_config("occlusion_spot"), - get_behavior_velocity_module_config("run_out"), - get_behavior_velocity_module_config("speed_bump"), - get_behavior_velocity_module_config("stop_line"), - get_behavior_velocity_module_config("traffic_light"), - get_behavior_velocity_module_config("virtual_traffic_light"), - get_behavior_velocity_module_config("no_drivable_lane")}); + auto yaml_files = std::vector{ + autoware_test_utils_dir + "/config/test_common.param.yaml", + autoware_test_utils_dir + "/config/test_nearest_search.param.yaml", + autoware_test_utils_dir + "/config/test_vehicle_info.param.yaml", + velocity_smoother_dir + "/config/default_velocity_smoother.param.yaml", + velocity_smoother_dir + "/config/Analytical.param.yaml", + behavior_velocity_planner_common_dir + "/config/behavior_velocity_planner_common.param.yaml", + behavior_velocity_planner_dir + "/config/behavior_velocity_planner.param.yaml"}; + for (const auto & plugin_info : plugin_info_vec) { + yaml_files.push_back(get_behavior_velocity_module_config(plugin_info.module_name)); + } + + autoware::test_utils::updateNodeOptions(node_options, yaml_files); // TODO(Takagi, Isamu): set launch_modules // TODO(Kyoichi Sugahara) set to true launch_virtual_traffic_light @@ -141,39 +118,4 @@ void publishMandatoryTopics( test_manager->publishOccupancyGrid( test_target_node, "behavior_velocity_planner_node/input/occupancy_grid"); } - -TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) -{ - rclcpp::init(0, nullptr); - auto test_manager = generateTestManager(); - auto test_target_node = generateNode(); - - publishMandatoryTopics(test_manager, test_target_node); - - // test with nominal path_with_lane_id - ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); - EXPECT_GE(test_manager->getReceivedTopicNum(), 1); - - // test with empty path_with_lane_id - ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); - rclcpp::shutdown(); -} - -TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) -{ - rclcpp::init(0, nullptr); - - auto test_manager = generateTestManager(); - auto test_target_node = generateNode(); - publishMandatoryTopics(test_manager, test_target_node); - - // test for normal trajectory - ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); - - // make sure behavior_path_planner is running - EXPECT_GE(test_manager->getReceivedTopicNum(), 1); - - ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); - - rclcpp::shutdown(); -} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/test_node_interface.cpp new file mode 100644 index 0000000000000..6e232318c1711 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/test/test_node_interface.cpp @@ -0,0 +1,61 @@ +// 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. + +#include "autoware/behavior_velocity_planner/test_utils.hpp" + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner From ad16612cf12fa7122304eebb9f7c5112fa72cbaa Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Thu, 26 Dec 2024 14:45:37 +0900 Subject: [PATCH 003/127] chore(cppcheck): ignore examples/ dir (#9798) Signed-off-by: Mamoru Sobue --- .cppcheck_suppressions | 1 + 1 file changed, 1 insertion(+) diff --git a/.cppcheck_suppressions b/.cppcheck_suppressions index 5e1035de20c64..ab267ec3ac007 100644 --- a/.cppcheck_suppressions +++ b/.cppcheck_suppressions @@ -1,4 +1,5 @@ *:*/test/* +*:*/examples/* checkersReport missingInclude From 0997af503fbcb36a7d5679968eba18659030d144 Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Thu, 26 Dec 2024 16:42:01 +0900 Subject: [PATCH 004/127] fix(autoware_planning_evaluator): rename lateral deviation metrics (#9801) * refactor(planning_evaluator): rename and add lateral trajectory displacement metrics Signed-off-by: kyoichi-sugahara * fix typo Signed-off-by: kyoichi-sugahara --------- Signed-off-by: kyoichi-sugahara --- .../config/planning_evaluator.param.yaml | 3 ++- .../metrics/deviation_metrics.hpp | 2 +- .../planning_evaluator/metrics/metric.hpp | 16 ++++++++-------- .../metrics/stability_metrics.hpp | 2 +- .../src/metrics/deviation_metrics.cpp | 2 +- .../src/metrics/stability_metrics.cpp | 2 +- .../src/metrics_calculator.cpp | 10 +++++----- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/evaluator/autoware_planning_evaluator/config/planning_evaluator.param.yaml b/evaluator/autoware_planning_evaluator/config/planning_evaluator.param.yaml index 73c1f3dfded09..7605ed2a5e859 100644 --- a/evaluator/autoware_planning_evaluator/config/planning_evaluator.param.yaml +++ b/evaluator/autoware_planning_evaluator/config/planning_evaluator.param.yaml @@ -14,7 +14,8 @@ - lateral_deviation - yaw_deviation - velocity_deviation - - trajectory_lateral_displacement + - lateral_trajectory_displacement_local + - lateral_trajectory_displacement_lookahead - stability - stability_frechet - obstacle_distance diff --git a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/deviation_metrics.hpp b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/deviation_metrics.hpp index 0e08398ffa87e..2341ad2bb6ba3 100644 --- a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/deviation_metrics.hpp +++ b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/deviation_metrics.hpp @@ -45,7 +45,7 @@ Accumulator calcLateralDeviation(const Trajectory & ref, const Trajector * @param [in] base_pose base pose * @return calculated statistics */ -Accumulator calcLateralTrajectoryDisplacement( +Accumulator calcLocalLateralTrajectoryDisplacement( const Trajectory & prev, const Trajectory & traj, const Pose & base_pose); /** diff --git a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/metric.hpp b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/metric.hpp index 22b365881ce28..7c207bf6c8f57 100644 --- a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/metric.hpp +++ b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/metric.hpp @@ -37,10 +37,10 @@ enum class Metric { lateral_deviation, yaw_deviation, velocity_deviation, - lateral_trajectory_displacement, + lateral_trajectory_displacement_local, + lateral_trajectory_displacement_lookahead, stability, stability_frechet, - trajectory_lateral_displacement, obstacle_distance, obstacle_ttc, modified_goal_longitudinal_deviation, @@ -64,10 +64,10 @@ static const std::unordered_map str_to_metric = { {"lateral_deviation", Metric::lateral_deviation}, {"yaw_deviation", Metric::yaw_deviation}, {"velocity_deviation", Metric::velocity_deviation}, - {"lateral_trajectory_displacement", Metric::lateral_trajectory_displacement}, + {"lateral_trajectory_displacement_local", Metric::lateral_trajectory_displacement_local}, + {"lateral_trajectory_displacement_lookahead", Metric::lateral_trajectory_displacement_lookahead}, {"stability", Metric::stability}, {"stability_frechet", Metric::stability_frechet}, - {"trajectory_lateral_displacement", Metric::trajectory_lateral_displacement}, {"obstacle_distance", Metric::obstacle_distance}, {"obstacle_ttc", Metric::obstacle_ttc}, {"modified_goal_longitudinal_deviation", Metric::modified_goal_longitudinal_deviation}, @@ -86,10 +86,10 @@ static const std::unordered_map metric_to_str = { {Metric::lateral_deviation, "lateral_deviation"}, {Metric::yaw_deviation, "yaw_deviation"}, {Metric::velocity_deviation, "velocity_deviation"}, - {Metric::lateral_trajectory_displacement, "lateral_trajectory_displacement"}, + {Metric::lateral_trajectory_displacement_local, "lateral_trajectory_displacement_local"}, + {Metric::lateral_trajectory_displacement_lookahead, "lateral_trajectory_displacement_lookahead"}, {Metric::stability, "stability"}, {Metric::stability_frechet, "stability_frechet"}, - {Metric::trajectory_lateral_displacement, "trajectory_lateral_displacement"}, {Metric::obstacle_distance, "obstacle_distance"}, {Metric::obstacle_ttc, "obstacle_ttc"}, {Metric::modified_goal_longitudinal_deviation, "modified_goal_longitudinal_deviation"}, @@ -109,10 +109,10 @@ static const std::unordered_map metric_descriptions = { {Metric::lateral_deviation, "Lateral_deviation[m]"}, {Metric::yaw_deviation, "Yaw_deviation[rad]"}, {Metric::velocity_deviation, "Velocity_deviation[m/s]"}, - {Metric::lateral_trajectory_displacement, "Nearest Pose Lateral Deviation[m]"}, + {Metric::lateral_trajectory_displacement_local, "Nearest Pose Lateral Deviation[m]"}, + {Metric::lateral_trajectory_displacement_lookahead, "Lateral_Offset_Over_Distance_Ahead[m]"}, {Metric::stability, "Stability[m]"}, {Metric::stability_frechet, "StabilityFrechet[m]"}, - {Metric::trajectory_lateral_displacement, "Trajectory_lateral_displacement[m]"}, {Metric::obstacle_distance, "Obstacle_distance[m]"}, {Metric::obstacle_ttc, "Obstacle_time_to_collision[s]"}, {Metric::modified_goal_longitudinal_deviation, "Modified_goal_longitudinal_deviation[m]"}, diff --git a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/stability_metrics.hpp b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/stability_metrics.hpp index 69df00b26551b..1b46fbddfb297 100644 --- a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/stability_metrics.hpp +++ b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/metrics/stability_metrics.hpp @@ -56,7 +56,7 @@ Accumulator calcLateralDistance(const Trajectory & traj1, const Trajecto * @param [in] trajectory_eval_time_s time duration for trajectory evaluation in seconds * @return statistical accumulator containing the total lateral displacement */ -Accumulator calcTrajectoryLateralDisplacement( +Accumulator calcLookaheadLateralTrajectoryDisplacement( const Trajectory traj1, const Trajectory traj2, const nav_msgs::msg::Odometry & ego_odom, const double trajectory_eval_time_s); diff --git a/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp b/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp index ffb56baf29f17..82ba86c65d6af 100644 --- a/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp +++ b/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp @@ -45,7 +45,7 @@ Accumulator calcLateralDeviation(const Trajectory & ref, const Trajector return stat; } -Accumulator calcLateralTrajectoryDisplacement( +Accumulator calcLocalLateralTrajectoryDisplacement( const Trajectory & prev, const Trajectory & traj, const Pose & ego_pose) { Accumulator stat; diff --git a/evaluator/autoware_planning_evaluator/src/metrics/stability_metrics.cpp b/evaluator/autoware_planning_evaluator/src/metrics/stability_metrics.cpp index b99a4ebd20050..61e18a6ad0b63 100644 --- a/evaluator/autoware_planning_evaluator/src/metrics/stability_metrics.cpp +++ b/evaluator/autoware_planning_evaluator/src/metrics/stability_metrics.cpp @@ -98,7 +98,7 @@ Accumulator calcLateralDistance(const Trajectory & traj1, const Trajecto return stat; } -Accumulator calcTrajectoryLateralDisplacement( +Accumulator calcLookaheadLateralTrajectoryDisplacement( const Trajectory traj1, const Trajectory traj2, const nav_msgs::msg::Odometry & ego_odom, const double trajectory_eval_time_s) { diff --git a/evaluator/autoware_planning_evaluator/src/metrics_calculator.cpp b/evaluator/autoware_planning_evaluator/src/metrics_calculator.cpp index 201fbcba0e9f7..c30420a5632fa 100644 --- a/evaluator/autoware_planning_evaluator/src/metrics_calculator.cpp +++ b/evaluator/autoware_planning_evaluator/src/metrics_calculator.cpp @@ -50,8 +50,11 @@ std::optional> MetricsCalculator::calculate( return metrics::calcYawDeviation(reference_trajectory_, traj); case Metric::velocity_deviation: return metrics::calcVelocityDeviation(reference_trajectory_, traj); - case Metric::lateral_trajectory_displacement: - return metrics::calcLateralTrajectoryDisplacement(previous_trajectory_, traj, ego_pose_); + case Metric::lateral_trajectory_displacement_local: + return metrics::calcLocalLateralTrajectoryDisplacement(previous_trajectory_, traj, ego_pose_); + case Metric::lateral_trajectory_displacement_lookahead: + return metrics::calcLookaheadLateralTrajectoryDisplacement( + previous_trajectory_, traj, ego_odometry_, parameters.trajectory.evaluation_time_s); case Metric::stability_frechet: return metrics::calcFrechetDistance( metrics::utils::get_lookahead_trajectory( @@ -68,9 +71,6 @@ std::optional> MetricsCalculator::calculate( metrics::utils::get_lookahead_trajectory( traj, ego_pose_, parameters.trajectory.lookahead.max_dist_m, parameters.trajectory.lookahead.max_time_s)); - case Metric::trajectory_lateral_displacement: - return metrics::calcTrajectoryLateralDisplacement( - previous_trajectory_, traj, ego_odometry_, parameters.trajectory.evaluation_time_s); case Metric::obstacle_distance: return metrics::calcDistanceToObstacle(dynamic_objects_, traj); case Metric::obstacle_ttc: From 231c341e4bac7061c477f1222eeddd526fbad18c Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 26 Dec 2024 19:48:50 +0900 Subject: [PATCH 005/127] fix(behavior_path_planner): add freespace_planning_algorithms dependency (#9800) --- .../autoware_behavior_path_goal_planner_module/package.xml | 1 + .../autoware_behavior_path_start_planner_module/package.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/package.xml b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/package.xml index 232c548b28da3..78c4ea7e4c609 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/package.xml +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/package.xml @@ -23,6 +23,7 @@ autoware_behavior_path_planner autoware_behavior_path_planner_common autoware_bezier_sampler + autoware_freespace_planning_algorithms autoware_motion_utils autoware_rtc_interface autoware_test_utils diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/package.xml b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/package.xml index c7cabb403f164..214731f96cebc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/package.xml +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/package.xml @@ -22,6 +22,7 @@ autoware_behavior_path_planner autoware_behavior_path_planner_common + autoware_freespace_planning_algorithms autoware_motion_utils autoware_rtc_interface autoware_universe_utils From 4ed851f651777e7e241e791ff2cfd76deb3522ba Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Fri, 27 Dec 2024 10:16:22 +0900 Subject: [PATCH 006/127] refactor(behavior_velocity_planner_common): add behavior_velocity_rtc_interface and move RTC-related implementation (#9799) * split into planer_common and rtc_interface Signed-off-by: Takayuki Murooka * Update planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp Co-authored-by: Mamoru Sobue * Update planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp Co-authored-by: Mamoru Sobue * fix Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka Co-authored-by: Mamoru Sobue --- .../manager.hpp | 6 +- .../scene.hpp | 4 +- .../package.xml | 1 + .../src/manager.cpp | 2 +- .../src/scene.cpp | 2 +- .../package.xml | 1 + .../src/manager.cpp | 4 +- .../src/manager.hpp | 6 +- .../src/scene_crosswalk.cpp | 2 +- .../src/scene_crosswalk.hpp | 4 +- .../package.xml | 1 + .../src/manager.cpp | 9 +- .../src/manager.hpp | 6 +- .../src/scene.cpp | 2 +- .../src/scene.hpp | 4 +- .../package.xml | 1 + .../src/manager.cpp | 4 +- .../src/manager.hpp | 7 +- .../src/scene_intersection.cpp | 2 +- .../src/scene_intersection.hpp | 4 +- .../src/manager.hpp | 2 +- .../package.xml | 1 + .../src/manager.cpp | 9 +- .../src/manager.hpp | 6 +- .../src/scene_no_stopping_area.cpp | 2 +- .../src/scene_no_stopping_area.hpp | 4 +- .../src/manager.hpp | 2 +- .../README.md | 2 +- .../scene_module_interface.hpp | 229 ++++++++++------- .../package.xml | 1 - .../src/scene_module_interface.cpp | 238 +----------------- .../CMakeLists.txt | 11 + .../README.md | 3 + .../scene_module_interface_with_rtc.hpp | 154 ++++++++++++ .../package.xml | 38 +++ .../src/scene_module_interface_with_rtc.cpp | 140 +++++++++++ .../src/manager.hpp | 2 +- .../src/manager.hpp | 2 +- .../src/manager.hpp | 2 +- .../src/manager.hpp | 2 +- .../package.xml | 1 + .../src/manager.cpp | 4 +- .../src/manager.hpp | 6 +- .../src/scene.cpp | 2 +- .../src/scene.hpp | 4 +- .../src/manager.hpp | 2 +- .../src/manager.hpp | 2 +- 47 files changed, 562 insertions(+), 381 deletions(-) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/CMakeLists.txt create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/README.md create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/package.xml create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp index f296ad03cbac6..bf01986d5c28f 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -42,8 +42,8 @@ class BlindSpotModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; }; class BlindSpotModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp index 1bfa41d86ffbe..50ce8634ec600 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp @@ -16,8 +16,8 @@ #define AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__SCENE_HPP_ #include -#include #include +#include #include #include @@ -59,7 +59,7 @@ struct Safe using BlindSpotDecision = std::variant; -class BlindSpotModule : public SceneModuleInterface +class BlindSpotModule : public SceneModuleInterfaceWithRTC { public: struct DebugData diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml index a2ea4a82a884d..9739370387df7 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml @@ -18,6 +18,7 @@ autoware_cmake autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension autoware_motion_utils autoware_perception_msgs diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp index cc63b42df68e4..a1410d2fecfd5 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp @@ -83,7 +83,7 @@ void BlindSpotModuleManager::launchNewModules(const tier4_planning_msgs::msg::Pa } } -std::function &)> +std::function &)> BlindSpotModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp index 7697786adb19d..7d1a68c5006a0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp @@ -41,7 +41,7 @@ BlindSpotModule::BlindSpotModule( const int64_t module_id, const int64_t lane_id, const TurnDirection turn_direction, const std::shared_ptr planner_data, const PlannerParam & planner_param, const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), +: SceneModuleInterfaceWithRTC(module_id, logger, clock), lane_id_(lane_id), planner_param_{planner_param}, turn_direction_(turn_direction), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml index 08bd8f91c7d71..ff01e85aa5456 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml @@ -22,6 +22,7 @@ eigen3_cmake_module autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_grid_map_utils autoware_internal_debug_msgs autoware_interpolation diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp index 8ba05be36ae56..cdaff7225a7d2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp @@ -216,7 +216,7 @@ void CrosswalkModuleManager::launchNewModules(const PathWithLaneId & path) } } -std::function &)> +std::function &)> CrosswalkModuleManager::getModuleExpiredFunction(const PathWithLaneId & path) { const auto rh = planner_data_->route_handler_; @@ -233,7 +233,7 @@ CrosswalkModuleManager::getModuleExpiredFunction(const PathWithLaneId & path) crosswalk_id_set.insert(crosswalk.first->crosswalkLanelet().id()); } - return [crosswalk_id_set](const std::shared_ptr & scene_module) { + return [crosswalk_id_set](const std::shared_ptr & scene_module) { return crosswalk_id_set.count(scene_module->getModuleId()) == 0; }; } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.hpp index d6f6ddfb7b6ad..091a427e14949 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -48,8 +48,8 @@ class CrosswalkModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const PathWithLaneId & path) override; }; class CrosswalkModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp index 07b2f1deff0c7..64f7e9e14dcd1 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp @@ -176,7 +176,7 @@ CrosswalkModule::CrosswalkModule( const std::optional & reg_elem_id, const lanelet::LaneletMapPtr & lanelet_map_ptr, const PlannerParam & planner_param, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), +: SceneModuleInterfaceWithRTC(module_id, logger, clock), module_id_(module_id), planner_param_(planner_param), use_regulatory_element_(reg_elem_id) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp index b3fbc2f6cfaba..d5a9e463c730b 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp @@ -17,7 +17,7 @@ #include "autoware/behavior_velocity_crosswalk_module/util.hpp" -#include +#include #include #include #include @@ -112,7 +112,7 @@ double InterpolateMap( } } // namespace -class CrosswalkModule : public SceneModuleInterface +class CrosswalkModule : public SceneModuleInterfaceWithRTC { public: struct PlannerParam diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml index ff91cf40a32a6..90aaddf96feef 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml @@ -18,6 +18,7 @@ eigen3_cmake_module autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension autoware_motion_utils autoware_planning_msgs diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp index 3f39696ff6bcc..62f5b88699a37 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp @@ -74,16 +74,17 @@ void DetectionAreaModuleManager::launchNewModules( } } -std::function &)> +std::function &)> DetectionAreaModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { const auto detection_area_id_set = planning_utils::getRegElemIdSetOnPath( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); - return [detection_area_id_set](const std::shared_ptr & scene_module) { - return detection_area_id_set.count(scene_module->getModuleId()) == 0; - }; + return + [detection_area_id_set](const std::shared_ptr & scene_module) { + return detection_area_id_set.count(scene_module->getModuleId()) == 0; + }; } } // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp index 7aa60cbbaa18b..1fbcc16461ebc 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -41,8 +41,8 @@ class DetectionAreaModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; }; class DetectionAreaModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp index 61b3b185999d8..6d7754624485c 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp @@ -37,7 +37,7 @@ DetectionAreaModule::DetectionAreaModule( const lanelet::autoware::DetectionArea & detection_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), +: SceneModuleInterfaceWithRTC(module_id, logger, clock), lane_id_(lane_id), detection_area_reg_elem_(detection_area_reg_elem), state_(State::GO), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp index 9224cf4624687..bdf2d05a35bcb 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp @@ -23,8 +23,8 @@ #define EIGEN_MPL2_ONLY #include -#include #include +#include #include #include @@ -38,7 +38,7 @@ using PathIndexWithPoint2d = std::pair; // front using PathIndexWithOffset = std::pair; // front index, offset using tier4_planning_msgs::msg::PathWithLaneId; -class DetectionAreaModule : public SceneModuleInterface +class DetectionAreaModule : public SceneModuleInterfaceWithRTC { public: enum class State { GO, STOP }; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml index 7a64d1d6638ff..208e7ed49de71 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml @@ -20,6 +20,7 @@ autoware_cmake autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_internal_debug_msgs autoware_interpolation autoware_lanelet2_extension diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp index 39ed8e80412a6..41bdbe3e43c8b 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp @@ -353,14 +353,14 @@ void IntersectionModuleManager::launchNewModules( } } -std::function &)> +std::function &)> IntersectionModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { const auto lane_set = planning_utils::getLaneletsOnPath( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); - return [lane_set](const std::shared_ptr & scene_module) { + return [lane_set](const std::shared_ptr & scene_module) { const auto intersection_module = std::dynamic_pointer_cast(scene_module); const auto & associative_ids = intersection_module->getAssociativeIds(); for (const auto & lane : lane_set) { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.hpp index 80c87e55c6696..c6f76d7c39640 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.hpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -47,8 +48,8 @@ class IntersectionModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; bool hasSameParentLaneletAndTurnDirectionWithRegistered(const lanelet::ConstLanelet & lane) const; @@ -63,7 +64,7 @@ class IntersectionModuleManager : public SceneModuleManagerInterfaceWithRTC tl_observation_pub_; }; -class MergeFromPrivateModuleManager : public SceneModuleManagerInterface +class MergeFromPrivateModuleManager : public SceneModuleManagerInterface<> { public: explicit MergeFromPrivateModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp index 7c492a9dd42bf..e33416860c319 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp @@ -53,7 +53,7 @@ IntersectionModule::IntersectionModule( const PlannerParam & planner_param, const std::set & associative_ids, const std::string & turn_direction, const bool has_traffic_light, rclcpp::Node & node, const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), +: SceneModuleInterfaceWithRTC(module_id, logger, clock), planner_param_(planner_param), lane_id_(lane_id), associative_ids_(associative_ids), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp index 164df7588bd68..6c31be2ce83b9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp @@ -22,8 +22,8 @@ #include "object_manager.hpp" #include "result.hpp" -#include #include +#include #include #include @@ -46,7 +46,7 @@ namespace autoware::behavior_velocity_planner { -class IntersectionModule : public SceneModuleInterface +class IntersectionModule : public SceneModuleInterfaceWithRTC { public: struct PlannerParam diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.hpp index 545af1576c6a8..bea068f5b9579 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.hpp @@ -29,7 +29,7 @@ namespace autoware::behavior_velocity_planner { -class NoDrivableLaneModuleManager : public SceneModuleManagerInterface +class NoDrivableLaneModuleManager : public SceneModuleManagerInterface<> { public: explicit NoDrivableLaneModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml index 88fafeb5b90dc..4415eadef62c7 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml @@ -18,6 +18,7 @@ autoware_cmake autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_interpolation autoware_lanelet2_extension autoware_motion_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp index 9d66aa6672d36..dca2dde33b693 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp @@ -69,16 +69,17 @@ void NoStoppingAreaModuleManager::launchNewModules( } } -std::function &)> +std::function &)> NoStoppingAreaModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { const auto no_stopping_area_id_set = planning_utils::getRegElemIdSetOnPath( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); - return [no_stopping_area_id_set](const std::shared_ptr & scene_module) { - return no_stopping_area_id_set.count(scene_module->getModuleId()) == 0; - }; + return + [no_stopping_area_id_set](const std::shared_ptr & scene_module) { + return no_stopping_area_id_set.count(scene_module->getModuleId()) == 0; + }; } } // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.hpp index 7009e94612580..523cbba291632 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -41,8 +41,8 @@ class NoStoppingAreaModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; }; class NoStoppingAreaModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp index 3769aed71a1ec..5c79ec69a9d98 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp @@ -41,7 +41,7 @@ NoStoppingAreaModule::NoStoppingAreaModule( const lanelet::autoware::NoStoppingArea & no_stopping_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), +: SceneModuleInterfaceWithRTC(module_id, logger, clock), lane_id_(lane_id), no_stopping_area_reg_elem_(no_stopping_area_reg_elem), planner_param_(planner_param), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp index 51f3a0d261ebd..1eafcf157623d 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp @@ -17,9 +17,9 @@ #include "utils.hpp" -#include #include #include +#include #include #include @@ -31,7 +31,7 @@ namespace autoware::behavior_velocity_planner { -class NoStoppingAreaModule : public SceneModuleInterface +class NoStoppingAreaModule : public SceneModuleInterfaceWithRTC { public: struct PlannerParam diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.hpp index 32b1818214952..08c1516dea67a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.hpp @@ -39,7 +39,7 @@ namespace autoware::behavior_velocity_planner { -class OcclusionSpotModuleManager : public SceneModuleManagerInterface +class OcclusionSpotModuleManager : public SceneModuleManagerInterface<> { public: explicit OcclusionSpotModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/README.md b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/README.md index 2abbb83575af5..c4c8d97b4b390 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/README.md +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/README.md @@ -1,3 +1,3 @@ # Behavior Velocity Planner Common -This package provides common functions as a library, which are used in the `behavior_velocity_planner` node and modules. +This package provides a behavior velocity interface without RTC, and common functions as a library, which are used in the `behavior_velocity_planner` node and modules. diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp index 4e898d9d28715..9dbed9009a93e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp @@ -16,12 +16,14 @@ #define AUTOWARE__BEHAVIOR_VELOCITY_PLANNER_COMMON__SCENE_MODULE_INTERFACE_HPP_ #include +#include #include #include +#include #include -#include #include #include +#include #include #include @@ -30,7 +32,6 @@ #include #include #include -#include #include #include @@ -54,14 +55,12 @@ using autoware::motion_utils::PlanningBehavior; using autoware::motion_utils::VelocityFactor; using autoware::objects_of_interest_marker_interface::ColorName; using autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface; -using autoware::rtc_interface::RTCInterface; using autoware::universe_utils::DebugPublisher; using autoware::universe_utils::getOrDeclareParameter; +using autoware::universe_utils::StopWatch; using autoware_internal_debug_msgs::msg::Float64Stamped; using builtin_interfaces::msg::Time; using tier4_planning_msgs::msg::PathWithLaneId; -using tier4_rtc_msgs::msg::Module; -using tier4_rtc_msgs::msg::State; using unique_identifier_msgs::msg::UUID; struct ObjectOfInterest @@ -114,12 +113,6 @@ class SceneModuleInterface std::shared_ptr getTimeKeeper() { return time_keeper_; } - void setActivation(const bool activated) { activated_ = activated; } - void setRTCEnabled(const bool enable_rtc) { rtc_enabled_ = enable_rtc; } - bool isActivated() const { return activated_; } - bool isSafe() const { return safe_; } - double getDistance() const { return distance_; } - void resetVelocityFactor() { velocity_factor_.reset(); } VelocityFactor getVelocityFactor() const { return velocity_factor_.get(); } std::vector getObjectsOfInterestData() const { return objects_of_interest_; } @@ -127,10 +120,6 @@ class SceneModuleInterface protected: const int64_t module_id_; - bool activated_; - bool safe_; - bool rtc_enabled_; - double distance_; rclcpp::Logger logger_; rclcpp::Clock::SharedPtr clock_; std::shared_ptr planner_data_; @@ -139,16 +128,6 @@ class SceneModuleInterface std::vector objects_of_interest_; mutable std::shared_ptr time_keeper_; - void setSafe(const bool safe) - { - safe_ = safe; - if (!rtc_enabled_) { - syncActivation(); - } - } - void setDistance(const double distance) { distance_ = distance; } - void syncActivation() { setActivation(isSafe()); } - void setObjectsOfInterestData( const geometry_msgs::msg::Pose & pose, const autoware_perception_msgs::msg::Shape & shape, const ColorName & color_name) @@ -160,10 +139,39 @@ class SceneModuleInterface const std::vector & points) const; }; +template class SceneModuleManagerInterface { public: - SceneModuleManagerInterface(rclcpp::Node & node, [[maybe_unused]] const char * module_name); + SceneModuleManagerInterface(rclcpp::Node & node, [[maybe_unused]] const char * module_name) + : node_(node), clock_(node.get_clock()), logger_(node.get_logger()) + { + const auto ns = std::string("~/debug/") + module_name; + pub_debug_ = node.create_publisher(ns, 1); + if (!node.has_parameter("is_publish_debug_path")) { + is_publish_debug_path_ = node.declare_parameter("is_publish_debug_path"); + } else { + is_publish_debug_path_ = node.get_parameter("is_publish_debug_path").as_bool(); + } + if (is_publish_debug_path_) { + pub_debug_path_ = node.create_publisher( + std::string("~/debug/path_with_lane_id/") + module_name, 1); + } + pub_virtual_wall_ = node.create_publisher( + std::string("~/virtual_wall/") + module_name, 5); + pub_velocity_factor_ = node.create_publisher( + std::string("/planning/velocity_factors/") + module_name, 1); + pub_infrastructure_commands_ = + node.create_publisher( + "~/output/infrastructure_commands", 1); + + processing_time_publisher_ = std::make_shared(&node, "~/debug"); + + pub_processing_time_detail_ = node.create_publisher( + "~/debug/processing_time_detail_ms/" + std::string(module_name), 1); + + time_keeper_ = std::make_shared(pub_processing_time_detail_); + } virtual ~SceneModuleManagerInterface() = default; @@ -171,31 +179,111 @@ class SceneModuleManagerInterface void updateSceneModuleInstances( const std::shared_ptr & planner_data, - const tier4_planning_msgs::msg::PathWithLaneId & path); + const tier4_planning_msgs::msg::PathWithLaneId & path) + { + planner_data_ = planner_data; + + launchNewModules(path); + deleteExpiredModules(path); + } virtual void plan(tier4_planning_msgs::msg::PathWithLaneId * path) { modifyPathVelocity(path); } protected: - virtual void modifyPathVelocity(tier4_planning_msgs::msg::PathWithLaneId * path); + virtual void modifyPathVelocity(tier4_planning_msgs::msg::PathWithLaneId * path) + { + universe_utils::ScopedTimeTrack st( + "SceneModuleManagerInterface::modifyPathVelocity", *time_keeper_); + StopWatch stop_watch; + stop_watch.tic("Total"); + visualization_msgs::msg::MarkerArray debug_marker_array; + autoware_adapi_v1_msgs::msg::VelocityFactorArray velocity_factor_array; + velocity_factor_array.header.frame_id = "map"; + velocity_factor_array.header.stamp = clock_->now(); + + tier4_v2x_msgs::msg::InfrastructureCommandArray infrastructure_command_array; + infrastructure_command_array.stamp = clock_->now(); + + for (const auto & scene_module : scene_modules_) { + scene_module->resetVelocityFactor(); + scene_module->setPlannerData(planner_data_); + scene_module->modifyPathVelocity(path); + + // The velocity factor must be called after modifyPathVelocity. + const auto velocity_factor = scene_module->getVelocityFactor(); + if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { + velocity_factor_array.factors.emplace_back(velocity_factor); + } + + if (const auto command = scene_module->getInfrastructureCommand()) { + infrastructure_command_array.commands.push_back(*command); + } + + for (const auto & marker : scene_module->createDebugMarkerArray().markers) { + debug_marker_array.markers.push_back(marker); + } + + virtual_wall_marker_creator_.add_virtual_walls(scene_module->createVirtualWalls()); + } + + pub_velocity_factor_->publish(velocity_factor_array); + pub_infrastructure_commands_->publish(infrastructure_command_array); + pub_debug_->publish(debug_marker_array); + if (is_publish_debug_path_) { + tier4_planning_msgs::msg::PathWithLaneId debug_path; + debug_path.header = path->header; + debug_path.points = path->points; + pub_debug_path_->publish(debug_path); + } + pub_virtual_wall_->publish(virtual_wall_marker_creator_.create_markers(clock_->now())); + processing_time_publisher_->publish( + std::string(getModuleName()) + "/processing_time_ms", stop_watch.toc("Total")); + } virtual void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) = 0; - virtual std::function &)> - getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) = 0; + virtual std::function &)> getModuleExpiredFunction( + const tier4_planning_msgs::msg::PathWithLaneId & path) = 0; - virtual void deleteExpiredModules(const tier4_planning_msgs::msg::PathWithLaneId & path); + virtual void deleteExpiredModules(const tier4_planning_msgs::msg::PathWithLaneId & path) + { + const auto isModuleExpired = getModuleExpiredFunction(path); + + auto itr = scene_modules_.begin(); + while (itr != scene_modules_.end()) { + if (isModuleExpired(*itr)) { + itr = scene_modules_.erase(itr); + } else { + itr++; + } + } + } bool isModuleRegistered(const int64_t module_id) { return registered_module_id_set_.count(module_id) != 0; } - void registerModule(const std::shared_ptr & scene_module); + void registerModule(const std::shared_ptr & scene_module) + { + RCLCPP_DEBUG( + logger_, "register task: module = %s, id = %lu", getModuleName(), + scene_module->getModuleId()); + registered_module_id_set_.emplace(scene_module->getModuleId()); + scene_module->setTimeKeeper(time_keeper_); + scene_modules_.insert(scene_module); + } size_t findEgoSegmentIndex( - const std::vector & points) const; + const std::vector & points) const + { + const auto & p = planner_data_; + return autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( + points, p->current_odometry->pose, p->ego_nearest_dist_threshold, + p->ego_nearest_yaw_threshold); + } - std::set> scene_modules_; + std::set> scene_modules_; std::set registered_module_id_set_; std::shared_ptr planner_data_; @@ -220,66 +308,19 @@ class SceneModuleManagerInterface std::shared_ptr time_keeper_; }; - -class SceneModuleManagerInterfaceWithRTC : public SceneModuleManagerInterface -{ -public: - SceneModuleManagerInterfaceWithRTC( - rclcpp::Node & node, const char * module_name, const bool enable_rtc = true); - - void plan(tier4_planning_msgs::msg::PathWithLaneId * path) override; - -protected: - RTCInterface rtc_interface_; - std::unordered_map map_uuid_; - - ObjectsOfInterestMarkerInterface objects_of_interest_marker_interface_; - - virtual void sendRTC(const Time & stamp); - - virtual void setActivation(); - - void updateRTCStatus( - const UUID & uuid, const bool safe, const uint8_t state, const double distance, - const Time & stamp) - { - rtc_interface_.updateCooperateStatus(uuid, safe, state, distance, distance, stamp); - } - - void removeRTCStatus(const UUID & uuid) { rtc_interface_.removeCooperateStatus(uuid); } - - void publishRTCStatus(const Time & stamp) - { - rtc_interface_.removeExpiredCooperateStatus(); - rtc_interface_.publishCooperateStatus(stamp); - } - - UUID getUUID(const int64_t & module_id) const; - - void generateUUID(const int64_t & module_id); - - void removeUUID(const int64_t & module_id); - - void publishObjectsOfInterestMarker(); - - void deleteExpiredModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - - static bool getEnableRTC(rclcpp::Node & node, const std::string & param_name) - { - bool enable_rtc = true; - - try { - enable_rtc = getOrDeclareParameter(node, "enable_all_modules_auto_mode") - ? false - : getOrDeclareParameter(node, param_name); - } catch (const std::exception & e) { - enable_rtc = getOrDeclareParameter(node, param_name); - } - - return enable_rtc; - } -}; - +extern template SceneModuleManagerInterface::SceneModuleManagerInterface( + rclcpp::Node & node, [[maybe_unused]] const char * module_name); +extern template size_t SceneModuleManagerInterface::findEgoSegmentIndex( + const std::vector & points) const; +extern template void SceneModuleManagerInterface::updateSceneModuleInstances( + const std::shared_ptr & planner_data, + const tier4_planning_msgs::msg::PathWithLaneId & path); +extern template void SceneModuleManagerInterface::modifyPathVelocity( + tier4_planning_msgs::msg::PathWithLaneId * path); +extern template void SceneModuleManagerInterface::deleteExpiredModules( + const tier4_planning_msgs::msg::PathWithLaneId & path); +extern template void SceneModuleManagerInterface::registerModule( + const std::shared_ptr & scene_module); } // namespace autoware::behavior_velocity_planner #endif // AUTOWARE__BEHAVIOR_VELOCITY_PLANNER_COMMON__SCENE_MODULE_INTERFACE_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml index a0b54cb879cab..002c3362260cc 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml @@ -29,7 +29,6 @@ autoware_perception_msgs autoware_planning_msgs autoware_route_handler - autoware_rtc_interface autoware_universe_utils autoware_vehicle_info_utils autoware_velocity_smoother diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp index cdfde1ce51205..ffd454012d13e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp @@ -13,29 +13,20 @@ // limitations under the License. #include -#include #include -#include -#include #include #include #include #include -#include #include namespace autoware::behavior_velocity_planner { -using autoware::universe_utils::StopWatch; - SceneModuleInterface::SceneModuleInterface( const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock) : module_id_(module_id), - activated_(false), - safe_(false), - distance_(std::numeric_limits::lowest()), logger_(logger), clock_(clock), time_keeper_(std::shared_ptr()) @@ -50,222 +41,17 @@ size_t SceneModuleInterface::findEgoSegmentIndex( points, p->current_odometry->pose, p->ego_nearest_dist_threshold); } -SceneModuleManagerInterface::SceneModuleManagerInterface( - rclcpp::Node & node, [[maybe_unused]] const char * module_name) -: node_(node), clock_(node.get_clock()), logger_(node.get_logger()) -{ - const auto ns = std::string("~/debug/") + module_name; - pub_debug_ = node.create_publisher(ns, 1); - if (!node.has_parameter("is_publish_debug_path")) { - is_publish_debug_path_ = node.declare_parameter("is_publish_debug_path"); - } else { - is_publish_debug_path_ = node.get_parameter("is_publish_debug_path").as_bool(); - } - if (is_publish_debug_path_) { - pub_debug_path_ = node.create_publisher( - std::string("~/debug/path_with_lane_id/") + module_name, 1); - } - pub_virtual_wall_ = node.create_publisher( - std::string("~/virtual_wall/") + module_name, 5); - pub_velocity_factor_ = node.create_publisher( - std::string("/planning/velocity_factors/") + module_name, 1); - pub_infrastructure_commands_ = - node.create_publisher( - "~/output/infrastructure_commands", 1); - - processing_time_publisher_ = std::make_shared(&node, "~/debug"); - - pub_processing_time_detail_ = node.create_publisher( - "~/debug/processing_time_detail_ms/" + std::string(module_name), 1); - - time_keeper_ = std::make_shared(pub_processing_time_detail_); -} - -size_t SceneModuleManagerInterface::findEgoSegmentIndex( - const std::vector & points) const -{ - const auto & p = planner_data_; - return autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( - points, p->current_odometry->pose, p->ego_nearest_dist_threshold, p->ego_nearest_yaw_threshold); -} - -void SceneModuleManagerInterface::updateSceneModuleInstances( +template SceneModuleManagerInterface::SceneModuleManagerInterface( + rclcpp::Node & node, [[maybe_unused]] const char * module_name); +template size_t SceneModuleManagerInterface::findEgoSegmentIndex( + const std::vector & points) const; +template void SceneModuleManagerInterface::updateSceneModuleInstances( const std::shared_ptr & planner_data, - const tier4_planning_msgs::msg::PathWithLaneId & path) -{ - planner_data_ = planner_data; - - launchNewModules(path); - deleteExpiredModules(path); -} - -void SceneModuleManagerInterface::modifyPathVelocity( - tier4_planning_msgs::msg::PathWithLaneId * path) -{ - universe_utils::ScopedTimeTrack st( - "SceneModuleManagerInterface::modifyPathVelocity", *time_keeper_); - StopWatch stop_watch; - stop_watch.tic("Total"); - visualization_msgs::msg::MarkerArray debug_marker_array; - autoware_adapi_v1_msgs::msg::VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = clock_->now(); - - tier4_v2x_msgs::msg::InfrastructureCommandArray infrastructure_command_array; - infrastructure_command_array.stamp = clock_->now(); - - for (const auto & scene_module : scene_modules_) { - scene_module->resetVelocityFactor(); - scene_module->setPlannerData(planner_data_); - scene_module->modifyPathVelocity(path); - - // The velocity factor must be called after modifyPathVelocity. - const auto velocity_factor = scene_module->getVelocityFactor(); - if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { - velocity_factor_array.factors.emplace_back(velocity_factor); - } - - if (const auto command = scene_module->getInfrastructureCommand()) { - infrastructure_command_array.commands.push_back(*command); - } - - for (const auto & marker : scene_module->createDebugMarkerArray().markers) { - debug_marker_array.markers.push_back(marker); - } - - virtual_wall_marker_creator_.add_virtual_walls(scene_module->createVirtualWalls()); - } - - pub_velocity_factor_->publish(velocity_factor_array); - pub_infrastructure_commands_->publish(infrastructure_command_array); - pub_debug_->publish(debug_marker_array); - if (is_publish_debug_path_) { - tier4_planning_msgs::msg::PathWithLaneId debug_path; - debug_path.header = path->header; - debug_path.points = path->points; - pub_debug_path_->publish(debug_path); - } - pub_virtual_wall_->publish(virtual_wall_marker_creator_.create_markers(clock_->now())); - processing_time_publisher_->publish( - std::string(getModuleName()) + "/processing_time_ms", stop_watch.toc("Total")); -} - -void SceneModuleManagerInterface::deleteExpiredModules( - const tier4_planning_msgs::msg::PathWithLaneId & path) -{ - const auto isModuleExpired = getModuleExpiredFunction(path); - - auto itr = scene_modules_.begin(); - while (itr != scene_modules_.end()) { - if (isModuleExpired(*itr)) { - itr = scene_modules_.erase(itr); - } else { - itr++; - } - } -} - -void SceneModuleManagerInterface::registerModule( - const std::shared_ptr & scene_module) -{ - RCLCPP_DEBUG( - logger_, "register task: module = %s, id = %lu", getModuleName(), scene_module->getModuleId()); - registered_module_id_set_.emplace(scene_module->getModuleId()); - scene_module->setTimeKeeper(time_keeper_); - scene_modules_.insert(scene_module); -} - -SceneModuleManagerInterfaceWithRTC::SceneModuleManagerInterfaceWithRTC( - rclcpp::Node & node, const char * module_name, const bool enable_rtc) -: SceneModuleManagerInterface(node, module_name), - rtc_interface_(&node, module_name, enable_rtc), - objects_of_interest_marker_interface_(&node, module_name) -{ -} - -void SceneModuleManagerInterfaceWithRTC::plan(tier4_planning_msgs::msg::PathWithLaneId * path) -{ - setActivation(); - modifyPathVelocity(path); - sendRTC(path->header.stamp); - publishObjectsOfInterestMarker(); -} - -void SceneModuleManagerInterfaceWithRTC::sendRTC(const Time & stamp) -{ - for (const auto & scene_module : scene_modules_) { - const UUID uuid = getUUID(scene_module->getModuleId()); - const auto state = !scene_module->isActivated() && scene_module->isSafe() - ? State::WAITING_FOR_EXECUTION - : State::RUNNING; - updateRTCStatus(uuid, scene_module->isSafe(), state, scene_module->getDistance(), stamp); - } - publishRTCStatus(stamp); -} - -void SceneModuleManagerInterfaceWithRTC::setActivation() -{ - for (const auto & scene_module : scene_modules_) { - const UUID uuid = getUUID(scene_module->getModuleId()); - scene_module->setActivation(rtc_interface_.isActivated(uuid)); - scene_module->setRTCEnabled(rtc_interface_.isRTCEnabled(uuid)); - } -} - -UUID SceneModuleManagerInterfaceWithRTC::getUUID(const int64_t & module_id) const -{ - if (map_uuid_.count(module_id) == 0) { - const UUID uuid; - return uuid; - } - return map_uuid_.at(module_id); -} - -void SceneModuleManagerInterfaceWithRTC::generateUUID(const int64_t & module_id) -{ - map_uuid_.insert({module_id, autoware::universe_utils::generateUUID()}); -} - -void SceneModuleManagerInterfaceWithRTC::removeUUID(const int64_t & module_id) -{ - const auto result = map_uuid_.erase(module_id); - if (result == 0) { - RCLCPP_WARN_STREAM(logger_, "[removeUUID] module_id = " << module_id << " is not registered."); - } -} - -void SceneModuleManagerInterfaceWithRTC::publishObjectsOfInterestMarker() -{ - for (const auto & scene_module : scene_modules_) { - const auto objects = scene_module->getObjectsOfInterestData(); - for (const auto & obj : objects) { - objects_of_interest_marker_interface_.insertObjectData(obj.pose, obj.shape, obj.color); - } - scene_module->clearObjectsOfInterestData(); - } - - objects_of_interest_marker_interface_.publishMarkerArray(); -} - -void SceneModuleManagerInterfaceWithRTC::deleteExpiredModules( - const tier4_planning_msgs::msg::PathWithLaneId & path) -{ - const auto isModuleExpired = getModuleExpiredFunction(path); - - auto itr = scene_modules_.begin(); - while (itr != scene_modules_.end()) { - if (isModuleExpired(*itr)) { - const UUID uuid = getUUID((*itr)->getModuleId()); - updateRTCStatus( - uuid, (*itr)->isSafe(), State::SUCCEEDED, std::numeric_limits::lowest(), - clock_->now()); - removeUUID((*itr)->getModuleId()); - registered_module_id_set_.erase((*itr)->getModuleId()); - itr = scene_modules_.erase(itr); - } else { - itr++; - } - } -} - + const tier4_planning_msgs::msg::PathWithLaneId & path); +template void SceneModuleManagerInterface::modifyPathVelocity( + tier4_planning_msgs::msg::PathWithLaneId * path); +template void SceneModuleManagerInterface::deleteExpiredModules( + const tier4_planning_msgs::msg::PathWithLaneId & path); +template void SceneModuleManagerInterface::registerModule( + const std::shared_ptr & scene_module); } // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/CMakeLists.txt new file mode 100644 index 0000000000000..2bd9b9b8d20f0 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.14) +project(autoware_behavior_velocity_rtc_interface) + +find_package(autoware_cmake REQUIRED) +autoware_package() + +ament_auto_add_library(${PROJECT_NAME} SHARED + src/scene_module_interface_with_rtc.cpp +) + +ament_auto_package(INSTALL_TO_SHARE) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/README.md b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/README.md new file mode 100644 index 0000000000000..79b5a4e3d7b95 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/README.md @@ -0,0 +1,3 @@ +# Behavior Velocity RTC Interface + +This package provides a behavior velocity interface with RTC, which are used in the `behavior_velocity_planner` node and modules. diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp new file mode 100644 index 0000000000000..4e30ab019aa4e --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp @@ -0,0 +1,154 @@ +// Copyright 2020 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. + +#ifndef AUTOWARE__BEHAVIOR_VELOCITY_RTC_INTERFACE__SCENE_MODULE_INTERFACE_WITH_RTC_HPP_ +#define AUTOWARE__BEHAVIOR_VELOCITY_RTC_INTERFACE__SCENE_MODULE_INTERFACE_WITH_RTC_HPP_ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +// Debug +#include +#include + +namespace autoware::behavior_velocity_planner +{ + +using autoware::rtc_interface::RTCInterface; +using autoware::universe_utils::getOrDeclareParameter; +using builtin_interfaces::msg::Time; +using tier4_planning_msgs::msg::PathWithLaneId; +using tier4_rtc_msgs::msg::Module; +using tier4_rtc_msgs::msg::State; +using unique_identifier_msgs::msg::UUID; + +class SceneModuleInterfaceWithRTC : public SceneModuleInterface +{ +public: + explicit SceneModuleInterfaceWithRTC( + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock); + virtual ~SceneModuleInterfaceWithRTC() = default; + + void setActivation(const bool activated) { activated_ = activated; } + void setRTCEnabled(const bool enable_rtc) { rtc_enabled_ = enable_rtc; } + bool isActivated() const { return activated_; } + bool isSafe() const { return safe_; } + double getDistance() const { return distance_; } + +protected: + bool activated_; + bool safe_; + bool rtc_enabled_; + double distance_; + + void setSafe(const bool safe) + { + safe_ = safe; + if (!rtc_enabled_) { + syncActivation(); + } + } + void setDistance(const double distance) { distance_ = distance; } + void syncActivation() { setActivation(isSafe()); } +}; + +class SceneModuleManagerInterfaceWithRTC +: public SceneModuleManagerInterface +{ +public: + SceneModuleManagerInterfaceWithRTC( + rclcpp::Node & node, const char * module_name, const bool enable_rtc = true); + + void plan(tier4_planning_msgs::msg::PathWithLaneId * path) override; + +protected: + RTCInterface rtc_interface_; + std::unordered_map map_uuid_; + + ObjectsOfInterestMarkerInterface objects_of_interest_marker_interface_; + + virtual void sendRTC(const Time & stamp); + + virtual void setActivation(); + + void updateRTCStatus( + const UUID & uuid, const bool safe, const uint8_t state, const double distance, + const Time & stamp) + { + rtc_interface_.updateCooperateStatus(uuid, safe, state, distance, distance, stamp); + } + + void removeRTCStatus(const UUID & uuid) { rtc_interface_.removeCooperateStatus(uuid); } + + void publishRTCStatus(const Time & stamp) + { + rtc_interface_.removeExpiredCooperateStatus(); + rtc_interface_.publishCooperateStatus(stamp); + } + + UUID getUUID(const int64_t & module_id) const; + + void generateUUID(const int64_t & module_id); + + void removeUUID(const int64_t & module_id); + + void publishObjectsOfInterestMarker(); + + void deleteExpiredModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; + + static bool getEnableRTC(rclcpp::Node & node, const std::string & param_name) + { + bool enable_rtc = true; + + try { + enable_rtc = getOrDeclareParameter(node, "enable_all_modules_auto_mode") + ? false + : getOrDeclareParameter(node, param_name); + } catch (const std::exception & e) { + enable_rtc = getOrDeclareParameter(node, param_name); + } + + return enable_rtc; + } +}; + +extern template size_t +SceneModuleManagerInterface::findEgoSegmentIndex( + const std::vector & points) const; +extern template void +SceneModuleManagerInterface::updateSceneModuleInstances( + const std::shared_ptr & planner_data, + const tier4_planning_msgs::msg::PathWithLaneId & path); +extern template void SceneModuleManagerInterface::modifyPathVelocity( + tier4_planning_msgs::msg::PathWithLaneId * path); +extern template void SceneModuleManagerInterface::registerModule( + const std::shared_ptr & scene_module); +} // namespace autoware::behavior_velocity_planner + +#endif // AUTOWARE__BEHAVIOR_VELOCITY_RTC_INTERFACE__SCENE_MODULE_INTERFACE_WITH_RTC_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/package.xml new file mode 100644 index 0000000000000..88b252106a90a --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/package.xml @@ -0,0 +1,38 @@ + + + + autoware_behavior_velocity_rtc_interface + 0.40.0 + The autoware_behavior_velocity_rtc_interface package + + Mamoru Sobue + Takayuki Murooka + Tomoya Kimura + Shumpei Wakabayashi + Takagi, Isamu + Fumiya Watanabe + + Apache License 2.0 + + Takayuki Murooka + + ament_cmake_auto + autoware_cmake + + autoware_behavior_velocity_planner_common + autoware_motion_utils + autoware_planning_msgs + autoware_rtc_interface + autoware_universe_utils + rclcpp + rclcpp_components + tier4_planning_msgs + + ament_cmake_ros + ament_lint_auto + autoware_lint_common + + + ament_cmake + + diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp new file mode 100644 index 0000000000000..abac509fd2b2b --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp @@ -0,0 +1,140 @@ +// 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. + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ + +SceneModuleInterfaceWithRTC::SceneModuleInterfaceWithRTC( + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock) +: SceneModuleInterface(module_id, logger, clock), + activated_(false), + safe_(false), + distance_(std::numeric_limits::lowest()) +{ +} + +SceneModuleManagerInterfaceWithRTC::SceneModuleManagerInterfaceWithRTC( + rclcpp::Node & node, const char * module_name, const bool enable_rtc) +: SceneModuleManagerInterface(node, module_name), + rtc_interface_(&node, module_name, enable_rtc), + objects_of_interest_marker_interface_(&node, module_name) +{ +} + +void SceneModuleManagerInterfaceWithRTC::plan(tier4_planning_msgs::msg::PathWithLaneId * path) +{ + setActivation(); + modifyPathVelocity(path); + sendRTC(path->header.stamp); + publishObjectsOfInterestMarker(); +} + +void SceneModuleManagerInterfaceWithRTC::sendRTC(const Time & stamp) +{ + for (const auto & scene_module : scene_modules_) { + const UUID uuid = getUUID(scene_module->getModuleId()); + const auto state = !scene_module->isActivated() && scene_module->isSafe() + ? State::WAITING_FOR_EXECUTION + : State::RUNNING; + updateRTCStatus(uuid, scene_module->isSafe(), state, scene_module->getDistance(), stamp); + } + publishRTCStatus(stamp); +} + +void SceneModuleManagerInterfaceWithRTC::setActivation() +{ + for (const auto & scene_module : scene_modules_) { + const UUID uuid = getUUID(scene_module->getModuleId()); + scene_module->setActivation(rtc_interface_.isActivated(uuid)); + scene_module->setRTCEnabled(rtc_interface_.isRTCEnabled(uuid)); + } +} + +UUID SceneModuleManagerInterfaceWithRTC::getUUID(const int64_t & module_id) const +{ + if (map_uuid_.count(module_id) == 0) { + const UUID uuid; + return uuid; + } + return map_uuid_.at(module_id); +} + +void SceneModuleManagerInterfaceWithRTC::generateUUID(const int64_t & module_id) +{ + map_uuid_.insert({module_id, autoware::universe_utils::generateUUID()}); +} + +void SceneModuleManagerInterfaceWithRTC::removeUUID(const int64_t & module_id) +{ + const auto result = map_uuid_.erase(module_id); + if (result == 0) { + RCLCPP_WARN_STREAM(logger_, "[removeUUID] module_id = " << module_id << " is not registered."); + } +} + +void SceneModuleManagerInterfaceWithRTC::publishObjectsOfInterestMarker() +{ + for (const auto & scene_module : scene_modules_) { + const auto objects = scene_module->getObjectsOfInterestData(); + for (const auto & obj : objects) { + objects_of_interest_marker_interface_.insertObjectData(obj.pose, obj.shape, obj.color); + } + scene_module->clearObjectsOfInterestData(); + } + + objects_of_interest_marker_interface_.publishMarkerArray(); +} + +void SceneModuleManagerInterfaceWithRTC::deleteExpiredModules( + const tier4_planning_msgs::msg::PathWithLaneId & path) +{ + const auto isModuleExpired = getModuleExpiredFunction(path); + + auto itr = scene_modules_.begin(); + while (itr != scene_modules_.end()) { + if (isModuleExpired(*itr)) { + const UUID uuid = getUUID((*itr)->getModuleId()); + updateRTCStatus( + uuid, (*itr)->isSafe(), State::SUCCEEDED, std::numeric_limits::lowest(), + clock_->now()); + removeUUID((*itr)->getModuleId()); + registered_module_id_set_.erase((*itr)->getModuleId()); + itr = scene_modules_.erase(itr); + } else { + itr++; + } + } +} + +template size_t SceneModuleManagerInterface::findEgoSegmentIndex( + const std::vector & points) const; +template void SceneModuleManagerInterface::updateSceneModuleInstances( + const std::shared_ptr & planner_data, + const tier4_planning_msgs::msg::PathWithLaneId & path); +template void SceneModuleManagerInterface::modifyPathVelocity( + tier4_planning_msgs::msg::PathWithLaneId * path); +template void SceneModuleManagerInterface::registerModule( + const std::shared_ptr & scene_module); +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.hpp index 131ba32f32100..068ed81015fb1 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.hpp @@ -25,7 +25,7 @@ namespace autoware::behavior_velocity_planner { -class RunOutModuleManager : public SceneModuleManagerInterface +class RunOutModuleManager : public SceneModuleManagerInterface<> { public: explicit RunOutModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.hpp index 950bb8471cc22..f98db8b88b7a9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.hpp @@ -29,7 +29,7 @@ namespace autoware::behavior_velocity_planner { -class SpeedBumpModuleManager : public SceneModuleManagerInterface +class SpeedBumpModuleManager : public SceneModuleManagerInterface<> { public: explicit SpeedBumpModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.hpp index bef8a5eef4ac0..c746e2bf6a314 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.hpp @@ -33,7 +33,7 @@ namespace autoware::behavior_velocity_planner { using StopLineWithLaneId = std::pair; -class StopLineModuleManager : public SceneModuleManagerInterface +class StopLineModuleManager : public SceneModuleManagerInterface<> { public: explicit StopLineModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.hpp index a7a0d83be6368..c5b9293fcdcc5 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.hpp @@ -38,7 +38,7 @@ namespace autoware::behavior_velocity_planner * @param node A reference to the ROS node. */ class TemplateModuleManager -: public autoware::behavior_velocity_planner::SceneModuleManagerInterface +: public autoware::behavior_velocity_planner::SceneModuleManagerInterface<> { public: explicit TemplateModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml index 082973d9431e5..ebc45d372f92d 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml @@ -20,6 +20,7 @@ autoware_adapi_v1_msgs autoware_behavior_velocity_planner_common + autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension autoware_motion_utils autoware_perception_msgs diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp index b6747724ba6f7..1b66824d04623 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp @@ -123,7 +123,7 @@ void TrafficLightModuleManager::launchNewModules( } } -std::function &)> +std::function &)> TrafficLightModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { @@ -131,7 +131,7 @@ TrafficLightModuleManager::getModuleExpiredFunction( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); return [this, lanelet_id_set]( - [[maybe_unused]] const std::shared_ptr & scene_module) { + [[maybe_unused]] const std::shared_ptr & scene_module) { for (const auto & id : lanelet_id_set) { if (isModuleRegisteredFromExistingAssociatedModule(id)) { return false; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.hpp index eb8ef53ddb604..5ac32d1107880 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -42,8 +42,8 @@ class TrafficLightModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( - const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> + getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; void modifyPathVelocity(tier4_planning_msgs::msg::PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp index 5eb0d5aa5f267..458d8e1588a5b 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp @@ -44,7 +44,7 @@ TrafficLightModule::TrafficLightModule( const int64_t lane_id, const lanelet::TrafficLight & traffic_light_reg_elem, lanelet::ConstLanelet lane, const PlannerParam & planner_param, const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(lane_id, logger, clock), +: SceneModuleInterfaceWithRTC(lane_id, logger, clock), lane_id_(lane_id), traffic_light_reg_elem_(traffic_light_reg_elem), lane_(lane), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp index 8221bb3740273..3af13bc1927ce 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp @@ -23,8 +23,8 @@ #define EIGEN_MPL2_ONLY #include #include -#include #include +#include #include #include @@ -33,7 +33,7 @@ namespace autoware::behavior_velocity_planner { -class TrafficLightModule : public SceneModuleInterface +class TrafficLightModule : public SceneModuleInterfaceWithRTC { public: using TrafficSignal = autoware_perception_msgs::msg::TrafficLightGroup; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp index ba5a4b23a6fe0..8e0abc98c90de 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp @@ -29,7 +29,7 @@ namespace autoware::behavior_velocity_planner { -class VirtualTrafficLightModuleManager : public SceneModuleManagerInterface +class VirtualTrafficLightModuleManager : public SceneModuleManagerInterface<> { public: explicit VirtualTrafficLightModuleManager(rclcpp::Node & node); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.hpp index 85d4495914823..b323d6d201795 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.hpp @@ -35,7 +35,7 @@ namespace autoware::behavior_velocity_planner { using tier4_planning_msgs::msg::PathWithLaneId; -class WalkwayModuleManager : public SceneModuleManagerInterface +class WalkwayModuleManager : public SceneModuleManagerInterface<> { public: explicit WalkwayModuleManager(rclcpp::Node & node); From a313653f7b14a40dd0c938b96ea68f9ee1e2fe48 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Fri, 27 Dec 2024 10:22:15 +0900 Subject: [PATCH 007/127] feat(build_depends.repos): update version of autoware_internal_msgs (#9806) Signed-off-by: Takayuki Murooka --- build_depends.repos | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_depends.repos b/build_depends.repos index 7e547be7409cf..2313a9be487a6 100644 --- a/build_depends.repos +++ b/build_depends.repos @@ -32,7 +32,7 @@ repositories: core/autoware_internal_msgs: type: git url: https://github.com/autowarefoundation/autoware_internal_msgs.git - version: 1.2.0 + version: 1.3.0 # universe universe/external/tier4_autoware_msgs: type: git From 4d1f69d793449c349d6a7befc79120ea6a9f8efa Mon Sep 17 00:00:00 2001 From: kminoda <44218668+kminoda@users.noreply.github.com> Date: Fri, 27 Dec 2024 11:23:07 +0900 Subject: [PATCH 008/127] refactor(autoware_universe_utils): add missing 's' in the class of diagnostics_interface (#9777) Signed-off-by: kminoda --- .../universe_utils/ros/diagnostics_interface.hpp | 6 +++--- .../src/ros/diagnostics_interface.cpp | 16 ++++++++-------- .../test/src/ros/test_diagnostics_interface.cpp | 16 ++++++++-------- .../src/gyro_odometer_core.cpp | 2 +- .../src/gyro_odometer_core.hpp | 2 +- .../src/lidar_marker_localizer.cpp | 2 +- .../src/lidar_marker_localizer.hpp | 2 +- .../src/localization_error_monitor.cpp | 2 +- .../src/localization_error_monitor.hpp | 2 +- .../ndt_scan_matcher/map_update_module.hpp | 10 +++++----- .../ndt_scan_matcher/ndt_scan_matcher_core.hpp | 12 ++++++------ .../src/map_update_module.cpp | 8 ++++---- .../src/ndt_scan_matcher_core.cpp | 14 +++++++------- .../src/pose_initializer_core.cpp | 2 +- .../src/pose_initializer_core.hpp | 2 +- 15 files changed, 49 insertions(+), 49 deletions(-) diff --git a/common/autoware_universe_utils/include/autoware/universe_utils/ros/diagnostics_interface.hpp b/common/autoware_universe_utils/include/autoware/universe_utils/ros/diagnostics_interface.hpp index 120aed7c7548e..db370eb46ef43 100644 --- a/common/autoware_universe_utils/include/autoware/universe_utils/ros/diagnostics_interface.hpp +++ b/common/autoware_universe_utils/include/autoware/universe_utils/ros/diagnostics_interface.hpp @@ -24,10 +24,10 @@ namespace autoware::universe_utils { -class DiagnosticInterface +class DiagnosticsInterface { public: - DiagnosticInterface(rclcpp::Node * node, const std::string & diagnostic_name); + DiagnosticsInterface(rclcpp::Node * node, const std::string & diagnostic_name); void clear(); void add_key_value(const diagnostic_msgs::msg::KeyValue & key_value_msg); template @@ -48,7 +48,7 @@ class DiagnosticInterface }; template -void DiagnosticInterface::add_key_value(const std::string & key, const T & value) +void DiagnosticsInterface::add_key_value(const std::string & key, const T & value) { diagnostic_msgs::msg::KeyValue key_value; key_value.key = key; diff --git a/common/autoware_universe_utils/src/ros/diagnostics_interface.cpp b/common/autoware_universe_utils/src/ros/diagnostics_interface.cpp index 978af27f202d4..e4d1ec8494113 100644 --- a/common/autoware_universe_utils/src/ros/diagnostics_interface.cpp +++ b/common/autoware_universe_utils/src/ros/diagnostics_interface.cpp @@ -23,7 +23,7 @@ namespace autoware::universe_utils { -DiagnosticInterface::DiagnosticInterface(rclcpp::Node * node, const std::string & diagnostic_name) +DiagnosticsInterface::DiagnosticsInterface(rclcpp::Node * node, const std::string & diagnostic_name) : clock_(node->get_clock()) { diagnostics_pub_ = @@ -34,7 +34,7 @@ DiagnosticInterface::DiagnosticInterface(rclcpp::Node * node, const std::string diagnostics_status_msg_.hardware_id = node->get_name(); } -void DiagnosticInterface::clear() +void DiagnosticsInterface::clear() { diagnostics_status_msg_.values.clear(); diagnostics_status_msg_.values.shrink_to_fit(); @@ -43,7 +43,7 @@ void DiagnosticInterface::clear() diagnostics_status_msg_.message = ""; } -void DiagnosticInterface::add_key_value(const diagnostic_msgs::msg::KeyValue & key_value_msg) +void DiagnosticsInterface::add_key_value(const diagnostic_msgs::msg::KeyValue & key_value_msg) { auto it = std::find_if( std::begin(diagnostics_status_msg_.values), std::end(diagnostics_status_msg_.values), @@ -56,7 +56,7 @@ void DiagnosticInterface::add_key_value(const diagnostic_msgs::msg::KeyValue & k } } -void DiagnosticInterface::add_key_value(const std::string & key, const std::string & value) +void DiagnosticsInterface::add_key_value(const std::string & key, const std::string & value) { diagnostic_msgs::msg::KeyValue key_value; key_value.key = key; @@ -64,7 +64,7 @@ void DiagnosticInterface::add_key_value(const std::string & key, const std::stri add_key_value(key_value); } -void DiagnosticInterface::add_key_value(const std::string & key, bool value) +void DiagnosticsInterface::add_key_value(const std::string & key, bool value) { diagnostic_msgs::msg::KeyValue key_value; key_value.key = key; @@ -72,7 +72,7 @@ void DiagnosticInterface::add_key_value(const std::string & key, bool value) add_key_value(key_value); } -void DiagnosticInterface::update_level_and_message(const int8_t level, const std::string & message) +void DiagnosticsInterface::update_level_and_message(const int8_t level, const std::string & message) { if ((level > diagnostic_msgs::msg::DiagnosticStatus::OK)) { if (!diagnostics_status_msg_.message.empty()) { @@ -85,12 +85,12 @@ void DiagnosticInterface::update_level_and_message(const int8_t level, const std } } -void DiagnosticInterface::publish(const rclcpp::Time & publish_time_stamp) +void DiagnosticsInterface::publish(const rclcpp::Time & publish_time_stamp) { diagnostics_pub_->publish(create_diagnostics_array(publish_time_stamp)); } -diagnostic_msgs::msg::DiagnosticArray DiagnosticInterface::create_diagnostics_array( +diagnostic_msgs::msg::DiagnosticArray DiagnosticsInterface::create_diagnostics_array( const rclcpp::Time & publish_time_stamp) const { diagnostic_msgs::msg::DiagnosticArray diagnostics_msg; diff --git a/common/autoware_universe_utils/test/src/ros/test_diagnostics_interface.cpp b/common/autoware_universe_utils/test/src/ros/test_diagnostics_interface.cpp index a0683694cc2b7..6ec4fccf78b43 100644 --- a/common/autoware_universe_utils/test/src/ros/test_diagnostics_interface.cpp +++ b/common/autoware_universe_utils/test/src/ros/test_diagnostics_interface.cpp @@ -25,9 +25,9 @@ #include #include -using autoware::universe_utils::DiagnosticInterface; +using autoware::universe_utils::DiagnosticsInterface; -class TestDiagnosticInterface : public ::testing::Test +class TestDiagnosticsInterface : public ::testing::Test { protected: void SetUp() override @@ -44,9 +44,9 @@ class TestDiagnosticInterface : public ::testing::Test * Test clear(): * Verify that calling clear() resets DiagnosticStatus values, level, and message. */ -TEST_F(TestDiagnosticInterface, ClearTest) +TEST_F(TestDiagnosticsInterface, ClearTest) { - DiagnosticInterface module(node_.get(), "test_diagnostic"); + DiagnosticsInterface module(node_.get(), "test_diagnostic"); // Add some key-value pairs and update level/message module.add_key_value("param1", 42); @@ -87,9 +87,9 @@ TEST_F(TestDiagnosticInterface, ClearTest) * Test add_key_value(): * Verify that adding the same key updates its value instead of adding a duplicate. */ -TEST_F(TestDiagnosticInterface, AddKeyValueTest) +TEST_F(TestDiagnosticsInterface, AddKeyValueTest) { - DiagnosticInterface module(node_.get(), "test_diagnostic"); + DiagnosticsInterface module(node_.get(), "test_diagnostic"); // Call the template version of add_key_value() with different types module.add_key_value("string_key", std::string("initial_value")); @@ -139,9 +139,9 @@ TEST_F(TestDiagnosticInterface, AddKeyValueTest) * Verify that the level is updated to the highest severity and * that messages are concatenated if level > OK. */ -TEST_F(TestDiagnosticInterface, UpdateLevelAndMessageTest) +TEST_F(TestDiagnosticsInterface, UpdateLevelAndMessageTest) { - DiagnosticInterface module(node_.get(), "test_diagnostic"); + DiagnosticsInterface module(node_.get(), "test_diagnostic"); // Initial status is level=OK(0), message="" module.update_level_and_message(diagnostic_msgs::msg::DiagnosticStatus::OK, "Initial OK"); diff --git a/localization/autoware_gyro_odometer/src/gyro_odometer_core.cpp b/localization/autoware_gyro_odometer/src/gyro_odometer_core.cpp index d52fb5e798b58..0a85f75b74ad7 100644 --- a/localization/autoware_gyro_odometer/src/gyro_odometer_core.cpp +++ b/localization/autoware_gyro_odometer/src/gyro_odometer_core.cpp @@ -73,7 +73,7 @@ GyroOdometerNode::GyroOdometerNode(const rclcpp::NodeOptions & node_options) "twist_with_covariance", rclcpp::QoS{10}); diagnostics_ = - std::make_unique(this, "gyro_odometer_status"); + std::make_unique(this, "gyro_odometer_status"); // TODO(YamatoAndo) createTimer } diff --git a/localization/autoware_gyro_odometer/src/gyro_odometer_core.hpp b/localization/autoware_gyro_odometer/src/gyro_odometer_core.hpp index 70334738e9ce3..b59e6af341ec2 100644 --- a/localization/autoware_gyro_odometer/src/gyro_odometer_core.hpp +++ b/localization/autoware_gyro_odometer/src/gyro_odometer_core.hpp @@ -80,7 +80,7 @@ class GyroOdometerNode : public rclcpp::Node std::deque vehicle_twist_queue_; std::deque gyro_queue_; - std::unique_ptr diagnostics_; + std::unique_ptr diagnostics_; }; } // namespace autoware::gyro_odometer diff --git a/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.cpp b/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.cpp index bc7dbbcfc9ca1..34fc61797231b 100644 --- a/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.cpp +++ b/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.cpp @@ -125,7 +125,7 @@ LidarMarkerLocalizer::LidarMarkerLocalizer(const rclcpp::NodeOptions & node_opti tf_listener_ = std::make_shared(*tf_buffer_, this, false); diagnostics_interface_.reset( - new autoware::universe_utils::DiagnosticInterface(this, "marker_detection_status")); + new autoware::universe_utils::DiagnosticsInterface(this, "marker_detection_status")); } void LidarMarkerLocalizer::initialize_diagnostics() diff --git a/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.hpp b/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.hpp index 1b5672cff9d04..22a0c3f642563 100644 --- a/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.hpp +++ b/localization/autoware_landmark_based_localizer/autoware_lidar_marker_localizer/src/lidar_marker_localizer.hpp @@ -134,7 +134,7 @@ class LidarMarkerLocalizer : public rclcpp::Node rclcpp::Publisher::SharedPtr pub_debug_pose_with_covariance_; rclcpp::Publisher::SharedPtr pub_marker_pointcloud_; - std::shared_ptr diagnostics_interface_; + std::shared_ptr diagnostics_interface_; Param param_; bool is_activated_; diff --git a/localization/autoware_localization_error_monitor/src/localization_error_monitor.cpp b/localization/autoware_localization_error_monitor/src/localization_error_monitor.cpp index 5ebcd105d57ba..1f26f6b80aa17 100644 --- a/localization/autoware_localization_error_monitor/src/localization_error_monitor.cpp +++ b/localization/autoware_localization_error_monitor/src/localization_error_monitor.cpp @@ -59,7 +59,7 @@ LocalizationErrorMonitor::LocalizationErrorMonitor(const rclcpp::NodeOptions & o logger_configure_ = std::make_unique(this); diagnostics_error_monitor_ = - std::make_unique(this, "ellipse_error_status"); + std::make_unique(this, "ellipse_error_status"); } void LocalizationErrorMonitor::on_odom(nav_msgs::msg::Odometry::ConstSharedPtr input_msg) diff --git a/localization/autoware_localization_error_monitor/src/localization_error_monitor.hpp b/localization/autoware_localization_error_monitor/src/localization_error_monitor.hpp index b38958c420b19..b7d2454eb9f75 100644 --- a/localization/autoware_localization_error_monitor/src/localization_error_monitor.hpp +++ b/localization/autoware_localization_error_monitor/src/localization_error_monitor.hpp @@ -39,7 +39,7 @@ class LocalizationErrorMonitor : public rclcpp::Node std::unique_ptr logger_configure_; - std::unique_ptr diagnostics_error_monitor_; + std::unique_ptr diagnostics_error_monitor_; double scale_; double error_ellipse_size_; diff --git a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/map_update_module.hpp b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/map_update_module.hpp index bf8fce2b302c0..12990259f88cd 100644 --- a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/map_update_module.hpp +++ b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/map_update_module.hpp @@ -42,7 +42,7 @@ namespace autoware::ndt_scan_matcher { -using DiagnosticInterface = autoware::universe_utils::DiagnosticInterface; +using DiagnosticsInterface = autoware::universe_utils::DiagnosticsInterface; class MapUpdateModule { @@ -63,19 +63,19 @@ class MapUpdateModule void callback_timer( const bool is_activated, const std::optional & position, - std::unique_ptr & diagnostics_ptr); + std::unique_ptr & diagnostics_ptr); [[nodiscard]] bool should_update_map( const geometry_msgs::msg::Point & position, - std::unique_ptr & diagnostics_ptr); + std::unique_ptr & diagnostics_ptr); void update_map( const geometry_msgs::msg::Point & position, - std::unique_ptr & diagnostics_ptr); + std::unique_ptr & diagnostics_ptr); // Update the specified NDT bool update_ndt( const geometry_msgs::msg::Point & position, NdtType & ndt, - std::unique_ptr & diagnostics_ptr); + std::unique_ptr & diagnostics_ptr); void publish_partial_pcd_map(); rclcpp::Publisher::SharedPtr loaded_pcd_pub_; diff --git a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp index 25b7417ffbe3c..e083e6751c3db 100644 --- a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp +++ b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp @@ -211,12 +211,12 @@ class NDTScanMatcher : public rclcpp::Node std::unique_ptr regularization_pose_buffer_; std::atomic is_activated_; - std::unique_ptr diagnostics_scan_points_; - std::unique_ptr diagnostics_initial_pose_; - std::unique_ptr diagnostics_regularization_pose_; - std::unique_ptr diagnostics_map_update_; - std::unique_ptr diagnostics_ndt_align_; - std::unique_ptr diagnostics_trigger_node_; + std::unique_ptr diagnostics_scan_points_; + std::unique_ptr diagnostics_initial_pose_; + std::unique_ptr diagnostics_regularization_pose_; + std::unique_ptr diagnostics_map_update_; + std::unique_ptr diagnostics_ndt_align_; + std::unique_ptr diagnostics_trigger_node_; std::unique_ptr map_update_module_; std::unique_ptr logger_configure_; diff --git a/localization/autoware_ndt_scan_matcher/src/map_update_module.cpp b/localization/autoware_ndt_scan_matcher/src/map_update_module.cpp index eea0b8f3d06c4..299d596401b19 100644 --- a/localization/autoware_ndt_scan_matcher/src/map_update_module.cpp +++ b/localization/autoware_ndt_scan_matcher/src/map_update_module.cpp @@ -56,7 +56,7 @@ MapUpdateModule::MapUpdateModule( void MapUpdateModule::callback_timer( const bool is_activated, const std::optional & position, - std::unique_ptr & diagnostics_ptr) + std::unique_ptr & diagnostics_ptr) { // check is_activated diagnostics_ptr->add_key_value("is_activated", is_activated); @@ -87,7 +87,7 @@ void MapUpdateModule::callback_timer( bool MapUpdateModule::should_update_map( const geometry_msgs::msg::Point & position, - std::unique_ptr & diagnostics_ptr) + std::unique_ptr & diagnostics_ptr) { last_update_position_mtx_.lock(); @@ -143,7 +143,7 @@ bool MapUpdateModule::out_of_map_range(const geometry_msgs::msg::Point & positio void MapUpdateModule::update_map( const geometry_msgs::msg::Point & position, - std::unique_ptr & diagnostics_ptr) + std::unique_ptr & diagnostics_ptr) { diagnostics_ptr->add_key_value("is_need_rebuild", need_rebuild_); @@ -231,7 +231,7 @@ void MapUpdateModule::update_map( bool MapUpdateModule::update_ndt( const geometry_msgs::msg::Point & position, NdtType & ndt, - std::unique_ptr & diagnostics_ptr) + std::unique_ptr & diagnostics_ptr) { diagnostics_ptr->add_key_value("maps_size_before", ndt.getCurrentMapIDs().size()); diff --git a/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp b/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp index cef8724423bed..d3e1fa5982867 100644 --- a/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp +++ b/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp @@ -51,7 +51,7 @@ using autoware::localization_util::pose_to_matrix4f; using autoware::localization_util::SmartPoseBuffer; using autoware::localization_util::TreeStructuredParzenEstimator; -using autoware::universe_utils::DiagnosticInterface; +using autoware::universe_utils::DiagnosticsInterface; tier4_debug_msgs::msg::Float32Stamped make_float32_stamped( const builtin_interfaces::msg::Time & stamp, const float data) @@ -141,7 +141,7 @@ NDTScanMatcher::NDTScanMatcher(const rclcpp::NodeOptions & options) std::make_unique(this->get_logger(), value_as_unlimited, value_as_unlimited); diagnostics_regularization_pose_ = - std::make_unique(this, "regularization_pose_subscriber_status"); + std::make_unique(this, "regularization_pose_subscriber_status"); } sensor_aligned_pose_pub_ = @@ -209,13 +209,13 @@ NDTScanMatcher::NDTScanMatcher(const rclcpp::NodeOptions & options) map_update_module_ = std::make_unique(this, &ndt_ptr_mtx_, ndt_ptr_, param_.dynamic_map_loading); - diagnostics_scan_points_ = std::make_unique(this, "scan_matching_status"); + diagnostics_scan_points_ = std::make_unique(this, "scan_matching_status"); diagnostics_initial_pose_ = - std::make_unique(this, "initial_pose_subscriber_status"); - diagnostics_map_update_ = std::make_unique(this, "map_update_status"); - diagnostics_ndt_align_ = std::make_unique(this, "ndt_align_service_status"); + std::make_unique(this, "initial_pose_subscriber_status"); + diagnostics_map_update_ = std::make_unique(this, "map_update_status"); + diagnostics_ndt_align_ = std::make_unique(this, "ndt_align_service_status"); diagnostics_trigger_node_ = - std::make_unique(this, "trigger_node_service_status"); + std::make_unique(this, "trigger_node_service_status"); logger_configure_ = std::make_unique(this); } diff --git a/localization/autoware_pose_initializer/src/pose_initializer_core.cpp b/localization/autoware_pose_initializer/src/pose_initializer_core.cpp index 67d5c447c09b6..5bde25a564f1d 100644 --- a/localization/autoware_pose_initializer/src/pose_initializer_core.cpp +++ b/localization/autoware_pose_initializer/src/pose_initializer_core.cpp @@ -40,7 +40,7 @@ PoseInitializer::PoseInitializer(const rclcpp::NodeOptions & options) output_pose_covariance_ = get_covariance_parameter(this, "output_pose_covariance"); gnss_particle_covariance_ = get_covariance_parameter(this, "gnss_particle_covariance"); - diagnostics_pose_reliable_ = std::make_unique( + diagnostics_pose_reliable_ = std::make_unique( this, "pose_initializer_status"); if (declare_parameter("ekf_enabled")) { diff --git a/localization/autoware_pose_initializer/src/pose_initializer_core.hpp b/localization/autoware_pose_initializer/src/pose_initializer_core.hpp index 5305bcc3ad347..a0c1ed3a86576 100644 --- a/localization/autoware_pose_initializer/src/pose_initializer_core.hpp +++ b/localization/autoware_pose_initializer/src/pose_initializer_core.hpp @@ -60,7 +60,7 @@ class PoseInitializer : public rclcpp::Node std::unique_ptr ekf_localization_trigger_; std::unique_ptr ndt_localization_trigger_; std::unique_ptr logger_configure_; - std::unique_ptr diagnostics_pose_reliable_; + std::unique_ptr diagnostics_pose_reliable_; double stop_check_duration_; void change_node_trigger(bool flag, bool need_spin = false); From 8048b9ef8eb4efa1a6db0351ae6be7acdcc1e3ef Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:03:00 +0900 Subject: [PATCH 009/127] fix(autoware_static_centerline_generator): fix bugprone-exception-escape (#9805) fix:bugprone-error Signed-off-by: kobayu858 --- .../src/main.cpp | 62 +++++++++++-------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/planning/autoware_static_centerline_generator/src/main.cpp b/planning/autoware_static_centerline_generator/src/main.cpp index 811d57c6036ef..71a076ee86fe0 100644 --- a/planning/autoware_static_centerline_generator/src/main.cpp +++ b/planning/autoware_static_centerline_generator/src/main.cpp @@ -14,38 +14,46 @@ #include "static_centerline_generator_node.hpp" +#include #include #include int main(int argc, char * argv[]) { - rclcpp::init(argc, argv); - - // initialize node - rclcpp::NodeOptions node_options; - auto node = - std::make_shared( - node_options); - - // get ros parameter - const auto mode = node->declare_parameter("mode"); - - // process - if (mode == "AUTO") { - node->generate_centerline(); - node->validate(); - node->save_map(); - } else if (mode == "GUI") { - node->generate_centerline(); - } else if (mode == "VMB") { - // Do nothing - } else { - throw std::invalid_argument("The `mode` is invalid."); + try { + rclcpp::init(argc, argv); + + // initialize node + rclcpp::NodeOptions node_options; + auto node = + std::make_shared( + node_options); + + // get ros parameter + const auto mode = node->declare_parameter("mode"); + + // process + if (mode == "AUTO") { + node->generate_centerline(); + node->validate(); + node->save_map(); + } else if (mode == "GUI") { + node->generate_centerline(); + } else if (mode == "VMB") { + // Do nothing + } else { + throw std::invalid_argument("The `mode` is invalid."); + } + + // NOTE: spin node to keep showing debug path/trajectory in rviz with transient local + rclcpp::spin(node); + rclcpp::shutdown(); + } catch (const std::exception & e) { + std::cerr << "Exception in main(): " << e.what() << std::endl; + return {}; + } catch (...) { + std::cerr << "Unknown exception in main()" << std::endl; + return {}; } - - // NOTE: spin node to keep showing debug path/trajectory in rviz with transient local - rclcpp::spin(node); - rclcpp::shutdown(); - return 0; } From 7e3a80c0987c507b789148d3df1073798df5b65d Mon Sep 17 00:00:00 2001 From: mkquda <168697710+mkquda@users.noreply.github.com> Date: Fri, 27 Dec 2024 12:13:25 +0900 Subject: [PATCH 010/127] feat(lane_change): revise current lane objects filtering (#9785) * consider stopped front objects Signed-off-by: mohammad alqudah * simplify computation of dist to front current lane object Signed-off-by: mohammad alqudah * add flag to enable/disable keeping distance from front stopped vehicle Signed-off-by: mohammad alqudah * fix object filtering test Signed-off-by: mohammad alqudah --------- Signed-off-by: mohammad alqudah --- .../README.md | 1 + .../config/lane_change.param.yaml | 1 + .../structs/parameters.hpp | 1 + .../src/manager.cpp | 4 ++++ .../src/scene.cpp | 12 ++++------ .../src/utils/utils.cpp | 22 +++++++++---------- .../test/test_lane_change_scene.cpp | 5 ++--- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index 86d8d1c0c1413..5a6c22a731bf9 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -886,6 +886,7 @@ The following parameters are configurable in [lane_change.param.yaml](https://gi | `backward_length_buffer_for_end_of_lane` | [m] | double | The end of lane buffer to ensure ego vehicle has enough distance to start lane change | 3.0 | | `backward_length_buffer_for_blocking_object` | [m] | double | The end of lane buffer to ensure ego vehicle has enough distance to start lane change when there is an object in front | 3.0 | | `backward_length_from_intersection` | [m] | double | Distance threshold from the last intersection to invalidate or cancel the lane change path | 5.0 | +| `enable_stopped_vehicle_buffer` | [-] | bool | If true, will keep enough distance from current lane front stopped object to perform lane change when possible | true | | `trajectory.max_prepare_duration` | [s] | double | The maximum preparation time for the ego vehicle to be ready to perform lane change. | 4.0 | | `trajectory.min_prepare_duration` | [s] | double | The minimum preparation time for the ego vehicle to be ready to perform lane change. | 2.0 | | `trajectory.lateral_jerk` | [m/s3] | double | Lateral jerk value for lane change path generation | 0.5 | diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml index bf892b3058a16..61e41b4ea3ea4 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml @@ -5,6 +5,7 @@ backward_length_buffer_for_end_of_lane: 3.0 # [m] backward_length_buffer_for_blocking_object: 3.0 # [m] backward_length_from_intersection: 5.0 # [m] + enable_stopped_vehicle_buffer: true # turn signal min_length_for_turn_signal_activation: 10.0 # [m] diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp index 719bbbbf3057a..94020e8a08279 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp @@ -149,6 +149,7 @@ struct Parameters double backward_length_buffer_for_end_of_lane{0.0}; double backward_length_buffer_for_blocking_object{0.0}; double backward_length_from_intersection{5.0}; + bool enable_stopped_vehicle_buffer{false}; // parked vehicle double object_check_min_road_shoulder_width{0.5}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index 1bb41069140e7..9f7a811770b5d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -195,6 +195,8 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s getOrDeclareParameter(*node, parameter("backward_length_buffer_for_blocking_object")); p.backward_length_from_intersection = getOrDeclareParameter(*node, parameter("backward_length_from_intersection")); + p.enable_stopped_vehicle_buffer = + getOrDeclareParameter(*node, parameter("enable_stopped_vehicle_buffer")); if (p.backward_length_buffer_for_end_of_lane < 1.0) { RCLCPP_WARN_STREAM( @@ -305,6 +307,8 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectorbackward_length_buffer_for_blocking_object); updateParam( parameters, ns + "lane_change_finish_judge_buffer", p->lane_change_finish_judge_buffer); + updateParam( + parameters, ns + "enable_stopped_vehicle_buffer", p->enable_stopped_vehicle_buffer); updateParam( parameters, ns + "finish_judge_lateral_threshold", p->th_finish_judge_lateral_diff); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 7f0e6d7f575f6..e2543c602cbfa 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -515,7 +515,9 @@ void NormalLaneChange::insert_stop_point_on_current_lanes(PathWithLaneId & path) const auto dist_to_terminal_stop = std::min(dist_to_terminal_start, distance_to_last_fit_width); const auto terminal_stop_reason = status_.is_valid_path ? "no safe path" : "no valid path"; - if (filtered_objects_.current_lane.empty()) { + if ( + filtered_objects_.current_lane.empty() || + !lane_change_parameters_->enable_stopped_vehicle_buffer) { set_stop_pose(dist_to_terminal_stop, path, terminal_stop_reason); return; } @@ -948,8 +950,6 @@ FilteredLanesObjects NormalLaneChange::filter_objects() const filtered_objects.target_lane_trailing.reserve(reserve_size); filtered_objects.others.reserve(reserve_size); - const auto stopped_obj_vel_th = lane_change_parameters_->safety.th_stopped_object_velocity; - for (const auto & object : objects.objects) { auto ext_object = utils::lane_change::transform(object, *lane_change_parameters_); const auto & ext_obj_pose = ext_object.initial_pose; @@ -968,12 +968,8 @@ FilteredLanesObjects NormalLaneChange::filter_objects() const continue; } - // TODO(Azu): We have to think about how to remove is_within_vel_th without breaking AW behavior - const auto is_moving = velocity_filter( - ext_object.initial_twist, stopped_obj_vel_th, std::numeric_limits::max()); - if ( - ahead_of_ego && is_moving && is_before_terminal && + ahead_of_ego && is_before_terminal && !boost::geometry::disjoint(ext_object.initial_polygon, lanes_polygon.current)) { // check only the objects that are in front of the ego vehicle filtered_objects.current_lane.push_back(ext_object); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp index 147ef3856ac4e..9360435891632 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp @@ -920,19 +920,17 @@ double get_min_dist_to_current_lanes_obj( continue; } - // calculate distance from path front to the stationary object polygon on the ego lane. - for (const auto & polygon_p : object.initial_polygon.outer()) { - const auto p_fp = autoware::universe_utils::toMsg(polygon_p.to_3d()); - const auto lateral_fp = motion_utils::calcLateralOffset(path_points, p_fp); - - // ignore if the point is not on ego path - if (std::abs(lateral_fp) > (common_data_ptr->bpp_param_ptr->vehicle_width / 2)) { - continue; - } - - const auto current_distance_to_obj = motion_utils::calcSignedArcLength(path_points, 0, p_fp); - min_dist_to_obj = std::min(min_dist_to_obj, current_distance_to_obj); + // check if object is on ego path + const auto obj_half_width = object.shape.dimensions.y / 2; + const auto obj_lat_dist_to_path = + std::abs(motion_utils::calcLateralOffset(path_points, object.initial_pose.position)) - + obj_half_width; + if (obj_lat_dist_to_path > (common_data_ptr->bpp_param_ptr->vehicle_width / 2)) { + continue; } + + min_dist_to_obj = std::min(min_dist_to_obj, dist_to_obj); + break; } return min_dist_to_obj; } diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/test/test_lane_change_scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/test/test_lane_change_scene.cpp index 114a38a77876c..5fb445788672c 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/test/test_lane_change_scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/test/test_lane_change_scene.cpp @@ -242,15 +242,14 @@ TEST_F(TestNormalLaneChange, testFilteredObjects) const auto & filtered_objects = get_filtered_objects(); - // Note: There's 1 stopping object in current lanes, however, it was filtered out. const auto filtered_size = filtered_objects.current_lane.size() + filtered_objects.target_lane_leading.size() + filtered_objects.target_lane_trailing.size() + filtered_objects.others.size(); EXPECT_EQ(filtered_size, planner_data_->dynamic_object->objects.size()); - EXPECT_EQ(filtered_objects.current_lane.size(), 0); + EXPECT_EQ(filtered_objects.current_lane.size(), 1); EXPECT_EQ(filtered_objects.target_lane_leading.size(), 2); EXPECT_EQ(filtered_objects.target_lane_trailing.size(), 0); - EXPECT_EQ(filtered_objects.others.size(), 2); + EXPECT_EQ(filtered_objects.others.size(), 1); } TEST_F(TestNormalLaneChange, testGetPathWhenValid) From f211728650c8abcf757fb8088c9b824780b736b6 Mon Sep 17 00:00:00 2001 From: mkquda <168697710+mkquda@users.noreply.github.com> Date: Fri, 27 Dec 2024 15:38:11 +0900 Subject: [PATCH 011/127] feat(lane_change): add text display for candidate path sampling metrics (#9810) * display candidate path sampling metrics on rviz Signed-off-by: mohammad alqudah * rename struct Signed-off-by: mohammad alqudah --------- Signed-off-by: mohammad alqudah --- .../structs/debug.hpp | 12 ++++++ .../src/scene.cpp | 8 +++- .../src/utils/markers.cpp | 42 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp index 8738b412e18b9..90b13f86976b2 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp @@ -25,10 +25,20 @@ #include #include +#include namespace autoware::behavior_path_planner::lane_change { using utils::path_safety_checker::CollisionCheckDebugMap; + +struct MetricsDebug +{ + LaneChangePhaseMetrics prep_metric; + std::vector lc_metrics; + double max_prepare_length; + double max_lane_changing_length; +}; + struct Debug { std::string module_type; @@ -41,6 +51,7 @@ struct Debug lanelet::ConstLanelets current_lanes; lanelet::ConstLanelets target_lanes; lanelet::ConstLanelets target_backward_lanes; + std::vector lane_change_metrics; double collision_check_object_debug_lifetime{0.0}; double distance_to_end_of_current_lane{std::numeric_limits::max()}; double distance_to_lane_change_finished{std::numeric_limits::max()}; @@ -64,6 +75,7 @@ struct Debug current_lanes.clear(); target_lanes.clear(); target_backward_lanes.clear(); + lane_change_metrics.clear(); collision_check_object_debug_lifetime = 0.0; distance_to_end_of_current_lane = std::numeric_limits::max(); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index e2543c602cbfa..fb4f7aeca1525 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -1061,14 +1061,20 @@ std::vector NormalLaneChange::get_lane_changing_metrics( }); const auto max_path_velocity = prep_segment.points.back().point.longitudinal_velocity_mps; - return calculation::calc_shift_phase_metrics( + const auto lc_metrics = calculation::calc_shift_phase_metrics( common_data_ptr_, shift_length, prep_metric.velocity, max_path_velocity, prep_metric.sampled_lon_accel, max_lane_changing_length); + + const auto max_prep_length = common_data_ptr_->transient_data.dist_to_terminal_start; + lane_change_debug_.lane_change_metrics.push_back( + {prep_metric, lc_metrics, max_prep_length, max_lane_changing_length}); + return lc_metrics; } bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) const { lane_change_debug_.collision_check_objects.clear(); + lane_change_debug_.lane_change_metrics.clear(); if (!common_data_ptr_->is_lanes_available()) { RCLCPP_WARN(logger_, "lanes are not available. Not expected."); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp index 30af582175d14..da9ee52b038c6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp @@ -16,6 +16,7 @@ #include "autoware/behavior_path_planner_common/marker_utils/utils.hpp" #include +#include #include #include @@ -185,6 +186,46 @@ MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg return marker_array; } +MarkerArray ShowLaneChangeMetricsInfo( + const Debug & debug_data, const geometry_msgs::msg::Pose & pose) +{ + MarkerArray marker_array; + if (debug_data.lane_change_metrics.empty()) { + return marker_array; + } + + auto text_marker = createDefaultMarker( + "map", rclcpp::Clock{RCL_ROS_TIME}.now(), "sampling_metrics", 0, Marker::TEXT_VIEW_FACING, + createMarkerScale(0.6, 0.6, 0.6), colors::yellow()); + text_marker.pose = autoware::universe_utils::calcOffsetPose(pose, 10.0, 15.0, 0.0); + + text_marker.text = fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lat_accel[m/s2]") + + fmt::format("{:^18}|", "lon_accel[m/s2]") + + fmt::format("{:^17}|", "velocity[m/s]") + + fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + + fmt::format("{:^20}\n", "max_length_th[m]"); + for (const auto & metrics : debug_data.lane_change_metrics) { + text_marker.text += fmt::format("{:-<170}\n", ""); + const auto & p_m = metrics.prep_metric; + text_marker.text += + fmt::format("{:<17}", "prep_metrics:") + fmt::format("{:^10.3f}", p_m.lat_accel) + + fmt::format("{:^21.3f}", p_m.actual_lon_accel) + fmt::format("{:^12.3f}", p_m.velocity) + + fmt::format("{:^15.3f}", p_m.duration) + fmt::format("{:^15.3f}", p_m.length) + + fmt::format("{:^17.3f}\n", metrics.max_prepare_length); + text_marker.text += fmt::format("{:<20}\n", "lc_metrics:"); + for (const auto lc_m : metrics.lc_metrics) { + text_marker.text += + fmt::format("{:<15}", "") + fmt::format("{:^10.3f}", lc_m.lat_accel) + + fmt::format("{:^21.3f}", lc_m.actual_lon_accel) + fmt::format("{:^12.3f}", lc_m.velocity) + + fmt::format("{:^15.3f}", lc_m.duration) + fmt::format("{:^15.3f}", lc_m.length) + + fmt::format("{:^17.3f}\n", metrics.max_lane_changing_length); + } + } + + marker_array.markers.push_back(text_marker); + return marker_array; +} + MarkerArray createDebugMarkerArray( const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose) { @@ -212,6 +253,7 @@ MarkerArray createDebugMarkerArray( } add(showExecutionInfo(debug_data, ego_pose)); + add(ShowLaneChangeMetricsInfo(debug_data, ego_pose)); // lanes add(laneletsAsTriangleMarkerArray( From 5de2e4a3123c37390e83bd45a6e11e7755db56b8 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Fri, 27 Dec 2024 16:35:02 +0900 Subject: [PATCH 012/127] feat(behavior_velocity_detection_area): use base class without RTC (#9802) * feat(behavior_velocity_detection_area): use base class without RTC Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../config/detection_area.param.yaml | 1 - .../package.xml | 1 - .../src/manager.cpp | 16 +++++----------- .../src/manager.hpp | 8 ++++---- .../src/scene.cpp | 13 ++++--------- .../src/scene.hpp | 4 ++-- 6 files changed, 15 insertions(+), 28 deletions(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/config/detection_area.param.yaml b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/config/detection_area.param.yaml index b49b43794685c..9294795274066 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/config/detection_area.param.yaml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/config/detection_area.param.yaml @@ -8,5 +8,4 @@ state_clear_time: 2.0 hold_stop_margin_distance: 0.0 distance_to_judge_over_stop_line: 0.5 - enable_rtc: false # If set to true, the scene modules require approval from the rtc (request to cooperate) function. If set to false, the modules can be executed without requiring rtc approval suppress_pass_judge_when_stopping: false diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml index 90aaddf96feef..ff91cf40a32a6 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml @@ -18,7 +18,6 @@ eigen3_cmake_module autoware_behavior_velocity_planner_common - autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension autoware_motion_utils autoware_planning_msgs diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp index 62f5b88699a37..fb2c17d9e3745 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp @@ -34,8 +34,7 @@ using autoware::universe_utils::getOrDeclareParameter; using lanelet::autoware::DetectionArea; DetectionAreaModuleManager::DetectionAreaModuleManager(rclcpp::Node & node) -: SceneModuleManagerInterfaceWithRTC( - node, getModuleName(), getEnableRTC(node, std::string(getModuleName()) + ".enable_rtc")) +: SceneModuleManagerInterface(node, getModuleName()) { const std::string ns(DetectionAreaModuleManager::getModuleName()); planner_param_.stop_margin = getOrDeclareParameter(node, ns + ".stop_margin"); @@ -66,25 +65,20 @@ void DetectionAreaModuleManager::launchNewModules( registerModule(std::make_shared( module_id, lane_id, *detection_area_with_lane_id.first, planner_param_, logger_.get_child("detection_area_module"), clock_)); - generateUUID(module_id); - updateRTCStatus( - getUUID(module_id), true, State::WAITING_FOR_EXECUTION, - std::numeric_limits::lowest(), path.header.stamp); } } } -std::function &)> +std::function &)> DetectionAreaModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { const auto detection_area_id_set = planning_utils::getRegElemIdSetOnPath( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); - return - [detection_area_id_set](const std::shared_ptr & scene_module) { - return detection_area_id_set.count(scene_module->getModuleId()) == 0; - }; + return [detection_area_id_set](const std::shared_ptr & scene_module) { + return detection_area_id_set.count(scene_module->getModuleId()) == 0; + }; } } // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp index 1fbcc16461ebc..4b34ac4a45298 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.hpp @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -29,7 +29,7 @@ namespace autoware::behavior_velocity_planner { -class DetectionAreaModuleManager : public SceneModuleManagerInterfaceWithRTC +class DetectionAreaModuleManager : public SceneModuleManagerInterface<> { public: explicit DetectionAreaModuleManager(rclcpp::Node & node); @@ -41,8 +41,8 @@ class DetectionAreaModuleManager : public SceneModuleManagerInterfaceWithRTC void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> - getModuleExpiredFunction(const tier4_planning_msgs::msg::PathWithLaneId & path) override; + std::function &)> getModuleExpiredFunction( + const tier4_planning_msgs::msg::PathWithLaneId & path) override; }; class DetectionAreaModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp index 6d7754624485c..031c45753022e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp @@ -37,7 +37,7 @@ DetectionAreaModule::DetectionAreaModule( const lanelet::autoware::DetectionArea & detection_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(module_id, logger, clock), +: SceneModuleInterface(module_id, logger, clock), lane_id_(lane_id), detection_area_reg_elem_(detection_area_reg_elem), state_(State::GO), @@ -105,12 +105,10 @@ bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) modified_stop_line_seg_idx = current_seg_idx; } - setDistance(stop_dist); - // Check state - setSafe(detection_area::can_clear_stop_state( - last_obstacle_found_time_, clock_->now(), planner_param_.state_clear_time)); - if (isActivated()) { + const bool is_safe = detection_area::can_clear_stop_state( + last_obstacle_found_time_, clock_->now(), planner_param_.state_clear_time); + if (is_safe) { last_obstacle_found_time_ = {}; if (!planner_param_.suppress_pass_judge_when_stopping || !is_stopped) { state_ = State::GO; @@ -139,7 +137,6 @@ bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) dead_line_seg_idx); if (dist_from_ego_to_dead_line < 0.0) { RCLCPP_WARN(logger_, "[detection_area] vehicle is over dead line"); - setSafe(true); return true; } } @@ -152,7 +149,6 @@ bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) if ( state_ != State::STOP && dist_from_ego_to_stop < -planner_param_.distance_to_judge_over_stop_line) { - setSafe(true); return true; } @@ -169,7 +165,6 @@ bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) RCLCPP_WARN_THROTTLE( logger_, *clock_, std::chrono::milliseconds(1000).count(), "[detection_area] vehicle is over stop border"); - setSafe(true); return true; } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp index bdf2d05a35bcb..9224cf4624687 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp @@ -23,8 +23,8 @@ #define EIGEN_MPL2_ONLY #include +#include #include -#include #include #include @@ -38,7 +38,7 @@ using PathIndexWithPoint2d = std::pair; // front using PathIndexWithOffset = std::pair; // front index, offset using tier4_planning_msgs::msg::PathWithLaneId; -class DetectionAreaModule : public SceneModuleInterfaceWithRTC +class DetectionAreaModule : public SceneModuleInterface { public: enum class State { GO, STOP }; From eaf5ad7a82a527a51775166b0f218f3804e43abd Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Fri, 27 Dec 2024 16:46:50 +0900 Subject: [PATCH 013/127] feat(autoware_crosswalk_traffic_light_estimator): overwrite invalid detection result (#9667) * add code in order to check invalid detection Signed-off-by: MasatoSaeki * style(pre-commit): autofix --------- Signed-off-by: MasatoSaeki Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../node.hpp | 2 ++ .../src/node.cpp | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/perception/autoware_crosswalk_traffic_light_estimator/include/autoware_crosswalk_traffic_light_estimator/node.hpp b/perception/autoware_crosswalk_traffic_light_estimator/include/autoware_crosswalk_traffic_light_estimator/node.hpp index 8efb90cc87c89..085e423db38ba 100644 --- a/perception/autoware_crosswalk_traffic_light_estimator/include/autoware_crosswalk_traffic_light_estimator/node.hpp +++ b/perception/autoware_crosswalk_traffic_light_estimator/include/autoware_crosswalk_traffic_light_estimator/node.hpp @@ -97,6 +97,8 @@ class CrosswalkTrafficLightEstimatorNode : public rclcpp::Node void removeDuplicateIds(TrafficSignalArray & signal_array) const; + bool isInvalidDetectionStatus(const TrafficSignal & signal) const; + // Node param bool use_last_detect_color_; double last_detect_color_hold_time_; diff --git a/perception/autoware_crosswalk_traffic_light_estimator/src/node.cpp b/perception/autoware_crosswalk_traffic_light_estimator/src/node.cpp index b0ec4d0e5ffd0..d7cc6c725edfd 100644 --- a/perception/autoware_crosswalk_traffic_light_estimator/src/node.cpp +++ b/perception/autoware_crosswalk_traffic_light_estimator/src/node.cpp @@ -298,6 +298,14 @@ void CrosswalkTrafficLightEstimatorNode::setCrosswalkTrafficSignal( if (valid_id2idx_map.count(id)) { size_t idx = valid_id2idx_map[id]; auto signal = msg.traffic_light_groups[idx]; + if (isInvalidDetectionStatus(signal)) { + TrafficSignalElement output_traffic_signal_element; + output_traffic_signal_element.color = color; + output_traffic_signal_element.shape = TrafficSignalElement::CIRCLE; + output_traffic_signal_element.confidence = 1.0; + output.traffic_light_groups[idx].elements[0] = output_traffic_signal_element; + continue; + } updateFlashingState(signal); // check if it is flashing // update output msg according to flashing and current state output.traffic_light_groups[idx].elements[0].color = updateAndGetColorState(signal); @@ -314,6 +322,19 @@ void CrosswalkTrafficLightEstimatorNode::setCrosswalkTrafficSignal( } } +bool CrosswalkTrafficLightEstimatorNode::isInvalidDetectionStatus( + const TrafficSignal & signal) const +{ + // check occlusion, backlight(shape is unknown) and no detection(shape is circle) + if ( + signal.elements.front().color == TrafficSignalElement::UNKNOWN && + signal.elements.front().confidence == 0.0) { + return true; + } + + return false; +} + void CrosswalkTrafficLightEstimatorNode::updateFlashingState(const TrafficSignal & signal) { const auto id = signal.traffic_light_group_id; From cd06f625c980e57fc21b9cbd246513f6512dae29 Mon Sep 17 00:00:00 2001 From: "awf-autoware-bot[bot]" <94889083+awf-autoware-bot[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2024 08:01:44 +0000 Subject: [PATCH 014/127] chore: update CODEOWNERS (#9808) Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cda3c8ceaca89..5bbc4d1c6177b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -170,6 +170,7 @@ planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_m planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/** shumpei.wakabayashi@tier4.jp taiki.tanaka@tier4.jp tomoya.kimura@tier4.jp planning/behavior_velocity_planner/autoware_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/autoware_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_planner/autoware_behavior_velocity_rtc_interface/** fumiya.watanabe@tier4.jp isamu.takagi@tier4.jp mamoru.sobue@tier4.jp shumpei.wakabayashi@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp planning/behavior_velocity_planner/autoware_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_planner/autoware_behavior_velocity_speed_bump_module/** mdogru@leodrive.ai shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/** fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp tomoya.kimura@tier4.jp yukinari.hisaki.2@tier4.jp zhe.shen@tier4.jp @@ -234,6 +235,7 @@ vehicle/autoware_raw_vehicle_cmd_converter/** kosuke.takeuchi@tier4.jp kyoichi.s vehicle/autoware_steer_offset_estimator/** taiki.tanaka@tier4.jp visualization/autoware_overlay_rviz_plugin/autoware_mission_details_overlay_rviz_plugin/** ahmed.ebrahim@leodrive.ai visualization/autoware_overlay_rviz_plugin/autoware_overlay_rviz_plugin/** khalil@leodrive.ai +visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/** satoshi.ota@tier4.jp takayuki.murooka@tier4.jp visualization/autoware_perception_rviz_plugin/** opensource@apex.ai shunsuke.miura@tier4.jp taiki.tanaka@tier4.jp takeshi.miura@tier4.jp yoshi.ri@tier4.jp visualization/bag_time_manager_rviz_plugin/** taiki.tanaka@tier4.jp visualization/tier4_adapi_rviz_plugin/** hiroki.ota@tier4.jp isamu.takagi@tier4.jp kosuke.takeuchi@tier4.jp From 75fde99c78aef0ea140154b183fcae05f1639784 Mon Sep 17 00:00:00 2001 From: mkquda <168697710+mkquda@users.noreply.github.com> Date: Fri, 27 Dec 2024 17:27:23 +0900 Subject: [PATCH 015/127] feat(lane_change): implement terminal lane change feature (#9592) * implement function to compute terminal lane change path Signed-off-by: mohammad alqudah * push terminal path to candidate paths if no other valid candidate path is found Signed-off-by: mohammad alqudah * use terminal path in LC interface planWaitingApproval function Signed-off-by: mohammad alqudah * set lane changing longitudinal accel to zero for terminal lc path Signed-off-by: mohammad alqudah * rename function Signed-off-by: mohammad alqudah * chore: rename codeowners file Signed-off-by: tomoya.kimura * remove unused member variable prev_approved_path_ Signed-off-by: mohammad alqudah * refactor stop point insertion for terminal lc path Signed-off-by: mohammad alqudah * add flag to enable/disable terminal path feature Signed-off-by: mohammad alqudah * update README Signed-off-by: mohammad alqudah * add parameter to configure stop point placement Signed-off-by: mohammad alqudah * compute terminal path only when near terminal start Signed-off-by: mohammad alqudah * add option to disable feature near goal Signed-off-by: mohammad alqudah * set default flag value to false Signed-off-by: mohammad alqudah * add documentation for terminal lane change path Signed-off-by: mohammad alqudah * ensure actual prepare duration is always above minimum prepare duration threshold Signed-off-by: mohammad alqudah * explicitly return std::nullopt Signed-off-by: mohammad alqudah * Update planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp Co-authored-by: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> * fix assignment Signed-off-by: mohammad alqudah * fix spelling Signed-off-by: mohammad alqudah * fix merge errors Signed-off-by: mohammad alqudah --------- Signed-off-by: mohammad alqudah Signed-off-by: tomoya.kimura Co-authored-by: tomoya.kimura Co-authored-by: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> --- .../README.md | 20 ++ .../config/lane_change.param.yaml | 6 + .../images/lane_change-no_terminal_path.png | Bin 0 -> 52805 bytes .../images/lane_change-terminal_path.png | Bin 0 -> 56568 bytes .../base_class.hpp | 7 +- .../interface.hpp | 2 - .../scene.hpp | 11 +- .../structs/data.hpp | 18 ++ .../structs/parameters.hpp | 8 + .../utils/calculation.hpp | 3 + .../utils/path.hpp | 2 +- .../src/interface.cpp | 10 +- .../src/manager.cpp | 7 + .../src/scene.cpp | 186 +++++++++++++++--- .../src/utils/calculation.cpp | 58 ++++-- .../src/utils/path.cpp | 4 +- 16 files changed, 283 insertions(+), 59 deletions(-) create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-no_terminal_path.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-terminal_path.png diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index 5a6c22a731bf9..0508dc753a2e8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -874,6 +874,16 @@ endif @enduml ``` +## Terminal Lane Change Path + +Depending on the space configuration around the Ego vehicle, it is possible that a valid LC path cannot be generated. If that happens, then Ego will get stuck at `terminal_start` and will be not be able to proceed. Therefore we introduced the terminal LC path feature; when ego gets near to the terminal point (dist to `terminal_start` is less than the maximum lane change length) a terminal lane changing path will be computed starting from the terminal start point on the current lane and connects to the target lane. The terminal path only needs to be computed once in each execution of LC module. If no valid candidate paths are found in the path generation process, then the terminal path will be used as a fallback candidate path, the safety of the terminal path is not ensured and therefore it can only be force approved. The following images illustrate the expected behavior without and with the terminal path feature respectively: + +![no terminal path](./images/lane_change-no_terminal_path.png) + +![terminal path](./images/lane_change-terminal_path.png) + +Additionally if terminal path feature is enabled and path is computed, stop point placement can be configured to be at the edge of the current lane instead of at the `terminal_start` position, as indicated by the dashed red line in the image above. + ## Parameters ### Essential lane change parameters @@ -935,6 +945,16 @@ The following parameters are used to judge lane change completion. | `delay_lane_change.min_road_shoulder_width` | [m] | double | Width considered as road shoulder if lane doesn't have road shoulder when checking for parked vehicle | 0.5 | | `delay_lane_change.th_parked_vehicle_shift_ratio` | [-] | double | Stopped vehicles beyond this distance ratio from center line will be considered as parked | 0.6 | +### Terminal Lane Change Path + +The following parameters are used to configure terminal lane change path feature. + +| Name | Unit | Type | Description | Default value | +| :-------------------------------- | ---- | ---- | ------------------------------------------------------------------------- | ------------- | +| `terminal_path.enable` | [-] | bool | Flag to enable/disable terminal path feature | true | +| `terminal_path.disable_near_goal` | [-] | bool | Flag to disable terminal path feature if ego is near goal | true | +| `terminal_path.stop_at_boundary` | [-] | bool | If true, ego will stop at current lane boundary instead of middle of lane | false | + ### Collision checks #### Target Objects diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml index 61e41b4ea3ea4..91b296f8bd40f 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml @@ -10,6 +10,12 @@ # turn signal min_length_for_turn_signal_activation: 10.0 # [m] + # terminal path + terminal_path: + enable: true + disable_near_goal: true + stop_at_boundary: false + # trajectory generation trajectory: max_prepare_duration: 4.0 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-no_terminal_path.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-no_terminal_path.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7b76e1749974c64c7422aa524ed6839e12059b GIT binary patch literal 52805 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%0AA!>F~S?BC6_O;8>{3liQ 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 H?gjiG%@K1E literal 0 HcmV?d00001 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/base_class.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/base_class.hpp index 1061e07e516a2..43a929591dad1 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/base_class.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/base_class.hpp @@ -104,6 +104,8 @@ class LaneChangeBase virtual LaneChangePath getLaneChangePath() const = 0; + virtual BehaviorModuleOutput getTerminalLaneChangePath() const = 0; + virtual bool isEgoOnPreparePhase() const = 0; virtual bool isRequiredStop(const bool is_trailing_object) = 0; @@ -130,7 +132,7 @@ class LaneChangeBase virtual void insert_stop_point( [[maybe_unused]] const lanelet::ConstLanelets & lanelets, - [[maybe_unused]] PathWithLaneId & path) + [[maybe_unused]] PathWithLaneId & path, [[maybe_unused]] const bool is_waiting_approval = false) { } @@ -285,8 +287,7 @@ class LaneChangeBase FilteredLanesObjects filtered_objects_{}; BehaviorModuleOutput prev_module_output_{}; PoseWithDetailOpt lane_change_stop_pose_{std::nullopt}; - - PathWithLaneId prev_approved_path_; + mutable std::optional terminal_lane_change_path_{std::nullopt}; int unsafe_hysteresis_count_{0}; bool is_abort_path_approved_{false}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp index 9d6fbd65acfd8..a69ae0d92647a 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp @@ -129,8 +129,6 @@ class LaneChangeInterface : public SceneModuleInterface mutable MarkerArray virtual_wall_marker_; - std::unique_ptr prev_approved_path_; - void clearAbortApproval() { is_abort_path_approved_ = false; } bool is_abort_path_approved_{false}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp index 5f1da79bc7ea0..fe1d18ea6ea0c 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp @@ -65,13 +65,18 @@ class NormalLaneChange : public LaneChangeBase LaneChangePath getLaneChangePath() const override; + BehaviorModuleOutput getTerminalLaneChangePath() const override; + BehaviorModuleOutput generateOutput() override; void extendOutputDrivableArea(BehaviorModuleOutput & output) const override; - void insert_stop_point(const lanelet::ConstLanelets & lanelets, PathWithLaneId & path) override; + void insert_stop_point( + const lanelet::ConstLanelets & lanelets, PathWithLaneId & path, + const bool is_waiting_approval = false) override; - void insert_stop_point_on_current_lanes(PathWithLaneId & path); + void insert_stop_point_on_current_lanes( + PathWithLaneId & path, const bool is_waiting_approval = false); PathWithLaneId getReferencePath() const override; @@ -137,6 +142,8 @@ class NormalLaneChange : public LaneChangeBase bool check_candidate_path_safety( const LaneChangePath & candidate_path, const lane_change::TargetObjects & target_objects) const; + std::optional compute_terminal_lane_change_path() const; + bool isValidPath(const PathWithLaneId & path) const override; PathSafetyStatus isLaneChangePathSafe( diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp index 5f36be806bba4..d5bbfe25fe1e9 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp @@ -128,6 +128,22 @@ struct Info terminal_lane_changing_velocity = _lc_metrics.velocity; shift_line = _shift_line; } + + void set_prepare(const PhaseMetrics & _prep_metrics) + { + longitudinal_acceleration.prepare = _prep_metrics.actual_lon_accel; + velocity.prepare = _prep_metrics.velocity; + duration.prepare = _prep_metrics.duration; + length.prepare = _prep_metrics.length; + } + + void set_lane_changing(const PhaseMetrics & _lc_metrics) + { + longitudinal_acceleration.lane_changing = _lc_metrics.actual_lon_accel; + velocity.lane_changing = _lc_metrics.velocity; + duration.lane_changing = _lc_metrics.duration; + length.lane_changing = _lc_metrics.length; + } }; struct TargetLaneLeadingObjects @@ -219,6 +235,8 @@ struct TransientData double target_lane_length{std::numeric_limits::min()}; + double dist_to_target_end{std::numeric_limits::max()}; + lanelet::ArcCoordinates current_lanes_ego_arc; // arc coordinates of ego pose along current lanes lanelet::ArcCoordinates target_lanes_ego_arc; // arc coordinates of ego pose along target lanes diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp index 94020e8a08279..b25dbc99189e8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp @@ -137,12 +137,20 @@ struct DelayParameters double th_parked_vehicle_shift_ratio{0.6}; }; +struct TerminalPathParameters +{ + bool enable{false}; + bool disable_near_goal{false}; + bool stop_at_boundary{false}; +}; + struct Parameters { TrajectoryParameters trajectory{}; SafetyParameters safety{}; CancelParameters cancel{}; DelayParameters delay{}; + TerminalPathParameters terminal_path{}; // lane change parameters double backward_lane_length{200.0}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/calculation.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/calculation.hpp index eced227a5be32..29a9f258545a2 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/calculation.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/calculation.hpp @@ -67,6 +67,9 @@ double calc_dist_to_last_fit_width( const lanelet::ConstLanelets & lanelets, const Pose & src_pose, const BehaviorPathPlannerParameters & bpp_param, const double margin = 0.1); +double calc_dist_to_last_fit_width( + const CommonDataPtr & common_data_ptr, const PathWithLaneId & path, const double margin = 0.1); + /** * @brief Calculates the maximum preparation longitudinal distance for lane change. * diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp index dcc327b4793e1..77ba8fe68a653 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp @@ -48,7 +48,7 @@ using behavior_path_planner::lane_change::CommonDataPtr; */ bool get_prepare_segment( const CommonDataPtr & common_data_ptr, const PathWithLaneId & prev_module_path, - const LaneChangePhaseMetrics prep_metric, PathWithLaneId & prepare_segment); + const double prep_length, PathWithLaneId & prepare_segment); /** * @brief Generates the candidate path for a lane change maneuver. diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp index f80aad721a07c..9f3c6c9ef48bf 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp @@ -43,8 +43,7 @@ LaneChangeInterface::LaneChangeInterface( std::unique_ptr && module_type) : SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT parameters_{std::move(parameters)}, - module_type_{std::move(module_type)}, - prev_approved_path_{std::make_unique()} + module_type_{std::move(module_type)} { module_type_->setTimeKeeper(getTimeKeeper()); logger_ = utils::lane_change::getLogger(module_type_->getModuleTypeStr()); @@ -109,7 +108,6 @@ BehaviorModuleOutput LaneChangeInterface::plan() auto output = module_type_->generateOutput(); path_reference_ = std::make_shared(output.reference_path); - *prev_approved_path_ = getPreviousModuleOutput().path; stop_pose_ = module_type_->getStopPose(); @@ -155,11 +153,9 @@ BehaviorModuleOutput LaneChangeInterface::plan() BehaviorModuleOutput LaneChangeInterface::planWaitingApproval() { - BehaviorModuleOutput out = getPreviousModuleOutput(); + BehaviorModuleOutput out = module_type_->getTerminalLaneChangePath(); - *prev_approved_path_ = out.path; - - module_type_->insert_stop_point(module_type_->get_current_lanes(), out.path); + module_type_->insert_stop_point(module_type_->get_current_lanes(), out.path, true); out.turn_signal_info = module_type_->get_current_turn_signal_info(); const auto & lane_change_debug = module_type_->getDebugData(); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index 9f7a811770b5d..ec000b8fee97c 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -242,6 +242,13 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s // debug marker p.publish_debug_marker = getOrDeclareParameter(*node, parameter("publish_debug_marker")); + // terminal lane change path + p.terminal_path.enable = getOrDeclareParameter(*node, parameter("terminal_path.enable")); + p.terminal_path.disable_near_goal = + getOrDeclareParameter(*node, parameter("terminal_path.disable_near_goal")); + p.terminal_path.stop_at_boundary = + getOrDeclareParameter(*node, parameter("terminal_path.stop_at_boundary")); + // validation of safety check parameters // if loose check is not enabled, lane change module will keep on chattering and canceling, and // false positive situation might occur diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index fb4f7aeca1525..2719239baaed8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -169,6 +170,9 @@ void NormalLaneChange::update_transient_data(const bool is_approved) transient_data.dist_to_terminal_start = transient_data.dist_to_terminal_end - transient_data.current_dist_buffer.min; + transient_data.dist_to_target_end = calculation::calc_dist_from_pose_to_terminal_end( + common_data_ptr_, common_data_ptr_->lanes_ptr->target, common_data_ptr_->get_ego_pose()); + transient_data.max_prepare_length = calculation::calc_maximum_prepare_length(common_data_ptr_); transient_data.target_lane_length = @@ -246,6 +250,10 @@ std::pair NormalLaneChange::getSafePath(LaneChangePath & safe_path) bool found_safe_path = get_lane_change_paths(valid_paths); // if no safe path is found and ego is stuck, try to find a path with a small margin + if (valid_paths.empty() && terminal_lane_change_path_) { + valid_paths.push_back(terminal_lane_change_path_.value()); + } + lane_change_debug_.valid_paths = valid_paths; if (valid_paths.empty()) { @@ -380,6 +388,45 @@ LaneChangePath NormalLaneChange::getLaneChangePath() const return status_.lane_change_path; } +BehaviorModuleOutput NormalLaneChange::getTerminalLaneChangePath() const +{ + if ( + !lane_change_parameters_->terminal_path.enable || + !common_data_ptr_->transient_data.is_ego_near_current_terminal_start) { + return prev_module_output_; + } + + const auto is_near_goal = lane_change_parameters_->terminal_path.disable_near_goal && + common_data_ptr_->lanes_ptr->target_lane_in_goal_section && + common_data_ptr_->transient_data.dist_to_target_end < + common_data_ptr_->transient_data.lane_changing_length.max; + if (is_near_goal) { + return prev_module_output_; + } + + const auto & current_lanes = get_current_lanes(); + if (current_lanes.empty()) { + RCLCPP_DEBUG(logger_, "Current lanes not found. Returning previous module's path as output."); + return prev_module_output_; + } + + const auto terminal_lc_path = compute_terminal_lane_change_path(); + + if (!terminal_lc_path) { + RCLCPP_DEBUG(logger_, "Terminal path not found. Returning previous module's path as output."); + return prev_module_output_; + } + + auto output = prev_module_output_; + + output.path = *terminal_lc_path; + output.turn_signal_info = get_current_turn_signal_info(); + + extendOutputDrivableArea(output); + + return output; +} + BehaviorModuleOutput NormalLaneChange::generateOutput() { universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); @@ -450,7 +497,7 @@ void NormalLaneChange::extendOutputDrivableArea(BehaviorModuleOutput & output) c } void NormalLaneChange::insert_stop_point( - const lanelet::ConstLanelets & lanelets, PathWithLaneId & path) + const lanelet::ConstLanelets & lanelets, PathWithLaneId & path, const bool is_waiting_approval) { universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); if (lanelets.empty()) { @@ -475,44 +522,42 @@ void NormalLaneChange::insert_stop_point( return; } - insert_stop_point_on_current_lanes(path); + insert_stop_point_on_current_lanes(path, is_waiting_approval); } -void NormalLaneChange::insert_stop_point_on_current_lanes(PathWithLaneId & path) +void NormalLaneChange::insert_stop_point_on_current_lanes( + PathWithLaneId & path, const bool is_waiting_approval) { const auto & path_front_pose = path.points.front().point.pose; - const auto & center_line = common_data_ptr_->current_lanes_path.points; - const auto get_arc_length_along_lanelet = [&](const geometry_msgs::msg::Pose & target) { - return motion_utils::calcSignedArcLength( - center_line, path_front_pose.position, target.position); - }; + const auto & ego_pose = common_data_ptr_->get_ego_pose(); + const auto dist_from_path_front = + motion_utils::calcSignedArcLength(path.points, path_front_pose.position, ego_pose.position); const auto & transient_data = common_data_ptr_->transient_data; const auto & lanes_ptr = common_data_ptr_->lanes_ptr; const auto & lc_param_ptr = common_data_ptr_->lc_param_ptr; - const auto dist_to_terminal = std::invoke([&]() -> double { - const auto target_pose = (lanes_ptr->current_lane_in_goal_section) - ? common_data_ptr_->route_handler_ptr->getGoalPose() - : center_line.back().point.pose; - return get_arc_length_along_lanelet(target_pose); - }); - - const auto & bpp_param_ptr = common_data_ptr_->bpp_param_ptr; - const auto min_dist_buffer = transient_data.current_dist_buffer.min; const auto dist_to_terminal_start = - dist_to_terminal - min_dist_buffer - calculation::calc_stopping_distance(lc_param_ptr); + transient_data.dist_to_terminal_start - calculation::calc_stopping_distance(lc_param_ptr); - const auto distance_to_last_fit_width = std::invoke([&]() -> double { + const auto & bpp_param_ptr = common_data_ptr_->bpp_param_ptr; + const auto dist_to_terminal_stop = std::invoke([&]() -> double { const auto & curr_lanes_poly = common_data_ptr_->lanes_polygon_ptr->current; - if (utils::isEgoWithinOriginalLane(curr_lanes_poly, getEgoPose(), *bpp_param_ptr)) { - return utils::lane_change::calculation::calc_dist_to_last_fit_width( - lanes_ptr->current, path.points.front().point.pose, *bpp_param_ptr); + if (!utils::isEgoWithinOriginalLane(curr_lanes_poly, getEgoPose(), *bpp_param_ptr)) { + return dist_from_path_front + dist_to_terminal_start; } - return std::numeric_limits::max(); - }); - const auto dist_to_terminal_stop = std::min(dist_to_terminal_start, distance_to_last_fit_width); + if ( + terminal_lane_change_path_ && is_waiting_approval && + lc_param_ptr->terminal_path.stop_at_boundary) { + return calculation::calc_dist_to_last_fit_width(common_data_ptr_, path); + } + + const auto dist_to_last_fit_width = calculation::calc_dist_to_last_fit_width( + lanes_ptr->current, path.points.front().point.pose, *bpp_param_ptr); + + return std::min(dist_from_path_front + dist_to_terminal_start, dist_to_last_fit_width); + }); const auto terminal_stop_reason = status_.is_valid_path ? "no safe path" : "no valid path"; if ( @@ -522,11 +567,13 @@ void NormalLaneChange::insert_stop_point_on_current_lanes(PathWithLaneId & path) return; } + const auto & center_line = common_data_ptr_->current_lanes_path.points; const auto dist_to_target_lane_start = std::invoke([&]() -> double { const auto & front_lane = lanes_ptr->target_neighbor.front(); const auto target_front = utils::to_geom_msg_pose(front_lane.centerline2d().front(), front_lane); - return get_arc_length_along_lanelet(target_front); + return motion_utils::calcSignedArcLength( + center_line, path_front_pose.position, target_front.position); }); const auto arc_length_to_current_obj = utils::lane_change::get_min_dist_to_current_lanes_obj( @@ -1129,7 +1176,7 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) PathWithLaneId prepare_segment; try { if (!utils::lane_change::get_prepare_segment( - common_data_ptr_, prev_module_output_.path, prep_metric, prepare_segment)) { + common_data_ptr_, prev_module_output_.path, prep_metric.length, prepare_segment)) { debug_print("Reject: failed to get valid prepare segment!"); continue; } @@ -1247,6 +1294,91 @@ bool NormalLaneChange::check_candidate_path_safety( return safety_check_with_normal_rss.is_safe; } +std::optional NormalLaneChange::compute_terminal_lane_change_path() const +{ + const auto & transient_data = common_data_ptr_->transient_data; + const auto dist_to_terminal_start = transient_data.dist_to_terminal_start; + const auto min_lc_velocity = lane_change_parameters_->trajectory.min_lane_changing_velocity; + const auto current_velocity = getEgoVelocity(); + + PathWithLaneId prepare_segment; + try { + if (!utils::lane_change::get_prepare_segment( + common_data_ptr_, prev_module_output_.path, dist_to_terminal_start, prepare_segment)) { + RCLCPP_DEBUG(logger_, "failed to get valid prepare segment for terminal LC path"); + return std::nullopt; + } + } catch (const std::exception & e) { + RCLCPP_DEBUG(logger_, "failed to get terminal LC path: %s", e.what()); + return std::nullopt; + } + + // t = 2 * d / (v1 + v2) + const auto duration_to_lc_start = + 2.0 * dist_to_terminal_start / (current_velocity + min_lc_velocity); + const auto lon_accel = std::invoke([&]() -> double { + if (duration_to_lc_start < calculation::eps) { + return 0.0; + } + return std::clamp( + (min_lc_velocity - current_velocity) / duration_to_lc_start, + lane_change_parameters_->trajectory.min_longitudinal_acc, + lane_change_parameters_->trajectory.max_longitudinal_acc); + }); + const auto vel_on_prep = current_velocity + lon_accel * duration_to_lc_start; + const LaneChangePhaseMetrics prep_metric( + duration_to_lc_start, dist_to_terminal_start, vel_on_prep, lon_accel, lon_accel, 0.0); + + if (terminal_lane_change_path_) { + terminal_lane_change_path_->info.set_prepare(prep_metric); + if (prepare_segment.points.empty()) { + terminal_lane_change_path_->path = terminal_lane_change_path_->shifted_path.path; + return terminal_lane_change_path_->path; + } + prepare_segment.points.pop_back(); + terminal_lane_change_path_->path = + utils::combinePath(prepare_segment, terminal_lane_change_path_->shifted_path.path); + return terminal_lane_change_path_->path; + } + + const auto & lane_changing_start_pose = prepare_segment.points.back().point.pose; + const auto & target_lanes = common_data_ptr_->lanes_ptr->target; + const auto shift_length = + lanelet::utils::getLateralDistanceToClosestLanelet(target_lanes, lane_changing_start_pose); + + const auto dist_lc_start_to_end_of_lanes = calculation::calc_dist_from_pose_to_terminal_end( + common_data_ptr_, common_data_ptr_->lanes_ptr->target_neighbor, + prepare_segment.points.back().point.pose); + + const auto max_lane_changing_length = std::invoke([&]() { + double max_length = transient_data.dist_to_terminal_end - prep_metric.length; + return std::min( + max_length, dist_lc_start_to_end_of_lanes - transient_data.next_dist_buffer.min); + }); + + const auto max_path_velocity = prepare_segment.points.back().point.longitudinal_velocity_mps; + constexpr double lane_changing_lon_accel{0.0}; + const auto lane_changing_metrics = calculation::calc_shift_phase_metrics( + common_data_ptr_, shift_length, prep_metric.velocity, max_path_velocity, + lane_changing_lon_accel, max_lane_changing_length); + + const auto sorted_lane_ids = utils::lane_change::get_sorted_lane_ids(common_data_ptr_); + + LaneChangePath candidate_path; + for (const auto & lc_metric : lane_changing_metrics) { + try { + candidate_path = utils::lane_change::get_candidate_path( + common_data_ptr_, prep_metric, lc_metric, prepare_segment, sorted_lane_ids, shift_length); + } catch (const std::exception & e) { + continue; + } + terminal_lane_change_path_ = candidate_path; + return candidate_path.path; + } + + return std::nullopt; +} + PathSafetyStatus NormalLaneChange::isApprovedPathSafe() const { const auto & path = status_.lane_change_path; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/calculation.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/calculation.cpp index 550c0fa290a99..a0130fcd27041 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/calculation.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/calculation.cpp @@ -58,22 +58,10 @@ double calc_stopping_distance(const LCParamPtr & lc_param_ptr) } double calc_dist_to_last_fit_width( - const lanelet::ConstLanelets & lanelets, const Pose & src_pose, + const lanelet::ConstLanelets & lanelets, const lanelet::BasicPolygon2d & lanelet_polygon, + const universe_utils::LineString2d & line_string, const Pose & src_pose, const BehaviorPathPlannerParameters & bpp_param, const double margin) { - if (lanelets.empty()) return 0.0; - - const auto lane_polygon = lanelets.back().polygon2d().basicPolygon(); - const auto center_line = lanelet::utils::generateFineCenterline(lanelets.back(), 1.0); - - if (center_line.size() <= 1) return 0.0; - - universe_utils::LineString2d line_string; - line_string.reserve(center_line.size() - 1); - std::for_each(center_line.begin() + 1, center_line.end(), [&line_string](const auto & point) { - boost::geometry::append(line_string, universe_utils::Point2d(point.x(), point.y())); - }); - const double buffer_distance = 0.5 * bpp_param.vehicle_width + margin; universe_utils::MultiPolygon2d center_line_polygon; namespace strategy = boost::geometry::strategy::buffer; @@ -85,7 +73,7 @@ double calc_dist_to_last_fit_width( if (center_line_polygon.empty()) return 0.0; std::vector intersection_points; - boost::geometry::intersection(lane_polygon, center_line_polygon, intersection_points); + boost::geometry::intersection(lanelet_polygon, center_line_polygon, intersection_points); if (intersection_points.empty()) { return utils::getDistanceToEndOfLane(src_pose, lanelets); @@ -102,6 +90,46 @@ double calc_dist_to_last_fit_width( return std::max(distance - (bpp_param.base_link2front + margin), 0.0); } +double calc_dist_to_last_fit_width( + const CommonDataPtr & common_data_ptr, const PathWithLaneId & path, const double margin) +{ + const auto & current_lanes = common_data_ptr->lanes_ptr->current; + const auto & current_lanes_polygon = common_data_ptr->lanes_polygon_ptr->current; + const auto & bpp_param = *common_data_ptr->bpp_param_ptr; + + universe_utils::LineString2d line_string; + line_string.reserve(path.points.size() - 1); + std::for_each(path.points.begin() + 1, path.points.end(), [&line_string](const auto & point) { + const auto & position = point.point.pose.position; + boost::geometry::append(line_string, universe_utils::Point2d(position.x, position.y)); + }); + + const auto & src_pose = path.points.front().point.pose; + return calc_dist_to_last_fit_width( + current_lanes, current_lanes_polygon, line_string, src_pose, bpp_param, margin); +} + +double calc_dist_to_last_fit_width( + const lanelet::ConstLanelets & lanelets, const Pose & src_pose, + const BehaviorPathPlannerParameters & bpp_param, const double margin) +{ + if (lanelets.empty()) return 0.0; + + const auto lane_polygon = lanelets.back().polygon2d().basicPolygon(); + const auto center_line = lanelet::utils::generateFineCenterline(lanelets.back(), 1.0); + + if (center_line.size() <= 1) return 0.0; + + universe_utils::LineString2d line_string; + line_string.reserve(center_line.size() - 1); + std::for_each(center_line.begin() + 1, center_line.end(), [&line_string](const auto & point) { + boost::geometry::append(line_string, universe_utils::Point2d(point.x(), point.y())); + }); + + return calc_dist_to_last_fit_width( + lanelets, lane_polygon, line_string, src_pose, bpp_param, margin); +} + double calc_maximum_prepare_length(const CommonDataPtr & common_data_ptr) { const auto max_prepare_duration = common_data_ptr->lc_param_ptr->trajectory.max_prepare_duration; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp index d7303d7d1df2d..44ee1624f0f51 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp @@ -154,7 +154,7 @@ using behavior_path_planner::lane_change::CommonDataPtr; bool get_prepare_segment( const CommonDataPtr & common_data_ptr, const PathWithLaneId & prev_module_path, - const LaneChangePhaseMetrics prep_metric, PathWithLaneId & prepare_segment) + const double prep_length, PathWithLaneId & prepare_segment) { const auto & current_lanes = common_data_ptr->lanes_ptr->current; const auto & target_lanes = common_data_ptr->lanes_ptr->target; @@ -168,7 +168,7 @@ bool get_prepare_segment( const size_t current_seg_idx = autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( prepare_segment.points, common_data_ptr->get_ego_pose(), 3.0, 1.0); - utils::clipPathLength(prepare_segment, current_seg_idx, prep_metric.length, backward_path_length); + utils::clipPathLength(prepare_segment, current_seg_idx, prep_length, backward_path_length); if (prepare_segment.points.empty()) return false; From 203587335202d0c39260b40fae458300929d7a2b Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Fri, 27 Dec 2024 19:24:46 +0900 Subject: [PATCH 016/127] fix(autoware_scenario_selector): fix bugprone-branch-clone (#9699) fix: bugprone-error Signed-off-by: kobayu858 --- planning/autoware_scenario_selector/src/node.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/planning/autoware_scenario_selector/src/node.cpp b/planning/autoware_scenario_selector/src/node.cpp index 4bb64e27368d8..defbde4f6aabc 100644 --- a/planning/autoware_scenario_selector/src/node.cpp +++ b/planning/autoware_scenario_selector/src/node.cpp @@ -156,9 +156,8 @@ std::string ScenarioSelectorNode::selectScenarioByPosition() return tier4_planning_msgs::msg::Scenario::LANEDRIVING; } else if (is_in_parking_lot) { return tier4_planning_msgs::msg::Scenario::PARKING; - } else { - return tier4_planning_msgs::msg::Scenario::LANEDRIVING; } + return tier4_planning_msgs::msg::Scenario::LANEDRIVING; } if (current_scenario_ == tier4_planning_msgs::msg::Scenario::LANEDRIVING) { From 869cf4c435704f704e3d9ebc898d91ba697d2653 Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Fri, 27 Dec 2024 19:25:33 +0900 Subject: [PATCH 017/127] fix(autoware_behavior_velocity_intersection_module): fix bugprone-branch-clone (#9702) fix: bugprone-error Signed-off-by: kobayu858 --- .../src/scene_intersection.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp index e33416860c319..93a13a4d62737 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp @@ -354,9 +354,7 @@ DecisionResult IntersectionModule::modifyPathVelocityDetail(PathWithLaneId * pat (std::fabs(dist_stopline) < planner_param_.common.stopline_overshoot_margin); const bool over_stopline = (dist_stopline < 0.0); const bool is_stopped_duration = planner_data_->isVehicleStopped(duration); - if (over_stopline) { - state_machine.setState(StateMachine::State::GO); - } else if (is_stopped_duration && approached_dist_stopline) { + if (over_stopline || (is_stopped_duration && approached_dist_stopline)) { state_machine.setState(StateMachine::State::GO); } return state_machine.getState() == StateMachine::State::GO; @@ -367,12 +365,7 @@ DecisionResult IntersectionModule::modifyPathVelocityDetail(PathWithLaneId * pat (std::fabs(dist_stopline) < planner_param_.common.stopline_overshoot_margin); const bool over_stopline = (dist_stopline < -planner_param_.common.stopline_overshoot_margin); const bool is_stopped = planner_data_->isVehicleStopped(duration); - if (over_stopline) { - return true; - } else if (is_stopped && approached_dist_stopline) { - return true; - } - return false; + return over_stopline || (is_stopped && approached_dist_stopline); }; const auto occlusion_wo_tl_pass_judge_line_idx = From c8e00409c03555274c6ff26cc438e75144e1dcfd Mon Sep 17 00:00:00 2001 From: "Yi-Hsiang Fang (Vivid)" <146902905+vividf@users.noreply.github.com> Date: Sat, 28 Dec 2024 03:16:48 +0900 Subject: [PATCH 018/127] feat(pointpainting_fusion): enable cloud display on image (#9813) --- .../src/pointpainting_fusion/node.cpp | 90 ++++++++++--------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp index 2837bac458541..25d9064ddbfc7 100644 --- a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp @@ -316,54 +316,56 @@ dc | dc dc dc dc ||zc| // iterate points // Requires 'OMP_NUM_THREADS=N' omp_set_num_threads(omp_num_threads_); -#pragma omp parallel for - for (int i = 0; i < iterations; i++) { - int stride = p_step * i; - unsigned char * data = &painted_pointcloud_msg.data[0]; - unsigned char * output = &painted_pointcloud_msg.data[0]; - // cppcheck-suppress-begin invalidPointerCast - float p_x = *reinterpret_cast(&data[stride + x_offset]); - float p_y = *reinterpret_cast(&data[stride + y_offset]); - float p_z = *reinterpret_cast(&data[stride + z_offset]); - // cppcheck-suppress-end invalidPointerCast - point_lidar << p_x, p_y, p_z; - point_camera = lidar2cam_affine * point_lidar; - p_x = point_camera.x(); - p_y = point_camera.y(); - p_z = point_camera.z(); - - if (camera_projectors_[image_id].isOutsideHorizontalView(p_x, p_z)) { - continue; - } + std::vector> local_vectors(omp_num_threads_); +#pragma omp parallel + { +#pragma omp for + for (int i = 0; i < iterations; i++) { + int stride = p_step * i; + unsigned char * data = &painted_pointcloud_msg.data[0]; + unsigned char * output = &painted_pointcloud_msg.data[0]; + // cppcheck-suppress-begin invalidPointerCast + float p_x = *reinterpret_cast(&data[stride + x_offset]); + float p_y = *reinterpret_cast(&data[stride + y_offset]); + float p_z = *reinterpret_cast(&data[stride + z_offset]); + // cppcheck-suppress-end invalidPointerCast + point_lidar << p_x, p_y, p_z; + point_camera = lidar2cam_affine * point_lidar; + p_x = point_camera.x(); + p_y = point_camera.y(); + p_z = point_camera.z(); + + if (camera_projectors_[image_id].isOutsideHorizontalView(p_x, p_z)) { + continue; + } - // project - Eigen::Vector2d projected_point; - if (camera_projectors_[image_id].calcImageProjectedPoint( - cv::Point3d(p_x, p_y, p_z), projected_point)) { - // iterate 2d bbox - for (const auto & feature_object : objects) { - sensor_msgs::msg::RegionOfInterest roi = feature_object.feature.roi; - // paint current point if it is inside bbox - int label2d = feature_object.object.classification.front().label; - if ( - !isUnknown(label2d) && isInsideBbox(projected_point.x(), projected_point.y(), roi, 1.0)) { - // cppcheck-suppress invalidPointerCast - auto p_class = reinterpret_cast(&output[stride + class_offset]); - for (const auto & cls : isClassTable_) { - // add up the class values if the point belongs to multiple classes - *p_class = cls.second(label2d) ? (class_index_[cls.first] + *p_class) : *p_class; + // project + Eigen::Vector2d projected_point; + if (camera_projectors_[image_id].calcImageProjectedPoint( + cv::Point3d(p_x, p_y, p_z), projected_point)) { + // iterate 2d bbox + for (const auto & feature_object : objects) { + sensor_msgs::msg::RegionOfInterest roi = feature_object.feature.roi; + // paint current point if it is inside bbox + int label2d = feature_object.object.classification.front().label; + if ( + !isUnknown(label2d) && + isInsideBbox(projected_point.x(), projected_point.y(), roi, 1.0)) { + // cppcheck-suppress invalidPointerCast + auto p_class = reinterpret_cast(&output[stride + class_offset]); + for (const auto & cls : isClassTable_) { + // add up the class values if the point belongs to multiple classes + *p_class = cls.second(label2d) ? (class_index_[cls.first] + *p_class) : *p_class; + } } } + if (debugger_) { + int thread_id = omp_get_thread_num(); + local_vectors[thread_id].push_back(projected_point); + } } -#if 0 - // Parallelizing loop don't support push_back - if (debugger_) { - debug_image_points.push_back(projected_point); - } -#endif } } - if (debugger_) { std::unique_ptr inner_st_ptr; if (time_keeper_) @@ -373,6 +375,10 @@ dc | dc dc dc dc ||zc| debug_image_rois.push_back(feature_object.feature.roi); } + for (const auto & local_vec : local_vectors) { + debug_image_points.insert(debug_image_points.end(), local_vec.begin(), local_vec.end()); + } + debugger_->image_rois_ = debug_image_rois; debugger_->obstacle_points_ = debug_image_points; debugger_->publishImage(image_id, input_roi_msg.header.stamp); From 58df2a112243562a49cf807fa8f64b7957a9ba44 Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Tue, 31 Dec 2024 20:26:35 +0900 Subject: [PATCH 019/127] fix(goal_planner): fix usage of last_previous_module_output (#9811) --- .../examples/plot_map_case1.cpp | 10 ++-- .../examples/plot_map_case2.cpp | 10 ++-- .../fixed_goal_planner_base.hpp | 8 +-- .../goal_planner_module.hpp | 13 ++-- .../pull_over_planner/bezier_pull_over.hpp | 6 +- .../pull_over_planner/freespace_pull_over.hpp | 2 +- .../pull_over_planner/geometric_pull_over.hpp | 2 +- .../pull_over_planner_base.hpp | 2 +- .../pull_over_planner/shift_pull_over.hpp | 4 +- .../thread_data.hpp | 23 +++---- .../src/goal_planner_module.cpp | 60 ++++++++++--------- .../pull_over_planner/bezier_pull_over.cpp | 18 +++--- .../pull_over_planner/freespace_pull_over.cpp | 2 +- .../pull_over_planner/geometric_pull_over.cpp | 2 +- .../src/pull_over_planner/shift_pull_over.cpp | 10 ++-- .../src/thread_data.cpp | 5 +- 16 files changed, 87 insertions(+), 90 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp index 56e207c160873..46d3b97b71e58 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp @@ -288,7 +288,7 @@ bool hasEnoughDistance( std::vector selectPullOverPaths( const std::vector & pull_over_path_candidates, const GoalCandidates & goal_candidates, const std::shared_ptr planner_data, - const GoalPlannerParameters & parameters, const BehaviorModuleOutput & previous_module_output) + const GoalPlannerParameters & parameters, const BehaviorModuleOutput & upstream_module_output) { using autoware::behavior_path_planner::utils::getExtendedCurrentLanesFromPath; using autoware::motion_utils::calcSignedArcLength; @@ -313,15 +313,15 @@ std::vector selectPullOverPaths( } const double prev_path_front_to_goal_dist = calcSignedArcLength( - previous_module_output.path.points, - previous_module_output.path.points.front().point.pose.position, goal_pose.position); + upstream_module_output.path.points, + upstream_module_output.path.points.front().point.pose.position, goal_pose.position); const auto & long_tail_reference_path = [&]() { if (prev_path_front_to_goal_dist > backward_length) { - return previous_module_output.path; + return upstream_module_output.path; } // get road lanes which is at least backward_length[m] behind the goal const auto road_lanes = getExtendedCurrentLanesFromPath( - previous_module_output.path, planner_data, backward_length, 0.0, false); + upstream_module_output.path, planner_data, backward_length, 0.0, false); const auto goal_pose_length = lanelet::utils::getArcCoordinates(road_lanes, goal_pose).length; return planner_data->route_handler->getCenterLinePath( road_lanes, std::max(0.0, goal_pose_length - backward_length), diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp index 102e5ef53b164..3518b5041be53 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp @@ -287,7 +287,7 @@ bool hasEnoughDistance( std::vector selectPullOverPaths( const std::vector & pull_over_path_candidates, const GoalCandidates & goal_candidates, const std::shared_ptr planner_data, - const GoalPlannerParameters & parameters, const BehaviorModuleOutput & previous_module_output) + const GoalPlannerParameters & parameters, const BehaviorModuleOutput & upstream_module_output) { using autoware::behavior_path_planner::utils::getExtendedCurrentLanesFromPath; using autoware::motion_utils::calcSignedArcLength; @@ -312,15 +312,15 @@ std::vector selectPullOverPaths( } const double prev_path_front_to_goal_dist = calcSignedArcLength( - previous_module_output.path.points, - previous_module_output.path.points.front().point.pose.position, goal_pose.position); + upstream_module_output.path.points, + upstream_module_output.path.points.front().point.pose.position, goal_pose.position); const auto & long_tail_reference_path = [&]() { if (prev_path_front_to_goal_dist > backward_length) { - return previous_module_output.path; + return upstream_module_output.path; } // get road lanes which is at least backward_length[m] behind the goal const auto road_lanes = getExtendedCurrentLanesFromPath( - previous_module_output.path, planner_data, backward_length, 0.0, false); + upstream_module_output.path, planner_data, backward_length, 0.0, false); const auto goal_pose_length = lanelet::utils::getArcCoordinates(road_lanes, goal_pose).length; return planner_data->route_handler->getCenterLinePath( road_lanes, std::max(0.0, goal_pose_length - backward_length), diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/fixed_goal_planner_base.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/fixed_goal_planner_base.hpp index f670e3b05fa77..201b7c2d33bf6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/fixed_goal_planner_base.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/fixed_goal_planner_base.hpp @@ -38,15 +38,15 @@ class FixedGoalPlannerBase virtual BehaviorModuleOutput plan( const std::shared_ptr & planner_data) const = 0; - void setPreviousModuleOutput(const BehaviorModuleOutput & previous_module_output) + void setPreviousModuleOutput(const BehaviorModuleOutput & upstream_module_output) { - previous_module_output_ = previous_module_output; + upstream_module_output_ = upstream_module_output; } - BehaviorModuleOutput getPreviousModuleOutput() const { return previous_module_output_; } + BehaviorModuleOutput getPreviousModuleOutput() const { return upstream_module_output_; } protected: - BehaviorModuleOutput previous_module_output_; + BehaviorModuleOutput upstream_module_output_; }; } // namespace autoware::behavior_path_planner diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp index 3a1773324fe24..0765147cbeb80 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp @@ -133,12 +133,12 @@ bool isOnModifiedGoal( const GoalPlannerParameters & parameters); bool hasPreviousModulePathShapeChanged( - const BehaviorModuleOutput & previous_module_output, - const BehaviorModuleOutput & last_previous_module_output); + const BehaviorModuleOutput & upstream_module_output, + const BehaviorModuleOutput & last_upstream_module_output); bool hasDeviatedFromLastPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & last_previous_module_output); + const PlannerData & planner_data, const BehaviorModuleOutput & last_upstream_module_output); bool hasDeviatedFromCurrentPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & previous_module_output); + const PlannerData & planner_data, const BehaviorModuleOutput & upstream_module_output); bool needPathUpdate( const Pose & current_pose, const double path_update_duration, const rclcpp::Time & now, @@ -189,6 +189,7 @@ class LaneParkingPlanner void onTimer(); private: + const GoalPlannerParameters parameters_; std::mutex & mutex_; const std::optional & request_; LaneParkingResponse & response_; @@ -196,6 +197,10 @@ class LaneParkingPlanner rclcpp::Logger logger_; std::vector> pull_over_planners_; + BehaviorModuleOutput + original_upstream_module_output_; // plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) override; + const BehaviorModuleOutput & upstream_module_output) override; std::vector plans( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output); + const BehaviorModuleOutput & upstream_module_output); private: const LaneDepartureChecker lane_departure_checker_; @@ -50,7 +50,7 @@ class BezierPullOver : public PullOverPlannerBase std::vector generateBezierPath( const GoalCandidate & goal_candidate, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output, const lanelet::ConstLanelets & road_lanes, + const BehaviorModuleOutput & upstream_module_output, const lanelet::ConstLanelets & road_lanes, const lanelet::ConstLanelets & shoulder_lanes, const double lateral_jerk) const; PathWithLaneId generateReferencePath( diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp index e32488965f69a..37c82ea904a55 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp @@ -41,7 +41,7 @@ class FreespacePullOver : public PullOverPlannerBase std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) override; + const BehaviorModuleOutput & upstream_module_output) override; protected: const double velocity_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp index 89181b258fbea..d15c1e796bbe7 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp @@ -45,7 +45,7 @@ class GeometricPullOver : public PullOverPlannerBase std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) override; + const BehaviorModuleOutput & upstream_module_output) override; std::vector generatePullOverPaths( const lanelet::ConstLanelets & road_lanes, const lanelet::ConstLanelets & shoulder_lanes, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/pull_over_planner_base.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/pull_over_planner_base.hpp index 5b336a7de6acc..5af69894c0a2e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/pull_over_planner_base.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/pull_over_planner_base.hpp @@ -130,7 +130,7 @@ class PullOverPlannerBase virtual std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) = 0; + const BehaviorModuleOutput & upstream_module_output) = 0; protected: const autoware::vehicle_info_utils::VehicleInfo vehicle_info_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp index 08e0b8508c991..2c6aec919bfbb 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp @@ -38,7 +38,7 @@ class ShiftPullOver : public PullOverPlannerBase std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) override; + const BehaviorModuleOutput & upstream_module_output) override; protected: PathWithLaneId generateReferencePath( @@ -49,7 +49,7 @@ class ShiftPullOver : public PullOverPlannerBase std::optional generatePullOverPath( const GoalCandidate & goal_candidate, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output, const lanelet::ConstLanelets & road_lanes, + const BehaviorModuleOutput & upstream_module_output, const lanelet::ConstLanelets & road_lanes, const lanelet::ConstLanelets & pull_over_lanes, const double lateral_jerk) const; static double calcBeforeShiftedArcLength( const PathWithLaneId & path, const double after_shifted_arc_length, const double dr); diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/thread_data.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/thread_data.hpp index bfef4226b2661..7173b275e26fb 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/thread_data.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/thread_data.hpp @@ -32,35 +32,27 @@ class LaneParkingRequest { public: LaneParkingRequest( - const GoalPlannerParameters & parameters, const autoware::universe_utils::LinearRing2d & vehicle_footprint, - const GoalCandidates & goal_candidates, const BehaviorModuleOutput & previous_module_output) - : parameters_(parameters), - vehicle_footprint_(vehicle_footprint), + const GoalCandidates & goal_candidates, const BehaviorModuleOutput & upstream_module_output) + : vehicle_footprint_(vehicle_footprint), goal_candidates_(goal_candidates), - previous_module_output_(previous_module_output), - last_previous_module_output_(previous_module_output) + upstream_module_output_(upstream_module_output) { } void update( const PlannerData & planner_data, const ModuleStatus & current_status, - const BehaviorModuleOutput & previous_module_output, + const BehaviorModuleOutput & upstream_module_output, const std::optional & pull_over_path, const PathDecisionState & prev_data); - const GoalPlannerParameters parameters_; const autoware::universe_utils::LinearRing2d vehicle_footprint_; const GoalCandidates goal_candidates_; const std::shared_ptr & get_planner_data() const { return planner_data_; } const ModuleStatus & get_current_status() const { return current_status_; } - const BehaviorModuleOutput & get_previous_module_output() const - { - return previous_module_output_; - } - const BehaviorModuleOutput & get_last_previous_module_output() const + const BehaviorModuleOutput & get_upstream_module_output() const { - return last_previous_module_output_; + return upstream_module_output_; } const std::optional & get_pull_over_path() const { return pull_over_path_; } const PathDecisionState & get_prev_data() const { return prev_data_; } @@ -68,8 +60,7 @@ class LaneParkingRequest private: std::shared_ptr planner_data_; ModuleStatus current_status_; - BehaviorModuleOutput previous_module_output_; - BehaviorModuleOutput last_previous_module_output_; + BehaviorModuleOutput upstream_module_output_; std::optional pull_over_path_; // LATERAL_DEVIATION_THRESH) { return true; } @@ -185,19 +185,19 @@ bool hasPreviousModulePathShapeChanged( } bool hasDeviatedFromLastPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & last_previous_module_output) + const PlannerData & planner_data, const BehaviorModuleOutput & last_upstream_module_output) { return std::abs(autoware::motion_utils::calcLateralOffset( - last_previous_module_output.path.points, + last_upstream_module_output.path.points, planner_data.self_odometry->pose.pose.position)) > 0.3; } bool hasDeviatedFromCurrentPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & previous_module_output) + const PlannerData & planner_data, const BehaviorModuleOutput & upstream_module_output) { constexpr double LATERAL_DEVIATION_THRESH = 0.3; return std::abs(autoware::motion_utils::calcLateralOffset( - previous_module_output.path.points, planner_data.self_odometry->pose.pose.position)) > + upstream_module_output.path.points, planner_data.self_odometry->pose.pose.position)) > LATERAL_DEVIATION_THRESH; } @@ -282,7 +282,8 @@ LaneParkingPlanner::LaneParkingPlanner( const std::optional & request, LaneParkingResponse & response, std::atomic & is_lane_parking_cb_running, const rclcpp::Logger & logger, const GoalPlannerParameters & parameters) -: mutex_(lane_parking_mutex), +: parameters_(parameters), + mutex_(lane_parking_mutex), request_(request), response_(response), is_lane_parking_cb_running_(is_lane_parking_cb_running), @@ -335,12 +336,10 @@ void LaneParkingPlanner::onTimer() return; } const auto & local_request = local_request_opt.value(); - const auto & parameters = local_request.parameters_; const auto & goal_candidates = local_request.goal_candidates_; const auto & local_planner_data = local_request.get_planner_data(); const auto & current_status = local_request.get_current_status(); - const auto & previous_module_output = local_request.get_previous_module_output(); - const auto & last_previous_module_output = local_request.get_last_previous_module_output(); + const auto & upstream_module_output = local_request.get_upstream_module_output(); const auto & pull_over_path_opt = local_request.get_pull_over_path(); const auto & prev_data = local_request.get_prev_data(); @@ -371,19 +370,21 @@ void LaneParkingPlanner::onTimer() ? std::make_optional(pull_over_path_opt.value().modified_goal()) : std::nullopt; if (isOnModifiedGoal( - local_planner_data->self_odometry->pose.pose, modified_goal_opt, parameters)) { + local_planner_data->self_odometry->pose.pose, modified_goal_opt, parameters_)) { return false; } - if (hasDeviatedFromCurrentPreviousModulePath(*local_planner_data, previous_module_output)) { + if (hasDeviatedFromCurrentPreviousModulePath(*local_planner_data, upstream_module_output)) { RCLCPP_DEBUG(getLogger(), "has deviated from current previous module path"); return false; } - if (hasPreviousModulePathShapeChanged(previous_module_output, last_previous_module_output)) { + if (hasPreviousModulePathShapeChanged( + upstream_module_output, original_upstream_module_output_)) { RCLCPP_DEBUG(getLogger(), "has previous module path shape changed"); return true; } if ( - hasDeviatedFromLastPreviousModulePath(*local_planner_data, last_previous_module_output) && + hasDeviatedFromLastPreviousModulePath( + *local_planner_data, original_upstream_module_output_) && current_state != PathDecisionState::DecisionKind::DECIDED) { RCLCPP_DEBUG(getLogger(), "has deviated from last previous module path"); return true; @@ -400,8 +401,8 @@ void LaneParkingPlanner::onTimer() // generate valid pull over path candidates and calculate closest start pose const auto current_lanes = utils::getExtendedCurrentLanes( - local_planner_data, parameters.backward_goal_search_length, - parameters.forward_goal_search_length, + local_planner_data, parameters_.backward_goal_search_length, + parameters_.forward_goal_search_length, /*forward_only_in_route*/ false); std::vector path_candidates{}; std::optional closest_start_pose{}; @@ -410,7 +411,7 @@ void LaneParkingPlanner::onTimer() const std::shared_ptr & planner, const GoalCandidate & goal_candidate) { const auto pull_over_path = planner->plan( - goal_candidate, path_candidates.size(), local_planner_data, previous_module_output); + goal_candidate, path_candidates.size(), local_planner_data, upstream_module_output); if (pull_over_path) { // calculate absolute maximum curvature of parking path(start pose to end pose) for path // priority @@ -428,13 +429,13 @@ void LaneParkingPlanner::onTimer() // todo: currently non centerline input path is supported only by shift pull over const bool is_center_line_input_path = goal_planner_utils::isReferencePath( - previous_module_output.reference_path, previous_module_output.path, 0.1); + upstream_module_output.reference_path, upstream_module_output.path, 0.1); RCLCPP_DEBUG( getLogger(), "the input path of pull over planner is center line: %d", is_center_line_input_path); // plan candidate paths and set them to the member variable - if (parameters.path_priority == "efficient_path") { + if (parameters_.path_priority == "efficient_path") { for (const auto & planner : pull_over_planners_) { // todo: temporary skip NON SHIFT planner when input path is not center line if (!is_center_line_input_path && planner->getPlannerType() != PullOverPlannerType::SHIFT) { @@ -444,7 +445,7 @@ void LaneParkingPlanner::onTimer() planCandidatePaths(planner, goal_candidate); } } - } else if (parameters.path_priority == "close_goal") { + } else if (parameters_.path_priority == "close_goal") { for (const auto & goal_candidate : goal_candidates) { for (const auto & planner : pull_over_planners_) { // todo: temporary skip NON SHIFT planner when input path is not center line @@ -457,14 +458,15 @@ void LaneParkingPlanner::onTimer() } else { RCLCPP_ERROR( getLogger(), "path_priority should be efficient_path or close_goal, but %s is given.", - parameters.path_priority.c_str()); + parameters_.path_priority.c_str()); throw std::domain_error("[pull_over] invalid path_priority"); } // set response { + original_upstream_module_output_ = upstream_module_output; std::lock_guard guard(mutex_); - response_.pull_over_path_candidates = path_candidates; + response_.pull_over_path_candidates = std::move(path_candidates); response_.closest_start_pose = closest_start_pose; RCLCPP_INFO( getLogger(), "generated %lu pull over path candidates", @@ -562,7 +564,7 @@ std::pair GoalPlannerModule::sync // In PlannerManager::run(), it calls SceneModuleInterface::setData and // SceneModuleInterface::setPreviousModuleOutput before module_ptr->run(). // Then module_ptr->run() invokes GoalPlannerModule::updateData and then - // planWaitingApproval()/plan(), so we can copy latest current_status/previous_module_output to + // planWaitingApproval()/plan(), so we can copy latest current_status/upstream_module_output to // lane_parking_request/freespace_parking_request std::optional pull_over_path = @@ -578,7 +580,7 @@ std::pair GoalPlannerModule::sync std::lock_guard guard(lane_parking_mutex_); if (!lane_parking_request_) { lane_parking_request_.emplace( - *parameters_, vehicle_footprint_, goal_candidates_, getPreviousModuleOutput()); + vehicle_footprint_, goal_candidates_, getPreviousModuleOutput()); } // NOTE: for the above reasons, PlannerManager/behavior_path_planner_node ensure that // planner_data_ is not nullptr, so it is OK to copy as value diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp index 0da5ab5dae38b..ad42ccf1582ab 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp @@ -43,7 +43,7 @@ BezierPullOver::BezierPullOver( std::optional BezierPullOver::plan( [[maybe_unused]] const GoalCandidate & modified_goal_pose, [[maybe_unused]] const size_t id, [[maybe_unused]] const std::shared_ptr planner_data, - [[maybe_unused]] const BehaviorModuleOutput & previous_module_output) + [[maybe_unused]] const BehaviorModuleOutput & upstream_module_output) { const auto & route_handler = planner_data->route_handler; const double min_jerk = parameters_.minimum_lateral_jerk; @@ -55,7 +55,7 @@ std::optional BezierPullOver::plan( std::abs(max_jerk - min_jerk) / shift_sampling_num; const auto road_lanes = utils::getExtendedCurrentLanesFromPath( - previous_module_output.path, planner_data, backward_search_length, forward_search_length, + upstream_module_output.path, planner_data, backward_search_length, forward_search_length, /*forward_only_in_route*/ false); const auto pull_over_lanes = goal_planner_utils::getPullOverLanes( @@ -67,7 +67,7 @@ std::optional BezierPullOver::plan( // find safe one from paths with different jerk for (double lateral_jerk = min_jerk; lateral_jerk <= max_jerk; lateral_jerk += jerk_resolution) { const auto pull_over_path = generateBezierPath( - modified_goal_pose, id, planner_data, previous_module_output, road_lanes, pull_over_lanes, + modified_goal_pose, id, planner_data, upstream_module_output, road_lanes, pull_over_lanes, lateral_jerk); if (!pull_over_path.empty()) { return pull_over_path.at(0); @@ -80,7 +80,7 @@ std::optional BezierPullOver::plan( std::vector BezierPullOver::plans( [[maybe_unused]] const GoalCandidate & modified_goal_pose, [[maybe_unused]] const size_t id, [[maybe_unused]] const std::shared_ptr planner_data, - [[maybe_unused]] const BehaviorModuleOutput & previous_module_output) + [[maybe_unused]] const BehaviorModuleOutput & upstream_module_output) { const auto & route_handler = planner_data->route_handler; const double min_jerk = parameters_.minimum_lateral_jerk; @@ -92,7 +92,7 @@ std::vector BezierPullOver::plans( std::abs(max_jerk - min_jerk) / shift_sampling_num; const auto road_lanes = utils::getExtendedCurrentLanesFromPath( - previous_module_output.path, planner_data, backward_search_length, forward_search_length, + upstream_module_output.path, planner_data, backward_search_length, forward_search_length, /*forward_only_in_route*/ false); const auto pull_over_lanes = goal_planner_utils::getPullOverLanes( @@ -105,7 +105,7 @@ std::vector BezierPullOver::plans( std::vector paths; for (double lateral_jerk = min_jerk; lateral_jerk <= max_jerk; lateral_jerk += jerk_resolution) { auto pull_over_paths = generateBezierPath( - modified_goal_pose, id, planner_data, previous_module_output, road_lanes, pull_over_lanes, + modified_goal_pose, id, planner_data, upstream_module_output, road_lanes, pull_over_lanes, lateral_jerk); std::copy( std::make_move_iterator(pull_over_paths.begin()), @@ -118,7 +118,7 @@ std::vector BezierPullOver::plans( std::vector BezierPullOver::generateBezierPath( const GoalCandidate & goal_candidate, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output, const lanelet::ConstLanelets & road_lanes, + const BehaviorModuleOutput & upstream_module_output, const lanelet::ConstLanelets & road_lanes, const lanelet::ConstLanelets & pull_over_lanes, const double lateral_jerk) const { const double pull_over_velocity = parameters_.pull_over_velocity; @@ -133,7 +133,7 @@ std::vector BezierPullOver::generateBezierPath( generateReferencePath(planner_data, road_lanes, shift_end_pose), parameters_.center_line_path_interval); const auto prev_module_path = utils::resamplePathWithSpline( - previous_module_output.path, parameters_.center_line_path_interval); + upstream_module_output.path, parameters_.center_line_path_interval); const auto prev_module_path_terminal_pose = prev_module_path.points.back().point.pose; // process previous module path for path shifter input path @@ -318,7 +318,7 @@ std::vector BezierPullOver::generateBezierPath( drivable_lanes, dp.drivable_area_left_bound_offset, dp.drivable_area_right_bound_offset, dp.drivable_area_types_to_skip); const auto combined_drivable = utils::combineDrivableLanes( - expanded_lanes, previous_module_output.drivable_area_info.drivable_lanes); + expanded_lanes, upstream_module_output.drivable_area_info.drivable_lanes); return !lane_departure_checker_.checkPathWillLeaveLane( utils::transformToLanelets(combined_drivable), pull_over_path.parking_path()); }); diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp index 5b11d1b170ce1..473f76b5904d6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp @@ -60,7 +60,7 @@ FreespacePullOver::FreespacePullOver( std::optional FreespacePullOver::plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - [[maybe_unused]] const BehaviorModuleOutput & previous_module_output) + [[maybe_unused]] const BehaviorModuleOutput & upstream_module_output) { const Pose & current_pose = planner_data->self_odometry->pose.pose; diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp index c0bac5c5ce2a8..74b3fe149fd1d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp @@ -40,7 +40,7 @@ GeometricPullOver::GeometricPullOver( std::optional GeometricPullOver::plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - [[maybe_unused]] const BehaviorModuleOutput & previous_module_output) + [[maybe_unused]] const BehaviorModuleOutput & upstream_module_output) { const auto & route_handler = planner_data->route_handler; diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp index edecfd733d3be..9a3e2d6b13db9 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp @@ -41,7 +41,7 @@ ShiftPullOver::ShiftPullOver( std::optional ShiftPullOver::plan( const GoalCandidate & modified_goal_pose, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output) + const BehaviorModuleOutput & upstream_module_output) { const auto & route_handler = planner_data->route_handler; const double min_jerk = parameters_.minimum_lateral_jerk; @@ -52,7 +52,7 @@ std::optional ShiftPullOver::plan( const double jerk_resolution = std::abs(max_jerk - min_jerk) / shift_sampling_num; const auto road_lanes = utils::getExtendedCurrentLanesFromPath( - previous_module_output.path, planner_data, backward_search_length, forward_search_length, + upstream_module_output.path, planner_data, backward_search_length, forward_search_length, /*forward_only_in_route*/ false); const auto pull_over_lanes = goal_planner_utils::getPullOverLanes( @@ -64,7 +64,7 @@ std::optional ShiftPullOver::plan( // find safe one from paths with different jerk for (double lateral_jerk = min_jerk; lateral_jerk <= max_jerk; lateral_jerk += jerk_resolution) { const auto pull_over_path = generatePullOverPath( - modified_goal_pose, id, planner_data, previous_module_output, road_lanes, pull_over_lanes, + modified_goal_pose, id, planner_data, upstream_module_output, road_lanes, pull_over_lanes, lateral_jerk); if (!pull_over_path) continue; return pull_over_path; @@ -134,7 +134,7 @@ std::optional ShiftPullOver::cropPrevModulePath( std::optional ShiftPullOver::generatePullOverPath( const GoalCandidate & goal_candidate, const size_t id, const std::shared_ptr planner_data, - const BehaviorModuleOutput & previous_module_output, const lanelet::ConstLanelets & road_lanes, + const BehaviorModuleOutput & upstream_module_output, const lanelet::ConstLanelets & road_lanes, const lanelet::ConstLanelets & pull_over_lanes, const double lateral_jerk) const { const double pull_over_velocity = parameters_.pull_over_velocity; @@ -151,7 +151,7 @@ std::optional ShiftPullOver::generatePullOverPath( generateReferencePath(planner_data, road_lanes, shift_end_pose), parameters_.center_line_path_interval); const auto prev_module_path = utils::resamplePathWithSpline( - previous_module_output.path, parameters_.center_line_path_interval); + upstream_module_output.path, parameters_.center_line_path_interval); const auto prev_module_path_terminal_pose = prev_module_path.points.back().point.pose; // process previous module path for path shifter input path diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/thread_data.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/thread_data.cpp index f12d510e23030..89458c199c130 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/thread_data.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/thread_data.cpp @@ -21,14 +21,13 @@ namespace autoware::behavior_path_planner void LaneParkingRequest::update( const PlannerData & planner_data, const ModuleStatus & current_status, - const BehaviorModuleOutput & previous_module_output, + const BehaviorModuleOutput & upstream_module_output, const std::optional & pull_over_path, const PathDecisionState & prev_data) { planner_data_ = std::make_shared(planner_data); planner_data_->route_handler = std::make_shared(*(planner_data.route_handler)); current_status_ = current_status; - last_previous_module_output_ = previous_module_output_; - previous_module_output_ = previous_module_output; + upstream_module_output_ = upstream_module_output; pull_over_path_ = pull_over_path; prev_data_ = prev_data; } From 33b9913a65cc8cfdb99a3e0d776421f430f66318 Mon Sep 17 00:00:00 2001 From: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> Date: Tue, 31 Dec 2024 23:09:05 +0900 Subject: [PATCH 020/127] ci: pass run condition to reusable workflow (#9771) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ryohsuke Mitsudome Co-authored-by: M. Fatih Cırıt --- .../actions/evaluate-job-result/action.yaml | 45 ------------ .../build-and-test-differential.yaml | 5 ++ .github/workflows/build-test-tidy-pr.yaml | 72 +++---------------- .../workflows/clang-tidy-differential.yaml | 5 ++ 4 files changed, 19 insertions(+), 108 deletions(-) delete mode 100644 .github/actions/evaluate-job-result/action.yaml diff --git a/.github/actions/evaluate-job-result/action.yaml b/.github/actions/evaluate-job-result/action.yaml deleted file mode 100644 index c5c013080fd27..0000000000000 --- a/.github/actions/evaluate-job-result/action.yaml +++ /dev/null @@ -1,45 +0,0 @@ -name: Evaluate Job Result -description: Evaluates the result of a job and updates the summary. -inputs: - job_result: - description: Result of the job to evaluate (e.g., success, failure, skipped) - required: true - type: string - job_name: - description: Name of the job to evaluate - required: true - type: string - expected_results: - description: Comma-separated list of acceptable results (e.g., success,skipped) - required: true - type: string -outputs: - failed: - description: Indicates if the job failed - value: ${{ steps.evaluate.outputs.failed }} - -runs: - using: composite - steps: - - name: Evaluate Job Result - id: evaluate - run: | - JOB_RESULT="${{ inputs.job_result }}" - IFS=',' read -ra EXPECTED <<< "${{ inputs.expected_results }}" - FAILED=false - - for RESULT in "${EXPECTED[@]}"; do - if [[ "$JOB_RESULT" == "$RESULT" ]]; then - echo "- **${{ inputs.job_name }}:** "$JOB_RESULT" ✅" >> "$GITHUB_STEP_SUMMARY" - echo "failed=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - done - - # If no expected result matched - echo "::error::${{ inputs.job_name }} failed. ❌" - echo "- **${{ inputs.job_name }}:** failed ❌" >> "$GITHUB_STEP_SUMMARY" - echo "failed=true" >> "$GITHUB_OUTPUT" - - exit 1 - shell: bash diff --git a/.github/workflows/build-and-test-differential.yaml b/.github/workflows/build-and-test-differential.yaml index 0925cb0f53930..c25f6b24c5e47 100644 --- a/.github/workflows/build-and-test-differential.yaml +++ b/.github/workflows/build-and-test-differential.yaml @@ -14,6 +14,10 @@ on: default: humble required: false type: string + run-condition: + default: true + required: false + type: boolean container-suffix: required: false default: "" @@ -28,6 +32,7 @@ env: jobs: build-and-test-differential: + if: ${{ inputs.run-condition }} runs-on: ${{ inputs.runner }} container: ${{ inputs.container }}${{ inputs.container-suffix }} steps: diff --git a/.github/workflows/build-test-tidy-pr.yaml b/.github/workflows/build-test-tidy-pr.yaml index d1ea9b2d0f79d..c0442694b5c77 100644 --- a/.github/workflows/build-test-tidy-pr.yaml +++ b/.github/workflows/build-test-tidy-pr.yaml @@ -40,98 +40,44 @@ jobs: shell: bash build-and-test-differential: + if: ${{ always() }} needs: - require-label uses: ./.github/workflows/build-and-test-differential.yaml with: container: ghcr.io/autowarefoundation/autoware:universe-devel + run-condition: ${{ needs.require-label.outputs.result == 'true' }} secrets: codecov-token: ${{ secrets.CODECOV_TOKEN }} build-and-test-differential-cuda: + if: ${{ always() }} needs: check-if-cuda-job-is-needed - if: ${{ needs.check-if-cuda-job-is-needed.outputs.cuda_job_is_needed == 'true' }} uses: ./.github/workflows/build-and-test-differential.yaml with: container: ghcr.io/autowarefoundation/autoware:universe-devel container-suffix: -cuda + run-condition: ${{ needs.check-if-cuda-job-is-needed.outputs.cuda_job_is_needed == 'true' }} secrets: codecov-token: ${{ secrets.CODECOV_TOKEN }} - build-test-pr: - needs: - - build-and-test-differential - - build-and-test-differential-cuda - if: ${{ always() }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Initialize Summary - run: echo "### Build Test PR Results" > $GITHUB_STEP_SUMMARY - shell: bash - - - name: Evaluate build-and-test-differential - uses: ./.github/actions/evaluate-job-result - with: - job_result: ${{ needs.build-and-test-differential.result }} - job_name: build-and-test-differential - expected_results: success - - - name: Evaluate build-and-test-differential-cuda - if: ${{ always() }} - uses: ./.github/actions/evaluate-job-result - with: - job_result: ${{ needs.build-and-test-differential-cuda.result }} - job_name: build-and-test-differential-cuda - expected_results: success,skipped - clang-tidy-differential: + if: ${{ always() }} # always run to provide report for status check needs: - check-if-cuda-job-is-needed - build-and-test-differential - if: ${{ needs.check-if-cuda-job-is-needed.outputs.cuda_job_is_needed == 'false' }} uses: ./.github/workflows/clang-tidy-differential.yaml with: container: ghcr.io/autowarefoundation/autoware:universe-devel + run-condition: ${{ needs.check-if-cuda-job-is-needed.outputs.cuda_job_is_needed == 'false' && needs.build-and-test-differential.result == 'success' }} clang-tidy-differential-cuda: + if: ${{ always() }} # always run to provide report for status check needs: + - check-if-cuda-job-is-needed - build-and-test-differential-cuda uses: ./.github/workflows/clang-tidy-differential.yaml with: container: ghcr.io/autowarefoundation/autoware:universe-devel container-suffix: -cuda - - clang-tidy-pr: - needs: - - clang-tidy-differential - - clang-tidy-differential-cuda - if: ${{ always() }} - runs-on: ubuntu-latest - steps: - - name: Initialize Summary - run: echo "### Clang Tidy PR Results" > $GITHUB_STEP_SUMMARY - shell: bash - - - name: Check clang-tidy success - if: ${{ needs.clang-tidy-differential.result == 'success' || needs.clang-tidy-differential-cuda.result == 'success' }} - run: | - echo "✅ Either one of the following has succeeded:" >> $GITHUB_STEP_SUMMARY - - - name: Fail if conditions not met - if: ${{ !(needs.clang-tidy-differential.result == 'success' || needs.clang-tidy-differential-cuda.result == 'success') }} - run: | - echo "::error::❌ Either one of the following should have succeeded:" - echo "::error::clang-tidy-differential: ${{ needs.clang-tidy-differential.result }}" - echo "::error::clang-tidy-differential-cuda: ${{ needs.clang-tidy-differential-cuda.result }}" - - echo "❌ Either one of the following should have succeeded:" >> $GITHUB_STEP_SUMMARY - - exit 1 - - - name: Print the results - if: ${{ always() }} - run: | - echo "- **clang-tidy-differential:** ${{ needs.clang-tidy-differential.result }}" >> $GITHUB_STEP_SUMMARY - echo "- **clang-tidy-differential-cuda:** ${{ needs.clang-tidy-differential-cuda.result }}" >> $GITHUB_STEP_SUMMARY + run-condition: ${{ needs.check-if-cuda-job-is-needed.outputs.cuda_job_is_needed == 'true' && needs.build-and-test-differential-cuda.result == 'success' }} diff --git a/.github/workflows/clang-tidy-differential.yaml b/.github/workflows/clang-tidy-differential.yaml index 51e0a8408468c..41d722c8e07b0 100644 --- a/.github/workflows/clang-tidy-differential.yaml +++ b/.github/workflows/clang-tidy-differential.yaml @@ -14,9 +14,14 @@ on: default: ubuntu-24.04 required: false type: string + run-condition: + default: true + required: false + type: boolean jobs: clang-tidy-differential: + if: ${{ inputs.run-condition }} runs-on: ${{ inputs.runner }} container: ${{ inputs.container }}${{ inputs.container-suffix }} steps: From 77c1a3f02a4cc5afece9ac701193f24de7af3755 Mon Sep 17 00:00:00 2001 From: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Date: Tue, 31 Dec 2024 23:26:19 +0900 Subject: [PATCH 021/127] fix(planning): corrects minor typos (#9809) Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> --- planning/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/planning/README.md b/planning/README.md index ccf8288df3911..3fadafe54ed4c 100644 --- a/planning/README.md +++ b/planning/README.md @@ -18,7 +18,7 @@ Enabling and disabling modules involves managing settings in key configuration a ### Key Files for Configuration -The `default_preset.yaml` file acts as the primary configuration file, where planning modules can be disable or enabled. Furthermore, users can also set the type of motion planner across various motion planners. For example: +The `default_preset.yaml` file acts as the primary configuration file, where planning modules can be disabled or enabled. Furthermore, users can also set the type of motion planner across various motion planners. For example: - `launch_avoidance_module`: Set to `true` to enable the avoidance module, or `false` to disable it. - `motion_stop_planner_type`: Set `default` to either `obstacle_stop_planner` or `obstacle_cruise_planner`. @@ -35,7 +35,7 @@ The [launch files](https://github.com/autowarefoundation/autoware.universe/tree/ corresponds to launch_avoidance_module from `default_preset.yaml`. -### Parameters configuration +### Parameter Configuration There are multiple parameters available for configuration, and users have the option to modify them in [here](https://github.com/autowarefoundation/autoware_launch/tree/main/autoware_launch/config/planning). It's important to note that not all parameters are adjustable via `rqt_reconfigure`. To ensure the changes are effective, modify the parameters and then restart Autoware. Additionally, detailed information about each parameter is available in the corresponding documents under the planning tab. @@ -43,7 +43,7 @@ There are multiple parameters available for configuration, and users have the op This guide outlines the steps for integrating your custom module into Autoware: -- Add your modules to the `default_preset.yaml` file. For example +- Add your modules to the `default_preset.yaml` file. For example: ```yaml - arg: @@ -51,7 +51,7 @@ This guide outlines the steps for integrating your custom module into Autoware: default: "true" ``` -- Incorporate your modules into the [launcher](https://github.com/autowarefoundation/autoware.universe/tree/main/launch/tier4_planning_launch/launch/scenario_planning). For example in [behavior_planning.launch.xml](https://github.com/autowarefoundation/autoware.universe/blob/main/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml): +- Incorporate your modules into the [launcher](https://github.com/autowarefoundation/autoware.universe/tree/main/launch/tier4_planning_launch/launch/scenario_planning). For example, in [behavior_planning.launch.xml](https://github.com/autowarefoundation/autoware.universe/blob/main/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml): ```xml @@ -63,14 +63,14 @@ This guide outlines the steps for integrating your custom module into Autoware: /> ``` -- If applicable, place your parameter folder within the appropriate existing parameter folder. For example [intersection_module's parameters](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/intersection.param.yaml) is in [behavior_velocity_planner](https://github.com/autowarefoundation/autoware_launch/tree/main/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner). -- Insert the path of your parameters in the [tier4_planning_component.launch.xml](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/launch/components/tier4_planning_component.launch.xml). For example `behavior_velocity_planner_intersection_module_param_path` is used. +- If applicable, place your parameter folder within the appropriate existing parameter folder. For example, [intersection_module's parameters](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/intersection.param.yaml) are in [behavior_velocity_planner](https://github.com/autowarefoundation/autoware_launch/tree/main/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner). +- Insert the path of your parameters in the [tier4_planning_component.launch.xml](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/launch/components/tier4_planning_component.launch.xml). For example, `behavior_velocity_planner_intersection_module_param_path` is used. ```xml ``` -- Define your parameter path variable within the corresponding launcher. For example in [behavior_planning.launch.xml](https://github.com/autowarefoundation/autoware.universe/blob/04aa54bf5fb0c88e70198ca74b9ac343cc3457bf/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml#L191) +- Define your parameter path variable within the corresponding launcher. For example, in [behavior_planning.launch.xml](https://github.com/autowarefoundation/autoware.universe/blob/04aa54bf5fb0c88e70198ca74b9ac343cc3457bf/launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml#L191) ```xml @@ -82,7 +82,7 @@ This guide outlines the steps for integrating your custom module into Autoware: ## Join Our Community-Driven Effort -Autoware thrives on community collaboration. Every contribution, big or small, is invaluable to us. Whether it's reporting bugs, suggesting improvements, offering new ideas, or anything else you can think of – we welcome it all with open arms. +Autoware thrives on community collaboration. Every contribution, big or small, is invaluable to us. Whether it's reporting bugs, suggesting improvements, offering new ideas, or anything else you can think of – we welcome all contributions with open arms. ### How to Contribute? @@ -105,7 +105,7 @@ Interested in joining our meetings? We’d love to have you! For more informatio Occasionally, we publish papers specific to the Planning Component in Autoware. We encourage you to explore these publications and find valuable insights for your work. If you find them useful and incorporate any of our methodologies or algorithms in your projects, citing our papers would be immensely helpful. This support allows us to reach a broader audience and continue contributing to the field. -If you use the Jerk Constrained Velocity Planning algorithm in [Motion Velocity Smoother](./autoware_velocity_smoother/README.md) module in the Planning Component, we kindly request you to cite the relevant paper. +If you use the Jerk Constrained Velocity Planning algorithm in the [Motion Velocity Smoother](./autoware_velocity_smoother/README.md) module in the Planning Component, we kindly request you cite the relevant paper. From a32cae1d4547290d9e4c3bb9b86480bfc373459d Mon Sep 17 00:00:00 2001 From: "awf-autoware-bot[bot]" <94889083+awf-autoware-bot[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:12:43 +0000 Subject: [PATCH 022/127] chore: sync files (#9825) Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions --- .pre-commit-config-optional.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.pre-commit-config-optional.yaml b/.pre-commit-config-optional.yaml index ff325af5e8774..f0b5bdba2d24d 100644 --- a/.pre-commit-config-optional.yaml +++ b/.pre-commit-config-optional.yaml @@ -2,6 +2,13 @@ # https://github.com/autowarefoundation/sync-file-templates # To make changes, update the source repository and follow the guidelines in its README. +# https://pre-commit.ci/#configuration +ci: + autofix_commit_msg: "style(pre-commit-optional): autofix" + # we already have our own daily update mechanism, we set this to quarterly + autoupdate_schedule: quarterly + autoupdate_commit_msg: "ci(pre-commit-optional): quarterly autoupdate" + repos: - repo: https://github.com/tcort/markdown-link-check rev: v3.12.2 From 176e2e31a4f1b89a6ad4b6e4af5a04c3cc4ba4c3 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Mon, 6 Jan 2025 11:25:20 +0900 Subject: [PATCH 023/127] feat(behavior_velocity_modules): add node test (#9790) * feat(behavior_velocity_crosswalk): add node test Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * feat(behavior_velocity_xxx_module): add node test Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * change directory tests -> test Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../CMakeLists.txt | 10 +++ .../package.xml | 2 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../CMakeLists.txt | 1 + .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../CMakeLists.txt | 1 + .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../CMakeLists.txt | 1 + .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../CMakeLists.txt | 17 ----- .../behavior_velocity_planner/node.hpp | 16 ++--- .../package.xml | 7 +- .../src/node.cpp | 16 ++--- .../srv/LoadPlugin.srv | 3 - .../srv/UnloadPlugin.srv | 3 - .../CMakeLists.txt | 9 +-- .../package.xml | 1 + .../{tests => test}/test_dynamic_obstacle.cpp | 0 .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../{tests => test}/test_path_utils.cpp | 0 .../{tests => test}/test_state_machine.cpp | 0 .../{tests => test}/test_utils.cpp | 0 .../CMakeLists.txt | 1 + .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../CMakeLists.txt | 1 + .../package.xml | 1 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ .../package.xml | 1 + .../test/test_node_interface.cpp | 65 +++++++++++++++++++ .../CMakeLists.txt | 10 +++ .../package.xml | 2 + .../test/test_node_interface.cpp | 64 ++++++++++++++++++ 38 files changed, 699 insertions(+), 50 deletions(-) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/test/test_node_interface.cpp delete mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/LoadPlugin.srv delete mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/UnloadPlugin.srv rename planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/{tests => test}/test_dynamic_obstacle.cpp (100%) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_node_interface.cpp rename planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/{tests => test}/test_path_utils.cpp (100%) rename planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/{tests => test}/test_state_machine.cpp (100%) rename planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/{tests => test}/test_utils.cpp (100%) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/test/test_node_interface.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt index b4a688d711221..b28e486c9be05 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt @@ -13,4 +13,14 @@ ament_auto_add_library(${PROJECT_NAME} SHARED src/util.cpp ) +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() + file(GLOB_RECURSE TEST_SOURCES test/*.cpp) + ament_add_ros_isolated_gtest(test_${PROJECT_NAME} + ${TEST_SOURCES} + ) + target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) +endif() + ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml index 9739370387df7..8c34678f439ed 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml @@ -17,6 +17,7 @@ ament_cmake_auto autoware_cmake + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension @@ -32,6 +33,7 @@ tier4_planning_msgs visualization_msgs + ament_cmake_ros ament_lint_auto autoware_lint_common diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..e0ceca4e12951 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "blind_spot", "autoware::behavior_velocity_planner::BlindSpotModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/CMakeLists.txt index 10b694ce22cbd..3a429008c1b8e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/CMakeLists.txt @@ -15,6 +15,7 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_crosswalk.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) endif() diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml index ff01e85aa5456..1f0e9e68a65c6 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/package.xml @@ -21,6 +21,7 @@ autoware_cmake eigen3_cmake_module + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_behavior_velocity_rtc_interface autoware_grid_map_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..7a875327d4dde --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "crosswalk", "autoware::behavior_velocity_planner::CrosswalkModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/CMakeLists.txt index 3aff4a524ffdd..53eafaffbba6c 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/CMakeLists.txt @@ -14,6 +14,7 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_utils.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) endif() diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml index ff91cf40a32a6..4ae1d20991078 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/package.xml @@ -17,6 +17,7 @@ autoware_cmake eigen3_cmake_module + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_lanelet2_extension autoware_motion_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..f84d22debea8e --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "detection_area", "autoware::behavior_velocity_planner::DetectionAreaModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml index 208e7ed49de71..4f7c3aeea7618 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/package.xml @@ -19,6 +19,7 @@ ament_cmake_auto autoware_cmake + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_behavior_velocity_rtc_interface autoware_internal_debug_msgs diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..b515107e0ae8e --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "intersection", "autoware::behavior_velocity_planner::IntersectionModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/CMakeLists.txt index b710924410549..e6b362271afb3 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/CMakeLists.txt @@ -14,6 +14,7 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_utils.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) endif() diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml index 4415eadef62c7..28677bfb80b15 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/package.xml @@ -17,6 +17,7 @@ ament_cmake_auto autoware_cmake + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_behavior_velocity_rtc_interface autoware_interpolation diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..875e757cbfcec --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "no_stopping_area", "autoware::behavior_velocity_planner::NoStoppingAreaModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt index 31900a23d00e5..a520b02a43c05 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/CMakeLists.txt @@ -2,14 +2,6 @@ cmake_minimum_required(VERSION 3.14) project(autoware_behavior_velocity_planner) find_package(autoware_cmake REQUIRED) -find_package(rosidl_default_generators REQUIRED) - -rosidl_generate_interfaces( - ${PROJECT_NAME} - "srv/LoadPlugin.srv" - "srv/UnloadPlugin.srv" - DEPENDENCIES -) autoware_package() @@ -24,15 +16,6 @@ rclcpp_components_register_node(${PROJECT_NAME}_lib EXECUTABLE ${PROJECT_NAME}_node ) -if(${rosidl_cmake_VERSION} VERSION_LESS 2.5.0) - rosidl_target_interfaces(${PROJECT_NAME}_lib - ${PROJECT_NAME} "rosidl_typesupport_cpp") -else() - rosidl_get_typesupport_target( - cpp_typesupport_target ${PROJECT_NAME} "rosidl_typesupport_cpp") - target_link_libraries(${PROJECT_NAME}_lib "${cpp_typesupport_target}") -endif() - if(BUILD_TESTING) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_node_interface.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp index 4c1f10c355226..8a52ae70231d0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp @@ -21,10 +21,9 @@ #include #include -#include -#include #include +#include #include #include #include @@ -45,8 +44,6 @@ namespace autoware::behavior_velocity_planner { -using autoware_behavior_velocity_planner::srv::LoadPlugin; -using autoware_behavior_velocity_planner::srv::UnloadPlugin; using autoware_map_msgs::msg::LaneletMapBin; using tier4_planning_msgs::msg::VelocityLimit; @@ -125,13 +122,14 @@ class BehaviorVelocityPlannerNode : public rclcpp::Node BehaviorVelocityPlannerManager planner_manager_; bool is_driving_forward_{true}; - rclcpp::Service::SharedPtr srv_load_plugin_; - rclcpp::Service::SharedPtr srv_unload_plugin_; + rclcpp::Service::SharedPtr srv_load_plugin_; + rclcpp::Service::SharedPtr srv_unload_plugin_; void onUnloadPlugin( - const UnloadPlugin::Request::SharedPtr request, - const UnloadPlugin::Response::SharedPtr response); + const autoware_internal_debug_msgs::srv::String::Request::SharedPtr request, + const autoware_internal_debug_msgs::srv::String::Response::SharedPtr response); void onLoadPlugin( - const LoadPlugin::Request::SharedPtr request, const LoadPlugin::Response::SharedPtr response); + const autoware_internal_debug_msgs::srv::String::Request::SharedPtr request, + const autoware_internal_debug_msgs::srv::String::Response::SharedPtr response); // mutex for planner_data_ std::mutex mutex_; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml index 04b4cf0328fd1..eca49a09c8a56 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml @@ -32,9 +32,8 @@ autoware_cmake eigen3_cmake_module - rosidl_default_generators - autoware_behavior_velocity_planner_common + autoware_internal_debug_msgs autoware_lanelet2_extension autoware_map_msgs autoware_motion_utils @@ -60,15 +59,11 @@ tier4_v2x_msgs visualization_msgs - rosidl_default_runtime - ament_cmake_ros ament_lint_auto autoware_lint_common - rosidl_interface_packages - ament_cmake diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp index 5f78e4c670b49..1e3e691076b8a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp @@ -70,9 +70,9 @@ BehaviorVelocityPlannerNode::BehaviorVelocityPlannerNode(const rclcpp::NodeOptio this->create_subscription( "~/input/path_with_lane_id", 1, std::bind(&BehaviorVelocityPlannerNode::onTrigger, this, _1)); - srv_load_plugin_ = create_service( + srv_load_plugin_ = create_service( "~/service/load_plugin", std::bind(&BehaviorVelocityPlannerNode::onLoadPlugin, this, _1, _2)); - srv_unload_plugin_ = create_service( + srv_unload_plugin_ = create_service( "~/service/unload_plugin", std::bind(&BehaviorVelocityPlannerNode::onUnloadPlugin, this, _1, _2)); @@ -112,19 +112,19 @@ BehaviorVelocityPlannerNode::BehaviorVelocityPlannerNode(const rclcpp::NodeOptio } void BehaviorVelocityPlannerNode::onLoadPlugin( - const LoadPlugin::Request::SharedPtr request, - [[maybe_unused]] const LoadPlugin::Response::SharedPtr response) + const autoware_internal_debug_msgs::srv::String::Request::SharedPtr request, + [[maybe_unused]] const autoware_internal_debug_msgs::srv::String::Response::SharedPtr response) { std::unique_lock lk(mutex_); - planner_manager_.launchScenePlugin(*this, request->plugin_name); + planner_manager_.launchScenePlugin(*this, request->data); } void BehaviorVelocityPlannerNode::onUnloadPlugin( - const UnloadPlugin::Request::SharedPtr request, - [[maybe_unused]] const UnloadPlugin::Response::SharedPtr response) + const autoware_internal_debug_msgs::srv::String::Request::SharedPtr request, + [[maybe_unused]] const autoware_internal_debug_msgs::srv::String::Response::SharedPtr response) { std::unique_lock lk(mutex_); - planner_manager_.removeScenePlugin(*this, request->plugin_name); + planner_manager_.removeScenePlugin(*this, request->data); } void BehaviorVelocityPlannerNode::onParam() diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/LoadPlugin.srv b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/LoadPlugin.srv deleted file mode 100644 index 7b9f08ab0ded8..0000000000000 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/LoadPlugin.srv +++ /dev/null @@ -1,3 +0,0 @@ -string plugin_name ---- -bool success diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/UnloadPlugin.srv b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/UnloadPlugin.srv deleted file mode 100644 index 7b9f08ab0ded8..0000000000000 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/srv/UnloadPlugin.srv +++ /dev/null @@ -1,3 +0,0 @@ -string plugin_name ---- -bool success diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/CMakeLists.txt index da2f4ce33ff60..a2f35ada11b5e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/CMakeLists.txt @@ -17,10 +17,11 @@ ament_auto_add_library(${PROJECT_NAME} SHARED if(BUILD_TESTING) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} - tests/test_dynamic_obstacle.cpp - tests/test_path_utils.cpp - tests/test_utils.cpp - tests/test_state_machine.cpp + test/test_dynamic_obstacle.cpp + test/test_path_utils.cpp + test/test_utils.cpp + test/test_state_machine.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} autoware_behavior_velocity_run_out_module diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/package.xml index b3ced8b2e9b9f..18db8281356f8 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/package.xml @@ -20,6 +20,7 @@ eigen3_cmake_module autoware_behavior_velocity_crosswalk_module + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_internal_debug_msgs autoware_motion_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_dynamic_obstacle.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_dynamic_obstacle.cpp similarity index 100% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_dynamic_obstacle.cpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_dynamic_obstacle.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..75bf59751ed44 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "run_out", "autoware::behavior_velocity_planner::RunOutModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_path_utils.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_path_utils.cpp similarity index 100% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_path_utils.cpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_path_utils.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_state_machine.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_state_machine.cpp similarity index 100% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_state_machine.cpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_state_machine.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_utils.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_utils.cpp similarity index 100% rename from planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/tests/test_utils.cpp rename to planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/test/test_utils.cpp diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/CMakeLists.txt index f4528f0d13cf4..a187b4cda9459 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/CMakeLists.txt @@ -14,6 +14,7 @@ ament_auto_add_library(${PROJECT_NAME} SHARED if(BUILD_TESTING) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_scene.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} gtest_main diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/package.xml index fd4b9f83ae998..849ab3915c649 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/package.xml @@ -20,6 +20,7 @@ autoware_cmake eigen3_cmake_module + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_lanelet2_extension autoware_motion_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..c6d6ff638cfbb --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "stop_line", "autoware::behavior_velocity_planner::StopLineModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/CMakeLists.txt index 6370dd5e6c21d..02ed192459970 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/CMakeLists.txt @@ -15,6 +15,7 @@ ament_auto_add_library(${PROJECT_NAME} SHARED if(BUILD_TESTING) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} test/test_utils.cpp + test/test_node_interface.cpp ) target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME} diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml index ebc45d372f92d..4bc7a15cddc48 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/package.xml @@ -19,6 +19,7 @@ eigen3_cmake_module autoware_adapi_v1_msgs + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_behavior_velocity_rtc_interface autoware_lanelet2_extension diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..e24c2dab5dab9 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "traffic_light", "autoware::behavior_velocity_planner::TrafficLightModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/package.xml index 6d3bc68242d7c..056f84a970c58 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/package.xml @@ -18,6 +18,7 @@ autoware_cmake autoware_adapi_v1_msgs + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_lanelet2_extension autoware_motion_utils diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..9cb6bbfd40639 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp @@ -0,0 +1,65 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "virtual_traffic_light", + "autoware::behavior_velocity_planner::VirtualTrafficLightModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/CMakeLists.txt index 11504d9c8999c..8b11fdce7283e 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/CMakeLists.txt @@ -11,4 +11,14 @@ ament_auto_add_library(${PROJECT_NAME} SHARED src/scene_walkway.cpp ) +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + ament_lint_auto_find_test_dependencies() + file(GLOB_RECURSE TEST_SOURCES test/*.cpp) + ament_add_ros_isolated_gtest(test_${PROJECT_NAME} + ${TEST_SOURCES} + ) + target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) +endif() + ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/package.xml index 5f1aea22855a4..857d9b524beb0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/package.xml @@ -18,6 +18,7 @@ autoware_cmake autoware_behavior_velocity_crosswalk_module + autoware_behavior_velocity_planner autoware_behavior_velocity_planner_common autoware_lanelet2_extension autoware_motion_utils @@ -31,6 +32,7 @@ rclcpp visualization_msgs + ament_cmake_ros ament_lint_auto autoware_lint_common diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/test/test_node_interface.cpp new file mode 100644 index 0000000000000..e0b7fa5c31965 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/test/test_node_interface.cpp @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +#include + +#include + +#include +#include +#include +#include + +namespace autoware::behavior_velocity_planner +{ +TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) +{ + rclcpp::init(0, nullptr); + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test with nominal path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + // test with empty path_with_lane_id + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithAbnormalPathWithLaneId(test_target_node)); + rclcpp::shutdown(); +} + +TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) +{ + rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "walkway", "autoware::behavior_velocity_planner::WalkwayModulePlugin"}}; + + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); + autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + + // test for normal trajectory + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); + + // make sure behavior_path_planner is running + EXPECT_GE(test_manager->getReceivedTopicNum(), 1); + + ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testOffTrackFromPathWithLaneId(test_target_node)); + + rclcpp::shutdown(); +} +} // namespace autoware::behavior_velocity_planner From a8a843a6cf7645a125658bdeb8785bd9d5fa71ac Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:59:04 +0900 Subject: [PATCH 024/127] fix(simple_planning_simulator): fix bugprone-branch-clone (#9725) * fix: bugprone-error Signed-off-by: kobayu858 * fix: build error Signed-off-by: kobayu858 --------- Signed-off-by: kobayu858 --- .../simple_planning_simulator_core.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/simulator/simple_planning_simulator/src/simple_planning_simulator/simple_planning_simulator_core.cpp b/simulator/simple_planning_simulator/src/simple_planning_simulator/simple_planning_simulator_core.cpp index d61654c32af02..8c95e144b3f8d 100644 --- a/simulator/simple_planning_simulator/src/simple_planning_simulator/simple_planning_simulator_core.cpp +++ b/simulator/simple_planning_simulator/src/simple_planning_simulator/simple_planning_simulator_core.cpp @@ -585,9 +585,7 @@ void SimplePlanningSimulator::set_input(const InputCommand & cmd, const double a std::visit( [this, acc_by_slope](auto && arg) { using T = std::decay_t; - if constexpr (std::is_same_v) { - set_input(arg, acc_by_slope); - } else if constexpr (std::is_same_v) { + if constexpr (std::is_same_v || std::is_same_v) { set_input(arg, acc_by_slope); } else { throw std::invalid_argument("Invalid input command type"); @@ -640,7 +638,7 @@ void SimplePlanningSimulator::set_input(const Control & cmd, const double acc_by input << vel, steer; } else if ( // NOLINT vehicle_model_type_ == VehicleModelType::IDEAL_STEER_ACC || - vehicle_model_type_ == VehicleModelType::DELAY_STEER_ACC) { + vehicle_model_type_ == VehicleModelType::DELAY_STEER_ACC) { // NOLINT input << combined_acc, steer; } else if ( // NOLINT vehicle_model_type_ == VehicleModelType::IDEAL_STEER_ACC_GEARED || From 4a181d6a6d09071a22a99ce71a4ad2c3d18c827e Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:23:41 +0900 Subject: [PATCH 025/127] fix(autoware_behavior_velocity_occlusion_spot_module): fix bugprone-macro-parentheses (#9712) * fix: bugprone-error Signed-off-by: kobayu858 * fix: fmt Signed-off-by: kobayu858 --------- Signed-off-by: kobayu858 --- .../src/scene_occlusion_spot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp index 522e83390b0f1..c5d1cf61614b2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp @@ -36,7 +36,7 @@ // turn on only when debugging. #define DEBUG_PRINT(enable, n, x) \ if (enable) { \ - const std::string time_msg = n + std::to_string(x); \ + const std::string time_msg = (n) + std::to_string(x); \ RCLCPP_INFO_STREAM_THROTTLE(logger_, *clock_, 3000, time_msg); \ } From ca2d4e7774abe3a8929fecbcfd17c2f1bb7da55f Mon Sep 17 00:00:00 2001 From: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> Date: Mon, 6 Jan 2025 16:40:09 +0900 Subject: [PATCH 026/127] fix(autoware_carla_interface): fix lidar topic name (#9645) Signed-off-by: Maxime CLEMENT --- .../src/autoware_carla_interface/carla_ros.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulator/autoware_carla_interface/src/autoware_carla_interface/carla_ros.py b/simulator/autoware_carla_interface/src/autoware_carla_interface/carla_ros.py index a4f8dee7af1a0..9b978b66feefb 100644 --- a/simulator/autoware_carla_interface/src/autoware_carla_interface/carla_ros.py +++ b/simulator/autoware_carla_interface/src/autoware_carla_interface/carla_ros.py @@ -147,7 +147,7 @@ def __init__(self): elif sensor["type"] == "sensor.lidar.ray_cast": if sensor["id"] in self.sensor_frequencies: self.pub_lidar[sensor["id"]] = self.ros2_node.create_publisher( - PointCloud2, f'/sensing/lidar/{sensor["id"]}/pointcloud', 10 + PointCloud2, f'/sensing/lidar/{sensor["id"]}/pointcloud_before_sync', 10 ) else: self.ros2_node.get_logger().info( From d86c46a35882e75051a0abcba55853da78c1d21f Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Mon, 6 Jan 2025 17:42:32 +0900 Subject: [PATCH 027/127] feat(motion_velocity_planner): introduce Object/Pointcloud structure in PlannerData (#9812) * feat: new object/pointcloud struct in motion velocity planner Signed-off-by: Takayuki Murooka * update planner_data Signed-off-by: Takayuki Murooka * modify modules Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../src/dynamic_obstacle_stop_module.cpp | 2 +- .../src/object_filtering.cpp | 20 +++--- .../src/object_filtering.hpp | 4 +- .../test/test_object_filtering.cpp | 6 +- .../src/obstacle_velocity_limiter.cpp | 2 +- .../src/obstacle_velocity_limiter.hpp | 2 +- .../src/obstacle_velocity_limiter_module.cpp | 6 +- .../src/obstacles.cpp | 14 ++-- .../src/obstacles.hpp | 4 +- .../test/test_collision_distance.cpp | 9 ++- .../src/filter_predicted_objects.cpp | 25 +++---- .../planner_data.hpp | 66 ++++++++++++++++++- .../src/node.cpp | 5 +- 13 files changed, 121 insertions(+), 44 deletions(-) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp index 40aa985ee42e2..7fd5834ba2cfa 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp @@ -131,7 +131,7 @@ VelocityPlanningResult DynamicObstacleStopModule::plan( ? 0.0 : params_.hysteresis; const auto dynamic_obstacles = dynamic_obstacle_stop::filter_predicted_objects( - planner_data->predicted_objects, ego_data, params_, hysteresis); + planner_data->objects, ego_data, params_, hysteresis); const auto preprocessing_duration_us = stopwatch.toc("preprocessing"); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp index 2ab3c09e64edd..0726fdba02de0 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.cpp @@ -96,20 +96,22 @@ bool is_unavoidable( }; std::vector filter_predicted_objects( - const autoware_perception_msgs::msg::PredictedObjects & objects, const EgoData & ego_data, + const std::vector & objects, const EgoData & ego_data, const PlannerParam & params, const double hysteresis) { std::vector filtered_objects; - for (const auto & object : objects.objects) { - const auto is_not_too_slow = object.kinematics.initial_twist_with_covariance.twist.linear.x >= - params.minimum_object_velocity; + for (const auto & object : objects) { + const auto & predicted_object = object.predicted_object; + const auto is_not_too_slow = + predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x >= + params.minimum_object_velocity; if ( - is_vehicle(object) && is_not_too_slow && - is_in_range(object, ego_data.trajectory, params, hysteresis) && - is_not_too_close(object, ego_data, params.ego_longitudinal_offset) && + is_vehicle(predicted_object) && is_not_too_slow && + is_in_range(predicted_object, ego_data.trajectory, params, hysteresis) && + is_not_too_close(predicted_object, ego_data, params.ego_longitudinal_offset) && (!params.ignore_unavoidable_collisions || - !is_unavoidable(object, ego_data.pose, ego_data.earliest_stop_pose, params))) - filtered_objects.push_back(object); + !is_unavoidable(predicted_object, ego_data.pose, ego_data.earliest_stop_pose, params))) + filtered_objects.push_back(predicted_object); } return filtered_objects; } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp index d20d6354066c6..6024cde019489 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/object_filtering.hpp @@ -17,6 +17,8 @@ #include "types.hpp" +#include + #include #include @@ -74,7 +76,7 @@ bool is_unavoidable( /// @param hysteresis [m] extra distance threshold used for filtering /// @return filtered predicted objects std::vector filter_predicted_objects( - const autoware_perception_msgs::msg::PredictedObjects & objects, const EgoData & ego_data, + const std::vector & objects, const EgoData & ego_data, const PlannerParam & params, const double hysteresis); } // namespace autoware::motion_velocity_planner::dynamic_obstacle_stop diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp index 3fa179903c23f..5993f81c7a8f1 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/test/test_object_filtering.cpp @@ -14,6 +14,7 @@ #include "../src/object_filtering.hpp" +#include #include #include @@ -26,6 +27,8 @@ #include #include +#include + TEST(TestObjectFiltering, isVehicle) { using autoware::motion_velocity_planner::dynamic_obstacle_stop::is_vehicle; @@ -202,8 +205,7 @@ TEST(TestObjectFiltering, isUnavoidable) TEST(TestObjectFiltering, filterPredictedObjects) { using autoware::motion_velocity_planner::dynamic_obstacle_stop::filter_predicted_objects; - autoware_perception_msgs::msg::PredictedObjects objects; - autoware_perception_msgs::msg::PredictedObject object; + std::vector objects; autoware::motion_velocity_planner::dynamic_obstacle_stop::EgoData ego_data; autoware::motion_velocity_planner::dynamic_obstacle_stop::PlannerParam params; double hysteresis{}; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp index e501b756af6a1..9be7f52bca99a 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.cpp @@ -29,7 +29,7 @@ namespace autoware::motion_velocity_planner::obstacle_velocity_limiter { multi_polygon_t createPolygonMasks( - const autoware_perception_msgs::msg::PredictedObjects & dynamic_obstacles, const double buffer, + const std::vector & dynamic_obstacles, const double buffer, const double min_vel) { return createObjectPolygons(dynamic_obstacles, buffer, min_vel); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp index d7d2de63b33f8..b0cdb1f802e0f 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter.hpp @@ -56,7 +56,7 @@ void calculateSteeringAngles(TrajectoryPoints & trajectory, const double wheel_b /// @param[in] min_vel minimum velocity for an object to be masked /// @return polygon masks around dynamic objects multi_polygon_t createPolygonMasks( - const autoware_perception_msgs::msg::PredictedObjects & dynamic_obstacles, const double buffer, + const std::vector & dynamic_obstacles, const double buffer, const double min_vel); /// @brief create footprint polygons from projection lines diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp index 532cc834c19ac..1923f023552e3 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp @@ -170,7 +170,7 @@ VelocityPlanningResult ObstacleVelocityLimiterModule::plan( const auto preprocessing_us = stopwatch.toc("preprocessing"); stopwatch.tic("obstacles"); obstacle_masks.negative_masks = obstacle_velocity_limiter::createPolygonMasks( - planner_data->predicted_objects, obstacle_params_.dynamic_obstacles_buffer, + planner_data->objects, obstacle_params_.dynamic_obstacles_buffer, obstacle_params_.dynamic_obstacles_min_vel); if (obstacle_params_.ignore_on_path) obstacle_masks.negative_masks.push_back(obstacle_velocity_limiter::createTrajectoryFootprint( @@ -189,8 +189,8 @@ VelocityPlanningResult ObstacleVelocityLimiterModule::plan( obstacle_masks.positive_mask = obstacle_velocity_limiter::createEnvelopePolygon(footprint_polygons); obstacle_velocity_limiter::addSensorObstacles( - obstacles, planner_data->occupancy_grid, planner_data->no_ground_pointcloud, obstacle_masks, - obstacle_params_); + obstacles, planner_data->occupancy_grid, planner_data->no_ground_pointcloud.pointcloud, + obstacle_masks, obstacle_params_); } const auto obstacles_us = stopwatch.toc("obstacles"); autoware::motion_utils::VirtualWalls virtual_walls; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp index 47215ee5cb0c4..187f028dc5969 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.cpp @@ -25,6 +25,7 @@ #include #include +#include namespace autoware::motion_velocity_planner::obstacle_velocity_limiter { @@ -58,17 +59,18 @@ polygon_t createObjectPolygon( } multi_polygon_t createObjectPolygons( - const autoware_perception_msgs::msg::PredictedObjects & objects, const double buffer, - const double min_velocity) + const std::vector & objects, const double buffer, const double min_velocity) { multi_polygon_t polygons; - for (const auto & object : objects.objects) { + for (const auto & object : objects) { + const auto & predicted_object = object.predicted_object; const double obj_vel_norm = std::hypot( - object.kinematics.initial_twist_with_covariance.twist.linear.x, - object.kinematics.initial_twist_with_covariance.twist.linear.y); + predicted_object.kinematics.initial_twist_with_covariance.twist.linear.x, + predicted_object.kinematics.initial_twist_with_covariance.twist.linear.y); if (min_velocity <= obj_vel_norm) { polygons.push_back(createObjectPolygon( - object.kinematics.initial_pose_with_covariance.pose, object.shape.dimensions, buffer)); + predicted_object.kinematics.initial_pose_with_covariance.pose, + predicted_object.shape.dimensions, buffer)); } } return polygons; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp index 7e4704ba6818c..a98d92994f497 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacles.hpp @@ -18,6 +18,7 @@ #include "parameters.hpp" #include "types.hpp" +#include #include #include @@ -163,8 +164,7 @@ polygon_t createObjectPolygon( /// @param [in] min_velocity objects with velocity lower will be ignored /// @return polygons of the objects multi_polygon_t createObjectPolygons( - const autoware_perception_msgs::msg::PredictedObjects & objects, const double buffer, - const double min_velocity); + const std::vector & objects, const double buffer, const double min_velocity); /// @brief add obstacles obtained from sensors to the given Obstacles object /// @param[out] obstacles Obstacles object in which to add the sensor obstacles diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp index ac07c62f62cf7..023ae83774917 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/test/test_collision_distance.cpp @@ -15,6 +15,7 @@ #include "../src/distance.hpp" #include "../src/obstacles.hpp" #include "../src/types.hpp" +#include "autoware/motion_velocity_planner_common/planner_data.hpp" #include "autoware/universe_utils/geometry/geometry.hpp" #include @@ -27,6 +28,7 @@ #include #include +#include const auto point_in_polygon = [](const auto x, const auto y, const auto & polygon) { return std::find_if(polygon.outer().begin(), polygon.outer().end(), [=](const auto & pt) { @@ -387,11 +389,12 @@ TEST(TestCollisionDistance, arcDistance) TEST(TestCollisionDistance, createObjPolygons) { + using autoware::motion_velocity_planner::PlannerData; using autoware::motion_velocity_planner::obstacle_velocity_limiter::createObjectPolygons; using autoware_perception_msgs::msg::PredictedObject; using autoware_perception_msgs::msg::PredictedObjects; - PredictedObjects objects; + std::vector objects; auto polygons = createObjectPolygons(objects, 0.0, 0.0); EXPECT_TRUE(polygons.empty()); @@ -404,7 +407,7 @@ TEST(TestCollisionDistance, createObjPolygons) object1.kinematics.initial_twist_with_covariance.twist.linear.x = 0.0; object1.shape.dimensions.x = 1.0; object1.shape.dimensions.y = 1.0; - objects.objects.push_back(object1); + objects.push_back(PlannerData::Object(object1)); polygons = createObjectPolygons(objects, 0.0, 1.0); EXPECT_TRUE(polygons.empty()); @@ -431,7 +434,7 @@ TEST(TestCollisionDistance, createObjPolygons) object2.kinematics.initial_twist_with_covariance.twist.linear.x = 2.0; object2.shape.dimensions.x = 2.0; object2.shape.dimensions.y = 1.0; - objects.objects.push_back(object2); + objects.push_back(PlannerData::Object(object2)); polygons = createObjectPolygons(objects, 0.0, 2.0); ASSERT_EQ(polygons.size(), 1ul); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp index f9ba7f4af9877..a6c8368c20571 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp @@ -106,23 +106,26 @@ autoware_perception_msgs::msg::PredictedObjects filter_predicted_objects( const PlannerData & planner_data, const EgoData & ego_data, const PlannerParam & params) { autoware_perception_msgs::msg::PredictedObjects filtered_objects; - filtered_objects.header = planner_data.predicted_objects.header; - for (const auto & object : planner_data.predicted_objects.objects) { + filtered_objects.header = planner_data.predicted_objects_header; + for (const auto & object : planner_data.objects) { + const auto & predicted_object = object.predicted_object; const auto is_pedestrian = - std::find_if(object.classification.begin(), object.classification.end(), [](const auto & c) { - return c.label == autoware_perception_msgs::msg::ObjectClassification::PEDESTRIAN; - }) != object.classification.end(); + std::find_if( + predicted_object.classification.begin(), predicted_object.classification.end(), + [](const auto & c) { + return c.label == autoware_perception_msgs::msg::ObjectClassification::PEDESTRIAN; + }) != predicted_object.classification.end(); if (is_pedestrian) continue; const auto is_coming_from_behind = motion_utils::calcSignedArcLength( ego_data.trajectory_points, 0UL, - object.kinematics.initial_pose_with_covariance.pose.position) < 0.0; + predicted_object.kinematics.initial_pose_with_covariance.pose.position) < 0.0; if (params.objects_ignore_behind_ego && is_coming_from_behind) { continue; } - auto filtered_object = object; + auto filtered_object = predicted_object; const auto is_invalid_predicted_path = [&](const auto & predicted_path) { const auto is_low_confidence = predicted_path.confidence < params.objects_min_confidence; const auto no_overlap_path = motion_utils::removeOverlapPoints(predicted_path.path); @@ -130,10 +133,10 @@ autoware_perception_msgs::msg::PredictedObjects filter_predicted_objects( const auto lat_offset_to_current_ego = std::abs(motion_utils::calcLateralOffset(no_overlap_path, ego_data.pose.position)); const auto is_crossing_ego = - lat_offset_to_current_ego <= - object.shape.dimensions.y / 2.0 + std::max( - params.left_offset + params.extra_left_offset, - params.right_offset + params.extra_right_offset); + lat_offset_to_current_ego <= predicted_object.shape.dimensions.y / 2.0 + + std::max( + params.left_offset + params.extra_left_offset, + params.right_offset + params.extra_right_offset); return is_low_confidence || is_crossing_ego; }; auto & predicted_paths = filtered_object.kinematics.predicted_paths; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/planner_data.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/planner_data.hpp index 9ef3bf5c7f756..07c8e1580e4f0 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/planner_data.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/planner_data.hpp @@ -39,6 +39,7 @@ #include #include #include +#include namespace autoware::motion_velocity_planner { @@ -54,11 +55,72 @@ struct PlannerData { } + struct Object + { + public: + Object() = default; + explicit Object(const autoware_perception_msgs::msg::PredictedObject & arg_predicted_object) + : predicted_object(arg_predicted_object) + { + } + + autoware_perception_msgs::msg::PredictedObject predicted_object; + // double get_lon_vel_relative_to_traj() + // { + // if (!lon_vel_relative_to_traj) { + // lon_vel_relative_to_traj = 0.0; + // } + // return *lon_vel_relative_to_traj; + // } + // double get_lat_vel_relative_to_traj() + // { + // if (!lat_vel_relative_to_traj) { + // lat_vel_relative_to_traj = 0.0; + // } + // return *lat_vel_relative_to_traj; + // } + + private: + // TODO(murooka) implement the following variables and their functions. + // std::optional dist_to_traj_poly{std::nullopt}; + // std::optional dist_to_traj_lateral{std::nullopt}; + // std::optional dist_from_ego_longitudinal{std::nullopt}; + // std::optional lon_vel_relative_to_traj{std::nullopt}; + // std::optional lat_vel_relative_to_traj{std::nullopt}; + }; + + struct Pointcloud + { + public: + Pointcloud() = default; + explicit Pointcloud(const pcl::PointCloud & arg_pointcloud) + : pointcloud(arg_pointcloud) + { + } + + pcl::PointCloud pointcloud; + + private: + // NOTE: clustered result will be added. + }; + + void process_predicted_objects( + const autoware_perception_msgs::msg::PredictedObjects & predicted_objects) + { + predicted_objects_header = predicted_objects.header; + + objects.clear(); + for (const auto & predicted_object : predicted_objects.objects) { + objects.push_back(Object(predicted_object)); + } + } + // msgs from callbacks that are used for data-ready nav_msgs::msg::Odometry current_odometry; geometry_msgs::msg::AccelWithCovarianceStamped current_acceleration; - autoware_perception_msgs::msg::PredictedObjects predicted_objects; - pcl::PointCloud no_ground_pointcloud; + std_msgs::msg::Header predicted_objects_header; + std::vector objects; + Pointcloud no_ground_pointcloud; nav_msgs::msg::OccupancyGrid occupancy_grid; std::shared_ptr route_handler; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp index cefc84836beda..a78ab1489e080 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp @@ -161,13 +161,14 @@ bool MotionVelocityPlannerNode::update_planner_data( const auto predicted_objects_ptr = sub_predicted_objects_.takeData(); if (check_with_log(predicted_objects_ptr, "Waiting for predicted objects")) - planner_data_.predicted_objects = *predicted_objects_ptr; + planner_data_.process_predicted_objects(*predicted_objects_ptr); processing_times["update_planner_data.pred_obj"] = sw.toc(true); const auto no_ground_pointcloud_ptr = sub_no_ground_pointcloud_.takeData(); if (check_with_log(no_ground_pointcloud_ptr, "Waiting for pointcloud")) { const auto no_ground_pointcloud = process_no_ground_pointcloud(no_ground_pointcloud_ptr); - if (no_ground_pointcloud) planner_data_.no_ground_pointcloud = *no_ground_pointcloud; + if (no_ground_pointcloud) + planner_data_.no_ground_pointcloud = PlannerData::Pointcloud(*no_ground_pointcloud); } processing_times["update_planner_data.pcd"] = sw.toc(true); From 7fb4c1bd29c657847f366eb8853c016729f753a2 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Mon, 6 Jan 2025 22:01:40 +0900 Subject: [PATCH 028/127] feat(behavior_velocity_planner): remove virtual traffic light dependency from behavior_velocity_planner and behavior_velocity_planner_common (#9746) * feat: remove-virtual-traffic-light-dependency-from-plugin-manager Signed-off-by: Takayuki Murooka * build passed Signed-off-by: Takayuki Murooka * fix test Signed-off-by: Takayuki Murooka * fix test Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka * fix typo Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../behavior_velocity_planner/node.hpp | 4 -- .../package.xml | 1 - .../src/node.cpp | 3 -- .../src/test_utils.cpp | 2 - .../planner_data.hpp | 2 - .../scene_module_interface.hpp | 26 ------------ .../package.xml | 1 - .../src/manager.cpp | 40 ++++++++++++++++++- .../src/manager.hpp | 18 ++++++++- .../src/scene.cpp | 25 ++++++++++-- .../src/scene.hpp | 14 +++++++ .../test/test_node_interface.cpp | 11 ++++- 12 files changed, 100 insertions(+), 47 deletions(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp index 8a52ae70231d0..472538406c382 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/include/autoware/behavior_velocity_planner/node.hpp @@ -81,10 +81,6 @@ class BehaviorVelocityPlannerNode : public rclcpp::Node autoware_perception_msgs::msg::TrafficLightGroupArray> sub_traffic_signals_{this, "~/input/traffic_signals"}; - autoware::universe_utils::InterProcessPollingSubscriber< - tier4_v2x_msgs::msg::VirtualTrafficLightStateArray> - sub_virtual_traffic_light_states_{this, "~/input/virtual_traffic_light_states"}; - autoware::universe_utils::InterProcessPollingSubscriber sub_occupancy_grid_{this, "~/input/occupancy_grid"}; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml index eca49a09c8a56..c40d80c2bf998 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/package.xml @@ -56,7 +56,6 @@ tf2_geometry_msgs tf2_ros tier4_planning_msgs - tier4_v2x_msgs visualization_msgs ament_cmake_ros diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp index 1e3e691076b8a..443bfebe2a3eb 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/node.cpp @@ -271,9 +271,6 @@ bool BehaviorVelocityPlannerNode::processData(rclcpp::Clock clock) planner_data_.route_handler_ = std::make_shared(*map_data); } - // optional data - getData(planner_data_.virtual_traffic_light_states, sub_virtual_traffic_light_states_); - // planner_data_.external_velocity_limit is std::optional type variable. const auto external_velocity_limit = sub_external_velocity_limit_.takeData(); if (external_velocity_limit) { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp index ee1bb8f89fc46..8b9f39e97d22b 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner/src/test_utils.cpp @@ -113,8 +113,6 @@ void publishMandatoryTopics( test_target_node, "behavior_velocity_planner_node/input/traffic_signals"); test_manager->publishMaxVelocity( test_target_node, "behavior_velocity_planner_node/input/external_velocity_limit_mps"); - test_manager->publishVirtualTrafficLightState( - test_target_node, "behavior_velocity_planner_node/input/virtual_traffic_light_states"); test_manager->publishOccupancyGrid( test_target_node, "behavior_velocity_planner_node/input/occupancy_grid"); } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/planner_data.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/planner_data.hpp index 983aaec2acf4f..f8b37999cb6bf 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/planner_data.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/planner_data.hpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include @@ -64,7 +63,6 @@ struct PlannerData std::map traffic_light_id_map_raw_; std::map traffic_light_id_map_last_observed_; std::optional external_velocity_limit; - tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr virtual_traffic_light_states; bool is_simulation = false; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp index 9dbed9009a93e..d8d640a078267 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -95,17 +94,6 @@ class SceneModuleInterface planner_data_ = planner_data; } - std::optional getInfrastructureCommand() - { - return infrastructure_command_; - } - - void setInfrastructureCommand( - const std::optional & command) - { - infrastructure_command_ = command; - } - void setTimeKeeper(const std::shared_ptr & time_keeper) { time_keeper_ = time_keeper; @@ -123,7 +111,6 @@ class SceneModuleInterface rclcpp::Logger logger_; rclcpp::Clock::SharedPtr clock_; std::shared_ptr planner_data_; - std::optional infrastructure_command_; autoware::motion_utils::VelocityFactorInterface velocity_factor_; std::vector objects_of_interest_; mutable std::shared_ptr time_keeper_; @@ -161,9 +148,6 @@ class SceneModuleManagerInterface std::string("~/virtual_wall/") + module_name, 5); pub_velocity_factor_ = node.create_publisher( std::string("/planning/velocity_factors/") + module_name, 1); - pub_infrastructure_commands_ = - node.create_publisher( - "~/output/infrastructure_commands", 1); processing_time_publisher_ = std::make_shared(&node, "~/debug"); @@ -201,9 +185,6 @@ class SceneModuleManagerInterface velocity_factor_array.header.frame_id = "map"; velocity_factor_array.header.stamp = clock_->now(); - tier4_v2x_msgs::msg::InfrastructureCommandArray infrastructure_command_array; - infrastructure_command_array.stamp = clock_->now(); - for (const auto & scene_module : scene_modules_) { scene_module->resetVelocityFactor(); scene_module->setPlannerData(planner_data_); @@ -215,10 +196,6 @@ class SceneModuleManagerInterface velocity_factor_array.factors.emplace_back(velocity_factor); } - if (const auto command = scene_module->getInfrastructureCommand()) { - infrastructure_command_array.commands.push_back(*command); - } - for (const auto & marker : scene_module->createDebugMarkerArray().markers) { debug_marker_array.markers.push_back(marker); } @@ -227,7 +204,6 @@ class SceneModuleManagerInterface } pub_velocity_factor_->publish(velocity_factor_array); - pub_infrastructure_commands_->publish(infrastructure_command_array); pub_debug_->publish(debug_marker_array); if (is_publish_debug_path_) { tier4_planning_msgs::msg::PathWithLaneId debug_path; @@ -299,8 +275,6 @@ class SceneModuleManagerInterface rclcpp::Publisher::SharedPtr pub_debug_path_; rclcpp::Publisher::SharedPtr pub_velocity_factor_; - rclcpp::Publisher::SharedPtr - pub_infrastructure_commands_; std::shared_ptr processing_time_publisher_; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml index 002c3362260cc..9f920dff8f166 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/package.xml @@ -45,7 +45,6 @@ tf2_geometry_msgs tf2_ros tier4_planning_msgs - tier4_v2x_msgs visualization_msgs ament_cmake_ros diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp index a51cf9211c21f..3815c83d3b6ab 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp @@ -21,6 +21,8 @@ #include #include +#include + #include #include @@ -53,6 +55,14 @@ VirtualTrafficLightModuleManager::VirtualTrafficLightModuleManager(rclcpp::Node p.check_timeout_after_stop_line = getOrDeclareParameter(node, ns + ".check_timeout_after_stop_line"); } + + sub_virtual_traffic_light_states_ = autoware::universe_utils::InterProcessPollingSubscriber< + tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>:: + create_subscription(&node, "~/input/virtual_traffic_light_states"); + + pub_infrastructure_commands_ = + node.create_publisher( + "~/output/infrastructure_commands", 1); } void VirtualTrafficLightModuleManager::launchNewModules( @@ -89,17 +99,43 @@ void VirtualTrafficLightModuleManager::launchNewModules( } } -std::function &)> +std::function &)> VirtualTrafficLightModuleManager::getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) { const auto id_set = planning_utils::getLaneletIdSetOnPath( path, planner_data_->route_handler_->getLaneletMapPtr(), planner_data_->current_odometry->pose); - return [id_set](const std::shared_ptr & scene_module) { + return [id_set](const std::shared_ptr & scene_module) { return id_set.count(scene_module->getModuleId()) == 0; }; } + +void VirtualTrafficLightModuleManager::modifyPathVelocity( + tier4_planning_msgs::msg::PathWithLaneId * path) +{ + // NOTE: virtual traffic light specific implementation + // Since the argument of modifyPathVelocity cannot be changed, the specific information + // of virtual traffic light states is set here. + const auto virtual_traffic_light_states = sub_virtual_traffic_light_states_->takeData(); + for (const auto & scene_module : scene_modules_) { + scene_module->setVirtualTrafficLightStates(virtual_traffic_light_states); + } + + SceneModuleManagerInterface::modifyPathVelocity(path); + + // NOTE: virtual traffic light specific implementation + // publish infrastructure_command_array + tier4_v2x_msgs::msg::InfrastructureCommandArray infrastructure_command_array; + infrastructure_command_array.stamp = clock_->now(); + + for (const auto & scene_module : scene_modules_) { + if (const auto command = scene_module->getInfrastructureCommand()) { + infrastructure_command_array.commands.push_back(*command); + } + } + pub_infrastructure_commands_->publish(infrastructure_command_array); +} } // namespace autoware::behavior_velocity_planner #include diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp index 8e0abc98c90de..aecef0851d8ab 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.hpp @@ -20,16 +20,20 @@ #include #include #include +#include #include #include +#include +#include #include #include namespace autoware::behavior_velocity_planner { -class VirtualTrafficLightModuleManager : public SceneModuleManagerInterface<> +class VirtualTrafficLightModuleManager +: public SceneModuleManagerInterface { public: explicit VirtualTrafficLightModuleManager(rclcpp::Node & node); @@ -38,10 +42,20 @@ class VirtualTrafficLightModuleManager : public SceneModuleManagerInterface<> private: VirtualTrafficLightModule::PlannerParam planner_param_; + + void modifyPathVelocity(tier4_planning_msgs::msg::PathWithLaneId * path) override; + void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; - std::function &)> getModuleExpiredFunction( + std::function &)> getModuleExpiredFunction( const tier4_planning_msgs::msg::PathWithLaneId & path) override; + + autoware::universe_utils::InterProcessPollingSubscriber< + tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>::SharedPtr + sub_virtual_traffic_light_states_; + + rclcpp::Publisher::SharedPtr + pub_infrastructure_commands_; }; class VirtualTrafficLightModulePlugin : public PluginWrapper diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp index 206fb14b6d41c..86239816ed6f2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp @@ -333,12 +333,12 @@ bool VirtualTrafficLightModule::isNearAnyEndLine(const size_t end_line_idx) std::optional VirtualTrafficLightModule::findCorrespondingState() { - // No message - if (!planner_data_->virtual_traffic_light_states) { + // Note: This variable is set by virtual traffic light's manager. + if (!virtual_traffic_light_states_) { return {}; } - for (const auto & state : planner_data_->virtual_traffic_light_states->states) { + for (const auto & state : virtual_traffic_light_states_->states) { if (state.id == map_data_.instrument_id) { return state; } @@ -457,4 +457,23 @@ void VirtualTrafficLightModule::insertStopVelocityAtEndLine( module_data_.stop_head_pose_at_end_line = calcHeadPose(stop_pose, planner_data_->vehicle_info_.max_longitudinal_offset_m); } + +std::optional +VirtualTrafficLightModule::getInfrastructureCommand() const +{ + return infrastructure_command_; +} + +void VirtualTrafficLightModule::setInfrastructureCommand( + const std::optional & command) +{ + infrastructure_command_ = command; +} + +void VirtualTrafficLightModule::setVirtualTrafficLightStates( + const tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr + virtual_traffic_light_states) +{ + virtual_traffic_light_states_ = virtual_traffic_light_states; +} } // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp index b031ba5b2bb2b..7f37e7078a431 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -24,6 +25,9 @@ #include #include +#include +#include + #include #include @@ -84,13 +88,23 @@ class VirtualTrafficLightModule : public SceneModuleInterface visualization_msgs::msg::MarkerArray createDebugMarkerArray() override; autoware::motion_utils::VirtualWalls createVirtualWalls() override; + std::optional getInfrastructureCommand() const; + void setInfrastructureCommand( + const std::optional & command); + + void setVirtualTrafficLightStates( + const tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr + virtual_traffic_light_states); + private: const int64_t lane_id_; const lanelet::autoware::VirtualTrafficLight & reg_elem_; const lanelet::ConstLanelet lane_; const PlannerParam planner_param_; + tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr virtual_traffic_light_states_; State state_{State::NONE}; tier4_v2x_msgs::msg::InfrastructureCommand command_; + std::optional infrastructure_command_; MapData map_data_; ModuleData module_data_; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp index 9cb6bbfd40639..ab2fd5847c5be 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/test/test_node_interface.cpp @@ -26,10 +26,17 @@ namespace autoware::behavior_velocity_planner TEST(PlanningModuleInterfaceTest, NodeTestWithExceptionPathWithLaneID) { rclcpp::init(0, nullptr); + + const auto plugin_info_vec = {autoware::behavior_velocity_planner::PluginInfo{ + "virtual_traffic_light", + "autoware::behavior_velocity_planner::VirtualTrafficLightModulePlugin"}}; + auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); - auto test_target_node = autoware::behavior_velocity_planner::generateNode({}); + auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + test_manager->publishVirtualTrafficLightState( + test_target_node, "behavior_velocity_planner_node/input/virtual_traffic_light_states"); // test with nominal path_with_lane_id ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); @@ -51,6 +58,8 @@ TEST(PlanningModuleInterfaceTest, NodeTestWithOffTrackEgoPose) auto test_manager = autoware::behavior_velocity_planner::generateTestManager(); auto test_target_node = autoware::behavior_velocity_planner::generateNode(plugin_info_vec); autoware::behavior_velocity_planner::publishMandatoryTopics(test_manager, test_target_node); + test_manager->publishVirtualTrafficLightState( + test_target_node, "behavior_velocity_planner_node/input/virtual_traffic_light_states"); // test for normal trajectory ASSERT_NO_THROW_WITH_ERROR_MSG(test_manager->testWithNominalPathWithLaneId(test_target_node)); From ab845fb7371ca60ef35889c390236abfc3fb4763 Mon Sep 17 00:00:00 2001 From: Kenzo Lobos Tsunekawa Date: Tue, 7 Jan 2025 13:35:44 +0900 Subject: [PATCH 029/127] fix(autoware_lidar_centerpoint): fixed rounding errors that caused illegal memory access (#9795) fix: fixed rounding errors that caused illegal memory address Signed-off-by: Kenzo Lobos-Tsunekawa --- .../lib/preprocess/preprocess_kernel.cu | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perception/autoware_lidar_centerpoint/lib/preprocess/preprocess_kernel.cu b/perception/autoware_lidar_centerpoint/lib/preprocess/preprocess_kernel.cu index f300411a44aad..95ac7b4353e90 100644 --- a/perception/autoware_lidar_centerpoint/lib/preprocess/preprocess_kernel.cu +++ b/perception/autoware_lidar_centerpoint/lib/preprocess/preprocess_kernel.cu @@ -148,6 +148,8 @@ __global__ void generateVoxels_random_kernel( int voxel_idx = floorf((point.x - min_x_range) / pillar_x_size); int voxel_idy = floorf((point.y - min_y_range) / pillar_y_size); + voxel_idx = voxel_idx < 0 ? 0 : voxel_idx >= grid_x_size ? grid_x_size - 1 : voxel_idx; + voxel_idy = voxel_idy < 0 ? 0 : voxel_idy >= grid_y_size ? grid_y_size - 1 : voxel_idy; unsigned int voxel_index = (grid_x_size - 1 - voxel_idx) * grid_y_size + voxel_idy; unsigned int point_id = atomicAdd(&(mask[voxel_index]), 1); From f242fbf91e5d5e55da8e04dc3f8fdecbbf20a6e6 Mon Sep 17 00:00:00 2001 From: Kenzo Lobos Tsunekawa Date: Tue, 7 Jan 2025 13:55:52 +0900 Subject: [PATCH 030/127] fix(autoware_lidar_transfusion): fixed rounding errors that caused illegal memory access (#9796) fix: fixed rounding errors that caused illegal memory address Signed-off-by: Kenzo Lobos-Tsunekawa Co-authored-by: Amadeusz Szymko --- .../lib/preprocess/preprocess_kernel.cu | 2 ++ 1 file changed, 2 insertions(+) diff --git a/perception/autoware_lidar_transfusion/lib/preprocess/preprocess_kernel.cu b/perception/autoware_lidar_transfusion/lib/preprocess/preprocess_kernel.cu index 49131218ff698..a89268e646cfc 100644 --- a/perception/autoware_lidar_transfusion/lib/preprocess/preprocess_kernel.cu +++ b/perception/autoware_lidar_transfusion/lib/preprocess/preprocess_kernel.cu @@ -176,6 +176,8 @@ __global__ void generateVoxels_random_kernel( int voxel_idx = floorf((x - min_x_range) / pillar_x_size); int voxel_idy = floorf((y - min_y_range) / pillar_y_size); + voxel_idx = voxel_idx < 0 ? 0 : voxel_idx >= grid_x_size ? grid_x_size - 1 : voxel_idx; + voxel_idy = voxel_idy < 0 ? 0 : voxel_idy >= grid_y_size ? grid_y_size - 1 : voxel_idy; unsigned int voxel_index = voxel_idy * grid_x_size + voxel_idx; unsigned int point_id = atomicAdd(&(mask[voxel_index]), 1); From 515a21f86808bb15e5fb0601576a966f2abe9614 Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:27:14 +0900 Subject: [PATCH 031/127] refactor(autoware_behavior_path_start_planner_module): remove unnecessary time_keeper parameter from pull-out planners (#9827) * refactor(autoware_behavior_path_start_planner_module): remove unnecessary time_keeper parameter from pull-out planners Signed-off-by: Kyoichi Sugahara --------- Signed-off-by: Kyoichi Sugahara --- .../freespace_pull_out.hpp | 5 +---- .../geometric_pull_out.hpp | 3 ++- .../pull_out_planner_base.hpp | 13 +++++++------ .../shift_pull_out.hpp | 3 ++- .../src/freespace_pull_out.cpp | 10 +++------- .../src/start_planner_module.cpp | 3 +-- .../test/test_geometric_pull_out.cpp | 3 +-- .../test/test_shift_pull_out.cpp | 4 +--- 8 files changed, 18 insertions(+), 26 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp index e358e35ed7794..364d2d31a2577 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp @@ -35,10 +35,7 @@ using autoware::freespace_planning_algorithms::RRTStar; class FreespacePullOut : public PullOutPlannerBase { public: - FreespacePullOut( - rclcpp::Node & node, const StartPlannerParameters & parameters, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, - std::shared_ptr time_keeper); + FreespacePullOut(rclcpp::Node & node, const StartPlannerParameters & parameters); PlannerType getPlannerType() const override { return PlannerType::FREESPACE; } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp index 18d1f3c3b9b81..78eb72183cdf5 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp @@ -35,7 +35,8 @@ class GeometricPullOut : public PullOutPlannerBase rclcpp::Node & node, const StartPlannerParameters & parameters, const std::shared_ptr lane_departure_checker, - std::shared_ptr time_keeper); + std::shared_ptr time_keeper = + std::make_shared()); PlannerType getPlannerType() const override { return PlannerType::GEOMETRIC; }; std::optional plan( diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp index f606679e7f2da..dfd972aff9be0 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp @@ -40,12 +40,13 @@ class PullOutPlannerBase public: explicit PullOutPlannerBase( rclcpp::Node & node, const StartPlannerParameters & parameters, - std::shared_ptr time_keeper) - : time_keeper_(time_keeper) + std::shared_ptr time_keeper = + std::make_shared()) + : parameters_(parameters), + vehicle_info_(autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()), + vehicle_footprint_(vehicle_info_.createFootprint()), + time_keeper_(time_keeper) { - vehicle_info_ = autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo(); - vehicle_footprint_ = vehicle_info_.createFootprint(); - parameters_ = parameters; } virtual ~PullOutPlannerBase() = default; @@ -68,9 +69,9 @@ class PullOutPlannerBase double collision_check_distance_from_end) const; std::shared_ptr planner_data_; + StartPlannerParameters parameters_; autoware::vehicle_info_utils::VehicleInfo vehicle_info_; LinearRing2d vehicle_footprint_; - StartPlannerParameters parameters_; double collision_check_margin_; mutable std::shared_ptr time_keeper_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp index 5b4f78b252d22..8da104940d327 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp @@ -36,7 +36,8 @@ class ShiftPullOut : public PullOutPlannerBase explicit ShiftPullOut( rclcpp::Node & node, const StartPlannerParameters & parameters, std::shared_ptr & lane_departure_checker, - std::shared_ptr time_keeper); + std::shared_ptr time_keeper = + std::make_shared()); PlannerType getPlannerType() const override { return PlannerType::SHIFT; }; std::optional plan( diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp index 42698f799c6b3..a089f6a8a83fc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp @@ -28,15 +28,11 @@ namespace autoware::behavior_path_planner { -FreespacePullOut::FreespacePullOut( - rclcpp::Node & node, const StartPlannerParameters & parameters, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, - std::shared_ptr time_keeper) -: PullOutPlannerBase{node, parameters, time_keeper}, - velocity_{parameters.freespace_planner_velocity} +FreespacePullOut::FreespacePullOut(rclcpp::Node & node, const StartPlannerParameters & parameters) +: PullOutPlannerBase{node, parameters}, velocity_{parameters.freespace_planner_velocity} { autoware::freespace_planning_algorithms::VehicleShape vehicle_shape( - vehicle_info, parameters.vehicle_shape_margin); + vehicle_info_, parameters.vehicle_shape_margin); if (parameters.freespace_planner_algorithm == "astar") { use_back_ = parameters.astar_parameters.use_back; planner_ = std::make_unique( diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp index c223390e454d1..f45924b9542dc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp @@ -90,8 +90,7 @@ StartPlannerModule::StartPlannerModule( } if (parameters_->enable_freespace_planner) { - freespace_planner_ = - std::make_unique(node, *parameters, vehicle_info_, time_keeper_); + freespace_planner_ = std::make_unique(node, *parameters); const auto freespace_planner_period_ns = rclcpp::Rate(1.0).period(); freespace_planner_timer_cb_group_ = node.create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp index fb39e186afd4e..dd8bb02c97dea 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp @@ -156,9 +156,8 @@ class TestGeometricPullOut : public ::testing::Test parameters->th_moving_object_velocity = th_moving_object_velocity_; parameters->divide_pull_out_path = divide_pull_out_path_; - auto time_keeper = std::make_shared(); geometric_pull_out_ = - std::make_shared(*node_, *parameters, lane_departure_checker_, time_keeper); + std::make_shared(*node_, *parameters, lane_departure_checker_); } void initialize_planner_data() diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp index 156cf62f9ac4a..474da055b4de7 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp @@ -139,9 +139,7 @@ class TestShiftPullOut : public ::testing::Test { auto parameters = StartPlannerParameters::init(*node_); - auto time_keeper = std::make_shared(); - shift_pull_out_ = - std::make_shared(*node_, parameters, lane_departure_checker_, time_keeper); + shift_pull_out_ = std::make_shared(*node_, parameters, lane_departure_checker_); } }; From db78285c34a6bdf6b1db0d3666180f680ead15fe Mon Sep 17 00:00:00 2001 From: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:19:04 +0900 Subject: [PATCH 032/127] fix(planning): corrects typos (#9840) * fix(planning): corrects typos Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> * style(pre-commit): autofix --------- Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../README.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md index f373afc2351bf..efe4a9a353ecc 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md @@ -1,33 +1,33 @@ -## Stop Line +# Stop Line -### Role +## Role -This module plans velocity so that the vehicle can stop right before stop lines and restart driving after stopped. +This module plans the vehicle's velocity to ensure it stops just before stop lines and can resume movement after stopping. ![stop line](docs/stop_line.svg) -### Activation Timing +## Activation Timing This module is activated when there is a stop line in a target lane. -### Module Parameters +## Module Parameters | Parameter | Type | Description | | -------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `stop_margin` | double | a margin that the vehicle tries to stop before stop_line | -| `stop_duration_sec` | double | [s] time parameter for the ego vehicle to stop in front of a stop line | -| `hold_stop_margin_distance` | double | [m] parameter for restart prevention (See Algorithm section). Also, when the ego vehicle is within this distance from a stop line, the ego state becomes STOPPED from APPROACHING | -| `use_initialization_stop_state` | bool | A flag to determine whether to return to the approaching state when the vehicle moves away from a stop line. | -| `show_stop_line_collision_check` | bool | A flag to determine whether to show the debug information of collision check with a stop line | +| `stop_margin` | double | Margin that the vehicle tries to stop in before stop_line | +| `stop_duration_sec` | double | [s] Time parameter for the ego vehicle to stop before stop line | +| `hold_stop_margin_distance` | double | [m] Parameter for restart prevention (See Algorithm section). Also, when the ego vehicle is within this distance from a stop line, the ego state becomes STOPPED from APPROACHING | +| `use_initialization_stop_state` | bool | Flag to determine whether to return to the approaching state when the vehicle moves away from a stop line. | +| `show_stop_line_collision_check` | bool | Flag to determine whether to show the debug information of collision check with a stop line | -### Inner-workings / Algorithms +## Inner-workings / Algorithms - Gets a stop line from map information. -- insert a stop point on the path from the stop line defined in the map and the ego vehicle length. +- Inserts a stop point on the path from the stop line defined in the map and the ego vehicle length. - Sets velocities of the path after the stop point to 0[m/s]. -- Release the inserted stop velocity when the vehicle stops at the stop point for `stop_duration_sec` seconds. +- Releases the inserted stop velocity when the vehicle halts at the stop point for `stop_duration_sec` seconds. -#### Flowchart +### Flowchart ```plantuml @startuml @@ -85,15 +85,15 @@ Then, we can get `offset segment` and `offset from segment start`. ![find_offset_segment](docs/./find_offset_segment.drawio.svg) -After that, we can calculate a offset point from `offset segment` and `offset`. This will be `stop_pose`. +After that, we can calculate an offset point from `offset segment` and `offset`. This will be `stop_pose`. ![calculate_stop_pose](docs/./calculate_stop_pose.drawio.svg) -#### Restart prevention +### Restart Prevention -If it needs X meters (e.g. 0.5 meters) to stop once the vehicle starts moving due to the poor vehicle control performance, the vehicle goes over the stopping position that should be strictly observed when the vehicle starts to moving in order to approach the near stop point (e.g. 0.3 meters away). +If the vehicle requires X meters (e.g. 0.5 meters) to stop once it starts moving due to poor vehicle control performance, it may overshoot the stopping position, which must be strictly observed. This happens when the vehicle begins to move in order to approach a nearby stop point (e.g. 0.3 meters away). -This module has parameter `hold_stop_margin_distance` in order to prevent from these redundant restart. If the vehicle is stopped within `hold_stop_margin_distance` meters from stop point of the module (\_front_to_stop_line < hold_stop_margin_distance), the module judges that the vehicle has already stopped for the module's stop point and plans to keep stopping current position even if the vehicle is stopped due to other factors. +This module includes the parameter `hold_stop_margin_distance` to prevent redundant restarts in such a situation. If the vehicle is stopped within `hold_stop_margin_distance` meters of the stop point (\_front_to_stop_line < hold_stop_margin_distance), the module determines that the vehicle has already stopped at the stop point and will maintain the current stopping position, even if the vehicle has come to a stop due to other factors.
![example](docs/restart_prevention.svg){width=1000} From 95e6b19b69dc59244d4e70361e0f95ea9628b937 Mon Sep 17 00:00:00 2001 From: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Date: Tue, 7 Jan 2025 15:19:17 +0900 Subject: [PATCH 033/127] fix(planning): corrects typo in svg (#9814) Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> --- .../docs/node_and_segment.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/docs/node_and_segment.drawio.svg b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/docs/node_and_segment.drawio.svg index 182c941907f57..6cd47ffc14a56 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/docs/node_and_segment.drawio.svg +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/docs/node_and_segment.drawio.svg @@ -233,7 +233,7 @@
= node(i) + node(i+1)
- = all segment has two points + = all segments have two points From e5070d18e4c37c02bd60a4228c2faf430d602698 Mon Sep 17 00:00:00 2001 From: Ryuta Kambe Date: Tue, 7 Jan 2025 15:20:44 +0900 Subject: [PATCH 034/127] fix(autoware_motion_velocity_obstacle_velocity_limiter_module): remove cppcheck suppressions (#9843) Signed-off-by: veqcc --- .../benchmarks/collision_checker_benchmark.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/benchmarks/collision_checker_benchmark.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/benchmarks/collision_checker_benchmark.cpp index 1d980e220ccef..c8aa9895a0451 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/benchmarks/collision_checker_benchmark.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/benchmarks/collision_checker_benchmark.cpp @@ -76,12 +76,10 @@ int main() const auto naive_constr_end = std::chrono::system_clock::now(); const auto rtt_check_start = std::chrono::system_clock::now(); for (const auto & polygon : polygons) - // cppcheck-suppress unreadVariable const auto rtree_result = rtree_collision_checker.intersections(polygon); const auto rtt_check_end = std::chrono::system_clock::now(); const auto naive_check_start = std::chrono::system_clock::now(); for (const auto & polygon : polygons) - // cppcheck-suppress unreadVariable const auto naive_result = naive_collision_checker.intersections(polygon); const auto naive_check_end = std::chrono::system_clock::now(); const auto rtt_constr_time = From 9d5c246baf29ceed9c8e1ad264d559415591631b Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Tue, 7 Jan 2025 15:42:29 +0900 Subject: [PATCH 035/127] feat(autoware_test_utils): add visualization and yaml dumper for PathWithLaneId (#9841) Signed-off-by: Mamoru Sobue --- .../config/sample_topic_snapshot.yaml | 9 +- .../autoware_test_utils/mock_data_parser.hpp | 13 + .../autoware_test_utils/visualization.hpp | 117 ++- common/autoware_test_utils/package.xml | 1 + .../src/mock_data_parser.cpp | 50 ++ .../src/topic_snapshot_saver.cpp | 11 +- .../test_map/intersection/lanelet2_map.osm | 839 ++++++------------ 7 files changed, 479 insertions(+), 561 deletions(-) diff --git a/common/autoware_test_utils/config/sample_topic_snapshot.yaml b/common/autoware_test_utils/config/sample_topic_snapshot.yaml index d9eff5d579540..2ff746b84c3ac 100644 --- a/common/autoware_test_utils/config/sample_topic_snapshot.yaml +++ b/common/autoware_test_utils/config/sample_topic_snapshot.yaml @@ -24,6 +24,9 @@ fields: - name: dynamic_object type: PredictedObjects # autoware_perception_msgs::msg::PredictedObjects topic: /perception/object_recognition/objects -# - name: tracked_object -# type: TrackedObjects # autoware_perception_msgs::msg::TrackedObjects -# topic: /perception/object_recognition/tracking/objects + # - name: tracked_object + # type: TrackedObjects # autoware_perception_msgs::msg::TrackedObjects + # topic: /perception/object_recognition/tracking/objects + # - name: path_with_lane_id + # type: PathWithLaneId # tier4_planning_msgs::msg::PathWithLaneId + # topic: /planning/scenario_planning/lane_driving/behavior_planning/path_with_lane_id diff --git a/common/autoware_test_utils/include/autoware_test_utils/mock_data_parser.hpp b/common/autoware_test_utils/include/autoware_test_utils/mock_data_parser.hpp index 5e07237e2c495..8375d3e731683 100644 --- a/common/autoware_test_utils/include/autoware_test_utils/mock_data_parser.hpp +++ b/common/autoware_test_utils/include/autoware_test_utils/mock_data_parser.hpp @@ -59,6 +59,7 @@ using autoware_perception_msgs::msg::TrafficLightGroupArray; using autoware_planning_msgs::msg::LaneletPrimitive; using autoware_planning_msgs::msg::LaneletRoute; using autoware_planning_msgs::msg::LaneletSegment; +using autoware_planning_msgs::msg::PathPoint; using builtin_interfaces::msg::Duration; using builtin_interfaces::msg::Time; using geometry_msgs::msg::Accel; @@ -97,6 +98,9 @@ Duration parse(const YAML::Node & node); template <> Time parse(const YAML::Node & node); +template <> +Point parse(const YAML::Node & node); + template <> std::vector parse(const YAML::Node & node); @@ -145,6 +149,15 @@ std::vector parse(const YAML::Node & node); template <> UUID parse(const YAML::Node & node); +template <> +PathPoint parse(const YAML::Node & node); + +template <> +PathPointWithLaneId parse(const YAML::Node & node); + +template <> +PathWithLaneId parse(const YAML::Node & node); + template <> PredictedPath parse(const YAML::Node & node); diff --git a/common/autoware_test_utils/include/autoware_test_utils/visualization.hpp b/common/autoware_test_utils/include/autoware_test_utils/visualization.hpp index c2185e65422e8..dbd3dd6638c95 100644 --- a/common/autoware_test_utils/include/autoware_test_utils/visualization.hpp +++ b/common/autoware_test_utils/include/autoware_test_utils/visualization.hpp @@ -19,6 +19,9 @@ #include #include +#include + +#include #include #include @@ -150,7 +153,8 @@ inline void plot_lanelet2_object( const auto center = (left.front().basicPoint2d() + left.back().basicPoint2d() + right.front().basicPoint2d() + right.back().basicPoint2d()) / 4.0; - axes.text(Args(center.x(), center.y(), std::to_string(lanelet.id()))); + axes.text( + Args(center.x(), center.y(), std::to_string(lanelet.id())), Kwargs("clip_on"_a = true)); } if (config_opt && config_opt.value().label) { @@ -214,16 +218,111 @@ inline void plot_lanelet2_object( axes.add_patch(Args(poly.unwrap())); } +struct DrivableAreaConfig +{ + static DrivableAreaConfig defaults() { return {"turquoise", 2.0}; } + std::optional color{}; + std::optional linewidth{}; +}; + +struct PathWithLaneIdConfig +{ + static PathWithLaneIdConfig defaults() + { + return {std::nullopt, "k", 1.0, std::nullopt, false, 1.0}; + } + std::optional label{}; + std::optional color{}; + std::optional linewidth{}; + std::optional da{}; + bool lane_id{}; // & config_opt = std::nullopt); -*/ +inline void plot_autoware_object( + const tier4_planning_msgs::msg::PathWithLaneId & path, autoware::pyplot::Axes & axes, + const std::optional & config_opt = std::nullopt) +{ + py::dict kwargs{}; + if (config_opt) { + const auto & config = config_opt.value(); + if (config.label) { + kwargs["label"] = config.label.value(); + } + if (config.color) { + kwargs["color"] = config.color.value(); + } + if (config.linewidth) { + kwargs["linewidth"] = config.linewidth.value(); + } + } + std::vector xs; + std::vector ys; + std::vector yaw_cos; + std::vector yaw_sin; + std::vector> ids; + const bool plot_lane_id = config_opt ? config_opt.value().lane_id : false; + for (const auto & point : path.points) { + xs.push_back(point.point.pose.position.x); + ys.push_back(point.point.pose.position.y); + const auto th = autoware::universe_utils::getRPY(point.point.pose.orientation).z; + yaw_cos.push_back(std::cos(th)); + yaw_sin.push_back(std::sin(th)); + if (plot_lane_id) { + ids.emplace_back(); + for (const auto & id : point.lane_ids) { + ids.back().push_back(id); + } + } + } + // plot centerline + axes.plot(Args(xs, ys), kwargs); + const auto quiver_scale = + config_opt ? config_opt.value().quiver_size : PathWithLaneIdConfig::defaults().quiver_size; + const auto quiver_color = + config_opt ? (config_opt.value().color ? config_opt.value().color.value() : "k") : "k"; + axes.quiver( + Args(xs, ys, yaw_cos, yaw_sin), Kwargs( + "angles"_a = "xy", "scale_units"_a = "xy", + "scale"_a = quiver_scale, "color"_a = quiver_color)); + if (plot_lane_id) { + for (size_t i = 0; i < xs.size(); ++i) { + std::stringstream ss; + const char * delimiter = ""; + for (const auto id : ids[i]) { + ss << std::exchange(delimiter, ",") << id; + } + axes.text(Args(xs[i], ys[i], ss.str()), Kwargs("clip_on"_a = true)); + } + } + // plot drivable area + if (config_opt && config_opt.value().da) { + auto plot_boundary = [&](const decltype(path.left_bound) & points) { + std::vector xs; + std::vector ys; + for (const auto & point : points) { + xs.push_back(point.x); + ys.push_back(point.y); + } + const auto & cfg = config_opt.value().da.value(); + py::dict kwargs{}; + if (cfg.color) { + kwargs["color"] = cfg.color.value(); + } + if (cfg.linewidth) { + kwargs["linewidth"] = cfg.linewidth.value(); + } + axes.plot(Args(xs, ys), kwargs); + }; + plot_boundary(path.left_bound); + plot_boundary(path.right_bound); + } +} + } // namespace autoware::test_utils #endif // AUTOWARE_TEST_UTILS__VISUALIZATION_HPP_ diff --git a/common/autoware_test_utils/package.xml b/common/autoware_test_utils/package.xml index c328f37ba357d..740e7f840141d 100644 --- a/common/autoware_test_utils/package.xml +++ b/common/autoware_test_utils/package.xml @@ -8,6 +8,7 @@ Takamasa Horibe Zulfaqar Azmi Mamoru Sobue + Yukinari Hisaki Apache License 2.0 Kyoichi Sugahara diff --git a/common/autoware_test_utils/src/mock_data_parser.cpp b/common/autoware_test_utils/src/mock_data_parser.cpp index 6e7002501bf30..29aed75357441 100644 --- a/common/autoware_test_utils/src/mock_data_parser.cpp +++ b/common/autoware_test_utils/src/mock_data_parser.cpp @@ -65,6 +65,16 @@ std::array parse(const YAML::Node & node) return msg; } +template <> +Point parse(const YAML::Node & node) +{ + Point geom_point; + geom_point.x = node["x"].as(); + geom_point.y = node["y"].as(); + geom_point.z = node["z"].as(); + return geom_point; +} + template <> std::vector parse(const YAML::Node & node) { @@ -285,6 +295,46 @@ Shape parse(const YAML::Node & node) return msg; } +template <> +PathPoint parse(const YAML::Node & node) +{ + PathPoint point; + point.pose = parse(node["pose"]); + point.longitudinal_velocity_mps = node["longitudinal_velocity_mps"].as(); + point.lateral_velocity_mps = node["lateral_velocity_mps"].as(); + point.heading_rate_rps = node["heading_rate_rps"].as(); + point.is_final = node["is_final"].as(); + return point; +} + +template <> +PathPointWithLaneId parse(const YAML::Node & node) +{ + PathPointWithLaneId point; + point.point = parse(node["point"]); + for (const auto & lane_id_node : node["lane_ids"]) { + point.lane_ids.push_back(lane_id_node.as()); + } + return point; +} + +template <> +PathWithLaneId parse(const YAML::Node & node) +{ + PathWithLaneId path; + path.header = parse
(node["header"]); + for (const auto & point_node : node["points"]) { + path.points.push_back(parse(point_node)); + } + for (const auto & left_bound_node : node["left_bound"]) { + path.left_bound.push_back(parse(left_bound_node)); + } + for (const auto & right_bound_node : node["right_bound"]) { + path.right_bound.push_back(parse(right_bound_node)); + } + return path; +} + template <> PredictedPath parse(const YAML::Node & node) { diff --git a/common/autoware_test_utils/src/topic_snapshot_saver.cpp b/common/autoware_test_utils/src/topic_snapshot_saver.cpp index b2cb2a17c9621..bd9af2d5672b8 100644 --- a/common/autoware_test_utils/src/topic_snapshot_saver.cpp +++ b/common/autoware_test_utils/src/topic_snapshot_saver.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -46,7 +47,8 @@ using MessageType = std::variant< autoware_adapi_v1_msgs::msg::OperationModeState, // 3 autoware_planning_msgs::msg::LaneletRoute, // 4 autoware_perception_msgs::msg::TrafficLightGroupArray, // 5 - autoware_perception_msgs::msg::TrackedObjects // 6 + autoware_perception_msgs::msg::TrackedObjects, // 6 + tier4_planning_msgs::msg::PathWithLaneId // 7 >; std::optional get_topic_index(const std::string & name) @@ -72,6 +74,9 @@ std::optional get_topic_index(const std::string & name) if (name == "TrackedObjects") { return 6; } + if (name == "PathWithLaneId") { + return 7; + } return std::nullopt; } @@ -196,6 +201,7 @@ class TopicSnapShotSaver REGISTER_CALLBACK(4); REGISTER_CALLBACK(5); REGISTER_CALLBACK(6); + REGISTER_CALLBACK(7); } } @@ -243,6 +249,7 @@ class TopicSnapShotSaver REGISTER_WRITE_TYPE(4); REGISTER_WRITE_TYPE(5); REGISTER_WRITE_TYPE(6); + REGISTER_WRITE_TYPE(7); } const std::string desc = std::string(R"(# @@ -253,7 +260,7 @@ class TopicSnapShotSaver # map_path_uri: package:/// # fields(this is array) # - name: -# type: either {Odometry | AccelWithCovarianceStamped | PredictedObjects | OperationModeState | LaneletRoute | TrafficLightGroupArray | TrackedObjects | TBD} +# type: either {Odometry | AccelWithCovarianceStamped | PredictedObjects | OperationModeState | LaneletRoute | TrafficLightGroupArray | TrackedObjects | PathWithLaneId | TBD} # topic: # )"); diff --git a/common/autoware_test_utils/test_map/intersection/lanelet2_map.osm b/common/autoware_test_utils/test_map/intersection/lanelet2_map.osm index c5c5b7b1fc657..9f28ed79a91ae 100644 --- a/common/autoware_test_utils/test_map/intersection/lanelet2_map.osm +++ b/common/autoware_test_utils/test_map/intersection/lanelet2_map.osm @@ -1,6 +1,6 @@ - + @@ -8002,391 +8002,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -10004,16 +9619,6 @@ - - - - - - - - - - @@ -15586,6 +15191,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -18669,142 +18449,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -19364,12 +19008,6 @@ - - - - - - @@ -21131,6 +20769,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -22269,15 +21969,6 @@ - - - - - - - - - @@ -22853,6 +22544,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e2accc57e9d0b1328641bd88a48e446c74879af3 Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:21:57 +0900 Subject: [PATCH 036/127] fix(tier4_camera_view_rviz_plugin): fix bugprone-parent-virtual-call (#9815) * fix:bugprone-error Signed-off-by: kobayu858 * fix:fmt Signed-off-by: kobayu858 --------- Signed-off-by: kobayu858 --- .../src/third_person_view_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualization/tier4_camera_view_rviz_plugin/src/third_person_view_controller.cpp b/visualization/tier4_camera_view_rviz_plugin/src/third_person_view_controller.cpp index b7d754b02d4bd..386c8cdfb0b13 100644 --- a/visualization/tier4_camera_view_rviz_plugin/src/third_person_view_controller.cpp +++ b/visualization/tier4_camera_view_rviz_plugin/src/third_person_view_controller.cpp @@ -184,7 +184,7 @@ void ThirdPersonViewController::handleMouseEvent(rviz_common::ViewportMouseEvent void ThirdPersonViewController::mimic(rviz_common::ViewController * source_view) { - FramePositionTrackingViewController::mimic(source_view); + FramePositionTrackingViewController::mimic(source_view); // NOLINT target_frame_property_->setValue(TARGET_FRAME_START); getNewTransform(); From 3aa84a0fb2a9796a8e54f99e44e89ae3a125131e Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:23:13 +0900 Subject: [PATCH 037/127] fix(system_monitor): fix bugprone-exception-escape (#9781) * fix: bugprone-error Signed-off-by: kobayu858 * fix: clippy Signed-off-by: kobayu858 --------- Signed-off-by: kobayu858 --- .../reader/hdd_reader/hdd_reader.cpp | 83 +++++----- .../reader/msr_reader/msr_reader.cpp | 146 +++++++++--------- 2 files changed, 123 insertions(+), 106 deletions(-) diff --git a/system/system_monitor/reader/hdd_reader/hdd_reader.cpp b/system/system_monitor/reader/hdd_reader/hdd_reader.cpp index 740f841382f47..098f4240782ae 100644 --- a/system/system_monitor/reader/hdd_reader/hdd_reader.cpp +++ b/system/system_monitor/reader/hdd_reader/hdd_reader.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -655,48 +656,56 @@ void run(int port) int main(int argc, char ** argv) { - static struct option long_options[] = { - {"help", no_argument, nullptr, 'h'}, - {"port", required_argument, nullptr, 'p'}, - {nullptr, 0, nullptr, 0}}; - - // Parse command-line options - int c = 0; - int option_index = 0; - int port = PORT; - while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { - switch (c) { - case 'h': - usage(); - return EXIT_SUCCESS; - - case 'p': - try { - port = boost::lexical_cast(optarg); - } catch (const boost::bad_lexical_cast & e) { - printf("Error: %s\n", e.what()); - return EXIT_FAILURE; - } - break; - - default: - break; + try { + static struct option long_options[] = { + {"help", no_argument, nullptr, 'h'}, + {"port", required_argument, nullptr, 'p'}, + {nullptr, 0, nullptr, 0}}; + + // Parse command-line options + int c = 0; + int option_index = 0; + int port = PORT; + while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { + switch (c) { + case 'h': + usage(); + return EXIT_SUCCESS; + + case 'p': + try { + port = boost::lexical_cast(optarg); + } catch (const boost::bad_lexical_cast & e) { + printf("Error: %s\n", e.what()); + return EXIT_FAILURE; + } + break; + + default: + break; + } } - } - // Put the program in the background - if (daemon(0, 0) < 0) { - printf("Failed to put the program in the background. %s\n", strerror(errno)); - return errno; - } + // Put the program in the background + if (daemon(0, 0) < 0) { + printf("Failed to put the program in the background. %s\n", strerror(errno)); + return errno; + } - // Open connection to system logger - openlog(nullptr, LOG_PID, LOG_DAEMON); + // Open connection to system logger + openlog(nullptr, LOG_PID, LOG_DAEMON); - run(port); + run(port); - // Close descriptor used to write to system logger - closelog(); + // Close descriptor used to write to system logger + closelog(); + } catch (const std::exception & e) { + std::cerr << "Exception in main(): " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "Unknown exception in main()" << std::endl; + return EXIT_FAILURE; + } return EXIT_SUCCESS; } diff --git a/system/system_monitor/reader/msr_reader/msr_reader.cpp b/system/system_monitor/reader/msr_reader/msr_reader.cpp index fc7bcab795be0..89f95d05c282e 100644 --- a/system/system_monitor/reader/msr_reader/msr_reader.cpp +++ b/system/system_monitor/reader/msr_reader/msr_reader.cpp @@ -212,90 +212,98 @@ void run(int port, const std::vector & list) int main(int argc, char ** argv) { - static struct option long_options[] = { - {"help", no_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {0, 0, 0, 0}}; - - // Parse command-line options - int c = 0; - int option_index = 0; - int port = PORT; - while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { - switch (c) { - case 'h': - usage(); - return EXIT_SUCCESS; - - case 'p': - try { - port = boost::lexical_cast(optarg); - } catch (const boost::bad_lexical_cast & e) { - printf("Error: %s\n", e.what()); - return EXIT_FAILURE; - } - break; + try { + static struct option long_options[] = { + {"help", no_argument, 0, 'h'}, {"port", required_argument, 0, 'p'}, {0, 0, 0, 0}}; + + // Parse command-line options + int c = 0; + int option_index = 0; + int port = PORT; + while ((c = getopt_long(argc, argv, "hp:", long_options, &option_index)) != -1) { + switch (c) { + case 'h': + usage(); + return EXIT_SUCCESS; + + case 'p': + try { + port = boost::lexical_cast(optarg); + } catch (const boost::bad_lexical_cast & e) { + printf("Error: %s\n", e.what()); + return EXIT_FAILURE; + } + break; + + default: + break; + } + } - default: - break; + if (!fs::exists("/dev/cpu")) { + printf("Failed to access /dev/cpu.\n"); + return EXIT_FAILURE; } - } - if (!fs::exists("/dev/cpu")) { - printf("Failed to access /dev/cpu.\n"); - return EXIT_FAILURE; - } + std::vector list; + const fs::path root("/dev/cpu"); - std::vector list; - const fs::path root("/dev/cpu"); + for (const fs::path & path : boost::make_iterator_range( + fs::recursive_directory_iterator(root), fs::recursive_directory_iterator())) { + if (fs::is_directory(path)) { + continue; + } - for (const fs::path & path : boost::make_iterator_range( - fs::recursive_directory_iterator(root), fs::recursive_directory_iterator())) { - if (fs::is_directory(path)) { - continue; - } + std::cmatch match; + const char * msr = path.generic_string().c_str(); - std::cmatch match; - const char * msr = path.generic_string().c_str(); + // /dev/cpu/[0-9]/msr ? + if (!std::regex_match(msr, match, std::regex(".*msr"))) { + continue; + } - // /dev/cpu/[0-9]/msr ? - if (!std::regex_match(msr, match, std::regex(".*msr"))) { - continue; + list.push_back(path.generic_string()); } - list.push_back(path.generic_string()); - } + std::sort(list.begin(), list.end(), [](const std::string & c1, const std::string & c2) { + std::cmatch match; + const std::regex filter(".*/(\\d+)/msr"); + int n1 = 0; + int n2 = 0; + if (std::regex_match(c1.c_str(), match, filter)) { + n1 = std::stoi(match[1].str()); + } + if (std::regex_match(c2.c_str(), match, filter)) { + n2 = std::stoi(match[1].str()); + } + return n1 < n2; + }); // NOLINT - std::sort(list.begin(), list.end(), [](const std::string & c1, const std::string & c2) { - std::cmatch match; - const std::regex filter(".*/(\\d+)/msr"); - int n1 = 0; - int n2 = 0; - if (std::regex_match(c1.c_str(), match, filter)) { - n1 = std::stoi(match[1].str()); - } - if (std::regex_match(c2.c_str(), match, filter)) { - n2 = std::stoi(match[1].str()); + if (list.empty()) { + printf("No msr found in /dev/cpu.\n"); + return EXIT_FAILURE; } - return n1 < n2; - }); // NOLINT - - if (list.empty()) { - printf("No msr found in /dev/cpu.\n"); - return EXIT_FAILURE; - } - // Put the program in the background - if (daemon(0, 0) < 0) { - printf("Failed to put the program in the background. %s\n", strerror(errno)); - return errno; - } + // Put the program in the background + if (daemon(0, 0) < 0) { + printf("Failed to put the program in the background. %s\n", strerror(errno)); + return errno; + } - // Open connection to system logger - openlog(nullptr, LOG_PID, LOG_DAEMON); + // Open connection to system logger + openlog(nullptr, LOG_PID, LOG_DAEMON); - run(port, list); + run(port, list); - // Close descriptor used to write to system logger - closelog(); + // Close descriptor used to write to system logger + closelog(); + } catch (const std::exception & e) { + std::cerr << "Exception in main(): " << e.what() << std::endl; + return EXIT_FAILURE; + } catch (...) { + std::cerr << "Unknown exception in main()" << std::endl; + return EXIT_FAILURE; + } return EXIT_SUCCESS; } From 19f7f95b8a25fc7deb748db8671a33d0d835bed7 Mon Sep 17 00:00:00 2001 From: Yamato Ando Date: Tue, 7 Jan 2025 18:42:38 +0900 Subject: [PATCH 038/127] feat(ekf_localizer): check whether the initialpose has been set (#9787) * check set intialpose Signed-off-by: Yamato Ando * update png Signed-off-by: Yamato Ando * style(pre-commit): autofix --------- Signed-off-by: Yamato Ando Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- localization/autoware_ekf_localizer/README.md | 1 + .../autoware/ekf_localizer/diagnostics.hpp | 1 + .../autoware/ekf_localizer/ekf_localizer.hpp | 1 + .../media/ekf_diagnostics.png | Bin 142232 -> 145097 bytes .../src/diagnostics.cpp | 19 ++++++++++++++++++ .../src/ekf_localizer.cpp | 16 +++++++++++++-- .../test/test_diagnostics.cpp | 13 ++++++++++++ 7 files changed, 49 insertions(+), 2 deletions(-) diff --git a/localization/autoware_ekf_localizer/README.md b/localization/autoware_ekf_localizer/README.md index aad65da2516d1..802bf7dbb16c3 100644 --- a/localization/autoware_ekf_localizer/README.md +++ b/localization/autoware_ekf_localizer/README.md @@ -191,6 +191,7 @@ Note that, although the dimension gets larger since the analytical expansion can ### The conditions that result in a WARN state - The node is not in the activate state. +- The initial pose is not set. - The number of consecutive no measurement update via the Pose/Twist topic exceeds the `pose_no_update_count_threshold_warn`/`twist_no_update_count_threshold_warn`. - The timestamp of the Pose/Twist topic is beyond the delay compensation range. - The Pose/Twist topic is beyond the range of Mahalanobis distance for covariance estimation. diff --git a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/diagnostics.hpp b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/diagnostics.hpp index 20a77354c0996..b194c3e956341 100644 --- a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/diagnostics.hpp +++ b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/diagnostics.hpp @@ -24,6 +24,7 @@ namespace autoware::ekf_localizer { diagnostic_msgs::msg::DiagnosticStatus check_process_activated(const bool is_activated); +diagnostic_msgs::msg::DiagnosticStatus check_set_initialpose(const bool is_set_initialpose); diagnostic_msgs::msg::DiagnosticStatus check_measurement_updated( const std::string & measurement_type, const size_t no_update_count, diff --git a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp index 1b437f26e9c7d..0561e250298ac 100644 --- a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp +++ b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp @@ -119,6 +119,7 @@ class EKFLocalizer : public rclcpp::Node double ekf_dt_; bool is_activated_; + bool is_set_initialpose_; EKFDiagnosticInfo pose_diag_info_; EKFDiagnosticInfo twist_diag_info_; diff --git a/localization/autoware_ekf_localizer/media/ekf_diagnostics.png b/localization/autoware_ekf_localizer/media/ekf_diagnostics.png index 234b2f1e19b6dd701dd1253b853580ab759f725d..a1561c3f5270709791a19557b874dfae1d6f56ba 100644 GIT binary patch literal 145097 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

YbpvNBYf`F%rAI);i#Bl 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

al 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 z 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%0DqZIG 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 XiOI=(SH+P(0Q}{QaCfBJ2a*2+{3E69 diff --git a/localization/autoware_ekf_localizer/src/diagnostics.cpp b/localization/autoware_ekf_localizer/src/diagnostics.cpp index a1af492487fe4..45468abf72d6c 100644 --- a/localization/autoware_ekf_localizer/src/diagnostics.cpp +++ b/localization/autoware_ekf_localizer/src/diagnostics.cpp @@ -41,6 +41,25 @@ diagnostic_msgs::msg::DiagnosticStatus check_process_activated(const bool is_act return stat; } +diagnostic_msgs::msg::DiagnosticStatus check_set_initialpose(const bool is_set_initialpose) +{ + diagnostic_msgs::msg::DiagnosticStatus stat; + + diagnostic_msgs::msg::KeyValue key_value; + key_value.key = "is_set_initialpose"; + key_value.value = is_set_initialpose ? "True" : "False"; + stat.values.push_back(key_value); + + stat.level = diagnostic_msgs::msg::DiagnosticStatus::OK; + stat.message = "OK"; + if (!is_set_initialpose) { + stat.level = diagnostic_msgs::msg::DiagnosticStatus::WARN; + stat.message = "[WARN]initial pose is not set"; + } + + return stat; +} + diagnostic_msgs::msg::DiagnosticStatus check_measurement_updated( const std::string & measurement_type, const size_t no_update_count, const size_t no_update_count_threshold_warn, const size_t no_update_count_threshold_error) diff --git a/localization/autoware_ekf_localizer/src/ekf_localizer.cpp b/localization/autoware_ekf_localizer/src/ekf_localizer.cpp index d34be2a537ef1..11d7788adfade 100644 --- a/localization/autoware_ekf_localizer/src/ekf_localizer.cpp +++ b/localization/autoware_ekf_localizer/src/ekf_localizer.cpp @@ -56,6 +56,7 @@ EKFLocalizer::EKFLocalizer(const rclcpp::NodeOptions & node_options) twist_queue_(params_.twist_smoothing_steps) { is_activated_ = false; + is_set_initialpose_ = false; /* initialize ros system */ timer_control_ = rclcpp::create_timer( @@ -143,6 +144,13 @@ void EKFLocalizer::timer_callback() return; } + if (!is_set_initialpose_) { + warning_->warn_throttle( + "Initial pose is not set. Provide initial pose to pose_initializer", 2000); + publish_diagnostics(geometry_msgs::msg::PoseStamped{}, current_time); + return; + } + DEBUG_INFO(get_logger(), "========================= timer called ========================="); /* update predict frequency with measured timer rate */ @@ -264,6 +272,8 @@ void EKFLocalizer::callback_initial_pose( params_.pose_frame_id.c_str(), msg->header.frame_id.c_str()); } ekf_module_->initialize(*msg, transform); + + is_set_initialpose_ = true; } /* @@ -272,7 +282,7 @@ void EKFLocalizer::callback_initial_pose( void EKFLocalizer::callback_pose_with_covariance( geometry_msgs::msg::PoseWithCovarianceStamped::SharedPtr msg) { - if (!is_activated_) { + if (!is_activated_ && !is_set_initialpose_) { return; } @@ -359,8 +369,9 @@ void EKFLocalizer::publish_diagnostics( std::vector diag_status_array; diag_status_array.push_back(check_process_activated(is_activated_)); + diag_status_array.push_back(check_set_initialpose(is_set_initialpose_)); - if (is_activated_) { + if (is_activated_ && is_set_initialpose_) { diag_status_array.push_back(check_measurement_updated( "pose", pose_diag_info_.no_update_count, params_.pose_no_update_count_threshold_warn, params_.pose_no_update_count_threshold_error)); @@ -439,6 +450,7 @@ void EKFLocalizer::service_trigger_node( is_activated_ = true; } else { is_activated_ = false; + is_set_initialpose_ = false; } res->success = true; } diff --git a/localization/autoware_ekf_localizer/test/test_diagnostics.cpp b/localization/autoware_ekf_localizer/test/test_diagnostics.cpp index 165102adec1d7..5ce39df484e98 100644 --- a/localization/autoware_ekf_localizer/test/test_diagnostics.cpp +++ b/localization/autoware_ekf_localizer/test/test_diagnostics.cpp @@ -35,6 +35,19 @@ TEST(TestEkfDiagnostics, check_process_activated) EXPECT_EQ(stat.level, diagnostic_msgs::msg::DiagnosticStatus::WARN); } +TEST(TestEkfDiagnostics, check_set_initialpose) +{ + diagnostic_msgs::msg::DiagnosticStatus stat; + + bool is_set_initialpose = true; + stat = check_set_initialpose(is_set_initialpose); + EXPECT_EQ(stat.level, diagnostic_msgs::msg::DiagnosticStatus::OK); + + is_set_initialpose = false; + stat = check_set_initialpose(is_set_initialpose); + EXPECT_EQ(stat.level, diagnostic_msgs::msg::DiagnosticStatus::WARN); +} + TEST(TestEkfDiagnostics, check_measurement_updated) { diagnostic_msgs::msg::DiagnosticStatus stat; From 1e686028828e17913a1885480c8d27101585adae Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Wed, 8 Jan 2025 14:18:01 +0900 Subject: [PATCH 039/127] test(blind_spot): add unit tests for util functions (#9597) Signed-off-by: Mamoru Sobue --- .../CMakeLists.txt | 16 +- .../manager.hpp | 3 +- .../parameter.hpp | 40 + .../scene.hpp | 15 +- .../util.hpp | 32 +- .../package.xml | 1 + .../src/manager.cpp | 18 +- .../src/parameter.cpp | 45 + .../src/scene.cpp | 24 +- .../src/util.cpp | 49 +- .../test/test_util.cpp | 448 +++ .../test_data/object_on_adj_lane.yaml | 2698 +++++++++++++++++ .../test_data/object_on_shoulder.yaml | 2512 +++++++++++++++ 13 files changed, 5824 insertions(+), 77 deletions(-) create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/parameter.hpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/parameter.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_util.cpp create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_adj_lane.yaml create mode 100644 planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_shoulder.yaml diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt index b28e486c9be05..220c380eb0fd7 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.14) project(autoware_behavior_velocity_blind_spot_module) +option(EXPORT_TEST_PLOT_FIGURE "Export plot figures in test" OFF) + find_package(autoware_cmake REQUIRED) autoware_package() pluginlib_export_plugin_description_file(autoware_behavior_velocity_planner plugins.xml) @@ -11,16 +13,20 @@ ament_auto_add_library(${PROJECT_NAME} SHARED src/scene.cpp src/decisions.cpp src/util.cpp + src/parameter.cpp ) if(BUILD_TESTING) + if(EXPORT_TEST_PLOT_FIGURE) + add_definitions(-DEXPORT_TEST_PLOT_FIGURE "-Wno-attributes") # // cspell: ignore DEXPORT + endif() find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() - file(GLOB_RECURSE TEST_SOURCES test/*.cpp) - ament_add_ros_isolated_gtest(test_${PROJECT_NAME} - ${TEST_SOURCES} + # NOTE(soblin): pybind11::scoped_interpreter needs to be initialized globally, not in the FixtureClass instantiated for each test suite + ament_add_gtest(test_${PROJECT_NAME}_util + test/test_util.cpp ) - target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) + target_link_libraries(test_${PROJECT_NAME}_util ${PROJECT_NAME}) endif() -ament_auto_package(INSTALL_TO_SHARE config) +ament_auto_package(INSTALL_TO_SHARE config test_data) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp index bf01986d5c28f..41330e459a524 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/manager.hpp @@ -15,6 +15,7 @@ #ifndef AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__MANAGER_HPP_ #define AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__MANAGER_HPP_ +#include "autoware/behavior_velocity_blind_spot_module/parameter.hpp" #include "autoware/behavior_velocity_blind_spot_module/scene.hpp" #include @@ -38,7 +39,7 @@ class BlindSpotModuleManager : public SceneModuleManagerInterfaceWithRTC const char * getModuleName() override { return "blind_spot"; } private: - BlindSpotModule::PlannerParam planner_param_; + PlannerParam planner_param_; void launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/parameter.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/parameter.hpp new file mode 100644 index 0000000000000..59322caecb62f --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/parameter.hpp @@ -0,0 +1,40 @@ +// Copyright 2024 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. + +#ifndef AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__PARAMETER_HPP_ +#define AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__PARAMETER_HPP_ + +#include + +#include + +namespace autoware::behavior_velocity_planner +{ +struct PlannerParam +{ + static PlannerParam init(rclcpp::Node & node, const std::string & ns); + bool use_pass_judge_line{}; + double stop_line_margin{}; + double backward_detection_length{}; + double ignore_width_from_center_line{}; + double adjacent_extend_width{}; + double opposite_adjacent_extend_width{}; + double max_future_movement_time{}; + double ttc_min{}; + double ttc_max{}; + double ttc_ego_minimal_velocity{}; +}; +} // namespace autoware::behavior_velocity_planner + +#endif // AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__PARAMETER_HPP_ diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp index 50ce8634ec600..5e8ef9fc8a063 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp @@ -15,6 +15,7 @@ #ifndef AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__SCENE_HPP_ #define AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__SCENE_HPP_ +#include #include #include #include @@ -70,20 +71,6 @@ class BlindSpotModule : public SceneModuleInterfaceWithRTC }; public: - struct PlannerParam - { - bool use_pass_judge_line; - double stop_line_margin; - double backward_detection_length; - double ignore_width_from_center_line; - double adjacent_extend_width; - double opposite_adjacent_extend_width; - double max_future_movement_time; - double ttc_min; - double ttc_max; - double ttc_ego_minimal_velocity; - }; - BlindSpotModule( const int64_t module_id, const int64_t lane_id, const TurnDirection turn_direction, const std::shared_ptr planner_data, const PlannerParam & planner_param, diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/util.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/util.hpp index 9d908414b6d95..e18d96709ef92 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/util.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/util.hpp @@ -16,6 +16,7 @@ #define AUTOWARE__BEHAVIOR_VELOCITY_BLIND_SPOT_MODULE__UTIL_HPP_ #include +#include #include @@ -25,6 +26,7 @@ #include #include #include +#include namespace autoware::behavior_velocity_planner { @@ -50,31 +52,49 @@ std::optional generateInterpolatedPathInfo( const lanelet::Id lane_id, const tier4_planning_msgs::msg::PathWithLaneId & input_path, rclcpp::Logger logger); +std::optional getFirstPointIntersectsLineByFootprint( + const lanelet::ConstLineString2d & line, const InterpolatedPathInfo & interpolated_path_info, + const autoware::universe_utils::LinearRing2d & footprint, const double vehicle_length); + std::optional getSiblingStraightLanelet( const lanelet::Lanelet assigned_lane, const lanelet::routing::RoutingGraphConstPtr routing_graph_ptr); /** - * @brief Create half lanelet - * @param lanelet input lanelet - * @return Half lanelet + * @brief generate a new lanelet object on the `turn_direction` side of `lanelet` which is offset + * from `ignore_width_from_centerline` from the centerline of `lanelet` + * @return new lanelet object */ lanelet::ConstLanelet generateHalfLanelet( const lanelet::ConstLanelet lanelet, const TurnDirection & turn_direction, const double ignore_width_from_centerline); +/** + * @brief generate a new lanelet object from the `turn_direction` side neighboring lanelet of the + * input `lanelet` by the width of `adjacent_extend_width` + * @param new lanelet object + */ lanelet::ConstLanelet generateExtendedAdjacentLanelet( const lanelet::ConstLanelet lanelet, const TurnDirection direction, const double adjacent_extend_width); + +/** + * @brief generate a new lanelet object from the `turn_direction` side neighboring opposite lanelet + * of the input `lanelet` by the width of `opposite_adjacent_extend_width` + * @param new lanelet object + */ lanelet::ConstLanelet generateExtendedOppositeAdjacentLanelet( const lanelet::ConstLanelet lanelet, const TurnDirection direction, const double opposite_adjacent_extend_width); +std::vector find_lane_ids_upto( + const tier4_planning_msgs::msg::PathWithLaneId & path, const lanelet::Id lane_id); + lanelet::ConstLanelets generateBlindSpotLanelets( const std::shared_ptr route_handler, - const TurnDirection turn_direction, const lanelet::Id lane_id, - const tier4_planning_msgs::msg::PathWithLaneId & path, const double ignore_width_from_centerline, - const double adjacent_extend_width, const double opposite_adjacent_extend_width); + const TurnDirection turn_direction, const std::vector & lane_ids_upto_intersection, + const double ignore_width_from_centerline, const double adjacent_extend_width, + const double opposite_adjacent_extend_width); /** * @brief Make blind spot areas. Narrow area is made from closest path point to stop line index. diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml index 8c34678f439ed..dabd3045b31d2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/package.xml @@ -25,6 +25,7 @@ autoware_perception_msgs autoware_planning_msgs autoware_route_handler + autoware_test_utils autoware_universe_utils geometry_msgs pluginlib diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp index a1410d2fecfd5..d6cae9004600a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp @@ -34,23 +34,7 @@ BlindSpotModuleManager::BlindSpotModuleManager(rclcpp::Node & node) node, getModuleName(), getEnableRTC(node, std::string(getModuleName()) + ".enable_rtc")) { const std::string ns(BlindSpotModuleManager::getModuleName()); - planner_param_.use_pass_judge_line = - getOrDeclareParameter(node, ns + ".use_pass_judge_line"); - planner_param_.stop_line_margin = getOrDeclareParameter(node, ns + ".stop_line_margin"); - planner_param_.backward_detection_length = - getOrDeclareParameter(node, ns + ".backward_detection_length"); - planner_param_.ignore_width_from_center_line = - getOrDeclareParameter(node, ns + ".ignore_width_from_center_line"); - planner_param_.adjacent_extend_width = - getOrDeclareParameter(node, ns + ".adjacent_extend_width"); - planner_param_.opposite_adjacent_extend_width = - getOrDeclareParameter(node, ns + ".opposite_adjacent_extend_width"); - planner_param_.max_future_movement_time = - getOrDeclareParameter(node, ns + ".max_future_movement_time"); - planner_param_.ttc_min = getOrDeclareParameter(node, ns + ".ttc_min"); - planner_param_.ttc_max = getOrDeclareParameter(node, ns + ".ttc_max"); - planner_param_.ttc_ego_minimal_velocity = - getOrDeclareParameter(node, ns + ".ttc_ego_minimal_velocity"); + planner_param_ = PlannerParam::init(node, ns); } void BlindSpotModuleManager::launchNewModules(const tier4_planning_msgs::msg::PathWithLaneId & path) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/parameter.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/parameter.cpp new file mode 100644 index 0000000000000..0984de6f73262 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/parameter.cpp @@ -0,0 +1,45 @@ +// Copyright 2024 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. + +#include "autoware/behavior_velocity_blind_spot_module/parameter.hpp" + +#include + +#include + +namespace autoware::behavior_velocity_planner +{ + +PlannerParam PlannerParam::init(rclcpp::Node & node, const std::string & ns) +{ + using autoware::universe_utils::getOrDeclareParameter; + PlannerParam param; + param.use_pass_judge_line = getOrDeclareParameter(node, ns + ".use_pass_judge_line"); + param.stop_line_margin = getOrDeclareParameter(node, ns + ".stop_line_margin"); + param.backward_detection_length = + getOrDeclareParameter(node, ns + ".backward_detection_length"); + param.ignore_width_from_center_line = + getOrDeclareParameter(node, ns + ".ignore_width_from_center_line"); + param.adjacent_extend_width = getOrDeclareParameter(node, ns + ".adjacent_extend_width"); + param.opposite_adjacent_extend_width = + getOrDeclareParameter(node, ns + ".opposite_adjacent_extend_width"); + param.max_future_movement_time = + getOrDeclareParameter(node, ns + ".max_future_movement_time"); + param.ttc_min = getOrDeclareParameter(node, ns + ".ttc_min"); + param.ttc_max = getOrDeclareParameter(node, ns + ".ttc_max"); + param.ttc_ego_minimal_velocity = + getOrDeclareParameter(node, ns + ".ttc_ego_minimal_velocity"); + return param; +} +} // namespace autoware::behavior_velocity_planner diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp index 7d1a68c5006a0..8a9401646aaea 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp @@ -101,8 +101,9 @@ BlindSpotDecision BlindSpotModule::modifyPathVelocityDetail(PathWithLaneId * pat } if (!blind_spot_lanelets_) { + const auto lane_ids_upto_intersection = find_lane_ids_upto(input_path, lane_id_); const auto blind_spot_lanelets = generateBlindSpotLanelets( - planner_data_->route_handler_, turn_direction_, lane_id_, input_path, + planner_data_->route_handler_, turn_direction_, lane_ids_upto_intersection, planner_param_.ignore_width_from_center_line, planner_param_.adjacent_extend_width, planner_param_.opposite_adjacent_extend_width); if (!blind_spot_lanelets.empty()) { @@ -179,27 +180,6 @@ bool BlindSpotModule::modifyPathVelocity(PathWithLaneId * path) return true; } -static std::optional getFirstPointIntersectsLineByFootprint( - const lanelet::ConstLineString2d & line, const InterpolatedPathInfo & interpolated_path_info, - const autoware::universe_utils::LinearRing2d & footprint, const double vehicle_length) -{ - const auto & path_ip = interpolated_path_info.path; - const auto [lane_start, lane_end] = interpolated_path_info.lane_id_interval.value(); - const size_t vehicle_length_idx = static_cast(vehicle_length / interpolated_path_info.ds); - const size_t start = - static_cast(std::max(0, static_cast(lane_start) - vehicle_length_idx)); - const auto line2d = line.basicLineString(); - for (auto i = start; i <= lane_end; ++i) { - const auto & base_pose = path_ip.points.at(i).point.pose; - const auto path_footprint = autoware::universe_utils::transformVector( - footprint, autoware::universe_utils::pose2transform(base_pose)); - if (bg::intersects(path_footprint, line2d)) { - return std::make_optional(i); - } - } - return std::nullopt; -} - static std::optional getDuplicatedPointIdx( const tier4_planning_msgs::msg::PathWithLaneId & path, const geometry_msgs::msg::Point & point) { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/util.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/util.cpp index 5c5aa0a26b3b4..8451661b2b71f 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/util.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/util.cpp @@ -88,6 +88,27 @@ std::optional generateInterpolatedPathInfo( return interpolated_path_info; } +std::optional getFirstPointIntersectsLineByFootprint( + const lanelet::ConstLineString2d & line, const InterpolatedPathInfo & interpolated_path_info, + const autoware::universe_utils::LinearRing2d & footprint, const double vehicle_length) +{ + const auto & path_ip = interpolated_path_info.path; + const auto [lane_start, lane_end] = interpolated_path_info.lane_id_interval.value(); + const size_t vehicle_length_idx = static_cast(vehicle_length / interpolated_path_info.ds); + const size_t start = + static_cast(std::max(0, static_cast(lane_start) - vehicle_length_idx)); + const auto line2d = line.basicLineString(); + for (auto i = start; i <= lane_end; ++i) { + const auto & base_pose = path_ip.points.at(i).point.pose; + const auto path_footprint = autoware::universe_utils::transformVector( + footprint, autoware::universe_utils::pose2transform(base_pose)); + if (boost::geometry::intersects(path_footprint, line2d)) { + return std::make_optional(i); + } + } + return std::nullopt; +} + std::optional getSiblingStraightLanelet( const lanelet::Lanelet assigned_lane, const lanelet::routing::RoutingGraphConstPtr routing_graph_ptr) @@ -200,15 +221,9 @@ static lanelet::LineString3d removeConst(lanelet::ConstLineString3d line) return lanelet::LineString3d(lanelet::InvalId, pts); } -lanelet::ConstLanelets generateBlindSpotLanelets( - const std::shared_ptr route_handler, - const TurnDirection turn_direction, const lanelet::Id lane_id, - const tier4_planning_msgs::msg::PathWithLaneId & path, const double ignore_width_from_centerline, - const double adjacent_extend_width, const double opposite_adjacent_extend_width) +std::vector find_lane_ids_upto( + const tier4_planning_msgs::msg::PathWithLaneId & path, const lanelet::Id lane_id) { - const auto lanelet_map_ptr = route_handler->getLaneletMapPtr(); - const auto routing_graph_ptr = route_handler->getRoutingGraphPtr(); - std::vector lane_ids; /* get lane ids until intersection */ for (const auto & point : path.points) { @@ -216,19 +231,29 @@ lanelet::ConstLanelets generateBlindSpotLanelets( for (const auto id : point.lane_ids) { if (id == lane_id) { found_intersection_lane = true; - lane_ids.push_back(lane_id); break; } // make lane_ids unique - if (std::find(lane_ids.begin(), lane_ids.end(), lane_id) == lane_ids.end()) { - lane_ids.push_back(lane_id); + if (std::find(lane_ids.begin(), lane_ids.end(), id) == lane_ids.end()) { + lane_ids.push_back(id); } } if (found_intersection_lane) break; } + return lane_ids; +} + +lanelet::ConstLanelets generateBlindSpotLanelets( + const std::shared_ptr route_handler, + const TurnDirection turn_direction, const std::vector & lane_ids_upto_intersection, + const double ignore_width_from_centerline, const double adjacent_extend_width, + const double opposite_adjacent_extend_width) +{ + const auto lanelet_map_ptr = route_handler->getLaneletMapPtr(); + const auto routing_graph_ptr = route_handler->getRoutingGraphPtr(); lanelet::ConstLanelets blind_spot_lanelets; - for (const auto i : lane_ids) { + for (const auto i : lane_ids_upto_intersection) { const auto lane = lanelet_map_ptr->laneletLayer.get(i); const auto ego_half_lanelet = generateHalfLanelet(lane, turn_direction, ignore_width_from_centerline); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_util.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_util.cpp new file mode 100644 index 0000000000000..5c2a239e4142f --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test/test_util.cpp @@ -0,0 +1,448 @@ +// Copyright 2024 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. + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#ifdef EXPORT_TEST_PLOT_FIGURE +#include +#include +#include +#include + +#include +#include // needed for passing std::string to Args + +#endif + +using autoware::test_utils::parse; + +class TestWithAdjLaneData : public ::testing::Test +{ +protected: + void SetUp() override + { + const auto test_data_file = + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/object_on_adj_lane.yaml"; + const auto config = YAML::LoadFile(test_data_file); + const auto route = parse(config["route"]); + const auto map_path = + autoware::test_utils::resolve_pkg_share_uri(config["map_path_uri"].as()); + if (!map_path) { + ASSERT_DEATH({ assert(false); }, "invalid map path"); + } + const auto intersection_map = autoware::test_utils::make_map_bin_msg(map_path.value()); + route_handler = std::make_shared(); + route_handler->setMap(intersection_map); + route_handler->setRoute(route); + self_odometry = autoware::test_utils::create_const_shared_ptr( + parse(config["self_odometry"])); + dynamic_object = autoware::test_utils::create_const_shared_ptr( + parse(config["dynamic_object"])); + path_with_lane_id = + parse(config["path_with_lane_id"]); + + // parameter + auto node_options = rclcpp::NodeOptions{}; + node_options.arguments(std::vector{ + "--ros-args", + "--params-file", + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/config/blind_spot.param.yaml", + }); + + auto node = rclcpp::Node::make_shared("blind_spot_test", node_options); + param = autoware::behavior_velocity_planner::PlannerParam::init(*node, "blind_spot"); + } + + std::shared_ptr route_handler{}; + std::shared_ptr self_odometry{}; + std::shared_ptr dynamic_object{}; + const lanelet::Id lane_id_{2200}; + tier4_planning_msgs::msg::PathWithLaneId path_with_lane_id; + autoware::behavior_velocity_planner::PlannerParam param; +}; + +TEST_F(TestWithAdjLaneData, getSiblingStraightLanelet) +{ + const auto sibling_straight_lanelet_opt = + autoware::behavior_velocity_planner::getSiblingStraightLanelet( + route_handler->getLaneletMapPtr()->laneletLayer.get(lane_id_), + route_handler->getRoutingGraphPtr()); + ASSERT_NO_FATAL_FAILURE({ ASSERT_TRUE(sibling_straight_lanelet_opt.has_value()); }); + EXPECT_EQ(sibling_straight_lanelet_opt.value().id(), 2100); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + autoware::test_utils::plot_lanelet2_object( + route_handler->getLaneletMapPtr()->laneletLayer.get(lane_id_), ax, + autoware::test_utils::LaneConfig{"intersection turning lanes", LineConfig{"blue"}}); + + // for illustration + autoware::test_utils::plot_lanelet2_object( + route_handler->getLaneletMapPtr()->laneletLayer.get(3010933), ax, + autoware::test_utils::LaneConfig{std::nullopt, LineConfig{"green"}}); + autoware::test_utils::plot_lanelet2_object( + route_handler->getLaneletMapPtr()->laneletLayer.get(2201), ax, + autoware::test_utils::LaneConfig{std::nullopt, LineConfig{"blue"}}); + autoware::test_utils::plot_lanelet2_object( + route_handler->getLaneletMapPtr()->laneletLayer.get(2202), ax, + autoware::test_utils::LaneConfig{std::nullopt, LineConfig{"blue"}}); + autoware::test_utils::plot_lanelet2_object( + route_handler->getLaneletMapPtr()->laneletLayer.get(2010), ax, + autoware::test_utils::LaneConfig{std::nullopt, LineConfig{"green"}}); + + const auto [x0, x1] = ax.get_xlim(); + const auto [y0, y1] = ax.get_ylim(); + const double width = x1 - x0; + const double height = y1 - y0; + ax.set_xlim(Args(x0, x0 + width * 1.3)); + ax.set_ylim(Args(y0, y0 + height * 1.3)); + autoware::test_utils::plot_lanelet2_object( + sibling_straight_lanelet_opt.value(), ax, + LaneConfig{"sibling_straight_lanelet", LineConfig{"red"}}); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +TEST_F(TestWithAdjLaneData, generateHalfLanelet) +{ + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(2010); + + const auto half_lanelet = autoware::behavior_velocity_planner::generateHalfLanelet( + lanelet, autoware::behavior_velocity_planner::TurnDirection::LEFT, + param.ignore_width_from_center_line); + + /* + TODO(soblin): how to check if they overlap only on the left line string + EXPECT_EQ( + boost::geometry::within( + half_lanelet.polygon2d().basicPolygon(), lanelet.polygon2d().basicPolygon()), + true); + */ + EXPECT_EQ( + boost::geometry::area(lanelet.polygon2d().basicPolygon()) / 2.0 > + boost::geometry::area(half_lanelet.polygon2d().basicPolygon()), + true); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, autoware::test_utils::LaneConfig{"original", LineConfig{"blue", 1.5}}); + autoware::test_utils::plot_lanelet2_object( + half_lanelet, ax, LaneConfig{"half lanelet", LineConfig{"red", 0.75}}); + + const auto [x0, x1] = ax.get_xlim(); + const auto [y0, y1] = ax.get_ylim(); + const double width = x1 - x0; + // const double height = y1 - y0; + ax.set_xlim(Args(x0, x0 + width * 1.3)); + ax.set_ylim(Args(y0, 650)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +TEST_F(TestWithAdjLaneData, generateExtendedAdjacentLanelet) +{ + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(2010); + const auto adj_lanelet = *(route_handler->getRoutingGraphPtr()->adjacentLeft(lanelet)); + + const auto extended_adj_lanelet = + autoware::behavior_velocity_planner::generateExtendedAdjacentLanelet( + adj_lanelet, autoware::behavior_velocity_planner::TurnDirection::LEFT, + param.adjacent_extend_width); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, autoware::test_utils::LaneConfig{"given", LineConfig{"blue", 1.0}}); + autoware::test_utils::plot_lanelet2_object( + adj_lanelet, ax, autoware::test_utils::LaneConfig{"adjacent", LineConfig{"green", 1.0}}); + autoware::test_utils::plot_lanelet2_object( + extended_adj_lanelet, ax, LaneConfig{"generated", LineConfig{"red", 2.0}}); + + const auto [x0, x1] = ax.get_xlim(); + const auto [y0, y1] = ax.get_ylim(); + const double width = x1 - x0; + const double height = y1 - y0; + ax.set_xlim(Args(x0, x0 + width * 1.3)); + ax.set_ylim(Args(y0, y0 + height * 1.3)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +TEST_F(TestWithAdjLaneData, generateBlindSpotLanelets_left) +{ + const auto blind_spot_lanelets = autoware::behavior_velocity_planner::generateBlindSpotLanelets( + route_handler, autoware::behavior_velocity_planner::TurnDirection::LEFT, {2000, 2010}, + param.ignore_width_from_center_line, param.adjacent_extend_width, + param.opposite_adjacent_extend_width); + EXPECT_EQ(blind_spot_lanelets.size(), 2); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + for (const auto & id : {2010, 3010933, 2200, 3010920, 3010933, 2000}) { + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(id); + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, LaneConfig{std::nullopt, LineConfig{"k", 0.75}}); + } + for (const auto & blind_spot_lanelet : blind_spot_lanelets) { + autoware::test_utils::plot_lanelet2_object( + blind_spot_lanelet, ax, LaneConfig{"blind_spot_lanelet", LineConfig{"blue", 2.0}}); + } + const auto [y0, y1] = ax.get_ylim(); + const double height = y1 - y0; + ax.set_xlim(Args(300, 365)); + ax.set_ylim(Args(y0, y0 + height * 1.3)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +TEST_F(TestWithAdjLaneData, generateBlindSpotLanelets_right) +{ + const auto blind_spot_lanelets = autoware::behavior_velocity_planner::generateBlindSpotLanelets( + route_handler, autoware::behavior_velocity_planner::TurnDirection::RIGHT, {3008067}, + param.ignore_width_from_center_line, param.adjacent_extend_width, + param.opposite_adjacent_extend_width); + EXPECT_EQ(blind_spot_lanelets.size(), 1); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + for (const auto & id : {3008057, 3008054, 3008056, 3008061, 3008062, 3008059, 3008067, 3008066}) { + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(id); + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, LaneConfig{std::nullopt, LineConfig{"k", 0.75}}); + } + for (const auto & blind_spot_lanelet : blind_spot_lanelets) { + autoware::test_utils::plot_lanelet2_object( + blind_spot_lanelet, ax, LaneConfig{"blind_spot_lanelet", LineConfig{"blue", 2.0}}); + } + ax.set_xlim(Args(905, 920)); + ax.set_ylim(Args(650, 950)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +TEST_F(TestWithAdjLaneData, generateInterpolatedPathInfo) +{ + const auto interpolated_path_info_opt = + autoware::behavior_velocity_planner::generateInterpolatedPathInfo( + lane_id_, path_with_lane_id, rclcpp::get_logger("test")); + EXPECT_EQ(interpolated_path_info_opt.has_value(), true); + const auto & interpolated_path_info = interpolated_path_info_opt.value(); + EXPECT_EQ(interpolated_path_info.lane_id_interval.has_value(), true); + const auto [start, end] = interpolated_path_info.lane_id_interval.value(); + tier4_planning_msgs::msg::PathWithLaneId interpolated_path; + for (auto i = start; i <= end; ++i) { + interpolated_path.points.push_back(interpolated_path_info.path.points.at(i)); + } +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + using autoware::test_utils::PathWithLaneIdConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + for (const auto & id : {2010, 3010933, 2200, 3010920, 3010933, 2000, 3500}) { + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(id); + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, LaneConfig{std::nullopt, LineConfig{"k", 0.75}}); + } + autoware::test_utils::plot_autoware_object( + path_with_lane_id, ax, PathWithLaneIdConfig{"original path", "red", 0.75}); + autoware::test_utils::plot_autoware_object( + interpolated_path, ax, PathWithLaneIdConfig{"interpolated path on lane 2010", "blue", 1.0}); + const auto [x0, x1] = ax.get_xlim(); + ax.set_xlim(Args(335, x1)); + ax.set_ylim(Args(640, 670)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper right"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +class TestWithShoulderData : public ::testing::Test +{ +protected: + void SetUp() override + { + const auto test_data_file = + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/object_on_shoulder.yaml"; + const auto config = YAML::LoadFile(test_data_file); + const auto route = parse(config["route"]); + const auto map_path = + autoware::test_utils::resolve_pkg_share_uri(config["map_path_uri"].as()); + if (!map_path) { + ASSERT_DEATH({ assert(false); }, "invalid map path"); + } + const auto intersection_map = autoware::test_utils::make_map_bin_msg(map_path.value()); + route_handler = std::make_shared(); + route_handler->setMap(intersection_map); + route_handler->setRoute(route); + self_odometry = autoware::test_utils::create_const_shared_ptr( + parse(config["self_odometry"])); + dynamic_object = autoware::test_utils::create_const_shared_ptr( + parse(config["dynamic_object"])); + path_with_lane_id = + parse(config["path_with_lane_id"]); + + // parameter + auto node_options = rclcpp::NodeOptions{}; + node_options.arguments(std::vector{ + "--ros-args", + "--params-file", + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/config/blind_spot.param.yaml", + }); + + auto node = rclcpp::Node::make_shared("blind_spot_test", node_options); + param = autoware::behavior_velocity_planner::PlannerParam::init(*node, "blind_spot"); + } + + std::shared_ptr route_handler{}; + std::shared_ptr self_odometry{}; + std::shared_ptr dynamic_object{}; + const lanelet::Id lane_id_{1010}; + tier4_planning_msgs::msg::PathWithLaneId path_with_lane_id; + autoware::behavior_velocity_planner::PlannerParam param; +}; + +TEST_F(TestWithShoulderData, generateBlindSpotLaneletsShoulder_left) +{ + const auto blind_spot_lanelets = autoware::behavior_velocity_planner::generateBlindSpotLanelets( + route_handler, autoware::behavior_velocity_planner::TurnDirection::LEFT, {1000, 1010}, + param.ignore_width_from_center_line, param.adjacent_extend_width, + param.opposite_adjacent_extend_width); + EXPECT_EQ(blind_spot_lanelets.size(), 2); + +#ifdef EXPORT_TEST_PLOT_FIGURE + py::gil_scoped_acquire acquire; + using autoware::test_utils::LaneConfig; + using autoware::test_utils::LineConfig; + auto plt = autoware::pyplot::import(); + auto [fig, axes] = plt.subplots(1, 1); + auto & ax = axes[0]; + for (const auto & id : {1000, 1010, 3010907, 3010879, 1200, 1100}) { + const auto lanelet = route_handler->getLaneletMapPtr()->laneletLayer.get(id); + autoware::test_utils::plot_lanelet2_object( + lanelet, ax, LaneConfig{std::nullopt, LineConfig{"k", 0.75}}); + } + for (const auto & blind_spot_lanelet : blind_spot_lanelets) { + autoware::test_utils::plot_lanelet2_object( + blind_spot_lanelet, ax, LaneConfig{"blind_spot_lanelet", LineConfig{"blue", 2.0}}); + } + ax.set_xlim(Args(330, 365)); + ax.set_ylim(Args(580, 625)); + ax.set_aspect(Args("equal")); + ax.grid(); + ax.legend(Args(), Kwargs{"loc"_a = "upper left"}); + fig.tight_layout(); + const std::string filename = std::string( + ament_index_cpp::get_package_share_directory("autoware_behavior_velocity_blind_spot_module") + + "/test_data/" + ::testing::UnitTest::GetInstance()->current_test_info()->name() + ".svg"); + plt.savefig(Args(filename)); +#endif +} + +int main(int argc, char ** argv) +{ +#ifdef EXPORT_TEST_PLOT_FIGURE + py::scoped_interpreter guard{}; +#endif + rclcpp::init(0, nullptr); + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_adj_lane.yaml b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_adj_lane.yaml new file mode 100644 index 0000000000000..97068d69cd296 --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_adj_lane.yaml @@ -0,0 +1,2698 @@ +# +# AUTO GENERATED by autoware_test_utils::topic_snapshot_saver +# format1: +# +# format_version: +# map_path_uri: package:/// +# fields(this is array) +# - name: +# type: either {Odometry | AccelWithCovarianceStamped | PredictedObjects | OperationModeState | LaneletRoute | TrafficLightGroupArray | TrackedObjects | PathWithLaneId | TBD} +# topic: +# +format_version: 1 +map_path_uri: package://autoware_test_utils/test_map/intersection/lanelet2_map.osm +path_with_lane_id: + header: + stamp: + sec: 563 + nanosec: 125840339 + frame_id: map + points: + - point: + pose: + position: + x: 330.010 + y: 643.206 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00655991 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 332.010 + y: 643.233 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00656125 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 334.009 + y: 643.259 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00658745 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 336.009 + y: 643.285 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00660718 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 338.009 + y: 643.312 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00658719 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 340.009 + y: 643.338 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00656661 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 342.009 + y: 643.364 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00657433 + w: 0.999978 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - point: + pose: + position: + x: 342.809 + y: 643.375 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0162350 + w: 0.999868 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2010 + - 2200 + - point: + pose: + position: + x: 344.008 + y: 643.414 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0355542 + w: 0.999368 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 346.003 + y: 643.556 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0600763 + w: 0.998194 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 347.986 + y: 643.796 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.134724 + w: 0.990883 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 349.912 + y: 644.329 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.199426 + w: 0.979913 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 351.776 + y: 645.121 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.281519 + w: 0.959556 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 353.448 + y: 646.194 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.345347 + w: 0.938475 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 354.997 + y: 647.513 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.407454 + w: 0.913226 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 356.322 + y: 648.989 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.480104 + w: 0.877212 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 357.418 + y: 650.701 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.544895 + w: 0.838504 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 358.228 + y: 652.525 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.610262 + w: 0.792199 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 358.741 + y: 654.467 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.646506 + w: 0.762909 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 359.070 + y: 656.445 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.697457 + w: 0.716627 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 359.124 + y: 658.438 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.713869 + w: 0.700280 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 359.085 + y: 660.438 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714886 + w: 0.699241 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - point: + pose: + position: + x: 359.052 + y: 661.935 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2200 + - 3500 + - point: + pose: + position: + x: 359.040 + y: 662.438 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.993 + y: 664.437 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.945 + y: 666.436 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715334 + w: 0.698782 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.900 + y: 668.374 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714518 + w: 0.699617 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.858 + y: 670.373 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712894 + w: 0.701272 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.825 + y: 672.373 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710606 + w: 0.703590 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.807 + y: 674.174 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.705159 + w: 0.709049 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + - point: + pose: + position: + x: 358.812 + y: 675.174 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.705159 + w: 0.709049 + longitudinal_velocity_mps: 0.00000 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 3500 + left_bound: + - x: 329.488 + y: 644.822 + z: 100.000 + - x: 332.672 + y: 644.864 + z: 100.000 + - x: 334.352 + y: 644.886 + z: 100.000 + - x: 336.351 + y: 644.913 + z: 100.000 + - x: 337.719 + y: 644.931 + z: 100.000 + - x: 340.352 + y: 644.965 + z: 100.000 + - x: 342.813 + y: 645.020 + z: 100.000 + - x: 344.277 + y: 645.102 + z: 100.000 + - x: 346.200 + y: 645.256 + z: 100.000 + - x: 347.374 + y: 645.428 + z: 100.000 + - x: 348.470 + y: 645.697 + z: 100.000 + - x: 349.568 + y: 646.035 + z: 100.000 + - x: 350.592 + y: 646.513 + z: 100.000 + - x: 351.572 + y: 647.043 + z: 100.000 + - x: 352.507 + y: 647.713 + z: 100.000 + - x: 353.327 + y: 648.476 + z: 100.000 + - x: 354.109 + y: 649.196 + z: 100.000 + - x: 354.661 + y: 649.830 + z: 100.000 + - x: 355.275 + y: 650.523 + z: 100.000 + - x: 356.177 + y: 652.020 + z: 100.000 + - x: 356.615 + y: 653.084 + z: 100.000 + - x: 356.929 + y: 654.139 + z: 100.000 + - x: 357.146 + y: 655.241 + z: 100.000 + - x: 357.284 + y: 656.160 + z: 100.000 + - x: 357.312 + y: 657.420 + z: 100.000 + - x: 357.425 + y: 658.703 + z: 100.000 + - x: 357.383 + y: 660.465 + z: 100.000 + - x: 357.349 + y: 661.894 + z: 100.000 + - x: 357.386 + y: 664.700 + z: 100.000 + - x: 357.338 + y: 666.699 + z: 100.000 + - x: 357.291 + y: 668.699 + z: 100.000 + - x: 357.243 + y: 670.698 + z: 100.000 + - x: 357.195 + y: 672.698 + z: 100.000 + - x: 357.148 + y: 674.697 + z: 100.000 + - x: 357.021 + y: 680.023 + z: 100.000 + right_bound: + - x: 329.531 + y: 641.578 + z: 100.000 + - x: 332.717 + y: 641.619 + z: 100.000 + - x: 334.395 + y: 641.641 + z: 100.000 + - x: 336.394 + y: 641.668 + z: 100.000 + - x: 337.761 + y: 641.686 + z: 100.000 + - x: 340.394 + y: 641.721 + z: 100.000 + - x: 342.805 + y: 641.730 + z: 100.000 + - x: 344.462 + y: 641.823 + z: 100.000 + - x: 346.283 + y: 641.878 + z: 100.000 + - x: 347.708 + y: 641.985 + z: 100.000 + - x: 349.158 + y: 642.284 + z: 100.000 + - x: 350.570 + y: 642.681 + z: 100.000 + - x: 351.954 + y: 643.219 + z: 100.000 + - x: 353.269 + y: 643.933 + z: 100.000 + - x: 354.499 + y: 644.727 + z: 100.000 + - x: 355.646 + y: 645.678 + z: 100.000 + - x: 356.516 + y: 646.483 + z: 100.000 + - x: 357.282 + y: 647.228 + z: 100.000 + - x: 357.690 + y: 647.819 + z: 100.000 + - x: 358.527 + y: 649.081 + z: 100.000 + - x: 359.237 + y: 650.418 + z: 100.000 + - x: 359.789 + y: 651.774 + z: 100.000 + - x: 360.225 + y: 653.220 + z: 100.000 + - x: 360.523 + y: 654.391 + z: 100.000 + - x: 360.701 + y: 655.780 + z: 100.000 + - x: 360.976 + y: 657.487 + z: 100.000 + - x: 360.804 + y: 658.842 + z: 100.000 + - x: 360.774 + y: 660.766 + z: 100.000 + - x: 360.755 + y: 661.975 + z: 100.000 + - x: 360.585 + y: 664.776 + z: 100.000 + - x: 360.537 + y: 666.776 + z: 100.000 + - x: 360.490 + y: 668.775 + z: 100.000 + - x: 360.442 + y: 670.774 + z: 100.000 + - x: 360.394 + y: 672.774 + z: 100.000 + - x: 360.347 + y: 674.773 + z: 100.000 + - x: 360.220 + y: 680.099 + z: 100.000 +dynamic_object: + header: + stamp: + sec: 563 + nanosec: 160706650 + frame_id: map + objects: + - object_id: + uuid: + - 6 + - 144 + - 167 + - 221 + - 26 + - 196 + - 145 + - 186 + - 207 + - 95 + - 21 + - 211 + - 96 + - 13 + - 92 + - 5 + existence_probability: 0.00000 + classification: + - label: 6 + probability: 1.00000 + kinematics: + initial_pose_with_covariance: + pose: + position: + x: 404.688 + y: 647.065 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + covariance: + - 0.415785 + - -0.000621846 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - -0.000621846 + - 0.388031 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0108039 + initial_twist_with_covariance: + twist: + linear: + x: 9.96635 + y: 3.24754e-05 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 5.69744e-05 + covariance: + - 1.01780 + - -2.02150e-05 + - 0.00000 + - 0.00000 + - 0.00000 + - -3.54650e-05 + - -2.02150e-05 + - 0.00403854 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00708516 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - -3.54650e-05 + - 0.00708516 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0124301 + initial_acceleration_with_covariance: + accel: + linear: + x: 0.00000 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + predicted_paths: + - path: + - position: + x: 404.688 + y: 647.065 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 409.670 + y: 647.155 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 414.653 + y: 647.245 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 419.635 + y: 647.335 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 424.617 + y: 647.425 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 429.600 + y: 647.515 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 434.582 + y: 647.605 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 439.565 + y: 647.694 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 444.547 + y: 647.784 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 449.529 + y: 647.874 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 454.512 + y: 647.964 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 459.494 + y: 648.054 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 464.476 + y: 648.144 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 469.459 + y: 648.233 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 474.441 + y: 648.323 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 479.423 + y: 648.413 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 484.406 + y: 648.503 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 489.388 + y: 648.593 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 494.371 + y: 648.683 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 499.353 + y: 648.773 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + - position: + x: 504.335 + y: 648.862 + z: 100.630 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00901435 + w: 0.999959 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 1.00000 + shape: + type: 0 + footprint: + points: [] + dimensions: + x: 1.90000 + y: 0.501209 + z: 0.690476 + - object_id: + uuid: + - 32 + - 119 + - 141 + - 16 + - 72 + - 85 + - 32 + - 153 + - 66 + - 136 + - 88 + - 177 + - 247 + - 166 + - 151 + - 80 + existence_probability: 0.00000 + classification: + - label: 6 + probability: 1.00000 + kinematics: + initial_pose_with_covariance: + pose: + position: + x: 323.928 + y: 644.831 + z: 100.568 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00410256 + w: 0.999992 + covariance: + - 0.0657687 + - -0.000366900 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - -0.000366900 + - 0.0451891 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00300423 + initial_twist_with_covariance: + twist: + linear: + x: 10.0048 + y: -0.00124906 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: -0.00219133 + covariance: + - 0.522271 + - -6.09993e-05 + - 0.00000 + - 0.00000 + - 0.00000 + - -0.000107016 + - -6.09993e-05 + - 0.00263830 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00462859 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - -0.000107016 + - 0.00462859 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00812034 + initial_acceleration_with_covariance: + accel: + linear: + x: 0.00000 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + predicted_paths: + - path: + - position: + x: 323.928 + y: 644.831 + z: 100.568 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00410256 + w: 0.999992 + - position: + x: 328.930 + y: 644.785 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00453640 + w: 0.999990 + - position: + x: 333.933 + y: 644.723 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00622365 + w: 0.999981 + - position: + x: 338.935 + y: 644.640 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00828910 + w: 0.999966 + - position: + x: 343.877 + y: 644.600 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00409926 + w: 0.999992 + - position: + x: 348.624 + y: 645.122 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0547342 + w: 0.998501 + - position: + x: 352.898 + y: 646.993 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.204867 + w: 0.978790 + - position: + x: 356.221 + y: 650.176 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.372718 + w: 0.927945 + - position: + x: 358.029 + y: 654.521 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.554937 + w: 0.831892 + - position: + x: 358.484 + y: 659.393 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.673390 + w: 0.739287 + - position: + x: 358.380 + y: 664.391 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714418 + w: 0.699720 + - position: + x: 358.261 + y: 669.391 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.142 + y: 674.391 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.023 + y: 679.392 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.904 + y: 684.392 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.784 + y: 689.392 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.665 + y: 694.393 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.546 + y: 699.393 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.427 + y: 704.394 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.308 + y: 709.394 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.188 + y: 714.395 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.069 + y: 719.395 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.950 + y: 724.396 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.831 + y: 729.397 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.712 + y: 734.398 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.593 + y: 739.399 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.473 + y: 744.400 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.354 + y: 749.400 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.235 + y: 754.401 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.116 + y: 759.402 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.997 + y: 764.403 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.250000 + - path: + - position: + x: 323.928 + y: 644.831 + z: 100.568 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00410256 + w: 0.999992 + - position: + x: 328.930 + y: 644.786 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00451016 + w: 0.999990 + - position: + x: 333.933 + y: 644.725 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00607237 + w: 0.999982 + - position: + x: 338.935 + y: 644.645 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00796688 + w: 0.999968 + - position: + x: 343.880 + y: 644.606 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00392303 + w: 0.999992 + - position: + x: 348.786 + y: 644.906 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0304731 + w: 0.999536 + - position: + x: 353.463 + y: 645.966 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.111241 + w: 0.993793 + - position: + x: 357.696 + y: 648.148 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.235723 + w: 0.971820 + - position: + x: 361.186 + y: 651.334 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.361617 + w: 0.932327 + - position: + x: 363.716 + y: 655.456 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.488304 + w: 0.872674 + - position: + x: 364.853 + y: 660.052 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.616332 + w: 0.787487 + - position: + x: 364.887 + y: 665.003 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.704715 + w: 0.709490 + - position: + x: 364.768 + y: 670.003 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.648 + y: 675.003 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.529 + y: 680.004 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.410 + y: 685.004 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.291 + y: 690.005 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.172 + y: 695.005 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 364.053 + y: 700.006 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.933 + y: 705.006 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.814 + y: 710.007 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.695 + y: 715.007 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.576 + y: 720.008 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.457 + y: 725.009 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.338 + y: 730.010 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.218 + y: 735.011 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 363.099 + y: 740.011 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 362.980 + y: 745.012 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 362.861 + y: 750.013 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 362.742 + y: 755.014 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 362.622 + y: 760.015 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.250000 + - path: + - position: + x: 323.928 + y: 644.831 + z: 100.568 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00410256 + w: 0.999992 + - position: + x: 328.930 + y: 644.786 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00451016 + w: 0.999990 + - position: + x: 333.933 + y: 644.725 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00607237 + w: 0.999982 + - position: + x: 338.935 + y: 644.645 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00796688 + w: 0.999968 + - position: + x: 343.873 + y: 644.613 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00329511 + w: 0.999995 + - position: + x: 348.698 + y: 645.015 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0415760 + w: 0.999135 + - position: + x: 353.223 + y: 646.395 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.147464 + w: 0.989067 + - position: + x: 357.115 + y: 649.075 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.296991 + w: 0.954880 + - position: + x: 359.997 + y: 652.871 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.444541 + w: 0.895759 + - position: + x: 361.525 + y: 657.337 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.581548 + w: 0.813512 + - position: + x: 361.651 + y: 662.207 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.697878 + w: 0.716217 + - position: + x: 361.533 + y: 667.205 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715386 + w: 0.698729 + - position: + x: 361.414 + y: 672.205 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 361.295 + y: 677.206 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 361.176 + y: 682.206 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 361.057 + y: 687.206 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.938 + y: 692.207 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.818 + y: 697.207 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.699 + y: 702.208 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.580 + y: 707.208 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.461 + y: 712.209 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.342 + y: 717.209 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.222 + y: 722.210 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.103 + y: 727.211 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.984 + y: 732.212 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.865 + y: 737.213 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.746 + y: 742.214 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.626 + y: 747.214 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.507 + y: 752.215 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.388 + y: 757.216 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.269 + y: 762.217 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.250000 + - path: + - position: + x: 323.928 + y: 644.831 + z: 100.568 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00410256 + w: 0.999992 + - position: + x: 328.930 + y: 644.785 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00457230 + w: 0.999990 + - position: + x: 333.933 + y: 644.721 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00644958 + w: 0.999979 + - position: + x: 338.935 + y: 644.632 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00883007 + w: 0.999961 + - position: + x: 343.938 + y: 644.526 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.0105871 + w: 0.999944 + - position: + x: 348.941 + y: 644.416 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.0110042 + w: 0.999939 + - position: + x: 353.943 + y: 644.319 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00972075 + w: 0.999953 + - position: + x: 358.946 + y: 644.250 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00691289 + w: 0.999976 + - position: + x: 363.948 + y: 644.219 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.00309863 + w: 0.999995 + - position: + x: 368.950 + y: 644.228 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.000886733 + w: 1.00000 + - position: + x: 373.952 + y: 644.264 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00363761 + w: 0.999993 + - position: + x: 378.954 + y: 644.305 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00413557 + w: 0.999991 + - position: + x: 383.955 + y: 644.347 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00420318 + w: 0.999991 + - position: + x: 388.957 + y: 644.388 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00411113 + w: 0.999992 + - position: + x: 393.958 + y: 644.432 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00439488 + w: 0.999990 + - position: + x: 398.956 + y: 644.454 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00215849 + w: 0.999998 + - position: + x: 403.941 + y: 644.630 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0176845 + w: 0.999844 + - position: + x: 408.939 + y: 644.821 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 413.938 + y: 645.012 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 418.936 + y: 645.202 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 423.935 + y: 645.393 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 428.933 + y: 645.584 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 433.932 + y: 645.774 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 438.931 + y: 645.965 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 443.929 + y: 646.156 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 448.928 + y: 646.346 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 453.927 + y: 646.537 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 458.925 + y: 646.728 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 463.924 + y: 646.918 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 468.923 + y: 647.109 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + - position: + x: 473.922 + y: 647.300 + z: 100.384 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.0190608 + w: 0.999818 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.250000 + shape: + type: 0 + footprint: + points: [] + dimensions: + x: 1.90000 + y: 0.604998 + z: 0.767451 +traffic_signal: + stamp: + sec: 0 + nanosec: 0 + traffic_light_groups: [] +route: + header: + stamp: + sec: 21 + nanosec: 17351334 + frame_id: map + start_pose: + position: + x: 301.475 + y: 642.905 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00500123 + w: 0.999987 + goal_pose: + position: + x: 358.812 + y: 675.174 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.705159 + w: 0.709049 + segments: + - preferred_primitive: + id: 2000 + primitive_type: "" + primitives: + - id: 2000 + primitive_type: lane + - id: 2001 + primitive_type: lane + - id: 2002 + primitive_type: lane + - preferred_primitive: + id: 2010 + primitive_type: "" + primitives: + - id: 2010 + primitive_type: lane + - preferred_primitive: + id: 2200 + primitive_type: "" + primitives: + - id: 2200 + primitive_type: lane + - preferred_primitive: + id: 3500 + primitive_type: "" + primitives: + - id: 3500 + primitive_type: lane + - id: 3501 + primitive_type: lane + - id: 3502 + primitive_type: lane + uuid: + uuid: + - 195 + - 84 + - 241 + - 105 + - 133 + - 218 + - 136 + - 83 + - 104 + - 191 + - 48 + - 109 + - 85 + - 60 + - 177 + - 115 + allow_modification: false +operation_mode: + stamp: + sec: 550 + nanosec: 913829317 + mode: 2 + is_autoware_control_enabled: true + is_in_transition: false + is_stop_mode_available: true + is_autonomous_mode_available: true + is_local_mode_available: true + is_remote_mode_available: true +self_acceleration: + header: + stamp: + sec: 563 + nanosec: 188542779 + frame_id: /base_link + accel: + accel: + linear: + x: -0.770147 + y: 0.0409905 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 +self_odometry: + header: + stamp: + sec: 563 + nanosec: 188542779 + frame_id: map + child_frame_id: base_link + pose: + pose: + position: + x: 337.371 + y: 643.219 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.00401753 + w: 0.999992 + covariance: + - 0.000100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.000100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + twist: + twist: + linear: + x: 4.13155 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00992133 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_shoulder.yaml b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_shoulder.yaml new file mode 100644 index 0000000000000..9a20cbee9c1ff --- /dev/null +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/test_data/object_on_shoulder.yaml @@ -0,0 +1,2512 @@ +# +# AUTO GENERATED by autoware_test_utils::topic_snapshot_saver +# format1: +# +# format_version: +# map_path_uri: package:/// +# fields(this is array) +# - name: +# type: either {Odometry | AccelWithCovarianceStamped | PredictedObjects | OperationModeState | LaneletRoute | TrafficLightGroupArray | TrackedObjects | PathWithLaneId | TBD} +# topic: +# +format_version: 1 +map_path_uri: package://autoware_test_utils/test_map/intersection/lanelet2_map.osm +path_with_lane_id: + header: + stamp: + sec: 74 + nanosec: 11949715 + frame_id: map + points: + - point: + pose: + position: + x: 360.306 + y: 597.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710800 + w: 0.703394 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.285 + y: 599.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710829 + w: 0.703365 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.264 + y: 601.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710857 + w: 0.703336 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.243 + y: 603.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710881 + w: 0.703312 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.222 + y: 605.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710951 + w: 0.703242 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.200 + y: 607.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.711036 + w: 0.703156 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.177 + y: 609.246 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.711601 + w: 0.702584 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.152 + y: 611.245 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.711932 + w: 0.702248 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - point: + pose: + position: + x: 360.133 + y: 612.628 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.716985 + w: 0.697089 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1010 + - 1200 + - point: + pose: + position: + x: 360.116 + y: 613.245 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.732064 + w: 0.681236 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 359.972 + y: 615.239 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.740537 + w: 0.672016 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 359.778 + y: 617.231 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.759018 + w: 0.651069 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 359.474 + y: 619.204 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.784627 + w: 0.619968 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 359.010 + y: 621.159 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.835622 + w: 0.549305 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 358.221 + y: 622.986 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.876871 + w: 0.480726 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 357.127 + y: 624.700 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.906015 + w: 0.423245 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 355.847 + y: 626.230 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.934815 + w: 0.355135 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 354.341 + y: 627.567 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.956562 + w: 0.291529 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 352.674 + y: 628.688 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.976933 + w: 0.213544 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 350.854 + y: 629.523 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.989029 + w: 0.147720 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 348.920 + y: 630.114 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.997418 + w: 0.0718077 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 346.951 + y: 630.399 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.999926 + w: 0.0121684 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 344.951 + y: 630.448 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 1.00000 + w: 0.000253960 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 342.951 + y: 630.449 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999959 + w: 0.00906744 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - point: + pose: + position: + x: 342.741 + y: 630.445 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 1200 + - 2500 + - point: + pose: + position: + x: 340.951 + y: 630.409 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999893 + w: 0.0146423 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 339.014 + y: 630.352 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999803 + w: 0.0198557 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 337.016 + y: 630.273 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999732 + w: 0.0231414 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 335.018 + y: 630.180 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999702 + w: 0.0243973 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 333.020 + y: 630.083 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999705 + w: 0.0242858 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 332.731 + y: 630.068 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999615 + w: 0.0277448 + longitudinal_velocity_mps: 16.6667 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + - point: + pose: + position: + x: 331.733 + y: 630.013 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999615 + w: 0.0277448 + longitudinal_velocity_mps: 0.00000 + lateral_velocity_mps: 0.00000 + heading_rate_rps: 0.00000 + is_final: false + lane_ids: + - 2500 + left_bound: + - x: 358.794 + y: 596.731 + z: 100.000 + - x: 358.788 + y: 597.342 + z: 100.000 + - x: 358.758 + y: 600.198 + z: 100.000 + - x: 358.736 + y: 602.392 + z: 100.000 + - x: 358.718 + y: 604.199 + z: 100.000 + - x: 358.698 + y: 606.199 + z: 100.000 + - x: 358.686 + y: 607.440 + z: 100.000 + - x: 358.610 + y: 610.191 + z: 100.000 + - x: 358.512 + y: 612.597 + z: 100.000 + - x: 358.405 + y: 614.096 + z: 100.000 + - x: 358.218 + y: 616.079 + z: 100.000 + - x: 358.086 + y: 617.465 + z: 100.000 + - x: 357.913 + y: 618.622 + z: 100.000 + - x: 357.666 + y: 619.746 + z: 100.000 + - x: 357.285 + y: 620.810 + z: 100.000 + - x: 356.832 + y: 621.812 + z: 100.000 + - x: 356.284 + y: 622.823 + z: 100.000 + - x: 355.663 + y: 623.752 + z: 100.000 + - x: 354.964 + y: 624.613 + z: 100.000 + - x: 354.158 + y: 625.437 + z: 100.000 + - x: 353.306 + y: 626.152 + z: 100.000 + - x: 352.395 + y: 626.788 + z: 100.000 + - x: 351.400 + y: 627.366 + z: 100.000 + - x: 350.389 + y: 627.820 + z: 100.000 + - x: 349.337 + y: 628.212 + z: 100.000 + - x: 348.219 + y: 628.479 + z: 100.000 + - x: 347.083 + y: 628.681 + z: 100.000 + - x: 346.042 + y: 628.729 + z: 100.000 + - x: 344.050 + y: 628.720 + z: 100.000 + - x: 342.764 + y: 628.777 + z: 100.000 + - x: 340.080 + y: 628.723 + z: 100.000 + - x: 338.078 + y: 628.751 + z: 100.000 + - x: 336.079 + y: 628.710 + z: 100.000 + - x: 334.080 + y: 628.670 + z: 100.000 + - x: 332.082 + y: 628.629 + z: 100.000 + - x: 326.872 + y: 628.524 + z: 100.000 + right_bound: + - x: 361.830 + y: 596.762 + z: 100.000 + - x: 361.823 + y: 597.400 + z: 100.000 + - x: 361.792 + y: 600.231 + z: 100.000 + - x: 361.767 + y: 602.446 + z: 100.000 + - x: 361.748 + y: 604.230 + z: 100.000 + - x: 361.726 + y: 606.230 + z: 100.000 + - x: 361.712 + y: 607.493 + z: 100.000 + - x: 361.718 + y: 610.230 + z: 100.000 + - x: 361.754 + y: 612.657 + z: 100.000 + - x: 361.627 + y: 614.331 + z: 100.000 + - x: 361.519 + y: 616.330 + z: 100.000 + - x: 361.452 + y: 617.634 + z: 100.000 + - x: 361.277 + y: 619.056 + z: 100.000 + - x: 360.998 + y: 620.486 + z: 100.000 + - x: 360.581 + y: 621.905 + z: 100.000 + - x: 359.991 + y: 623.293 + z: 100.000 + - x: 359.319 + y: 624.583 + z: 100.000 + - x: 358.490 + y: 625.825 + z: 100.000 + - x: 357.546 + y: 626.984 + z: 100.000 + - x: 356.525 + y: 628.025 + z: 100.000 + - x: 355.377 + y: 628.981 + z: 100.000 + - x: 354.158 + y: 629.845 + z: 100.000 + - x: 352.881 + y: 630.552 + z: 100.000 + - x: 351.515 + y: 631.167 + z: 100.000 + - x: 350.098 + y: 631.615 + z: 100.000 + - x: 348.672 + y: 631.919 + z: 100.000 + - x: 347.236 + y: 632.124 + z: 100.000 + - x: 346.083 + y: 632.098 + z: 100.000 + - x: 344.082 + y: 632.081 + z: 100.000 + - x: 342.719 + y: 632.113 + z: 100.000 + - x: 340.012 + y: 632.058 + z: 100.000 + - x: 338.014 + y: 631.950 + z: 100.000 + - x: 336.015 + y: 631.909 + z: 100.000 + - x: 334.016 + y: 631.869 + z: 100.000 + - x: 332.017 + y: 631.829 + z: 100.000 + - x: 326.807 + y: 631.724 + z: 100.000 +dynamic_object: + header: + stamp: + sec: 73 + nanosec: 980215670 + frame_id: map + objects: + - object_id: + uuid: + - 251 + - 180 + - 23 + - 85 + - 112 + - 118 + - 142 + - 88 + - 241 + - 29 + - 194 + - 27 + - 222 + - 164 + - 130 + - 251 + existence_probability: 0.00000 + classification: + - label: 6 + probability: 1.00000 + kinematics: + initial_pose_with_covariance: + pose: + position: + x: 357.408 + y: 667.312 + z: 100.774 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712257 + w: 0.701919 + covariance: + - 0.299126 + - -8.23923e-05 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - -8.23923e-05 + - 0.349251 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00879510 + initial_twist_with_covariance: + twist: + linear: + x: 9.98083 + y: 0.00185652 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00325706 + covariance: + - 0.970951 + - 0.000139981 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.000245582 + - 0.000139981 + - 0.00384142 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00673936 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.000245582 + - 0.00673936 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0118235 + initial_acceleration_with_covariance: + accel: + linear: + x: 0.00000 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + predicted_paths: + - path: + - position: + x: 357.408 + y: 667.312 + z: 100.774 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712257 + w: 0.701919 + - position: + x: 357.373 + y: 672.303 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.709614 + w: 0.704590 + - position: + x: 357.520 + y: 677.298 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.696604 + w: 0.717456 + - position: + x: 357.917 + y: 682.299 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.678600 + w: 0.734508 + - position: + x: 358.531 + y: 687.305 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.662668 + w: 0.748913 + - position: + x: 359.266 + y: 692.315 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.653723 + w: 0.756734 + - position: + x: 359.995 + y: 697.324 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.654217 + w: 0.756307 + - position: + x: 360.590 + y: 702.329 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.664107 + w: 0.747638 + - position: + x: 360.955 + y: 707.330 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.680844 + w: 0.732428 + - position: + x: 361.063 + y: 712.324 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.699424 + w: 0.714707 + - position: + x: 360.983 + y: 717.314 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712725 + w: 0.701443 + - position: + x: 360.864 + y: 722.303 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.746 + y: 727.292 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.627 + y: 732.280 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.508 + y: 737.269 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.389 + y: 742.258 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.270 + y: 747.247 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.151 + y: 752.236 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 360.032 + y: 757.225 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.913 + y: 762.214 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.794 + y: 767.203 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.675 + y: 772.192 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.557 + y: 777.181 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.438 + y: 782.170 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.319 + y: 787.159 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.200 + y: 792.148 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 359.081 + y: 797.137 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.962 + y: 802.126 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.843 + y: 807.115 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.724 + y: 812.104 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.605 + y: 817.093 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.230769 + - path: + - position: + x: 357.408 + y: 667.312 + z: 100.774 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712257 + w: 0.701919 + - position: + x: 357.340 + y: 672.302 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.711946 + w: 0.702234 + - position: + x: 357.296 + y: 677.293 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.710176 + w: 0.704024 + - position: + x: 357.286 + y: 682.284 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707820 + w: 0.706393 + - position: + x: 357.304 + y: 687.276 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.705868 + w: 0.708343 + - position: + x: 357.334 + y: 692.269 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.704976 + w: 0.709232 + - position: + x: 357.357 + y: 697.261 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.705452 + w: 0.708758 + - position: + x: 357.355 + y: 702.252 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707256 + w: 0.706957 + - position: + x: 357.314 + y: 707.243 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.709999 + w: 0.704203 + - position: + x: 357.231 + y: 712.233 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.712949 + w: 0.701216 + - position: + x: 357.119 + y: 717.222 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715047 + w: 0.699076 + - position: + x: 357.000 + y: 722.211 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.881 + y: 727.199 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.762 + y: 732.188 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.643 + y: 737.177 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.524 + y: 742.166 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.405 + y: 747.155 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.286 + y: 752.144 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.167 + y: 757.133 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.049 + y: 762.122 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.930 + y: 767.111 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.811 + y: 772.100 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.692 + y: 777.089 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.573 + y: 782.078 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.454 + y: 787.067 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.335 + y: 792.056 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.216 + y: 797.045 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 355.097 + y: 802.033 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 354.978 + y: 807.022 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 354.859 + y: 812.011 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 354.741 + y: 817.000 + z: 100.306 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.769231 + shape: + type: 0 + footprint: + points: [] + dimensions: + x: 1.89999 + y: 0.500442 + z: 0.612431 + - object_id: + uuid: + - 218 + - 141 + - 152 + - 171 + - 185 + - 127 + - 84 + - 175 + - 69 + - 40 + - 199 + - 89 + - 96 + - 107 + - 61 + - 243 + existence_probability: 0.00000 + classification: + - label: 6 + probability: 1.00000 + kinematics: + initial_pose_with_covariance: + pose: + position: + x: 358.218 + y: 603.622 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707443 + w: 0.706770 + covariance: + - 0.0636258 + - -0.000170219 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - -0.000170219 + - 0.0826995 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00394708 + initial_twist_with_covariance: + twist: + linear: + x: 10.0303 + y: -0.00247386 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: -0.00434011 + covariance: + - 0.579437 + - -9.81341e-05 + - 0.00000 + - 0.00000 + - 0.00000 + - -0.000172165 + - -9.81341e-05 + - 0.00311875 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00547149 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.0100000 + - 0.00000 + - -0.000172165 + - 0.00547149 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00959910 + initial_acceleration_with_covariance: + accel: + linear: + x: 0.00000 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + predicted_paths: + - path: + - position: + x: 358.218 + y: 603.622 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707443 + w: 0.706770 + - position: + x: 358.224 + y: 608.637 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.706633 + w: 0.707581 + - position: + x: 358.279 + y: 613.653 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.703235 + w: 0.710958 + - position: + x: 358.397 + y: 618.671 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.698737 + w: 0.715379 + - position: + x: 358.567 + y: 623.690 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.695068 + w: 0.718944 + - position: + x: 358.758 + y: 628.710 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.693532 + w: 0.720426 + - position: + x: 358.932 + y: 633.729 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.694735 + w: 0.719266 + - position: + x: 359.054 + y: 638.747 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.698453 + w: 0.715656 + - position: + x: 359.097 + y: 643.763 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.704045 + w: 0.710155 + - position: + x: 359.057 + y: 648.778 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.709938 + w: 0.704265 + - position: + x: 358.958 + y: 653.791 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714096 + w: 0.700048 + - position: + x: 358.849 + y: 658.805 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714730 + w: 0.699401 + - position: + x: 358.740 + y: 663.817 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.714768 + w: 0.699361 + - position: + x: 358.620 + y: 668.830 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.501 + y: 673.843 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.381 + y: 678.856 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.262 + y: 683.870 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.142 + y: 688.883 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 358.023 + y: 693.896 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.903 + y: 698.909 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.784 + y: 703.923 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.664 + y: 708.936 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.545 + y: 713.950 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.425 + y: 718.963 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.306 + y: 723.977 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.186 + y: 728.991 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 357.067 + y: 734.004 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.947 + y: 739.018 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.828 + y: 744.032 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.708 + y: 749.045 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + - position: + x: 356.589 + y: 754.059 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.715481 + w: 0.698632 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.500000 + - path: + - position: + x: 358.218 + y: 603.622 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707443 + w: 0.706770 + - position: + x: 358.206 + y: 608.635 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707930 + w: 0.706283 + - position: + x: 358.149 + y: 613.642 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.711130 + w: 0.703060 + - position: + x: 358.010 + y: 618.635 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.716853 + w: 0.697224 + - position: + x: 357.024 + y: 623.117 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.779378 + w: 0.626554 + - position: + x: 354.441 + y: 627.006 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.881248 + w: 0.472653 + - position: + x: 350.340 + y: 629.665 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.958935 + w: 0.283625 + - position: + x: 345.469 + y: 630.694 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.994592 + w: 0.103864 + - position: + x: 340.508 + y: 630.814 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.999926 + w: 0.0121264 + - position: + x: 335.554 + y: 630.768 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999989 + w: 0.00460609 + - position: + x: 330.597 + y: 630.677 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999957 + w: 0.00925679 + - position: + x: 325.638 + y: 630.576 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 320.674 + y: 630.476 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 315.708 + y: 630.376 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 310.737 + y: 630.276 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 305.763 + y: 630.175 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 300.785 + y: 630.075 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 295.803 + y: 629.974 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 290.817 + y: 629.874 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 285.828 + y: 629.773 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 280.835 + y: 629.672 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 275.839 + y: 629.571 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 270.840 + y: 629.470 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 265.838 + y: 629.370 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 260.833 + y: 629.268 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 255.825 + y: 629.167 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 250.816 + y: 629.066 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 245.805 + y: 628.965 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 240.792 + y: 628.864 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 235.778 + y: 628.763 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + - position: + x: 230.764 + y: 628.662 + z: 100.496 + orientation: + x: 0.00000 + y: 0.00000 + z: -0.999949 + w: 0.0100898 + time_step: + sec: 0 + nanosec: 500000000 + confidence: 0.500000 + shape: + type: 0 + footprint: + points: [] + dimensions: + x: 1.90000 + y: 0.644288 + z: 0.991445 +traffic_signal: + stamp: + sec: 0 + nanosec: 0 + traffic_light_groups: [] +route: + header: + stamp: + sec: 19 + nanosec: 549630704 + frame_id: map + start_pose: + position: + x: 360.481 + y: 591.844 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.721675 + w: 0.692232 + goal_pose: + position: + x: 331.733 + y: 630.013 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.999615 + w: -0.0277448 + segments: + - preferred_primitive: + id: 1010 + primitive_type: "" + primitives: + - id: 1010 + primitive_type: lane + - preferred_primitive: + id: 1200 + primitive_type: "" + primitives: + - id: 1200 + primitive_type: lane + - preferred_primitive: + id: 2500 + primitive_type: "" + primitives: + - id: 2500 + primitive_type: lane + - id: 2501 + primitive_type: lane + uuid: + uuid: + - 83 + - 230 + - 40 + - 201 + - 182 + - 232 + - 31 + - 237 + - 204 + - 91 + - 39 + - 90 + - 153 + - 179 + - 6 + - 123 + allow_modification: false +operation_mode: + stamp: + sec: 65 + nanosec: 819714871 + mode: 2 + is_autoware_control_enabled: true + is_in_transition: false + is_stop_mode_available: true + is_autonomous_mode_available: true + is_local_mode_available: true + is_remote_mode_available: true +self_acceleration: + header: + stamp: + sec: 74 + nanosec: 42641063 + frame_id: /base_link + accel: + accel: + linear: + x: -1.01094 + y: 0.00400509 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00000 + covariance: + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00100000 +self_odometry: + header: + stamp: + sec: 74 + nanosec: 42641063 + frame_id: map + child_frame_id: base_link + pose: + pose: + position: + x: 360.302 + y: 604.493 + z: 100.000 + orientation: + x: 0.00000 + y: 0.00000 + z: 0.707950 + w: 0.706263 + covariance: + - 0.000100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.000100000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + twist: + twist: + linear: + x: 2.31221 + y: 0.00000 + z: 0.00000 + angular: + x: 0.00000 + y: 0.00000 + z: 0.00173214 + covariance: + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 + - 0.00000 From 9ce874c9131f37a57c8661a5e65affa95831b381 Mon Sep 17 00:00:00 2001 From: kminoda <44218668+kminoda@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:02:09 +0900 Subject: [PATCH 040/127] feat(lidar_centerpoint, pointpainting): add diag publisher for max voxel size (#9720) --- .../pointpainting_fusion/node.hpp | 2 ++ .../src/pointpainting_fusion/node.cpp | 17 ++++++++++++++++- .../lidar_centerpoint/centerpoint_trt.hpp | 2 +- .../include/autoware/lidar_centerpoint/node.hpp | 2 ++ .../lib/centerpoint_trt.cpp | 6 +++++- .../autoware_lidar_centerpoint/src/node.cpp | 17 ++++++++++++++++- 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp index cd6cd87976522..5bc428a8e7ab8 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -58,6 +59,7 @@ class PointPaintingFusionNode void postprocess(sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) override; rclcpp::Publisher::SharedPtr obj_pub_ptr_; + std::unique_ptr diagnostics_interface_ptr_; int omp_num_threads_{1}; float score_threshold_{0.0}; diff --git a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp index 25d9064ddbfc7..2f6f853d4281e 100644 --- a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp @@ -186,6 +186,8 @@ PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & opt // create detector detector_ptr_ = std::make_unique( encoder_param, head_param, densification_param, config); + diagnostics_interface_ptr_ = + std::make_unique(this, "pointpainting_trt"); obj_pub_ptr_ = this->create_publisher("~/output/objects", rclcpp::QoS{1}); @@ -389,6 +391,7 @@ void PointPaintingFusionNode::postprocess(sensor_msgs::msg::PointCloud2 & painte { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); + diagnostics_interface_ptr_->clear(); const auto objects_sub_count = obj_pub_ptr_->get_subscription_count() + obj_pub_ptr_->get_intra_process_subscription_count(); @@ -403,10 +406,21 @@ void PointPaintingFusionNode::postprocess(sensor_msgs::msg::PointCloud2 & painte } std::vector det_boxes3d; - bool is_success = detector_ptr_->detect(painted_pointcloud_msg, tf_buffer_, det_boxes3d); + bool is_num_pillars_within_range = true; + bool is_success = detector_ptr_->detect( + painted_pointcloud_msg, tf_buffer_, det_boxes3d, is_num_pillars_within_range); if (!is_success) { return; } + diagnostics_interface_ptr_->add_key_value( + "is_num_pillars_within_range", is_num_pillars_within_range); + if (!is_num_pillars_within_range) { + std::stringstream message; + message << "PointPaintingTRT::detect: The actual number of pillars exceeds its maximum value, " + << "which may limit the detection performance."; + diagnostics_interface_ptr_->update_level_and_message( + diagnostic_msgs::msg::DiagnosticStatus::WARN, message.str()); + } std::vector raw_objects; raw_objects.reserve(det_boxes3d.size()); @@ -425,6 +439,7 @@ void PointPaintingFusionNode::postprocess(sensor_msgs::msg::PointCloud2 & painte if (objects_sub_count > 0) { obj_pub_ptr_->publish(output_msg); } + diagnostics_interface_ptr_->publish(painted_pointcloud_msg.header.stamp); } bool PointPaintingFusionNode::out_of_scope(__attribute__((unused)) const DetectedObjects & obj) diff --git a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp index ce5ec3ea0abfe..671ff54f8ce0d 100644 --- a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp +++ b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp @@ -62,7 +62,7 @@ class CenterPointTRT bool detect( const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const tf2_ros::Buffer & tf_buffer, - std::vector & det_boxes3d); + std::vector & det_boxes3d, bool & is_num_pillars_within_range); protected: void initPtr(); diff --git a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/node.hpp b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/node.hpp index a49451fde9d0d..1748db0e48392 100644 --- a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/node.hpp +++ b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/node.hpp @@ -20,6 +20,7 @@ #include "autoware/lidar_centerpoint/postprocess/non_maximum_suppression.hpp" #include +#include #include #include #include @@ -59,6 +60,7 @@ class LidarCenterPointNode : public rclcpp::Node DetectionClassRemapper detection_class_remapper_; std::unique_ptr detector_ptr_{nullptr}; + std::unique_ptr diagnostics_interface_ptr_; // debugger std::unique_ptr> stop_watch_ptr_{ diff --git a/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp b/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp index 6ee2b3733bdb0..530f59179d25b 100644 --- a/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp +++ b/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp @@ -19,6 +19,7 @@ #include "autoware/lidar_centerpoint/preprocess/preprocess_kernel.hpp" #include +#include #include #include @@ -127,8 +128,10 @@ void CenterPointTRT::initPtr() bool CenterPointTRT::detect( const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const tf2_ros::Buffer & tf_buffer, - std::vector & det_boxes3d) + std::vector & det_boxes3d, bool & is_num_pillars_within_range) { + is_num_pillars_within_range = true; + CHECK_CUDA_ERROR(cudaMemsetAsync( encoder_in_features_d_.get(), 0, encoder_in_feature_size_ * sizeof(float), stream_)); CHECK_CUDA_ERROR( @@ -155,6 +158,7 @@ bool CenterPointTRT::detect( "The actual number of pillars (%u) exceeds its maximum value (%zu). " "Please considering increasing it since it may limit the detection performance.", num_pillars, config_.max_voxel_size_); + is_num_pillars_within_range = false; } return true; diff --git a/perception/autoware_lidar_centerpoint/src/node.cpp b/perception/autoware_lidar_centerpoint/src/node.cpp index 59acceeac54d6..825fc40234120 100644 --- a/perception/autoware_lidar_centerpoint/src/node.cpp +++ b/perception/autoware_lidar_centerpoint/src/node.cpp @@ -107,6 +107,8 @@ LidarCenterPointNode::LidarCenterPointNode(const rclcpp::NodeOptions & node_opti circle_nms_dist_threshold, yaw_norm_thresholds, has_variance_); detector_ptr_ = std::make_unique(encoder_param, head_param, densification_param, config); + diagnostics_interface_ptr_ = + std::make_unique(this, "centerpoint_trt"); pointcloud_sub_ = this->create_subscription( "~/input/pointcloud", rclcpp::SensorDataQoS{}.keep_last(1), @@ -144,12 +146,24 @@ void LidarCenterPointNode::pointCloudCallback( if (stop_watch_ptr_) { stop_watch_ptr_->toc("processing_time", true); } + diagnostics_interface_ptr_->clear(); std::vector det_boxes3d; - bool is_success = detector_ptr_->detect(*input_pointcloud_msg, tf_buffer_, det_boxes3d); + bool is_num_pillars_within_range = true; + bool is_success = detector_ptr_->detect( + *input_pointcloud_msg, tf_buffer_, det_boxes3d, is_num_pillars_within_range); if (!is_success) { return; } + diagnostics_interface_ptr_->add_key_value( + "is_num_pillars_within_range", is_num_pillars_within_range); + if (!is_num_pillars_within_range) { + std::stringstream message; + message << "CenterPointTRT::detect: The actual number of pillars exceeds its maximum value, " + << "which may limit the detection performance."; + diagnostics_interface_ptr_->update_level_and_message( + diagnostic_msgs::msg::DiagnosticStatus::WARN, message.str()); + } std::vector raw_objects; raw_objects.reserve(det_boxes3d.size()); @@ -169,6 +183,7 @@ void LidarCenterPointNode::pointCloudCallback( objects_pub_->publish(output_msg); published_time_publisher_->publish_if_subscribed(objects_pub_, output_msg.header.stamp); } + diagnostics_interface_ptr_->publish(input_pointcloud_msg->header.stamp); // add processing time for debug if (debug_publisher_ptr_ && stop_watch_ptr_) { From 14ee08b9d19c5f33ed37c72b9504fdcad464ef1b Mon Sep 17 00:00:00 2001 From: Taekjin LEE Date: Wed, 8 Jan 2025 16:38:33 +0900 Subject: [PATCH 041/127] refactor(autoware_image_projection_based_fusion): organize 2d-detection related members (#9789) * chore: input_camera_topics_ is only for debug Signed-off-by: Taekjin LEE * feat: fuse main message with cached roi messages in fusion_node.cpp Signed-off-by: Taekjin LEE * chore: add comments on each process step, organize methods Signed-off-by: Taekjin LEE * feat: Export process method in fusion_node.cpp Export the `exportProcess()` method in `fusion_node.cpp` to handle the post-processing and publishing of the fused messages. This method cancels the timer, performs the necessary post-processing steps, publishes the output message, and resets the flags. It also adds processing time for debugging purposes. This change improves the organization and readability of the code. Signed-off-by: Taekjin LEE * feat: Refactor fusion_node.hpp and fusion_node.cpp Refactor the `fusion_node.hpp` and `fusion_node.cpp` files to improve code organization and readability. This includes exporting the `exportProcess()` method in `fusion_node.cpp` to handle post-processing and publishing of fused messages, adding comments on each process step, organizing methods, and fusing the main message with cached ROI messages. These changes enhance the overall quality of the codebase. Signed-off-by: Taekjin LEE * Refactor fusion_node.cpp and fusion_node.hpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * feat: Refactor fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * feat: implement mutex per 2d detection process Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * revise template, inputs first and output at the last Signed-off-by: Taekjin LEE * explicit in and out types 1 Signed-off-by: Taekjin LEE * clarify pointcloud message type Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * Refactor publisher types in fusion_node.hpp and node.hpp Signed-off-by: Taekjin LEE * fix: resolve cppcheck issue shadowVariable Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * chore: rename Det2dManager to Det2dStatus Signed-off-by: Taekjin LEE * revert mutex related changes Signed-off-by: Taekjin LEE * refactor: review member and method's access Signed-off-by: Taekjin LEE * fix: resolve shadowVariable of 'det2d' Signed-off-by: Taekjin LEE * fix missing line Signed-off-by: Taekjin LEE * refactor message postprocess and publish methods Signed-off-by: Taekjin LEE * publish the main message is common Signed-off-by: Taekjin LEE * fix: replace pointcloud message type by the typename Signed-off-by: Taekjin LEE * review member access Signed-off-by: Taekjin LEE * Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE * refactor: fix condition for publishing painted pointcloud message Signed-off-by: Taekjin LEE * fix: remove unused variable Signed-off-by: Taekjin LEE --------- Signed-off-by: Taekjin LEE --- .../fusion_node.hpp | 124 +++-- .../pointpainting_fusion/node.hpp | 20 +- .../roi_cluster_fusion/node.hpp | 21 +- .../roi_detected_object_fusion/node.hpp | 16 +- .../roi_pointcloud_fusion/node.hpp | 35 +- .../segmentation_pointcloud_fusion/node.hpp | 48 +- .../utils/utils.hpp | 12 +- .../src/fusion_node.cpp | 518 +++++++++--------- .../src/pointpainting_fusion/node.cpp | 86 ++- .../src/roi_cluster_fusion/node.cpp | 63 +-- .../src/roi_detected_object_fusion/node.cpp | 63 ++- .../src/roi_pointcloud_fusion/node.cpp | 91 ++- .../segmentation_pointcloud_fusion/node.cpp | 73 ++- .../src/utils/utils.cpp | 12 +- 14 files changed, 603 insertions(+), 579 deletions(-) diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp index 239d406650ce8..b8881bc6abff7 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp @@ -52,14 +52,33 @@ using autoware_perception_msgs::msg::DetectedObject; using autoware_perception_msgs::msg::DetectedObjects; using sensor_msgs::msg::CameraInfo; using sensor_msgs::msg::Image; -using sensor_msgs::msg::PointCloud2; -using tier4_perception_msgs::msg::DetectedObjectsWithFeature; +using PointCloudMsgType = sensor_msgs::msg::PointCloud2; +using RoiMsgType = tier4_perception_msgs::msg::DetectedObjectsWithFeature; +using ClusterMsgType = tier4_perception_msgs::msg::DetectedObjectsWithFeature; +using ClusterObjType = tier4_perception_msgs::msg::DetectedObjectWithFeature; using tier4_perception_msgs::msg::DetectedObjectWithFeature; using PointCloud = pcl::PointCloud; using autoware::image_projection_based_fusion::CameraProjection; using autoware_perception_msgs::msg::ObjectClassification; -template +template +struct Det2dStatus +{ + // camera index + std::size_t id = 0; + // camera projection + std::unique_ptr camera_projector_ptr; + bool project_to_unrectified_image = false; + bool approximate_camera_projection = false; + // process flags + bool is_fused = false; + // timing + double input_offset_ms = 0.0; + // cache + std::map cached_det2d_msgs; +}; + +template class FusionNode : public rclcpp::Node { public: @@ -71,75 +90,72 @@ class FusionNode : public rclcpp::Node explicit FusionNode( const std::string & node_name, const rclcpp::NodeOptions & options, int queue_size); -protected: +private: + // Common process methods void cameraInfoCallback( const sensor_msgs::msg::CameraInfo::ConstSharedPtr input_camera_info_msg, const std::size_t camera_id); - virtual void preprocess(TargetMsg3D & output_msg); - - // callback for Msg subscription - virtual void subCallback(const typename TargetMsg3D::ConstSharedPtr input_msg); - - // callback for roi subscription - - virtual void roiCallback( - const typename Msg2D::ConstSharedPtr input_roi_msg, const std::size_t roi_i); - - virtual void fuseOnSingleImage( - const TargetMsg3D & input_msg, const std::size_t image_id, const Msg2D & input_roi_msg, - TargetMsg3D & output_msg) = 0; - - // set args if you need - virtual void postprocess(TargetMsg3D & output_msg); - - virtual void publish(const TargetMsg3D & output_msg); - + // callback for timer void timer_callback(); void setPeriod(const int64_t new_period); + void exportProcess(); + + // 2d detection management methods + bool checkAllDet2dFused() + { + for (const auto & det2d : det2d_list_) { + if (!det2d.is_fused) { + return false; + } + } + return true; + } - std::size_t rois_number_{1}; - tf2_ros::Buffer tf_buffer_; - tf2_ros::TransformListener tf_listener_; - - std::vector point_project_to_unrectified_image_; - - // camera_info - std::map camera_info_map_; - std::vector::SharedPtr> camera_info_subs_; // camera projection - std::vector camera_projectors_; - std::vector approx_camera_projection_; float approx_grid_cell_w_size_; float approx_grid_cell_h_size_; + // timer rclcpp::TimerBase::SharedPtr timer_; double timeout_ms_{}; double match_threshold_ms_{}; - std::vector input_rois_topics_; - std::vector input_camera_info_topics_; - std::vector input_camera_topics_; - /** \brief A vector of subscriber. */ - typename rclcpp::Subscription::SharedPtr sub_; std::vector::SharedPtr> rois_subs_; - - // offsets between cameras and the lidars - std::vector input_offset_ms_; + std::vector::SharedPtr> camera_info_subs_; // cache for fusion - std::vector is_fused_; - std::pair - cached_msg_; // first element is the timestamp in nanoseconds, second element is the message - std::vector> cached_roi_msgs_; + int64_t cached_det3d_msg_timestamp_; + typename Msg3D::SharedPtr cached_det3d_msg_ptr_; std::mutex mutex_cached_msgs_; - // output publisher - typename rclcpp::Publisher::SharedPtr pub_ptr_; +protected: + void setDet2DStatus(std::size_t rois_number); - // debugger - std::shared_ptr debugger_; - virtual bool out_of_scope(const ObjType & obj) = 0; + // callback for main subscription + void subCallback(const typename Msg3D::ConstSharedPtr input_msg); + // callback for roi subscription + void roiCallback(const typename Msg2D::ConstSharedPtr input_roi_msg, const std::size_t roi_i); + + // Custom process methods + virtual void preprocess(Msg3D & output_msg); + virtual void fuseOnSingleImage( + const Msg3D & input_msg, const Det2dStatus & det2d, const Msg2D & input_roi_msg, + Msg3D & output_msg) = 0; + virtual void postprocess(const Msg3D & processing_msg, ExportObj & output_msg); + virtual void publish(const ExportObj & output_msg); + + // Members + tf2_ros::Buffer tf_buffer_; + tf2_ros::TransformListener tf_listener_; + + // 2d detection management + std::vector> det2d_list_; + + /** \brief A vector of subscriber. */ + typename rclcpp::Subscription::SharedPtr sub_; + + // parameters for out_of_scope filter float filter_scope_min_x_; float filter_scope_max_x_; float filter_scope_min_y_; @@ -147,6 +163,12 @@ class FusionNode : public rclcpp::Node float filter_scope_min_z_; float filter_scope_max_z_; + // output publisher + typename rclcpp::Publisher::SharedPtr pub_ptr_; + + // debugger + std::shared_ptr debugger_; + /** \brief processing time publisher. **/ std::unique_ptr> stop_watch_ptr_; std::unique_ptr debug_publisher_; diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp index 5bc428a8e7ab8..9505a926df2f8 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/node.hpp @@ -42,27 +42,25 @@ inline bool isInsideBbox( proj_y >= roi.y_offset * zc && proj_y <= (roi.y_offset + roi.height) * zc; } -class PointPaintingFusionNode -: public FusionNode +class PointPaintingFusionNode : public FusionNode { public: explicit PointPaintingFusionNode(const rclcpp::NodeOptions & options); -protected: - void preprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override; +private: + void preprocess(PointCloudMsgType & pointcloud_msg) override; void fuseOnSingleImage( - const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, - sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) override; + const PointCloudMsgType & input_pointcloud_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, PointCloudMsgType & painted_pointcloud_msg) override; - void postprocess(sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) override; + void postprocess( + const PointCloudMsgType & painted_pointcloud_msg, DetectedObjects & output_msg) override; - rclcpp::Publisher::SharedPtr obj_pub_ptr_; + rclcpp::Publisher::SharedPtr point_pub_ptr_; std::unique_ptr diagnostics_interface_ptr_; int omp_num_threads_{1}; - float score_threshold_{0.0}; std::vector class_names_; std::map class_index_; std::map> isClassTable_; @@ -74,8 +72,6 @@ class PointPaintingFusionNode autoware::lidar_centerpoint::DetectionClassRemapper detection_class_remapper_; std::unique_ptr detector_ptr_{nullptr}; - - bool out_of_scope(const DetectedObjects & obj) override; }; } // namespace autoware::image_projection_based_fusion #endif // AUTOWARE__IMAGE_PROJECTION_BASED_FUSION__POINTPAINTING_FUSION__NODE_HPP_ diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_cluster_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_cluster_fusion/node.hpp index 903b153af0681..b7bf8738b68a4 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_cluster_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_cluster_fusion/node.hpp @@ -24,21 +24,19 @@ namespace autoware::image_projection_based_fusion { const std::map IOU_MODE_MAP{{"iou", 0}, {"iou_x", 1}, {"iou_y", 2}}; -class RoiClusterFusionNode -: public FusionNode< - DetectedObjectsWithFeature, DetectedObjectWithFeature, DetectedObjectsWithFeature> +class RoiClusterFusionNode : public FusionNode { public: explicit RoiClusterFusionNode(const rclcpp::NodeOptions & options); -protected: - void preprocess(DetectedObjectsWithFeature & output_cluster_msg) override; - void postprocess(DetectedObjectsWithFeature & output_cluster_msg) override; +private: + void preprocess(ClusterMsgType & output_cluster_msg) override; void fuseOnSingleImage( - const DetectedObjectsWithFeature & input_cluster_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, - DetectedObjectsWithFeature & output_cluster_msg) override; + const ClusterMsgType & input_cluster_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, ClusterMsgType & output_cluster_msg) override; + + void postprocess(const ClusterMsgType & output_cluster_msg, ClusterMsgType & output_msg) override; std::string trust_object_iou_mode_{"iou"}; bool use_cluster_semantic_type_{false}; @@ -53,12 +51,11 @@ class RoiClusterFusionNode double trust_object_distance_; std::string non_trust_object_iou_mode_{"iou_x"}; - bool is_far_enough(const DetectedObjectWithFeature & obj, const double distance_threshold); - bool out_of_scope(const DetectedObjectWithFeature & obj) override; + bool is_far_enough(const ClusterObjType & obj, const double distance_threshold); + bool out_of_scope(const ClusterObjType & obj); double cal_iou_by_mode( const sensor_msgs::msg::RegionOfInterest & roi_1, const sensor_msgs::msg::RegionOfInterest & roi_2, const std::string iou_mode); - // bool CheckUnknown(const DetectedObjectsWithFeature & obj); }; } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_detected_object_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_detected_object_fusion/node.hpp index 43ec134168ef9..ba197126277a0 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_detected_object_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_detected_object_fusion/node.hpp @@ -31,21 +31,20 @@ namespace autoware::image_projection_based_fusion using sensor_msgs::msg::RegionOfInterest; -class RoiDetectedObjectFusionNode -: public FusionNode +class RoiDetectedObjectFusionNode : public FusionNode { public: explicit RoiDetectedObjectFusionNode(const rclcpp::NodeOptions & options); -protected: +private: void preprocess(DetectedObjects & output_msg) override; void fuseOnSingleImage( - const DetectedObjects & input_object_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, DetectedObjects & output_object_msg) override; + const DetectedObjects & input_object_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, DetectedObjects & output_object_msg) override; std::map generateDetectedObjectRoIs( - const DetectedObjects & input_object_msg, const std::size_t & image_id, + const DetectedObjects & input_object_msg, const Det2dStatus & det2d, const Eigen::Affine3d & object2camera_affine); void fuseObjectsOnImage( @@ -53,11 +52,10 @@ class RoiDetectedObjectFusionNode const std::vector & image_rois, const std::map & object_roi_map); - void publish(const DetectedObjects & output_msg) override; + void postprocess(const DetectedObjects & processing_msg, DetectedObjects & output_msg) override; - bool out_of_scope(const DetectedObject & obj) override; + bool out_of_scope(const DetectedObject & obj); -private: struct { std::vector passthrough_lower_bound_probability_thresholds{}; diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_pointcloud_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_pointcloud_fusion/node.hpp index 2f2c8222e196f..77a1745faa7e5 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_pointcloud_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/roi_pointcloud_fusion/node.hpp @@ -25,32 +25,29 @@ namespace autoware::image_projection_based_fusion { -class RoiPointCloudFusionNode -: public FusionNode +class RoiPointCloudFusionNode : public FusionNode { +public: + explicit RoiPointCloudFusionNode(const rclcpp::NodeOptions & options); + private: - int min_cluster_size_{1}; - int max_cluster_size_{20}; - bool fuse_unknown_only_{true}; - double cluster_2d_tolerance_; + rclcpp::Publisher::SharedPtr point_pub_ptr_; + rclcpp::Publisher::SharedPtr cluster_debug_pub_; - rclcpp::Publisher::SharedPtr pub_objects_ptr_; - std::vector output_fused_objects_; - rclcpp::Publisher::SharedPtr cluster_debug_pub_; + void fuseOnSingleImage( + const PointCloudMsgType & input_pointcloud_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, PointCloudMsgType & output_pointcloud_msg) override; - /* data */ -public: - explicit RoiPointCloudFusionNode(const rclcpp::NodeOptions & options); + void postprocess(const PointCloudMsgType & pointcloud_msg, ClusterMsgType & output_msg) override; -protected: - void preprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override; + void publish(const ClusterMsgType & output_msg) override; - void postprocess(sensor_msgs::msg::PointCloud2 & pointcloud_msg) override; + int min_cluster_size_{1}; + int max_cluster_size_{20}; + bool fuse_unknown_only_{true}; + double cluster_2d_tolerance_; - void fuseOnSingleImage( - const PointCloud2 & input_pointcloud_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, PointCloud2 & output_pointcloud_msg) override; - bool out_of_scope(const DetectedObjectWithFeature & obj) override; + std::vector output_fused_objects_; }; } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/segmentation_pointcloud_fusion/node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/segmentation_pointcloud_fusion/node.hpp index 7454cb7bcd173..5414f98e142cd 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/segmentation_pointcloud_fusion/node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/segmentation_pointcloud_fusion/node.hpp @@ -34,10 +34,32 @@ namespace autoware::image_projection_based_fusion { -class SegmentPointCloudFusionNode : public FusionNode +class SegmentPointCloudFusionNode : public FusionNode { +public: + explicit SegmentPointCloudFusionNode(const rclcpp::NodeOptions & options); + private: - rclcpp::Publisher::SharedPtr pub_pointcloud_ptr_; + void preprocess(PointCloudMsgType & pointcloud_msg) override; + + void fuseOnSingleImage( + const PointCloudMsgType & input_pointcloud_msg, const Det2dStatus & det2d, + const Image & input_mask, PointCloudMsgType & output_pointcloud_msg) override; + + inline void copyPointCloud( + const PointCloudMsgType & input, const int point_step, const size_t global_offset, + PointCloudMsgType & output, size_t & output_pointcloud_size) + { + std::memcpy(&output.data[output_pointcloud_size], &input.data[global_offset], point_step); + output_pointcloud_size += point_step; + } + + void postprocess( + const PointCloudMsgType & pointcloud_msg, PointCloudMsgType & output_msg) override; + + // debug + image_transport::Publisher pub_debug_mask_ptr_; + std::vector filter_semantic_label_target_; float filter_distance_threshold_; // declare list of semantic label target, depend on trained data of yolox segmentation model @@ -47,30 +69,8 @@ class SegmentPointCloudFusionNode : public FusionNode filter_global_offset_set_; - -public: - explicit SegmentPointCloudFusionNode(const rclcpp::NodeOptions & options); - -protected: - void preprocess(PointCloud2 & pointcloud_msg) override; - - void postprocess(PointCloud2 & pointcloud_msg) override; - - void fuseOnSingleImage( - const PointCloud2 & input_pointcloud_msg, const std::size_t image_id, const Image & input_mask, - PointCloud2 & output_pointcloud_msg) override; - - bool out_of_scope(const PointCloud2 & filtered_cloud) override; - inline void copyPointCloud( - const PointCloud2 & input, const int point_step, const size_t global_offset, - PointCloud2 & output, size_t & output_pointcloud_size) - { - std::memcpy(&output.data[output_pointcloud_size], &input.data[global_offset], point_step); - output_pointcloud_size += point_step; - } }; } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/utils/utils.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/utils/utils.hpp index 12577081713be..044a71ab57533 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/utils/utils.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/utils/utils.hpp @@ -56,7 +56,7 @@ namespace autoware::image_projection_based_fusion { using PointCloud = pcl::PointCloud; -using PointCloud2 = sensor_msgs::msg::PointCloud2; + struct PointData { float distance; @@ -72,17 +72,17 @@ std::optional getTransformStamped( Eigen::Affine3d transformToEigen(const geometry_msgs::msg::Transform & t); void closest_cluster( - const PointCloud2 & cluster, const double cluster_2d_tolerance, const int min_cluster_size, - const pcl::PointXYZ & center, PointCloud2 & out_cluster); + const PointCloudMsgType & cluster, const double cluster_2d_tolerance, const int min_cluster_size, + const pcl::PointXYZ & center, PointCloudMsgType & out_cluster); void updateOutputFusedObjects( - std::vector & output_objs, std::vector & clusters, - const std::vector & clusters_data_size, const PointCloud2 & in_cloud, + std::vector & output_objs, std::vector & clusters, + const std::vector & clusters_data_size, const PointCloudMsgType & in_cloud, const std_msgs::msg::Header & in_roi_header, const tf2_ros::Buffer & tf_buffer, const int min_cluster_size, const int max_cluster_size, const float cluster_2d_tolerance, std::vector & output_fused_objects); -geometry_msgs::msg::Point getCentroid(const sensor_msgs::msg::PointCloud2 & pointcloud); +geometry_msgs::msg::Point getCentroid(const PointCloudMsgType & pointcloud); } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp b/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp index ea0904215cb86..310c68f12db88 100644 --- a/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef ROS_DISTRO_GALACTIC #include @@ -45,79 +46,66 @@ namespace autoware::image_projection_based_fusion { using autoware::universe_utils::ScopedTimeTrack; -template -FusionNode::FusionNode( +template +FusionNode::FusionNode( const std::string & node_name, const rclcpp::NodeOptions & options) : Node(node_name, options), tf_buffer_(this->get_clock()), tf_listener_(tf_buffer_) { // set rois_number - rois_number_ = static_cast(declare_parameter("rois_number")); - if (rois_number_ < 1) { - RCLCPP_WARN( - this->get_logger(), "minimum rois_number is 1. current rois_number is %zu", rois_number_); - rois_number_ = 1; + const std::size_t rois_number = + static_cast(declare_parameter("rois_number")); + if (rois_number < 1) { + RCLCPP_ERROR( + this->get_logger(), "minimum rois_number is 1. current rois_number is %zu", rois_number); } - if (rois_number_ > 8) { + if (rois_number > 8) { RCLCPP_WARN( this->get_logger(), - "Current rois_number is %zu. Large rois number may cause performance issue.", rois_number_); + "Current rois_number is %zu. Large rois number may cause performance issue.", rois_number); } // Set parameters match_threshold_ms_ = declare_parameter("match_threshold_ms"); timeout_ms_ = declare_parameter("timeout_ms"); - input_rois_topics_.resize(rois_number_); - input_camera_topics_.resize(rois_number_); - input_camera_info_topics_.resize(rois_number_); + std::vector input_rois_topics; + std::vector input_camera_info_topics; + + input_rois_topics.resize(rois_number); + input_camera_info_topics.resize(rois_number); - for (std::size_t roi_i = 0; roi_i < rois_number_; ++roi_i) { - input_rois_topics_.at(roi_i) = declare_parameter( + for (std::size_t roi_i = 0; roi_i < rois_number; ++roi_i) { + input_rois_topics.at(roi_i) = declare_parameter( "input/rois" + std::to_string(roi_i), "/perception/object_recognition/detection/rois" + std::to_string(roi_i)); - input_camera_info_topics_.at(roi_i) = declare_parameter( + input_camera_info_topics.at(roi_i) = declare_parameter( "input/camera_info" + std::to_string(roi_i), "/sensing/camera/camera" + std::to_string(roi_i) + "/camera_info"); - - input_camera_topics_.at(roi_i) = declare_parameter( - "input/image" + std::to_string(roi_i), - "/sensing/camera/camera" + std::to_string(roi_i) + "/image_rect_color"); } - input_offset_ms_ = declare_parameter>("input_offset_ms"); - if (!input_offset_ms_.empty() && rois_number_ > input_offset_ms_.size()) { - throw std::runtime_error("The number of offsets does not match the number of topics."); - } - - // sub camera info - camera_info_subs_.resize(rois_number_); - for (std::size_t roi_i = 0; roi_i < rois_number_; ++roi_i) { + // subscribe camera info + camera_info_subs_.resize(rois_number); + for (std::size_t roi_i = 0; roi_i < rois_number; ++roi_i) { std::function fnc = std::bind(&FusionNode::cameraInfoCallback, this, std::placeholders::_1, roi_i); camera_info_subs_.at(roi_i) = this->create_subscription( - input_camera_info_topics_.at(roi_i), rclcpp::QoS{1}.best_effort(), fnc); + input_camera_info_topics.at(roi_i), rclcpp::QoS{1}.best_effort(), fnc); } - // sub rois - rois_subs_.resize(rois_number_); - cached_roi_msgs_.resize(rois_number_); - is_fused_.resize(rois_number_, false); - for (std::size_t roi_i = 0; roi_i < rois_number_; ++roi_i) { + // subscribe rois + rois_subs_.resize(rois_number); + for (std::size_t roi_i = 0; roi_i < rois_number; ++roi_i) { std::function roi_callback = std::bind(&FusionNode::roiCallback, this, std::placeholders::_1, roi_i); rois_subs_.at(roi_i) = this->create_subscription( - input_rois_topics_.at(roi_i), rclcpp::QoS{1}.best_effort(), roi_callback); + input_rois_topics.at(roi_i), rclcpp::QoS{1}.best_effort(), roi_callback); } - // subscribers - std::function sub_callback = + // subscribe 3d detection + std::function sub_callback = std::bind(&FusionNode::subCallback, this, std::placeholders::_1); - sub_ = - this->create_subscription("input", rclcpp::QoS(1).best_effort(), sub_callback); - - // publisher - pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); + sub_ = this->create_subscription("input", rclcpp::QoS(1).best_effort(), sub_callback); // Set timer const auto period_ns = std::chrono::duration_cast( @@ -125,40 +113,34 @@ FusionNode::FusionNode( timer_ = rclcpp::create_timer( this, get_clock(), period_ns, std::bind(&FusionNode::timer_callback, this)); - // camera projection settings - camera_projectors_.resize(rois_number_); - point_project_to_unrectified_image_ = - declare_parameter>("point_project_to_unrectified_image"); + // initialization on each 2d detections + setDet2DStatus(rois_number); - if (rois_number_ > point_project_to_unrectified_image_.size()) { - throw std::runtime_error( - "The number of point_project_to_unrectified_image does not match the number of rois topics."); - } - approx_camera_projection_ = declare_parameter>("approximate_camera_projection"); - if (rois_number_ != approx_camera_projection_.size()) { - const std::size_t current_size = approx_camera_projection_.size(); - RCLCPP_WARN( - this->get_logger(), - "The number of elements in approximate_camera_projection should be the same as in " - "rois_number. " - "It has %zu elements.", - current_size); - if (current_size < rois_number_) { - approx_camera_projection_.resize(rois_number_); - for (std::size_t i = current_size; i < rois_number_; i++) { - approx_camera_projection_.at(i) = true; - } - } - } + // parameters for approximation grid approx_grid_cell_w_size_ = declare_parameter("approximation_grid_cell_width"); approx_grid_cell_h_size_ = declare_parameter("approximation_grid_cell_height"); + // parameters for out_of_scope filter + filter_scope_min_x_ = declare_parameter("filter_scope_min_x"); + filter_scope_max_x_ = declare_parameter("filter_scope_max_x"); + filter_scope_min_y_ = declare_parameter("filter_scope_min_y"); + filter_scope_max_y_ = declare_parameter("filter_scope_max_y"); + filter_scope_min_z_ = declare_parameter("filter_scope_min_z"); + filter_scope_max_z_ = declare_parameter("filter_scope_max_z"); + // debugger if (declare_parameter("debug_mode", false)) { + std::vector input_camera_topics; + input_camera_topics.resize(rois_number); + for (std::size_t roi_i = 0; roi_i < rois_number; ++roi_i) { + input_camera_topics.at(roi_i) = declare_parameter( + "input/image" + std::to_string(roi_i), + "/sensing/camera/camera" + std::to_string(roi_i) + "/image_rect_color"); + } std::size_t image_buffer_size = static_cast(declare_parameter("image_buffer_size")); debugger_ = - std::make_shared(this, rois_number_, image_buffer_size, input_camera_topics_); + std::make_shared(this, rois_number, image_buffer_size, input_camera_topics); } // time keeper @@ -180,77 +162,127 @@ FusionNode::FusionNode( stop_watch_ptr_->tic("cyclic_time"); stop_watch_ptr_->tic("processing_time"); } +} - filter_scope_min_x_ = declare_parameter("filter_scope_min_x"); - filter_scope_max_x_ = declare_parameter("filter_scope_max_x"); - filter_scope_min_y_ = declare_parameter("filter_scope_min_y"); - filter_scope_max_y_ = declare_parameter("filter_scope_max_y"); - filter_scope_min_z_ = declare_parameter("filter_scope_min_z"); - filter_scope_max_z_ = declare_parameter("filter_scope_max_z"); +template +void FusionNode::setDet2DStatus(std::size_t rois_number) +{ + // camera offset settings + std::vector input_offset_ms = declare_parameter>("input_offset_ms"); + if (!input_offset_ms.empty() && rois_number > input_offset_ms.size()) { + throw std::runtime_error("The number of offsets does not match the number of topics."); + } + + // camera projection settings + std::vector point_project_to_unrectified_image = + declare_parameter>("point_project_to_unrectified_image"); + if (rois_number > point_project_to_unrectified_image.size()) { + throw std::runtime_error( + "The number of point_project_to_unrectified_image does not match the number of rois " + "topics."); + } + std::vector approx_camera_projection = + declare_parameter>("approximate_camera_projection"); + if (rois_number != approx_camera_projection.size()) { + const std::size_t current_size = approx_camera_projection.size(); + RCLCPP_WARN( + get_logger(), + "The number of elements in approximate_camera_projection should be the same as in " + "rois_number. " + "It has %zu elements.", + current_size); + if (current_size < rois_number) { + approx_camera_projection.resize(rois_number); + for (std::size_t i = current_size; i < rois_number; i++) { + approx_camera_projection.at(i) = true; + } + } + } + + // 2d detection status initialization + det2d_list_.resize(rois_number); + for (std::size_t roi_i = 0; roi_i < rois_number; ++roi_i) { + det2d_list_.at(roi_i).id = roi_i; + det2d_list_.at(roi_i).project_to_unrectified_image = + point_project_to_unrectified_image.at(roi_i); + det2d_list_.at(roi_i).approximate_camera_projection = approx_camera_projection.at(roi_i); + det2d_list_.at(roi_i).input_offset_ms = input_offset_ms.at(roi_i); + } } -template -void FusionNode::cameraInfoCallback( +template +void FusionNode::cameraInfoCallback( const sensor_msgs::msg::CameraInfo::ConstSharedPtr input_camera_info_msg, const std::size_t camera_id) { // create the CameraProjection when the camera info arrives for the first time // assuming the camera info does not change while the node is running - if ( - camera_info_map_.find(camera_id) == camera_info_map_.end() && - checkCameraInfo(*input_camera_info_msg)) { - camera_projectors_.at(camera_id) = CameraProjection( + auto & det2d = det2d_list_.at(camera_id); + if (!det2d.camera_projector_ptr && checkCameraInfo(*input_camera_info_msg)) { + det2d.camera_projector_ptr = std::make_unique( *input_camera_info_msg, approx_grid_cell_w_size_, approx_grid_cell_h_size_, - point_project_to_unrectified_image_.at(camera_id), approx_camera_projection_.at(camera_id)); - camera_projectors_.at(camera_id).initialize(); - - camera_info_map_[camera_id] = *input_camera_info_msg; + det2d.project_to_unrectified_image, det2d.approximate_camera_projection); + det2d.camera_projector_ptr->initialize(); } } -template -void FusionNode::preprocess(TargetMsg3D & ouput_msg - __attribute__((unused))) +template +void FusionNode::preprocess(Msg3D & ouput_msg __attribute__((unused))) { // do nothing by default } -template -void FusionNode::subCallback( - const typename TargetMsg3D::ConstSharedPtr input_msg) +template +void FusionNode::exportProcess() +{ + timer_->cancel(); + + ExportObj output_msg; + postprocess(*(cached_det3d_msg_ptr_), output_msg); + publish(output_msg); + + // add processing time for debug + if (debug_publisher_) { + const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); + const double pipeline_latency_ms = + std::chrono::duration( + std::chrono::nanoseconds( + (this->get_clock()->now() - cached_det3d_msg_ptr_->header.stamp).nanoseconds())) + .count(); + debug_publisher_->publish( + "debug/cyclic_time_ms", cyclic_time_ms); + debug_publisher_->publish( + "debug/processing_time_ms", + processing_time_ms + stop_watch_ptr_->toc("processing_time", true)); + debug_publisher_->publish( + "debug/pipeline_latency_ms", pipeline_latency_ms); + processing_time_ms = 0; + } + cached_det3d_msg_ptr_ = nullptr; +} + +template +void FusionNode::subCallback( + const typename Msg3D::ConstSharedPtr det3d_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - if (cached_msg_.second != nullptr) { + if (cached_det3d_msg_ptr_ != nullptr) { + // PROCESS: if the main message is remained (and roi is not collected all) publish the main + // message may processed partially with arrived 2d rois stop_watch_ptr_->toc("processing_time", true); - timer_->cancel(); - postprocess(*(cached_msg_.second)); - publish(*(cached_msg_.second)); - std::fill(is_fused_.begin(), is_fused_.end(), false); - - // add processing time for debug - if (debug_publisher_) { - const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); - const double pipeline_latency_ms = - std::chrono::duration( - std::chrono::nanoseconds( - (this->get_clock()->now() - cached_msg_.second->header.stamp).nanoseconds())) - .count(); - debug_publisher_->publish( - "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( - "debug/processing_time_ms", - processing_time_ms + stop_watch_ptr_->toc("processing_time", true)); - debug_publisher_->publish( - "debug/pipeline_latency_ms", pipeline_latency_ms); - processing_time_ms = 0; - } + exportProcess(); - cached_msg_.second = nullptr; + // reset flags + for (auto & det2d : det2d_list_) { + det2d.is_fused = false; + } } std::lock_guard lock(mutex_cached_msgs_); + + // TIMING: reset timer to the timeout time auto period = std::chrono::duration_cast( std::chrono::duration(timeout_ms_)); try { @@ -262,154 +294,141 @@ void FusionNode::subCallback( stop_watch_ptr_->toc("processing_time", true); - typename TargetMsg3D::SharedPtr output_msg = std::make_shared(*input_msg); - + // PROCESS: preprocess the main message + typename Msg3D::SharedPtr output_msg = std::make_shared(*det3d_msg); preprocess(*output_msg); + // PROCESS: fuse the main message with the cached roi messages + // (please ask maintainers before parallelize this loop because debugger is not thread safe) int64_t timestamp_nsec = (*output_msg).header.stamp.sec * static_cast(1e9) + (*output_msg).header.stamp.nanosec; + // for loop for each roi + for (auto & det2d : det2d_list_) { + const auto roi_i = det2d.id; - // if matching rois exist, fuseOnSingle - // please ask maintainers before parallelize this loop because debugger is not thread safe - for (std::size_t roi_i = 0; roi_i < rois_number_; ++roi_i) { - if (camera_info_map_.find(roi_i) == camera_info_map_.end()) { + // check camera info + if (det2d.camera_projector_ptr == nullptr) { RCLCPP_WARN_THROTTLE( this->get_logger(), *this->get_clock(), 5000, "no camera info. id is %zu", roi_i); continue; } - - if ((cached_roi_msgs_.at(roi_i)).size() > 0) { - int64_t min_interval = 1e9; - int64_t matched_stamp = -1; - std::list outdate_stamps; - - for (const auto & [k, v] : cached_roi_msgs_.at(roi_i)) { - int64_t new_stamp = timestamp_nsec + input_offset_ms_.at(roi_i) * static_cast(1e6); - int64_t interval = abs(static_cast(k) - new_stamp); - - if ( - interval <= min_interval && interval <= match_threshold_ms_ * static_cast(1e6)) { - min_interval = interval; - matched_stamp = k; - } else if ( - static_cast(k) < new_stamp && - interval > match_threshold_ms_ * static_cast(1e6)) { - outdate_stamps.push_back(static_cast(k)); - } + auto & det2d_msgs = det2d.cached_det2d_msgs; + + // check if the roi is collected + if (det2d_msgs.size() == 0) continue; + + // MATCH: get the closest roi message, and remove outdated messages + int64_t min_interval = 1e9; + int64_t matched_stamp = -1; + std::list outdate_stamps; + for (const auto & [roi_stamp, value] : det2d_msgs) { + int64_t new_stamp = timestamp_nsec + det2d.input_offset_ms * static_cast(1e6); + int64_t interval = abs(static_cast(roi_stamp) - new_stamp); + + if (interval <= min_interval && interval <= match_threshold_ms_ * static_cast(1e6)) { + min_interval = interval; + matched_stamp = roi_stamp; + } else if ( + static_cast(roi_stamp) < new_stamp && + interval > match_threshold_ms_ * static_cast(1e6)) { + outdate_stamps.push_back(static_cast(roi_stamp)); } + } + for (auto stamp : outdate_stamps) { + det2d_msgs.erase(stamp); + } - // remove outdated stamps - for (auto stamp : outdate_stamps) { - (cached_roi_msgs_.at(roi_i)).erase(stamp); + // PROCESS: if matched, fuse the main message with the roi message + if (matched_stamp != -1) { + if (debugger_) { + debugger_->clear(); } - // fuseOnSingle - if (matched_stamp != -1) { - if (debugger_) { - debugger_->clear(); - } + fuseOnSingleImage(*det3d_msg, det2d, *(det2d_msgs[matched_stamp]), *output_msg); + det2d_msgs.erase(matched_stamp); + det2d.is_fused = true; - fuseOnSingleImage( - *input_msg, roi_i, *((cached_roi_msgs_.at(roi_i))[matched_stamp]), *output_msg); - (cached_roi_msgs_.at(roi_i)).erase(matched_stamp); - is_fused_.at(roi_i) = true; - - // add timestamp interval for debug - if (debug_publisher_) { - double timestamp_interval_ms = (matched_stamp - timestamp_nsec) / 1e6; - debug_publisher_->publish( - "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_ms", timestamp_interval_ms); - debug_publisher_->publish( - "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_offset_ms", - timestamp_interval_ms - input_offset_ms_.at(roi_i)); - } + // add timestamp interval for debug + if (debug_publisher_) { + double timestamp_interval_ms = (matched_stamp - timestamp_nsec) / 1e6; + debug_publisher_->publish( + "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_ms", timestamp_interval_ms); + debug_publisher_->publish( + "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_offset_ms", + timestamp_interval_ms - det2d.input_offset_ms); } } } - // if all camera fused, postprocess; else, publish the old Msg(if exists) and cache the current - // Msg - if (std::count(is_fused_.begin(), is_fused_.end(), true) == static_cast(rois_number_)) { - timer_->cancel(); - postprocess(*output_msg); - publish(*output_msg); - std::fill(is_fused_.begin(), is_fused_.end(), false); - cached_msg_.second = nullptr; - - // add processing time for debug - if (debug_publisher_) { - const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); - processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( - "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( - "debug/processing_time_ms", processing_time_ms); - processing_time_ms = 0; + // PROCESS: check if the fused message is ready to publish + cached_det3d_msg_timestamp_ = timestamp_nsec; + cached_det3d_msg_ptr_ = output_msg; + if (checkAllDet2dFused()) { + // if all camera fused, postprocess and publish the main message + exportProcess(); + + // reset flags + for (auto & det2d : det2d_list_) { + det2d.is_fused = false; } } else { - cached_msg_.first = timestamp_nsec; - cached_msg_.second = output_msg; + // if all of rois are not collected, publish the old Msg(if exists) and cache the + // current Msg processing_time_ms = stop_watch_ptr_->toc("processing_time", true); } } -template -void FusionNode::roiCallback( - const typename Msg2D::ConstSharedPtr input_roi_msg, const std::size_t roi_i) +template +void FusionNode::roiCallback( + const typename Msg2D::ConstSharedPtr det2d_msg, const std::size_t roi_i) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); stop_watch_ptr_->toc("processing_time", true); - int64_t timestamp_nsec = (*input_roi_msg).header.stamp.sec * static_cast(1e9) + - (*input_roi_msg).header.stamp.nanosec; + auto & det2d = det2d_list_.at(roi_i); + int64_t timestamp_nsec = + (*det2d_msg).header.stamp.sec * static_cast(1e9) + (*det2d_msg).header.stamp.nanosec; // if cached Msg exist, try to match - if (cached_msg_.second != nullptr) { - int64_t new_stamp = cached_msg_.first + input_offset_ms_.at(roi_i) * static_cast(1e6); + if (cached_det3d_msg_ptr_ != nullptr) { + int64_t new_stamp = + cached_det3d_msg_timestamp_ + det2d.input_offset_ms * static_cast(1e6); int64_t interval = abs(timestamp_nsec - new_stamp); - if ( - interval < match_threshold_ms_ * static_cast(1e6) && is_fused_.at(roi_i) == false) { - if (camera_info_map_.find(roi_i) == camera_info_map_.end()) { + // PROCESS: if matched, fuse the main message with the roi message + if (interval < match_threshold_ms_ * static_cast(1e6) && det2d.is_fused == false) { + // check camera info + if (det2d.camera_projector_ptr == nullptr) { RCLCPP_WARN_THROTTLE( this->get_logger(), *this->get_clock(), 5000, "no camera info. id is %zu", roi_i); - (cached_roi_msgs_.at(roi_i))[timestamp_nsec] = input_roi_msg; + det2d.cached_det2d_msgs[timestamp_nsec] = det2d_msg; return; } + if (debugger_) { debugger_->clear(); } - - fuseOnSingleImage(*(cached_msg_.second), roi_i, *input_roi_msg, *(cached_msg_.second)); - is_fused_.at(roi_i) = true; + // PROCESS: fuse the main message with the roi message + fuseOnSingleImage(*(cached_det3d_msg_ptr_), det2d, *det2d_msg, *(cached_det3d_msg_ptr_)); + det2d.is_fused = true; if (debug_publisher_) { - double timestamp_interval_ms = (timestamp_nsec - cached_msg_.first) / 1e6; + double timestamp_interval_ms = (timestamp_nsec - cached_det3d_msg_timestamp_) / 1e6; debug_publisher_->publish( "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_ms", timestamp_interval_ms); debug_publisher_->publish( "debug/roi" + std::to_string(roi_i) + "/timestamp_interval_offset_ms", - timestamp_interval_ms - input_offset_ms_.at(roi_i)); + timestamp_interval_ms - det2d.input_offset_ms); } - if (std::count(is_fused_.begin(), is_fused_.end(), true) == static_cast(rois_number_)) { - timer_->cancel(); - postprocess(*(cached_msg_.second)); - publish(*(cached_msg_.second)); - std::fill(is_fused_.begin(), is_fused_.end(), false); - cached_msg_.second = nullptr; - - // add processing time for debug - if (debug_publisher_) { - const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); - debug_publisher_->publish( - "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( - "debug/processing_time_ms", - processing_time_ms + stop_watch_ptr_->toc("processing_time", true)); - processing_time_ms = 0; + // PROCESS: if all camera fused, postprocess and publish the main message + if (checkAllDet2dFused()) { + exportProcess(); + // reset flags + for (auto & status : det2d_list_) { + status.is_fused = false; } } processing_time_ms = processing_time_ms + stop_watch_ptr_->toc("processing_time", true); @@ -417,18 +436,11 @@ void FusionNode::roiCallback( } } // store roi msg if not matched - (cached_roi_msgs_.at(roi_i))[timestamp_nsec] = input_roi_msg; + det2d.cached_det2d_msgs[timestamp_nsec] = det2d_msg; } -template -void FusionNode::postprocess(TargetMsg3D & output_msg - __attribute__((unused))) -{ - // do nothing by default -} - -template -void FusionNode::timer_callback() +template +void FusionNode::timer_callback() { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -436,29 +448,20 @@ void FusionNode::timer_callback() using std::chrono_literals::operator""ms; timer_->cancel(); if (mutex_cached_msgs_.try_lock()) { - // timeout, postprocess cached msg - if (cached_msg_.second != nullptr) { + // PROCESS: if timeout, postprocess cached msg + if (cached_det3d_msg_ptr_ != nullptr) { stop_watch_ptr_->toc("processing_time", true); + exportProcess(); + } - postprocess(*(cached_msg_.second)); - publish(*(cached_msg_.second)); - - // add processing time for debug - if (debug_publisher_) { - const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); - debug_publisher_->publish( - "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( - "debug/processing_time_ms", - processing_time_ms + stop_watch_ptr_->toc("processing_time", true)); - processing_time_ms = 0; - } + // reset flags whether the message is fused or not + for (auto & det2d : det2d_list_) { + det2d.is_fused = false; } - std::fill(is_fused_.begin(), is_fused_.end(), false); - cached_msg_.second = nullptr; mutex_cached_msgs_.unlock(); } else { + // TIMING: retry the process after 10ms try { std::chrono::nanoseconds period = 10ms; setPeriod(period.count()); @@ -469,8 +472,8 @@ void FusionNode::timer_callback() } } -template -void FusionNode::setPeriod(const int64_t new_period) +template +void FusionNode::setPeriod(const int64_t new_period) { if (!timer_) { return; @@ -486,8 +489,16 @@ void FusionNode::setPeriod(const int64_t new_period) } } -template -void FusionNode::publish(const TargetMsg3D & output_msg) +template +void FusionNode::postprocess( + const Msg3D & processing_msg __attribute__((unused)), + ExportObj & output_msg __attribute__((unused))) +{ + // do nothing by default +} + +template +void FusionNode::publish(const ExportObj & output_msg) { if (pub_ptr_->get_subscription_count() < 1) { return; @@ -495,10 +506,21 @@ void FusionNode::publish(const TargetMsg3D & output_msg pub_ptr_->publish(output_msg); } -template class FusionNode; -template class FusionNode< - DetectedObjectsWithFeature, DetectedObjectWithFeature, DetectedObjectsWithFeature>; -template class FusionNode; -template class FusionNode; -template class FusionNode; +// Explicit instantiation for the supported types + +// pointpainting fusion +template class FusionNode; + +// roi cluster fusion +template class FusionNode; + +// roi detected-object fusion +template class FusionNode; + +// roi pointcloud fusion +template class FusionNode; + +// segment pointcloud fusion +template class FusionNode; + } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp index 2f6f853d4281e..bcd62383319c1 100644 --- a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp @@ -91,8 +91,7 @@ inline bool isUnknown(int label2d) } PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & options) -: FusionNode( - "pointpainting_fusion", options) +: FusionNode("pointpainting_fusion", options) { omp_num_threads_ = this->declare_parameter("omp_params.num_threads"); const float score_threshold = @@ -156,11 +155,16 @@ PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & opt const auto min_area_matrix = this->declare_parameter>("min_area_matrix"); const auto max_area_matrix = this->declare_parameter>("max_area_matrix"); - std::function sub_callback = + // subscriber + std::function sub_callback = std::bind(&PointPaintingFusionNode::subCallback, this, std::placeholders::_1); - sub_ = this->create_subscription( + sub_ = this->create_subscription( "~/input/pointcloud", rclcpp::SensorDataQoS().keep_last(3), sub_callback); + // publisher + point_pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); + pub_ptr_ = this->create_publisher("~/output/objects", rclcpp::QoS{1}); + detection_class_remapper_.setParameters( allow_remapping_by_area_matrix, min_area_matrix, max_area_matrix); @@ -189,15 +193,13 @@ PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & opt diagnostics_interface_ptr_ = std::make_unique(this, "pointpainting_trt"); - obj_pub_ptr_ = this->create_publisher("~/output/objects", rclcpp::QoS{1}); - if (this->declare_parameter("build_only", false)) { RCLCPP_INFO(this->get_logger(), "TensorRT engine is built and shutdown node."); rclcpp::shutdown(); } } -void PointPaintingFusionNode::preprocess(sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) +void PointPaintingFusionNode::preprocess(PointCloudMsgType & painted_pointcloud_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -254,9 +256,9 @@ void PointPaintingFusionNode::preprocess(sensor_msgs::msg::PointCloud2 & painted } void PointPaintingFusionNode::fuseOnSingleImage( - __attribute__((unused)) const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, - const std::size_t image_id, const DetectedObjectsWithFeature & input_roi_msg, - sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) + __attribute__((unused)) const PointCloudMsgType & input_pointcloud_msg, + const Det2dStatus & det2d, const RoiMsgType & input_roi_msg, + PointCloudMsgType & painted_pointcloud_msg) { if (painted_pointcloud_msg.data.empty() || painted_pointcloud_msg.fields.empty()) { RCLCPP_WARN_STREAM_THROTTLE( @@ -288,10 +290,6 @@ void PointPaintingFusionNode::fuseOnSingleImage( lidar2cam_affine = _transformToEigen(transform_stamped_optional.value().transform); } - // transform - // sensor_msgs::msg::PointCloud2 transformed_pointcloud; - // tf2::doTransform(painted_pointcloud_msg, transformed_pointcloud, transform_stamped); - const auto x_offset = painted_pointcloud_msg.fields .at(static_cast(autoware::point_types::PointXYZIRCIndex::X)) .offset; @@ -337,13 +335,13 @@ dc | dc dc dc dc ||zc| p_y = point_camera.y(); p_z = point_camera.z(); - if (camera_projectors_[image_id].isOutsideHorizontalView(p_x, p_z)) { + if (det2d.camera_projector_ptr->isOutsideHorizontalView(p_x, p_z)) { continue; } // project Eigen::Vector2d projected_point; - if (camera_projectors_[image_id].calcImageProjectedPoint( + if (det2d.camera_projector_ptr->calcImageProjectedPoint( cv::Point3d(p_x, p_y, p_z), projected_point)) { // iterate 2d bbox for (const auto & feature_object : objects) { @@ -360,41 +358,45 @@ dc | dc dc dc dc ||zc| *p_class = cls.second(label2d) ? (class_index_[cls.first] + *p_class) : *p_class; } } - } - if (debugger_) { - int thread_id = omp_get_thread_num(); - local_vectors[thread_id].push_back(projected_point); + if (debugger_) { + int thread_id = omp_get_thread_num(); + local_vectors[thread_id].push_back(projected_point); + } } } } - } - if (debugger_) { - std::unique_ptr inner_st_ptr; - if (time_keeper_) - inner_st_ptr = std::make_unique("publish debug message", *time_keeper_); + if (debugger_) { + std::unique_ptr inner_st_ptr; + if (time_keeper_) + inner_st_ptr = std::make_unique("publish debug message", *time_keeper_); - for (const auto & feature_object : input_roi_msg.feature_objects) { - debug_image_rois.push_back(feature_object.feature.roi); - } + for (const auto & feature_object : input_roi_msg.feature_objects) { + debug_image_rois.push_back(feature_object.feature.roi); + } - for (const auto & local_vec : local_vectors) { - debug_image_points.insert(debug_image_points.end(), local_vec.begin(), local_vec.end()); - } + for (const auto & local_vec : local_vectors) { + debug_image_points.insert(debug_image_points.end(), local_vec.begin(), local_vec.end()); + } - debugger_->image_rois_ = debug_image_rois; - debugger_->obstacle_points_ = debug_image_points; - debugger_->publishImage(image_id, input_roi_msg.header.stamp); + debugger_->image_rois_ = debug_image_rois; + debugger_->obstacle_points_ = debug_image_points; + debugger_->publishImage(det2d.id, input_roi_msg.header.stamp); + } } } -void PointPaintingFusionNode::postprocess(sensor_msgs::msg::PointCloud2 & painted_pointcloud_msg) +void PointPaintingFusionNode::postprocess( + const PointCloudMsgType & painted_pointcloud_msg, DetectedObjects & output_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); diagnostics_interface_ptr_->clear(); + output_msg.header = painted_pointcloud_msg.header; + output_msg.objects.clear(); + const auto objects_sub_count = - obj_pub_ptr_->get_subscription_count() + obj_pub_ptr_->get_intra_process_subscription_count(); + pub_ptr_->get_subscription_count() + pub_ptr_->get_intra_process_subscription_count(); if (objects_sub_count < 1) { return; } @@ -430,22 +432,18 @@ void PointPaintingFusionNode::postprocess(sensor_msgs::msg::PointCloud2 & painte raw_objects.emplace_back(obj); } - autoware_perception_msgs::msg::DetectedObjects output_msg; - output_msg.header = painted_pointcloud_msg.header; + // prepare output message output_msg.objects = iou_bev_nms_.apply(raw_objects); detection_class_remapper_.mapClasses(output_msg); - if (objects_sub_count > 0) { - obj_pub_ptr_->publish(output_msg); + // publish debug message: painted pointcloud + if (point_pub_ptr_->get_subscription_count() > 0) { + point_pub_ptr_->publish(painted_pointcloud_msg); } diagnostics_interface_ptr_->publish(painted_pointcloud_msg.header.stamp); } -bool PointPaintingFusionNode::out_of_scope(__attribute__((unused)) const DetectedObjects & obj) -{ - return false; -} } // namespace autoware::image_projection_based_fusion #include diff --git a/perception/autoware_image_projection_based_fusion/src/roi_cluster_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/roi_cluster_fusion/node.cpp index 32db5319bb487..0a9d9e3391882 100644 --- a/perception/autoware_image_projection_based_fusion/src/roi_cluster_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/roi_cluster_fusion/node.cpp @@ -41,8 +41,7 @@ namespace autoware::image_projection_based_fusion using autoware::universe_utils::ScopedTimeTrack; RoiClusterFusionNode::RoiClusterFusionNode(const rclcpp::NodeOptions & options) -: FusionNode( - "roi_cluster_fusion", options) +: FusionNode("roi_cluster_fusion", options) { trust_object_iou_mode_ = declare_parameter("trust_object_iou_mode"); non_trust_object_iou_mode_ = declare_parameter("non_trust_object_iou_mode"); @@ -54,9 +53,12 @@ RoiClusterFusionNode::RoiClusterFusionNode(const rclcpp::NodeOptions & options) remove_unknown_ = declare_parameter("remove_unknown"); fusion_distance_ = declare_parameter("fusion_distance"); trust_object_distance_ = declare_parameter("trust_object_distance"); + + // publisher + pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); } -void RoiClusterFusionNode::preprocess(DetectedObjectsWithFeature & output_cluster_msg) +void RoiClusterFusionNode::preprocess(ClusterMsgType & output_cluster_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -71,36 +73,14 @@ void RoiClusterFusionNode::preprocess(DetectedObjectsWithFeature & output_cluste } } -void RoiClusterFusionNode::postprocess(DetectedObjectsWithFeature & output_cluster_msg) -{ - std::unique_ptr st_ptr; - if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - - if (!remove_unknown_) { - return; - } - DetectedObjectsWithFeature known_objects; - known_objects.feature_objects.reserve(output_cluster_msg.feature_objects.size()); - for (auto & feature_object : output_cluster_msg.feature_objects) { - bool is_roi_label_known = feature_object.object.classification.front().label != - autoware_perception_msgs::msg::ObjectClassification::UNKNOWN; - if ( - is_roi_label_known || - feature_object.object.existence_probability >= min_roi_existence_prob_) { - known_objects.feature_objects.push_back(feature_object); - } - } - output_cluster_msg.feature_objects = known_objects.feature_objects; -} - void RoiClusterFusionNode::fuseOnSingleImage( - const DetectedObjectsWithFeature & input_cluster_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, DetectedObjectsWithFeature & output_cluster_msg) + const ClusterMsgType & input_cluster_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, ClusterMsgType & output_cluster_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - const sensor_msgs::msg::CameraInfo & camera_info = camera_projectors_[image_id].getCameraInfo(); + const sensor_msgs::msg::CameraInfo & camera_info = det2d.camera_projector_ptr->getCameraInfo(); // get transform from cluster frame id to camera optical frame id geometry_msgs::msg::TransformStamped transform_stamped; @@ -149,7 +129,7 @@ void RoiClusterFusionNode::fuseOnSingleImage( } Eigen::Vector2d projected_point; - if (camera_projectors_[image_id].calcImageProjectedPoint( + if (det2d.camera_projector_ptr->calcImageProjectedPoint( cv::Point3d(*iter_x, *iter_y, *iter_z), projected_point)) { const int px = static_cast(projected_point.x()); const int py = static_cast(projected_point.y()); @@ -168,7 +148,6 @@ void RoiClusterFusionNode::fuseOnSingleImage( } sensor_msgs::msg::RegionOfInterest roi; - // roi.do_rectify = m_camera_info_.at(id).do_rectify; roi.x_offset = min_x; roi.y_offset = min_y; roi.width = max_x - min_x; @@ -231,7 +210,7 @@ void RoiClusterFusionNode::fuseOnSingleImage( // note: debug objects are safely cleared in fusion_node.cpp if (debugger_) { - debugger_->publishImage(image_id, input_roi_msg.header.stamp); + debugger_->publishImage(det2d.id, input_roi_msg.header.stamp); } } @@ -291,6 +270,28 @@ double RoiClusterFusionNode::cal_iou_by_mode( } } +void RoiClusterFusionNode::postprocess( + const ClusterMsgType & processing_msg, ClusterMsgType & output_msg) +{ + std::unique_ptr st_ptr; + if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); + + output_msg = processing_msg; + + if (remove_unknown_) { + // filter by object classification and existence probability + output_msg.feature_objects.clear(); + for (const auto & feature_object : processing_msg.feature_objects) { + if ( + feature_object.object.classification.front().label != + autoware_perception_msgs::msg::ObjectClassification::UNKNOWN || + feature_object.object.existence_probability >= min_roi_existence_prob_) { + output_msg.feature_objects.push_back(feature_object); + } + } + } +} + } // namespace autoware::image_projection_based_fusion #include diff --git a/perception/autoware_image_projection_based_fusion/src/roi_detected_object_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/roi_detected_object_fusion/node.cpp index 7be18d59fdbf1..37769ad73e8c7 100644 --- a/perception/autoware_image_projection_based_fusion/src/roi_detected_object_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/roi_detected_object_fusion/node.cpp @@ -31,8 +31,7 @@ namespace autoware::image_projection_based_fusion using autoware::universe_utils::ScopedTimeTrack; RoiDetectedObjectFusionNode::RoiDetectedObjectFusionNode(const rclcpp::NodeOptions & options) -: FusionNode( - "roi_detected_object_fusion", options) +: FusionNode("roi_detected_object_fusion", options) { fusion_params_.passthrough_lower_bound_probability_thresholds = declare_parameter>("passthrough_lower_bound_probability_thresholds"); @@ -48,6 +47,9 @@ RoiDetectedObjectFusionNode::RoiDetectedObjectFusionNode(const rclcpp::NodeOptio can_assign_vector.data(), label_num, label_num); fusion_params_.can_assign_matrix = can_assign_matrix_tmp.transpose(); } + + // publisher + pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); } void RoiDetectedObjectFusionNode::preprocess(DetectedObjects & output_msg) @@ -82,9 +84,8 @@ void RoiDetectedObjectFusionNode::preprocess(DetectedObjects & output_msg) } void RoiDetectedObjectFusionNode::fuseOnSingleImage( - const DetectedObjects & input_object_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, - DetectedObjects & output_object_msg __attribute__((unused))) + const DetectedObjects & input_object_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, DetectedObjects & output_object_msg __attribute__((unused))) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -101,7 +102,7 @@ void RoiDetectedObjectFusionNode::fuseOnSingleImage( } const auto object_roi_map = - generateDetectedObjectRoIs(input_object_msg, image_id, object2camera_affine); + generateDetectedObjectRoIs(input_object_msg, det2d, object2camera_affine); fuseObjectsOnImage(input_object_msg, input_roi_msg.feature_objects, object_roi_map); if (debugger_) { @@ -109,13 +110,13 @@ void RoiDetectedObjectFusionNode::fuseOnSingleImage( for (std::size_t roi_i = 0; roi_i < input_roi_msg.feature_objects.size(); ++roi_i) { debugger_->image_rois_.push_back(input_roi_msg.feature_objects.at(roi_i).feature.roi); } - debugger_->publishImage(image_id, input_roi_msg.header.stamp); + debugger_->publishImage(det2d.id, input_roi_msg.header.stamp); } } std::map RoiDetectedObjectFusionNode::generateDetectedObjectRoIs( - const DetectedObjects & input_object_msg, const std::size_t & image_id, + const DetectedObjects & input_object_msg, const Det2dStatus & det2d, const Eigen::Affine3d & object2camera_affine) { std::unique_ptr st_ptr; @@ -131,7 +132,7 @@ RoiDetectedObjectFusionNode::generateDetectedObjectRoIs( return object_roi_map; } const auto & passthrough_object_flags = passthrough_object_flags_map_.at(timestamp_nsec); - const sensor_msgs::msg::CameraInfo & camera_info = camera_projectors_[image_id].getCameraInfo(); + const sensor_msgs::msg::CameraInfo & camera_info = det2d.camera_projector_ptr->getCameraInfo(); const double image_width = static_cast(camera_info.width); const double image_height = static_cast(camera_info.height); @@ -162,7 +163,7 @@ RoiDetectedObjectFusionNode::generateDetectedObjectRoIs( } Eigen::Vector2d proj_point; - if (camera_projectors_[image_id].calcImageProjectedPoint( + if (det2d.camera_projector_ptr->calcImageProjectedPoint( cv::Point3d(point.x(), point.y(), point.z()), proj_point)) { const double px = proj_point.x(); const double py = proj_point.y(); @@ -289,14 +290,15 @@ bool RoiDetectedObjectFusionNode::out_of_scope(const DetectedObject & obj) return is_out; } -void RoiDetectedObjectFusionNode::publish(const DetectedObjects & output_msg) +void RoiDetectedObjectFusionNode::postprocess( + const DetectedObjects & processing_msg, DetectedObjects & output_msg) { - if (pub_ptr_->get_subscription_count() < 1) { - return; - } + output_msg.header = processing_msg.header; + output_msg.objects.clear(); - int64_t timestamp_nsec = - output_msg.header.stamp.sec * static_cast(1e9) + output_msg.header.stamp.nanosec; + // filter out ignored objects + int64_t timestamp_nsec = processing_msg.header.stamp.sec * static_cast(1e9) + + processing_msg.header.stamp.nanosec; if ( passthrough_object_flags_map_.size() == 0 || fused_object_flags_map_.size() == 0 || ignored_object_flags_map_.size() == 0) { @@ -308,33 +310,34 @@ void RoiDetectedObjectFusionNode::publish(const DetectedObjects & output_msg) ignored_object_flags_map_.count(timestamp_nsec) == 0) { return; } + auto & passthrough_object_flags = passthrough_object_flags_map_.at(timestamp_nsec); auto & fused_object_flags = fused_object_flags_map_.at(timestamp_nsec); - auto & ignored_object_flags = ignored_object_flags_map_.at(timestamp_nsec); - - DetectedObjects output_objects_msg, debug_fused_objects_msg, debug_ignored_objects_msg; - output_objects_msg.header = output_msg.header; - debug_fused_objects_msg.header = output_msg.header; - debug_ignored_objects_msg.header = output_msg.header; - for (std::size_t obj_i = 0; obj_i < output_msg.objects.size(); ++obj_i) { - const auto & obj = output_msg.objects.at(obj_i); - if (passthrough_object_flags.at(obj_i)) { - output_objects_msg.objects.emplace_back(obj); + for (std::size_t obj_i = 0; obj_i < processing_msg.objects.size(); ++obj_i) { + const auto & obj = processing_msg.objects.at(obj_i); + if (passthrough_object_flags.at(obj_i) || fused_object_flags.at(obj_i)) { + output_msg.objects.emplace_back(obj); } + } + + // debug messages + auto & ignored_object_flags = ignored_object_flags_map_.at(timestamp_nsec); + DetectedObjects debug_fused_objects_msg, debug_ignored_objects_msg; + debug_fused_objects_msg.header = processing_msg.header; + debug_ignored_objects_msg.header = processing_msg.header; + for (std::size_t obj_i = 0; obj_i < processing_msg.objects.size(); ++obj_i) { + const auto & obj = processing_msg.objects.at(obj_i); if (fused_object_flags.at(obj_i)) { - output_objects_msg.objects.emplace_back(obj); debug_fused_objects_msg.objects.emplace_back(obj); } if (ignored_object_flags.at(obj_i)) { debug_ignored_objects_msg.objects.emplace_back(obj); } } - - pub_ptr_->publish(output_objects_msg); - debug_publisher_->publish("debug/fused_objects", debug_fused_objects_msg); debug_publisher_->publish("debug/ignored_objects", debug_ignored_objects_msg); + // clear flags passthrough_object_flags_map_.erase(timestamp_nsec); fused_object_flags_map_.erase(timestamp_nsec); ignored_object_flags_map_.erase(timestamp_nsec); diff --git a/perception/autoware_image_projection_based_fusion/src/roi_pointcloud_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/roi_pointcloud_fusion/node.cpp index 998072d87774e..b1eef00053946 100644 --- a/perception/autoware_image_projection_based_fusion/src/roi_pointcloud_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/roi_pointcloud_fusion/node.cpp @@ -37,58 +37,23 @@ namespace autoware::image_projection_based_fusion using autoware::universe_utils::ScopedTimeTrack; RoiPointCloudFusionNode::RoiPointCloudFusionNode(const rclcpp::NodeOptions & options) -: FusionNode( - "roi_pointcloud_fusion", options) +: FusionNode("roi_pointcloud_fusion", options) { fuse_unknown_only_ = declare_parameter("fuse_unknown_only"); min_cluster_size_ = declare_parameter("min_cluster_size"); max_cluster_size_ = declare_parameter("max_cluster_size"); cluster_2d_tolerance_ = declare_parameter("cluster_2d_tolerance"); - pub_objects_ptr_ = - this->create_publisher("output_clusters", rclcpp::QoS{1}); - cluster_debug_pub_ = this->create_publisher("debug/clusters", 1); -} - -void RoiPointCloudFusionNode::preprocess( - __attribute__((unused)) sensor_msgs::msg::PointCloud2 & pointcloud_msg) -{ - std::unique_ptr st_ptr; - if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - return; + // publisher + point_pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); + pub_ptr_ = this->create_publisher("output_clusters", rclcpp::QoS{1}); + cluster_debug_pub_ = this->create_publisher("debug/clusters", 1); } -void RoiPointCloudFusionNode::postprocess( - __attribute__((unused)) sensor_msgs::msg::PointCloud2 & pointcloud_msg) -{ - std::unique_ptr st_ptr; - if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - - const auto objects_sub_count = pub_objects_ptr_->get_subscription_count() + - pub_objects_ptr_->get_intra_process_subscription_count(); - if (objects_sub_count < 1) { - return; - } - - DetectedObjectsWithFeature output_msg; - output_msg.header = pointcloud_msg.header; - output_msg.feature_objects = output_fused_objects_; - - if (objects_sub_count > 0) { - pub_objects_ptr_->publish(output_msg); - } - output_fused_objects_.clear(); - // publish debug cluster - if (cluster_debug_pub_->get_subscription_count() > 0) { - sensor_msgs::msg::PointCloud2 debug_cluster_msg; - autoware::euclidean_cluster::convertObjectMsg2SensorMsg(output_msg, debug_cluster_msg); - cluster_debug_pub_->publish(debug_cluster_msg); - } -} void RoiPointCloudFusionNode::fuseOnSingleImage( - const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const std::size_t image_id, - const DetectedObjectsWithFeature & input_roi_msg, - __attribute__((unused)) sensor_msgs::msg::PointCloud2 & output_pointcloud_msg) + const PointCloudMsgType & input_pointcloud_msg, const Det2dStatus & det2d, + const RoiMsgType & input_roi_msg, + __attribute__((unused)) PointCloudMsgType & output_pointcloud_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -137,10 +102,10 @@ void RoiPointCloudFusionNode::fuseOnSingleImage( const int z_offset = input_pointcloud_msg.fields[pcl::getFieldIndex(input_pointcloud_msg, "z")].offset; - sensor_msgs::msg::PointCloud2 transformed_cloud; + PointCloudMsgType transformed_cloud; tf2::doTransform(input_pointcloud_msg, transformed_cloud, transform_stamped); - std::vector clusters; + std::vector clusters; std::vector clusters_data_size; clusters.resize(output_objs.size()); for (auto & cluster : clusters) { @@ -162,7 +127,7 @@ void RoiPointCloudFusionNode::fuseOnSingleImage( } Eigen::Vector2d projected_point; - if (camera_projectors_[image_id].calcImageProjectedPoint( + if (det2d.camera_projector_ptr->calcImageProjectedPoint( cv::Point3d(transformed_x, transformed_y, transformed_z), projected_point)) { for (std::size_t i = 0; i < output_objs.size(); ++i) { auto & feature_obj = output_objs.at(i); @@ -202,14 +167,40 @@ void RoiPointCloudFusionNode::fuseOnSingleImage( if (debugger_) { debugger_->image_rois_ = debug_image_rois; debugger_->obstacle_points_ = debug_image_points; - debugger_->publishImage(image_id, input_roi_msg.header.stamp); + debugger_->publishImage(det2d.id, input_roi_msg.header.stamp); } } -bool RoiPointCloudFusionNode::out_of_scope(__attribute__((unused)) - const DetectedObjectWithFeature & obj) +void RoiPointCloudFusionNode::postprocess( + const PointCloudMsgType & pointcloud_msg, ClusterMsgType & output_msg) { - return false; + std::unique_ptr st_ptr; + if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); + + output_msg.header = pointcloud_msg.header; + output_msg.feature_objects = output_fused_objects_; + + output_fused_objects_.clear(); + + // publish debug cluster + if (cluster_debug_pub_->get_subscription_count() > 0) { + PointCloudMsgType debug_cluster_msg; + autoware::euclidean_cluster::convertObjectMsg2SensorMsg(output_msg, debug_cluster_msg); + cluster_debug_pub_->publish(debug_cluster_msg); + } + if (point_pub_ptr_->get_subscription_count() > 0) { + point_pub_ptr_->publish(pointcloud_msg); + } +} + +void RoiPointCloudFusionNode::publish(const ClusterMsgType & output_msg) +{ + const auto objects_sub_count = + pub_ptr_->get_subscription_count() + pub_ptr_->get_intra_process_subscription_count(); + if (objects_sub_count < 1) { + return; + } + pub_ptr_->publish(output_msg); } } // namespace autoware::image_projection_based_fusion diff --git a/perception/autoware_image_projection_based_fusion/src/segmentation_pointcloud_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/segmentation_pointcloud_fusion/node.cpp index 486ae291abc6a..7d63cac7273c6 100644 --- a/perception/autoware_image_projection_based_fusion/src/segmentation_pointcloud_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/segmentation_pointcloud_fusion/node.cpp @@ -36,7 +36,7 @@ namespace autoware::image_projection_based_fusion using autoware::universe_utils::ScopedTimeTrack; SegmentPointCloudFusionNode::SegmentPointCloudFusionNode(const rclcpp::NodeOptions & options) -: FusionNode("segmentation_pointcloud_fusion", options) +: FusionNode("segmentation_pointcloud_fusion", options) { filter_distance_threshold_ = declare_parameter("filter_distance_threshold"); for (auto & item : filter_semantic_label_target_list_) { @@ -48,47 +48,24 @@ SegmentPointCloudFusionNode::SegmentPointCloudFusionNode(const rclcpp::NodeOptio } is_publish_debug_mask_ = declare_parameter("is_publish_debug_mask"); pub_debug_mask_ptr_ = image_transport::create_publisher(this, "~/debug/mask"); -} - -void SegmentPointCloudFusionNode::preprocess(__attribute__((unused)) PointCloud2 & pointcloud_msg) -{ - std::unique_ptr st_ptr; - if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - return; + // publisher + pub_ptr_ = this->create_publisher("output", rclcpp::QoS{1}); } -void SegmentPointCloudFusionNode::postprocess(PointCloud2 & pointcloud_msg) +void SegmentPointCloudFusionNode::preprocess(__attribute__((unused)) + PointCloudMsgType & pointcloud_msg) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); - auto original_cloud = std::make_shared(pointcloud_msg); - - int point_step = original_cloud->point_step; - size_t output_pointcloud_size = 0; - pointcloud_msg.data.clear(); - pointcloud_msg.data.resize(original_cloud->data.size()); - - for (size_t global_offset = 0; global_offset < original_cloud->data.size(); - global_offset += point_step) { - if (filter_global_offset_set_.find(global_offset) == filter_global_offset_set_.end()) { - copyPointCloud( - *original_cloud, point_step, global_offset, pointcloud_msg, output_pointcloud_size); - } - } - - pointcloud_msg.data.resize(output_pointcloud_size); - pointcloud_msg.row_step = output_pointcloud_size / pointcloud_msg.height; - pointcloud_msg.width = output_pointcloud_size / pointcloud_msg.point_step / pointcloud_msg.height; - - filter_global_offset_set_.clear(); return; } void SegmentPointCloudFusionNode::fuseOnSingleImage( - const PointCloud2 & input_pointcloud_msg, const std::size_t image_id, - [[maybe_unused]] const Image & input_mask, __attribute__((unused)) PointCloud2 & output_cloud) + const PointCloudMsgType & input_pointcloud_msg, const Det2dStatus & det2d, + [[maybe_unused]] const Image & input_mask, + __attribute__((unused)) PointCloudMsgType & output_cloud) { std::unique_ptr st_ptr; if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); @@ -100,7 +77,7 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage( return; } - const sensor_msgs::msg::CameraInfo & camera_info = camera_projectors_[image_id].getCameraInfo(); + const sensor_msgs::msg::CameraInfo & camera_info = det2d.camera_projector_ptr->getCameraInfo(); std::vector mask_data(input_mask.data.begin(), input_mask.data.end()); cv::Mat mask = perception_utils::runLengthDecoder(mask_data, input_mask.height, input_mask.width); @@ -128,7 +105,7 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage( transform_stamped = transform_stamped_optional.value(); } - PointCloud2 transformed_cloud; + PointCloudMsgType transformed_cloud; tf2::doTransform(input_pointcloud_msg, transformed_cloud, transform_stamped); int point_step = input_pointcloud_msg.point_step; @@ -150,7 +127,7 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage( } Eigen::Vector2d projected_point; - if (!camera_projectors_[image_id].calcImageProjectedPoint( + if (!det2d.camera_projector_ptr->calcImageProjectedPoint( cv::Point3d(transformed_x, transformed_y, transformed_z), projected_point)) { continue; } @@ -168,11 +145,33 @@ void SegmentPointCloudFusionNode::fuseOnSingleImage( } } -bool SegmentPointCloudFusionNode::out_of_scope(__attribute__((unused)) - const PointCloud2 & filtered_cloud) +void SegmentPointCloudFusionNode::postprocess( + const PointCloudMsgType & pointcloud_msg, PointCloudMsgType & output_msg) { - return false; + std::unique_ptr st_ptr; + if (time_keeper_) st_ptr = std::make_unique(__func__, *time_keeper_); + + output_msg.header = pointcloud_msg.header; + output_msg.data.clear(); + output_msg.data.resize(pointcloud_msg.data.size()); + const int point_step = pointcloud_msg.point_step; + + size_t output_pointcloud_size = 0; + for (size_t global_offset = 0; global_offset < pointcloud_msg.data.size(); + global_offset += point_step) { + if (filter_global_offset_set_.find(global_offset) == filter_global_offset_set_.end()) { + copyPointCloud(pointcloud_msg, point_step, global_offset, output_msg, output_pointcloud_size); + } + } + + output_msg.data.resize(output_pointcloud_size); + output_msg.row_step = output_pointcloud_size / output_msg.height; + output_msg.width = output_pointcloud_size / output_msg.point_step / output_msg.height; + + filter_global_offset_set_.clear(); + return; } + } // namespace autoware::image_projection_based_fusion #include diff --git a/perception/autoware_image_projection_based_fusion/src/utils/utils.cpp b/perception/autoware_image_projection_based_fusion/src/utils/utils.cpp index 4456d25b18167..81424d4c23a34 100644 --- a/perception/autoware_image_projection_based_fusion/src/utils/utils.cpp +++ b/perception/autoware_image_projection_based_fusion/src/utils/utils.cpp @@ -67,8 +67,8 @@ Eigen::Affine3d transformToEigen(const geometry_msgs::msg::Transform & t) } void closest_cluster( - const PointCloud2 & cluster, const double cluster_2d_tolerance, const int min_cluster_size, - const pcl::PointXYZ & center, PointCloud2 & out_cluster) + const PointCloudMsgType & cluster, const double cluster_2d_tolerance, const int min_cluster_size, + const pcl::PointXYZ & center, PointCloudMsgType & out_cluster) { // sort point by distance to camera origin @@ -123,8 +123,8 @@ void closest_cluster( } void updateOutputFusedObjects( - std::vector & output_objs, std::vector & clusters, - const std::vector & clusters_data_size, const PointCloud2 & in_cloud, + std::vector & output_objs, std::vector & clusters, + const std::vector & clusters_data_size, const PointCloudMsgType & in_cloud, const std_msgs::msg::Header & in_roi_header, const tf2_ros::Buffer & tf_buffer, const int min_cluster_size, const int max_cluster_size, const float cluster_2d_tolerance, std::vector & output_fused_objects) @@ -162,7 +162,7 @@ void updateOutputFusedObjects( // TODO(badai-nguyen): change to interface to select refine criteria like closest, largest // to output refine cluster and centroid - sensor_msgs::msg::PointCloud2 refine_cluster; + PointCloudMsgType refine_cluster; closest_cluster( cluster, cluster_2d_tolerance, min_cluster_size, camera_orig_point_frame, refine_cluster); if ( @@ -184,7 +184,7 @@ void updateOutputFusedObjects( } } -geometry_msgs::msg::Point getCentroid(const sensor_msgs::msg::PointCloud2 & pointcloud) +geometry_msgs::msg::Point getCentroid(const PointCloudMsgType & pointcloud) { geometry_msgs::msg::Point centroid; centroid.x = 0.0f; From 811f59d696d39c99e8731b70214f01bdcc64378e Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:39:53 +0900 Subject: [PATCH 042/127] docs(bpp): revise explanation for Failure modules (#9863) Signed-off-by: Zulfaqar Azmi --- .../docs/behavior_path_planner_manager_design.md | 4 ++-- .../autoware_behavior_path_planner/package.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design.md b/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design.md index 1e8532eba2f3a..3b787303d8d20 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design.md +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design.md @@ -533,9 +533,9 @@ If this case happened in the slot, `is_upstream_waiting_approved` is set to true ### Failure modules -The failure modules return the status `ModuleStatus::FAILURE`. The manager removes the module from approved modules stack as well as waiting approval modules, but the failure module is not moved to candidate modules stack. +If a module returns `ModuleStatus::FAILURE`, the manager removes the failed module. Additionally, all modules after the failed module are removed, even if they did not return `ModuleStatus::FAILURE`. These modules are not added back to the candidate modules stack and will instead run again from the beginning. Once these modules are removed, the output of the module prior to the failed module will be used as the planner's output. -As a result, the module A's output is used as approved modules stack. +As shown in the example below, modules B, A, and C are running. When module A returns `ModuleStatus::FAILURE`, both module A and C are removed from the approved modules stack. Module B's output is then used as the final output of the planner. ![failure_modules](../image/manager/failure_modules.drawio.svg) diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/package.xml b/planning/behavior_path_planner/autoware_behavior_path_planner/package.xml index 7b7e2438a3fd6..f9c736b9d5dde 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/package.xml +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/package.xml @@ -21,6 +21,7 @@ Kyoichi Sugahara Takayuki Murooka Go Sakayori + Mamoru Sobue Apache License 2.0 @@ -29,7 +30,6 @@ Fumiya Watanabe Zulfaqar Azmi Kosuke Takeuchi - Yutaka Shimizu Takayuki Murooka Ryohsuke Mitsudome From b5c008a2b6726458e7b2c304fce7b3e5c159cb5f Mon Sep 17 00:00:00 2001 From: cyn-liu <104069308+cyn-liu@users.noreply.github.com> Date: Thu, 9 Jan 2025 08:01:43 +0800 Subject: [PATCH 043/127] feat(autoware_point_types): move autoware_point_types to autoware.core (#9864) Signed-off-by: liu cui --- common/autoware_point_types/CHANGELOG.rst | 150 -------------- common/autoware_point_types/CMakeLists.txt | 25 --- common/autoware_point_types/README.md | 1 - .../include/autoware/point_types/types.hpp | 188 ------------------ common/autoware_point_types/package.xml | 34 ---- .../test/test_point_types.cpp | 66 ------ 6 files changed, 464 deletions(-) delete mode 100644 common/autoware_point_types/CHANGELOG.rst delete mode 100644 common/autoware_point_types/CMakeLists.txt delete mode 100644 common/autoware_point_types/README.md delete mode 100644 common/autoware_point_types/include/autoware/point_types/types.hpp delete mode 100644 common/autoware_point_types/package.xml delete mode 100644 common/autoware_point_types/test/test_point_types.cpp diff --git a/common/autoware_point_types/CHANGELOG.rst b/common/autoware_point_types/CHANGELOG.rst deleted file mode 100644 index 5e26002677a36..0000000000000 --- a/common/autoware_point_types/CHANGELOG.rst +++ /dev/null @@ -1,150 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_point_types -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* 0.39.0 -* update changelog -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Fumiya Watanabe, Ryohsuke Mitsudome, Yutaka Kondo - -0.39.0 (2024-11-25) -------------------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* refactor(autoware_point_types): prefix namespace with autoware::point_types (`#9169 `_) -* feat: migrating pointcloud types (`#6996 `_) - * feat: changed most of sensing to the new type - * chore: started applying changes to the perception stack - * feat: confirmed operation until centerpoint - * feat: reverted to the original implementation of pointpainting - * chore: forgot to push a header - * feat: also implemented the changes for the subsample filters that were out of scope before - * fix: some point type changes were missing from the latest merge from main - * chore: removed unused code, added comments, and brought back a removed publish - * chore: replaced pointcloud_raw for pointcloud_raw_ex to avoid extra processing time in the drivers - * feat: added memory layout checks - * chore: updated documentation regarding the point types - * chore: added hyperlinks to the point definitions. will be valid only once the PR is merged - * fix: fixed compilation due to moving the utilities files to the base library - * chore: separated the utilities functions due to a dependency issue - * chore: forgot that perception also uses the filter class - * feature: adapted the undistortion tests to the new point type - --------- - Co-authored-by: kminoda <44218668+kminoda@users.noreply.github.com> - Co-authored-by: badai nguyen <94814556+badai-nguyen@users.noreply.github.com> -* chore: updated maintainers for the autoware_point_types package (`#7797 `_) -* docs(common): adding .pages file (`#7148 `_) - * docs(common): adding .pages file - * fix naming - * fix naming - * fix naming - * include main page plus explanation to autoware tools - * style(pre-commit): autofix - --------- - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> -* Contributors: Esteve Fernandez, Kenzo Lobos Tsunekawa, Yutaka Kondo, Zulfaqar Azmi - -0.26.0 (2024-04-03) -------------------- -* build: mark autoware_cmake as (`#3616 `_) - * build: mark autoware_cmake as - with , autoware_cmake is automatically exported with ament_target_dependencies() (unecessary) - * style(pre-commit): autofix - * chore: fix pre-commit errors - --------- - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> - Co-authored-by: Kenji Miyake -* feat: isolate gtests in all packages (`#693 `_) -* chore: upgrade cmake_minimum_required to 3.14 (`#856 `_) -* refactor: use autoware cmake (`#849 `_) - * remove autoware_auto_cmake - * add build_depend of autoware_cmake - * use autoware_cmake in CMakeLists.txt - * fix bugs - * fix cmake lint errors -* feat: add blockage diagnostics (`#461 `_) - * feat!: add blockage diagnostic - * fix: typo - * docs: add documentation - * ci(pre-commit): autofix - * fix: typo - * ci(pre-commit): autofix - * fix: typo - * chore: add adjustable param - * ci(pre-commit): autofix - * feat!: add blockage diagnostic - * fix: typo - * docs: add documentation - * ci(pre-commit): autofix - * fix: typo - * ci(pre-commit): autofix - * fix: typo - * chore: add adjustable param - * ci(pre-commit): autofix - * chore: rearrange header file - * chore: fix typo - * chore: rearrange header - * fix: revert accident change - * chore: fix typo - * docs: add limits - * chore: check overflow - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> -* ci: check include guard (`#438 `_) - * ci: check include guard - * apply pre-commit - * Update .pre-commit-config.yaml - Co-authored-by: Kenji Miyake <31987104+kenji-miyake@users.noreply.github.com> - * fix: pre-commit - Co-authored-by: Kenji Miyake - Co-authored-by: Kenji Miyake <31987104+kenji-miyake@users.noreply.github.com> -* feat: add point_types for wrapper (`#784 `_) (`#215 `_) - * add point_types - * Revert "add point_types" - This reverts commit 5810000cd1cbd876bc22372e2bb74ccaca06187b. - * create autoware_point_types pkg - * add include - * add cmath - * fix author - * fix bug - * define epsilon as argument - * add test - * remove unnamed namespace - * update test - * fix test name - * use std::max - * change comparison method - * remove unnencessary line - * fix test - * fix comparison method name - Co-authored-by: Taichi Higashide -* Contributors: Daisuke Nishimatsu, Kenji Miyake, Maxime CLEMENT, Takagi, Isamu, Vincent Richard, badai nguyen diff --git a/common/autoware_point_types/CMakeLists.txt b/common/autoware_point_types/CMakeLists.txt deleted file mode 100644 index c149f79dab71f..0000000000000 --- a/common/autoware_point_types/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_point_types) - -find_package(autoware_cmake REQUIRED) -autoware_package() - -include_directories( - include - SYSTEM - ${PCL_INCLUDE_DIRS} -) - -if(BUILD_TESTING) - ament_add_ros_isolated_gtest(test_autoware_point_types - test/test_point_types.cpp - ) - target_include_directories(test_autoware_point_types - PRIVATE include - ) - ament_target_dependencies(test_autoware_point_types - point_cloud_msg_wrapper - ) -endif() - -ament_auto_package() diff --git a/common/autoware_point_types/README.md b/common/autoware_point_types/README.md deleted file mode 100644 index 92f19d2bc353a..0000000000000 --- a/common/autoware_point_types/README.md +++ /dev/null @@ -1 +0,0 @@ -# Autoware Point Types diff --git a/common/autoware_point_types/include/autoware/point_types/types.hpp b/common/autoware_point_types/include/autoware/point_types/types.hpp deleted file mode 100644 index 0fde62222e276..0000000000000 --- a/common/autoware_point_types/include/autoware/point_types/types.hpp +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2021 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. - -#ifndef AUTOWARE__POINT_TYPES__TYPES_HPP_ -#define AUTOWARE__POINT_TYPES__TYPES_HPP_ - -#include - -#include - -#include -#include - -namespace autoware::point_types -{ -template -bool float_eq(const T a, const T b, const T eps = 10e-6) -{ - return std::fabs(a - b) < eps; -} - -struct PointXYZI -{ - float x{0.0F}; - float y{0.0F}; - float z{0.0F}; - float intensity{0.0F}; - friend bool operator==(const PointXYZI & p1, const PointXYZI & p2) noexcept - { - return float_eq(p1.x, p2.x) && float_eq(p1.y, p2.y) && - float_eq(p1.z, p2.z) && float_eq(p1.intensity, p2.intensity); - } -}; - -enum ReturnType : uint8_t { - INVALID = 0, - SINGLE_STRONGEST, - SINGLE_LAST, - DUAL_STRONGEST_FIRST, - DUAL_STRONGEST_LAST, - DUAL_WEAK_FIRST, - DUAL_WEAK_LAST, - DUAL_ONLY, -}; - -struct PointXYZIRC -{ - float x{0.0F}; - float y{0.0F}; - float z{0.0F}; - std::uint8_t intensity{0U}; - std::uint8_t return_type{0U}; - std::uint16_t channel{0U}; - - friend bool operator==(const PointXYZIRC & p1, const PointXYZIRC & p2) noexcept - { - return float_eq(p1.x, p2.x) && float_eq(p1.y, p2.y) && - float_eq(p1.z, p2.z) && p1.intensity == p2.intensity && - p1.return_type == p2.return_type && p1.channel == p2.channel; - } -}; - -struct PointXYZIRADRT -{ - float x{0.0F}; - float y{0.0F}; - float z{0.0F}; - float intensity{0.0F}; - uint16_t ring{0U}; - float azimuth{0.0F}; - float distance{0.0F}; - uint8_t return_type{0U}; - double time_stamp{0.0}; - friend bool operator==(const PointXYZIRADRT & p1, const PointXYZIRADRT & p2) noexcept - { - return float_eq(p1.x, p2.x) && float_eq(p1.y, p2.y) && - float_eq(p1.z, p2.z) && float_eq(p1.intensity, p2.intensity) && - p1.ring == p2.ring && float_eq(p1.azimuth, p2.azimuth) && - float_eq(p1.distance, p2.distance) && p1.return_type == p2.return_type && - float_eq(p1.time_stamp, p2.time_stamp); - } -}; - -struct PointXYZIRCAEDT -{ - float x{0.0F}; - float y{0.0F}; - float z{0.0F}; - std::uint8_t intensity{0U}; - std::uint8_t return_type{0U}; - std::uint16_t channel{0U}; - float azimuth{0.0F}; - float elevation{0.0F}; - float distance{0.0F}; - std::uint32_t time_stamp{0U}; - - friend bool operator==(const PointXYZIRCAEDT & p1, const PointXYZIRCAEDT & p2) noexcept - { - return float_eq(p1.x, p2.x) && float_eq(p1.y, p2.y) && - float_eq(p1.z, p2.z) && p1.intensity == p2.intensity && - p1.return_type == p2.return_type && p1.channel == p2.channel && - float_eq(p1.azimuth, p2.azimuth) && float_eq(p1.distance, p2.distance) && - p1.time_stamp == p2.time_stamp; - } -}; - -enum class PointXYZIIndex { X, Y, Z, Intensity }; -enum class PointXYZIRCIndex { X, Y, Z, Intensity, ReturnType, Channel }; -enum class PointXYZIRADRTIndex { - X, - Y, - Z, - Intensity, - Ring, - Azimuth, - Distance, - ReturnType, - TimeStamp -}; -enum class PointXYZIRCAEDTIndex { - X, - Y, - Z, - Intensity, - ReturnType, - Channel, - Azimuth, - Elevation, - Distance, - TimeStamp -}; - -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(azimuth); -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(elevation); -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(distance); -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(return_type); -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(time_stamp); - -LIDAR_UTILS__DEFINE_FIELD_GENERATOR_FOR_MEMBER(channel); - -using PointXYZIRCGenerator = std::tuple< - point_cloud_msg_wrapper::field_x_generator, point_cloud_msg_wrapper::field_y_generator, - point_cloud_msg_wrapper::field_z_generator, point_cloud_msg_wrapper::field_intensity_generator, - field_return_type_generator, field_channel_generator>; - -using PointXYZIRADRTGenerator = std::tuple< - point_cloud_msg_wrapper::field_x_generator, point_cloud_msg_wrapper::field_y_generator, - point_cloud_msg_wrapper::field_z_generator, point_cloud_msg_wrapper::field_intensity_generator, - point_cloud_msg_wrapper::field_ring_generator, field_azimuth_generator, field_distance_generator, - field_return_type_generator, field_time_stamp_generator>; - -using PointXYZIRCAEDTGenerator = std::tuple< - point_cloud_msg_wrapper::field_x_generator, point_cloud_msg_wrapper::field_y_generator, - point_cloud_msg_wrapper::field_z_generator, point_cloud_msg_wrapper::field_intensity_generator, - field_return_type_generator, field_channel_generator, field_azimuth_generator, - field_elevation_generator, field_distance_generator, field_time_stamp_generator>; - -} // namespace autoware::point_types - -POINT_CLOUD_REGISTER_POINT_STRUCT( - autoware::point_types::PointXYZIRC, - (float, x, x)(float, y, y)(float, z, z)(std::uint8_t, intensity, intensity)( - std::uint8_t, return_type, return_type)(std::uint16_t, channel, channel)) - -POINT_CLOUD_REGISTER_POINT_STRUCT( - autoware::point_types::PointXYZIRADRT, - (float, x, x)(float, y, y)(float, z, z)(float, intensity, intensity)(std::uint16_t, ring, ring)( - float, azimuth, azimuth)(float, distance, distance)(std::uint8_t, return_type, return_type)( - double, time_stamp, time_stamp)) - -POINT_CLOUD_REGISTER_POINT_STRUCT( - autoware::point_types::PointXYZIRCAEDT, - (float, x, x)(float, y, y)(float, z, z)(std::uint8_t, intensity, intensity)( - std::uint8_t, return_type, - return_type)(std::uint16_t, channel, channel)(float, azimuth, azimuth)( - float, elevation, elevation)(float, distance, distance)(std::uint32_t, time_stamp, time_stamp)) -#endif // AUTOWARE__POINT_TYPES__TYPES_HPP_ diff --git a/common/autoware_point_types/package.xml b/common/autoware_point_types/package.xml deleted file mode 100644 index e35e6a63de648..0000000000000 --- a/common/autoware_point_types/package.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - autoware_point_types - 0.40.0 - The point types definition to use point_cloud_msg_wrapper - David Wong - Max Schmeller - Apache License 2.0 - - ament_cmake_core - ament_cmake_export_dependencies - ament_cmake_test - autoware_cmake - - ament_cmake_core - ament_cmake_test - - ament_cmake_copyright - ament_cmake_cppcheck - ament_cmake_lint_cmake - ament_cmake_xmllint - pcl_ros - point_cloud_msg_wrapper - - ament_cmake_ros - ament_lint_auto - autoware_lint_common - point_cloud_msg_wrapper - - - ament_cmake - - diff --git a/common/autoware_point_types/test/test_point_types.cpp b/common/autoware_point_types/test/test_point_types.cpp deleted file mode 100644 index 08696a9948f60..0000000000000 --- a/common/autoware_point_types/test/test_point_types.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2021 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. - -#include "autoware/point_types/types.hpp" - -#include - -#include - -TEST(PointEquality, PointXYZI) -{ - using autoware::point_types::PointXYZI; - - PointXYZI pt0{0, 1, 2, 3}; - PointXYZI pt1{0, 1, 2, 3}; - EXPECT_EQ(pt0, pt1); -} - -TEST(PointEquality, PointXYZIRADRT) -{ - using autoware::point_types::PointXYZIRADRT; - - PointXYZIRADRT pt0{0, 1, 2, 3, 4, 5, 6, 7, 8}; - PointXYZIRADRT pt1{0, 1, 2, 3, 4, 5, 6, 7, 8}; - EXPECT_EQ(pt0, pt1); -} - -TEST(PointEquality, PointXYZIRCAEDT) -{ - using autoware::point_types::PointXYZIRCAEDT; - - PointXYZIRCAEDT pt0{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - PointXYZIRCAEDT pt1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - EXPECT_EQ(pt0, pt1); -} - -TEST(PointEquality, FloatEq) -{ - // test template - EXPECT_TRUE(autoware::point_types::float_eq(1, 1)); - EXPECT_TRUE(autoware::point_types::float_eq(1, 1)); - - // test floating point error - EXPECT_TRUE(autoware::point_types::float_eq(1, 1 + std::numeric_limits::epsilon())); - - // test difference of sign - EXPECT_FALSE(autoware::point_types::float_eq(2, -2)); - EXPECT_FALSE(autoware::point_types::float_eq(-2, 2)); - - // small value difference - EXPECT_FALSE(autoware::point_types::float_eq(2, 2 + 10e-6)); - - // expect same value if epsilon is larger than difference - EXPECT_TRUE(autoware::point_types::float_eq(2, 2 + 10e-6, 10e-5)); -} From fd23b61e8c81ef22deacc4ef29970bf1fe460629 Mon Sep 17 00:00:00 2001 From: Taekjin LEE Date: Thu, 9 Jan 2025 09:10:40 +0900 Subject: [PATCH 044/127] fix(image_projection_based_fusion): remove mutex (#9862) refactor: Refactor fusion_node.hpp and fusion_node.cpp for improved code organization and readability Signed-off-by: Taekjin LEE --- .../fusion_node.hpp | 2 -- .../src/fusion_node.cpp | 30 +++++-------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp index b8881bc6abff7..e05339771f667 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/fusion_node.hpp @@ -40,7 +40,6 @@ #include #include -#include #include #include #include @@ -127,7 +126,6 @@ class FusionNode : public rclcpp::Node // cache for fusion int64_t cached_det3d_msg_timestamp_; typename Msg3D::SharedPtr cached_det3d_msg_ptr_; - std::mutex mutex_cached_msgs_; protected: void setDet2DStatus(std::size_t rois_number); diff --git a/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp b/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp index 310c68f12db88..700d249831000 100644 --- a/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/fusion_node.cpp @@ -280,8 +280,6 @@ void FusionNode::subCallback( } } - std::lock_guard lock(mutex_cached_msgs_); - // TIMING: reset timer to the timeout time auto period = std::chrono::duration_cast( std::chrono::duration(timeout_ms_)); @@ -447,28 +445,16 @@ void FusionNode::timer_callback() using std::chrono_literals::operator""ms; timer_->cancel(); - if (mutex_cached_msgs_.try_lock()) { - // PROCESS: if timeout, postprocess cached msg - if (cached_det3d_msg_ptr_ != nullptr) { - stop_watch_ptr_->toc("processing_time", true); - exportProcess(); - } - // reset flags whether the message is fused or not - for (auto & det2d : det2d_list_) { - det2d.is_fused = false; - } + // PROCESS: if timeout, postprocess cached msg + if (cached_det3d_msg_ptr_ != nullptr) { + stop_watch_ptr_->toc("processing_time", true); + exportProcess(); + } - mutex_cached_msgs_.unlock(); - } else { - // TIMING: retry the process after 10ms - try { - std::chrono::nanoseconds period = 10ms; - setPeriod(period.count()); - } catch (rclcpp::exceptions::RCLError & ex) { - RCLCPP_WARN_THROTTLE(get_logger(), *get_clock(), 5000, "%s", ex.what()); - } - timer_->reset(); + // reset flags whether the message is fused or not + for (auto & det2d : det2d_list_) { + det2d.is_fused = false; } } From 51818f00ec4775510386c7757065bba84474a0a1 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:30:05 +0900 Subject: [PATCH 045/127] feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files localization/autoware_twist2accel (#9868) Signed-off-by: vish0012 Co-authored-by: SakodaShintaro --- localization/autoware_twist2accel/package.xml | 2 +- localization/autoware_twist2accel/src/twist2accel.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/localization/autoware_twist2accel/package.xml b/localization/autoware_twist2accel/package.xml index 75cea94546516..013ef54fe52d1 100644 --- a/localization/autoware_twist2accel/package.xml +++ b/localization/autoware_twist2accel/package.xml @@ -17,13 +17,13 @@ ament_cmake_auto autoware_cmake + autoware_internal_debug_msgs autoware_signal_processing geometry_msgs nav_msgs rclcpp rclcpp_components tf2 - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/localization/autoware_twist2accel/src/twist2accel.hpp b/localization/autoware_twist2accel/src/twist2accel.hpp index d338b256fec77..d142328f9d498 100644 --- a/localization/autoware_twist2accel/src/twist2accel.hpp +++ b/localization/autoware_twist2accel/src/twist2accel.hpp @@ -19,11 +19,11 @@ #include +#include #include #include #include #include -#include #include #include From 708fa76bcad2baf1eb17817c8fb79eb87dff3a72 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:42:41 +0900 Subject: [PATCH 046/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20to=20aut?= =?UTF-8?q?oware=5Finternal=5Fdebug=5Fmsgs=20in=20files=20=20perc=E2=80=A6?= =?UTF-8?q?=20(#9879)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs to autoware_internal_debug_msgs in files perception/autoware_multi_object_tracker Signed-off-by: vish0012 --- .../src/debugger/debugger.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/perception/autoware_multi_object_tracker/src/debugger/debugger.cpp b/perception/autoware_multi_object_tracker/src/debugger/debugger.cpp index 3eebb3c11ee3e..3761fc1e6f43a 100644 --- a/perception/autoware_multi_object_tracker/src/debugger/debugger.cpp +++ b/perception/autoware_multi_object_tracker/src/debugger/debugger.cpp @@ -127,7 +127,7 @@ void TrackerDebugger::startMeasurementTime( stamp_process_start_ = now; if (debug_settings_.publish_processing_time) { double input_latency_ms = (now - last_input_stamp_).seconds() * 1e3; - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/input_latency_ms", input_latency_ms); } // initialize debug time stamps @@ -169,15 +169,15 @@ void TrackerDebugger::endPublishTime(const rclcpp::Time & now, const rclcpp::Tim double measurement_to_object_ms = (object_time - last_input_stamp_).seconds() * 1e3; // starting from the measurement time - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms_); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_time_ms", processing_time_ms); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_latency_ms", processing_latency_ms); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/meas_to_tracked_object_ms", measurement_to_object_ms); } stamp_publish_output_ = now; From e60c867c73bc7f89220c83a0e228cee8b9abf4de Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:42:50 +0900 Subject: [PATCH 047/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9875)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_map_based_prediction Signed-off-by: vish0012 --- .../map_based_prediction/map_based_prediction_node.hpp | 2 +- perception/autoware_map_based_prediction/package.xml | 2 +- .../src/map_based_prediction_node.cpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/perception/autoware_map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp b/perception/autoware_map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp index 1675f8b1fbfa2..b047cd28114ba 100644 --- a/perception/autoware_map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp +++ b/perception/autoware_map_based_prediction/include/map_based_prediction/map_based_prediction_node.hpp @@ -71,8 +71,8 @@ struct hash } // namespace std namespace autoware::map_based_prediction { +using autoware_internal_debug_msgs::msg::StringStamped; using autoware_planning_msgs::msg::TrajectoryPoint; -using tier4_debug_msgs::msg::StringStamped; using TrajectoryPoints = std::vector; class MapBasedPredictionNode : public rclcpp::Node diff --git a/perception/autoware_map_based_prediction/package.xml b/perception/autoware_map_based_prediction/package.xml index 9012590a45b14..58dfcb17c7631 100644 --- a/perception/autoware_map_based_prediction/package.xml +++ b/perception/autoware_map_based_prediction/package.xml @@ -16,6 +16,7 @@ ament_cmake autoware_cmake + autoware_internal_debug_msgs autoware_interpolation autoware_lanelet2_extension autoware_motion_utils @@ -27,7 +28,6 @@ tf2 tf2_geometry_msgs tf2_ros - tier4_debug_msgs unique_identifier_msgs visualization_msgs diff --git a/perception/autoware_map_based_prediction/src/map_based_prediction_node.cpp b/perception/autoware_map_based_prediction/src/map_based_prediction_node.cpp index 42dbf5b83fa8c..b65020d6b4708 100644 --- a/perception/autoware_map_based_prediction/src/map_based_prediction_node.cpp +++ b/perception/autoware_map_based_prediction/src/map_based_prediction_node.cpp @@ -670,9 +670,9 @@ void MapBasedPredictionNode::objectsCallback(const TrackedObjects::ConstSharedPt if (stop_watch_ptr_) { const auto processing_time_ms = stop_watch_ptr_->toc("processing_time", true); const auto cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } From 8d38d7fbae8e6860c54c7a435530bfda28df6672 Mon Sep 17 00:00:00 2001 From: Fumiya Watanabe Date: Thu, 9 Jan 2025 14:46:51 +0900 Subject: [PATCH 048/127] chore(autoware_string_stamped_overlay_rviz_plugin): fix version in package.xml (#9874) Signed-off-by: Fumiya Watanabe --- .../autoware_string_stamped_overlay_rviz_plugin/package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml index c22bc75f55290..faef2f674832e 100644 --- a/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml +++ b/visualization/autoware_overlay_rviz_plugin/autoware_string_stamped_overlay_rviz_plugin/package.xml @@ -2,7 +2,7 @@ autoware_string_stamped_rviz_plugin - 0.39.0 + 0.40.0 RViz2 plugin for 2D overlays in the 3D view. Mainly a port of the JSK overlay plugin (https://github.com/jsk-ros-pkg/jsk_visualization). From 7d8b2613988bc0289bdbe824e3032ff23ed37d4b Mon Sep 17 00:00:00 2001 From: SakodaShintaro Date: Thu, 9 Jan 2025 15:01:44 +0900 Subject: [PATCH 049/127] chore(autoware_twist2accel): remove an unused dependency (#9881) Removed an unused dependency Signed-off-by: Shintaro Sakoda --- localization/autoware_twist2accel/package.xml | 1 - localization/autoware_twist2accel/src/twist2accel.hpp | 1 - 2 files changed, 2 deletions(-) diff --git a/localization/autoware_twist2accel/package.xml b/localization/autoware_twist2accel/package.xml index 013ef54fe52d1..092b227c2ad40 100644 --- a/localization/autoware_twist2accel/package.xml +++ b/localization/autoware_twist2accel/package.xml @@ -17,7 +17,6 @@ ament_cmake_auto autoware_cmake - autoware_internal_debug_msgs autoware_signal_processing geometry_msgs nav_msgs diff --git a/localization/autoware_twist2accel/src/twist2accel.hpp b/localization/autoware_twist2accel/src/twist2accel.hpp index d142328f9d498..48bc03a326091 100644 --- a/localization/autoware_twist2accel/src/twist2accel.hpp +++ b/localization/autoware_twist2accel/src/twist2accel.hpp @@ -19,7 +19,6 @@ #include -#include #include #include #include From 7f4ed3dcea5f97bb0395a4b828785e0c08ef3bb0 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:02:36 +0900 Subject: [PATCH 050/127] feat: tier4_debug_msgs to autoware_internal_debug_msgs in files localization/autoware_stop_filter (#9867) Signed-off-by: vish0012 Co-authored-by: SakodaShintaro --- localization/autoware_stop_filter/README.md | 8 ++++---- localization/autoware_stop_filter/package.xml | 2 +- localization/autoware_stop_filter/src/stop_filter.cpp | 5 +++-- localization/autoware_stop_filter/src/stop_filter.hpp | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/localization/autoware_stop_filter/README.md b/localization/autoware_stop_filter/README.md index 9904707a59996..9136f6b6fc8a0 100644 --- a/localization/autoware_stop_filter/README.md +++ b/localization/autoware_stop_filter/README.md @@ -18,10 +18,10 @@ This node aims to: ### Output -| Name | Type | Description | -| ----------------- | ------------------------------------ | -------------------------------------------------------- | -| `output/odom` | `nav_msgs::msg::Odometry` | odometry with suppressed longitudinal and yaw twist | -| `debug/stop_flag` | `tier4_debug_msgs::msg::BoolStamped` | flag to represent whether the vehicle is stopping or not | +| Name | Type | Description | +| ----------------- | ------------------------------------------------ | -------------------------------------------------------- | +| `output/odom` | `nav_msgs::msg::Odometry` | odometry with suppressed longitudinal and yaw twist | +| `debug/stop_flag` | `autoware_internal_debug_msgs::msg::BoolStamped` | flag to represent whether the vehicle is stopping or not | ## Parameters diff --git a/localization/autoware_stop_filter/package.xml b/localization/autoware_stop_filter/package.xml index 1ed5e2c2082be..50ba98484f59d 100644 --- a/localization/autoware_stop_filter/package.xml +++ b/localization/autoware_stop_filter/package.xml @@ -17,12 +17,12 @@ ament_cmake_auto autoware_cmake + autoware_internal_debug_msgs geometry_msgs nav_msgs rclcpp rclcpp_components tf2 - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/localization/autoware_stop_filter/src/stop_filter.cpp b/localization/autoware_stop_filter/src/stop_filter.cpp index 17eaafdc3002a..b0f1bc8eba053 100644 --- a/localization/autoware_stop_filter/src/stop_filter.cpp +++ b/localization/autoware_stop_filter/src/stop_filter.cpp @@ -34,12 +34,13 @@ StopFilter::StopFilter(const rclcpp::NodeOptions & node_options) "input/odom", 1, std::bind(&StopFilter::callback_odometry, this, std::placeholders::_1)); pub_odom_ = create_publisher("output/odom", 1); - pub_stop_flag_ = create_publisher("debug/stop_flag", 1); + pub_stop_flag_ = + create_publisher("debug/stop_flag", 1); } void StopFilter::callback_odometry(const nav_msgs::msg::Odometry::SharedPtr msg) { - tier4_debug_msgs::msg::BoolStamped stop_flag_msg; + autoware_internal_debug_msgs::msg::BoolStamped stop_flag_msg; stop_flag_msg.stamp = msg->header.stamp; stop_flag_msg.data = false; diff --git a/localization/autoware_stop_filter/src/stop_filter.hpp b/localization/autoware_stop_filter/src/stop_filter.hpp index b6d56b5f77059..71864fab0a580 100644 --- a/localization/autoware_stop_filter/src/stop_filter.hpp +++ b/localization/autoware_stop_filter/src/stop_filter.hpp @@ -17,10 +17,10 @@ #include +#include #include #include #include -#include #include #include @@ -43,7 +43,7 @@ class StopFilter : public rclcpp::Node private: rclcpp::Publisher::SharedPtr pub_odom_; //!< @brief odom publisher - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr pub_stop_flag_; //!< @brief stop flag publisher rclcpp::Subscription::SharedPtr sub_odom_; //!< @brief measurement odometry subscriber From ddb64dbe5e3809636470dad7a33d580a628a4fff Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:12:19 +0900 Subject: [PATCH 051/127] feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files localization/autoware_pose2twist (#9866) Signed-off-by: vish0012 --- localization/autoware_pose2twist/README.md | 10 +++++----- localization/autoware_pose2twist/package.xml | 2 +- .../autoware_pose2twist/src/pose2twist_core.cpp | 9 +++++---- .../autoware_pose2twist/src/pose2twist_core.hpp | 6 +++--- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/localization/autoware_pose2twist/README.md b/localization/autoware_pose2twist/README.md index 55ca4667c423d..7f81e0dece5b0 100644 --- a/localization/autoware_pose2twist/README.md +++ b/localization/autoware_pose2twist/README.md @@ -17,11 +17,11 @@ The `twist.angular` is calculated as `relative_rotation_vector / dt` for each fi ### Output -| Name | Type | Description | -| --------- | ------------------------------------- | --------------------------------------------- | -| twist | geometry_msgs::msg::TwistStamped | twist calculated from the input pose history. | -| linear_x | tier4_debug_msgs::msg::Float32Stamped | linear-x field of the output twist. | -| angular_z | tier4_debug_msgs::msg::Float32Stamped | angular-z field of the output twist. | +| Name | Type | Description | +| --------- | ------------------------------------------------- | --------------------------------------------- | +| twist | geometry_msgs::msg::TwistStamped | twist calculated from the input pose history. | +| linear_x | autoware_internal_debug_msgs::msg::Float32Stamped | linear-x field of the output twist. | +| angular_z | autoware_internal_debug_msgs::msg::Float32Stamped | angular-z field of the output twist. | ## Parameters diff --git a/localization/autoware_pose2twist/package.xml b/localization/autoware_pose2twist/package.xml index 3fd16856ef6af..cfde18d430cfd 100644 --- a/localization/autoware_pose2twist/package.xml +++ b/localization/autoware_pose2twist/package.xml @@ -17,11 +17,11 @@ ament_cmake autoware_cmake + autoware_internal_debug_msgs geometry_msgs rclcpp rclcpp_components tf2_geometry_msgs - tier4_debug_msgs ament_lint_auto autoware_lint_common diff --git a/localization/autoware_pose2twist/src/pose2twist_core.cpp b/localization/autoware_pose2twist/src/pose2twist_core.cpp index 4dc7b5fb04209..f071d7c8c66e2 100644 --- a/localization/autoware_pose2twist/src/pose2twist_core.cpp +++ b/localization/autoware_pose2twist/src/pose2twist_core.cpp @@ -29,9 +29,10 @@ Pose2Twist::Pose2Twist(const rclcpp::NodeOptions & options) : rclcpp::Node("pose durable_qos.transient_local(); twist_pub_ = create_publisher("twist", durable_qos); - linear_x_pub_ = create_publisher("linear_x", durable_qos); + linear_x_pub_ = + create_publisher("linear_x", durable_qos); angular_z_pub_ = - create_publisher("angular_z", durable_qos); + create_publisher("angular_z", durable_qos); // Note: this callback publishes topics above pose_sub_ = create_subscription( "pose", queue_size, std::bind(&Pose2Twist::callback_pose, this, _1)); @@ -105,12 +106,12 @@ void Pose2Twist::callback_pose(geometry_msgs::msg::PoseStamped::SharedPtr pose_m twist_msg.header.frame_id = "base_link"; twist_pub_->publish(twist_msg); - tier4_debug_msgs::msg::Float32Stamped linear_x_msg; + autoware_internal_debug_msgs::msg::Float32Stamped linear_x_msg; linear_x_msg.stamp = this->now(); linear_x_msg.data = static_cast(twist_msg.twist.linear.x); linear_x_pub_->publish(linear_x_msg); - tier4_debug_msgs::msg::Float32Stamped angular_z_msg; + autoware_internal_debug_msgs::msg::Float32Stamped angular_z_msg; angular_z_msg.stamp = this->now(); angular_z_msg.data = static_cast(twist_msg.twist.angular.z); angular_z_pub_->publish(angular_z_msg); diff --git a/localization/autoware_pose2twist/src/pose2twist_core.hpp b/localization/autoware_pose2twist/src/pose2twist_core.hpp index ed3e542beb857..22540c9aee473 100644 --- a/localization/autoware_pose2twist/src/pose2twist_core.hpp +++ b/localization/autoware_pose2twist/src/pose2twist_core.hpp @@ -17,9 +17,9 @@ #include +#include #include #include -#include #ifdef ROS_DISTRO_GALACTIC #include @@ -44,8 +44,8 @@ class Pose2Twist : public rclcpp::Node rclcpp::Subscription::SharedPtr pose_sub_; rclcpp::Publisher::SharedPtr twist_pub_; - rclcpp::Publisher::SharedPtr linear_x_pub_; - rclcpp::Publisher::SharedPtr angular_z_pub_; + rclcpp::Publisher::SharedPtr linear_x_pub_; + rclcpp::Publisher::SharedPtr angular_z_pub_; }; } // namespace autoware::pose2twist From 4215995c02c917edf4e5995ea6ec81df66dcc5a3 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 9 Jan 2025 15:22:06 +0900 Subject: [PATCH 052/127] feat(static_centerline_generator)!: remove the package (#9855) feat(static_centerline_generator): remove the package Signed-off-by: Takayuki Murooka --- .../CHANGELOG.rst | 287 ------- .../CMakeLists.txt | 66 -- .../README.md | 83 -- .../config/common.param.yaml | 17 - .../config/nearest_search.param.yaml | 5 - .../static_centerline_generator.param.yaml | 9 - .../config/vehicle_info.param.yaml | 12 - .../launch/run_planning_server.launch.xml | 12 - .../static_centerline_generator.launch.xml | 91 -- .../media/rviz.png | Bin 183524 -> 0 bytes .../media/unsafe_footprints.png | Bin 229195 -> 0 bytes .../msg/PointsWithLaneId.msg | 2 - .../package.xml | 57 -- .../rviz/static_centerline_generator.rviz | 459 ----------- .../scripts/app.py | 178 ---- .../scripts/centerline_updater_helper.py | 207 ----- .../scripts/show_lanelet2_map_diff.py | 139 ---- .../bag_ego_trajectory_based_centerline.sh | 5 - ...ptimization_trajectory_based_centerline.sh | 3 - .../bag_ego_trajectory_based_centerline.cpp | 86 -- .../bag_ego_trajectory_based_centerline.hpp | 27 - ...timization_trajectory_based_centerline.cpp | 187 ----- ...timization_trajectory_based_centerline.hpp | 43 - .../src/main.cpp | 59 -- .../src/static_centerline_generator_node.cpp | 774 ------------------ .../src/static_centerline_generator_node.hpp | 187 ----- .../src/type_alias.hpp | 47 -- .../src/utils.cpp | 263 ------ .../src/utils.hpp | 67 -- .../srv/LoadMap.srv | 3 - .../srv/PlanPath.srv | 6 - .../srv/PlanRoute.srv | 5 - .../bag_ego_trajectory_turn-left-right.db3 | Bin 2740224 -> 0 bytes .../data/bag_ego_trajectory_turn-right.db3 | Bin 2654208 -> 0 bytes .../test/data/lanelet2_map.osm | 146 ---- .../test_static_centerline_generator.test.py | 112 --- 36 files changed, 3644 deletions(-) delete mode 100644 planning/autoware_static_centerline_generator/CHANGELOG.rst delete mode 100644 planning/autoware_static_centerline_generator/CMakeLists.txt delete mode 100644 planning/autoware_static_centerline_generator/README.md delete mode 100644 planning/autoware_static_centerline_generator/config/common.param.yaml delete mode 100644 planning/autoware_static_centerline_generator/config/nearest_search.param.yaml delete mode 100644 planning/autoware_static_centerline_generator/config/static_centerline_generator.param.yaml delete mode 100644 planning/autoware_static_centerline_generator/config/vehicle_info.param.yaml delete mode 100644 planning/autoware_static_centerline_generator/launch/run_planning_server.launch.xml delete mode 100644 planning/autoware_static_centerline_generator/launch/static_centerline_generator.launch.xml delete mode 100644 planning/autoware_static_centerline_generator/media/rviz.png delete mode 100644 planning/autoware_static_centerline_generator/media/unsafe_footprints.png delete mode 100644 planning/autoware_static_centerline_generator/msg/PointsWithLaneId.msg delete mode 100644 planning/autoware_static_centerline_generator/package.xml delete mode 100644 planning/autoware_static_centerline_generator/rviz/static_centerline_generator.rviz delete mode 100755 planning/autoware_static_centerline_generator/scripts/app.py delete mode 100755 planning/autoware_static_centerline_generator/scripts/centerline_updater_helper.py delete mode 100755 planning/autoware_static_centerline_generator/scripts/show_lanelet2_map_diff.py delete mode 100755 planning/autoware_static_centerline_generator/scripts/tmp/bag_ego_trajectory_based_centerline.sh delete mode 100755 planning/autoware_static_centerline_generator/scripts/tmp/optimization_trajectory_based_centerline.sh delete mode 100644 planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.cpp delete mode 100644 planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.hpp delete mode 100644 planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.cpp delete mode 100644 planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.hpp delete mode 100644 planning/autoware_static_centerline_generator/src/main.cpp delete mode 100644 planning/autoware_static_centerline_generator/src/static_centerline_generator_node.cpp delete mode 100644 planning/autoware_static_centerline_generator/src/static_centerline_generator_node.hpp delete mode 100644 planning/autoware_static_centerline_generator/src/type_alias.hpp delete mode 100644 planning/autoware_static_centerline_generator/src/utils.cpp delete mode 100644 planning/autoware_static_centerline_generator/src/utils.hpp delete mode 100644 planning/autoware_static_centerline_generator/srv/LoadMap.srv delete mode 100644 planning/autoware_static_centerline_generator/srv/PlanPath.srv delete mode 100644 planning/autoware_static_centerline_generator/srv/PlanRoute.srv delete mode 100644 planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-left-right.db3 delete mode 100644 planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-right.db3 delete mode 100644 planning/autoware_static_centerline_generator/test/data/lanelet2_map.osm delete mode 100644 planning/autoware_static_centerline_generator/test/test_static_centerline_generator.test.py diff --git a/planning/autoware_static_centerline_generator/CHANGELOG.rst b/planning/autoware_static_centerline_generator/CHANGELOG.rst deleted file mode 100644 index 0338cdc8b66bb..0000000000000 --- a/planning/autoware_static_centerline_generator/CHANGELOG.rst +++ /dev/null @@ -1,287 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_static_centerline_generator -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Merge branch 'main' into release-0.40.0 -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix(static_centerline_generator): several bug fixes (`#9426 `_) - * fix: dependent packages - * feat: use steer angle, use warn for steer angle failure, calc curvature dicontinuously - * fix cppcheck - --------- -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* fix(cpplint): include what you use - planning (`#9570 `_) -* refactor(global_parameter_loader): prefix package and namespace with autoware (`#9303 `_) -* feat!: replace tier4_map_msgs with autoware_map_msgs for MapProjectorInfo (`#9392 `_) -* refactor(map_loader)!: prefix package and namespace with autoware (`#8927 `_) - * make lanelet2_map_visualization independent - * remove unused files - * remove unused package - * fix package name - * add autoware\_ prefix - * add autoware to exec name - * add autoware prefix - * removed unnecessary dependency - --------- -* 0.39.0 -* update changelog -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix(static_centerline_generator): map_tf_generator package name needs update (`#9383 `_) - fix map_tf_generator name in autoware_static_centerline_generator.launch -* refactor(map_loader)!: prefix package and namespace with autoware (`#8927 `_) - * make lanelet2_map_visualization independent - * remove unused files - * remove unused package - * fix package name - * add autoware\_ prefix - * add autoware to exec name - * add autoware prefix - * removed unnecessary dependency - --------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Fumiya Watanabe, M. Fatih Cırıt, Masaki Baba, Ryohsuke Mitsudome, Takayuki Murooka, Yutaka Kondo, Zhanhong Yan - -0.39.0 (2024-11-25) -------------------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* refactor(osqp_interface): added autoware prefix to osqp_interface (`#8958 `_) -* refactor(autoware_interpolation): prefix package and namespace with autoware (`#8088 `_) - Co-authored-by: kosuke55 -* fix(other_planning_packages): align the parameters with launcher (`#8793 `_) - * parameters in planning/others aligned - * update json - --------- -* refactor(map_projection_loader)!: prefix package and namespace with autoware (`#8420 `_) - * add autoware\_ prefix - * add autoware\_ prefix - --------- - Co-authored-by: SakodaShintaro -* fix(autoware_static_centerline_generator): fix unusedFunction (`#8647 `_) - * fix:unusedFunction - * fix:unusedFunction - * fix:compile error - --------- -* refactor(geography_utils): prefix package and namespace with autoware (`#7790 `_) - * refactor(geography_utils): prefix package and namespace with autoware - * move headers to include/autoware/ - --------- -* fix(autoware_static_centerline_generator): fix funcArgNamesDifferent (`#8019 `_) - fix:funcArgNamesDifferent -* fix(static_centerline_generator): save_map only once (`#7770 `_) -* refactor(static_centerline_optimizer): clean up the code (`#7756 `_) -* feat: add `autoware\_` prefix to `lanelet2_extension` (`#7640 `_) -* feat(static_centerline_generator): organize AUTO/GUI/VMB modes (`#7432 `_) -* refactor(universe_utils/motion_utils)!: add autoware namespace (`#7594 `_) -* refactor(motion_utils)!: add autoware prefix and include dir (`#7539 `_) - refactor(motion_utils): add autoware prefix and include dir -* feat(autoware_universe_utils)!: rename from tier4_autoware_utils (`#7538 `_) - Co-authored-by: kosuke55 -* refactor(route_handler)!: rename to include/autoware/{package_name} (`#7530 `_) - refactor(route_handler)!: rename to include/autoware/{package_name} -* feat(map_loader): add waypoints flag (`#7480 `_) - * feat(map_loader): handle centelrine and waypoints - * update README - * fix doc - * update schema - * fix - * fix - --------- -* feat(path_optimizer): rename to include/autoware/{package_name} (`#7529 `_) -* feat(path_smoother): rename to include/autoware/{package_name} (`#7527 `_) - * feat(path_smoother): rename to include/autoware/{package_name} - * fix - --------- -* refactor(behaivor_path_planner)!: rename to include/autoware/{package_name} (`#7522 `_) - * refactor(behavior_path_planner)!: make autoware dir in include - * refactor(start_planner): make autoware include dir - * refactor(goal_planner): make autoware include dir - * sampling planner module - * fix sampling planner build - * dynamic_avoidance - * lc - * side shift - * autoware_behavior_path_static_obstacle_avoidance_module - * autoware_behavior_path_planner_common - * make behavior_path dir - * pre-commit - * fix pre-commit - * fix build - --------- -* feat(mission_planner): rename to include/autoware/{package_name} (`#7513 `_) - * feat(mission_planner): rename to include/autoware/{package_name} - * feat(mission_planner): rename to include/autoware/{package_name} - * feat(mission_planner): rename to include/autoware/{package_name} - --------- -* fix(static_centerline_generator): fix dependency (`#7442 `_) - * fix: deps - * fix: package name - * fix: package name - --------- -* refactor(route_handler): route handler add autoware prefix (`#7341 `_) - * rename route handler package - * update packages dependencies - * update include guards - * update includes - * put in autoware namespace - * fix formats - * keep header and source file name as before - --------- -* refactor(mission_planner)!: add autoware prefix and namespace (`#7414 `_) - * refactor(mission_planner)!: add autoware prefix and namespace - * fix svg - --------- -* refactor(vehicle_info_utils)!: prefix package and namespace with autoware (`#7353 `_) - * chore(autoware_vehicle_info_utils): rename header - * chore(bpp-common): vehicle info - * chore(path_optimizer): vehicle info - * chore(velocity_smoother): vehicle info - * chore(bvp-common): vehicle info - * chore(static_centerline_generator): vehicle info - * chore(obstacle_cruise_planner): vehicle info - * chore(obstacle_velocity_limiter): vehicle info - * chore(mission_planner): vehicle info - * chore(obstacle_stop_planner): vehicle info - * chore(planning_validator): vehicle info - * chore(surround_obstacle_checker): vehicle info - * chore(goal_planner): vehicle info - * chore(start_planner): vehicle info - * chore(control_performance_analysis): vehicle info - * chore(lane_departure_checker): vehicle info - * chore(predicted_path_checker): vehicle info - * chore(vehicle_cmd_gate): vehicle info - * chore(obstacle_collision_checker): vehicle info - * chore(operation_mode_transition_manager): vehicle info - * chore(mpc): vehicle info - * chore(control): vehicle info - * chore(common): vehicle info - * chore(perception): vehicle info - * chore(evaluator): vehicle info - * chore(freespace): vehicle info - * chore(planning): vehicle info - * chore(vehicle): vehicle info - * chore(simulator): vehicle info - * chore(launch): vehicle info - * chore(system): vehicle info - * chore(sensing): vehicle info - * fix(autoware_joy_controller): remove unused deps - --------- -* refactor(path_smoother)!: prefix package and namespace with autoware (`#7381 `_) - * git mv - * fix - * fix launch - * rever a part of prefix - * fix test - * fix - * fix static_centerline_optimizer - * fix - --------- -* refactor(path_optimizer, velocity_smoother)!: prefix package and namespace with autoware (`#7354 `_) - * chore(autoware_velocity_smoother): update namespace - * chore(autoware_path_optimizer): update namespace - --------- -* chore(bpp): add prefix `autoware\_` (`#7288 `_) - * chore(common): rename package - * fix(static_obstacle_avoidance): fix header - * fix(dynamic_obstacle_avoidance): fix header - * fix(side_shift): fix header - * fix(sampling_planner): fix header - * fix(start_planner): fix header - * fix(goal_planner): fix header - * fix(lane_change): fix header - * fix(external_lane_change): fix header - * fix(AbLC): fix header - * fix(bpp-node): fix header - * fix(static_centerline_generator): fix header - * fix(.pages): update link - --------- -* feat!: replace autoware_auto_msgs with autoware_msgs for planning modules (`#7246 `_) - Co-authored-by: Cynthia Liu - Co-authored-by: NorahXiong - Co-authored-by: beginningfan -* chore(autoware_velocity_smoother, autoware_path_optimizer): rename packages (`#7202 `_) - * chore(autoware_path_optimizer): rename package and namespace - * chore(autoware_static_centerline_generator): rename package and namespace - * chore: update module name - * chore(autoware_velocity_smoother): rename package and namespace - * chore(tier4_planning_launch): update module name - * chore: update module name - * fix: test - * fix: test - * fix: test - --------- -* refactor(behavior_velocity_planner)!: prefix package and namespace with autoware\_ (`#6693 `_) -* fix(autoware_static_centerline_generator): update the centerline correctly with map projector (`#6825 `_) - * fix(static_centerline_generator): fixed the bug of offset lat/lon values - * fix typo - --------- -* fix(autoware_static_centerline_generator): remove prefix from topics and node names (`#7028 `_) -* build(static_centerline_generator): prefix package and namespace with autoware\_ (`#6817 `_) - * build(static_centerline_generator): prefix package and namespace with autoware\_ - * style(pre-commit): autofix - * build: fix CMake target - * build(autoware_static_centerline_generator): more renames - * style(pre-commit): autofix - * build(autoware_static_centerline_generator): fix namespace - * fix(autoware_static_centerline_generator): fix clang-tidy issues - * style(pre-commit): autofix - * style(pre-commit): autofix - * fix(autoware_static_centerline_generator): fix clang-tidy issues - * fix(autoware_static_centerline_generator): fix build issues - * fix(autoware_static_centerline_generator): fix build issues - * style(pre-commit): autofix - * fix(autoware_static_centerline_optimizer): fix clang-tidy issues - * style(pre-commit): autofix - * build: fix build errors - * fix: remove else statements after return - * fix(autoware_static_centerline_generator): fix clang-tidy issues - * style(pre-commit): autofix - * revert changes for static_centerline_generator - * fix(autoware_static_centerline_generator): add autoware\_ prefix - * style(pre-commit): autofix - * fix(autoware_static_centerline_generator): fix filenames - * fix(autoware_static_centerline_generator): fix namespaces - * style(pre-commit): autofix - * fix: added prefix to missing strings - * refactor(autoware_static_centerline_generator): move header files to src - * refactor(autoware_static_centerline_generator): fix include paths - * style(pre-commit): autofix - * refactor(autoware_static_centerline_generator): rename base folder - * Update planning/autoware_static_centerline_generator/launch/static_centerline_generator.launch.xml - Co-authored-by: M. Fatih Cırıt - * build(autoware_static_centerline_generator): fix include in CMake - * build(autoware_static_centerline_generator): fix missing includes - --------- - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> - Co-authored-by: M. Fatih Cırıt -* Contributors: Esteve Fernandez, Kosuke Takeuchi, Masaki Baba, Ryohsuke Mitsudome, Satoshi OTA, Takayuki Murooka, Yutaka Kondo, Zhe Shen, kobayu858, mkquda - -0.26.0 (2024-04-03) -------------------- diff --git a/planning/autoware_static_centerline_generator/CMakeLists.txt b/planning/autoware_static_centerline_generator/CMakeLists.txt deleted file mode 100644 index 261e8beb0022f..0000000000000 --- a/planning/autoware_static_centerline_generator/CMakeLists.txt +++ /dev/null @@ -1,66 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_static_centerline_generator) - -find_package(autoware_cmake REQUIRED) - -find_package(builtin_interfaces REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(rosidl_default_generators REQUIRED) -find_package(std_msgs REQUIRED) - -rosidl_generate_interfaces( - autoware_static_centerline_generator - "srv/LoadMap.srv" - "srv/PlanRoute.srv" - "srv/PlanPath.srv" - "msg/PointsWithLaneId.msg" - DEPENDENCIES builtin_interfaces geometry_msgs -) - -autoware_package() - -ament_auto_add_executable(main - src/main.cpp - src/static_centerline_generator_node.cpp - src/centerline_source/optimization_trajectory_based_centerline.cpp - src/centerline_source/bag_ego_trajectory_based_centerline.cpp - src/utils.cpp -) - -if(${rosidl_cmake_VERSION} VERSION_LESS 2.5.0) - rosidl_target_interfaces(main - autoware_static_centerline_generator "rosidl_typesupport_cpp") -else() - rosidl_get_typesupport_target( - cpp_typesupport_target autoware_static_centerline_generator "rosidl_typesupport_cpp") - target_link_libraries(main "${cpp_typesupport_target}") -endif() - -ament_auto_package( - INSTALL_TO_SHARE - launch - config - rviz -) - -target_include_directories(main PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src -) - -if(BUILD_TESTING) - add_launch_test( - test/test_static_centerline_generator.test.py - TIMEOUT "30" - ) - install(DIRECTORY - test/data/ - DESTINATION share/${PROJECT_NAME}/test/data/ - ) -endif() - -install(PROGRAMS - scripts/app.py - scripts/centerline_updater_helper.py - scripts/show_lanelet2_map_diff.py - DESTINATION lib/${PROJECT_NAME} -) diff --git a/planning/autoware_static_centerline_generator/README.md b/planning/autoware_static_centerline_generator/README.md deleted file mode 100644 index 426d5487cf0cb..0000000000000 --- a/planning/autoware_static_centerline_generator/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# Static Centerline Generator - -## Purpose - -This package statically calculates the centerline satisfying path footprints inside the drivable area. - -On narrow-road driving, the default centerline, which is the middle line between lanelets' right and left boundaries, often causes path footprints outside the drivable area. -To make path footprints inside the drivable area, we use online path shape optimization by [the autoware_path_optimizer package](https://github.com/autowarefoundation/autoware.universe/tree/main/planning/autoware_path_optimizer/). - -Instead of online path shape optimization, we introduce static centerline optimization. -With this static centerline optimization, we have following advantages. - -- We can see the optimized centerline shape in advance. - - With the default autoware, path shape is not determined until the vehicle drives there. - - This enables offline path shape evaluation. -- We do not have to calculate a heavy and sometimes unstable path optimization since the path footprints are already inside the drivable area. - -## Use cases - -There are two interfaces to communicate with the centerline optimizer. - -### Vector Map Builder Interface - -Note: This function of Vector Map Builder has not been released. Please wait for a while. -Currently there is no documentation about Vector Map Builder's operation for this function. - -The optimized centerline can be generated from Vector Map Builder's operation. - -We can run - -- path planning server -- http server to connect path planning server and Vector Map Builder - -with the following command by designating `` - -```sh -ros2 launch autoware_static_centerline_generator run_planning_server.launch.xml vehicle_model:= -``` - -FYI, port ID of the http server is 4010 by default. - -### Command Line Interface - -The optimized centerline can be generated from the command line interface by designating - -- `` -- `` (not mandatory) -- `` -- `` -- `` - -```sh -ros2 launch autoware_static_centerline_generator static_centerline_generator.launch.xml run_backgrond:=false lanelet2_input_file_path:= lanelet2_output_file_path:= start_lanelet_id:= end_lanelet_id:= vehicle_model:= -``` - -The default output map path containing the optimized centerline locates `/tmp/lanelet2_map.osm`. -If you want to change the output map path, you can remap the path by designating ``. - -## Visualization - -When launching the path planning server, rviz is launched as well as follows. -![rviz](./media/rviz.png) - -- The yellow footprints are the original ones from the osm map file. - - FYI: Footprints are generated based on the centerline and vehicle size. -- The red footprints are the optimized ones. -- The gray area is the drivable area. -- You can see that the red footprints are inside the drivable area although the yellow ones are outside. - -### Unsafe footprints - -Sometimes the optimized centerline footprints are close to the lanes' boundaries. -We can check how close they are with `unsafe footprints` marker as follows. - -Footprints' color depends on its distance to the boundaries, and text expresses its distance. - -![rviz](./media/unsafe_footprints.png) - -By default, footprints' color is - -- when the distance is less than 0.1 [m] : red -- when the distance is less than 0.2 [m] : green -- when the distance is less than 0.3 [m] : blue diff --git a/planning/autoware_static_centerline_generator/config/common.param.yaml b/planning/autoware_static_centerline_generator/config/common.param.yaml deleted file mode 100644 index 6c547c8cd83dc..0000000000000 --- a/planning/autoware_static_centerline_generator/config/common.param.yaml +++ /dev/null @@ -1,17 +0,0 @@ -/**: - ros__parameters: - # constraints param for normal driving - max_vel: 11.1 # max velocity limit [m/s] - - normal: - min_acc: -1.0 # min deceleration [m/ss] - max_acc: 1.0 # max acceleration [m/ss] - min_jerk: -1.0 # min jerk [m/sss] - max_jerk: 1.0 # max jerk [m/sss] - - # constraints to be observed - limit: - min_acc: -2.5 # min deceleration limit [m/ss] - max_acc: 1.0 # max acceleration limit [m/ss] - min_jerk: -1.5 # min jerk limit [m/sss] - max_jerk: 1.5 # max jerk limit [m/sss] diff --git a/planning/autoware_static_centerline_generator/config/nearest_search.param.yaml b/planning/autoware_static_centerline_generator/config/nearest_search.param.yaml deleted file mode 100644 index eb6709764ce3e..0000000000000 --- a/planning/autoware_static_centerline_generator/config/nearest_search.param.yaml +++ /dev/null @@ -1,5 +0,0 @@ -/**: - ros__parameters: - # ego - ego_nearest_dist_threshold: 3.0 # [m] - ego_nearest_yaw_threshold: 1.046 # [rad] = 60 [deg] diff --git a/planning/autoware_static_centerline_generator/config/static_centerline_generator.param.yaml b/planning/autoware_static_centerline_generator/config/static_centerline_generator.param.yaml deleted file mode 100644 index 060590803428a..0000000000000 --- a/planning/autoware_static_centerline_generator/config/static_centerline_generator.param.yaml +++ /dev/null @@ -1,9 +0,0 @@ -/**: - ros__parameters: - marker_color: ["FF0000", "FF5A00", "FFFF00"] - marker_color_dist_thresh : [0.1, 0.2, 0.3] - output_trajectory_interval: 1.0 - - validation: - dist_threshold_to_road_border: 0.0 - max_steer_angle_margin: 0.0 # [rad] NOTE: Positive value makes max steer angle threshold to decrease. diff --git a/planning/autoware_static_centerline_generator/config/vehicle_info.param.yaml b/planning/autoware_static_centerline_generator/config/vehicle_info.param.yaml deleted file mode 100644 index 8941b92b4e78e..0000000000000 --- a/planning/autoware_static_centerline_generator/config/vehicle_info.param.yaml +++ /dev/null @@ -1,12 +0,0 @@ -/**: - ros__parameters: - wheel_radius: 0.39 - wheel_width: 0.42 - wheel_base: 2.74 # between front wheel center and rear wheel center - wheel_tread: 1.63 # between left wheel center and right wheel center - front_overhang: 1.0 # between front wheel center and vehicle front - rear_overhang: 1.03 # between rear wheel center and vehicle rear - left_overhang: 0.1 # between left wheel center and vehicle left - right_overhang: 0.1 # between right wheel center and vehicle right - vehicle_height: 2.5 - max_steer_angle: 0.70 # [rad] diff --git a/planning/autoware_static_centerline_generator/launch/run_planning_server.launch.xml b/planning/autoware_static_centerline_generator/launch/run_planning_server.launch.xml deleted file mode 100644 index cb368ca336316..0000000000000 --- a/planning/autoware_static_centerline_generator/launch/run_planning_server.launch.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/planning/autoware_static_centerline_generator/launch/static_centerline_generator.launch.xml b/planning/autoware_static_centerline_generator/launch/static_centerline_generator.launch.xml deleted file mode 100644 index 0590009ab378c..0000000000000 --- a/planning/autoware_static_centerline_generator/launch/static_centerline_generator.launch.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/planning/autoware_static_centerline_generator/media/rviz.png b/planning/autoware_static_centerline_generator/media/rviz.png deleted file mode 100644 index e76ede78294f02c154a02ccbc133491531cb886c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183524 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�(<&aFy2=?v>ZFd-9-jg34A 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∈ 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%0Dj>~* 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 R(BG{zDj-b-nB2SI{{j0*mc;-7 diff --git a/planning/autoware_static_centerline_generator/media/unsafe_footprints.png b/planning/autoware_static_centerline_generator/media/unsafe_footprints.png deleted file mode 100644 index b4404f4cfa89bc7ce9efc9adfac4fbc2f6b35d14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229195 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

nxLmzzFaB_ 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%0D2(I0#L-j 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%0AeAqLweGhBhjWuKV1wQd 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�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 diff --git a/planning/autoware_static_centerline_generator/msg/PointsWithLaneId.msg b/planning/autoware_static_centerline_generator/msg/PointsWithLaneId.msg deleted file mode 100644 index 97cd0355df831..0000000000000 --- a/planning/autoware_static_centerline_generator/msg/PointsWithLaneId.msg +++ /dev/null @@ -1,2 +0,0 @@ -int64 lane_id -geometry_msgs/Point[] points diff --git a/planning/autoware_static_centerline_generator/package.xml b/planning/autoware_static_centerline_generator/package.xml deleted file mode 100644 index cea18e5605921..0000000000000 --- a/planning/autoware_static_centerline_generator/package.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - autoware_static_centerline_generator - 0.40.0 - The autoware_static_centerline_generator package - Takayuki Murooka - Kosuke Takeuchi - Apache License 2.0 - - Takayuki Murooka - - ament_cmake_auto - autoware_cmake - - rosidl_default_generators - - autoware_behavior_path_planner_common - autoware_geography_utils - autoware_global_parameter_loader - autoware_interpolation - autoware_lanelet2_extension - autoware_lanelet2_map_visualizer - autoware_map_loader - autoware_map_msgs - autoware_map_projection_loader - autoware_map_tf_generator - autoware_mission_planner - autoware_motion_utils - autoware_osqp_interface - autoware_path_optimizer - autoware_path_smoother - autoware_perception_msgs - autoware_planning_msgs - autoware_route_handler - autoware_universe_utils - autoware_vehicle_info_utils - geometry_msgs - rclcpp - rclcpp_components - - python3-flask-cors - rosidl_default_runtime - - ament_cmake_gmock - ament_lint_auto - autoware_behavior_path_planner - autoware_behavior_velocity_planner - autoware_lint_common - ros_testing - - rosidl_interface_packages - - - ament_cmake - - diff --git a/planning/autoware_static_centerline_generator/rviz/static_centerline_generator.rviz b/planning/autoware_static_centerline_generator/rviz/static_centerline_generator.rviz deleted file mode 100644 index f1bd110783009..0000000000000 --- a/planning/autoware_static_centerline_generator/rviz/static_centerline_generator.rviz +++ /dev/null @@ -1,459 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 0 - Name: Displays - Property Tree Widget: - Expanded: ~ - Splitter Ratio: 0.550000011920929 - Tree Height: 386 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: - - /2D Dummy Car1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz_common/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" - - Class: rviz_plugins::AutowareStatePanel - Name: AutowareStatePanel -Visualization Manager: - Class: "" - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/TF - Enabled: false - Frame Timeout: 15 - Frames: - All Enabled: true - Marker Scale: 1 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: true - Tree: - {} - Update Interval: 0 - Value: false - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: false - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: false - Enabled: false - Name: System - - Class: rviz_common/Group - Displays: - - Alpha: 0.20000000298023224 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 28.71826171875 - Min Value: -7.4224700927734375 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 255; 255; 255 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 237 - Min Color: 211; 215; 207 - Min Intensity: 0 - Name: PointCloudMap - Position Transformer: XYZ - Selectable: false - Size (Pixels): 1 - Size (m): 0.019999999552965164 - Style: Points - Topic: - Depth: 5 - Durability Policy: Transient Local - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map/pointcloud_map - Use Fixed Frame: true - Use rainbow: false - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Lanelet2VectorMap - Namespaces: - center_lane_line: true - center_line_arrows: true - lane_start_bound: false - lanelet_id: false - left_lane_bound: true - right_lane_bound: true - road_lanelets: false - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map/vector_map_marker - Value: true - Enabled: true - Name: Map - - Class: rviz_plugins/PathWithLaneId - Color Border Vel Max: 3 - Enabled: false - Name: Raw Centerline - Topic: - Depth: 5 - Durability Policy: Transient Local - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/input_centerline - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: true - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View LaneId: - Scale: 0.10000000149011612 - Value: false - View Path: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Value: false - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Trajectory - Color Border Vel Max: 3 - Enabled: true - Name: Optimized Centerline - Topic: - Depth: 5 - Durability Policy: Transient Local - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/output/centerline - Value: true - View Footprint: - Alpha: 0.5 - Color: 0; 255; 0 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: true - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Value: false - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_common/Group - Displays: - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: Raw Centerline (Path type) - Topic: - Depth: 5 - Durability Policy: Transient Local - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/debug/raw_centerline - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: true - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: MarkerArray - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/output/validation_results - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Debug Markers - Namespaces: - curvature: false - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/debug/markers - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: MarkerArray - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /static_centerline_generator/debug/ego_footprint_bounds - Value: true - Enabled: true - Name: debug - Enabled: true - Global Options: - Background Color: 10; 10; 10 - Fixed Frame: map - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/mission_planning/goal - - Acceleration: 0 - Class: rviz_plugins/PedestrianInitialPoseTool - Interactive: false - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 0 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 1 - Z std deviation: 0.029999999329447746 - - Acceleration: 0 - Class: rviz_plugins/CarInitialPoseTool - H vehicle height: 2 - Interactive: false - L vehicle length: 4 - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 8 - W vehicle width: 1.7999999523162842 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 0 - Z std deviation: 0.029999999329447746 - - Acceleration: 0 - Class: rviz_plugins/BusInitialPoseTool - H vehicle height: 3.5 - Interactive: false - L vehicle length: 10.5 - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 0 - W vehicle width: 2.5 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 0 - Z std deviation: 0.029999999329447746 - - Class: rviz_plugins/MissionCheckpointTool - Pose Topic: /planning/mission_planning/checkpoint - Theta std deviation: 0.2617993950843811 - X std deviation: 0.5 - Y std deviation: 0.5 - Z position: 0 - - Class: rviz_plugins/DeleteAllObjectsTool - Pose Topic: /simulation/dummy_perception_publisher/object_info - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Angle: 0 - Class: rviz_default_plugins/TopDownOrtho - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Scale: 10 - Target Frame: viewer - Value: TopDownOrtho (rviz_default_plugins) - X: 0 - Y: 0 - Saved: - - Class: rviz_default_plugins/ThirdPersonFollower - Distance: 18 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0 - Y: 0 - Z: 0 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: ThirdPersonFollower - Near Clip Distance: 0.009999999776482582 - Pitch: 0.20000000298023224 - Target Frame: base_link - Value: ThirdPersonFollower (rviz) - Yaw: 3.141592025756836 - - Angle: 0 - Class: rviz_default_plugins/TopDownOrtho - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Invert Z Axis: false - Name: TopDownOrtho - Near Clip Distance: 0.009999999776482582 - Scale: 10 - Target Frame: viewer - Value: TopDownOrtho (rviz) - X: 0 - Y: 0 -Window Geometry: - AutowareStatePanel: - collapsed: false - Displays: - collapsed: false - Height: 1043 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd00000004000000000000019200000357fc020000000efb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003e000001c0000000ca00fffffffc0000020400000191000000c40100001dfa000000000100000002fb0000000a0056006900650077007301000000000000033c0000010000fffffffb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000000ffffffff0000008a00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d0065007200610100000682000000eb0000000000000000fb0000000a0049006d0061006700650100000505000002680000000000000000fb0000002c0049006e0069007400690061006c0050006f007300650042007500740074006f006e00500061006e0065006c000000068f000000de0000007a00fffffffb0000002c0049006e0069007400690061006c0050006f007300650042007500740074006f006e00500061006e0065006c000000068f000000de0000000000000000fb00000030005200650063006f0067006e006900740069006f006e0052006500730075006c0074004f006e0049006d00610067006500000001d3000000af0000000000000000fb00000024004100750074006f00770061007200650053007400610074006500500061006e0065006c000000029b000000fb0000017c00ffffff000000010000015f000006fffc0200000002fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000e7a0000005afc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000005afc0100000002fb0000000800540069006d00650100000000000007800000027100fffffffb0000000800540069006d00650100000000000004500000000000000000000005e80000035700000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1920 - X: 0 - Y: 0 diff --git a/planning/autoware_static_centerline_generator/scripts/app.py b/planning/autoware_static_centerline_generator/scripts/app.py deleted file mode 100755 index 08bff8b80dcb7..0000000000000 --- a/planning/autoware_static_centerline_generator/scripts/app.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2022 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. - -import json -import uuid - -from autoware_static_centerline_generator.srv import LoadMap -from autoware_static_centerline_generator.srv import PlanPath -from autoware_static_centerline_generator.srv import PlanRoute -from flask import Flask -from flask import jsonify -from flask import request -from flask_cors import CORS -import rclpy -from rclpy.node import Node - -rclpy.init() -node = Node("static_centerline_generator_http_server") - -app = Flask(__name__) -CORS(app) - - -def create_client(service_type, server_name): - # create client - cli = node.create_client(service_type, server_name) - while not cli.wait_for_service(timeout_sec=1.0): - print("{} service not available, waiting again...".format(server_name)) - return cli - - -@app.route("/map", methods=["POST"]) -def get_map(): - data = request.get_json() - - map_uuid = str(uuid.uuid4()) - global map_id - map_id = map_uuid - - # create client - cli = create_client(LoadMap, "/planning/static_centerline_generator/load_map") - - # request map loading - req = LoadMap.Request(map=data["map"]) - future = cli.call_async(req) - - # get result - rclpy.spin_until_future_complete(node, future) - res = future.result() - - # error handling - if res.message == "InvalidMapFormat": - return jsonify(code=res.message, message="Map format is invalid."), 400 - elif res.message != "": - return ( - jsonify( - code="InternalServerError", - message="Error occurred on the server. Please check the terminal.", - ), - 500, - ) - - return map_uuid - - -@app.route("/planned_route", methods=["GET"]) -def post_planned_route(): - args = request.args.to_dict() - global map_id - if map_id != args.get("map_id"): - # TODO(murooka) error handling for map_id mismatch - print("map_id is not correct.") - - # create client - cli = create_client(PlanRoute, "/planning/static_centerline_generator/plan_route") - - # request route planning - req = PlanRoute.Request( - start_lane_id=int(args.get("start_lane_id")), end_lane_id=int(args.get("end_lane_id")) - ) - future = cli.call_async(req) - - # get result - rclpy.spin_until_future_complete(node, future) - res = future.result() - - # error handling - if res.message == "MapNotFound": - return jsonify(code=res.message, message="Map is missing."), 404 - elif res.message == "RouteNotFound": - return jsonify(code=res.message, message="Planning route failed."), 404 - elif res.message != "": - return ( - jsonify( - code="InternalServerError", - message="Error occurred on the server. Please check the terminal.", - ), - 500, - ) - - return json.dumps(tuple(res.lane_ids)) - - -@app.route("/planned_path", methods=["GET"]) -def post_planned_path(): - args = request.args.to_dict() - global map_id - if map_id != args.get("map_id"): - # TODO(murooka) error handling for map_id mismatch - print("map_id is not correct.") - - # create client - cli = create_client(PlanPath, "/planning/static_centerline_generator/plan_path") - - # request path planning - route_lane_ids = [eval(i) for i in request.args.getlist("route[]")] - req = PlanPath.Request(route=route_lane_ids) - future = cli.call_async(req) - - # get result - rclpy.spin_until_future_complete(node, future) - res = future.result() - - # error handling - if res.message == "MapNotFound": - return jsonify(code=res.message, message="Map is missing."), 404 - elif res.message == "LaneletsNotConnected": - return ( - jsonify( - code=res.message, - message="Lanelets are not connected.", - object_ids=tuple(res.unconnected_lane_ids), - ), - 400, - ) - elif res.message != "": - return ( - jsonify( - code="InternalServerError", - message="Error occurred on the server. Please check the terminal.", - ), - 500, - ) - - # create output json - result_json = [] - for points_with_lane_id in res.points_with_lane_ids: - current_lane_points = [] - for geom_point in points_with_lane_id.points: - point = {"x": geom_point.x, "y": geom_point.y, "z": geom_point.z} - current_lane_points.append(point) - - current_result_json = {} - current_result_json["lane_id"] = int(points_with_lane_id.lane_id) - current_result_json["points"] = current_lane_points - - result_json.append(current_result_json) - - return json.dumps(tuple(result_json)) - - -if __name__ == "__main__": - app.debug = True - app.secret_key = "tmp_secret_key" - app.run(host="localhost", port=4010) diff --git a/planning/autoware_static_centerline_generator/scripts/centerline_updater_helper.py b/planning/autoware_static_centerline_generator/scripts/centerline_updater_helper.py deleted file mode 100755 index f3d908713361d..0000000000000 --- a/planning/autoware_static_centerline_generator/scripts/centerline_updater_helper.py +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/env python3 - -# Copyright 2024 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. - - -import sys -import time - -from PyQt5 import QtCore -from PyQt5.QtWidgets import QApplication -from PyQt5.QtWidgets import QGroupBox -from PyQt5.QtWidgets import QMainWindow -from PyQt5.QtWidgets import QPushButton -from PyQt5.QtWidgets import QSizePolicy -from PyQt5.QtWidgets import QSlider -from PyQt5.QtWidgets import QVBoxLayout -from PyQt5.QtWidgets import QWidget -from autoware_planning_msgs.msg import Trajectory -import rclpy -from rclpy.node import Node -from rclpy.qos import QoSDurabilityPolicy -from rclpy.qos import QoSProfile -from std_msgs.msg import Empty -from std_msgs.msg import Float32 -from std_msgs.msg import Int32 - - -class CenterlineUpdaterWidget(QMainWindow): - def __init__(self): - super(self.__class__, self).__init__() - self.setupUI() - - def setupUI(self): - self.setObjectName("MainWindow") - self.resize(480, 120) - self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint) - - central_widget = QWidget(self) - self.grid_layout = QVBoxLayout(central_widget) - self.grid_layout.setContentsMargins(10, 10, 10, 10) - - # slide of the trajectory's start and end index - self.traj_start_index_slider = QSlider(QtCore.Qt.Horizontal) - self.traj_end_index_slider = QSlider(QtCore.Qt.Horizontal) - self.min_traj_start_index = 0 - self.max_traj_end_index = None - - # Layout: Range of Centerline - centerline_vertical_box = QVBoxLayout(self) - centerline_vertical_box.addWidget(self.traj_start_index_slider) - centerline_vertical_box.addWidget(self.traj_end_index_slider) - centerline_group = QGroupBox("Centerline") - centerline_group.setLayout(centerline_vertical_box) - self.grid_layout.addWidget(centerline_group) - - """ - # 2. Road Boundary - road_boundary_group = QGroupBox("Road Boundary") - road_boundary_vertical_box = QVBoxLayout(self) - road_boundary_group.setLayout(road_boundary_vertical_box) - self.grid_layout.addWidget(road_boundary_group) - - # 2.1. Slider - self.road_boundary_lateral_margin_slider = QSlider(QtCore.Qt.Horizontal) - road_boundary_vertical_box.addWidget(self.road_boundary_lateral_margin_slider) - self.road_boundary_lateral_margin_ratio = 10 - self.road_boundary_lateral_margin_slider.setMinimum(0) - self.road_boundary_lateral_margin_slider.setMaximum( - 5 * self.road_boundary_lateral_margin_ratio - ) - road_boundary_vertical_box.addWidget(QPushButton("reset")) - """ - - # 3. General - general_group = QGroupBox("General") - general_vertical_box = QVBoxLayout(self) - general_group.setLayout(general_vertical_box) - self.grid_layout.addWidget(general_group) - - # 3.1. Validate Centerline - self.validate_button = QPushButton("validate") - self.validate_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - general_vertical_box.addWidget(self.validate_button) - - # 3.2. Save Map - self.save_map_button = QPushButton("save map") - self.save_map_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - general_vertical_box.addWidget(self.save_map_button) - - self.setCentralWidget(central_widget) - - def initWithEndIndex(self, max_traj_end_index): - self.max_traj_end_index = max_traj_end_index - - # initialize sliders - self.traj_start_index_slider.setMinimum(self.min_traj_start_index) - self.traj_start_index_slider.setMaximum(self.max_traj_end_index) - self.traj_start_index_slider.setValue(self.min_traj_start_index) - - self.traj_end_index_slider.setMinimum(self.min_traj_start_index) - self.traj_end_index_slider.setMaximum(self.max_traj_end_index) - self.traj_end_index_slider.setValue(self.max_traj_end_index) - - -class CenterlineUpdaterHelper(Node): - def __init__(self): - super().__init__("centerline_updater_helper") - # Qt - self.widget = CenterlineUpdaterWidget() - self.widget.show() - self.widget.save_map_button.clicked.connect(self.onSaveMapButtonPushed) - self.widget.validate_button.clicked.connect(self.onValidateButtonPushed) - self.widget.traj_start_index_slider.valueChanged.connect(self.onStartIndexChanged) - self.widget.traj_end_index_slider.valueChanged.connect(self.onEndIndexChanged) - """ - self.widget.road_boundary_lateral_margin_slider.valueChanged.connect( - self.onRoadBoundaryLateralMargin - ) - """ - - # ROS - self.pub_save_map = self.create_publisher(Empty, "/static_centerline_generator/save_map", 1) - self.pub_validate = self.create_publisher(Empty, "/static_centerline_generator/validate", 1) - self.pub_traj_start_index = self.create_publisher( - Int32, "/static_centerline_generator/traj_start_index", 1 - ) - self.pub_traj_end_index = self.create_publisher( - Int32, "/static_centerline_generator/traj_end_index", 1 - ) - self.pub_road_boundary_lateral_margin = self.create_publisher( - Float32, "/static_centerline_generator/road_boundary_lateral_margin", 1 - ) - - transient_local_qos = QoSProfile(depth=1, durability=QoSDurabilityPolicy.TRANSIENT_LOCAL) - self.sub_whole_centerline = self.create_subscription( - Trajectory, - "/static_centerline_generator/output/whole_centerline", - self.onWholeCenterline, - transient_local_qos, - ) - - while self.widget.max_traj_end_index is None: - rclpy.spin_once(self, timeout_sec=0.01) - time.sleep(0.1) - - def onWholeCenterline(self, whole_centerline): - self.widget.initWithEndIndex(len(whole_centerline.points) - 1) - - def onSaveMapButtonPushed(self, event): - msg = Empty() - self.pub_save_map.publish(msg) - - # NOTE: After saving the map, the generated centerline is written - # in original_map_ptr_ in static_centerline_generator_node. - # When saving the map again, another centerline is written without - # removing the previous centerline. - # Therefore, saving the map can be called only once. - self.widget.save_map_button.setEnabled(False) - - def onValidateButtonPushed(self, event): - msg = Empty() - self.pub_validate.publish(msg) - - def onStartIndexChanged(self, event): - msg = Int32() - msg.data = self.widget.traj_start_index_slider.value() - self.pub_traj_start_index.publish(msg) - - def onEndIndexChanged(self, event): - msg = Int32() - msg.data = self.widget.traj_end_index_slider.value() - self.pub_traj_end_index.publish(msg) - - def onRoadBoundaryLateralMargin(self, event): - msg = Float32() - msg.data = ( - self.widget.road_boundary_lateral_margin_slider.value() - / self.widget.road_boundary_lateral_margin_ratio - ) - self.pub_road_boundary_lateral_margin.publish(msg) - - -def main(args=None): - app = QApplication(sys.argv) - - rclpy.init(args=args) - node = CenterlineUpdaterHelper() - - while True: - app.processEvents() - rclpy.spin_once(node, timeout_sec=0.01) - - -if __name__ == "__main__": - main() diff --git a/planning/autoware_static_centerline_generator/scripts/show_lanelet2_map_diff.py b/planning/autoware_static_centerline_generator/scripts/show_lanelet2_map_diff.py deleted file mode 100755 index 00d06ca2213d1..0000000000000 --- a/planning/autoware_static_centerline_generator/scripts/show_lanelet2_map_diff.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/bin/env python3 - -# Copyright 2024 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. - -import argparse -from decimal import Decimal -import os -import subprocess -import xml.etree.ElementTree as ET - - -def sort_attributes(root): - for shallow_element in root: - # sort nodes - attrib = shallow_element.attrib - if len(attrib) > 1: - attributes = sorted(attrib.items()) - attrib.clear() - attrib.update(attributes) - if shallow_element.tag == "relation": - pass - - # sort the element in the tag - for deep_element in shallow_element: - attrib = deep_element.attrib - if len(attrib) > 1: - # adjust attribute order, e.g. by sorting - attributes = sorted(attrib.items()) - attrib.clear() - attrib.update(attributes) - - # sort tags - sorted_shallow_element = sorted(shallow_element, key=lambda x: x.items()) - if len(shallow_element) != 0: - # NOTE: This "tail" is related to the indent of the next tag - first_tail = shallow_element[0].tail - last_tail = shallow_element[-1].tail - for idx, val_shallow_element in enumerate(sorted_shallow_element): - shallow_element[idx] = val_shallow_element - if idx == len(shallow_element) - 1: - shallow_element[idx].tail = last_tail - else: - shallow_element[idx].tail = first_tail - - -def remove_diff_to_ignore(osm_root): - decimal_precision = 11 # for lat/lon values - - # remove attributes of the osm tag - osm_root.attrib.clear() - - # remove the MetaInfo tag generated by Vector Map Builder - if osm_root[0].tag == "MetaInfo": - osm_root.remove(osm_root[0]) - - # remove unnecessary attributes for diff - for osm_child in osm_root: - if osm_child.tag == "osm": - osm_child.attrib.pop("osm") - if "visible" in osm_child.attrib and osm_child.attrib["visible"]: - osm_child.attrib.pop("visible") - if "version" in osm_child.attrib and osm_child.attrib["version"]: - osm_child.attrib.pop("version") - if "action" in osm_child.attrib and osm_child.attrib["action"] == "modify": - osm_child.attrib.pop("action") - if "lat" in osm_child.attrib: - osm_child.attrib["lat"] = str( - Decimal(float(osm_child.attrib["lat"])).quantize(Decimal(f"1e-{decimal_precision}")) - ) - if "lon" in osm_child.attrib: - osm_child.attrib["lon"] = str( - Decimal(float(osm_child.attrib["lon"])).quantize(Decimal(f"1e-{decimal_precision}")) - ) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "-s", "--sort-attributes", action="store_true", help="Sort attributes of LL2 maps" - ) - parser.add_argument( - "-i", - "--ignore-minor-attributes", - action="store_true", - help="Ignore minor attributes of LL2 maps which does not change the map's behavior", - ) - args = parser.parse_args() - - original_osm_file_name = "/tmp/autoware_static_centerline_generator/input/lanelet2_map.osm" - modified_osm_file_name = "/tmp/autoware_static_centerline_generator/output/lanelet2_map.osm" - - # load LL2 maps - original_osm_tree = ET.parse(original_osm_file_name) - original_osm_root = original_osm_tree.getroot() - modified_osm_tree = ET.parse(modified_osm_file_name) - modified_osm_root = modified_osm_tree.getroot() - - # sort attributes - if args.sort_attributes: - sort_attributes(modified_osm_root) - sort_attributes(original_osm_root) - - # ignore minor attributes - if args.ignore_minor_attributes: - remove_diff_to_ignore(original_osm_root) - remove_diff_to_ignore(modified_osm_root) - - # write LL2 maps - output_dir_path = "/tmp/autoware_static_centerline_generator/show_lanelet2_map_diff/" - os.makedirs(output_dir_path + "original/", exist_ok=True) - os.makedirs(output_dir_path + "modified/", exist_ok=True) - - original_osm_tree.write(output_dir_path + "original/lanelet2_map.osm") - modified_osm_tree.write(output_dir_path + "modified/lanelet2_map.osm") - - # show diff - print("[INFO] Show diff of following LL2 maps") - print(f" {output_dir_path + 'original/lanelet2_map.osm'}") - print(f" {output_dir_path + 'modified/lanelet2_map.osm'}") - subprocess.run( - [ - "diff", - output_dir_path + "original/lanelet2_map.osm", - output_dir_path + "modified/lanelet2_map.osm", - "--color", - ] - ) diff --git a/planning/autoware_static_centerline_generator/scripts/tmp/bag_ego_trajectory_based_centerline.sh b/planning/autoware_static_centerline_generator/scripts/tmp/bag_ego_trajectory_based_centerline.sh deleted file mode 100755 index c170e24e475d9..0000000000000 --- a/planning/autoware_static_centerline_generator/scripts/tmp/bag_ego_trajectory_based_centerline.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -ros2 launch autoware_static_centerline_generator static_centerline_generator.launch.xml centerline_source:="bag_ego_trajectory_base" mode:="GUI" lanelet2_input_file_path:="$HOME/autoware_map/sample_map/lanelet2_map.osm" bag_filename:="$(ros2 pkg prefix autoware_static_centerline_generator --share)/test/data/bag_ego_trajectory_turn-right.db3" vehicle_model:=lexus - -# ros2 launch autoware_static_centerline_generator static_centerline_generator.launch.xml centerline_source:="bag_ego_trajectory_base" mode:="GUI" lanelet2_input_file_path:="$HOME/autoware_map/sample_map/lanelet2_map.osm" bag_filename:="$(ros2 pkg prefix autoware_static_centerline_generator --share)/test/data/bag_ego_trajectory_turn-left-right.db3" vehicle_model:=lexus diff --git a/planning/autoware_static_centerline_generator/scripts/tmp/optimization_trajectory_based_centerline.sh b/planning/autoware_static_centerline_generator/scripts/tmp/optimization_trajectory_based_centerline.sh deleted file mode 100755 index 488091989d1fa..0000000000000 --- a/planning/autoware_static_centerline_generator/scripts/tmp/optimization_trajectory_based_centerline.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -ros2 launch autoware_static_centerline_generator static_centerline_generator.launch.xml centerline_source:="optimization_trajectory_base" run_background:=false lanelet2_input_file_path:="$HOME/autoware_map/sample_map/lanelet2_map.osm" start_lanelet_id:=125 end_lanelet_id:=132 vehicle_model:=lexus diff --git a/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.cpp b/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.cpp deleted file mode 100644 index dc950f190652b..0000000000000 --- a/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2024 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. - -#include "centerline_source/bag_ego_trajectory_based_centerline.hpp" - -#include "rclcpp/serialization.hpp" -#include "rosbag2_cpp/reader.hpp" -#include "static_centerline_generator_node.hpp" - -#include - -#include -#include -#include - -namespace autoware::static_centerline_generator -{ -std::vector generate_centerline_with_bag(rclcpp::Node & node) -{ - const auto bag_filename = node.declare_parameter("bag_filename"); - - // open rosbag - rosbag2_cpp::Reader bag_reader; - bag_reader.open(bag_filename); - - // extract 2D position of ego's trajectory from rosbag - rclcpp::Serialization bag_serialization; - std::vector centerline_traj_points; - while (bag_reader.has_next()) { - const rosbag2_storage::SerializedBagMessageSharedPtr msg = bag_reader.read_next(); - - if (msg->topic_name != "/localization/kinematic_state") { - continue; - } - - rclcpp::SerializedMessage serialized_msg(*msg->serialized_data); - const auto ros_msg = std::make_shared(); - - bag_serialization.deserialize_message(&serialized_msg, ros_msg.get()); - - if (!centerline_traj_points.empty()) { - constexpr double epsilon = 1e-1; - if ( - std::abs(centerline_traj_points.back().pose.position.x - ros_msg->pose.pose.position.x) < - epsilon && - std::abs(centerline_traj_points.back().pose.position.y - ros_msg->pose.pose.position.y) < - epsilon) { - continue; - } - } - TrajectoryPoint centerline_traj_point; - centerline_traj_point.pose.position = ros_msg->pose.pose.position; - centerline_traj_points.push_back(centerline_traj_point); - } - - RCLCPP_INFO(node.get_logger(), "Extracted centerline from the bag."); - - // calculate rough orientation of centerline trajectory points - for (size_t i = 0; i < centerline_traj_points.size(); ++i) { - if (i == centerline_traj_points.size() - 1) { - if (i != 0) { - centerline_traj_points.at(i).pose.orientation = - centerline_traj_points.at(i - 1).pose.orientation; - } - } else { - const double yaw_angle = autoware::universe_utils::calcAzimuthAngle( - centerline_traj_points.at(i).pose.position, centerline_traj_points.at(i + 1).pose.position); - centerline_traj_points.at(i).pose.orientation = - autoware::universe_utils::createQuaternionFromYaw(yaw_angle); - } - } - - return centerline_traj_points; -} -} // namespace autoware::static_centerline_generator diff --git a/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.hpp b/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.hpp deleted file mode 100644 index 2275f88184c6f..0000000000000 --- a/planning/autoware_static_centerline_generator/src/centerline_source/bag_ego_trajectory_based_centerline.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2024 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. - -#ifndef CENTERLINE_SOURCE__BAG_EGO_TRAJECTORY_BASED_CENTERLINE_HPP_ -#define CENTERLINE_SOURCE__BAG_EGO_TRAJECTORY_BASED_CENTERLINE_HPP_ - -#include "rclcpp/rclcpp.hpp" -#include "type_alias.hpp" - -#include - -namespace autoware::static_centerline_generator -{ -std::vector generate_centerline_with_bag(rclcpp::Node & node); -} // namespace autoware::static_centerline_generator -#endif // CENTERLINE_SOURCE__BAG_EGO_TRAJECTORY_BASED_CENTERLINE_HPP_ diff --git a/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.cpp b/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.cpp deleted file mode 100644 index 51725fb8a3799..0000000000000 --- a/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2024 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. - -#include "centerline_source/optimization_trajectory_based_centerline.hpp" - -#include "autoware/motion_utils/resample/resample.hpp" -#include "autoware/motion_utils/trajectory/conversion.hpp" -#include "autoware/path_optimizer/node.hpp" -#include "autoware/path_smoother/elastic_band_smoother.hpp" -#include "autoware/universe_utils/ros/parameter.hpp" -#include "static_centerline_generator_node.hpp" -#include "utils.hpp" - -#include -#include - -namespace autoware::static_centerline_generator -{ -namespace -{ -rclcpp::NodeOptions create_node_options() -{ - return rclcpp::NodeOptions{}; -} - -Path convert_to_path(const PathWithLaneId & path_with_lane_id) -{ - Path path; - path.header = path_with_lane_id.header; - path.left_bound = path_with_lane_id.left_bound; - path.right_bound = path_with_lane_id.right_bound; - for (const auto & point : path_with_lane_id.points) { - path.points.push_back(point.point); - } - - return path; -} - -Trajectory convert_to_trajectory(const Path & path) -{ - Trajectory traj; - for (const auto & point : path.points) { - TrajectoryPoint traj_point; - traj_point.pose = point.pose; - traj_point.longitudinal_velocity_mps = point.longitudinal_velocity_mps; - traj_point.lateral_velocity_mps = point.lateral_velocity_mps; - traj_point.heading_rate_rps = point.heading_rate_rps; - - traj.points.push_back(traj_point); - } - return traj; -} -} // namespace - -OptimizationTrajectoryBasedCenterline::OptimizationTrajectoryBasedCenterline(rclcpp::Node & node) -{ - pub_raw_path_with_lane_id_ = - node.create_publisher("input_centerline", utils::create_transient_local_qos()); - pub_raw_path_ = - node.create_publisher("debug/raw_centerline", utils::create_transient_local_qos()); -} - -std::vector -OptimizationTrajectoryBasedCenterline::generate_centerline_with_optimization( - rclcpp::Node & node, const RouteHandler & route_handler, - const std::vector & route_lane_ids) -{ - const auto route_lanelets = utils::get_lanelets_from_ids(route_handler, route_lane_ids); - - // optimize centerline inside the lane - const auto start_center_pose = utils::get_center_pose(route_handler, route_lane_ids.front()); - - // get ego nearest search parameters and resample interval in behavior_path_planner - const double ego_nearest_dist_threshold = - autoware::universe_utils::getOrDeclareParameter(node, "ego_nearest_dist_threshold"); - const double ego_nearest_yaw_threshold = - autoware::universe_utils::getOrDeclareParameter(node, "ego_nearest_yaw_threshold"); - const double behavior_path_interval = - autoware::universe_utils::getOrDeclareParameter(node, "output_path_interval"); - const double behavior_vel_interval = - autoware::universe_utils::getOrDeclareParameter(node, "behavior_output_path_interval"); - - // extract path with lane id from lanelets - const auto raw_path_with_lane_id = [&]() { - const auto non_resampled_path_with_lane_id = utils::get_path_with_lane_id( - route_handler, route_lanelets, start_center_pose, ego_nearest_dist_threshold, - ego_nearest_yaw_threshold); - return autoware::motion_utils::resamplePath( - non_resampled_path_with_lane_id, behavior_path_interval); - }(); - pub_raw_path_with_lane_id_->publish(raw_path_with_lane_id); - RCLCPP_INFO(node.get_logger(), "Calculated raw path with lane id and published."); - - // convert path with lane id to path - const auto raw_path = [&]() { - const auto non_resampled_path = convert_to_path(raw_path_with_lane_id); - return autoware::motion_utils::resamplePath(non_resampled_path, behavior_vel_interval); - }(); - pub_raw_path_->publish(raw_path); - RCLCPP_INFO(node.get_logger(), "Converted to path and published."); - - // smooth trajectory and road collision avoidance - const auto optimized_traj_points = optimize_trajectory(raw_path); - RCLCPP_INFO( - node.get_logger(), - "Smoothed trajectory and made it collision free with the road and published."); - - return optimized_traj_points; -} - -std::vector OptimizationTrajectoryBasedCenterline::optimize_trajectory( - const Path & raw_path) const -{ - // convert to trajectory points - const auto raw_traj_points = [&]() { - const auto raw_traj = convert_to_trajectory(raw_path); - return autoware::motion_utils::convertToTrajectoryPointArray(raw_traj); - }(); - - // create an instance of elastic band and model predictive trajectory. - const auto eb_path_smoother_ptr = - autoware::path_smoother::ElasticBandSmoother(create_node_options()).getElasticBandSmoother(); - const auto mpt_optimizer_ptr = - autoware::path_optimizer::PathOptimizer(create_node_options()).getMPTOptimizer(); - - // NOTE: The optimization is executed every valid_optimized_traj_points_num points. - constexpr int valid_optimized_traj_points_num = 10; - const int traj_segment_num = raw_traj_points.size() / valid_optimized_traj_points_num; - - // NOTE: num_initial_optimization exists to make the both optimizations stable since they may use - // warm start. - constexpr int num_initial_optimization = 2; - - std::vector whole_optimized_traj_points; - for (int virtual_ego_pose_idx = -num_initial_optimization; - virtual_ego_pose_idx < traj_segment_num; ++virtual_ego_pose_idx) { - // calculate virtual ego pose for the optimization - constexpr int virtual_ego_pose_offset_idx = 1; - const auto virtual_ego_pose = - raw_traj_points - .at( - valid_optimized_traj_points_num * std::max(virtual_ego_pose_idx, 0) + - virtual_ego_pose_offset_idx) - .pose; - - // smooth trajectory by elastic band in the autoware_path_smoother package - const auto smoothed_traj_points = - eb_path_smoother_ptr->smoothTrajectory(raw_traj_points, virtual_ego_pose); - - // road collision avoidance by model predictive trajectory in the autoware_path_optimizer - // package - const autoware::path_optimizer::PlannerData planner_data{ - raw_path.header, smoothed_traj_points, raw_path.left_bound, raw_path.right_bound, - virtual_ego_pose}; - const auto optimized_traj_points = mpt_optimizer_ptr->optimizeTrajectory(planner_data); - - // connect the previously and currently optimized trajectory points - for (size_t j = 0; j < whole_optimized_traj_points.size(); ++j) { - const double dist = autoware::universe_utils::calcDistance2d( - whole_optimized_traj_points.at(j), optimized_traj_points.front()); - if (dist < 0.5) { - const std::vector extracted_whole_optimized_traj_points{ - whole_optimized_traj_points.begin(), - whole_optimized_traj_points.begin() + std::max(j, 1UL) - 1}; - whole_optimized_traj_points = extracted_whole_optimized_traj_points; - break; - } - } - for (size_t j = 0; j < optimized_traj_points.size(); ++j) { - whole_optimized_traj_points.push_back(optimized_traj_points.at(j)); - } - } - - return whole_optimized_traj_points; -} -} // namespace autoware::static_centerline_generator diff --git a/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.hpp b/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.hpp deleted file mode 100644 index 88def6fa7bd4c..0000000000000 --- a/planning/autoware_static_centerline_generator/src/centerline_source/optimization_trajectory_based_centerline.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2024 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. - -#ifndef CENTERLINE_SOURCE__OPTIMIZATION_TRAJECTORY_BASED_CENTERLINE_HPP_ // NOLINT -#define CENTERLINE_SOURCE__OPTIMIZATION_TRAJECTORY_BASED_CENTERLINE_HPP_ // NOLINT - -#include "rclcpp/rclcpp.hpp" -#include "type_alias.hpp" - -#include - -namespace autoware::static_centerline_generator -{ -class OptimizationTrajectoryBasedCenterline -{ -public: - OptimizationTrajectoryBasedCenterline() = default; - explicit OptimizationTrajectoryBasedCenterline(rclcpp::Node & node); - std::vector generate_centerline_with_optimization( - rclcpp::Node & node, const RouteHandler & route_handler, - const std::vector & route_lane_ids); - -private: - std::vector optimize_trajectory(const Path & raw_path) const; - - rclcpp::Publisher::SharedPtr pub_raw_path_with_lane_id_{nullptr}; - rclcpp::Publisher::SharedPtr pub_raw_path_{nullptr}; -}; -} // namespace autoware::static_centerline_generator -// clang-format off -#endif // CENTERLINE_SOURCE__OPTIMIZATION_TRAJECTORY_BASED_CENTERLINE_HPP_ // NOLINT -// clang-format on diff --git a/planning/autoware_static_centerline_generator/src/main.cpp b/planning/autoware_static_centerline_generator/src/main.cpp deleted file mode 100644 index 71a076ee86fe0..0000000000000 --- a/planning/autoware_static_centerline_generator/src/main.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2022 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. - -#include "static_centerline_generator_node.hpp" - -#include -#include -#include - -int main(int argc, char * argv[]) -{ - try { - rclcpp::init(argc, argv); - - // initialize node - rclcpp::NodeOptions node_options; - auto node = - std::make_shared( - node_options); - - // get ros parameter - const auto mode = node->declare_parameter("mode"); - - // process - if (mode == "AUTO") { - node->generate_centerline(); - node->validate(); - node->save_map(); - } else if (mode == "GUI") { - node->generate_centerline(); - } else if (mode == "VMB") { - // Do nothing - } else { - throw std::invalid_argument("The `mode` is invalid."); - } - - // NOTE: spin node to keep showing debug path/trajectory in rviz with transient local - rclcpp::spin(node); - rclcpp::shutdown(); - } catch (const std::exception & e) { - std::cerr << "Exception in main(): " << e.what() << std::endl; - return {}; - } catch (...) { - std::cerr << "Unknown exception in main()" << std::endl; - return {}; - } - return 0; -} diff --git a/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.cpp b/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.cpp deleted file mode 100644 index f172e3e0cb1cd..0000000000000 --- a/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.cpp +++ /dev/null @@ -1,774 +0,0 @@ -// Copyright 2022 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. - -#include "static_centerline_generator_node.hpp" - -#include "autoware/map_loader/lanelet2_map_loader_node.hpp" -#include "autoware/map_projection_loader/load_info_from_lanelet2_map.hpp" -#include "autoware/map_projection_loader/map_projection_loader.hpp" -#include "autoware/motion_utils/resample/resample.hpp" -#include "autoware/motion_utils/trajectory/conversion.hpp" -#include "autoware/motion_utils/trajectory/trajectory.hpp" -#include "autoware/universe_utils/geometry/geometry.hpp" -#include "autoware/universe_utils/math/unit_conversion.hpp" -#include "autoware/universe_utils/ros/parameter.hpp" -#include "autoware_lanelet2_extension/utility/message_conversion.hpp" -#include "autoware_lanelet2_extension/utility/query.hpp" -#include "autoware_lanelet2_extension/utility/utilities.hpp" -#include "autoware_static_centerline_generator/msg/points_with_lane_id.hpp" -#include "centerline_source/bag_ego_trajectory_based_centerline.hpp" -#include "type_alias.hpp" -#include "utils.hpp" - -#include -#include -#include -#include - -#include "std_msgs/msg/empty.hpp" -#include "std_msgs/msg/float32.hpp" -#include "std_msgs/msg/int32.hpp" - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define RESET_TEXT "\x1B[0m" -#define RED_TEXT "\x1B[31m" -#define YELLOW_TEXT "\x1b[33m" -#define BOLD_TEXT "\x1B[1m" - -namespace autoware::static_centerline_generator -{ -namespace -{ -std::vector get_lane_ids_from_route(const LaneletRoute & route) -{ - std::vector lane_ids; - for (const auto & segment : route.segments) { - const auto & target_lanelet_id = segment.preferred_primitive.id; - lane_ids.push_back(target_lanelet_id); - } - - return lane_ids; -} - -lanelet::BasicPoint2d convert_to_lanelet_point(const geometry_msgs::msg::Point & geom_point) -{ - lanelet::BasicPoint2d point(geom_point.x, geom_point.y); - return point; -} - -LinearRing2d create_vehicle_footprint( - const geometry_msgs::msg::Pose & pose, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, const double margin = 0.0) -{ - const auto & i = vehicle_info; - - const double x_front = i.front_overhang_m + i.wheel_base_m + margin; - const double x_rear = -(i.rear_overhang_m + margin); - const double y_left = i.wheel_tread_m / 2.0 + i.left_overhang_m + margin; - const double y_right = -(i.wheel_tread_m / 2.0 + i.right_overhang_m + margin); - - std::vector geom_points; - geom_points.push_back( - autoware::universe_utils::calcOffsetPose(pose, x_front, y_left, 0.0).position); - geom_points.push_back( - autoware::universe_utils::calcOffsetPose(pose, x_front, y_right, 0.0).position); - geom_points.push_back( - autoware::universe_utils::calcOffsetPose(pose, x_rear, y_right, 0.0).position); - geom_points.push_back( - autoware::universe_utils::calcOffsetPose(pose, x_rear, y_left, 0.0).position); - - LinearRing2d footprint; - for (const auto & geom_point : geom_points) { - footprint.push_back(Point2d{geom_point.x, geom_point.y}); - } - footprint.push_back(footprint.back()); - - boost::geometry::correct(footprint); - - return footprint; -} - -geometry_msgs::msg::Pose get_text_pose( - const geometry_msgs::msg::Pose & pose, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info) -{ - const auto & i = vehicle_info; - - const double x_front = i.front_overhang_m + i.wheel_base_m; - const double y_left = i.wheel_tread_m / 2.0 + i.left_overhang_m + 0.5; - - return autoware::universe_utils::calcOffsetPose(pose, x_front, y_left, 0.0); -} - -std::array convert_hex_string_to_decimal(const std::string & hex_str_color) -{ - unsigned int hex_int_color; - std::istringstream iss(hex_str_color); - iss >> std::hex >> hex_int_color; - - unsigned int unit = 16 * 16; - unsigned int b = hex_int_color % unit; - unsigned int g = (hex_int_color - b) / unit % unit; - unsigned int r = (hex_int_color - g * unit - b) / unit / unit; - - return std::array{r / 255.0, g / 255.0, b / 255.0}; -} - -std::vector check_lanelet_connection( - const RouteHandler & route_handler, const lanelet::ConstLanelets & route_lanelets) -{ - std::vector unconnected_lane_ids; - - for (size_t i = 0; i < route_lanelets.size() - 1; ++i) { - const auto next_lanelets = route_handler.getNextLanelets(route_lanelets.at(i)); - - const bool is_connected = - std::find_if(next_lanelets.begin(), next_lanelets.end(), [&](const auto & next_lanelet) { - return next_lanelet.id() == route_lanelets.at(i + 1).id(); - }) != next_lanelets.end(); - if (!is_connected) { - unconnected_lane_ids.push_back(route_lanelets.at(i).id()); - } - } - - return unconnected_lane_ids; -} - -std_msgs::msg::Header create_header(const rclcpp::Time & now) -{ - std_msgs::msg::Header header; - header.frame_id = "map"; - header.stamp = now; - return header; -} - -std::vector resample_trajectory_points( - const std::vector & input_traj_points, const double resample_interval) -{ - // resample and calculate trajectory points' orientation - const auto input_traj = autoware::motion_utils::convertToTrajectory(input_traj_points); - auto resampled_input_traj = - autoware::motion_utils::resampleTrajectory(input_traj, resample_interval); - return autoware::motion_utils::convertToTrajectoryPointArray(resampled_input_traj); -} - -std::vector convertToGeometryPoints(const LineString2d & lanelet_points) -{ - std::vector points; - for (const auto & lanelet_point : lanelet_points) { - geometry_msgs::msg::Point point; - point.x = lanelet_point.x(); - point.y = lanelet_point.y(); - points.push_back(point); - } - return points; -} -} // namespace - -StaticCenterlineGeneratorNode::StaticCenterlineGeneratorNode( - const rclcpp::NodeOptions & node_options) -: Node("static_centerline_generator", node_options) -{ - // publishers - pub_map_bin_ = - create_publisher("lanelet2_map_topic", utils::create_transient_local_qos()); - pub_whole_centerline_ = - create_publisher("~/output/whole_centerline", utils::create_transient_local_qos()); - pub_centerline_ = - create_publisher("~/output/centerline", utils::create_transient_local_qos()); - - // debug publishers - pub_validation_results_ = - create_publisher("~/validation_results", utils::create_transient_local_qos()); - pub_debug_markers_ = - create_publisher("~/debug/markers", utils::create_transient_local_qos()); - - pub_debug_ego_footprint_bounds_ = create_publisher( - "~/debug/ego_footprint_bounds", utils::create_transient_local_qos()); - - // subscribers - sub_footprint_margin_for_road_bound_ = create_subscription( - "/static_centerline_generator/road_boundary_lateral_margin", rclcpp::QoS{1}, - [this](const std_msgs::msg::Float32 & msg) { footprint_margin_for_road_bound_ = msg.data; }); - sub_traj_start_index_ = create_subscription( - "/static_centerline_generator/traj_start_index", rclcpp::QoS{1}, - [this](const std_msgs::msg::Int32 & msg) { - if (centerline_handler_.update_start_index(msg.data)) { - visualize_selected_centerline(); - } - }); - sub_traj_end_index_ = create_subscription( - "/static_centerline_generator/traj_end_index", rclcpp::QoS{1}, - [this](const std_msgs::msg::Int32 & msg) { - if (centerline_handler_.update_end_index(msg.data)) { - visualize_selected_centerline(); - } - }); - sub_save_map_ = create_subscription( - "/static_centerline_generator/save_map", rclcpp::QoS{1}, - [this]([[maybe_unused]] const std_msgs::msg::Empty & msg) { - if (!centerline_handler_.is_valid()) { - return; - } - save_map(); - }); - sub_validate_ = create_subscription( - "/static_centerline_generator/validate", rclcpp::QoS{1}, - [this]([[maybe_unused]] const std_msgs::msg::Empty & msg) { validate(); }); - - // services - callback_group_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); - srv_load_map_ = create_service( - "/planning/static_centerline_generator/load_map", - std::bind( - &StaticCenterlineGeneratorNode::on_load_map, this, std::placeholders::_1, - std::placeholders::_2), - rmw_qos_profile_services_default, callback_group_); - srv_plan_route_ = create_service( - "/planning/static_centerline_generator/plan_route", - std::bind( - &StaticCenterlineGeneratorNode::on_plan_route, this, std::placeholders::_1, - std::placeholders::_2), - rmw_qos_profile_services_default, callback_group_); - srv_plan_path_ = create_service( - "/planning/static_centerline_generator/plan_path", - std::bind( - &StaticCenterlineGeneratorNode::on_plan_path, this, std::placeholders::_1, - std::placeholders::_2), - rmw_qos_profile_services_default, callback_group_); - - // vehicle info - vehicle_info_ = autoware::vehicle_info_utils::VehicleInfoUtils(*this).getVehicleInfo(); - - centerline_source_ = [&]() { - const auto centerline_source_param = declare_parameter("centerline_source"); - if (centerline_source_param == "optimization_trajectory_base") { - optimization_trajectory_based_centerline_ = OptimizationTrajectoryBasedCenterline(*this); - return CenterlineSource::OptimizationTrajectoryBase; - } else if (centerline_source_param == "bag_ego_trajectory_base") { - return CenterlineSource::BagEgoTrajectoryBase; - } - throw std::logic_error( - "The centerline source is not supported in autoware_static_centerline_generator."); - }(); -} - -void StaticCenterlineGeneratorNode::visualize_selected_centerline() -{ - // publish selected centerline - const auto selected_centerline = centerline_handler_.get_selected_centerline(); - pub_centerline_->publish( - autoware::motion_utils::convertToTrajectory(selected_centerline, create_header(this->now()))); - - // delete markers for validation - pub_validation_results_->publish(utils::create_delete_all_marker_array({}, now())); - pub_debug_markers_->publish(utils::create_delete_all_marker_array( - {"unsafe_footprints", "unsafe_footprints_distance"}, now())); - pub_debug_ego_footprint_bounds_->publish( - utils::create_delete_all_marker_array({"road_bounds"}, now())); -} - -void StaticCenterlineGeneratorNode::generate_centerline() -{ - // declare planning setting parameters - const auto lanelet2_input_file_path = declare_parameter("lanelet2_input_file_path"); - - // process - load_map(lanelet2_input_file_path); - const auto whole_centerline_with_route = generate_whole_centerline_with_route(); - centerline_handler_ = CenterlineHandler(whole_centerline_with_route); - - visualize_selected_centerline(); -} - -CenterlineWithRoute StaticCenterlineGeneratorNode::generate_whole_centerline_with_route() -{ - if (!route_handler_ptr_) { - RCLCPP_ERROR(get_logger(), "Route handler is not ready. Return empty trajectory."); - return CenterlineWithRoute{}; - } - - // generate centerline with route - auto centerline_with_route = [&]() { - if (centerline_source_ == CenterlineSource::OptimizationTrajectoryBase) { - const lanelet::Id start_lanelet_id = declare_parameter("start_lanelet_id"); - const lanelet::Id end_lanelet_id = declare_parameter("end_lanelet_id"); - const auto route_lane_ids = plan_route_by_lane_ids(start_lanelet_id, end_lanelet_id); - const auto optimized_centerline = - optimization_trajectory_based_centerline_.generate_centerline_with_optimization( - *this, *route_handler_ptr_, route_lane_ids); - return CenterlineWithRoute{optimized_centerline, route_lane_ids}; - } else if (centerline_source_ == CenterlineSource::BagEgoTrajectoryBase) { - const auto bag_centerline = generate_centerline_with_bag(*this); - const auto route_lane_ids = - plan_route(bag_centerline.front().pose, bag_centerline.back().pose); - return CenterlineWithRoute{bag_centerline, route_lane_ids}; - } - throw std::logic_error( - "The centerline source is not supported in autoware_static_centerline_generator."); - }(); - - // resample - const double output_trajectory_interval = declare_parameter("output_trajectory_interval"); - centerline_with_route.centerline = - resample_trajectory_points(centerline_with_route.centerline, output_trajectory_interval); - - pub_whole_centerline_->publish(autoware::motion_utils::convertToTrajectory( - centerline_with_route.centerline, create_header(this->now()))); - - return centerline_with_route; -} - -void StaticCenterlineGeneratorNode::load_map(const std::string & lanelet2_input_file_path) -{ - // copy the input LL2 map to the temporary file for debugging - const std::string debug_input_file_dir{"/tmp/autoware_static_centerline_generator/input/"}; - std::filesystem::create_directories(debug_input_file_dir); - std::filesystem::copy( - lanelet2_input_file_path, debug_input_file_dir + "lanelet2_map.osm", - std::filesystem::copy_options::overwrite_existing); - - // load map by the map_loader package - map_bin_ptr_ = [&]() -> LaneletMapBin::ConstSharedPtr { - // load map - map_projector_info_ = std::make_unique( - autoware::map_projection_loader::load_info_from_lanelet2_map(lanelet2_input_file_path)); - const auto map_ptr = autoware::map_loader::Lanelet2MapLoaderNode::load_map( - lanelet2_input_file_path, *map_projector_info_); - if (!map_ptr) { - return nullptr; - } - - // NOTE: The original map is stored here since the centerline will be added to all the - // lanelet when lanelet::utils::overwriteLaneletCenterline is called. - original_map_ptr_ = autoware::map_loader::Lanelet2MapLoaderNode::load_map( - lanelet2_input_file_path, *map_projector_info_); - - // overwrite more dense centerline - // NOTE: overwriteLaneletsCenterlineWithWaypoints is used only in real time calculation. - lanelet::utils::overwriteLaneletsCenterline(map_ptr, 5.0, false); - - // create map bin msg - const auto map_bin_msg = autoware::map_loader::Lanelet2MapLoaderNode::create_map_bin_msg( - map_ptr, lanelet2_input_file_path, now()); - - return std::make_shared(map_bin_msg); - }(); - - // check if map_bin_ptr_ is not null pointer - if (!map_bin_ptr_) { - RCLCPP_ERROR(get_logger(), "Loading map failed"); - return; - } - RCLCPP_INFO(get_logger(), "Loaded map."); - - // publish map bin msg - pub_map_bin_->publish(*map_bin_ptr_); - RCLCPP_INFO(get_logger(), "Published map."); - - // create route_handler - route_handler_ptr_ = std::make_shared(); - route_handler_ptr_->setMap(*map_bin_ptr_); -} - -void StaticCenterlineGeneratorNode::on_load_map( - const LoadMap::Request::SharedPtr request, const LoadMap::Response::SharedPtr response) -{ - const std::string tmp_lanelet2_input_file_path = "/tmp/input_lanelet2_map.osm"; - - // save map file temporarily since load map's input must be a file - std::ofstream map_writer; - map_writer.open(tmp_lanelet2_input_file_path, std::ios::out); - map_writer << request->map; - map_writer.close(); - - // load map from the saved map file - load_map(tmp_lanelet2_input_file_path); - - if (map_bin_ptr_) { - return; - } - - response->message = "InvalidMapFormat"; -} - -std::vector StaticCenterlineGeneratorNode::plan_route_by_lane_ids( - const lanelet::Id start_lanelet_id, const lanelet::Id end_lanelet_id) -{ - if (!route_handler_ptr_) { - RCLCPP_ERROR(get_logger(), "Map or route handler is not ready. Return empty lane ids."); - return std::vector{}; - } - - const auto start_center_pose = utils::get_center_pose(*route_handler_ptr_, start_lanelet_id); - const auto end_center_pose = utils::get_center_pose(*route_handler_ptr_, end_lanelet_id); - return plan_route(start_center_pose, end_center_pose); -} - -std::vector StaticCenterlineGeneratorNode::plan_route( - const geometry_msgs::msg::Pose & start_center_pose, - const geometry_msgs::msg::Pose & end_center_pose) -{ - if (!map_bin_ptr_) { - RCLCPP_ERROR(get_logger(), "Map or route handler is not ready. Return empty lane ids."); - return std::vector{}; - } - - // plan route by the mission_planner package - const auto route = [&]() { - // calculate check points - RCLCPP_INFO(get_logger(), "Calculated check points."); - const auto check_points = - std::vector{start_center_pose, end_center_pose}; - - // create mission_planner plugin - auto plugin_loader = pluginlib::ClassLoader( - "autoware_mission_planner", "autoware::mission_planner::PlannerPlugin"); - auto mission_planner = - plugin_loader.createSharedInstance("autoware::mission_planner::lanelet2::DefaultPlanner"); - - // initialize mission_planner - auto node = rclcpp::Node("mission_planner"); - mission_planner->initialize(&node, map_bin_ptr_); - - // plan route - const auto route = mission_planner->plan(check_points); - - return route; - }(); - - // get lanelets - const auto route_lane_ids = get_lane_ids_from_route(route); - - std::string route_lane_ids_str = ""; - for (const lanelet::Id route_lane_id : route_lane_ids) { - route_lane_ids_str += std::to_string(route_lane_id) + ","; - } - RCLCPP_INFO_STREAM(get_logger(), "Planned route. (" << route_lane_ids_str << ")"); - - return route_lane_ids; -} - -void StaticCenterlineGeneratorNode::on_plan_route( - const PlanRoute::Request::SharedPtr request, const PlanRoute::Response::SharedPtr response) -{ - if (!map_bin_ptr_ || !route_handler_ptr_) { - response->message = "MapNotFound"; - RCLCPP_ERROR(get_logger(), "Map is not ready."); - return; - } - - const lanelet::Id start_lanelet_id = request->start_lane_id; - const lanelet::Id end_lanelet_id = request->end_lane_id; - - // plan route - const auto route_lane_ids = plan_route_by_lane_ids(start_lanelet_id, end_lanelet_id); - const auto route_lanelets = utils::get_lanelets_from_ids(*route_handler_ptr_, route_lane_ids); - - // extract lane ids - std::vector lane_ids; - for (const auto & lanelet : route_lanelets) { - lane_ids.push_back(lanelet.id()); - } - - // check calculation result - if (lane_ids.empty()) { - response->message = "RouteNotFound"; - RCLCPP_ERROR(get_logger(), "Route planning failed."); - return; - } - - // set response - response->lane_ids = lane_ids; -} - -void StaticCenterlineGeneratorNode::on_plan_path( - const PlanPath::Request::SharedPtr request, const PlanPath::Response::SharedPtr response) -{ - if (!route_handler_ptr_) { - response->message = "MapNotFound"; - RCLCPP_ERROR(get_logger(), "Route handler is not ready."); - return; - } - - // get lanelets from route lane ids - const auto route_lane_ids = request->route; - const auto route_lanelets = utils::get_lanelets_from_ids(*route_handler_ptr_, route_lane_ids); - - // check if input route lanelets are connected to each other. - const auto unconnected_lane_ids = check_lanelet_connection(*route_handler_ptr_, route_lanelets); - if (!unconnected_lane_ids.empty()) { - response->message = "LaneletsNotConnected"; - response->unconnected_lane_ids = unconnected_lane_ids; - RCLCPP_ERROR(get_logger(), "Lanelets are not connected."); - return; - } - - // plan path - const auto optimized_traj_points = - optimization_trajectory_based_centerline_.generate_centerline_with_optimization( - *this, *route_handler_ptr_, route_lane_ids); - - // check calculation result - if (optimized_traj_points.empty()) { - response->message = "PathNotFound"; - RCLCPP_ERROR(get_logger(), "Path planning failed."); - return; - } - - centerline_handler_ = - CenterlineHandler(CenterlineWithRoute{optimized_traj_points, route_lane_ids}); - - // publish unsafe_footprints - validate(); - - // create output data - auto target_traj_point = optimized_traj_points.cbegin(); - bool is_end_lanelet = false; - for (const auto & lanelet : route_lanelets) { - std::vector current_lanelet_points; - - // check if target point is inside the lanelet - while (lanelet::geometry::inside( - lanelet, convert_to_lanelet_point(target_traj_point->pose.position))) { - // memorize points inside the lanelet - current_lanelet_points.push_back(target_traj_point->pose.position); - target_traj_point++; - - if (target_traj_point == optimized_traj_points.cend()) { - is_end_lanelet = true; - break; - } - } - - if (!current_lanelet_points.empty()) { - // register points with lane_id - autoware_static_centerline_generator::msg::PointsWithLaneId points_with_lane_id; - points_with_lane_id.lane_id = lanelet.id(); - points_with_lane_id.points = current_lanelet_points; - response->points_with_lane_ids.push_back(points_with_lane_id); - } - - if (is_end_lanelet) { - break; - } - } - - // empty string if error did not occur - response->message = ""; -} - -void StaticCenterlineGeneratorNode::validate() -{ - std::cerr << std::endl - << "############################################## Validation Results " - "##############################################" - << std::endl; - - const auto & centerline = centerline_handler_.get_selected_centerline(); - const auto & route_lane_ids = centerline_handler_.get_route_lane_ids(); - const auto route_lanelets = utils::get_lanelets_from_ids(*route_handler_ptr_, route_lane_ids); - - const double dist_thresh_to_road_border = - getRosParameter("validation.dist_threshold_to_road_border"); - const double max_steer_angle_margin = - getRosParameter("validation.max_steer_angle_margin"); - - // calculate color for distance to road border - const auto dist_thresh_vec = getRosParameter>("marker_color_dist_thresh"); - const auto marker_color_vec = getRosParameter>("marker_color"); - const auto get_marker_color = [&](const double dist) -> boost::optional> { - for (size_t i = 0; i < dist_thresh_vec.size(); ++i) { - const double dist_thresh = dist_thresh_vec.at(i); - if (dist < dist_thresh) { - return convert_hex_string_to_decimal(marker_color_vec.at(i)); - } - } - return boost::none; - }; - - // create right/left bound - LineString2d lanelet_right_bound; - LineString2d lanelet_left_bound; - for (const auto & lanelet : route_lanelets) { - for (const auto & point : lanelet.rightBound()) { - boost::geometry::append(lanelet_right_bound, Point2d(point.x(), point.y())); - } - for (const auto & point : lanelet.leftBound()) { - boost::geometry::append(lanelet_left_bound, Point2d(point.x(), point.y())); - } - } - - // calculate curvature - const auto curvature_vec = autoware::motion_utils::calcCurvature(centerline); - const double steer_angle_threshold = vehicle_info_.max_steer_angle_rad - max_steer_angle_margin; - - // calculate the distance between footprint and right/left bounds - MarkerArray marker_array; - double min_dist = std::numeric_limits::max(); - double max_curvature = std::numeric_limits::min(); - for (size_t i = 0; i < centerline.size(); ++i) { - const auto & traj_point = centerline.at(i); - - const auto footprint_poly = create_vehicle_footprint(traj_point.pose, vehicle_info_); - - const double dist_to_right = boost::geometry::distance(footprint_poly, lanelet_right_bound); - const double dist_to_left = boost::geometry::distance(footprint_poly, lanelet_left_bound); - const double min_dist_to_bound = std::min(dist_to_right, dist_to_left); - - if (min_dist_to_bound < min_dist) { - min_dist = min_dist_to_bound; - } - - // create marker - const auto marker_color_opt = get_marker_color(min_dist_to_bound); - const auto text_pose = get_text_pose(traj_point.pose, vehicle_info_); - if (marker_color_opt) { - const auto & marker_color = marker_color_opt.get(); - - // add footprint marker - const auto footprint_marker = utils::create_footprint_marker( - footprint_poly, 0.05, marker_color.at(0), marker_color.at(1), marker_color.at(2), 0.7, - now(), i); - marker_array.markers.push_back(footprint_marker); - - // add text of distance to bounds marker - const auto text_marker = utils::create_text_marker( - "unsafe_footprints_distance", text_pose, min_dist_to_bound, marker_color.at(0), - marker_color.at(1), marker_color.at(2), 0.999, now(), i); - marker_array.markers.push_back(text_marker); - } - - const double curvature = curvature_vec.at(i); - const auto text_marker = - utils::create_text_marker("curvature", text_pose, curvature, 0.05, 0.05, 0.0, 0.9, now(), i); - marker_array.markers.push_back(text_marker); - - if (max_curvature < std::abs(curvature)) { - max_curvature = std::abs(curvature); - } - } - const double max_steer_angle = vehicle_info_.calcSteerAngleFromCurvature(max_curvature); - - // publish road boundaries - const auto left_bound = convertToGeometryPoints(lanelet_left_bound); - const auto right_bound = convertToGeometryPoints(lanelet_right_bound); - - marker_array.markers.push_back( - utils::create_points_marker("left_bound", left_bound, 0.05, 0.0, 0.6, 0.8, 0.8, now())); - marker_array.markers.push_back( - utils::create_points_marker("right_bound", right_bound, 0.05, 0.0, 0.6, 0.8, 0.8, now())); - pub_debug_markers_->publish(marker_array); - - // show the validation results - // 1. distance from footprints to road boundaries - const bool are_footprints_inside_lanelets = [&]() { - std::cerr << "1. Footprints inside Lanelets:" << std::endl; - if (dist_thresh_to_road_border < min_dist) { - std::cerr << " The generated centerline is inside the lanelet. (threshold:" - << dist_thresh_to_road_border << "[m] < actual:" << min_dist << "[m])" << std::endl - << " Passed." << std::endl; - return true; - } - std::cerr << RED_TEXT - << " The generated centerline is outside the lanelet. (actual:" << min_dist - << "[m] <= threshold:" << dist_thresh_to_road_border << "[m])" << std::endl - << " Failed." << RESET_TEXT << std::endl; - return false; - }(); - // 2. centerline's curvature - std::cerr << "2. Curvature:" << std::endl; - const bool is_curvature_low = - true; // always tre for now since the curvature is just estimated and not enough precise. - if (max_steer_angle < steer_angle_threshold) { - std::cerr << " The generated centerline has no high steer angle. (estimated:" - << autoware::universe_utils::rad2deg(max_steer_angle) - << "[deg] < threshold:" << autoware::universe_utils::rad2deg(steer_angle_threshold) - << "[deg])" << std::endl - << " Passed." << std::endl; - } else { - std::cerr << YELLOW_TEXT << " The generated centerline has a too high steer angle. (threshold:" - << autoware::universe_utils::rad2deg(steer_angle_threshold) - << "[deg] <= estimated:" << autoware::universe_utils::rad2deg(max_steer_angle) - << "[deg])" << std::endl - << " However, the estimated steer angle is not enough precise, so the result is " - "conditional pass." - << std::endl - << " Conditionally Passed." << RESET_TEXT << std::endl; - } - // 3. result - std::cerr << std::endl << BOLD_TEXT << "Result:" << RESET_TEXT << std::endl; - if (are_footprints_inside_lanelets && is_curvature_low) { - std::cerr << BOLD_TEXT << " Passed!" << RESET_TEXT << std::endl; - } else { - std::cerr << BOLD_TEXT << RED_TEXT << " Failed!" << RESET_TEXT << std::endl; - } - - std::cerr << "###################################################################################" - "#############################" - << std::endl - << std::endl; - RCLCPP_INFO(get_logger(), "Validated the generated centerline."); -} - -void StaticCenterlineGeneratorNode::save_map() -{ - if (!route_handler_ptr_) { - return; - } - - const auto & centerline = centerline_handler_.get_selected_centerline(); - const auto & route_lane_ids = centerline_handler_.get_route_lane_ids(); - - const auto lanelet2_output_file_path = getRosParameter("lanelet2_output_file_path"); - - const auto route_lanelets = utils::get_lanelets_from_ids(*route_handler_ptr_, route_lane_ids); - - // update centerline in map - utils::update_centerline(original_map_ptr_, route_lanelets, centerline); - RCLCPP_INFO(get_logger(), "Updated centerline in map."); - - // save map with modified center line - std::filesystem::create_directory("/tmp/autoware_static_centerline_generator"); - const auto map_projector = - autoware::geography_utils::get_lanelet2_projector(*map_projector_info_); - lanelet::write(lanelet2_output_file_path, *original_map_ptr_, *map_projector); - RCLCPP_INFO( - get_logger(), "Saved map in %s", "/tmp/autoware_static_centerline_generator/lanelet2_map.osm"); - - // copy the output LL2 map to the temporary file for debugging - const std::string debug_output_file_dir{"/tmp/autoware_static_centerline_generator/output/"}; - std::filesystem::create_directories(debug_output_file_dir); - std::filesystem::copy( - lanelet2_output_file_path, debug_output_file_dir + "lanelet2_map.osm", - std::filesystem::copy_options::overwrite_existing); -} -} // namespace autoware::static_centerline_generator diff --git a/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.hpp b/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.hpp deleted file mode 100644 index c591dcfc73bd8..0000000000000 --- a/planning/autoware_static_centerline_generator/src/static_centerline_generator_node.hpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2022 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. - -#ifndef STATIC_CENTERLINE_GENERATOR_NODE_HPP_ -#define STATIC_CENTERLINE_GENERATOR_NODE_HPP_ - -#include "autoware/universe_utils/ros/parameter.hpp" -#include "autoware_static_centerline_generator/srv/load_map.hpp" -#include "autoware_static_centerline_generator/srv/plan_path.hpp" -#include "autoware_static_centerline_generator/srv/plan_route.hpp" -#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" -#include "centerline_source/optimization_trajectory_based_centerline.hpp" -#include "rclcpp/rclcpp.hpp" -#include "type_alias.hpp" - -#include "autoware_map_msgs/msg/map_projector_info.hpp" -#include "std_msgs/msg/empty.hpp" -#include "std_msgs/msg/float32.hpp" -#include "std_msgs/msg/int32.hpp" - -#include -#include -#include -#include - -namespace autoware::static_centerline_generator -{ -using autoware_map_msgs::msg::MapProjectorInfo; -using autoware_static_centerline_generator::srv::LoadMap; -using autoware_static_centerline_generator::srv::PlanPath; -using autoware_static_centerline_generator::srv::PlanRoute; - -struct CenterlineWithRoute -{ - std::vector centerline{}; - std::vector route_lane_ids{}; -}; -struct CenterlineHandler -{ - CenterlineHandler() = default; - explicit CenterlineHandler(const CenterlineWithRoute & centerline_with_route) - : whole_centerline_with_route(centerline_with_route), - start_index(0), - end_index(centerline_with_route.centerline.size() - 1) - { - } - std::vector get_selected_centerline() const - { - if (!whole_centerline_with_route) { - return std::vector{}; - } - const auto & centerline_begin = whole_centerline_with_route->centerline.begin(); - return std::vector( - centerline_begin + start_index, centerline_begin + end_index + 1); - } - std::vector get_route_lane_ids() const - { - if (!whole_centerline_with_route) { - return std::vector{}; - } - return whole_centerline_with_route->route_lane_ids; - } - bool is_valid() const { return whole_centerline_with_route && start_index < end_index; } - bool update_start_index(const int arg_start_index) - { - if (whole_centerline_with_route && arg_start_index < end_index) { - start_index = arg_start_index; - return true; - } - return false; - } - bool update_end_index(const int arg_end_index) - { - if (whole_centerline_with_route && start_index < arg_end_index) { - end_index = arg_end_index; - return true; - } - return false; - } - - std::optional whole_centerline_with_route{std::nullopt}; - int start_index{}; - int end_index{}; -}; - -struct RoadBounds -{ - std::vector left_bound; - std::vector right_bound; -}; - -class StaticCenterlineGeneratorNode : public rclcpp::Node -{ -public: - explicit StaticCenterlineGeneratorNode(const rclcpp::NodeOptions & node_options); - void generate_centerline(); - void validate(); - void save_map(); - -private: - // load map - void load_map(const std::string & lanelet2_input_file_path); - void on_load_map( - const LoadMap::Request::SharedPtr request, const LoadMap::Response::SharedPtr response); - - // plan route - std::vector plan_route_by_lane_ids( - const lanelet::Id start_lanelet_id, const lanelet::Id end_lanelet_id); - std::vector plan_route( - const geometry_msgs::msg::Pose & start_center_pose, - const geometry_msgs::msg::Pose & end_center_pose); - - void on_plan_route( - const PlanRoute::Request::SharedPtr request, const PlanRoute::Response::SharedPtr response); - - // plan centerline - CenterlineWithRoute generate_whole_centerline_with_route(); - std::vector get_route_lane_ids_from_points( - const std::vector & points); - void on_plan_path( - const PlanPath::Request::SharedPtr request, const PlanPath::Response::SharedPtr response); - - void visualize_selected_centerline(); - - // parameter - template - T getRosParameter(const std::string & param_name) - { - return autoware::universe_utils::getOrDeclareParameter(*this, param_name); - } - - lanelet::LaneletMapPtr original_map_ptr_{nullptr}; - LaneletMapBin::ConstSharedPtr map_bin_ptr_{nullptr}; - std::shared_ptr route_handler_ptr_{nullptr}; - std::unique_ptr map_projector_info_{nullptr}; - - CenterlineHandler centerline_handler_; - - float footprint_margin_for_road_bound_{0.0}; - - enum class CenterlineSource { - OptimizationTrajectoryBase = 0, - BagEgoTrajectoryBase, - }; - CenterlineSource centerline_source_; - OptimizationTrajectoryBasedCenterline optimization_trajectory_based_centerline_; - - // publisher - rclcpp::Publisher::SharedPtr pub_map_bin_{nullptr}; - rclcpp::Publisher::SharedPtr pub_whole_centerline_{nullptr}; - rclcpp::Publisher::SharedPtr pub_centerline_{nullptr}; - rclcpp::Publisher::SharedPtr pub_validation_results_{nullptr}; - rclcpp::Publisher::SharedPtr pub_debug_ego_footprint_bounds_{nullptr}; - rclcpp::Publisher::SharedPtr pub_debug_markers_{nullptr}; - - // subscriber - rclcpp::Subscription::SharedPtr sub_traj_start_index_; - rclcpp::Subscription::SharedPtr sub_traj_end_index_; - rclcpp::Subscription::SharedPtr sub_save_map_; - rclcpp::Subscription::SharedPtr sub_validate_; - rclcpp::Subscription::SharedPtr sub_traj_resample_interval_; - rclcpp::Subscription::SharedPtr sub_footprint_margin_for_road_bound_; - - // service - rclcpp::Service::SharedPtr srv_load_map_; - rclcpp::Service::SharedPtr srv_plan_route_; - rclcpp::Service::SharedPtr srv_plan_path_; - - // callback group for service - rclcpp::CallbackGroup::SharedPtr callback_group_; - - // vehicle info - autoware::vehicle_info_utils::VehicleInfo vehicle_info_; -}; -} // namespace autoware::static_centerline_generator -#endif // STATIC_CENTERLINE_GENERATOR_NODE_HPP_ diff --git a/planning/autoware_static_centerline_generator/src/type_alias.hpp b/planning/autoware_static_centerline_generator/src/type_alias.hpp deleted file mode 100644 index 2b7b99bfe81be..0000000000000 --- a/planning/autoware_static_centerline_generator/src/type_alias.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2022 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. -#ifndef TYPE_ALIAS_HPP_ -#define TYPE_ALIAS_HPP_ - -#include "autoware/route_handler/route_handler.hpp" -#include "autoware/universe_utils/geometry/geometry.hpp" - -#include "autoware_map_msgs/msg/lanelet_map_bin.hpp" -#include "autoware_perception_msgs/msg/predicted_objects.hpp" -#include "autoware_planning_msgs/msg/lanelet_route.hpp" -#include "autoware_planning_msgs/msg/path.hpp" -#include "autoware_planning_msgs/msg/path_point.hpp" -#include "autoware_planning_msgs/msg/trajectory.hpp" -#include "autoware_planning_msgs/msg/trajectory_point.hpp" -#include "visualization_msgs/msg/marker_array.hpp" - -namespace autoware::static_centerline_generator -{ -using autoware::route_handler::RouteHandler; -using autoware::universe_utils::LinearRing2d; -using autoware::universe_utils::LineString2d; -using autoware::universe_utils::Point2d; -using autoware_map_msgs::msg::LaneletMapBin; -using autoware_perception_msgs::msg::PredictedObjects; -using autoware_planning_msgs::msg::LaneletRoute; -using autoware_planning_msgs::msg::Path; -using autoware_planning_msgs::msg::PathPoint; -using autoware_planning_msgs::msg::Trajectory; -using autoware_planning_msgs::msg::TrajectoryPoint; -using tier4_planning_msgs::msg::PathWithLaneId; -using visualization_msgs::msg::Marker; -using visualization_msgs::msg::MarkerArray; -} // namespace autoware::static_centerline_generator - -#endif // TYPE_ALIAS_HPP_ diff --git a/planning/autoware_static_centerline_generator/src/utils.cpp b/planning/autoware_static_centerline_generator/src/utils.cpp deleted file mode 100644 index f84fe79cec288..0000000000000 --- a/planning/autoware_static_centerline_generator/src/utils.cpp +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2022 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. - -#include "utils.hpp" - -#include "autoware/behavior_path_planner_common/data_manager.hpp" -#include "autoware/behavior_path_planner_common/utils/drivable_area_expansion/static_drivable_area.hpp" -#include "autoware/universe_utils/geometry/geometry.hpp" -#include "autoware/universe_utils/ros/marker_helper.hpp" - -#include -#include - -#include -#include -#include -#include -#include - -namespace autoware::static_centerline_generator -{ -namespace -{ -nav_msgs::msg::Odometry::ConstSharedPtr convert_to_odometry(const geometry_msgs::msg::Pose & pose) -{ - auto odometry_ptr = std::make_shared(); - odometry_ptr->pose.pose = pose; - return odometry_ptr; -} - -lanelet::Point3d createPoint3d(const double x, const double y, const double z) -{ - lanelet::Point3d point(lanelet::utils::getId()); - - // position - point.x() = x; - point.y() = y; - point.z() = z; - - // attributes - point.setAttribute("local_x", x); - point.setAttribute("local_y", y); - // NOTE: It seems that the attribute "ele" is assigned automatically. - - return point; -} -} // namespace - -namespace utils -{ -rclcpp::QoS create_transient_local_qos() -{ - return rclcpp::QoS{1}.transient_local(); -} - -lanelet::ConstLanelets get_lanelets_from_ids( - const RouteHandler & route_handler, const std::vector & lane_ids) -{ - lanelet::ConstLanelets lanelets; - for (const lanelet::Id lane_id : lane_ids) { - const auto lanelet = route_handler.getLaneletsFromId(lane_id); - lanelets.push_back(lanelet); - } - return lanelets; -} - -geometry_msgs::msg::Pose get_center_pose( - const RouteHandler & route_handler, const size_t lanelet_id) -{ - // get middle idx of the lanelet - const auto lanelet = route_handler.getLaneletsFromId(lanelet_id); - const auto center_line = lanelet.centerline(); - const size_t middle_point_idx = std::floor(center_line.size() / 2.0); - - // get middle position of the lanelet - geometry_msgs::msg::Point middle_pos; - middle_pos.x = center_line[middle_point_idx].x(); - middle_pos.y = center_line[middle_point_idx].y(); - middle_pos.z = center_line[middle_point_idx].z(); - - // get next middle position of the lanelet - geometry_msgs::msg::Point next_middle_pos; - next_middle_pos.x = center_line[middle_point_idx + 1].x(); - next_middle_pos.y = center_line[middle_point_idx + 1].y(); - next_middle_pos.z = center_line[middle_point_idx + 1].z(); - - // calculate middle pose - geometry_msgs::msg::Pose middle_pose; - middle_pose.position = middle_pos; - const double yaw = autoware::universe_utils::calcAzimuthAngle(middle_pos, next_middle_pos); - middle_pose.orientation = autoware::universe_utils::createQuaternionFromYaw(yaw); - - return middle_pose; -} - -PathWithLaneId get_path_with_lane_id( - const RouteHandler & route_handler, const lanelet::ConstLanelets lanelets, - const geometry_msgs::msg::Pose & start_pose, const double ego_nearest_dist_threshold, - const double ego_nearest_yaw_threshold) -{ - // get center line - constexpr double s_start = 0.0; - constexpr double s_end = std::numeric_limits::max(); - auto path_with_lane_id = route_handler.getCenterLinePath(lanelets, s_start, s_end); - path_with_lane_id.header.frame_id = "map"; - - // create planner data - auto planner_data = std::make_shared(); - planner_data->route_handler = std::make_shared(route_handler); - planner_data->self_odometry = convert_to_odometry(start_pose); - planner_data->parameters.ego_nearest_dist_threshold = ego_nearest_dist_threshold; - planner_data->parameters.ego_nearest_yaw_threshold = ego_nearest_yaw_threshold; - - // generate drivable area and store it in path with lane id - constexpr double vehicle_length = 0.0; - const auto drivable_lanes = behavior_path_planner::utils::generateDrivableLanes(lanelets); - behavior_path_planner::utils::generateDrivableArea( - path_with_lane_id, drivable_lanes, false, false, vehicle_length, planner_data); - - return path_with_lane_id; -} - -void update_centerline( - lanelet::LaneletMapPtr lanelet_map_ptr, const lanelet::ConstLanelets & lanelets, - const std::vector & new_centerline) -{ - // get lanelet as reference to update centerline - lanelet::Lanelets lanelets_ref; - for (const auto & lanelet : lanelets) { - for (auto & lanelet_ref : lanelet_map_ptr->laneletLayer) { - if (lanelet_ref.id() == lanelet.id()) { - lanelets_ref.push_back(lanelet_ref); - } - } - } - - // store new centerline in lanelets - size_t lanelet_idx = 0; - lanelet::LineString3d centerline(lanelet::utils::getId()); - for (size_t traj_idx = 0; traj_idx < new_centerline.size(); ++traj_idx) { - const auto & traj_pos = new_centerline.at(traj_idx).pose.position; - - for (; lanelet_idx < lanelets_ref.size(); ++lanelet_idx) { - auto & lanelet_ref = lanelets_ref.at(lanelet_idx); - - const lanelet::BasicPoint2d point(traj_pos.x, traj_pos.y); - // TODO(murooka) This does not work with L-crank map. - const bool is_inside = lanelet::geometry::inside(lanelet_ref, point); - if (is_inside) { - const auto center_point = createPoint3d(traj_pos.x, traj_pos.y, traj_pos.z); - - // set center point - centerline.push_back(center_point); - lanelet_map_ptr->add(center_point); - break; - } - - if (!centerline.empty()) { - // set centerline - lanelet_map_ptr->add(centerline); - lanelet_ref.setCenterline(centerline); - - // prepare new centerline - centerline = lanelet::LineString3d(lanelet::utils::getId()); - } - } - - if (traj_idx == new_centerline.size() - 1 && !centerline.empty()) { - auto & lanelet_ref = lanelets_ref.at(lanelet_idx); - - // set centerline - lanelet_map_ptr->add(centerline); - lanelet_ref.setCenterline(centerline); - } - } -} - -Marker create_footprint_marker( - const LinearRing2d & footprint_poly, const double width, const double r, const double g, - const double b, const double a, const rclcpp::Time & now, const size_t idx) -{ - auto marker = autoware::universe_utils::createDefaultMarker( - "map", rclcpp::Clock().now(), "unsafe_footprints", idx, - visualization_msgs::msg::Marker::LINE_STRIP, - autoware::universe_utils::createMarkerScale(width, 0.0, 0.0), - autoware::universe_utils::createMarkerColor(r, g, b, a)); - marker.header.stamp = now; - // TODO(murooka) Ideally, the following is unnecessary for the topic of transient local. - marker.lifetime = rclcpp::Duration(0, 0); - - for (const auto & point : footprint_poly) { - geometry_msgs::msg::Point geom_point; - geom_point.x = point.x(); - geom_point.y = point.y(); - // geom_point.z = point.z(); - - marker.points.push_back(geom_point); - } - marker.points.push_back(marker.points.front()); - return marker; -} - -Marker create_text_marker( - const std::string & ns, const geometry_msgs::msg::Pose & pose, const double value, const double r, - const double g, const double b, const double a, const rclcpp::Time & now, const size_t idx) -{ - auto marker = autoware::universe_utils::createDefaultMarker( - "map", rclcpp::Clock().now(), ns, idx, visualization_msgs::msg::Marker::TEXT_VIEW_FACING, - autoware::universe_utils::createMarkerScale(0.5, 0.5, 0.5), - autoware::universe_utils::createMarkerColor(r, g, b, a)); - marker.pose = pose; - marker.header.stamp = now; - marker.lifetime = rclcpp::Duration(0, 0); - - std::stringstream ss; - ss << std::setprecision(2) << value; - marker.text = ss.str(); - - return marker; -} - -Marker create_points_marker( - const std::string & ns, const std::vector & points, const double width, - const double r, const double g, const double b, const double a, const rclcpp::Time & now) -{ - auto marker = autoware::universe_utils::createDefaultMarker( - "map", now, ns, 1, Marker::LINE_STRIP, - autoware::universe_utils::createMarkerScale(width, 0.0, 0.0), - autoware::universe_utils::createMarkerColor(r, g, b, a)); - marker.lifetime = rclcpp::Duration(0, 0); - marker.points = points; - return marker; -} - -MarkerArray create_delete_all_marker_array( - const std::vector & ns_vec, const rclcpp::Time & now) -{ - Marker marker; - marker.header.stamp = now; - marker.action = visualization_msgs::msg::Marker::DELETEALL; - - MarkerArray marker_array; - for (const auto & ns : ns_vec) { - marker.ns = ns; - marker_array.markers.push_back(marker); - } - - return marker_array; -} - -} // namespace utils -} // namespace autoware::static_centerline_generator diff --git a/planning/autoware_static_centerline_generator/src/utils.hpp b/planning/autoware_static_centerline_generator/src/utils.hpp deleted file mode 100644 index f4d15d3dcfd4f..0000000000000 --- a/planning/autoware_static_centerline_generator/src/utils.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2022 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. - -#ifndef UTILS_HPP_ -#define UTILS_HPP_ - -#include "autoware/route_handler/route_handler.hpp" -#include "type_alias.hpp" - -#include - -#include -#include -#include -#include - -namespace autoware::static_centerline_generator -{ -namespace utils -{ -rclcpp::QoS create_transient_local_qos(); - -lanelet::ConstLanelets get_lanelets_from_ids( - const RouteHandler & route_handler, const std::vector & lane_ids); - -geometry_msgs::msg::Pose get_center_pose( - const RouteHandler & route_handler, const size_t lanelet_id); - -PathWithLaneId get_path_with_lane_id( - const RouteHandler & route_handler, const lanelet::ConstLanelets lanelets, - const geometry_msgs::msg::Pose & start_pose, const double ego_nearest_dist_threshold, - const double ego_nearest_yaw_threshold); - -void update_centerline( - lanelet::LaneletMapPtr lanelet_map_ptr, const lanelet::ConstLanelets & lanelets, - const std::vector & new_centerline); - -Marker create_footprint_marker( - const LinearRing2d & footprint_poly, const double width, const double r, const double g, - const double b, const double a, const rclcpp::Time & now, const size_t idx); - -Marker create_text_marker( - const std::string & ns, const geometry_msgs::msg::Pose & pose, const double value, const double r, - const double g, const double b, const double a, const rclcpp::Time & now, const size_t idx); - -Marker create_points_marker( - const std::string & ns, const std::vector & points, const double width, - const double r, const double g, const double b, const double a, const rclcpp::Time & now); - -MarkerArray create_delete_all_marker_array( - const std::vector & ns_vec, const rclcpp::Time & now); - -} // namespace utils -} // namespace autoware::static_centerline_generator - -#endif // UTILS_HPP_ diff --git a/planning/autoware_static_centerline_generator/srv/LoadMap.srv b/planning/autoware_static_centerline_generator/srv/LoadMap.srv deleted file mode 100644 index 02142e60c0035..0000000000000 --- a/planning/autoware_static_centerline_generator/srv/LoadMap.srv +++ /dev/null @@ -1,3 +0,0 @@ -string map ---- -string message diff --git a/planning/autoware_static_centerline_generator/srv/PlanPath.srv b/planning/autoware_static_centerline_generator/srv/PlanPath.srv deleted file mode 100644 index 3a8d0321ffb9a..0000000000000 --- a/planning/autoware_static_centerline_generator/srv/PlanPath.srv +++ /dev/null @@ -1,6 +0,0 @@ -uint32 map_id -int64[] route ---- -autoware_static_centerline_generator/PointsWithLaneId[] points_with_lane_ids -string message -int64[] unconnected_lane_ids diff --git a/planning/autoware_static_centerline_generator/srv/PlanRoute.srv b/planning/autoware_static_centerline_generator/srv/PlanRoute.srv deleted file mode 100644 index fb50c04b0ff26..0000000000000 --- a/planning/autoware_static_centerline_generator/srv/PlanRoute.srv +++ /dev/null @@ -1,5 +0,0 @@ -int64 start_lane_id -int64 end_lane_id ---- -int64[] lane_ids -string message diff --git a/planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-left-right.db3 b/planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-left-right.db3 deleted file mode 100644 index ed3448772b794d73ff3e094907bbf6343b59585b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2740224 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νVt})$~97fLnKq>nRNLzOQ-ye=~L-B+v7`eO=J| z)8Fk!_j8?c3%Y*EkM5c0S3R6i@0nVU?i0J#+cb|EXOI4~%eWNKUDpcTy>|%xOz4jO zdPNg1bU)}Kq@!Djg?H)bR&vn_*QwHG5}(?o4eesx9@miDf#D!W?ulh#Y23W zj01Fkv%+_eZu=BbhgnyTbr{Qy?t(Ol>%NaeOIowzF1j6P(dia9x`QN5!WP}Dc^T3f z>^vItJl|~T>T`!8>__(}=UNJ1F68%+=1lJTX0v&7YdyN>wCQfsJnk$yv@YURq`T`_ zp}W`Y2Ukt#UKy6&mFz5NSLY+$?O$>##RZ~UyDz7%6unnex_15_Q{I7n zw+nX56eu$hdVO&}RJ-+ScHt}WtHh$$?rtByrZabR>*kQ|MQO#MB`eu+Ug;+f&Dh3m znWU}i_P2CP%|rLk>^w4gp6}XsH+#5!Xg|7FUH{;@@3Z)$TX%XU2lstdSL^NWbGorM z&0|dJ3%cUxu>a5H*VerI#i@<0^w6NlS$j=-$j`G?8!kQc=Z1ktkRF=<{3?2tofx%d z@rSU=UTr??*Q1AvO5gwV%*h0*UuZX?bkyy zH!W%UeQ*9%cKr1or(bV&rq=5rO&HL-)t*JluJn z@4@}(-wwWIKf0HVSnZYP!@tTBYa?2Jzy8Zwk8UEji*54=K4I)c=a3p&p}YT?WLFcq z1)c|5aiP22g?oJwx_|IHuR=DY@-UTv(0!xfx3N187L_iZEJzOmbVD8Ao-=^%qPlZO zNC4ddn|zNQ957Y%+YiB`R=F!UW48}J(Y$qb>e*huvg5va{l4LC6?ca8=SW{N=e@%< z4&Arec{JyFzD>VeoH#{mKe`J)YQ1ET>oNY?t>yKvPW?bq>pdjG!?t<6+kD8SxOGT( zH?Tr?zZEeBCUg(jN`-Ktd+x)SrGV~x2@wk4({4wo&1aYJL>VUraTkqf7r(?&h4LY{v;tXzd zpSk~;;N9XMYn)~B6FU#@zp8$|Kemkwo88C${Qv%TUmW<%{WveW3qAk-dDg?6TCckw zEqi3sJSMHYs$5izqFcdM=uT8E9cx0j%d*s#Tb`vPuNsH$F6=x`^E}_@L899a zyV|e2=bqX=DDx`6W%9J4`_#A1?@nKU{r{R~sdGP1acT=IJv2OS(*TnmdNVtuBbOfP z-s$R51M-lz<{Qx}dqQ^Y)g`dX4*zA{H&ej>@Ak>FuRQ|)-|dTY8L0o?&?8fB42MxJAN(uRNHi|So&R?>_ex2dtdRsIfc59v%pa4?$Hsc{+7jqE%w z@;qO3uU19xme{X{Mm=g2zUc~o4(UqF+U=ivUa9q~Y{$Lh-?U{OZ~g7_AZ`&_Wt&@} zdzkN;-%aSg9daX#3*GZS8~O)A_npi~a}c`a%|H1Z?IB$s`upoQ0Nv;7{utU4a!9@& z?@mWi_IJ+uwnz2^vs&JYTamw;THXQis)AP`su8J`)GeLg?-`ms+w7(4GBJ zP~wY6ib_{5-rZsVp!@B8eP^Hy>1_4Kv&R6smyzsJ2)-{&808&a{fPH6lK z0VTh&{)F}IPx7(Im?b<2%ZO8%l zdP^EK7*p&0|KkVlr`a+O&6^t6A74P|Zfb?@A!|p@Frhna@`84p=>F&a6ol?6Lq^U( z=w5gErH_#R?>aK;`q+<)O8X8fDb@qJFE5ywiK<&f56=8P9?+e9>Oi|RgIJ_|{;N6d zg1L2fo!R~y&bRd}nZ}OuU*-1YcgwiZ9i{$o?!kBdtZ^PvJ$4?$c%IMO`0eY(`SzoG z)*CAmXWFteQM`0bnD$)lum2Ygw{0FT{;(mhuQzv^&i=m3*8&{e7A_s zySe<2&i@yA9N&h}y=?#HX{$hY?`*YW^#icG|K2iT=;wg$vHgl}quQ-T^TMUS{V5i8 zU$sB7$sBHUzkO=Wg~Ks_?(4>m+jnW)H^=|rMz^H@jn*?gZ`3$+zsJsF3D5IQO}IGg z_i+2s?fys3TR}cH>`dG}%Rf9Rqt;s{bEd`GG>KwNoS`>Ct{`twSB?H)T^_xw-)~X+O zl)c@ZuT}}eTh%xlaxpuP4m{5{wrN15tC#&zcDFS@zaJTMl;5*D7Suhd?RW3iR216$ zTmemOn#aPwnp~($ci9QGLiea&rxlrONJafiUAfR5ar9CeLiZmJAI(GP&fD?8clIv@s%T94>D=T!5{NOVW6S~*SHh1Ad_n5Rj zN`&qSgETa{M>Rcs@GzkJJkM=yz7qa*I zl}6t7qx+LNKP+j##|9g+%l1a!bsb#m(M_B`VADKSj7c_bd<*&iAy()fvG~Fo6S}|F z7k1`C_r7M&7a(*ePW${Bq`QYTB-R@N-OHb?7c~=Vx1u{vx_BHsq*2TN3Ah62e!fB1 z!-D|bKA{uuH)=3d6t|@9w0=9d(Ot*C?XAEL?Mk|{;|@KXld!iHH@f?_xUss!`;BTG zy6ds?7{v2@^=I_^?!gHA(e3xuS7Rm&ky1(eVeswR3vbVYN#<5AFsiJ*<-RvRw zn_CZgpMN;^z?$%qci3_3{{H1r1Co1{ojPy!rB4@x*0@zxz|KR=^L%$?`pFl^H{kc< z%Q5hOA=~~qm3Wf(d&7U6@&1eA{912A?*0A+o96Lmi|)M^99jjdY^yRKo^M}}Amr90`&Ze~O&7F%w>7{2A4aWy{Z^r>)}x!avd5-*95_^*_yg_#x3fa` zxKrJhn9%+5oIO!o=svt>bvi=#sE2NJ?Dm@#N&D+U>~>Sr(Tyh_Eh-&#>rt=y+Y3vR z6;nP&)h(`n?C6WCTW0L~zH_JJQ$&aME500{<3_hf_?sto{~caZ%8qL(d2XSrfE(Sz zG6PD6-mQ7)c4Oy}#PfWsFT8PW>3sWhNWnRi+cdpugAG~qT-MG9np%(UIg+I|&13D3 zZJQF;BM+&q6}rd1c>cBt-KSri9?6C7UAI<@L+I}G*Cra>zaQLktuvszp5~jqo{*WC z-nj8{-Oj?&+5T(SpvuHPJ?fuEm5JvJRPNaWQ$*LK=Qb`^aHHF0^yrJ%j)a$7VaFY- zKQJeP;70erM!)u&{a(#OH^I(h5YO{%CNB5*{FwddKAmSIPk8d9dy(h8pSQc5s`co; zI+nO&%RC13{-E2Za}c`QSfP8&sJ#tM=$7s36TyXU-E+SrBXp;=|Aj{Pui+ij;{n~f zo7VsI^ogRCaTHXy;QW6%N3F*GS)AI%N)JtKoG}IIp?|J)NY6Z)MsVq& z24k}Fksk7Rxhd@-QQ37b4FEl)Ty<5k7+#GyEZ0wdDGl3CCk`xw@aG5F?1}q9$KdV$Mu3bq{jLGud?%a zndkX}_Z+$)njOsR$CrnZJZNUVFqVInB~}@m{Z)T_tzTt{&x2doGLIt7yZs;171Eup z&^_hy=Fd#4YzOs;crJ8*J!y0yLicOO@6pk%sD-`yqYmlE{C2s#4Lzj4SQgzbZ$n|} zjO$Bf$p8N|{@EPVLrSy$bImzIEZQdDo&LWK+~|%?oVWBsaRf z_qW|QV{^?zcN9AhFP`Uf6~xbd>!AJUCfeVd{lY{3RrYp!(c3#F9IEx`UNtc99b4wH z^>&HRhbxc`*~tpslXo`oHlcf?Y-Jo5y4RmBrVzS2JUULJ`<(Gi*H(b;ADf=|*>itU z>4>#obcxznSo-Uh;j>WecK6AV7g6l?SHC%z=iHhia&I{;vF=iCbPrsxYma<#*OCV< zm~o0*E9S(J?5^@ zuKgYo(c&xH=CQ5cVdnh5j#lWNRIsP93Ef|fNsr}1_p0vx^ANiI6tB|ge);Z7qX(c{ zHMht4rO=u9f7b)<*4b28TDNh}g{c02M{oBeR3W{-{mrw7CQTKsefYwluyF4E|2g}T z{|F2gmMmw-MeM$I>6NA2nThO+Fa4T2uI5!HD%g3bd7f{#V%!H?KDS?YFKv_(v#%w8 z?3RdKHSe{%6W%Xx+0?qf=WVxX9!Y+w4^m%4y1RoFx>Ni595)>`_qPd0Qvuxv^6v|Onk*5; zDZ>7|@IYD0McqA7%a^^=F}x jAZL>$$lRGdS(iQNlJsjeKgJ|Nk~SkC8mj_x`yY zZ`YSva?X#7PVth}6DGX*8SnSr_-*7$smMl9h7M-s?IkZ^^xeHO~Lv#LnXvp6AOyGs>@Zu>Ce<+p*qtN+0p}kaFAf>T?aH z#kF1!DZ&aC+A@z+Idmwe_y0#&p#eKv3to@n0%Z``#Epen@(;A0vDLW5$p64rC;vN(_(taC~C^2@t z{5Ag$>3|8UJ~ulrul492^+wOWw#;Mx%BG*LUWshTa4U36*F`op>F(G%f4Fg>Tl7=^ z?FikCmN%hmNOyK^6u$w`-RQNuz7fzNePWNrFFXh6Zsu8MBFd1?-Kg|NC#1Ezw@2{% z@+qP^-hGcW9?FgG_ms!FCcoXWM8J;QEZDf}h0EON_USIY-TOrI8i(#(rg`u@-}M^> z7hA2dAKlj{b{>0G!ynxu8fy**w0yJHqnkMO>=B#h5jSpQD|&~t&*@aQ`axzQcpJml!D4?C9xv*R9|I68i(f!i{fBHQuY2;Z6)-HK-C zF`4K2Vqaa9KTu^qx|25jFYSK|_&XC3Tc*6bY-`Wj@BgqpPm9c;hdeNC)8-E|8;x z_QI(8C31FLALVDh30JsnNX@S2y9aOctZ_EvDs~@$Vs>lRT|y!Y3}ZewCebey&aP$m$k!`4(Lv9c_hf`Jz;V3Ej_!T=nKc z_fOM`e?jObUYtv#d%^4`y@mq1w+E?R=70@ZH)B`FkHACHpL#^skj5zyP(_p3>D zzZmW>7PSald3)ho-00qSNxNss7mZ6AvEvfwZT|T|FK%?dRr27okc)mb4&86D^Vr1m ze663En%Ute`_Ucdvv|RvUi`INJ-Yq*`SJ78T958so10#+WgZuHd9OUW1bIl^tk9jQ zK1`X=?XE5L;zDNUH_BoEl_uh z@vp~>Lg<$I%~uVhE1sT=qBziv~3=5-niM4woIa| z(4Eoi*SjWkYs2RXxX>+$Tz?Otd+DJOG`c(Y{HM?NfbK8O`o8lqod0+3<}3G)uPrQ1 zSkh6A&@K6D(+#x$f5D}R_h0duD!Mr$e%%|Zxbtq`?>YKYY`xHutL(S~_fmT9smop6 zvc6N?LBEbQZ~y-{>^#=+JfCXI)=jVXw;$b!kvGHq|F)sJR=?(e@= z>us6G!jD>J_<-)l_5Zbn!^NpRt@MzFIB>?Khu-{WSUoO1H29OYden#XrBw^3Bme)| z1&tLSfd8-mLNmQ7)R6ufI(}^u)R5-v3XMTsb~Z=-^f&4u^?8?ukB$hYil$B6J-6cu zZaow?HfeUxIrsLF?6?bE8{Tgez^#XV_xK@d+{0@%t`BJgb{=PVp6~k;Q~Px3ZoeK{ zIBre+mr48{(qEVI-NJvnQtSQyJumBRnn!Mv(2;ETC(Go#`V6m=^nR-^!8mt->wNY@06YT>^#=- zJl{KYIt@-}+T90mGlE}7s>@N;n23>ZFQ{%1Bt$y*x zUM6(kns6zQ3*CjgdbB|3?zlU2HbS?{=^^hO1$3{QwQurLK)3F0zn{hfx>N4V`WQvG ze9r%$y*m%5s%swyeoBTUWoSYfGewcgY|B_kQc{^^D$0-{m6=GWOi2+DQbb6Jvx_LA zl%WifxsnWpkov9d+2_5^Kf8T=ulM_V&iP)w|2?(d+;`Wfd#!t|z1NoTMLMLde4)FD z?=7Iut~&Ap$FX&bMgJB*8nK)>fR20L(Q>n`4_kMxa@Y-euZ2|C|MQ`F+{B5Gsp+R~ z!RPt+|6hs@%zkObKSL4}6m_V%Xh-uM(x)f}it<<*#}T~K7rEV1o=o@g1A{>%-IDs5 ztXR6APUn3=IwYULin$Ic_>L-DBhY=eb5V~H&>fR1Qu_$(-5zJ%LXYU)IHT8$?A;n( zy3=GiU;%9z+`KWy6I*wGiO<5Y2W&(sbe!zXOM0h=uywbXOJ5qOq@z0BZD<~^aN=9z zReYLVYyP^wXFqD&?uTEy{b#d}a)gZ+)5>}oGtOV@94W~o-~V;Nt2kt3B1fkCn8@%Y zlJ1F(XO?2=_IQ;$r#pf9>AZB;R@mORXfTJKG4jRA`C;$fM(yz~D@$W1R-ofT#`D_i zmSOAeowX}9sa-^Mx`WU>T5;mrIyyK1jzm)eM3hZdikNK<;SRE669dR@^x*m2^^-?vGWE@1w3sO^Vv zpgaryENgByGGTojfgVrS7t?G=cuyh~0 zZ`p_FPI9qwM|2ltYG&O9x-In-#%_TV((N_^ANUJ>V6CSH5Bq@bGX?5B>Ol8$hdl{47hj7Ic!LJjOPZ{__nfh)lPKkEZ}h_XOSR6{ zIk9xVG#Do$x{DO=dm_4rq<$zC0^JJg@JC;8GEp_ScFh9t{=Z0AepnCCU6u9rt~Suk zCczYZL)Q|zrpoX`d~1NO={~Wp zEdL9t z)4l59KY3K(#Anm<;Wk_Q{A>3)%`+L-i}26g{Iy$a&vkp!{>sFvlcGF`c0zXsz?+GG z&;S3o>-T@_&kr%tBCA6_eZI`3S@wn8)^%8QsPnaC0aAzDeIL)wvMu=;FOGvcRCJSW zu^H(9GspQ7=n8z`rmvUtkPgZ7_BT!qP=}U>_A+aPSU_CfooYMzvFp&0yJGjOV|i6p zqT_@u9*s+-V0TDbtFryhC9_f88qyWbV<%30&lR~(?L9XCI&|@rI^*PX{5nLK%=KCM z;{U)G(#^m5Qj*7Bo#~B=_mMTECYkOt#ryvAgmmNiX&x-yd+WA5M|A7{PMYhG3UB&n zoCLautIm(V2k-xj40q<$6#2la+AR*q?v@hE$9iOUt5w~O+u6VZYA^UP_IMO~mwnr< z;LAgT{3HGE^D&2!q*+u z=x}Sv<^weUlwEXV`fW<`(3t2K*gN-ybPY1yr+sQ0Nwr&lRSh?mZj+x&I}zPK?f%)_ z8vmRo9s+a+YcJla19U&IpT18I_HK(8dEJCqL+d;JI=2nh>m-INl_Hi#nvtVJY78tkp5qdOt<%{8XJ=CSUtNnSh@wy@23v}y1i|V zxFNe+W+xsqA4Zj_|?*l(DRyl$^WjC29 z7JxiMdauATYKGksiqv6wy!0M+9s2gX@vCPIm&!SGoVM|$%=|xmW%qY%$U%-i>O23R zLGxG`_viRp_dy~JZ1b-}rIvOhTgvgDAtiJuiZyho9!>yYUV zOfIS>=|0jtEP$o^dPv0F`TqmAy16xE=`I_>N}zk~^gzl(@C@nE>S4NCaQ-iALhL}E z|1VctE`@w$hsjlLpBJ4a56OQ=Y$WgID|M+R`alLw;{&JZYsz^STLPjTGf^ea#s2 z!@1hMgG{&oj!P9J-G?ed`LJ}aX6d+&=nk>3@j^PJth@J`?11hqva9`HfRhOo4d&}t z@_b+kr**%Pr(49ouF*rDZb=-je@hSEOx*Eeh4<2H*t%IH)w=gjuTjxJ$7M}T4+;O_ z&BRlSMcBK4vQS;^=0x-G!-?;x++L=lYxCFrZp)cIn{@mqqyvYuHXiw+OY@>TA{`RjJM9pqra zOTm+gMDfzHDNCByO<*=CqbQG#ZJ)*de*f=(yJ`O~{`ny$24r>UTn(cTsSYtS@`z*A zq3Ea8?#L{A!%<`I{eSN7i+QxbEZcu-?QW?&aE27#BXJtMWj8ds^9r(te5?QX8}b~| z$9GCC+NaH-zIPU;DO<4XkZ+LV``5$VDj(2sS!0cl5?)~6|M&Z1sP8@r>Z?N`Xdd*J z{v4l~bEL397stHs|NAJ@a&WeXg8Tn&xUH4C!1v(42F`1;hP3E&GmhQIkMR|yB?bx=tr&}rxRt#SOx|6n4bEOu6cSzk=F58;z19yBp zQG)dUUw&;2N8bN;jAh#+$7}(;tC2o(t`J+d>hBesKDF?vG@|2dn_isRp@KcjvVD8& zn^nh7b+fEGng=INd{TKC`xGC{U$-dNhMa?P_~-wGc<;xLb{EqAEPJw#qCE6m)2sL0 zLe`M_WV%Cbgat{uSqqCruyk+p+&qftR(DxDx4RXe<@cEp>~2MuipeboZ?~9!Ene~+ zbV!gAXF2k9i}e+SQpgw5<6=Gx76ILbr^BxC)MfRhUT#YC%%FMmm_Ac&VLO_$NuxccrbqdzeUP`d8$!~=KFtUt5}Ni&>NNI zH*iOGw|0@~KD))km884HEmRmw_h{LK9C9)NRTG?%{{Macsfc8t+visH?>z8@G^Xvz z(Tl*-Egfswa*+G~HLi#B8UWqw+>0YU4x*kjS;nO#G5#7^oJY5joZ&{d&P66HS+}fWb%Y$Kw zg7Z6H75l(4Crap$+O6%$R)*AWUPZCvFSc4jQn}F9^bu^`-tSwDD<#&cNTB1cw}(F| zIf#8S0X66swlyuMy4oFp=CK_ozJ?>O-&}by|Ju!7^eCCt9sj#q4u?IL!y$DvulsCf z7DaiS3#$%gjsAQ8|G(25{ZD>sh=~zd9lG$u_#UYa1wUq!!m2~lQ;}`5_u14w@r>9Qim#BkHxNYGK0j-x#Wmy zM_{ao*Hm!xdcJt4EQpSC)EwO7GvPLvZ0a*Yf+^UC9ppbH>CHG>5hu>_aNyGc-p=ZOSh0n z_)0{#=-G-n-L>qaub%_m)(cXC`P_ry;K>!tl`TH-#=fBnWOwV8+{^&d|3@w4+ATb8 z22DQs*=A`Zv)|SjZ=5?J-AkrB(oFX(Nq4lv zZAmQM@A~aI5Z(4sLvy-~PJ3$90NtylMPpq8gJJcXH8aM~ePH3m*{_fj(ycxvzR2CJ zwyUhe0$-Xz_QxzG&L?8)K36HZ;pi$l6>D^y;9_&}o!hZ>NAP>Z1n(NBI^8j79#?VV z`~B!boqNRmJESKpF|T5}@O2yP*{h*)U|3s<+3PiUGm)pc>=W{4;sJr# z4lSTNz)LW1L6I4>;qEtg{~&DLVQUBOMqXl75kbf8$@B5Zm%!HTTY9;Nk#zypbx5&j z9w9jK)v`QUF!px-wL4+=qrUV|{M{|WnUk)vskt<-o1lD&qC6bbc4NF6%$Wq*wxm}QfP%K7_# z1i{R{@#W`F`ofZ|R?m=K_D!~%tFhP%9htd*c%!5_fi4N$v z+m|*mZ%oCmLt}TvZd@>-zI#Zoqj`MBi7)Af%-NQ~`OmV)LbfJd+KT^{-R9fD{zYd> zXnr5^>qDPlO7bY#Yy8q899csiB-0%m6{kzmt-P^m3zqJyF+b=DumrFeVQt>M8|O`N3E<;!miyXTg9vWh^=xk+1kFt%=WJFU#aE4#{$q2mndn7cdv(EpzrA;g5UHBg;yJ~R&qC%$0ib;l!X=C7M8 z^qmh~F9jzPKTgg%x^AX<-GoznDa+%;hm9NNo=n_Nru*U-rHv%rr{1VYW9cTomE)P) z-D>ul+q>Of-Cte>bU$x;ZY*F1-n%6h$ybbn=We$Pzd@c%%$wvwXM{#;|VdbAge=H zZwxgfb%@X-W+#zlO2Dc^uNj$M_=8zC^=?))vW6Udx9Ob%s6!cA&vSLsg5cx=&gkTR zU--&4iPZ?^(@1-9eaO*X zt!PT}SU(i^4)-~J4Rd~b>GF6RHxe?&EpbIe47Z%H4ih+Uw0#2)2Ux=_#G0#Sv~c9V*<_V zCiKN0p(Ky*EhnNI3y}`Vj7;|xb#XvoHUiOoVaaj^C7^q! zoc5=sbwTj{HSB&o`Mz-5_SpnPx4HgctvS%my#Eg0>Nazzm$ND1djz)bAG!Bd=QHyY zyU=mI(7lFbT-drB47XilT*N_jx+l>*>T%+0VhOD>**AaP*^6|9WXABxgOSIJxGW#U0tMtiaQ|Ag3)%0h=FRHr)#&Eq0Y ze5xIvEhpB_U-v8N(EU~Y_|I+;R8HGoWznGdlLu zh=~nZ9ZJo7d>g4lNdKR|_z(kD9kLkrk30kFkb|n#D`b}Ky`*|O%~?iOIPqd>v0)Ib zqkF`TYrh}7rQPa&J(y)}cm<5Tz%1Jnc>UlNV{<5>#^-hVYV0~xCLdDE-|9k)L&sGK zsB5|8W7naUlcI5V>a3}*4iV8jT5;kldKLbnkh-<6({cLut(6&D5}XmCI^EaMJn-VX=MdoFdvE@_ckf}}e6*Z`+by(jSk~Xx zqx}<7?IeowSRTdKBangAZYwg~$t-!>NV=biRxQNR&AXKE1)|$$>{$w;drI{48amMb z8;x337P|+*dxc&f{UqcEJF2by-2!y4_c`Td2Xx2xD~w&pHHUT{eIrb;!`3ZQ8NayY z$tI#UI_`ItrpdqrcI{5>C~qt)=BGN{>(M;$;(NsHwlIHY{<_UAu!HHFtL_vhE(Jj#_}F+x{%)Rpews?}}_3qPr<_ zjVp5Q<{$VZ^ksAq+%Ns(O4*Dr?0bs-LmSY&Nl8P=8t6V4B2&|S#sad7+TVY69rpYG zk}OE3|mQHB%W5eK7-0vG20{QuG$-mH|2O_WAtp!2>QH9fW+l=r3zhF+ z!Ky>hx!a~5pbiD^h~6d*>JYSdiT7u)hOFXRqxMZC2>xW+uk$$G5AI~VBJKj}P;a;R z51uU_pp;!7=?fVwArbqJacN($bSO(cygIX`=LiVgc765rs?@5-i0R9A;o z(LDTc;GTw{PTZ;zM^S}TNUlsA-gh) z@_2L5aCUhob|>jR`+e;aEZyHf?_%--y4wm9*CDzs_e&5Pfo{hK+np~- z2f>fuHl;9!`N6tr=M6)E?urKjxj(=xo6>Hf|FG8r>dW{2s_cWU8_NvF z*#ze;8pWPvhuwpp=%~k2o$kkI9(eIFw(*}HapQnEu4LV2^u_Pz54}ja8>VapN1vdp z)p5bUWvBM7ARj?Tk>=Ns52UIn%0t#DhSBak@^p(mneLlf)6OK_3^^YcW9jx4(g`~W zbjL=lSd8e_4M-yv1KkR5>;*n51;O_+S`zX+{a_x#(WXS8+s|lSX#>#xbnE(}15Yg= z^=N_eDGO}fvLYW(T|Rk@sEUr8^^09p*^I5b#dK#~LR1Iqn@U%J*3w*2`PLN&?JpJYP_7hU8ajqquP!&FdyKlu(q%cR_;)jTcDmwj zHW5B|{*QD>jx~3guyk{re7yV=(CsF*>KoD_`O9&cUjVvC&aRm{p%VmKvMc0ISoy(b zp(<=eKzDia(%cN7n?YK8D7wZ1a?>p`GqT0jopYgh)2%Df#N+5V){*L(*fwn4Z?vB2 zJbN5Wb-HuWJn-Vn3r`Wbeu@K%=(Fdi z`IU)l5i3P`u!@c8tPezLw=J3O8?D;Xq}u)HMIyq!<9k_|w;kCb%~dwnCj?7yb$|ZRbMb}9KA675 zw_5rp1^xd_t3uM69W<|-u;>#-dDPoxe6I&L6aDS~|BYV$fATX!OpcS)p`5UNVWc|5 zxfNo^szXa(4XZeUI;0@F=sB{6>_{(sy$kF^-eBWZ{{A}<{-OA?)41Lb-ll)GbtR}n zgWTM5_d)-!=yG*g{A&y7<&3NU!(-U9Y{u1Pam7QAiKKB~p7+LF?!lgATW&ndH|)Ac zb#;i82VQ(G8GgbtitNy=u;swYm9KH@P#rh@2{$=AI7Guf+kzQ?zkqNsBYDZ;H#A>| z{AC9y%0qUS)3c1Z8`6%E>ArI)_7_RFR|zW{mTnQ@D<_Wu-Q!%dnTT#KNnS@~pnJ!g zlo%pI5FGZ<^$FpbA8g4Z>$wH!_9{MdB?#zNlF6-na@PV{{cFmFcQ>}~9d8;n_*Ke? zq;V$p&LxYVW9y!6`~g4J&!alsI%pnv@m<;z*}Wm09jZ!G65b(MkE?sZjp)b&mkeON zT7JRH5dJJ1ywrX$xK@VdJ0#BKxfJCwd*ji|E0IWtIH=Q1qaTWlDT zoPq8!Zjp0{?v1K>Mj}A>+MvwujjTbiQtuS8`jH=e@#~8(5YTP3p`pV!4|a#%raImBXdaF@@i}+u7{l%C zP|JE=t7*1ZxVj}ajT~=|Gk~q#9&J-xg8%$KA?2#~mMfApubW`NPgx#}_wWAmbc-XI z?px#e7fHHZJhNG`bTc}|&8A-e0AmWVR}-5*zESNpCGf+Lo9Ewst?gI|tR zZq^67>$b@#7z5oq%0BMs+G`2*r7FaCOE|$;YpIG;PIc3ng~WbzTzuy@&9o@&lZndB z7e9G3XHuPRQXWrn;@eoPG@X{q4ka*XYyHf4fvbDZR_`T;w;Y7~u4*j5xd?ynmO#{C z3$|9L`IQO5-h-k%l(xM6xpVI6mZN04vtD!*k#svd_%6lLeUvxl!3m(d&u^_hqPt6a zAJ+`n-73>BvCQWUg14V|_u4$o4`yN5{QeNoUHJC8*LI+Lxb8yhgoGt@qHRx7Q$Kd? z{wdM@+mV<@bVtWk6w|d;?8er;s627vQqB#k(>;skffwJV>~_Yt;AA4-#-?t}3;!Ig zH=TZlADp}8JTMH*X2Ac~a7U)f=*oVW=5?n>Z`)5v9*IPSQU<@j_y1$f9@O{iAtoot z>QF&Y?juqi(%&Sz8mkWZ)=G<6f;u#^`=tG5P=`VUo28K((sI6DO@}@N!Y{7~E##W; zgNwd*zsrsvgz~u*6`i+!fCQ~htP#3x0X=12^eR^myAC~bHN1b}Rvobd9XIe$E9Yw! z_8PMAK)i(JxyMvjhpNy#@Zy{P6&5+E&kiX>^&Ci+ZNi;pCCmka=}Ii&zFK4~Cr^F;<{6P@)=P@=xNL4HJNK5I8=3BVyYE?$bZ=TizY0tDvd%~&YoPlH ztK1Gm_w$TL`Bp&pF3lw&O#OlIz_E~TCfu|FOZRqSv%3w@{Zp_|4AH%e;TiK`p!;e^c~9q;K-k0QeXH(AKiEkeJSz=! zr{#u4N&?*~QZ2z(z%!&WSBp8t2Qse0OjPw(i46&vUqRLrh%Abl)BN?n2V7U6Rg;rMt%Q!b>}#`#`{FMntz~JMT9{_sL?pM3(VD zIHOI&!?@EAUc+s(s~_l=KH0x@G0^?iw6V=_vn4bdbp5mF7`ARNz1K2Fo>daZ&~cpl zuQRd^VRuNma=u)iJ0DP;Zc-k2@!k7TFzP1>_HG~Vw>)_B4X$oO34W0)Etc?R?%wG$ zBNRN{GU6pG+ighm9TMTiFhzMp+_KCl$VO_nGnww(Ql$ct?w9LNaA4_vZU14}5um$t z?8E@l|I=^!u6YRPww_L-6PON!&uVbKF?#0*OGbFBOaa|{f|*}^1pR;KDz`hvEI@Z* zbH$S!Y~8o@TY8drRS?I}aqTxpCxq8x>y9Z2kD&`KqB`BAJn-W4eVA5I4Bl=Di9L0+ z@E-oTo7GQP=}J$7RV}Z`vAq31`hRyn?o*39d^FZ#eNP+qN;h{Bc~>!GdeD; zdiUVsZtUlf?3b^ZxY+fK>go_F4+ot1z86Fd#oS_prUfoFYps2UJImU&HE?e%Is`Ms zyqXfEWDU7GT-;FP|G*d0er=~LkJldyH_fdfy~uPw&}P_0((S50%Y&u6wIPzh80cPO zZ}%BlLpEF%k<0_S>rM4)%i9Ct0-u~;9z%Yx#Dn5UU1SaUA^a;F(5*(iSaea`0;;PR z?rUtt*8NT7t|xWr6m0*5trhZHDqD9X{eit2QKNAn26iSOgH`VAM3ut8N- zv5ajJZ*g@S_R(42wzh+nGuL{_e4=0t88L2KJMi-1zgR~9J3qQAm7+XKoK#&OW+7`x zPcq%btif(1-69rM+*rD&9^6qo2y_SDcC0~kuS)FpyasfuWtI|`wgtlXrB>5_9P@)y z?B$YA0Nqtf-WS$^4oUjVazX3G7LZtsq-Sj@w(cbdPYfT;dP5XN$8nweqEoMht$X=$ ztsm*NPpM8fDGxTB_@3@JXY<|44h3mxZ~2_ojH|nJfs&Z~)E+q9z&B&74E`E2eDu~x zQiOKNe}~w=_otLrAEqb|6=LSBOAzvevCZw)}mF30YLZ3?>ucqKzCuEeBrk-b4cf`49DRt zY~63Rx@a5ieofqoj+?o+bFI`CY~8HWb=zh2DyU93DG$8(T;5&3(&femy<7NGphz8G zH~SI6i-wC0VOx*E7M>aWXSWD8&Cidk>(ab#f_xA~d0cvGDx8*#)NXe&-Gw>VdP%xt zp4hCx(yfv8m0%8ZOJ4Lni|D=)mlkXebn`4-O1}%#?xasSj$Si<@BxiWX3;=*=M$yX zSAgy_9-SQO?H16pFGlAVcw_hf#O>i#9Ln`X(zp;;=cM7U*t*A}hpmda%BfCw8JY)P ze5G%9G>C(niKT7p3{Tv{KX=no2&|qdwS=EMWB+8c0blp?`oel!CqbIuyA8VRNKqck zPU`ba2mXEj|KFQs=lhdGOnk`d5bQkipEsnX3WS8P>d>slD$5<94o$j-lp_8A_#y?5 zVNi$IM@z@Aw+6zjUl^D@!7M93_O>!RZV(b*cTP)C_5;LOlei<6$r2g}+kd<%8@mpz z&^h{{Vb6PFFFNj{N3`-vUhI8Hqj1IEI-`23t3xZ%Joe+n7rT?~w{Si?bkO#BdxU!{ z?i%vmeNMNDH5PEq$}fB;DY#|l=!eIKM&s2q-yv;*iz&+EGhyY%nqXv>Jwv9OsP^hG zX_obsm=VCz{ozpjPaU9pZ}j5Jh;A)ugRKKVcTWA&w1uGmS3O>LAnBVQ4EZx}f`RVP zH}6vkK=)A4f~U4)7SP*OLn6~r*t$KYzb(3z+eU0c$Js9#Tbn?St$T%5ZR*;VmsF?Q z6U}24PJ9AtJ0_>UvqScg3~ha!_`17Ob)-cFE#T8O3%*-F#h+yfT>bPrLSNIoZo5EEK=(G&2^U1S?NCEZ8_<2`-JOBV z_kl2jh>_X7FMe?1>Py)TK=;wgja~1-?$!yTw5`Lf7SQ?y*85Zcu!cO%bFN%eyphI?G|Uchn^IQ)={1AGiV;ZIPob927WLFC#1dYQ?FY+T5xN(nnc{=)(R)s zKKNJdP71!=vU-{$*DX(n<~t;%ayp9g5GZ+SB0u+r^eHmkkKU;mk#z5Cj^xAAU3pD& zhXK%iKyI-vqT7P2zOn}B))-Yzj_wSE1GV-`MD+T>t{tO7Q$Y7g6>)`Rp!=|7K)?cU zcZ<*ai*LLGuxmHF-22@P74L|oac53n-52r$yFFS}_PyW65a@nFxF`2|w{pGjCMz^uV&yXfqK%=z}Ef5-oS_!|f@30O#0g(|Iu-;=7)r;OF& zSXIc${b{2Ds6wIEcYL>iIo7|&^|+j?jH-9JywGG_Agr^j#`p9he>mycw^lVU$8z)d zdpCmqh+VB!Xm2BUKAO44h}{Ewj@>@C=f3O1ZlV}EPDZ^l%<~T`ND1 z;XU<%@Ns@Rl_WZUcvs`7ZS~1G|$^VhO#_r?axK0Wg<(+00J5B@~Pw)67O4@1tM6ydH1f} zp$d3=RwPLwyt$2t<0}Af^K%Ej8aD>Qn{M7)6T8qK&U;&N`Y_;KkP><08sPoOz|P_K z4GSp2KZHl;dYB7UX>O}tklQ52hHOsPJF87;cS`5 z*rBD#uHt7|@OfY83IC>g$Q};b?ZRJA!M9sZUf~$ByRJ|3{eM^qCq;R5De>g6%-!AM zN2dG9n@#UXx)WW`3uEc#{4w}b4d@sXBFt`3}eJO%oHw+5F4=XZhd!ESyRa8>%bb#b_RSIPqx)_*I-MWQP(Rp&!~MZMbWbLH)f1IU{>m>77oj2R8+8w_NXQ zRJD9f`~AOr7iD>jS%&k@J(=iBru%V%vm8lx3culcEZvDWraImFXdXs5@#((!bf?{!9a0PDPDvZVKbg1+ zEl&}1HG%gPdtDrQO2NHbEe-ay+pTDRX+mIsMNuAtRfglQ?~?len}ntO%xa8>7X>f4 z`TwDt{re;4_cs96kBnqB=*6LhS4cHT@%C~ltQw>zy8D#`s6po6W3;z|8Wg~jx{epD zAGa+qPLO#N2zysOS;7z2k6H_6CE8*Kp_~|RowITuAfCJ1XD_N-g0H3dz?>_wZ`e7z zP4%Krem^l69k*JkoMBT4b`832@~~e?vxVwvP&k?gUVO2P+K;cWvO|ksoeDm=s1tXF z9gupQId1O&%S8%W)Y4OM!_F_>gz3zMG{1f%Y~!aa4{qykDXDYq5d#_T8WH~8B;G5! zJ2ztSZannx_9npl=IcxA5Zm6_{XG-CG>0O>;&C3_7poX_Kb!8b06_1I_|)}jkAW1*u1;s_V@VOzoRRj z@hQjF1P^qvLvq2E?7sdTxV-6KLv2 z@u4Zz;d7f?^klrBPl}F^cwf@JC5gpb)YbRYX25$!)@TChj}}B^{zUd}XIafTiz@>&^++sgR2Wgq zPyZ9n<#pKAy3;&wf@uLod6*kK6K0=#wJP zQ|b`jj**;+x`4O!mdxebtHH%YALN$x(fh+|I-Pwb0Ppkld&;LlgEW3qm0m;I5)vM# zH=Ov6&6}9BM!)KCFHsO3w`rYlu8%D?Z-Z8L)###Ts^k3x%>yq!{*M=uoPM)Im&TR{ zLyzC%R_{Vi&u`il`{2lMF9(5R_=}UT!sXMR%a71}gS1(LvOHeyG8<-|d$=Wlj*NFz zv@jEix7g#I8?bm!GnFrs1H5Gx9>_p=50vdQRtLPh+&b0>^e|`q9<6_Yy&mu zzC!0IQ?LiQ#v_P0mK6xIw}+>Qg6BuetmC7lL4$NjaLwH;`45o5?X3>aJj|iC2UE`F z3fRve<;b|N&y@X4Y(>WvyiH%3_#XS+e;;j&RLxEAsjdc*^1zGFz$Yk##fc5tvP$-a z^SckYQ>;;0z?gWvEzA*jN_n*_{xeAX7@O-H^1ji04cf-tL{T1xKPJ<4rp)#KOUQWF zZxl!+@h%T<*@DH}IxwAuAMn;aw08vQ|3%-9k9Y&#Pns<|)NTjD*;-ty#Yg;Lw*_MY zx`6kq1$`rD0B`pC2Yjz|%%LnZPF08#n|FqSo>+m+Ct@aP+@maiwGwRJL83Fpbeio{ z$2$wn11~-`+l?F6<+4E;90E(q@8R=ysM~t$^i^BIis$e$cl;3-D(69Cs|d-yE7S7!N*}g3UYqfzbJgq>n_> zI96Z%jxbs5hg+W5`m4OQZ=*Wi8E77O@r~GO*To%UgS1SXw{F>s&-+o8SlEXw@oD8J{Bi8WATpcXnG+G zc6O;x2g1Q|0j*}!ez5H3n?;uZ?{BIErA2_ZQMy_F*$#84 zqv~*%*cEKvW=-3>#v2ES@6mCt-u3Uzq_BA}|FJcEBCM6_cw3=)u;IiPJi+`py^syM z6F18EgbSbdgz07;zCahaBlo6jfg=91TM0AzUzb1qK=Zt-S$0#DM~>jgrHO#2Ti6*^ zR~7@_st4?9%E9jKN*;HuoN5awvt?t(6G!a+AFl5;Njo_}B#je#Qfz(y3pVeDMC$~Nw_-k(h*XQ<{CI1Kd z|27Kq2w5Du87xlz`TpPE^Z$RTv#0FGg8rY4tOmW+Ed~EYAS?i1*cG_%K)|X&J}gEO z%RmictOyuI`v2T(169ZkyQVE&HZ0cyVawQhk#N`#7UvR_IT14m$(=jm_f-K*9X-X> zEWa%v&85@lM-s7X(6hpevb)>A64lUge%V(-75}gYDLGz0X|ZVvy9vgAu`)I$7 zj?Doakn$GwydUVoZFmCC+{yo1>k7B(ZsAKT$6rAb_L@hl6Pam#iY2I0mdExRdKXL^ z=BC)?WW1ZXb_$ZF*v^C13Rt}9KSmj`1K#zC3!fsqt(k|1k?pOs*A-(|UJry5`poGT zyzqmQY!5l50^Ttx@rSPi-V*K=iI3h}K*qb2w(|O5^FD5`pc(vgh`0|O*Kn=!VZcJ{ zEq1ZH&1LF$KTsWSQXb+s@jc_Pqjv@$kaD{wbf`TWpZA%>r4K$=IKyFzS9B(I@p&t) zI=$NUf(y;_Ze*q`5ApC)iM+YTqXU+a@os$2ZBF9d%M>S%#k;fI$aw|eZOCVH8R4y( z_VI@y;63?4eAj~;;QeTA?#9F52I=9>YVR7rd-|*5_yNG%tg_rfdpA=bZ&Dt3@wFdOS$boV9ol4k^4)VkeBSD+ z?`wjeIK#&u9u)X>4ZlGmglV0)XX`}sya}ch=3$c>8#i~iMF1-q?}p5>CnVn5p;mHO zyu&Wrg{=m>pU%8KitrAb3gy)RytSEgpRURbghkD~j_v^$6Wbp6Eb|TUKEg;p$_{v6 zmYwFa>$HHhR}S8O?u*U)Ys&fQa)U2KEp%M$mX+d4f2iIMeJdj02X#_i^&Up^cz_e1 z+KG3QtSW%_gPPtGa`?PgbDmC~>2`qc9Zz0yo`S1edE5e)yT7LW2FXd&pQ1eW-#Kx) z`O4hWTT97!zd5CxN#bpjE+dP@TRr5-UT(lU@qDZrIq$sbmRFM*f$)_^Kf!B&_eTS# zLJrXX-%Cs`Xan0@v%mFLRTP;+J*(r^3c6!&Z)tGOvJWu~5=rBBE_!kOGaGjG*3kWa z({4ov)$u0fffwIkkHuuB1RIoWtiK_T4WG9+$FyQhrvu!*SyfuckAmu5YBW=GGmQ2R zCl2hRC=Y3ZH1qSAzvusyHQ@j9DA50}B&$L1)gP%KH3;edm1eCNuxikQEt0Q)oybwm zeGuO+3#Qn@rW_|aum|}wo12{x^#3tT4?GVC_`wT~YIZ)39)$e4B@KC%K0vD$us%NX zzyb<^a|5&wVNbE+yF$&GuZOB4rRfN$B(Y*!R`OWwy*cGO?HBNuV$5dexaZSP5BOOt6`)06{Np1WqFu|vLpvT znCt&nknwKkxj6S}3xs!7oDe-0@A1_AA`8J3dxSUV4#HbBkn2PzSV6k^hOlQQ2EvQe zjn3#n&%zAn6f-x{|eU%iJs%lNyfXit*4Asy_1ej(qZuyzQ4$m9`G(tmG(h+ zkAC03;V$4^b<)C%`AQ(%D6Gu9_?jQQi!FVc2{cISJibEdfcMSL`p~d=3#hz(m6Vba zHg6}-r5(~yxXRwc%l-!sjhk-NAu{!iI1ef?Or<={(K_-CMAO?N&%@8{D$ z-|HWs{daFKt(v7Mk0DWqhx^ZvzW?|4{QqC>@c;bdLI2N9R)cyrWpt5hkkA1=7OWbi zHl*}v2=xC=zo1ugpaxkTEL(RO)S&LV_Vm_M;1N4*^;cOoZ+|l2fq-wEv##gITR!+y*JhLeRKE*8@IKl6Blz2mgT7ZD;eV6EB2meg!EN z`i`PJ`kltUREEuMv2&5}?)u$rOX6*1&9elHx70&|+9=??zgpos!u!~=Q^rKV8}9lj zeK$A|-g<2NO@?EB@X|@;U-E#r{I!S-2EhCJ5;arq*XEGpB;RV~Fl^o`iv6|gJ-!ib z(Q(~A7d!?xVe=OIF{A9C+DCP~Rna^);KX;tqVMN2P7X-k{Vrkb(wDov&Qs(*~O7O{f*5D36%J?LMh@=KB9NWV}DTSk+469jV>77>jpC{K2c= z0dJ^g6S#6}Ox5kD(en|cde`h%(Y+W5m#PhV9Ra*M`8S8#0p11j4>pv5-P``6H*d2# z&7qH{?w_xU!{*J#=)5O+c8u7Aj%$oRZuVONoA<|f*@IixQXg+lG><`?_=Zkj?^Lwn zfLMdGZl79+&-+ow=eI}s9O3R9jS-E_<+#=UdyxFHnYd7z=l!%&nW8+he~Fh*oS);p znv8d6M*ZCNf5`5w`mPctEZ*iJ2EQf&?-Alv6@<4=s&3jAa5&+@MoiaE2JippTxY{Gr)kdeY|gSSffyty7< z&=R`p1mBl=mYpez-~Th5j$hU9&P4OonWCLME~39_)5Dz+!f*Rz3LUOt4!etF1E{O zm*O9gs_`iDb~p0Vd<}A1Ls=gC4^Qk)NSIqe@{;i$_;KPbi8uGYWo%fyFV(mNbOPSn zS34ymykn%Ablm~(ujg}X9 z|Cc*;F2my8=y!{+2k?%nk~xa--rJIP(;4t~`4#84$T|>?Zo3{odC3ok&ns_w0eDyX zJ>z)_cn_|XD^xgV2I)M?JUnKB&HKL3ouDVf--#ONINrDRY87JGyxnXKHd+} zJWk@o_bI4y$MQUO$o7^!mlE@mRK4$vm$72;7L-4JzaQ{!1})f80kLWz}1;mI`5oA8*zJodbMB>GSF<{{(VYiVCZ;+>M@vlNSWioyMW&wzK8 z7!LvAt>5K+9$9;{3|t7^=@tl=7wh}PfU~#iZ?H5y=>Jp9oRX{n?~?m0OM-YUAYs?# za)Wi)ySEp2Px>9O{Z8aZ$0X-50U31+ zDS7$g^WN_!*S*@+9^NeK{wei7{@EKL;nVHlW4W}yy|w5IMS0XpF@>D~kGK4N{~xQn zrJ`R4Q|x-O8Z^A#e(nxZWQ+Z7!}ir!HAupfadS1OK|g*fe^3B5$kNqFE)~=uE5{wS zj;4XI=4kJ8dT@gj*Ly>sgh{UbjkPl!5*J7x;6sd4Aqw{UV!bb6}i&h z%}y3j2|wEoc2;cOt}Q!N7B2rmypN7Mk#w%-W+683NQHd12M<0|9q$up9+z<9`+DTF z$U+Ma=-$(rnq3n3yy<(&dwC1(;8pSg+Qy;yH%JScH4@;SIGX4E;4Ni>(o#*BL$c zc#9wz?=O!zQ%JnqvYJ<5@gBbQc(5MurjM(4L3p21c%OG3@Q%<_m-jgo2)8rr&6IoP z2cKHect{8Ewvw=QP6E7>bP2iZG%X;e&#x*M4`Qz%+wLE!jk!5Vq(jH4T^Jc5#$fYS z-^8|St2*`Z?m+X<#)(fqcXD-bD!4%^g7JXOZ~XpWMfav!ae*ED$)<8rqvJVlwI?vQ z9DnsJn&x>ESSZUQ@F(L>_J8jG6CmR~7|gzj#5+hjnG=h*IYUZKBjByLgdmUb4liET za}w}=V#=*(a4-b7!cNdICOgk4gvVLys*it|%la)Q5leM$pI}PA3-8Ja2zx%JN`qJ8cqi>2Lo} zMO{92D4+(3lhvScjwvrv4YDtlT8CAG-Yn5RRs?F0-z@*EBA8<3pQK6kfGM`VL2hlg zT_7wT^M!Ahls|mOhSx^=;vf{sl>5kC^#kO;!tAH3mL=q&SL?07g8ho!s^)#4E)P!= zN#l-1xQp@KzbtNdZ% zOv9caz`G*sOvz`kd+T?L@tO#qB{X>Z%5vUnY~BVZhx^_voF;xk$EkOJ_bar<=3T;8 zXK2{@h3cyJ9yE_qocJna0+!t^<$$U*pd_8Rz2urSuFgnKQ5AWRLa3UM<_Kqlt$OgP;-CC<+!3WY8Ob8ZitHk4l!X@B{$1AlRHzkR1emoy8_FHSh!btuZ?xEvfl zd+~4oPZM)8=>Ip7)u5Th4RhcBL(c!N4+slk)u1Tj&#|eX29>{aeX=)fYmqi;YB z+Ow=*euq;a93`>zq1F+9ctbaX@P-S6(5Dl+PLgULprh&h5`CvFpxI-Z!cUiB*B~AX z__L^RlBX+e_cg(}q(R>XeJf$#?AKQvy>lMfr`$jU}Q+-a+ zq$!rJXhZ;u_q5FNOE&@Uv9%ptN(gTOrd@4-_vQ~O?E{X1@XrFxS4<>{oB@Razax zRL46M&0`EFJ~4)UkAHzDNaJ%vrJk_k^Umd(w%)|x32zjgh|tcW;DEGsWt3(>ChhZn zPgx$lPu^tsHwGcRCCPaI$o&nIc;D)%;K$-UwsF$x7T{fXuQD6q-IIN>rVsEwZlJI& z81Uv9a6Nr@k3URU|3xes@OIqAz1JV`uI=kvoVUUfisO8rlahzc`{=WsS$hqC5-+3U ztPO;vAN=74DZUNq8cQ9ikGCV5hY(JDH>;DM^)_%osZSQYyYmsh|F_NSTCzp>BwT!A zQ5Yv5{_gEHW9}q*_7ybW|3@FBERQRudCr0(bGx?^WV|N>Bfx+Cb2)MIvQ$1S-gkCx z*_{J;JM^z~LwI*rN41Or-YK@nLsYwa1i{5>RpiN-Sn+@hWH2_$9F(iC1f{t^)^l1JM(btE7eu+LNpHxocQ!C?BA%d zaX=+>dU1PR;qyLtUS~%G?@3rR9WKd@$KT!}tW`M?Hk(fK{lEV@%JPUi)1{LQK9CNo z_XaZF6Pn+JNW4EYTk&G?{(tP9c{r6_+yAeZT?tZ8HP;d}L)S&k{P4-*JGG z0{Z{_oFe%WusLBadm%f|%N@RXl9Y3OIriS$>YytgR{nn~&^SBfYGG3oHr{;HwF-$_ z*bi^ihX77~mTC#6rcT0euwQ*_{$YH)LmH}T8i}FE)?*%#4$}D58yb96&|auG^Cu@? zS@U794)?51`nUhbY2n!8$Djsj|5pu?hb98z&>FN-MOqE327O(rlNAqYP~Out10zs_ zRLqpJv_K7d_dTre7uX=Z@vHTd#@WmNF#6m?Z`Y?M_$y{RB`Y*iYCLVg4 zqj=kqx>T|7UMtO4b{ycnFJ=QYi8rA`{E`E}+sEQr;6h&p;!~TGxcLYj@o!uy77g&G zX>C?n4e-tsIjF$<99*&UR7N(;3A;f`qe(PwelcE=$&6de{jz(bAodXZ9DZp3RE+)b zKF##ef|Fm^9_!P?JA`0Wmm1X_UHJV!xxDC$ic$z-d@(yY_9qK7$ZgLC>P@v~{18hI zWzENt_aFUhE=|oKHK*Y{esahJ#e4Rl>nd1y|N2~BnFR2@xO!F1V#n7xUnrc2tMAen>TaH^#ve9 ztHP!4$>HPupjdy-@~_8cJl=-4So5*NowFkJ$Q0fh)9@bKLMuh_ZrdNLjD@#QghuHp zfVb_J7e^-XCb_3E?gPAEv`c^Q2b&Y64nK2~cF_@o_TxNt0PoiCJKi;d%?Wdcw_eRx zH~7;L+o-Y#Y`k4>TN_pgj92tC|BZBop@!95*FU#b-`CM0Nw#x4*Uo}Xc{JpjStw94vX^XIGkkj!OraM6msyn#J z0|qtd#Gg2-dJtG*=S^=Cv1TAv*8cnPRE<);QhZ7 zA3qIm*T=3wNlD!wZX`iS3NudQP0Ll}A6}52lQBr$>^j7D{eLpkhaygXiQeT2b83X( zkQc5wkE`(e|0O#%Y*iHBj5Kv~E8Jpb4f4#ctdb7>8DE3GOR(qz-u)@>@BROJ)9~i3 zTk@Y9q<`kUS%`)Ancz&PJpk{kUuLUJ;+;-Y_wxXF-*B}X9kpd3*X_9S<;v-ZREoSP zCm3S)%~@e24e(ZW_09fs*bRn?m)>?3!p3`(EC>034}@?q6y1KHimww6sO}HzRwB>6h-l!f%l1I)8!>+AN## zcth_-Sn`q6c{q^&@>GMQI}LBr5#?~SdMEl^T!4l5K-aI(7=ZVewJ-Z7m$yXttS@8( zystbLx&G4;Ja6H&)P8Ou9l7qX_`U+b+d6Br>nG6vQzQF4e;;szhv|L$)C95dt}U(# zzNZ5rBh0u5nU@kjKf}hGI`|_bV3_@uw;nKk2;$_IaMR%zhpiACZ|}ZLD-j>>gWn>D z-@JB461pn0J`Lf|ARE2*Z4^J8KI8GW+`pG4AI^z}UBQ3v|JRv@H-}Tt1{CiD`4RK6 z@cuI*5xXDYohACDXcF&jYt)6t0p3<4hZvsV^A-)+C1-&zbrC|F;LM`7j?hUHG^E zUpx(OqB`L*ig$3i^*k)RjV|p=JqYl&d+~kyB;LQ)zwny{`u}>y^B4h72Er9`B}D%e z9cdgSuQdmF$DXfwQULJ&uCHL|;OqvsWZZfk^$)kV+}rr%nn3nM#cO6<@w)uI>kF{) z-gjX{lpM!?cvmrf?8nJ({k`J)+nz%3?2}p!56toLPX4W|w0fa8^3$z&Vyz#3_3rtx za>IL{%o&gO*;lOj@YXF-z6%~F{`dYroZg!qehm75qiHpWpSDaGtwAvt7U^KspcBa3 z0#8tbcHH@qwhYvu)|}yi=YimWboI%FmP!m{-nJX3kBP+~Z>r4WW`X|Sir5*QZ`KC; zxLv=%lj#a~9C21mUyQx~Z)MnjN_Y_g>1M`_1t%p6OJLU^3*w%a8su+m*ZEa3>{?l`j^auNjoxB`m`9dNAImV3Zt9RI8 z*@1n&2qxWd+y!1WvPv!$if6@?GG0E zf9L~WpYFpIGrmEB#Q9nBp>WK+H15V!|8F=AZyv^O5{maepEFumcsJA@a|r-=>&ffN zOyb>qfD?KP@J?_w>DsQrK=#~wxuA5Mj;wYI>I(#TPrM+divzsf&AK;Uhh5=wFXXP? zY{$l%oATI;-UJ~z%sA0}jls(gvGE=yF5UJsll}1KW%?My$FUfKz@I^isA*qY+MGY*@g{F!&43-4Wrm)r~nc$398yqjFTwXQj}vklzXp)0(~(nsNG8#dm_dS~Wr%Z3nJX53!i; z{rZ1XrVlBc{4TU@XWVF}!P;X@6|Tm8xHaWCt#EVZ0e3|5Aj7py9KZi}YdPcbhGbat;TBwc`Ek}%|G#`1-hz9s_@a0tR;To_@Gf>< z|6o19TXg%Mb(46nxPL+BDZqQ#s~nLxGzKE{>3+~&?HGhhsuR8h@MdgX`Q01foubEk zSWUteHl6)$r+hIs-l8KXG@@@25OZeS_T8%`?_9>l+wQmDC;l|{!&`#s124b!W|>2- zt7x!8akEoP4}OC*E4x8_U%Vf38qy_o_T%^e6pD~8WIR?_KyZc75+VR_LgJ>_S{>SNNhN| ziGYkV<64^!oRVFSz4tcs$ab%-A^YLIgy{n>zedBc!b2NqaNOOEqQ?^O@eUL|GhEvq zibMno2^hU)q5m(a{5-07f9Ci9?^yHE)~hq?)XjhUf1J*nJ$?-Oe~W1~NW3YmJ%o zP=g-mzrJq^hS>Q;uBJUcuCVpWQoFNXu!mULo|62UVIs1I8P`+H;r62kdj>hasyz1W z@OQS`|CeX_z{{^ez+tT(l?L}nj@*&m`Wd(XzbY={F>gQxR#~}hW647N2FYGDM%i#& zW5&-QO<>l1q<7t;du30}AXiMoTkK-d)CK92cy|vda$@04-ON{O0Pv=G-g|2d@D_ik z?y(Nw?Y7xO;R=a?=#D@1U1}DC&?Ly+1px0)HT)XR0Pm&BdOds8UE!8zT98r&Hr``< zOc%bYA|kJuarX4(#N}n!c()d1oS;;)AKp;ZUmtk+aqawOv&)7C^JTtB(YM0Ko1SX? z;CYJ*oF`;@iMyAD8RRk<^M)LQ8ILz)%Bqjdx6Bov%1?SRLS9I`rttD8TzCwI$**z&pb9WPvBZd+t#68V1o7 zer)rOl$wH#x6#@6!6_+3mJr-d0BVe{Ylc_!YnZCp}oM(xGu}#^Zghjx`?|?inNVQ>Lo7*)+UG zjdlD{yd5szBVys*{*5ta3h>@>K*Dhn?;jr|%P9cwoYyNQ(l{8%CP|`byLk-a^LeZ; z7vQZX&a2@E@NVLQ>uP?vz#{tRkMtbF##`ZQ%hHa`L`0k!*YWhqi>9O4czeMfiMO2D z4{v3r4^N!@_7^nPse|erar-OK4Vl zeI_yxcln&U&nse(1e*TOvjFc)@8!2_2Y9Dkjx!W~g*`vY7$pZBMtESZ;*+wlZbchv8UB!o0 zgY4&(a?A!b=%f}U+7#5FIm+9=Om2{_arCeh?}%<`Q#YmS6K@Ix6xA27v zs6hq3qA|~O-C$vzfiwE2v1?G>;K0!;JrW|yjO(K19*Il9u0g>^Y7EOAhS{$FuV?xQ z!O1Ua_?vK-EDg@ogpwBKe8KJi!+IXwTkGSCoYxmpzSN69gB-cze$;xi>WrU323%*& zhZ=We@8`cKNUf*gEt55S>i+-9AvUgGiWdv-Ly>vk=1k5YgSP5U;(f>=$z&AZ{mDBc zLVYj>34A8+9kwI}xwn*W!9#%eyGZ4i8USytMy(UuX1T$g$A7ogM`Po?&hU7@I2Q@| z#EjFw;kueX3>$A7?d=4AdG^EGk?8|3zutHQy&P8>JZt%G&mBAP@!nx4_+ezdFEY-@ z$0K!+h5lcSr}g(i^%;*hq{yO=r$5JP|2}VFH4SfRzx3;9^_Dj1V?B%2vmwLV$o+CN-xDN!ll!2R_H+g0yROdojp5kqyvAA{;W z>%R2T1|EF8ADqga{d$f$TzrHQ)9{>y8Ki%#-ILz`4;rK`tog_m%IJC9H}$-Qn z-q`(&2Jq(iyiT+j`XY=#@fO_{ZaGf1(y(Pfpy7R|F2Ka3CYhxP1?n zm`5pMPfnTxW43$EXFt3>m_G3GOLe+i9sNuY4$qXBzcmLR?;j7YY`R^j2Vd$?t}y$9 zzxM{sf1#pwe&+Z8^sTJ<5O*>;QFh|r{vW6FW{)3({@-p|4N|;U_5iIxytiN>tQw@Z z>sk~U)Sx(vIUQzTh|T;SB%%u%qyguC7ry2ggmmX_9L6vK_mzYtV%(8DstDB;-0XF0WWFF?bht4f?VCS6~I>+bD2Jd zaq|1Q6k!Mz(BPvRc@{aA^yBvb5e@a$Duhk2do*zQOt|f0Tx4UA25p7ZZ(xYEuW`Hc1>il8BX(4_*A?EsOV5ML3LEcvcEioy86*Ua zQ`Is#R%wNew`Bcp*TgFJ>;D%peMsTtcj3kco3<}B*r;}$m+UTlyand>=O@m0hi!tN z+gZ5c;~j7&Z}uCDTQeSSN)u~7&ULHIA4#6Vd(AYw6&#OG-QGI6yv0BEhKhwZRFSY$ z5a6A?mb`8f?>RDO95w*Ft5#c{8E=U}cHJgl*gPi&d2rVy@CCp-tMb&aG?+oE@qE5^ z;GQdd*0+7vym{DoufH#D<>gI6GMRDQr?iYVEWpNFD4{{g=m7iS?a1^Yf|H-i&(dY` zi-h2M5sg^~tnl%UJ@w|IlCnF@vw!i%I~6R60=&!C3sNWX9(yk19}Mu$e(`)^^UD}yi5H)n``j4h zzOd9p3BbE+-szLp0PkQ8x9f1WEBtiWec-YXHr_AXD4ef#NC+C2eAWBa2~ljkbHAV5 z>1oe?c)w!$xP+76eCdyOjr?e^r-)3O`#Apc*4o(m9SM4x$X1JiBVEGy{r~2e&Re%Q zbY}eXmOOOUeDM0Uloisa`hS~gc+dVG-j3ouV6~GU3-7zphxsJ|-VHRUc5-u~|A@Nk z6@a%i`AITQdkjMOBntEEn@8Lq>|+sSv8 zgo8f`LF0DE1o;M+V&g3}Z?Dylc=p5Fh3P{EC%=GgH!hU73&L+Fe#|v_jgR-m<8xl8 zb!#HVW)}|!JY}JJ-%i-twQA;n|4+Zpnh)t6OXZEh-230}|JkF(|Hmvq|L-uZ2C3ar z^FwRUc!HidRt?IYM{4*Sn!jxCt|RMLfEtu#ANQ;f)S#^&HJXcBV-Ty}{89qAL5jZD zfu9QQAT<$vvWg1sAX&R5?L+`_o*WPm1N{FGmfbDaMm?Z>?QW- z#EZv&rTt>N{-471u@@&l`&?UsXE6;P*+CVtr3~Ws^TLF-V2SiFxHw>Lh;S7PJ4ii} z%}>H-{`db-Cu=?~L@&FabaARdT0af%xqCgPp4gpikg7__Vpw>KE67oY0N&wU-aM0d zUnt{Fx%D$D`i!O}mPyaC?l*UtNN4)p(3T0NsL!1b1=2h!)I0=)SJ zAeol{Z{#5>8Qwlc%wdy zaq^S9@!+@pH5z;?<3>e(IzHZv^TxJY6e8fqht?C?&g0J@>5<=Wy`|lp`Tc)5Yd%c+ z&$V`)pQ_&W)9_Z2?&(1Bz8#t&f`#{2;$ZYBz*{|+yloP1&--xNT!6QRK_X|~vlwJ= z)a;Jkvtp3i+j~MC0N#P~bezq=>TS7on`g}(H+XSfc#>0=pAep{7g6(0Ts`~RNSA1&75N z|8Szk@JNvjeda$-oH+jvOFmBaYG=;@52S;+_u6TAEB$N=L-9V5xl6zs_nc%zk*UVfrY<$o#%7vT!&tIa9y$Vflbu1RQM`W!j7VeQy?C8R;|qYd z#rX04lX&y12|vCD@YZ##)QcO9LDmKd9hlurM+V>K&Lsl8-{%;8*aq+}vuTj%IqwEP zpZBCr=P~vW+msSm<#maSykN#P75eCTHee62UfXm-bxG`p_j9I?%{civ-=R<>s zKb%o0--nMkS5;hoX<0Drv%}`kHtsrHydkeNt^*-%GahfK^%P4!G|y}QNxnTbgWNa` z?}Zjl=TN*k7!Rbd@V;Z;DE$`Ty~<*~{v_Ue-Y>{52Y9DPzpd;09)m1HCIm`a=}79^ zisnYJdV9NrJE9igEx&zy^@H8u^A@_;2CD*Wys0HtKfXthksfB;x+l?8m#f%#H&mQk zfAul@_5VUlAJ1^|dtDc?zgJ5L9{hZ1?3V*R-anp1W!bic!E;@12S#w=SMLDchay?t z&u2W|H7O5R^0B>n^Pi~wQ`LLJG`ttcdI_O;o4m@9#KQaV;J8@_z0=Zpzv93IvH77ic;lDQi)qX8@s5|< z;IaVVE!ufV?(_xx{eLK_k+fU6dB)=nky!Kb?BO@c`@hRuj??g-*H`hM>b+uUvji62 z*L%(%>jro~Ua=!<67S{jd$-pDyrbl+%y{0%AkwLfC7QqJ$Y@BAzXibiW*g)%`TieS zfMygY;||9W70%6a$DVsf_?Hxo#*mRi%(&F*r>)|)*mG}#+mRuQU$GzFJDEOUoc#KI z@-(#e3Bip5GB@YT;^Qq8a^Um5v@lpRYOJX!0Dp4QDib(-^_b3#$9v6>tt|O4IQCeI z!Z`VF|Buz&veSPL`u|PSYLHI$!_Vjt8@)tX5vv9{O!&AIgBlbaZs=zTYLI2%ya8WO zgS5r2MjxYs2huivexQGej+__??dSjv(wC3<8-FcpgLgNGo+5s9g@@`NgjNx-huDRQ zu2J+CT*wb*T<`Db#!e~hA=YKQ`m(;=2;24li`p&z9Stt*Mf8)Mzv4DL zR#BZ|+^Qk)%jN?I-#@*N8xK8MDn9Fn(u}V`&{`wbd??RVl>2+dj{7vc7l+l4pm<*$ z8&bf+`>ceWY#G2?&Q@J?67SUyc76y2crVeEyk#o@uD5i(l3!gwM;529<-Q5<7D#>C zWVXBwesiiTXtkdk+*f~=wFf`v+3HSqCv{@OogKJE+O`@G^+A`SoiKh)_QR`mJC%*Wfqg(V+4 z0gM|VC#U*%UfkkA0;^Xt=~VPE$Kjm{VhsgT1(*LZJ?#LH~O<9Y~kju zBV~)f|DTrmgwmHNJ>w5ZOB*z@M2EB)fNDZE{$;jJaw#Di9EJ^xd3Sa=hObAoFD z-b)u%g-qftBza3F0pOi{;`_oMJPgDn+CPY|oQ@PV2fq&kcsu6*{BjlGeYz%EVPLTv z+&foqpScq@-h+z{bUGSwA$`oa(@*7isQ%b^H|0yqRb6C1yoZ=RUf|?cyd>vX!WkNz zO&@)dK7rpLm2%gYUH;(+tHwBl{1C(6|A*2Kn|r#=e7vD#7JcOGvQz#$IdPeWw?=#A zH57087p}9h@ZQ|btNR$>{oLD8b`oz#r+lMKfVcO}9N7vA1F;K$j@i}Fk+Z9Y7On?) zpSodebuV_y1j4 z^D(k5n{(cUf6xE3Q=5;O3+VrSrqv+B)a3uX|L1Klu7*{EO7-U#p8_?gL!HKH4QkK@ zZ=&Q{P=kggAm@=^G03UY^4p~HC1W_11}}TRJAbqi ze+F6c^NV=7K@2>rYuPqlN&F@DIMGFw&^oml-yq4}V9m#Z>c{8XcTepgc~8UJz_*fu z4zcr#dQ`FS?%m-OaTefh5oU1B3gDfPQ+j(nz`H%8KPzu62C0c#lOBJNju>3`u@MA# zKU=xmZWQ3XGD~CPy@4A{x33IcYJiRRLjSF59$6G*KQm6V_4DAmwb*zkNbT#~sKtJG zqdtz~voL?_diR{}UpQtdG2`*} zOJU8&Ip@RKcT@lE|1o=RcKQM6|F=x5LB`3oRcHa&1L=%!HS#CSd5{8T+?gLzhWog&*C2)D=3mU?8e_Zu|18so7*2ll^J}VXs%Wsq zv!HShn<3o&{4vCO_~6>ZaFWT>KJgCx52VcxTfMRzqAp=4^!_`!Trss|$;VBjSF@P? zzyCD6mpf%~qj;+%zg~!i_wKYxc?Q7yrSl!fNxUhtbFY{IymR)IEl~ka>_|oRaH|J_ z&s*~67al#)2iGjL<*HoL2Gf^{MZBZ9!-cn+_wc{Q9%8dOvR2rM@*p>vaSwmwb@+E< z53$z^{G+TIN7)YV3rrukaq{zB(Y34ommqv)Uqf^D5`4T#c8VO~c8B42Pn|r@9menf zp$A!JPcKnsJl^y%)_fc`P_>RvpV}bZJPq$<3!9Ikcq?8kT!4jlL|&Cj9Kc&tmWw!v z_a-yHL`#78hcEj*+yBHMzc^(+NQ8qK9A!-qv*)_haS8U z0B`Lzx9_AIw!vbm_kGJ0+~HsmrNB`U>apP!St~hCqI{EA0tF!Xz=BZ(v%SjKHh!;IfttQ55b3`wRX*tz{eYMTm9SPrQpop zAT49j$6eyJ&t6m4Tl!AJdue?E7mByvL92OKc%Sji>^%YS-kBfcI34ev-xo8=0N#K0 zH7y$3Lq}#on}>$L=7hx?HI6+?+hAj#fL}N3+~A15bs=i_w^c)5{CW}G46 z!>`vB*prh_aEGkSMfTgA*v9nn1t-7SwSh_TErRe)iSh&4ukic-IoqMUlKy>g!S3qV z)K~a(Z^-Z9B8MY+Gav79)_h3r32L~J`)~jM-|27u&;K1T#0F2RK^9T7f1)+$j59$8 zs|KxV=&ExDHRvn3H+VG|V&}fv{@e=;vC4mP%`ZqZkUez&j03Cb$XZ{uZ1t2rSfpF! zZIX5yT)ZGAb-tuKJloVu{q8?}AiXYa*7r>@yoeGrj<#+O{IM0g25Hssq+azOXS)Vz z1Jj2NPJXdwCJ`$ngy7jPtt!Re;}5aE$4qYciNwRY6;D+koWUProgbA@><8p$e1qhZ zRLYW%6>k*YU;6w0U(htXS2)hyi{kxDv_%^W@0&|%=6eFXRaN~(C-Kg09TRi{c+b&R z^%0j~AeI!#KXUeTBuOdG<9Ko({L*Ht?)k-Sa7Lp@J(F#%Ub~R zA~wvpklXE*O%Jj09_0{#UF6sgZvm!{37q`GwdzjvItanRZ}|zdI()qO!t*>g0KDIX zQQqZAu&{%)J7n`bHKiGkH`KwR5Bvg{@gmQdaT#@`TJ1jA4bsI0g@-lYvft|M9Hx&vocuJiJCe5v z3&Cztv#NR1@bMlml_vNNAA!d|##5@U;(y*kzny1QByfJl<4rGS&Bt4QIX@Y&g9Iig zTc_b|I^_Ng#oH%vyCxRi?yXPxg8|->>yn)(@eUfWYgi2Mu9SM7cm#Z$n50$0vDKZ9 zsE7*{*aN&r6y=7>b=%;?+*$PPTijtEOIq+mI5ytfjny8cKIB2RFyoX@*mvLAj*a(k z{dX_kr?DU25lkOrIQgB{xcTtTdLcNR?^gqN3_jj&#}`_3xgCM+;-zL=uEfV%r;4_8 z#4T3;|9tZMKl}%NX9%+7!|{MjeNe&_-T~9_HmN-D6vf;0B&>mjw~JVuX!vCHb{^)O z#9M|pa;X8pdrf*xTs<%NdP~6YPrMf$Atm_=mVv!DG01o4UA;E=8MQ!hwV6A-uJ-Vd zlRh@yP^&;l5Q7KV$c#&lzP0`HQf$244Hs(;zB={rT7Sdc|Igeh$G^JnIDFDx z#qG%@{PX{i#qale%WP--3=%S7&Bu_mShHo$)DRms4ewPJ-E!y^? zLWSUmkCVE?7UAPP+k1TU?v-Qk1&z7iXunNFuKK z@OZi`enM9tee&Ea1oH*(S`~BQb0I5cs(Ob^!+T|caxjWF zVTG117T)p{CBO9m@26M1>L)iR_6HD_ZUK0&j_n)Hn9V@8ONR>PThWoZ*AiVCz~0+e zhw_XATHy57^7N%XI__|mDmO9p7k2d~`%_ay@AD$L%sBTkK6h&l?EYW=Mb|$0o9u@- zH`9kAPJSB&$SDio(%?Am&}Fn?{Qkd`kzpPS@K&q%c#6VG|DU)4DOh)B#`pj9;*Bi% zxV7BH;d<7;`~Ux!rRTr>XMz5I*R&dBAANpm|9`UoSMPBrW7VLi+=9JQpaxxj@58?q z)F5F_lk#LxgScawq^?>qkX^M3zf0HBk+=yZv6W~0;GL&lFRoN>gI}e7QSy#*hc|m4 zmM&MtUW2TdAV%*f=SQ|O<7_?_X9}ud*PxNN+Wj_B5c1#td-z}a7w<8B{KCmkzajD3 zz0)*UE-Nz7^b!6Ld$fIM9;a<8oX2CH+aiU(#7-A0HQGd6Ipb%L^x3TW2-h6DvGUVY z|G#q@-fNfNN}n8JC-Kf2SLVdRTbcANOab6MG1gdQ2k_o=;?Z~*!25RE_Z@{63}k6b zw{@%y9l5uqIn3ZpAN*X>4T)C;_y7Oq3%~B`4pTV4ZW`vs#(VEVzCAw^_z^y4+^MmJ z9PNDAcvp?y{L<&aes~{X`nZRapVEdsZI3!>u+S#n7pHFG<9#@Dlf=)mBzPpmB=-u8 zzr-$bbWynP>Vg@McXJABJ~-D_8D;!E-m+sF-gbhqJ}BNf+QS@Jc(-WSeNhE?&)=oL zZW8Y!IZYMj0B^c|&$kz*45WJZ=C^k&=!jDM*rAmfeQ;?*-rad>ZSZW-aQK9qI~=Zd zSZbVvjkihj#_+67{Kzh5+=;d~A{GDe_15`sJl4h*?1%RXrjK(t`F*-`YxiPs|3B@Q z6ZeyBe7sHRd0Wl`yocA`JCe$Se|igo=k}hex;W$UhL*ADgW9h&`GORfoJ35+d(8{G zLnz)Kib{!Cc&`k&7p)HPE|C}gHMu!)##Wrb3GjZuns|qQ83QR0B0MC4)!SoN6BIV4 z_rb>dpLiDjRbd|osPGW*DJyZ zz}wv1YxkdJbfm+79#7EeK3GO<*7fxZ0N$;JOPnp-;cwShWD@FBmL zaV^!tP8Wu;S8o%WZyOsNWWT+)PfQ=jaq=twQuFK{LkONAq&LL6;N!j1u=>*nu=ghH zsb?j}jsJQ}eQFXoq-Qqct9QK_Yd#F(=UdI%_wW7x|4S|9|Lm^?Lu~Z48nn^(<~DSQ zU3SKb532^n_uMu36OzA-Ec4`*Js4u6Z!E2!d_nr*Dt#+2F9sr840{%XFGzVi=x@Dq z`ryT-Ka)(P!3Al)S{A;C++orJow*nPp+VZ?NPc)DO#tCy#wiA0jGZ8053%)kT$a}m z32fK@$1r`=;p7*&^YEsO1|j&sN+_~-#dqBO|JJ<@OXnRt3r84kUD|&Zzd?eoMe;pQ zocaAfbeTmTDn+L0;0zMLJ8Bx<8y54Fqj;;RO7mjj{rO~Z0|5-N4ZeYUCh=CkTW$~q z@V=1leCE3=1KB8~-aa3E{~z{}imsxSM~<%F^Cp53%-KM7Nq&@T)hypiM7atZK&NO~1;Tj}%4a zqD_DA|KB|g@AWT(I??J~d8U+th4&Jh$Yue6cMBv^Gr2jzk-ts$KET_j>e}khs~O0Z zC%?Z|JA>C-)M!G-&h^1gu4jr~DYU`+O*fUAySu~gYAT`L|4_Y2msRr(WCRcoW?Vnx zf*JJ#cJ=ldqcprNWYgFIa0Rj;q5HFV52C& zo0!P&KZ$pIz})ddfH!Boc!rP-IK3s%i3B^+k%nT$X3xw%css`cf2(2}Y|0nd5n$*J z55i$K8!lm2@3TA8KE(F&Bj1^E(q@kmrEXy3{aL%}v}Y>&;eDRz;}cGPBG3F8882w? zvkE7{gM;{Zm)YJlT9>5BSgGahf~3X49zicEc+`0x4u|Jhdk zf91FBcVdvH)gX6Q#%Xkjb+a@T!m2?F#zb$t0{#Cb*{J;Wpa$uG&8_1BHR$7U-(bD7 z;0#jo{`0Q4=!i&{Gxypneef(-=P*0LHn`PWulA#qJ4|1B>25kdb`7#i(#va;r6PNo zaURQgPlpI%*PsKH&m=@PvS0si&-4+ClV5kZk$b(N5KMG=^ggZ@e+H@D65hw9lL>op zCq33Lt-@U|fMU|>%BsH4{2H{6MIWznpK4F-ATc;PI!#j}agNB#i!k6{O zf74*;+~e65srYyoxh=|kejpQ`v&UaEPltuiTgYuEUWe_S@eL9rz?zSmmWm)%aK#R& z-o$BmyL`_xM60({!fPrP-qnRKR&)crA4$3lt^;^Kb#Ff;5AfbuP*E*=n1S^24vz+9 zf)}J7THlDd)CcdFvqeB%6jbkk2UN%o+}=7EaCy~!Y`g=-3f&jw3m})7aSwJ}uWgIQ z#(Q(*;~|nL`{5nJ^x=b(-&jvj^~rlea3!Z~^ZRIgydU2nW!t_x3r8yCCv#lG$D1tk zq9yU`uNjZG_yX2^1|7w>++Y4+HV5zZ&bGNJpqD&ACb!`{3pEnsx`o+ThaR{^D0l!N-ZbdFyX( z#l~Cw^3jRVT>^+cGmas`=^+q^jrSKNo#mp#?AIVkGkx^oC z_VHukZRI~Z=R3eVw{yA9B;G1F*Gt<1yfr=AMBn={ke7Gw4Euun|GYxJij`dGgEJmi z){IEB!Ctx<+rQ+w!y0*%fRTUr{=c6y?qTUm0Yr-#w;)jY)+IIUy|*{5Z^EytuwV5a zV)}T6lV8cIdx3?AgkVGMF69Dee7t`fMy~$^_TJorpOr+dz{fkQGCOM1y=5~VZ@Y5V ze4IAfuDbWozvut|SNiq;>0b(lSng>x$j8p=Dq4d)2erhpYLIPjZQw0XgQ&U#2OU8T z;^JNHBnxWLjx3FW^cn`TZ|_{GgKy}_u=m@7rPsk4N&W(HechO2YwAQmYWs%`t_R`UxUV#So87KdW%3o;?xjJnTEHw z?3Dl%@2V`K7#7~^4RjQxeX5DU*&&(hdX?_An~^IZfv}FT3a|*3{a6wW?bePg@R~LY`j1CG8y5&h*ialV5+c?!5v7Vfet7f!=yme7q%lzxh4@cy}J|DA2CO-yns2=2&%Y>74O+ zv+SdQb|-D>cngDT8s470t@}~DKgvE8#ll;7LIkb`czf+ot8)N&-yH0;69agMnLgOk zcL&`6=O)@x|AdYt9=KB;RMZF8nMT;@a<{>o?!5mq&%qsD^*m#z#Ao{45tN?1TM=td}J7w!s{E zhuc>fyTjFOpVzeNV&iSRW!1~ehp0#$GcH1_s!l{5yLu}MKkvy%XFt4A9|}16-LlBK z-gcD+*Blij{rG|3Ag$DSY*cVI6E6DsTXD|^{OV0FTf8YCbkmH-n^hlqzx+HSr_TQ~ zIH%#gDfVSOTD=zq2MJ^0eZ21LmuCR)=nYxClX#~~Ey{ra-T|I#E>dzCNHj0S`fVj0 zX|tPi<7$2%Y@_*X@H>AST=OJ0#*&?4|qpiH1pAWI-gAWk4sAW&eFfW5#9fh7V91mpyS1<3rr z`9Jf&=YPgu&3~IekN*t+asGY$5&ZuAF8piwP55>A=kiPQQ~8N}Klpn1-taZ>-Q~N% zm&=#N7tcrM+s5a^w}H=^59ZV4Q{ofnzQ=u&`y%&g?gVZ+cPO_P_j+y%?j_vwxn;QpxrvnTlrG9kN*$$) zQb5V1BvSTK!YO`~jTCE&5oHlYfg(a7bN%A_#MR2xz*Wh0jVqfgnJbQK7gqq6E7uw> zV=iqjWiD|p9`Y!;pWH@%My?_klP{9f$VbRgb&x7~%NL@s6XB;~vKijtd;A9EUh|a|Cj@bJ%g1a_DfVa!7LU5yy#x z#13LJv4(h?c$t_^Od!&Up+qm@dZGn!32{DA_P-V|2-p7Wpa1KcZ^tG3O7cntJ=T164ZN4?jcgs9GFW zKLWL(O54~w5qgg*Ezu?(=pCvw+AFU?Z&9@<$LlxLiYoQpVuH{cR4ue{ItRT*)dE>B zA?OvV=Ji#agI=Oa?UtG!^a53L_j)KoEvQnpEl!1=qe?}(rvqw6mD10qFsKPtiucMM zK+jM$=Xf3jJw=s*O6+3MWvCWavqD@hKsBfmHP-Qms!=7vTaW}* zp-QOB>?L#`RkYlRuh2bI3GTV#3*AK(b&XX7REa79sX`?PK@~r3nJ`p=D&8{MFQ^<< zJdE8Ws0>xyF7d0OQdCh?a?d~|s3L!_Er9NzinDIXOXxPLNJo^zpL=p}8M=b1VYBawP#&s&2>*_NE~Dz(#}``AB~%Svk-iLFMAg@5 z#2m^+)u03T-{=CW29$g$P!6iT3?fURY*c-&6v>3nqpEM8kUErws!xu}C!uqw>Q(E3 zp-fbD|JwEfI*Y2VTHbQ#45~UaPc%RosQT#cdlO1W)d%$p?a*mdwNG?-LusgLdnEQ6 zI)$qD7aCtesi=Avuy6uOLDgH6QX?oCRjty;6rdzjy?*nd96E`rS6Mkcl991onE9XGRP}Tfa$`v|_s;1oXyHEnEp6yzi3&o@A>8gru=m@GB7b={C z4x_4}Ger_QgsR8oFP=jOQB{A4=L!^usz)1%r=SC_M`7OjiRn-EoCMX6~_kN!_0nzz5$OKTmmnc?*yROH9m#|5I| z%Epu9TTziW*V{Az6_5q!sBu&H3sJP%U5ax%99P^PNUsRkQJ|yph zimcZwG`vx9F1Iqz3l*6mM@XKiI13}`9;i6OSEREE73nR%FS?`Rbk>&^H&mq24OhFO z;*^P+feR{9sfqH=s7P)PP;x>=(zWHr8&PpGA<1e3Do(7~r|F1_M7a`Y2UHyUY`Abe zDvsWDxV8=z2?_M=_Na(=v5H-biX)mg&)T8l&{%w19VaV09~7RT>fpdy<3{KyJa?CFf+ zF-OJjTlO(#sEFKC-)xGCT{h;aCaBmcR_A4miikg6`pZ!fUef2W3>Dk=ge$ovNsC?6=KRL4`x3 z_6cQFtUun;uY`(qcBNv9sIZ@XBXSNZ?1udJDWJl(>?x-_D%K>v%#=gLYDdG}vr%CK z&S}b`Vij-Guna1!o+MDEQDK>78!3f~mEN4|B~f9a8C5EQiWSt{K5gNnt9x?i|aq18VeK|zJ)OUJ8RsL+T% zQbI<>BKP!sPE@EbkkTQcV!=qyVh&WyuQjVC@^X;5Cr6q2!g(Yfz67X^C;(B1s2`~< z)CbfO>J{o4>M<&V8bq{vZ(C?u|7t{$$}T=iTPTt!@2 zTqn6=xpr{*b2)R_a4qA~zvOC$1Y)aN4 ztCA(je4OK)gPa|l&73uyw>d9!rgJ86(m6vpy*Sr%T5vAmoX;uCDac7AeJ6F1UXtoa zWuyX9CMl7$j}%VwBW)yElZ;4JimB8 z@wDh zxP!Spxb3;kx%If!xTU!T1eOVC3MdN95}@#pfR&eb{Ehtg_;2uE;7{d0#J`(Akl&r( zj^7llyQuO@^7HYH^9}NK@HO+*@ZILS%$E)jVE%_W8<8Ko^Cyyk&VJ-a4`?nTptB$O zKMq=l2>Xnh=euuW#bl5TZ~um_|8B*n_G8U&T3u-Kgp}yC6u2MAhf9qDzEb zsOoDJH6-jr)u&UUuLwI()w}JdFChX|Jto4Agm6@K&+gJDY)4gRd-iui7^*&APm&~T zL)C|<0cS!esyd=Z69^%wY8MXeB?P1DeShg6LJ+Fn-8B402t?J}bdKGGt*C0Xy&p#i zK-HT$@G8OF`Rh8Y{c7%1PLaNRY2==I|IOa(utVLD16aOlL9jeM^Z~sQHMODd9(UL7%T!Ia%Zn?bQOIU@fVr?G|f;Fmcl5Q~wR;arEvSvTQ5>?mE{y+BK zJg%m;?f>6PgU~!jq(LPW5|xIN5-A}>DMM*el8Vr{8);O^(16O&oJx^WE2&T@C83El z(JrY(RDNq`t?Rr0S=ZX%`}cjGXYc3bFOK^@xQ-8RpLHDPd9HJX@TT z@-%+2K%21W_B_9h&_*oE>0Xut>0?p$EzLd91}w^Q?OFrrVNvF$tT9Lzi!wwV`l0n$ zl+G`63|fapw?Ty;Y1M9W1)B{j?;cjYZdG9D*S&EJ_*LyA8Q=3tfRqE-NU4 z)?(4MFwSO31B8DvM6tF159sGipVo|uh2MLnLqA-!u!jK#mo$bo%fn>4hOuj`g zv;>Pn!WXeZGFTM6HOCN=#-gD4!-kL)76njFHA9kE_QN%rmG zkO&r?X!xc931iXml=gFw5Ei*RFCK#gvB+)1#Ry0Mi(JLj7eV}3SmbbDSrM9tMfMTJQqWv1qMoUP z=Ae<3;hcg(=m{1XJhk5dJ;tI<*ZjDk8Z6p)?4v(ajYaypZ6Ba2EZQJ^ZW4NgMY^wt zE1^m(T7P511?V9btvmU1A5?)wK>vgy1Y?no(0o>?9E-F*?(&7out@Wc$PefN7Ojmu z`UNV*A`N3W04l*Eb@A)j(0wdgGdO$^D#oJKALGWMdsw6z-Jk*8#iCUQS`R=)SfnC# z@;6k7MJvWDjG#MMw7ljC8&rTr%F&ZNP(BtZ*>vked03>lqB{k;jYZ4mj<1Arv1n;a zkvf!vMe+su4p250$sNDi1Z827tcLDfC=-j8a0`b+8CWFUxyKnw$0Dh$r4OMrERyt1 zR)B6{(PI5~Y0yn9k`Smig>GQc!k)2}&~+>lFZwnDrDD;7K;s)w3Kq>jaNsPIj74Hn z2iT!&SR^w1bSHEbi-gPM0dxh6gd&>PSUa=jp(re3xh-n|MPkvc<7z9R2rPn(pQ}OPSVWRA z4S~YYNOHQX@-h@kBK_TO!g_J$_!0ZtG+Hsb0D6l3ZBmbLLL68`J@E$3#vio^{otughey=qy5IBnd_vcv1sP@ zohdAuxvXRoi)QY2_=QC?x2*rfqM1vnC$MPd4&NVGG;`(YcPyH@A#xmxX1>+-4U1+z zZ8e5PGhYH4#iE%Hr;K3H%y%ZfV$sYO--oei<^$PZuxRFc!b4az^ZC_5ESmXRB?XIg zFFvj!4PeoFi_|%!&wt4R!*N zZ{^WJl2%~Tp6;?eM)+6kF6cegZSsp3HbnEZU$5_EMO%*;V|cjp^|oTVhL>j^4b(58o%w;60B9 zZ|WiohIgOt)%kdMuk77Z&1z_YkYQ7#`kPTWwC}A$Y5$ANfpuIT6EK@XFrceRTow zgF8DrQ;_Banx|ouS2zHI%dACPq4%I^l;^ua-9hkJd~_w-2>$v1wy zhWOoE68Ft6;TOl4-n~iu^y%=8=Bzn^Tu$_N{%4N)Ux3DgsQV_E2etf=mBI6%!6(rV zTo4ZmEqZQkiFlCCna}}kq=QucRH9$}HUReJdeE}%a%=pm{@rRh{hK`18L^)wkUu*^D>;|3Y<05!B~c zZXrgpM?C0b8mWtOoUkLj_EO2%EGi91{ob9tl#Py0>`cD>5$gQE;DWRt^y!$E-S&#qLCuAmH=3z|ETrB zM&$ng)eds=b=*(vu=uR6il%|X5I7p=gwaL|vdukrB~yn3m#-jol9ME>NtEQWfE z?eX!BO3i6L7sGgX^PxH-2`Ma@7LC zd)1*39dQKj1ii9X+^+)Q*1@f;pWcw+@J~0ZO)Cb#oZTw(^jbT?gWESMzxi1K-mQaB z8jO#3U1Gb@iH&@)0GhXl?Rw~{z4&-dAO`KS6bDBB;;wUe70K|YkO!S5D$!lh&Ao=*J!Kj~=kyjAMsOpiCcI>HWrPPqE#dP`m!ys1YuFudb+ zV;1A#ty#WOD;UB1B)gY36>m}-`NPzaRqHY`T`imH1K{ap91uUUymc_XW|4dO03b)& z1T=j>@ZPE2aSOp);_mrJZT0wge@$67A*aR%OQCuBM;DY`K8lZbV9ZT>XB)=D`wObW zpP;^&^}n;_kj)8u+3njpTZr*?2v*(Rzv%34NuM=pVd>;TdS%HCpo{l&le7wP}{PP@QeDD`EulH@n z5W6Bi-ov(z2g1VuDlKDZ13je`3HN<#B_w_z`B6uh65#>;*Al`c; zEpYzY+6^(kd&|f-L?4pYYcphYS?60_yl+EN`is9k=pH{543U*6n@O8mtVr|4%`67!uSMe01M# z`5``VrGt~T$d7pbC+RjW;pR#Qb{jNi`PvijAeEnC^?Ji<&Ga5L8AYECxBcSAyZ_w( zCqjca^*AwxcXaWPJRaUFgzGo%K=9rhyXEUX1aBovSg#qu+n`(Em;f^W>w<&HW@Tj9 zGc#^>dffo1A~y#W-01`xE|>OPT44n)bUjLKYQ)Do=jLAZ*F}8rB{a{wzqSTA;^Qqb z5U<)dpYia{M0G48sIT}=Z1iq51&hhK^6{XsPDZ z|F&a#yh-cm)G@Nfd(fKtdCLG{8oa6J<1xH18y3sq;hnclr_3C|`?E=X1QqY{X`wes z2;S)$nOeih>MgI0PYvlI8Sd5jTzl{701&*MNAfA@1Tq$FDZ4_fz`obdwZC}acaUbh z$|^0_`QZI%-WXe=%d#naydyWPU~wlg9^R&?j&Oqd>Z0vWO(Gvi&no*77-mY0ciS=7 zSiLi8;N9G}H{_tlgsZ)z{;Fp(^?l5bH=R0C*PaeIt2(oKD@21g^@R@%?2vUqq8 zLc2Ju5WK&3J1S7|Zeq>2y#>MhrFb?p*cJc>E;QZVQH^|@_+5Te!{Y&PIZAt2=3yuB zTxOiI>x>nM>#JPr9EOj#-Rstsda-=)1vJmMwY!{62!BAzpEKJ(rH}Cjq(i8V+XVHM zuiw%ozl|RlW=^zat|!LZWr|ZsE#nqg?rh>MxR3bs7VkuK%@rx;zaULzm_8kwpEUKZ zVhN_Yw;&DP)Hj$gyz^kwC3tw}U2(T@K=2lOmsCUDoRD2*GPV)Hn-Zimbgnf3mN=KP zL-{Egess)d@_Y3FNI87UFX3?~P`L2oef4fDa6c_!ulFW=yu&%41)F>E!6j&3$%h{= zf4;|e@7#2IiIy71!}|=XBb%T;yGtA#o{9XR{`BPv{Z+(x^Oq*R$VKq(^BF!aIFGpZ zCS@;asCNEe@a?Uebn5s$6|@XF-tu?Uii)O~_AO}z#Yy|ZcFX6SY zh(jK+oNFetn~6Q>v5C?n%Ki+%rc}C|^B!>rNp=h{yju3Z;DGcA`g9CjIltsx{!9lc zPJ=h~rDP26{@Ja{cz9d;Y|T+b@E$y4)OP^Edo%xC(ZdMd4cz@aw~!7pYJW>pgIzScYD|IiBDD81#Sbrc`(<)wq~trzjbSl%>us-u1#KHjI5 z>nMlsFdp7Ys17fJ`nHQcpPSTyEU}Lpg&S59<1IBOVxj8R3@|OG_44ONV!TPcd%Y;bLm}g`*XQUNycf{mO?}HA!@F+ZZ6!Rs+wHcSs3Lf)46z1K@ouhIsjv&d z`}E@q-_+Lua3h#b?YU2eSvDJ5-EJBH3;b>fcwXuRwp;TXyz;ET9@h}*I2(MtB}sbe zt7h}VW@sMg_8;xgzu;Zqu3mW}hVk&0Ky}<9s81sIr_uLi0^q93Q;+BZV!T(UmCJlF z&H#bGj&)O#hzBInj!+xQP#5#h|Mcp3EY%wS=kpfxY4E0A8-d~NCg`Jxhqrp9(-%zy z?{VcOaVp;Pj%tLfB6zpko&UgsY><}Qd|07|e4Kc~e}Mba%K`A#Et|XTYA1-+waX5? zWd+I{W+`ym>c|hxHJ={hgi`Q}^EH9k{r3A%gddH3ON+F9YDkjUT+}aPJK3?Uyxv zFg@O+Li%)6EFY9TasBW9KNC##>AIltX% zjd+kcd3|pl;z6wG$cO%>0+6G18ckd;$uOtWv%8I51K=B{o>-?j+8c!GcPBM5oD<!`P`xFXw9v5=EP1mf{3o)!WfFPqro1jb-iP6YQNHv1@K!YM>%P7FfBE9$z2&I( zKJx>Nhqo=NV;ezzP26`wj(YQh16eNC9SX#F&x>$66MZKOMBh)2NS;HC_vPxY?6Zl? zzd_noNuLh;-|BC^pPQNg7t`QPy{iwyo8w~YDm=VLwoPB*Lh#N!A>dENd*s?=b|Qke z;)}XAjjsW4N4|$Y^#f^T((C;f6 zZZCdV0nIaCe)8)se|)@wWte}Z76amq>d+;qZ~QBGvb}~Ml+O2WD3Tz?d-byD*pz}S z;I;h8YRUU_ydZrm<(T7}Zl-r{(hWLwY{@R5?jRwX6B0CdQ!k&y@Q&(oSHZ&@u2=OD zLh!zKZ<`nuZ^`pbQ6UK4J+_a3%Jc`oYrOrn$W>&x|CaI>(Y66F+0yg{KHUj~EmtYl zZn6dz7o6_diyXmiChVogpImX^ht1KvwmaL^*688y|0n8ARj^Ai9^N*nj;jRq#Z6CE zE1u&AxI(;>g6;JCm0|IDxefIMR5Xgr8|pET8jSU)bcNA)|5JYz)~JqK z1oZ`Q?9@JEDFCt`dWE0OCGH?U0`u8qg>kod$ z$J@?yj!?c3Tn>aZ*A!C{t6iZAoi?fJSKt|Z)N_uTIu<@VEJl(x!x)|_Wxbt zrI#fnGe6#R>ey3bB;b-d(?Kqw!JB&HKZdu6{{;;^ya#tgL%j&zTOp-0RJ_$+KMUza zI!I;LJ$eCxfw1uRjW2Y2$uK21cg4p~17Mx)!I;|yo#4#s3xIOU8dO?;eYlr`k9U}H zxP;OuKU|LHIc;v?68aasubz8ZEH}z{15z-mBblH+?bbP$XP*!N3yfth=A0zP`>@LS zR}B$4V0ZVqQs@vd-kg5YD+W`dkEf*rE99k*aBg(;ipbz$n_Q`+NR6=`v$A2Ryb{g3*5vM)S%Kf2 zklcduY;H0h-s-3h7J~W?>=dYQp5{k7YQcpm#>9BH>7J|}eU=UOe2pGql_Q@2J7TU0 zRZ5>`diPF`qEE-YN8_C8$nloH=l}8kg)z|oj?DjxG#*6#Dizg(sPn(kZcBDN5BhCU zmy(5e(32E(4?Dzz#2>3HYeGCoF9o)5G!2Anb2UR}tN6n=WjSI;e<2;D{JgETvpYfW z)A@H^_gVuFz0kPJEci?830%r&`@#j_<7nPVlFgO7_wYUF*lIyr(ILhgkS?M+TnXy? z%5~j;lcxZ95?QQuPZqEaK$ZTUJuv;lC`gAJJA?Kjt9-YoK|(B)6oU z@%VUO@Lc{fq?YmUwnuebB&bg+B*TP^T(KJ^7xSrgfEe#D%^lr45xgB&`09V8=Zc+? z=Z<_^l9(QE(inX@I71em8~t3)b9pjc&lZPv*6*qV#Ff*0fP6&&I3ud2;N&L z20OWtgkN4RP?4|i>jEDDnR7WU5eVad2o(VlG0Q?iBQ$*ho z<1OQD(DG(Z9(bfa_-p(-@d0V_$H_epcFoabpuXWhDy6ZXJ{^X-U$2fLJ4i@#vXlmI z>W45fyv+eT3lHxLyoZ&m5xg5$N-n43T`jpQPz}MmAan5-FSS5;*YM|P10H`kKA9Zw zdvpL81WszX%OJP6I86!#U9bk9JbD8j{0rXob6o7wO$6XxG_T;c-I>~(_;|;(lsx`? zmhteeLv;|<_xx_y6%g}=oHeeFtf4-(Pbh{%E9>VJ*LyGI;nAnq&fo11Fa8D#_06FG zn^gCSHO(EMW$SL$(_DwZqIjE?$7=CCsJM?!x3^mWUV!H5hi<86-HGo($(cd7RnE`G zUDN#U{$s`ddxfZu6oUHVyACJC`0#`5E0cBCtbPFO*W>;8t@vEoyaffoQE}zloBG6$ z*w;gKhrd^xV0sVQN1;#0XMub{!3`muHl?+{J#d3bnlpZ=5@ir_sr`s@-a z-or*tPd^}dJMU8baO_whyn>V(cxt;p-2X%Efxv7EaJ;%E)Tgrp+!e2|dHC5H7&zXV z#gc`O_w|yRuIN_+@CG#RMAz5LKQ`dw9kDq&|D+q^;e8d=5lK*=jceA^SI>|Wq=Bye z6}yS?W(`d~@??GiD9pDE37kvE6+1(db>n8^8Ez4=}j!jg3f#K~J z-ZKXeZ@*jI3(g~Wr>%AsR{o?X!qiZ%OHXLPkNqnICUD zb@aORSZqgbkVcvlWg5KCJ1PBhIFWtXeGWXlQ%*lWm4M*QvvA{fD&F_gzd_Wuw;W8@ z7D!kH!cffbr^`0@!y=m$B0?YvXo%3Dq>Od|@u?@R2P_VO)&j5V!sqev=3OYE?@%TH zzeDqCpLD5=2;(1+zMoorJzt0M@a9Byln~S>DaM&~*FylP|6p4fvzQp~+*7MxK01^S znp(ph%Grp&-g0Ct|9DL%FVo{)G)kWi`|8a4XMQuwTS_!|#~4b^e7%Lb_r?W<&&I>M zd-YB3>j>U`iRK@vn-jOA%e5aMcyA2+CC6(S2p_zgAs?*i54R-nuCAIM03k7_46aUf zfG3)7bEIfjH zPjGm1dR#6)*s?`Agolq9Z`ataURwljmdD247B`6Z|4Gq1TL!ennI3Oa6n#2Io+LQW zzw~$h$D7?4>VHQbv1@2NDDj)gHLQc&>!QPt=RwCjla}sAJZM+^taL}jgEZbOSb7He z#7@+W+{miHK$utmh}sbYfB2zi&uE`01^9lvA!T#50~Gx@Anjmu2*fKy*JRwrACNjd zJF__C1>qz#udpoAb2SUT2h}a$J_<{5Fx>p#it2bqP~X-10L@9{6+5l#KdxVSPV7M% zGTSGlw?Pu`<{|{|WJglCc0eHfz`P(SVXHr^@v~N?Lx=+Qq#G8V z$>;#a>7A=v#Sek3Bggm#{qXT#`LR=Zk+>k7i{{DnKE8bS(@ETAAJ)-MS+&`Whqp4S zgN>lRW0pc+w!Yv4PNoW*0%2mj!*C`e(0aoTh*X89z4A5dKLuOBY2NV?|pd~!TW|)&f6gb??al`=Dqa` zgk$7oGh&g|TkCCh{f+z-a32Vt%_{5w4Vx;y70*5dJY2(i3{K(WZEZ4s@e!{ed=kww zoV#QN-!MMj*Onjqs!w6O4st)LBblJS(Ye1NA#r|S+2?z)HIo?cdS#Bi#%_1Oy2lM` zLyr(IZy6lC7V)injOp=yzmGm0Ze)Mb*q`(Nt7!1PY(M`t)|}Kd-{!`{`|vUs(PIeS zJYUY)QSr{;-lMe^S-rhi5G%gNI}pwbtY6T6&>s$d)?!x8LjgroG3y%P4iGBo6OqY! z2<-mO6Ms1pA8)7rnhmvVf-sh+(4M!cjtjpzIV}6dBJCyP;cbuVa3rWtc;8n06V6C; z@+e3+Es+@Sl&alBLx_7X&%Czk^@~TiPqlv<;n%gC!2#aPzyJS&P91Ve>lgpI-a>^2 z?@P<_xiGx98GCZ!;ce9BT5<}(yQbXgCv|h;dBe}e4hY_IXY@QzoeqR|#^=eNv+#$D z^W~>XZ{ZBT3xGk(fwOF14)~UVKk+kUm1ICnR zUW;sis`cGVVea^AkXJL3)`tWL!fI&VSj|KIY!8B(7hd}N+bzSmu0Pz2heubd80qhk$n^Vf|WZ{wKXgErEqqwP*s!pp>& z9i+81cqf+?6k&L~xXl&8!&}ejRFVpUcWOr9J}Ta^s*7(mBY2N#N&j%N350E3R-bei z@`pR^?>;%QgaXdSDp1!TVYm=gjq%)E%U#qSr!rc=OGfbyE|;JIKXl z$O*wa`up)o7G(YxJCT;);vNWZc1}0HB<~MrKT|E)C`ADsBJPU^y*hwDwEykwhC|?| zrQK$cmH2okhaMf^J0u8Cp?NY~rMxzJ_;|lG@;eiCf${K8LUl9|)TjDL!hB^JKXACU zzNT>=G2TbF?ce|LLLu;+TyAAsNJj@Lp2ha@-fX7Fn=D43j*U-WHn$@;NF&XOIt|`e z&3_AG?k!_}OArt5jS0?a8xXt;T!0@HZ_~cQS?dtI`=J-B?*|3KMPYsy*RJ!2-=&qD zS}Z{UJEUKq3p&#QWUM`ZDApVT4_C;hjceoM-CkS}wQ#o}{0PkxXdX#x{Fmlr)NA?j ztsabr_ghrQ7(soZx8ptq@CX2*Q_}1eBg6xeZEgv>`6RNu6~FIkqX9AAhDL5ym(6D} zeRFcxfIc0YU3F~OV`uPIqrv-%T#PJ+x2T_+03P18UgbxO5xkeiCkjyU=8jTnK8WD$ zyR+3W7{U9o%eJ|dddTwD&DM5SaSGr#G`C{xdsH5Z zL0A>b8?oBr@*95#$t&+n`lTCl;D2;6$WJ;^9Ypo5&42J__fCEge6FP^;yQ5$soK%> zJ%{%m2%l5YG5Pfg;d%i{L)Gkcz(wZwpf&XAh?paglQTT?hy^rw->M9j!0V$ zyw6Up9ata$Zl~Mio5vF4?Q5qX93XiY#IH*-TPQ<3{|~*(u)DgPi|GfX%dhFvF)J`n z{X*c({I5fU_f2mVV+`*cnVJQ7cv}P*Dsv-vTOT+mO2vE4ccUHq5xnO|CG=@<2g1j< zMBdAYdiD5|4&*+pN@vWB9jxy8>C2cqD_PMjqRr;F}yj=6X)aM?b*9RMg+loL;dS) zX9RD-);UTi5WKbcZdgI<0^zv_R+-cck>S>%iTk^kBksLIh%eTt1H77hZMmP87{acJK35>6R+Q~Wi^8@0Pu244Sn7y7NOJYER`X{n%UefIg6-9xPwZ@< z!8`kw<{k|1Nw|4SSS2u!pS6@MutyTc6-cgsYu!#&O z^0IAIH=uwTztXP(L+v2A{##kTtSxZS+qhVP9Ut%7?>uAH;X<%0npX!)1KoZ2ct0AY zn3fbV9^Ow;9YpnAP^Fyv%E}L(pD*^+`%V0ajdLD?=IRs!pT4rYxoyM;q@#AO8EUnS zW_rBIbn1|M!5Uoq=YX^x4c=L4pjj=g(yKDv|Pd)L<9_ufDOp@oJ$p_A>vYx`;8_u{so@J{qlq6j|TvF4W^ zmWB$!MQGkv-fb}O!pD2b`k?yBORv23%7 zwGq7a<(I3SpreDFue0yy2U+GnAT3Cz4vvLYi~byt)}_Hab5qtBhPPO7>|#8;P4Da| z|AgROXrKDjg$8e#MpMbnfdOzaMdSGi7c$JA(h=LUjsm_U$~ExJ?EubMEt!{lYyjs< zX@UAy{P~|ZjN7w;M+oLZ^J3mm*47!~<2~iC1Wo;7ya9;^)iFs>AFqexxvnNY;LH~5 zpIl3fcU*sCk8kol(0FgB_QAL(gv|{3yVBZ_pA}4xH+h6U9oElk zZ3=J_Wvh=AL5{aj`sZsU+W^}h<^DP6@bNx=XFRxKLJ+n`^JFbGhUypM<9*%YLglM^ z#>3kU)sae2U)=T4U~7JUus67j#UPIu?_e#yy|?)8ft^kXfdzMn@h0hLoSB!U$n?z# zX$^fkUKD1X;Bo(Z{{O#nuKa)Ydn5C|A&m#!c~kSx8swGDQVMt;H1w*gCjs%GCl%!V z?uZAqH;(!rLI$KlzU1^nePsB-?vGh(Q+?rI!R03V_fvqW{;X?f6WYOLC7bD&IkrGS zXQSCK4*U*s;br%Wr~ew)zig2HS}OBxWeMYTkm9J034;0#Syi0;KFJ4W z@yNQ!S`*Lz3k412xE+c?B{=x#J{R#7J5gKMMig({WqJ=H8`GyF-@^Lz#F?25(#W+kfq*fb8riUvA$;mbbPF7lv-L1^R4Sq8>0l z-V5B0vu&0Wf;Xdi^2!y;X|M6|zL?W`wDK(D;Vp*hxIj?fZNr{#j@mYgKM|F2MMt-z^h1*SjV@ma6KaU&fA(vI@T#zS|Qe*Pz!(5IvD zyY}tIt26WeMjE_t&-2@e;hhKXSb~SQ>MP0AN(67$zLYrX-rIYxm*4_|_geuKQS~N& zSZ&L*vo~1C@bGj5TaMz8k;*KY>Ibkp;SFiye@4~{(n#IvVup62u zbr{}t-w7Y@IXvU11-lpz?*dc@QGFqo2Tz(E;|I;;PpjG%665`*BfR*Fa4{$=aNkGf zBW_MQHg4S+@=S^8o0GN;^y%1cf5Gu&$lve({Xd)0|0{nZWd7eq<3aZu5MMyQ|Cbvl zx&qIG#CS`NI3ONmlpGa*0`Z_zV~yII5f5q*Oqss3h71=cChsh2^MSYAY;I_BrGUNC z)}2?kwF9?$(^op2cHmID**>@L_#I^QV4XWv|K4jT-!ZwtbvXzc6zfn7gupJ zy$6x{>D19b$583d4$@W{yo)cK|L6X{#X)V#czAnkcPw_J4oFatEEVquk$V^IMDTvF z^}XWvLu7d3vWjXOhcA4wEJ?85nF6|_p|?v9w1bd}6{cg(b|C5bF58Zq_>Wj&xeQa6 zav}ICnipWUYBW+A{}H?P!#1@=FyrAZi0aTFs87QLOo}Y!17($LTn`=+LHJRp1d>DK^oKGeQ#gqKllG>Hr-Of!#guq z`KLF6_wO(Eca9@?`#tQNwI9J-(tOFO{s?9etl4xAGwG%t_O`d1qnzd32D7TNCp zo$&@FOvg)t`pO)4UAumi4`|!nYzEUxKJH{e!azr2Ja%)djVMQ&C0uN86Mt~nsMKv5xlodb2U)+-sbD>G_pe6TV;8D zP%lh|(_pJ$Ne5q8m~UUDsx<|Wntunigtvn&YEn+KDYn38+3eUu|1$p{+PV9UteOz) zhvv!haMePDHxe>0<1T! zP}lq22C@{5b2RO2fsmU{**7gS9*=G@ev=`LS<31P5=d@%c|RC^RxrqzFp-X^ld>^#G@iv6MVckkK|7L zJ|zS{M)T$m_;3C!j*s`kv(3Bjw=v#;q>t(lBdE_&Bk=Gxc|M?~tGQfMj2LfeyU}=A z1n-~`YxY*jO2U5*q{BDb-I(01W=TQE$ytRV{?=lOnf8PI}x_WaJ9^N7o z+m38T@Xj>i9ri%*u97|#brivSyg4yb)yNNK;eW%j$<+roC=8gA@TCB&UdiY>iFR<@ zW4U=D$qtC-sgL`5;txpcf`32x?j{7!NAvs_EvXv)jgNP2Pb?w!a_{H|4*V*hvoVmnuRxK z+}nf(?*|emMzQ9EEObN#5AUC-aT#8j%M{%2pPX~Tw$F&H-Se~03-_1p~ z_ydyB(@j<8QjFJ}^r1R76V!Jh{rCQiQ9dvc7+wC-{6IQ(PXpW9ou)8Jk5eSF6#^y!eX_{qOJ>hJuI&1ww&BQpP+(|AzzZLbGZ z4`M@Zkd9owkA&wz%fu`?Nr(q|eoi2HA|CYBWM%y>>N`lbhrA85ec+B)LOZv1`M~b} z8-+6yDL{1Yl4FutZJ;^-V_$8ZEy#N#yYaUU{(#i3r)F!DCj{R?^RyD$Mj|p!;0^-c zGhnfz62^PPzC(445!81kJU~;pkQaoo%{Jo-As&#D8U}aFk1hi{eN(JhHxhf$iscf| zIvN6*-hvx*2+tCM|r`!9BB>H)5Lfy zYSny;` zgEw8w7eeqZ6M>|ucn5@^D-lKT-Y!|DlgH%?pYFR;;CRsoelY>Pn-@y~^QKs{jy!Jz z7x$NMX&T9E-o$MPq`ulSE6~>_bWV1 zTaS;oS-e^Iu3e0WcOj}{7eReR54$X_5%;c*p55|kBQf4m#-ue@A|8Ojxi>_gco8=z zNv7O;YSq}7-n}_?(x)SK-fK_ikeTMhlm_pLzP=q8-rE+asNvy#DN@K)`iHYb1Y|6}OM|4(tq{J)>Z zgX(TLWl=qdI{#OtnX=<~kcx=cuDYW+>!MQ*t@1`Z=(hOnQR)|@mLKR{`b60W9ywB` z>pj;G9@!Ug(I_+f4TH;` z7KI7MbR3XQFZ4{4+synPltG`49lIZJC1=h&V)xPDT^lCuh~a(MaV;Aj-g?vKD_v%!t3W~TTE@fs7OEqQpuUmIHA)fc zyg>PLoc5)c#CRJ$=Q^oVUJf=lvfHZMBp#5YbY_JNFUn(jyc_7$p%gLuc6GuG-j+0Y zKLx)#FuV=!j#sVE;2m;9 z`h7YDm_Px!G9GQ9|DJDq3E2)DzoWDAQ!PH;qD3dvcoDp@yvW=f-}O!Sc)tag#C|Sf zJiLWb9j^)Mi&o$KWu*@<*m4Duv#BD+`(V+mRqP1f&2!-~on+zxiL~FdONu9l>G7sp z$J@SJYJZluENJk4vSfZ5hPScM%UO7MpPk4q8$j^hTItqF-JIZU3;uZ=!TV5HVeIey zKCr^4FTBzczVJJ-xCfp$C}8e+QgO?fHbCBXHE8=@I}npvqAFj8k9Wv*Ax)cVA^1F+ z_ozetqi_d4-s{r-kGyVC0avps;_R1M0dH%V*WiJihH65)K3~xEx7zhvV@wO*s;|Sih z+3hY=ygjdMG_XhTW>^23c|Xtx*3bReuw<4mJa~OXh&>s(z2#I?RbhM^7;-e!>*TWo zxoW;eN4@d!9&O!}7hEC)=b?G~V_&oSSK{McYJEiW?gz%3|A$c>#RT*1kx4nI36Qem4h*?s{BLDS+FR>^e5m3hE#i>(ESlVEpEDuhvfd`Jd0@$&m*YLa-58{|R9}iR7MsHNcqpJ*dKsE*+K|CBuXZW(Fi{8oV2hUKz*mZXa1N4-apP59<2Y z5WJ5U$$a-g@ILoAQ}h*rw{(B*t=xOwuwe-Q;WR*o#n;9-@2;W%xfjjs``Ft+TceNa z3Tu1dvDK*I=zM&b6yL$CT5Rxuvl+fg0!3F`YbXZBIC zKwgkDNJ%JABF6jRWbTSZODe$0hsAzrUBr0To_xOe@mM9(;~l=0J{=!>_{ZzKXRf!j zqQSdvw+(|Z0EmcDBDKsz3v*&AHBtG7( z2_CV+IgE!lC#nM?s82O@JKHOF9uUP>DjzLHjCX*O6ZaAX@0NzAwfn+|m$%5gK5`|i zE0`W{(x5k8I+XbRMRHS2Iy;1GS~|KTERM1NZYA0=Ne7 z@wRALabbQf^7R%pZ;=C}wlxJG@0NV6>(4JT9^U4tj#mWrMb0j_ADH3+4-b4jW5iF4 zcd46-|HEY!z^8ps(jkC&d27r|!bBS6G5!2M>`k8z#XCNtA1}?|eSik!_jZk6#uW(Op5whYse5lvzMRYwNAT|AdX?EL;RE+h$n}=!`@!*d&WNA7O93wu zzSRhWHlSIZk?wli4!GwH+NoT{$9wk$Gx0v;?kzVoPuJol`I|33-p_dXD-XLf9^R&? zj#`5HxVQ>+#I<-qxb$lE0f-pyk2MnQnF!vblJz=2Jz_K4 zg!u6A&N%h@fE|Lj))&Qel4l7)@UAKvb&2lsg5%3CNUmV@hu?n}ofd4P01FFN zqo3DXfsg39(={CqKre0fQOSR~Vn<-}zz3ZgA$UES=LWe6fN%JCOJuYziax}6c=Mw= z77)~TPew#;YN3FoABBaW;#RQRQR$S^O$RXeSztw%v@@>TR?C$h9Y;FI0W_~y zY-*zKU+}hl5PjntU_895P#snT^(9MxJeT|M%u0_bj&@4CuD z{Ph;srS-b{ZHt-y{r~u7^y!GyOMBezH?zEDOM`dQcgPyU`-osBHy++sB*;ZR2;O^G zJT_7B?(QS-DOCCEF&X~O*=8EnNCCO)x03GEA?|%P3P4D65;NP< zOpy~G@6vrg3YH=69fjt7hHrQOn#6bS(}wTvU6o=yyh~6WCkW~jzj96{^)e4wEZ!qB zVNQ&<`W~(ID-gVwhFyQDllqi+b7H{7G_j(F`3IyD`g9Zv6i-~ZJTw2>(BR!zqaudk zz0T`27arbIPx48j2;S$eym?LCd$V}HGBy#xn{<)oafORFJnwf$#L{Hs`+sI{_3l2W z02j%n(}kU_pfqhuTQ`>jm|n4mP2x6w?=4XrY3G2P-kL=7?q=_@Z~K?SiH{N-Qs@0< zy!n42s-uFSKAXbShaHi;AmBhv~p_hAr! zxBT1FOZbo2;SQ4Q?RP>jmNzV#Kf56Z{}IbGCqXk}GY@V@`hNuf_x|h)s)MM$l;l^l zPF~{$UmiHDgX)PrC@OBk^-6jrFbogcup)%mgWUAFcbKUQGJOX*zL7p1<<9zrH=|}c z$Rjj(x0yUTi{Wj&okau>Z|hGRzbhbkX9zz(PQ^Q8?$@Ie2;RSqd&1)0O9d@F z{9)_V-=06mD4_DP@~kCzla#{8(2as!-DDB{i|A>8~qbPsujS!6GWgig{sOQAT zdufuz4JB#D!@C95Ax}_W-!1Vi@|N+)ozHhX*_a;h zoKgC8>`P2kF#B^sniCD)txP)w+&|zC+qY>-HhiG~HJ(k<-?z5{FlM0Me8T~JU*gBpw;vyGvViV` zsMkX9IGVS;({6`?Fh1T#KR8bDO)=hp|Y`mcB)Ys5D)JQA1_Vn zB6z0`?T+wA@RoD)ko80GW((-_Z?p4)e+62<$k+FWopdPKC7&rkzvX4pNxN21CY}AQ zN&GPA9)2gQEP>ygNH{-#9s5=Y{($Cj%V^7(+`z}%xN)2Q&JM=Idl9N*3qgG+I&HG= zA%_!(%AP&FmPL&B)ZDv~KiDdPnT2V)$KwL{`Vu)8OI4xnwom1ifwjPG=wm-plZ?+p1?Yb|Kv$tp-M>KS4IT;`C z$567!!ve;`n-$eTRNtliB$3)rJYdiL=yR#b#CT6ij9gdP{}8;8{cti@m>BQ8{jB_Z zUWqgP{J-%aeL9RU8(c~|7WjAn|G#(C{LlVt$o%g{<3S&NzgS`(BxI?$2+xDAlxdlL zaL!rxbyuK5FycY!dnao6kpU@aS6211veU4edFVh6O8^}4O3-y!a1hvq-I(u`{|>C( z=c5tp=md6DFHcL3KZ-lAzioc<^&>?H-i7APi_lPg(T49qp5B=&TX}eKf4~3i59j~? zuX=;(@FJ)$AjDm9ml-ektoQD$q{I~AlKJ&bS#PyoJ_1`s`jQ&6=~!a_;Z%R@VJ_2q z5NVn|9mnFPe@KXU0|akZ8oaxFC!;XDHEUEB;^D0l{k(Vp!CP;nrZxz{`?|8ww-pH9 zTORM`^&C76mxYxkx)1on3U$wNj`I!z8`GAM!K!yaV3{A!P@ofdf6=1zZYMt8=97YF z-v1PWyU;wZcbV5dEyTZK=j7*G+D|zc4{tM6$0>sPPS!6DQCH>zb+#-^M!1OamK@ua zQl0(?1b752^jQC#@SlU_jR=bV78E@k@`DFkP;q#@1{OJ-a(|0YK=Z2_&S<*Iek;H=o@_ZK2h!Hw)iRIEpG*) zIy?yKyV<$wy&2L$X1x~Ku#rTJcU)56`CtTZHI|E;_Hxt`;!TQ6HLf@)%k+4Y66n*B zdREzeAZ2Dia-qSybEtIY{y*ySR^rN}`FMDXEp~+2kpZbTpX)^+g7=ox%@W}V-a1CZ zIZBS6u*3hy-kpb2)wU1g-<1lPwt31JnF*l`mnoT&iX<75vB*5nREiRcP==xzQ7BC- zBJ(^)N+Oa?QklwcslD%aAMf#9_uAj%ec$i1_wVTW=kD$~k2=r#+~;+j>skYQMUY#5 z6m-^C(Y}Cc5}a_Ht{?dE8gv+@Z}xq36ijWF$WSyw=3P)t-)uO>1`*;8?Ax-x{wp$X z{~v?NUDwEucRs!jUzGf2d#H|{e8>d$aPL18^a*`HqCb}+{7d>J5Exz5FJx>$<=wus z6|?1L0>y7mn2boPBUt$QTID~tw;U(pJy@#t`|}nnysKNBxsZ7Os=7164D;r&#~obZ zJ#OVYe`{s$%{)|AlpGA*zeumFekBTu73=x#vHTf4jQGN4%g_&2LHV_tHIIT9%XT$t z?~pHVo!xtcie-omBE((4+Y%=D3YoX!Q4!2DKl0-pkFNtQzxXRv=CzfKpt{Iduk9^5 zZ@a-86^~%v$9V4FRVg81?@hJ#oy}Z2#q-8clU9ePWWlIe`rr5e|DR8f{{z1Qyn_rN z>Otc^Kb#3W$N{;{n~-`?*o|V5Yw!*-Mel@LEZl=8q-=(xTop8@g*}t>^8=x?(o%Fm zFQXytj*-0?x5GS6Y`Wl?4v*Q1(bPUWwk`IC+kbBU83HH+HYIcYaH~Y%&OG%9{ z;!+~gDy4cLmiz{!etaEbDEZN=oWK78zW<+jT=8~@J^Bt(Ba&JxeS1pB4;a4zh94NR}cGZZZy1$)-F z#iTkT^WNdSRyb~%4I;#8IBx&a)Pl@=LrrggjtBYi*2UMsfRf)eZmiL=6B97p_cXrL z3Z1vzu|v-iVcv>^S1#1ml5jw}=O|r(U@pb;#_S`pj)++4!+#D){fKyf*YmeJe)XuJHYdmF8T4E!q+j1l3#sO`oi3PCh%CiRgOUuop*L|dC8N`mta&YlJ?{j z`sPHBcE0YFF+0U~?_N66>UfYa(cWNt?^jSp=dI^{@?ts6Tc*l?lUFhc@Bdqf+gv^^MDe^aOC;98!ptyk^Y{7x|AFcK z|NOUrdr&A*51Mk`BuwZ*p4D6uNIhuNfxU+g!#ya*!1&e~xCaHC$tSj1ls>G%16{qt||b?ipT@1>?;dv7`xj3%4w>s>rD88Ymc1a`sS1F!e@ z0X>0HT1deid{3(naic@#oh9ZRbd!S}BE$uc^klG@{0nbun$IV`lHU@Wjjv-jN`BZh zsC{!E7U=8v_!}gk^ETZlktqxFKJfAip9T#&Z;YINs}mIu0`D&&#ha0MZ^79Whrql=ei*{f!^~(}@Y71hxhQC2uQ#W06$e0TUNdyw6NrK0 zKHXYV2quAR)2Cw-U;9A*?CEC`TaJSY@pVl&8BfG+`)KCJW=l49s1hHy+Dl%j|6jf! z+?NXjgXUG>_oI zJ*Q4<4G&0FTgp%DGYN!3*lJz`(8NHGrK4+Aw@-rPXSrV;>0X0MJ4>H2+2f#o*n{b_ zJ~Hp-$MSc_c-Wx^e4I&6+we9!jt$*FId_{h|Tkv&Mq2%}BX+sX{S5{!j<+z9T z2s&@V;lx{0XS$bXTTpq2GT>_7U#0x7x8N8_tK+~@sPKiPtQFpYM7%$xv-J^pzd623 z1c^88%Qb!}FmF}vw}UHZZyWdZy>N$l?-f5BE)fz4DX1KE%^Zt{yjb#L=M*QwBL@ZL zMd8=LFLH6)8)rB0*5S(6um{MOw~kD#&Bjo(L+|i$cf(|bn~xxGP8QxuhuY_mA8$e( zODOq8ck4&HuEK)oEpu(v|BbV^GiQvfE_>CZ@|IDjYY$YoN%8alK|op^vr?`z3|4=i z|Nm$8Cg&fVw2E0p)Pug+2b2+dPz?>698wPw+#xi~5BH$+3cI`G;T~iMWdyE<2c&bY zqBCsKTSK{jkLCG&wZg2ksZ!9=geAzVr5&9Avk~TD; z&hiQjZo|d~QIjwrO0O)T zd#4ox@vq;@*m!Ufly6RCat-VQK^J}%&m1}q%GmVl`z|5#cIj#67nWs*2yqVIZ7K@X zka@>b?R}-u-Mzzzcu!|gpCRzRxXxG- ziTA4tK1nl}cgpi|t`*)z<~gVMR`%W+ZLel``$N2e(rkU^G0=n9;=8YRPl7utqgvr4Jt$hxg>LqJ=^np$BPwUaN%EgIeG3jeX-*pczQVJ9iH5LAJPF#=Gzm zYqwJ+@T$HyR1-BY#9pGvQ`zrf|AvANgqj= z|2yfQtqHKM0eXD&+}1hh^M9nA(Z?^Ulz$B}Qi`-X_{6R>=KT0Q|F0$Dy&xjtM&PX^ z)v1WY`!Y-B;wPB*Y?pHU3U8lx##gFf-oe+OZd$nN4VCXb7H7O88iGF5bIycLf|Qu^ zZ9jW^!Os4i!$T+C!NNJ3z`9e&yuIh@B$T(XL-Y8!OFd^ddY?n)-F!W1z2!Rc1;Sr|x zf!-!OG>A=%hI)%e)g=QaK|f~r%#PV!@R(=0RL{j7_!q46^2tEvJ=igK@x^v_h!AJu z7%r_?jLbVNPT|#=8S>jfzQNa#j*?%4ooGuzITo0UoT#XLfzF#lDSAl)=A9TQS~jk^8%QuO{OC{rpK; z0`I!Vnp==~@8^cwp*ePP<6GI(_VE4Jo1+2iz>*xwLJMdd(_#Xjrcf`9!93ot;oC+L+?IgeL;S_ z33Vi)0=Y3{KMDYQ9_BK)={bBMV`riAfdWd4hK^BVd-Wep; zk)^xZHa__8`9GPAp#Po*yu@z!Up+`@)vhMxl^(PXeg{d-!^0S)9`rg;M>iebL00go zvn9ekDB_Ue=vnv<(uX72E@GR!Aiwi^a%O>%(68Cbx86DMBX-lwLZULgASM5`%pH&8 zK*qE1@hT(a9b{|l&Rs=6*dQr<+_HGD@~M7r#QA@%WAuHdAo3fK8u4||qU0BTQ$Tul zFBaHIJiFI+9lZy=x85e{#a#=+e^h)a9VOuzq(wwmx*V2Y95iy?YG{@)Db9@>=KZDt3qvchn$0ros|=K>E3H zi96Ma{CJi6%|LJXd zmbN-sf)u~RVs?^N$5CPWOS^x+|38N2fAJRl^}aHVzs2V2IKRWk<>@4>+epSc8izsXh zph4!%)mk&GLC+3B_&A$pOG|zaWZnXSuBv=y`jj+_jS{2c$97M7)2NFNP3! z#~gD~LE`<;(6O!(<}D{K)tmtHuAKDvauUA0m6~v+IpKj9)Ridv;?3142orp6{(8bB zIK3xM$M-}pxau`X1=YBNfP(`u@@mMNlK`7I9g~glNk)jT^?*hoY`}XQGGwmQh z-hTKx`cd*z8M~9dz=s8Q5?MSP?~~5^)Xht;F6>0VddqzolppP+r})ju{&dpnuyWbY zvUv9Q{J)-v_fo999D(;Bd3%nO?OB-jf?~eE zoRMjbf=qZHRz5vF2`2TMBf4{X!Ge;g{;<0{5FFDp!TrnUEje+u)}IB~A%1*ZtWsT( z8y_<7Xvfs7Hfi$X&5p0*1WJDPrb4vJ_VD?CaPxb261ukxkp6HR?%pTH&5g^`Nw|8; zeQPM)fQ#aJV>n2xqlGO~8s2-;!@IM!tFB|{1!=X{AE7z{|M2hs$n8%6USgU4R}T_e zpESX_(t}p!|E?;pbx1uZ*1D~DFWiFyPwtXQhI^1*Q}#zG_!}fQ*B81Esdzze4nMm; z?jH{Adv7SK{d^LHyfEXE&*%a6H%(u&IC}sdy5y^Gw2+tB=itdQJN$`VLR_I~zwjPw z;yfK`$sYPE@XQARMw#&b`9;XcCCL@JKZ+?*Tlwek=?%dw?5XL$CMs zBl9-&IF-=X$OaMOMpiB94!uC;UHjSk!u~4quyAeSZ?Xf9+;M z+tUL+r1CA!$9RBMXQeJx)gbf6-npeC34gtn5O-Zgbzz|unYXb**Wu;+1P3pPq>KntP)91m4{0FIOY+E;2e39R~B>`0(Y#%Hf1`b7iVJ{D8EjB38ev-xFd| zvKwKXh=4xEZ9cFqe-ilEO`lYm?EztXZjM^*@BllQvp;H8AoG6J<=93Gf1F4MAD8P9 zF+4wp%-g@B<)+nj^5b2JuOkE{zra&(lxkX-fPcum=lUG5po^+F3cK!mt-Vz`8RBF&pY5gU{Z|;;u!MY(nSVE_%&KKP{f(dFyQ^t&Ynom?VSfzxV%>+o=Cv<^#|F zY(zbXejD{YLJulxGoeH3LHDQTs_5Y!6tVuB@I|->u~i!{kHGUkb@3+e9|V6(5&$S?$X` z733at>WgMlBZTzpU{;_>(dCI+9TG+fHL}FK-G9#$_zTk7c0uAUYcX>q{lI;3&p| zLuxPjEp~~+y$lUPl>hy|q7l;SuorXJyYuG~J1Y@yx^*Qu0`H-ZJR6XB+cg+x@W8xF zCw{)T0P~K@uaX~zc}whIpLZGag0MmBdj~bcAjRjYo}pcn;Fitv_-^4IpgM2#aLZ9o zpk>@vTHlJyn=|*y;>-m$h!7`ye0JoC1~P9G3H5T^Ci3IWimziYN`Ciu4h-*;V+O)! zS4l)%LFau<{tj&x%=`Tfr{2nY=u0eyuQdG8@&k%rVle_F)-gXKdgbWv%Udi&ylLC{ zBnZ5NazD`^@jh|e(^eej{p%}ay~6wCt_PRiz`QTlvPy2g?FBU?%NKOUgh9e=c@J;3 zOoE5ruG95eJz&D`wK7J{6I6`u=5pP7g^%~f?10`H4brPN5g-xX`|D8sx(8rChW98P>>PDtxmIh@Fp zt)sQ_f@W};JfmG_dFn1-kjf&S3s2s@JqnMA(+rg#M#```S zM2M3-T@B{#k$Ioa>7={9iu`!n;p;eul3(cC{COn@cj$T?LKE^jGQJ^v90^S*u^zI#*O~-$J_Q|&Y;6CmD&TpMbS{)T*GY_Nx%>P&--qgp$wF$i6NW`p1;;pDD zp}zy>y;mdqGa}X`yfU!y(pyxz&R&C&6WJpNYY+96sZa?`a-dh6-~NGJ zPi+U8K#D!pk~;}|@BNsggL3fMn@!lFWaVx2+gtdYQ@%h;n<##BqU1-Ww|6>yD_>3x&8M>Ks+(CV@MHiuft_ZZJ*#?tmSa7tjlpe52Zd+=Bw1 zIx!tS&Iak@xr);0VThqJq|KX3i=Mx z>uix1t9BjOdQvpVVF`T)S#VajPB!cX#rL2s38d9=(o@dlMC$JoBrYP}%&QIs5_rEz zWX2-#ZY$&w?t*#$GT(bY1?K(vY~0(+FmIR71>;9vdPBUnTN+;+35CiH)wg=iOoD~g zmOSQXyTKJ>hn>!Yo?z!E*TVKJWZr3Kj3+1kVcz&SixXqdw&o-A?#O65d#8Z>cqilQ z=tjveQQneW#SaTagTk}&Ncg-($BCcVMy)#V>&A!cj8{q6LB7cop1@U6Ja5cf(&|`c zx*9C~x&NP&h&NM1fINZs714K$NW5iVP)85Lyl=i#Fj?WPraoiv6y~j2+4^npvNz-$ zsh`*u8w#!OWiQYDJPCxp{%EAV+YNG0Z+Ni(i6<~ny|vEvU*6ubEi%gBV$DxLKHv$Pjiq~N7?31r=Q`!Z*Sos;>~!C!s4 z##as}1_cw3jKaM4rj$NycJ+qRd))5xmxe;d?y0xljZT8_isz?o>$-vK{#MC@w>;s` zIOG@i{LB1*E5YuY`B^rI5T_b(BE|h9GVhS~k)@ze^5dP0uOl2KKSmSTQu;+K$TQ8` zc_$rxbE5J3aE1%a+v(V2p*B7eZcYrmWAxVW0p-vCK_u4Ezs^|c&%=rAM7$YXwkHsH z2MGkzBk?Y85PGu=^9~g&J+;F7W2e;63U8-ag;CF8|3CCaW4}}Ee*t^+=;H$Sv zJ7Nnzc7yKL+XWpxo`K=*>_RjY{-xI zCVU-^DEa*=W?gbG#sb4^%#D^bbl$q@DRz95wO~5)IPc_R^s_fiW{WIug%0I!PO?a= zqv`Z5wc>d=n>OovWw(!6Gx&Qx{wjw7|4>EYRcqS6=K@GBJ zahKp8lr7}CSPJ(bXWByo1+hMmxNPXH?vW5^mbc7GfDH#`*0fDrXzcf89nHI*1Bo{$qo`d1%sb`AstYT;LoU?|T!ndC{4l$D!^H=BF~#;>`fCU@9>3td zpAiSTEd9b=rn|s6>sLwBX)j-db4A7hTt%ermMz-DP?V`&UJ?^457_OhRK!2DP?vmkW?;$=TV3(UD-EVFS? zh2jS!>QvI|(4uM7Dv$epd21sPZ}w+mfWX`1P#YT(?^Bg;#jn7;#d=wlS9pirV}B3> z^JdC5w{g+(feaLOOi`^3g=n8(PhOzGfk*fBgohcsL3${=M=9h5X8kec5*En3HyEy> z$}?hvzT@Lww(&m2UPk6^Ji^N*Mo)gcsql5|M#<0rb9woh5G-g9b9!aUpbtZVNf4B0Q0tM>(v=z^ntc~^!)6@8ww?z=Fxk+1_!>Z6Zx4d+YJmp z@7>pT(+dQg$eMlQip;z4!^iu1j%-j6K2EgGT-gWy&w|j6{`Y?#VLwweh#^1TH}Q2i zqU7gf361ydVFtAQ_IEi*_UI z3Cp|5hh;;d5_N$Iv!ikjLo^nI%w%pHN<{D83>V7YtH8W(b^J(P zc#3}ZhB-G9|Hfzs#q-7_kXFa3qZ{**;H$TP=l}nGAt1wlhv)xIL_LU~rP`d(g97Iy z_>g+glH|ST%5V=7*3W&F4)-9H`R%cE@DrpFXFqJ&_Q(gaX3{!f?iB(BZg#U~lg9y} zoo}}*%XEPs-5sZ&CV7MKXX$yNvdBHixq6E#Zv`tvh^tK7^gs>1c8T;SD3*`e=p0Rc zORPP<4k?uU-m~xPUjx4&EfJ$-Awt3>_Fduby(%B;freXkRmThoJ*X_)u6)aV%I`rW z)-h@x!3j!!&;P zKmsRDUGp9J_LlN9k6s&mWQ7QEd!gv>Lo>*{_vpMy_OKy8-Vg9~n4#o%k5BsT3>y}7 z-5qniPQv`ZQES~7VVL)Kf4N)gg5ommU4*1?hrBym?}F z#0E??$G;(hiFF317qUCh97BMs)=r!(8u0`orEb=UdU10QJToRuV|D+E&0K6dV& z01mKk3f<c!NfwNWk9-^dZyIw7c10+kGr~8VaS35dH%;H#w2s? zCO_Wi@O7}FtL$&dH4@t->KQSz(#;(zX79v1kg#0(XLqVuM%f0(rf z<~=>vi5a3rzk3TKU?`SqszC9)F@hx4(RWu${O|k!kVaMV`gwT%7bogLA`I;DgdW79 zA-oBx2W>KV_lAdXd1yrNSTi28D1?fw-?iY0jHh^naXX4K=k*K(^7YA*P?{tDQGb!Tbjou)0L1XKzV*9%ixBY^*zx)%p?h~7h!D5u^PI`?eq`R|G1|%ZQpt}u4Ze=&DEY-Qb{)2Siv>e`>X0!BueVG!;#Aau z&)!B3(N4UNt4HO1dV%J#z;(+1_I4_XbwGjcAz!2ae*f>E_D0S>faiZ1q8=nk`~9B- z(ofog5=cF$q2uG3EOgpQ_nSieP!N>kV4+I>1YvoinVSKEUGrP-(vj@(yy!#O12`Gz(;jkBc+=buxv{1M$DLm-Te% zeX?v2x&2Xp#@A7elHYzs6S4bYOyEgaY+(=yUyxo}?rNWCYy^9EJnSqyg+3rf)~m0M z*jY^ZOKcr!b@V)ccYpNp?_iZA>)47u_4$JgP3lAp!YS`+6NOyEJZ>Fx9<=sQU0 z=KBpI#~Z=p3eTJ*cl66!Vw~UJG73`u{6D}!S{)hYhc0O*{^l)3#9QqC4i^G%eSwkzzy%)!1>o)z|inwx1Zos|^R8$5Df`;J5xfd_ReISj#KL& zOZ~ZeD@nwAvu{=hfw%CtQ=&+`e}3-~Zi0EAx_A7*3UBTa$KEqA??%JUfn9n&kS=Zj zQnU+({2uJ%{Aq~;>qS)JC3kd!wXBAs@n?O&jEpEa@IIr6NDx`uIAAQ1WxSb*rSXjtP{7-(LNNgzx`lWUMXb7;FHKti^RaHlW|$ z5-G*;V3ULd#cxg`B}uEJj`~OF zx(K~{=N04}TNBg(UfaH=U(`h3dn;CO-9Owz`QP47C$SFO)26tv6MygjC%4V|f0++F z|0@vnAi3`^j0io*J%&*ZsRx_sSd~v-yHap~oIMDD_Z!CJ4!~#v@<4S|4 zRioff^Zu7Lz(2WzI(hO6{Kjdd|NlSr^W6A4cB150<+L}}uLBDP&ld{Nze4Xp+g#u2 z^~*JZr^3HN#koj0K?1k3-QR0c{1S`NB(aWkqXR47Acc9$6Y-XPRlAnJJCXaX3=;3d zEgpLh!@Rd2;i%1mdG|A`X77M`<9uh6pB(XqmR_{)*R%|R2Cd}0WukFF(IIUs)&!pa zWewMQ==p+2A_6+n|MLF76a9*TCAlmRA+Bj^FuN)0I3n)`jIiBuEcx+{#MjY;lHcb7 zk36IESm0C4jgcbZ6T4>9JH5r(nn10B#=Qq6=sQSE^(0oKrk?V7*N|4n`UCdVseew8 zwh-}_NnBzi@Sc#mBaOtnCX&k66Xs1fY45wjyVPND$N}bU$rh|qamE|+7RiWhj0l20 zUs+ZP4#j~A+h1khygESZV2cwF^aTpRc#b5%HFG_^^Y(yGT7;3W>L;1oN>7nD^?TA%PX%25Zk}or8HZ zcNeLjD)EMJBa7ah_ktisBNM&H{y5;+r+Th0r2`n>)9_?q@C7V>=lhQT%gu?$1brlv z8(APWe4IC<0rMpWyVDWE$qdXiA`R}9qi;@xhUI+2 zVBYx$2AnOj(FY`qi=SnWjv(cCZ&K?x$$T~A&(~XIiFixNeYi^CT_wI#5{b9o{mkzP zFz?Ls`)XDWCw@h4HuQ#hW47JlxYFbel}|Pai@pkiY__bnnfHXx|CKiQhnIJNXqAID zT#tM}=}_dcv1sJ({j<+r@8xS2=pjB%D7&z*mI|47Z(rOOK27rDy@0QyA0@wcrCmaA z46wjNZa%W^B|7hQ%yW(=O^slutFQ*k8}w&ym%_&}!wWYko_AsxX?57wuy%XFUvK^U z{QrMy>ilo~zVLvgLeztlCZ|&gJ!nJxdL^VDq&mqILIwAr=9=y0IdBiUBi>Cd=?;H` zWOJhareoev@tm@%l4v0GivG^K`dl0^)8Aa_<=YPSkKWcw^!5ey(q>gG2FUaOp29=x zHa0Osb@;fdS-H48A0Hi;Z>9JiWa>g%9akQUK*_PcU$LW1#Cz-T#qR{()y6*+ zk$CUvPt#?Ec@I4mbz0%=cxX&M-%UX?xk0#t*V-G>FB%(P9Muk4yiz2VlmS#BUbah6we!jBdv~Z=FDT+ zw|}4iD-rQlOl;jo;H}4UM*)d9uLbvlFwA@8XCdza+B7h4iAV#7N<(i*$k{4p zIxG;%v+#Xcn1%yavW%HipS1(+121OoeewZgjyDb;SdGkE*z)_Om`P^nBR_wf0AB}MeuqUy>g3*F!Exc)h||63yo*I%3*mH{Kr{`Lb}R{RZ&@xn zcqYZml;ZFIk07xQ$BeTKHBrC2_f{g_3by^W1m0`=g5;5S3vKiAR)Be*jd~8P98UDU zQ-b8+2c+p5Q@&r8_l9PqIG$EM3WU0QSYHcXzyV#FTl05^+ChE!7Tb@HeE{#QL*&5H zF~q}!Nc!xMlGQ8_H$HA~P1ObNv&g)8Z}izN!0!wEZ*0r{M?%B!b!S&Bg!?0cX-Mtlwc*_d~ zEE9O=8LMwW;$8NV?zA?{J4;Q$bA@+D8SXF#JpaqP32Su;dPASOilFNPLC~e7YtEtP zaKPM7!H#KN2bkm&>&X-M1q#ijsun+yySFO#I?az57Dyf+=f?h^NvHt%>}@gwW3u}x z`SDi4*MURHZ{nWkYitS@oMZbC?bU|PJA1(8#W;NSR@J|FUM>gy=EUcjQN!--TPc2X zay*-~IvVatiif2BJ^%k7>EZvUzX?45s}uDgwPCaHl^(QySlmfJ=nw{}2T_ZttuJvc z&}3dCZgLIoLGeFiUKGLezhSQHGF5>O)GHXzxtlQ%QfZcxJp2NF|Nn&9h|K*q@J^(- zAiCcd+-4nW-S`;Q{d|Iw)&L-$$P$!>}5!PgOqlArgU z{$XGE{eQ!u+h0eVq;T1crX}AjUlmd$HL5k_5)e+Q_ zvFcL%?FtyMA4TdDnG$|0;xe>l?`kTl@Mz zFJF(SjL`%_5BSU4uRexvZ&@3v^1ZJO+$bnjV@vl1Ph4b~#ZMvgKJ>1r|C1*(^b{XQ zuT4WGIE&1?IJ~f{{3rP>u?O*W+(XGP(et>{8w)J3|0p-iqKeL&pDJ=H3Fh5*CTBY* z9r_ZBx!SnKWBo&l=S^}Ql21~%{JFhFm5BHDbH}F$yxksL+=j&aNX+dEoiOkDO1pv; z-dtbSvE6}r2iU7!YnJtao+$*SNvsQmFb->T-k0FO!82cR)~njVbZ~FqETbQo;A;$Z zvq#=R3fdRm{cxHYBE*G@b;q12J%-rTRz2q)UYa03-u(DFmY@B5eszrwF?nH zDEzFrB-Rc>)25H~jrxMKjPsRi+>m*Do(r~`zQzm@;_km~SFxT%=FO+CdM5of`SCuE zuY(sQzf%u;oKnZIAkL`Z)B`4T-UDN2tt&K}!6E7`&goR>UvJr;oFF%0S4{D|t4OS4 zeOattP5AH2Tib|utMKOL6L^P`H-eVTWWOPDW217onYQ4=Q%_g z^6L;+HNsvUV=tWX;?Z8p-<%vKt&VUeJ!O@Lf9L;y{{G4N2k`u_P1J+5yQeExdeF-J z-)O#f9a0Z^Vl|Rs2lpT+-;M8b;U4r^?PVzrK0(rFcz%=fg)ijH<*9SgJP;aN{lbRs z4Gx^st2gT!X$4Vyj60jI`h$*ZPI`2W$UP|E;L_y{Cd^PLKCU~7|4GRQXBd!okS8zRl{wN&e!P$3>xe5f< z`$z5O3KGxaQj!{{v}{2T7}AJS4#gO8C8l)Fk4q8L(hY;BCM?y#|T*UZKaF z(J=2-2b;B4c;DSm^W6sK?PuSK{V3xL)oQ(6UZWTYWinMBxZZ{XIl6**2UOa?3!e)I z+hYB|-88P<@>9r{x3tnP#MnhML;3i)oth6`P(MNL-rILGT~w+eKi&XehcZfj=QR!| zzJ$AXsE(CE;eUhoMxHCx$2>{6yk#4>Weuw!#SchJcBIt->2k|&`qRAu5pS@=PwF4u zW)-WEc*{iO)Fi{a?FTM=Svj0ga+5P$Ih+U-(mp5I=mXhXu!?S`PygnP&JPE%K%>q&>_aem_iomlF)xI>H(l7#pWB*Ac)dl|g(uScZ*3#zeKJY8 zky?kZbEEK|tG60NyfxV1FIwRD-k0){Rw3~g+p2LP7v?QiAelwX`!c4)2iNZd6{SeZ z$+8DRCu^5B$h^XVb*!Hb-8|C<1a@AraFp@`e%Y4s>pGFUH(lan^lC$9h!B_R9LVe6 zhTOfoaXb^cQsl>b1HO(9l>Bl)Z02MK6QDa(uW`y8op*I?jrR;_1vZ`g@+?Vsy#>aD zc2oRqEsEcJN0L}ac%Ravrkj7~f0A0pe>w=B|92AgApJULT|y6%xS~&o)PwrO1I9MM zJt)MC(e^sL#8z`Y3Fd=uvD+S~WvdY82iafVvD~sF2+D04mhPFuf#&YcR4ukv@WoR7 z*eHDfV7pj;>Cggl4-$OC_;J@OEX0A2lUr56W#I3Mc&+VKf6?O%Lk{Ra{m1#g|NewJ z(DHj|uX@=GenA@cKyTHLYV;oT{k!~n+Ll%zsx4NLR#%Jo=kiZJ(SaG`_ev?g2Vr7J ztE0AJt+7J-?-L|FBHlZ*Bj^ddFIMqwK;msQzV9n9%-d8R!@9ydaWGvX0_HuClK*tZ z3Fd9@dEy*R5Hz>(>2aH{IPmNI#!*FhN!T{^x}T=QADDay+@L&<%=;P3;ftN`v5+Y~ z?$gEoeEI9hys4HEBq+JXUT zm^Z83&DuPe_t~Yj*hQH4%)zs?4hDWukhNTyRdpcb^SD5)cM=DNKkvcuy0(H|hx}pT zY=1C3I*}&$FZciZQ2Usxtzm{f;NvXLYew!KK<2&0+cY9Uiu`zcRbl&f#tcn37hTf9YoKswU1=TUS41dsf^<36oUF7*+ZL}lxx)?J=h}$-hvno#oc|f|b&ud$% z2>J2ej;|vbCBN_XOOEaAD~A&^7cW0T=Y8dN7(4b3JpYG$wiHN2=e_Bx)KGNqCW_yj zT>M5_9myksyKi%!TH&oj#9NpB{1SopX1&DqNW51)?#~s)PJvJj#3X+2Jq~=F647;g+6s~_g>rXp^9P^&cl$_eK<1sY)y{re znHeI)sVJpGO8}X-`f9aKH!AYueF0yG8cKdHe8B@4bNK%MYdIM|OVD}CC2-i%!Mxue zi*zo-k?`)V4FcBs{aYxWH-?_XI{Z8sR^HzF_xb;SrZ4jS0o;R(iF%Mp>*Za99whhP zh#9E|HD%3vl)4mXO23n7y#e>2{ozXbHZBU9+#lb>q;K?tw#tl6)b0p|7A~v4RAHS0 z=0b~x)`87nN%(xTXkq}67{jiQ-GV$IdF4dewr#~iGWfW4_0?ZvIb0Cu+)Uk7E=RAC zUk~!Y*Kq|UKP^#dtqeM5z|Qb9!FU$E2T|$PW!t=K1MH7fLvB~0FR>VI5O(JFUCQr4 zq}EX#o^b8YD|U>Cc<)NAxk%uBxtI})#QXKj{^?gR@7t@fu`9gO?lCTnt?;H|J(8&7 z2d(E3?7hty47HdD9xY{<0#;U8ADh~mfx={!$dR1^pgito!OX^mjs_0osB0y-ii1+(DGZmA?aSMCKilUCPd4Qp!1%8D0s{!unkBgUe4y? zLZAOX6z$%B*Hen(=l_fMNvmW1q*3VRGr!OO4T*Rg+wMvx@P4HIh7pPP=1_jaUYPgB z+?(nvyhTh8x?X|bAg!eFL0ZGj4=T=7&^SIC1bt{LF4m=)0(7^ZjII@L0b;HJbbibM zAVvC)kfb6q@AACuipgGBC>B=?nv z!28<#Jq9G+!Ut*-$6?-qPcy!*T)jPWg+uZ@{D5@lsj@pX>3)z<`(lznK@hY{BE_(3 z%@pW+X|{fAWD6K??5_Q|><=bYV-y-(k$D@WHN|9I#6r{fINmf}dz*S>-d=p>o-sb; z$6Fs?2U>nNGj4x$tY88gbzgn$?L_B&DQV+&d7(DYbo78L#{~NAE$_Y`&E>4;rufat z(i~}ZuyN>?>z@04IH6C(+mPmd34yoel~eRcynV|qK3#x$hnO|qUg7=2W4CrI%zLcw zwB^Zjevl@0FAFXt2r7x1hfIFqfUn}^&Z@2!aD@7`(7Sv7fMKhfT9gqoZ_Fu{gZX!{ z5EDMmsLau4&oDCY_qo+a91oEnZ$cet`85@+JDIl%3w9<;m5#Qd^FFhYvu_>D`&LJV zhu~Qf=KnOEb9)CxDV{eboy0n>=go`!o&U*q<|ob!p8xj{^&qpd<&%US^pjPQ6R8K$ zahlZ~gnLkvckK3Ca1ToCj6dNB4@fyL?lrM(^@T(ZNsP3~hd{=2QM-T0Oo5-JD&Gal z8bQG>u(RGG04(?Sv=kq6MLe%B%P8Sauw;VP4*ZF$$-_$DqIW`^|D)6*`z-F0Uk@t5 z*Aa=5pP0mz%a3TVAo**ix1{s8fE^iMTYUtX_tCkI*Nz@c z5C=ZaBDn%1q=3xZ&Q{CC?jrf|cEQ(Si;^EtRm_*mJF(#Qz%GF_IdtBN?c0l$SGR-U z1&hPyucGfDf!3R=wGwg^KOnu(CasQFu5s=i7k=*`cN6j6d)Qzrf%kis0X8JwR;!rL zM8LdrIS$@g;eB6@*Ki}ud;5;$dm5*Gp$#oZwJ(kYL$#{on|(J;0T-d{q0pmEU>q9l z+B)D5HnW)N#(N_3X3)>LnsSN>lEKH}429aZI3n|&sBAD__9s8yboe?xq2#A9Q?R6Z z8Vf2sd&*`7(RuTokl3dP^H#MKUa;XMVFy`x1j23FO7XlgFG;K;H|l}dpBto2h zr(oX4gBq8W7kr_-1=GB+vi=__)t$_eC>jka^Qwxsbo9lKgmUODkakJ7MCX0x?ZXhu(5n=`_iiGwj;f!=8fw0O@Bb&vYGnOSxCiYg>OlwZ zYe^H9Sj(+4d`LYAt5>@Amoxl=^dIX}Zo@rDvNOj=3En|I8YyYiV!bO zs#OD7JEy=ic9zCRi}hgjF3$#o8-YORo5QHRDe?~T*x@R5Ts9*lijQl>@(f+ufD0`d53pOLmEF14|lCl9n{+ zuhbR^ryq)5gSW@fQe@ir#_3ZBhQgb5Smf;3r1m01$i@Zp@&GZtmNW?hQsO==y?>Y09%1;2NYW<YZ`UI=tGKV&CHV+!!; zi_O*EZ2*#4RCGDCf#68*r_j)y$h>!zUE5nj#RNIw+n{Xcea~h&C20KO>SI@GtB$5^(wK=@aBZN?CgZG5qvlyW3-KF+Z0%(DQD|M)d)^b zF^XZ^13;jY!|S~Vk$Fc(2)*kSW`aWTaX09{$uSln^Ujx77&!8Q{CJ1s>$r=O-|_s6 zEfe(cfHZ75+ir`_`$%mu=cddyP|bVd@x`aLsJt;l?^}-Fctr8MG4DyM;{^4yf!vVa z-Fq()Z}W+Vr3BvY(au~*ymN*vcj?2t7b7F1R(M+*g85LGcS-LH^)yCb=vpc7XoOh^ zWObp@Q9yADEQqI14p=pUwxz504W0*pWN-D%<_pNYRq_Qx<##YasrWb_wL|ku^T@pU z+2$ET+Q^T$621;Tl>EMJI6kv)01MoYKJzcxfzCVlm&wP^V{Je<_-3W>FLd5n$+!03 zgvu#?{#Q#Ot&Zy_XA3n_|9=0EuzHjAKjHb`il_(K-R<)r^q}qwVw;e95KDyffh>6b zznmK|bO-K1spn-fzBnmpChXoY%qZ;(={@dU{<$U?iaKvFo@p}$?w07?Y0|C(!rBj> z<*p6_j+G;qF-Khx=k@jd`32fr86hWpoHCUz_a<%!#HFNHLO|n^5EtUF_n-PZSc9*l z9VNf_U-PSz;7jc4DUu^eKhb;8lb4Nldcp8LNXsks7;(HK=mBczY zrDzrZoFE+};%)1f`1=b|D+AIGm02Mq-g9yl#l_n!XaZSM1Qata-OQh9tk42KlHUIYx(vpa`jluJ5Lie^Cs}V%v-I``WUk&q4 zri!##;mr{CfFTd&ee{D%EfcFR^u17wQ@be`N*AaMiZh=Am8(RJTxRQl#+2alC(R%b z1)WQ2P(kMX;|$H2PmdU(llZtBqF49Rv>@|7P_ajoXNmkSZ+*enVTO`lhsNTnP!lYe z?zRlR_yL`_t-@oUXJKuiQ$(6$Q3L(%tq;F!-|Ws4q4)ub17k;09ot2nmrwk;LHYm@ zZ)>()3;*zzN)$liy(jB|S$9BTWhXjsPQOZ-5}3CDT~l%Qvl>12XRyUlbiId>ElX ze4Kdwdasyu$h<8~D?v*e`H8*qxwM`IzP%-L=DB_$I`6uY$B9&KZQ$dY zolnbGqhGzn=sk{BoqJC4n-fy&XpK^RdNA$p`Tsxdjhue~&;NErJ;*72-C9Bqf^0b? zkb02FqwhLea1Xl3catt3?m!(K(1E7Vysjl07r$9+4 z9lOk_8X#{Zp=ZV)4BFy8s-=8(Mx589w$rlnf1`&w@o}CpADDUBjvy{2A6C;Dlq8Vf zfE0nRV*n*Tz65nARSXtb?x!|7{}sIl>0fWWKGfR=zFxFloRdV~L6(K)s%vKyQ+yAy zB(V+^`K@c!&i)>dY>9X~dWAL-cylyPi6QZh7IC?@59VFrzpLXe%sVC3WQiWWyye(_ z-K^=kWi#b&( z_pPaeM(as=#SZr%L(Ldcq=aN?L?M|n zg^+~IWG0CsW13_NnUW+^)7g5)Jz8Q)j=fbA7IB|MvO*uJ8BzKHk4q z|KwTsrTck2y7#)*T6?XBw_C9BmXuUF7U|4*cn?y2h~VT`EG=TWjadLl7Z@9e(1CYm zLVU7eWi#Nv&0E}8OUL#Wt#LEbhWWpHi$JH3Q{ReM#0vgY?|n3QJ3>BuDBhorhRa~# zeNia8^9X|XXwhXm3f|x#r(pA*oU=o|=KH=FVp z1R3`1*moot#L7D!mXyJ6knFPf=F%H@;W%pC{w>i4mzQBrZyAZy4Xig~JiM)`KJ;+% zV>zVq^HZ|`_yB~QIDX<+?~Er8hc_aN6Plu%b$m|ZH%Q02HL~2+Y0mq>$tayZhN6#* zyNCVR-eN<8_x`r{6)4^&r}nJC!h1||g?K!IcX!0JI0bLV5R*BJP7wGxbM|46J$Ch0K6{t@!w+6~jv5zo zvu{dz9J_jZt@+dxvyt)eUQP9J2q(XLx=;AWm;``9@96PcKj_E%+f(V|J#P5ZTbiEf zKSUp?%zM1s>GbhRXoIkE^uPT-Be(tk}GOKNAh_ z*~A8efz6{&M;n|m`~R&OO(qqE-0%l#oTbOXOTr!dG5deX5cSneQ;b)GworX6#mTRK z?~I;M13#E%m3ov-AZY*d^TGJSnbax!$-M>i?w%k%`hj1AUbAlQlwdEM_cbVxojxC5 z!=;h~{w|O@(ctaot8fg(dtcr78Z5lk%AAtEAb4+mr}UXJy)|kmGUSBd?IdTQ;2G!( zUkRRQcvj~RXVhz_GaV;`-F#BzoeLfUhwf=T7o%WsQ~c@%xewTQ?<3iNcOB-2?@;3o zY;4Nm<8r{nd-x~6`;RWh!yEO{kCPw2%@X-nNP}dh#ePp^4*wA=0pIm~hv3aCcEJ18 zg$B&e<)8l@eItS2_ms_hyb1ku`p_rXQ;yh0s<$Hz-mdbO15vyq9v831!dvi?dKf!0 zf*i~juA$&9muj|O7{NPLMwBE`;0wpxV4Z{41;7H6NwwXPWU%FFduxIBL$L8uWwGu^ zFi0C%{;jj@ApFnA|3AK1GkA8-Gi4t595pUp^uU6X$FT7x?a9f|ea3irucrE_!O0Jb za!eSw&kv-Q=lDm_vAw0E#%^f6RSS3_xlhq;2!97DL9dKg_{;o1-hy5qpQ{aLTrd6U z{~c)XcKMYmi{c$C8m54S_xsFC4x$L&2FYAu6uf5}7bg}YixbS5o4i~*ePNBQBRfm) z1;GC9o?3aKWMIK34XY}@1Izwp=IBGp&Ab*#{t_jnWN^g;9&7O=_vxBveigCfS1$OzJv zrUv=MbDdWv6<%~Ikd{eJ=ENu@LY(b4ny;^AZ z@QpoYBjCjxP;O)|g8BXaQy)I+!v!b57l+$!^dOJe+bmCn9|_|3{~JF9%9wh!0Moky zrFZM_&mbWb_U?XnvTpv@pd$Kwyr~;_yW;N%@(>N)-undqIYCNr`|EXBcyC$wl_eFy zd)3s7AC&1Wp}Gi{7sw7$>D*-*!#{lBz9%b>+FbR6qaNv{R-7jT=-l(SNm>nH?CSoZ zokv4}S83_S=R2_R?%Lm!zCVo%M&qsrY7dpA%AJn*zjfw>XU2MFU z#ML@vuVy^F^Qb-qaPnKNHY|5-u^JXk7xMr;g28*uDq*z z)aU>Hf4Y5m^;@0(dwa`48oWKekKRKEC)>f014GF4 z)}fAs#)OY|#wD)N zyyGok$MF>%Rl@lFzw}oR#YEAy^L}trG)Z1WC zzk2AvMV=UbFkup<>j&ZEjm)|D#36Vq?^&j^pq-BD{e+mRDgIyZ?(I|hd@K&VHk)zm z-~RtU)pPzY{kus2?@3dG0>h*-DUVooLi%Thx*(-Hca*;;BANaq<(n`mXf3u>hEGve)j~ zieH2DPG^m=IJE$U!`&sib#$yCJskZYb@#uZ|9?cE506&!-A(C#R**bs@IJD$@f13O zbo%^Q0}F3|=3Rbk5WERLSf?n{TMGvFIxa@=zSbhFn<(K6+dRLyP)^?;_OBm{I$1&n zuXE@0jos=&E00Va7(U>_b+U`c6adv{-25h_?jxLFexX*Za zpQQS*#>tPr-hK(^5<$>8GT2_KhL86}_CyJJ?-t;rnW)J(gOB%@9)}y>j5f^s{=dAJ zJ|Db`{T@pFz5nkp4c-BZnDbD)Yvj(TW8wYg$+Lnj2;P+&it8zO4;ExUmqYN5t?;(k z!Qu-~6#+mV|)3U3Cf`s}EpS@1u8yHvWp^ zg!8F!Jp4*?pM|k!Z-thzaS2~zJiH^RK6r5QGxaX1xVBpWWS(4Gcug4}@1KRx_c>(t zwz@l7>Lwkxw-CN6gesq3H}CPL*T?OLi6-Zf6(nSE;!cCNANg20innK;iy9W*56reU znj?7k>bs>-@K(|uV%mt{9idRObg0({4(eO0ua@oyS2pG)oXsPHbyi1RKgrw&u^E>t z9I`_|#w$o~MF=+Dx!GT$F1+D{Gts!U&)teGvGJC>+`Me!BIDtGiRwcfC%^D8^VW$o z0${M**~?iLAMaOo;;~0`T0qIc#h)xf9`=E&T*SOyWctDN zb7^9nIb<*rcMW=W>^?BOQ8yT%7Xl9FRA;2bV&lDh%38HSkPAlRT%TG$t&70MJ9vo* zb89f;;k}IN!v`n7lQX;c<=O;*TijPoPYHaykCxr-IfdY@@2dDXYB?R76NRS)b05wB z=`8}iK6c49u0%E`@*s^U3-L06M}l(;n;HtIZHrQVcg=siN9glmbol7Y0n(olqz?_=q1+#WP`sJO z$xK*y4{E8;yhZSC+n{olg15@FLBKNv?>U3Y;>>toxYUH?As!I`H_g7kbhCyGG8&h? zIs5q@$Xk&k(HDs9AdSje|Lqz!-nVTYg`5pyhY832#`V~)J%70m8}E4bs=k%cjE8qE z)kh3Yeiyg(ZCUzU0Bqgr*&6SLkN3NogR8%0qFYWyJs7f;EyK+nU^X@v3ds*W7j;UbqN&n#GPr8nngA=85ud^RL zVTZ@5ac4|T6;qDx!>rzsBg>c69br7Y*HC?g;N+Ls#1&PGod0hb?W3x@A0O|RkLuM# z5WKgZ{o3pP5x@T@h&x$!0F!x-H$jp<9}d;)_gUursoq{Rcn4kIv=GJHVqp>y3vc#K z>v~y`{(qC%nmrV}S*v4jen;@`Klr`3Y=b=YJb{;2JFQNvF9^G>UTKckJPxhk50R@7GN($XV#fJVAf6ISz&Alu$X-?SE#Tb^AWpL zC*y>!FDqT(dk1>WaYuu=szRKKpMP{sRp^A zczHyegyA<+}u10-UbdDTsx3g?1K8sB8v@tVN<=)Y0_)}yjLMB@W~T0 zxJp($@p|uFU^{MMuv97pyxaV;ZeS}m-g}nAD%Q7H;UQ`q?=h!S`z~VR-K2AmMU%{U zk61&hk0&_!ZE}im_*upe0vCLk?o7hR+iG>rGe-n(uG>qq7uDde{}bds3kqM-ocDOs z>%*q#oB>DPpAqB{8oZ-e9yOqN8>)?PVBsBghqS>T!8?+vEsTOU(|bvl5d?1;8_hHo z7hiap6(LIfR{-o9TqyPVAsI|w+(o=CLIO#vv%|XH1%uxT4QE|Eu<=&q&MR_ZW`kK* z|BYMtRL8qz92@T?(=x0J8F2TO3f0FVocs>e*W^A86aZ2WJf^Ep;p5GpP%83sq6IWx zy05-x5FhU%nW9s9&no6U-p}atVQMAe{NnEm(g8GhN4AJuL-Fo%t7ON*+of)~@ks>l zJ1nw$DR}cvcaPjfHb@s&#@t#L?F*laip;Vr z!9aLvar@^SY`iB@Uq*PCvcY21xTNkqk!m}!7bn`5$qx6vWW4GMz$Mh%qXrxA(r?XH z*B&q)-f~nQ1vvSI5RFc3n&SsN%OIY)Xneed&Zp%BBWrIt1LY2tp${;7613+iJN1i` zuzJh9Uz}*6)5r7evup32`gi|7`txV#-;w@5oTdiFIhq-vHAv;%Wl|kd^|<+hby`oZk~NZ2Bw1sKl3VT!QRY< zhNR|D5E44G>U@wrX1}gB7;kncjs=dS#tFus_wG=(#QeXO@%VuKwh6}T|5d3zF5=`@ z$u=C)hm0VbI&4<97vtBUmDl+WlM7n`U%8|FT2=g4>;^C8?aA3zKksYMc{+W(6x%$g zd+JaBA4Y@s$@R5=Ua_NWZwad96Trf|IQU!McLeW7&vPaeygMQeNP8oA4|24V_+xzF zne|J>+!qJH>Y2itA{}J#jsMOiiO`!MuEilfD<~AOC?2mrc?lcun3rb5cCT4rPHNog zM9!U>;n;Y`N}FFl+|PJ;M^k;o;N)k=D;w8)l^=ZN5tAkt;Nv~&amcX(!MmC({mk0$ zbc`V5NnCYikLEqzk#Y3-sA*mpAanW82r`rg?-NA(U1;^5di@h5I?|u zza$qQZ#El|HPGQ!&;`pDrO4pp?U$c^#`CW9yl;^D^XT)z0bfiBPX2>;2o2sb&$+gs zc)vbT%!`HhX?FcoDFkoxi8lfiyfqi!4mC#>CkB@mKeFZYg;$bqMZ~fnfxEL;PmeW| z0WasoNm=gOAV%0-)rP*CUqJ(Vddpnn{ddvF zjE6TT)rT2Qe*R(4p54|E04{zDHMV8rZIEKksbnr{P{C(NYi@epv)VzzWZ7#nXPEr&r}WmY(s8pm_$ zuKp`QY`pU>kC&<~WjwqEsXi{@M<$<_sH{yo^HsN80kZ!;zWrrv!gKr@)ZP{lm;SO9Y)yZpd|4X527R~bU~TljKksYM zB07Djho?39ou~Bw(GU&ZNeaWkDBfnR?7~=htN1?VKaJoWZy}Go4>PH4{Q0W=W(4og zQnO!_^S$AU8DYQo?0#^{Nn53+elpNe3>l3*Q3cEwxITqg!T^ubrjA?L*myTLju}`O zF~bX}aqWe#>^8MwAr=$N5A(fqq zs8;_^4buL%{k!z~xSZ}S^SA$xpusyn>GA>;?BY4ZN_>w}wo6kU^ zeGtL>ip%gjNiiQd^`%s`s4sFjQTVClgf23WSR7-0cc=#JD;DYwSse!0@|-Vlnqkl0 z?(^;1uCtj1=BCE=oF6-;I)aV&8tHaUZdS&_+lJ}`FTcTE)6Foly(K4Q!IIC{@bTW# zx4O5#x)mG_xqHs}BmV9!f>uakOzeNb`TunK;N%W6x4ZCf|Np9tzo>BozxbDgbDCq0 zApJ+p$A3O!yc)Eg>cbBwKQ#}*&bZS8z(cU&(IPT_4caC;o;||X26lLLk{z<~N088+ z2gR5C%IAH9lz)ppAMf*q>!BlmMv!bYc%KpFvPSXlJn>r;3-9T?AEI&y-sAPqAqw85 zCHqTPAb6iE9=`p4n>XxCW-e8<_JO}O?;xHTB?I{f2Xrz#}J%CjXU?F<8_G%^F3R;09_Ohr}g~%~jZV5A;c7TsY5ocneW| z;N|D&^2=5-K>&E2A7kn1$H%+<`Q$zqs14{!DNr{FCtyf)qy!P{h@;6%HgH*7EK zD#VT)l=jJU@3+1oGLT-AH@02&26$7Pz_MOG9OMQkc&sbL#+%!D)z!z|OmG1;uI{3> zX$2?t?5*Tyf7QY$#>1P3>H{x7B~S0}x|agruB-8Zgid_CKYyH7&+lmkn&al468rE^ zZ+Y#v*aA+R{|BV0)9J%!ucAp4azHvV_GYHRJ0-I9JBs(U_fAW&@NPHE)IWsaof6tE zO2IqUHn(*-f_Fllp~TJu-f;i+X8UXEzHmp)2x0sK8N5`u;@~rR1MC~CR=rpk27XHc zIrj-{yaT0ol@C-g!9?l5an?awSANmO#@pUv^X}s|jE6Vs124Z^k=&g^+=Adj?7dH{ z?f7^Dmz#UD5xkQvC3}S$=vbUk98J+!u08L^-UNDmd=$K%iQL}8$*WE1gLny?6`c8; zXE{%B26MV|+Hx9kZsAR(gM>@wTj&Key4hIfXjvX9o z9P%8Z9K5`1d8K(5@v`%L=NaYc;d#kZ&r``$z;m7_jwh7IgU6o7m}eW0DvunG2oE>+ z9QSALe(pBzhupQ?CEOX@i5vv>N%leZcJ{~Yx7bVBv)Gf_quBk}o!Kqecd~1;uVEKw z7i4EtuV%Mq(>x%VkSri(w07b7iw(Gi1|dTgxWRwup_L^*ie*YY*#7)_T@T z)&kb^tZ}TNtRAfPtj4U{SXEi&SVdU5S>{+iv-GpHu{>m{Whr6FU`b?&Wbt8fVlijY zWzk?!U|G(>&jK-jVgA7Unz@nr4s#iE4s$AVG;;v63$qooKC>3H60;=pLS|N`8Kx1Y zE~e*9_n0b}@|n&uonQ)Pa%Zw-GGf}ow2n!JX)zNg^b;C~`k)r50jh?IpmgXI6b^Yo z4v;Cd15$(JAyJ5zJCfUn+lkwpTbEmdTY-ByH$OMT^@ZyL*K4jut~*?1Tsd5+T+v(s zTrONzT>4yETuNM$Tno8aIcGRWIJ-EXbKc{dGhq3WcId%yvNz6oRVdiuJpp zU{r~IIky1{Leu| z{VfkNN7bZAd^Kc-s?U9DCm~Z*k!!igkO`{BV=nkW#;6+Gtq}ObGp z4(X!moqhRfNC#DY8jm=k9jNLh48=j)QPth5D*|mpRoC^YQfMox-g^C(g|?uobE9r7 zv>8=zc#^+E+NkRIz{UXqRJ9j>SO96E>Qzvf2DAxPZB~V?kS3~H#p72(8&TCf^dkb& zK-J4z4zD3~RJ{l*n1s|&^?dh;4zvMP&m^QfAXQW~%^FWa>rvJC;DtT34pmRigiS*# zsCv9Vw+32^szg9xggx4k@9kq4lW;q=>5frxi?~HK?k0J8TK9MpfO0#g>o) zs_wBK@P$^Piqu|U1<9l8?xpe(XeFxdI1MU8a;Un!EmQ%LMb)h(Z<-+)RMieGJPoZt zRZUr*KO~K+>Ju3`kQAz_cCqS0lBlX&;-?HrpsHfHv)CH6u~QFZ0siF=R;s!Gzf*g{KCRczf62rWic(Hc7gNElUx zPy{!$2vwIKoKJv+P?eu`?f|q9Re6V=&q51Om8<(p1`t>_gQ7@6cz&UQ{`4Z0I8Ppvn>Q;UjjVYJXe&3St+k?617>B)&zJ zoqw_&u@hCcdZcXP8&vHRGWbq>jVkMY_PfLmR9RJQUQKLAm1VeI81WUVEOd3$iEXIb zySV8Cu@zNjpK7XzEvPcB{(YR-j4G4kM?Ml?qRM!`-g@E-RPB*m4_7R_< z%JAhy1L9Lu86-bSBQ{Z$l=;SPGpHCp6{5=c^3-#v09AX!c@v<^ zs508Z;|}GcYWI?`V^AKd45s8Hpj=ex7m1famr%7UJUtxBLDf#9?nWpZReD0hR!|nI zbcWiEpiETlxbw;n%0Sij3qPWvi>TUW$)W|NqiU;MhAMOcRhuWWoyhVX5~@_W4zGa{QMInwbrqC=DwP7Q4bUl6tqru*g5pu7yzRLR6o)D$e$}sG=+gKy0X@%%4K6sG>|aK`f}EbmtH=swn$pAtqE&wiQAUswlg#AR?+Ln^qtK zswivx#NVi*ylqRILlx!aMB*=0QQqYu{zMh!)feIqR8ig(Abv*`<;*VPEUG9+91&+w zML7|M_zhK*12l-!sG^)VK>Ug-%E{lvFQ}p%luVpL73Ex6;v}jl$8ZuSP(?YlkoXx@ zl>5VoWK>bETOy95igG&*aSTUO%$}Qx?5dwi&fp!o7{yrZ*0qW0B zYVUz{iBQSE`~T;`&kUJ^ORUIY;FA(xG%ggTZZ}l{!>4R7^;tMocva$|77lT699fM zk1KxWAZp{~yJXQ}u8E(mV3ABs$i*`J{r`kuv8&Lz;BkE*Z3!OJFT19?YFOdL0rHST(*LWEnXaSN_GkEhLH<9#Pt zD8x;T@$lBB`nZjg-z_(XeQ(zY0-~6(bM)j1k{NpX>%nGiT z@7y@=Uyxo)r;iZLge{qoe_n6lqQRTeg`#+8_1uxb!h3X;;@Ou7-e4~19tCfk!R4D? zA$UIs%4ro^>kaGf-@G@Y#T#Z0DOHE2$RKVBNmIC}6oeShU0!@C9FQ_D*i?MO#=G%s zQ+`Ms5w4@gSx*?>`L)#yvwDBX4c0g+$#{4_qxyJ{lb^7ZTwaX>a(k;h+xz%m_;~B6 zSFApR;GKNRP1EQ;9Xm+VgPvrCsm*)533U1hu*hy}zVfGfbJE~VnN~sZ-ZYXej)iyQ zYzOZL1aF>uKT9ci2i+h}79e=<9?@Obtl|ypq-|X^{>B@Y7y0aRe1Z(P!!{;-+ExbK zo!&CXriO#f-S)<_g;to=+pKW1|ScxlZ0!O3_DeLf~{cYN&o zbG&6V2Mykoc|sI#)hpIwSa?6a)FAc~!8*n_0GQ^zGrjp0A8)sv`t@oE-WF==3r=3bU;mH1 zwkLJd!1j5MH=&F^AKFR+iQ@mh|Bu(gF~;8`{l6eh4Wg`+pfzZdj+8uB4a(j}Sf_^6 zpbZ|bt8O4QXyduoxE!Sa?;2Jgi+SM%tMzP^7!C4)>;3O;7yCg5-XEP87&=}8r`X@i zYi*7I5n+X~DyPgaAF*{0%s2~o&XJB%)nmsDWJK`y{}cMfKJ9k9GXHB3y*{>AM6LO| zL0W(YZ_3giiubzUk8)UeSD(_`Xo%pgqU|O|!5c(5u}33#yML*1vj6A>CrR}YOLcu< z`R_M6RKAlzd`9$+5Mmw(|9yvJB}XK9P-?qeBEcLJ@7}>Zp1#E2q=(eFuus3HWS?N; z&60f1?@J!z;XO$8!HkpN4l@la$wLAl*r0Fkh%`RlGRjsXIx=m*3MgsTDB$=11V^_s zyHix>e}hD)k1W5kuOc;n8YF%iyeVthDBdG0D`c_ozCD3lxrN|;V5her1#ezg`L)&v z-naTQHzyOk;U^k;j-UB`;4u5U4QpqS+gn$9B$9IS!C@J_u-g+6K$}oLBdN9*6Yuz2 zLyD7ize!uDaqC)Tn_Stkr?+?qw5!9?84vH%R3AJz`Ry6tVmquM2%hN#xSv^ukN2^f z$>UXv+rZ)&_Ql(_Heo*1&>=$H)~2IP!};?b?^AU8;Bd76*&Fs}dW(++Z_4Hj6z@+5 zj>%x*oooH{eGr286}cd03f{wORaC_gyi;9%ZL?YG4KGhy@NoL2H*7W636{?wv$s!< zExoa+0KCuyKUzB@0MwS2uS>?pn-u9=Q@(=$GgIR%vc;MB4Y2V}jM6DGInQ`_*HL{W z;N-XWNMWr(xBw_lyseqM7$5J^`z#!V2;Tkoj<5R#(NVoat@nEuXwCn@Nicmr5_cW3 zlsfmPdh^oYP1$XP;+=hF?+PruOUe>Uk`TP*RuI2Z`u|+<$UTb?yk~k2o|suH+jX?_AFnhN)}X*B0VS*&q+?d` zzR}^T_S*^%Q_3TDSIM$>amXBG&&i%wW=}ogm^tL~jTq!6sZ;)|kIs?7kxt)Ia)dyaF z4Rfb1*y#&^0;Qb%bH?~JD6R3yx(3r_+aC zv!2S|{(lh--jof*DBgsr&NWzg6FmK&^&xn_yq#l6!JG4D@!mHG-bxV~x|z$oV6$Bx zY>9i2lcYa7P5$~t1~dL;`imZ)0X|7_!*8HSP-+|hICQZICf>VKr>Yeke~`+kalg;1 zZI7+M##>>Fe?@ga%UW$4-2_XGH{--Pq6u#Qd~EWEbGS zK^pn6R-@v=x_RFq5gya$|Bn`;!JD!p9>rVqaM5Zkyje0yNz(}4&Cl9& zD0l~zo;28mj374;@CR30d%^G3QmcFy`oeyDY~-8~ywzW?{OQel0kEoMR(&0f08tq# z4mppo@jidZKl7RNPtq}JoU3Q=g!)Hpyep2R8f$bi9^M&LA9(rISaLs8FcSdsCt4SK zY{SP}tm9f+vR)f_c7NaPX?^?^q6}Y=AB1$GJw%5cha)Y5kUNAnrU>5DQ5Nlz1PLAX8b2fk{WlyF8K0uaqQV!m40s< z;a0}Oo5|v@54`-wRPGb`E(w5YRkfjDZG617=dR_QK=AJTJ^DmcoQ}nbGv252mr2k6 z!O2-VeQ*~ZQ20AISwMp~<((xIZ`sY;S7G7pkaA$XB!c&C?H#HVyu(uEvMLe0`EuER z=hb?_w>R9B5-ae5IaG*Y)5zM}fzLo_S8O&o*I}^!(TNBk9OCyu5yD=33sLGw`E=nI zX$dvXRy+FlkP$ZCtc2%>1@AE)-VszEc=?^sY|?GrCjfGtJ0B*hvi4S1 zeXLk|7k>3ljq$T4Bwm{Lc$4V#k+hI(RdV{@^Z)+oy%_lmvyEopvWO@c{QX#a&C5Li4!{vt6ffZe}2*rmaq`xYW+KW_1PUxesIi$L&;49Z(AE%fy$KuV5NoZE(a(ABqVaMy>B$Y#M?eXt@`knX;M5j z&b{s2&gGHVc;^{wRhb@Syhp4P)yE~g{JfN}^M>*Rz1}{7u7mh^OYXgDePJPjcVy3X z=?eTEq=e+>1rwq@^B?b2`h1*9oOy5|_fLZ)LW4Kuy?PYy7b2Hbu<#BJH%+j#W%E5!w)VKRlFIG;Jw_+v^nPJQJ}E#qeSVOaImuK zd&BR=yD{;e(k(UJUHXkAOO4wbpnULm0XE*|%QigUYQuPV&rp4s;^ZgXtvx-lRRD;{ z2^z>d;N$(I)d;rJYy&4HXN`)w@bPX?bh(!N&Sc*A|DsCt`IwRZu%bKa&-(uo8oVh7 zMWA^1AMjg?g*ShJUv?IP_ovBSHWa+uK6nMmAb3A5xgvHp$phAZ$1?53=?CW;uNKoq z@b-*ao^p%n1ZWPF85_P64#syp-t4&12ovvy(Exry_ZiX{HID0G{(X~XY`j;bhWsX4 zFdp7ds6M1|^5f-hx*rpU+}<)E@A=vWA8&8H64NjQ??$rb2A^>J28nRUs^rCfUps7KWv!5t6hy%GG z-TI>~0jma)77Lyn+J9AhVvYTu8noO8TQEFUoA1&Qyr-YOF;d&$1~}WkZ*-sY18&OC*bX6h+i$na>sAt#BAce}saj~{xBhxbaVj~1N#e6&~S8!r$9&gzQQ zE-CnUC%qXnl|%48BJVL#LZV{?`Lf`}fz9)OiyfhbP9K|$AEhHl>>|}$j0SJY>3k^O zY|&}zSa|PtB@!1QBgn*nfc+G_W5RbO^dNYzHOL9#>2d?!9@o$B?DhkmX;1g&B6z3B zTp}zC2?I-V%Rf83i2&!vl$z_Z^f2*0(lwC!@#z=R8EV`Pr^=3-o3Zh>y^!FxU5oMX z4yO9B#>r2>bX|x2P64po$h!OT34FZgrrB>T6KMmwZ?bZY7UG}YvM}L!&$a%w^S(hU zrqc(+TDHt8`cMDAoCa^oag!+C)0wtvSa?^xuB%o+@UA)Z?9bxF8J!(Al*I{w#Eu^p z>F%IS+(lfg#t%e@wrV{>@Gdwm;(sF93%D&`8(7#L0j8KUTRr4JzRciA?N zxy~1KRBsv4t(Q8U&;R@XWa;y9omc(tj=$GiETh4ja(*g`_Z9cG8?f-+V)lINRs`>$ zMqwvP^+xe#cD0ntzU>Z<7a5P#T=4@Z{f19=Ab67+>n}`PGyvpa&E@Xb!@-XW+y^%) zVB@_*+2Whtg|DRV)HvBIYxa0=#KwEqnVUr_v5eRM@1*+B!^!UzkHeCnqx|5jP#(TsXQ+=4@%>hzXm}WggCXCR*+D9 z_lbSJ2>1IT9VkyZ4O@3l`ob&(xVx5xkEa zS5c$jEyn62kc!}~?^^g$|K35cYx?Yg!*TwAte?JS*)KAD=F6Jr7D4G??-qytQyt*| z3S7M^d80Na-uw3swRD7%Nd#(~*J!kE%wcT2`8L%bXXj)*yq%~%IC1iej5<`WBqRXZ z7x9KhSK#CQv`4Ejr~$b_%Ke1R@;o|5kRY(>ZRorCkGD2`KD^zE&7S;S|Cgr0n{viK ziuc&fDJCqu3j+^rEky7h?ql6T!FwG?4(SGhH|eIB`)*4Ykl%IMGT+}H9Nb!_eG9>x zr!A)NrO`Q%Q;|32RS^#IZw0+eKerhZ@1UiXj`D$@NjcQGkxh;%dJ))o>mRx%YxI@z zMv%c&A38YsdH-7XNZC{XSVSgPTrbDR`!(_R%)3{uAR>W}9VsvayY-j>u$F|LTya^BJ^r2Iyqxg6Kza$Oblv`L(ytS655V7zk>_1x3jNr{) zo?}A6d&?E`YwF1C?bD3b(iPIKV7(`NL0Z)xctk`Q-$d}vEblVe_bnO3`R-L{Rf+^h zT=EOZj@vQu{uVA+zVio(-P&4#q%8+a#CvCh&AcH(6Q*NXNT}xRsL^*?`&M;F)0eQr-?iF_o-|PgQ z-wf`J-w*(J)n$2aeIvtP2|0#x&k8_XT*;%Bj}btk;lsn3bIO=CNHAj2XiDTq(o$+% zu=!cfLMQAR1hPImOa5TI8nl4wLjxzjm`jHH=5z$WK-9u759{%3&|9meRmB~x;KPs{ z??pNM21)vf@NXs3?Rj5=^dHmb!-oYv8SJp!|5W)= z1o(Ml_`PHJI!wGzz16pyXr25du$!~kTk>bNt z0U(oGT{r^c<83gbw6qGrJGpGHti}gAMv%MXB%hkq&wIQHhIIPSIJ#ri-x1_W8oVht z1)_M9E`8*{!h1XSXp1_6cT!&+8)XE^Y&^GYCxW-j)1wpdl?Q;bp~#BqA%76w>8#i> zONL*`D{fHB%mYJ-ja(xpk$|9XA3jsAii!7Qp*_*lc_XBsYJcNgf-dbN1z_VX*m#%Y z%PiyJ-AMJpi<93e(XB;SZ3KYk*67n+H}Ub-opoQ6FxCp5ByA{GDZ*d>C!`H_=iT`) zXpm0R=c7L5mSk$dpXx0~gE!^sOBC-j`%2ic@V34|jxj>;4ikAVM8TW9V3CR~f_H5} zWsl1RXK*s2NcBpMKPZf1<2d%6U>`h+jdv)=jdk!GLU;*zkPe0PA^?22okM4*BaO0!WA zoH!dTup{9x{`r5oiJiWg2Y1Z->b;6iAA*jNPYAJpwztUA;7z&96~+68u!hvm6 zYfXOgMohe?PIkXgsU9U+QRB`qRjvA9gpK#1%l)e-H5m`@X{rxrocyd~`W76K6!>4p zJNAUwbiEP&?Ct;G@c#Hp&E$3Zzx_W$_4!!IAPtfdO%0;lW{uV$AEupxST*QTkjuRc z`>Wc^b7x{G4N{(6`SJ$j5j#9ltk)H24|HUS=|^*p0BH{2NzDl|yda^vcWZJPnDaEh zcpYhwvIZU=NIlMnS%dP=?7sHBu$SadjU!3?zOJ$#y9UjDX&PU%SPb*~VcGvb{pW>L zAG0|5?J23;acr6&9KGfgZ1xWS5&J{Rm1n(FEAV+$sJ6lfzXpB&bl34i?EF9fuVsWj z9}~9xk;6HEMv#g$cvG%tNAcb!yI24VZ&g>&T!G*{y}&wyg7=9|=QrsTymx;W;@8{{ zYC?N!Hs~J#Zw5%#{Hbe0-dvKTzRZHJ9_AoO7HCJ*D`eU$3M4=2Bz<=N|B%<_XdVIi-< zR(!lo5-yXy4z>cKZmrjQPW%-l!cHESy0Q7c|36ZXJ|CG24_B}GyFq$24c_%`hb>XO zODnGOV&NVBShuPN!Fz6`_dW%0A*QrsAq4N2kB%HCi8_M3MH?FCd;`Fo| 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%0DJxyj(GlXZ)q>x@4bC;smqbWIQ~s0_TT(Z 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

%c;{O2cJDaS2oD>7Fw57+A7a1F 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

`XsJ)rl@M`6u8coK~>|CaE+q#m31 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 z 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 Qr4F`x@7{faZ*Td30Fh2Dvj6}9 diff --git a/planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-right.db3 b/planning/autoware_static_centerline_generator/test/data/bag_ego_trajectory_turn-right.db3 deleted file mode 100644 index 0883307acbae0ff5e4a42efa165cba8ae262ae64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2654208 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

`qk&3%TwfI<;#bp; zcdPCD^ zAv0mD98{XZ!VNb_wj=%I5qs?X#^ykfgW}Gmzgm?^gdA8DE5%<$LksE@XW%zT&33n@ zi-S+>&U3pN^=AY_UZmV%Pc`fY>GT=5y=!*yn|ULC!jE6Rea(s8|1VhT=2&%`@n(?O zhz>(4@txO9c$z9ne}j}L9u~u4NJ9mgX_cRNc?0wJ|DkIOY0`0UXeILg-*O7P@9eGJ ziQ*k+EFpx2_k3SJJ{a#I&IvN!(*3GJ;Q;R^)%-%gQi#yr>MhNs0PjnBdHKo!?}Waz z8E$}g|J_91SKJ{GPATX#e-<|0VGAB5bsXb0V@3S7vGV0xgk$5qZmuY?=)E+<_5Trw z4o52SRcftOvCJ00Y#9G1AN}7y3D1u{cNtIpdQ03wt3mr6gUpY2$HFhP=qTI~VD+_% zTtP0Q!234TIECW9EBTE87T!Ik?m{r$GDe)_>1~+`TYWUZJHq901-`xI%%s!gG^ilc25#>5coPgAZ+r74$Qv7Pkqrj>LPWXEP9lB_?8+=-tg!K} z`(o7T5Wsj}Z;2y18mPo4@>2ZcEnfPwx1aBgjYfBo4Y>S45^V!AV1}SYDSIh{&d&W-yjS;kK-JysX6}gJSg%|8 zxF$Byha?Fx`yf=~dep6jT9q))1sBfoiIrHP~yYLe& zI_jV2P42r!#(N0`-ZwkHHlujQaqZ{B!do?WmlTZmW8?W`yydn;Mq~oKKQ4HB#yOG* zWw*VGa{*^>B^K~E!+5{m(Q2pG2(z)w)Ff{My92X%AY`k4dMt^*N!)m6C`02Nu ztu<4^#yfs=!-7OlVTLPC+z}m#RN_ls*KJZ4Pe0x^#X@JH^VAO~y7K;f|9(K8>HGhr z$;n63oNm#DRL0$Vo4a9gIc*3&cez;z7_W$!z1=RS2)O5 z?C4xAI}MN63zl+}XB;9zKJ|HJtzd}_Gfqf^`~L-TXJ^U44N`xJQDb`u#JyiNNMSGb z8Klp=t&x5!@n$@TU!ChvN!&*4Ge{oLru5^_87~KYMRa&liO)GyX-3J6{uyL(u+Eal zHq@8cr9VE;FBPw3`UWYqql+dT2j1wfxwf0U#IB;iyUg7@2*rEQnL`2#Z`r2q?J(ZZ z_h9n*|LD`3`r!uYO6!b@7N{V*M4w)=26(fr)V~7by|TvSi4?%QEF$>(>%tJo>(U;) zm^n7y5&J{l=8AEdc_V&B3hsBes$=6VTe)Xn#{O9hx5P#vI^?Oux8Gt>rb#gUc)z*3 z(&6E4>Psx{%mxLP_s^IfZ``;AZ929ou0Id1*a6vlB?aE4=A8dz@AAHvVpw<^Z3&o! zE67~o8uI@Cz*FK;VtgnFa_WzmdBMI={+4pj}VRQ)O zJs)?}Lkb&jH$?&69wB}+AH?s*E>iI2Y3vHJzj(=tj7^L;z4btJ3{r`2@s9_#M=sM} zL3)*cPam0~KHl1rSCzEyxh>N-NGIhBY0|M|vE=J5Ehz9V`8f)#-21SF!*?*=>b|XRqo;3ev|s~7K6-YDOs@pQyoSkUr%Wlg}XWI^2|9 z3zpdRTl!~jiz7m=Q|96I@1vo2KUc1UXOIt99MSIsGf0gT1xt_V5XjL=I5;TxPEZ{%okHiX^immY($49mH5&+>Wr5Cix;GWa7B1` z(ORk-t8&&-(2n-SOh1G4vXiDs$7TMMh;NQ3;0DQ>0`H1FovbL{Guv2ZW8rOaginQx z_xMFJ-p8GE-8aG&549Z#fhu;( zw|^1E#yhScVfXPP>;=9>i3CF|q4HB+?Cv7@14pu|I4@j?}!26Ms-6<4ro4_a1Sa{pI#ms~8 zJ}8|=#`{9qEKPTSw^u`j#>&G)D1D{+=G?c@kb|pGAAG#!ta_0aD`=3^|blv*`1&6z0c!zZ6Y6&U8qWzo;WONLCbhmk(Pvpm>MgJ0XRI_q!}# zMHp|9-WW38iGH`w?E`qbZ|LH?d5{SGWL;Zc&;ed=C2i7%@t!XgohShCt}sZ+JS!0j z1xLSXaV^5eyY3oq+N#1~(@?}uTlKW;;xuf$uNADk<}>z-;qZQe=qRQVpLg=5sI$-M z$NOHRsSw9C>UgK`_q8^SWn=o{L_c;XO*(1?mt9WTLmqEgQsDjIYj8J;_rjJPl2~~2 zR!+&ncn7ZtAmd$pVNFdOz}r5{d3JUL5fW1WHD(3&|D~Mu1K{zN=sa%c*#PfF>RmD- z;QRla=wj5EKiKFRxhDl5$0QJ;X;EBtT5mK|SD2Fl zUy!y=EP(I;G)Nq0mvMw!hC-eK!%+u%uyfEZQ}z6guajloh~H;(sfol!>>NZ=j_FKa z$zw)U?|<20C!*s%mH2$rqdNpx>CZt)m)=%2?4rKJ;_`~O&pfhX{tD9J3{5%+S;xP( zmXa$-I|{sOmOkZ2mssNUK1D3N`=1$}g7MZq;zP#!Zlg{!TtNnKJ1Z^%c<=ObJKz5? z8alarn?8)U+s(|mRRC}I6&LhY%Z5TW`rF#{?_lGdX*AMk6)|3Bi})`MI9d4crZvc4bP1Oz95<{Rnz86fFbYq_&^|a`(jwO; zQ;ofYR9>f!8+gUSaCj3C9c5JF3)ogMQPfHQ4pN%YsX&`v>f^0-FO_0aJ`?cF%I~ea$Q)e>X&xcq?Hv_!AcS(GT z0C>-_-Z(J72V8IQ-fb(4w`v%t*b9I+Yj;ZhIJn+&xNr9X=^<>qKaW)xztSBl`-=E! zEa+aT^9&nrc7kxttH>#ao8I;zI#{X1SIupb=<_eeTgP$BGN18L|3ErIFTP<7o9}$wmsz}hlTgH)ts6z-YVgbe~-6Z7o1%M@E$IB z8_o^zj;>9R6zGnIa&IY*!FzAdEH)3omlG8peX;c=ODI(NV8L7nvO_xF!w z)rcRMHQ#rN#4b*H=0dDzy~i02Z#hKAJ1X&s1j>Dh`bmHGRzH0!!#hbv&bANe=rXMhH2x<@n}##?FonI(k)?-Lc@ z8z108p{z(2`N1@7yoah=6;FL-BV{9gZ64gALJ`<_FLRQ*`M_I@;qV?nbS$9~-{o|% zz87}%8**;)jR~Jc$kQoADaw<50wYAU!PHdF0s~5r)HiJ)$FoN_;BB zN0~eRMfOg~YT*p|Oud4Pc)a1rGo>`<$9u|;CLNb=h>4xaC1-C33cTw(DjuMCyUh<% z!ovIPj7~k=Ahn&d@rLn^t*ummzuw9t@<-GHyz7YbzG(M>$BC^Hr{U?Xsza&tU4Xas z%^GO!^-!p;_>g(^8f?66JKC4HZ($`pMf~DEYfU&BW8=N&zQPCHVIhXY+Xm6Gi%NU~ zvQoF|*VCW9Zx4pOvk|3^w}tK5(fD&0n7%kU!F`e@9r|(UmUh8pyw_3SU00R*&-7L= zee*mlya(M>$#|a)rw{LDF#<`X7JQs2d~MBF7wqDMtLf2-@dH-x&{vPeE|XqtSg|(|b&hH|~ilZ93ME z;f?>^|M#!j@&Ee21p0p`iX7D1O5A`hv8k0J+E_VA*ZJmydbt0eIvfTsvD1^yKiI(= zq(-NXo#PAwUyuf`-u)dcv8ujB;zwf;zw-GH5gHf&mF zJ2p9+^bqm0s`=8MZibzMNNb&hlg;NdTn=(Tbd*tv@6FV$@YOo>=b-NF>n$q;srUc5 zI~jZVEjf+;>wNuh|Aqc{Xw%_!L>PG>eG3KNFBWzvqIjpPv}t1D{WH*W4vcqE6(I!1 z+dOCUt0_=H=FDV@L19FQ+wb;zJ%IO~hzCdD3bJ#y!+ZF6i`i}e@i}gx(Eg1T{6#a^ zc$;r;4<3IjK?+0so(RotGw8?0d-;9&*jO87hQoU~qGK7A_$o}=?hp0SKVpw9t^T-L zfcpMFZc^j)4~|sk$6H8`CLK!^LeqBMCs&Z0De!(it>%W}{Uhr9d@Q`vb1nwf0laNh zmj%LjA9}pv$7g`|lb{_d=YkugVnr9~+kpN*Wm&&G-2cCiJd<-9;GIw#oH4p86iRw; zsnhlW8}BPT`*PS`36W60+@_WaCl!vbiAb!Uv%*IJ&}3zXKyD5 zb^j89I;vl9an1hdXywLd{J)({|J#2aTk}_%blmo0^Dzn~A8*-2fp>Fj6#0R4_;F(C zu@DU`ypx7+mec~g+0+*9h4J1w$5P}iz}r`=;n_#sJ4a+jrEi>iapK++_-p;^Z%m)PeV-koNyprtF^x^XUvJ$=fp=47 z&NeiAD|%R|W8pp7w67GN-ge$n-VNhjyWj0^yKZ!Io$bK%!p zn@Vc9E(5$xN}t{MY7z?7m>e~VY{AA`{OR-E4aMA~I>hh6@{2A4W!TxfZ%tLTric{7 z;Vp{j_(&zb(_I0}j%=nsd-JlyeA3ONq5scNm|dFTW%%FDw*TvY-^L{}H0iK{)Ghw@ z|Nra1{{JU`An5&`EkTdUT}ldlaFF4T7S4fDu4Ibg$nbz zq)NoEt~o}0_8)GL;!(@kCR(q@a5)Io!Am7RhXkSSs95@!*r#P~XC(JiAF<;KuR5YFCYM}O3 zy6MPV(q_aDT2)Z4@Cv(vd=q^t;{>lh!{NOE(a}yNzUfnZPBInr<87W_cyly_dIkAp zjgh_vV!>Aj!hS4r;ww^HEU#;#O?;yvkjUJncJ=|z_^VZ5_nPKLtS z+b48G-#37_dG8D3_9!A0UOm@k+fX$0U`gZ9T!43}X6Z>)fOqWAO+oc*LZFGIDjp}h zu<>sCW~Keub1rEN@$+C+GE}I<#`{&;+Lgzkgj#+SV1jgI?{l@(; z-kUZ&-7y33CUHtVHV4z&-Ay8^uMS2-CoCRk!QcN&aUNX@KX0+=l*)*8UkIf7?nYMg z0qh2;=B~Kb&cHb&CB$z~jpd<%J9dLq6)m{#G7ID3jq0ElpRQf;y194h$9wt9WVKQr z8a|MA5wF-=@r3E|j&PH&q(w)vwX)&f^W^O9Oo8{ya~5hS-iBMvbg=LqyjDwW0C=mf zeG?Aj-E&q)MF8x*y$gAgC8s_zS`*F_^y7WH zeBQh*OR3l1PTeU{-sh*7zV`m8KS7g@G|j`V5r6Oh|9{f1|F8d{p#S%v$U*O&3gqA% zBn3w7YFD=4uyWAT(3)594w8dXXAqo&k{%>-JO@jxt!0{9RXP!J(>=nn?JIa#ce&g9=jlm%>uX?IDnE!}7C<6WA4`!&x_CQ-uOa4e=ZN;a*32gIz(U-U+|7 zalH=1<)C$l4r=k4d@j(;`bGZ?QmN*GC1>kKR80e#zMua|QS)tG7b%#I}8_J`vhhi_WCvWf`kDRAST8#MhhgcltbH!d_OV@mM zx_^i9@IHa)D5DbJ@J+|$>Ff04ZLHG}DSnH31sQSb+se__ZOmUmx{lGL!&-d4KuZz1 zf^?_A`|S^bpD5lZn$nE1@FsCMJcaT0{c)R&cj7y9aS^HIgBR+|0PlkLLO)g=Cqe=O`iAoX z-goUa_QH5;?EiT_2jJZ-5m@I8&i`k9&f+oHijB9auWh~Lc_X`Z)#$ll4z z#ui%GGv0U$)saFaz7Go|J{kOr{r|R$T#LM4Q-8fhm$Ov5{cAPT*WSt3jbv!i5q+p- z&z{}M5I4vN@9^a~ff0djfmVSh0wn?k0%ru01fm4?3b+fb7g#N@NI+9SUO-rYz(3C4 z$KS?Z&rjkn;?Lnv=0D6I#P7wwnctdUmwzt5I6o)fPrgrloqW&u9`P0PUE)jQi{lI9 z^W}5lv*laPXTYbzC&kChJI(ur_dRb5Zx!!d-aOt+-bC&j+!wf0xQ}p$aC>t*aTB?h za_e&|anIuB=9=Of=6c7~%vH&Co9hZ!23I^+IM;42S1x-lb1ow;H7*%0el8s62xm8E zE9Vo=63zn7Gn`4BQJi}@-8t8DuI60CsmUqNDa=XW80YBYXyd5oAaN9N6aLziPNhd2i(`%m^y?49h-*dMVMvtMFQV~=AGWA|luVYg*p&Thc2!Y;+m z%QnsSh3!3C3tJW2UA8>7OtwU}2sS^q?Q9NgE7?rgG}vU>1ld>#qlAxySA<$ZDd8F+ zn{a|~h!8;VAZ#R95zGkM1Vw@@i*`n z@G1Bs_z=7|-U&~{FU9NQmGHCh+^kcq!>sREn^`MaZ?j%u&0vjZ4QJiW>dI=*YR+oJ zs>UkA%Ktx$0?Up6`T6fpjQ<+7e7q zYZ<|KfMASTOYTVV6O2%6@rk7p1VhwAGxOITA0JRp4q#q^dqt?Rv3xf%I zsAZCr>`l-`En_F2xda{5GExM)w%Vv=h?k2aXrb1Eri!x!P1MpqW>!R)k6L=J2VWC3 zP)m2=+9w2c)Y6{JdO%P^Ev??=cL=JerFlv9D?tUd=KId`Cn%$qhV?TOf)Z+}&r{q> zn1@=bZMSa`=AxELp^hD44r(a}-H;|IqL$JcmkR_1)S5TX{T@LcwdQm+>k#BnOR-q^ zEAc9(=+oO*Ygi%Xmfnyp$2(^So z4hIkfQA@CGP?;crS^}4NQwjX2#qaYpjlhRme9QMq5_nOISDJebfd{p?ht|3ixKWEM zZ;2^^3$-|pZr?%RL@kcceZvF})M6Je+d*JQEy52qF9I8C;fwP|2n5t(jeJo=z@rw6 z)tm$B&CAO0I^4coBT;YUzwNa#c-{wrz?e#l*f|AJZr1v?Y*pHZv-Vdyk| z7`6IVzMa7jp;oVGzaIV*YV{0lUV$G(t?nDSGWY@1`fvod8sCpv@Vp)0hg$G>65oqj z@H7Yi5w+mv7vFd_9Y_3I)PleL z!*`+<{HYYa1GV5UOYrTe1s}x6zdjf407V-X!gkc!`)k;auno2RtDf-@Tv5v}$73a7 zD{AfWFxp0NL9N}U-@*vasI|+OyN=+5T0TvJ9fU2YbwOlG@G6}Y*<$S83g|HU2oU9+#5s0X@Me6<_m>)*4L@Yb_g=>5*YQYZz<7-e0em@oe1hwGjCh^t(Sm1R&d=+ZlJr$^n ze~emp_SWviSEAN!sBsEkfm*k;zNO+Hq1MgLug&;}sCDDcyY2XL)VdyXQX2mNwTjlN ze#DbdtB^m>3txs>SBKrW@TI6#P;iSAe;>8-1K!l(OHeD%yYv(O9%|(Z4&d>3QR{No z1tS{IXqf8cMS)`e~S&iG=~I&a)Lioc0k=cexk;%}f>!-w$&h-H7^@=;@gH~RmjlfI4N z^HD3!tz7}1hgzviJu30JsFlJs%!$8(TFE`!gZRs+buxG7UHm1~IuVlKi@%6k$IX`8 z<1e6AlDuFn{yb_W4jtgf=b%s)_#_mdi+V$3T-H@!=FH{kmS*e_~WP*99HxOpM+XL zi!ze%$51Pf|5!IZ5w-TUse9oQ{=Wam_&pvD?Em{v%pl>a2A)B}`~OR}*|THKAmv^N z#KA}G?v<92PmtbDU$ssT%pm3U9CcoX6QRKa=NoQ~fE%Q|)*hM#W{~H1JH~wjGf0h3 z5lK-CLZHUkO}NP?*!%x)KM_`($y6XcM*N~8N*~JPWAFbLlN#&@x{S9$+KK46K_$M4 zkOVXPkM!>#^{KU3T0f%U1gRbG^Jj_8Oh1Ff$$xLANymYv0(_lv^W zY*=`Ij6AR%#yjzZ0vYdT$|03j0B-|c!3oDhM2Kap_m6!5@7Q$_sgeNipHeJsT>$Ur zopZCkUkrib<7}$uF2WwMKd&W4?YC1PMInAtf*YLq6|i@ZO4ci0zc9dfN9>vr9rvij z*D0fSP$ivyyq!g4KYs6}VF&3ciA}xSnfZ5+6Hk9^RdZj%q6L z9U6SiG1g2!-fxQvFDG$P$J={x*1GzSkC-0s^%j9N=`decrWKJu#@mYmZ+MV`;=Qx~ z0V@{X#(56>Fy5omt3X@K|CYTT7l zfcN(hkDasPL!h?Ib3Vxm*m!^F*d|>qr9f&z{7$*}2{y1{a@+bQu2)*f7ao_gG~VM@_6_8dZ&rd#-Uz5Z-6&JG?W+K|9@7BQSCLM2A7p-hKL#`nAP~Z)3_Mv#2rb_W(;r)D?^*xMtaPtKD2C0iIw>;Yc-g6_D z2?-$VMRbe>1uOK=&sKiHLU$bB7H2rwbySA6rRxESrb zacY80|3Eq}Z$3>rGSZ}F_Z5({_bv*&;o}%6-VK|tabn^9lV|igjQ8hjmgEL0$|xXb z6yTk-%SvzGW+EiHWx>fIaC-}MJkA83-WF!Qs~Z4#&)n#AQq~TE@Y{pdr&VC%-3lde z%f!i(es25iCwDiDlz$O>bD}f;pzicM#_Ru49UWBS8|*!@tyhWu{=YWCtD!lfmTLBX z!EwCok>(+$$NRiZ98Egf#5SBT{QY{XF9qK4`63kWo$c`)Sa`pC-K`3bw`$@H$kW@O zCmnaPgZ}?eBYXd_ClMNw=luKt+`V=Gex(b%_jXM7*xv5|?;~yb!#$qC(7EgDx`HOK zixb?J@7GR+D3H<+zp|ts(kEVEXK#gz1{WR)GG70W>X4@rUv$l^!@IZApS`ch=B)na zPCa{js4SKd`mu@W@lF&|ph<^ckl6k6S%3Tge~ME^{sHv=ffP9iK4FRGAWIPwVXPdK z9pKyt-$8o+@C^A5(#$>~1747W9D;0oPDm4>Wv0QmOhNyDhckAiILJZC7X2A=1aSYK z%Bc~Z>>z0DRQN?%HS8R8A;ix6?l=qS6XI8M`uR#1R_q+Kt%PsP^{5cTRgk9<9b2iy z*YkRr__}}bf>g6(^VMAq)N>H;!>F&KHv^cyL3(nJHXZ68wSwA@kt@gm3cTSX!zkXG z?E*qrcyHt{V}<*F`D0#t;0EcM#O`}+0PnP`SCcQu6Cvob^OJP|@7+hOmq`G;?`L`~ z765o3*I(=2;1dLutV%Tq8u!4gd|DFrYz%nIMk+-7R!gth>esLV(|>s6Zr%FLjQ9Ru z9in59N_=M{uXp2Z>0e@vPJMs*#)RF zNAd1|^I8B4@0`Y;vM}D~%sc)MduJY2Q}_P=qcqSwkD5#KoaVDhDx!``2o)iX(m%P~$*4iYzYp%Y%@e?#idxKui?o%Q_54MiS?g4o3c7JIFSC9&Cy9mEP1!*WW@LHk^ z?A{i|E%Vrc?%w%5ZgDphII4aY{)wCS#50W(LU->wyME~&jHbUAq_YtnH!<=%v10SF z2i&ydEn*$9ym}+{4N_diww?xQK8CL#aq~Q=(h+Kr8mDuKku9G82KFz z)OF5jqaE)ur|Z`g*I?uQ>1RIk{AtGT|A##asL~NocC56RNcy}*5Cz`wEhRGEZ3ZD+ zXn05NwRVT`mTmn=!uw!aqSQx#_c0>pCoKa4bRmqdzZBptx;xbi-o5Q6wq$exyxFg8 zkr65hg|@lZI=h&o<2^|1V!ItHQ00uoT_}B4@>>WU@6*KXJ0`g0=??FHM8_$N{CrPF zD;x6Bj<-qW>i~x`?Ajam#<4ZsK8oSpJIc$6Djgi1o>n$T|Mvg%-1h&I8|eS{Q+N=3 zPm}CH6|6d8Cvu&D`<39t=o-WF<(! z9%ShE#SNYy6*ZL<2U>?gRhOBaPPC$XklxrLho_q3=4D8n&QG&g7b%Fo@^$;#Yhb=y;bEHF2hH?KEG2#Eokl)SU7|$D7mB z{ETYpU?rVU{ZAS~m;dPC!N`w;t$K%rFzrk1p~+KHtq}GB={&yL#G>{YhQ~YB_W@Np zOnaLaF9uuez`cnSc*8g8$#^$9zZ62lJM&5N5RA8}#0=>J=|@E`=)4DbXO*9d4`U-h z9^3GCOaSlw>Yjyg|9`&nDF-}3D(-VT;M5ul^2ck6Wvw@+}f)$Zn`- zYl4pVMSJ_$+RFpx|8PYoKYWn?qaz0+zbv!f6Qb*A$NN(bM^p$46&2*{$YSFI^BKN^ z#8nScr-Ru(8M(a`Mu9i{Gz1y%3YHu}RJ|zJxCnK z*@N*`|8aWj(#|h)!*lcKu0i_j_eVz_Mt=K!h`AL!wBsFFt+sNbG`4$>ncLi7c!|jH zcptlFL6wfEH5zmJf80Bi0&n=O6Efbpo*@Egc=w0PC&PG~RwwR;@%~LPp8Nsu&hD&! ze_4P4S$^B@_XYI-f+eovFy4({+S2&|-mUTcPfgE-Lg#fX@oFmQc$emj$d8Hqtjt8> zN?$SU_nU|A-eyt*n$6yvbcc5yqQe*?zbb;XL$D+5ct6_SFmSDfis8h?(L_1^eGHE` z?f{iK+S(7mZ*Tv-|4%1n%zvd3w<&SnzaHcSzxG7-poMyhQfMB8ue&nkL{JkC8v0Vst0F3re zIFrh9+56WE%>QrW)Q=mh)(J4Y2iX|RP^CjAU|`;*+HBAuCF1_YoAi7c8Sg_~R*TT^ zu2OJpg7J1NJVnC06Zfch7A&z(zdtI(0lc?Fy{=aUOYHcGF=bhR_W*Zvf)BtO`t)&K zhe{YUGtTnTz7&0l&7BHw$Vp(r|3KoB7cD-#C-i#ir0uOp3cTS5CdqielFbxH z!`tFxdp3;s{BO@lySEu@hD}BQ-Zt`%xVGQ+keBB29!t>w_j61+`LAo2j<&DmKm zVtF+bnqb>!R%D2d_r@(9_?=JY%)cUWcZ8?Uy6~doU1_aT5XjF-cX;nXbYSJDx=Fum zk2vkc$w)!_VD?KY-rlNzeU0r%D8suqZiq@9ZhN?t{`UW9EgOCP9yCa-|9X%U{AM)S zgS4Au70^6r`Q{yOYk>!e&fVPw??DJ5Z%9;}0A(oNcyS9 z6wTjbx(axZRcqOxXb(nFZPxF^XNBL{BtCZ@1CS_c5FJ}E^0SaCvNbtK`xQHOpXP6Eqf~fM^Yp}(PIiVLkm4rCsMFCBUoJ;FAf3oU zfj9gJIvH>1!=xM<-pa@NG~p%oCpQ!6c+2_(*Tp!nz2$EBeAozVvF{c7a>pOwZ6oT- z1miuGzCC6&z*}xMY=N(5I3ylvoz~3ci`us;*qDjeUT4NjAaOgbbZ@^MLC3q6{|4@m zp#a_Ct%K-zj*;K4n)&zko6?TAZ>iR{EJy6)Ex79ga|Vwx7#{Das<%|>$kZ5kT}V3K zk~p6NZ}?SzGTs{ad$MSFGkJ+8z<6)2@FrD|Ns3OlV7!aC`IpLa5TK*c1Z7Ep_oB=% zAK=~Fu>~^Sb^!0e*HRg$)`de4N^pkhW9aVv>G6IU^MZMJa$NAzJr>$s=y*STByt~d*D|*CtPh90 zwcj=jkE7#V*M+~}ZOVlALgF|t_GV_kM#no*h;w1vbNa)(3(;{HBfpv#fj=vaXvdp( zCg$|$!#dO=?_Yr2tnsU38Q#5dcJ5T^_{i;C=W^}u`Tu|a{pt88u*7muco6*MDY6G0 z{vxD`=0TCkr(V^73i1jed^_C#m%8m4;Qx-#{Fc5pVxl6;zNL zR#)=WF};McT!XWhRT7~q?iYRrJE40}g3J#U_W=R?RU~fF^N8JYCg>i-v3Z{lyT3f$ zHAsgM9b6dsb(VRy=KdcZNaO0eAM74PMT3-e@k7~i9me;d%mS)(9JnggdEykQf?P;} zH~c9zGTzyK6Uu0K|9V^e8OFQ+#UKgqjl@mHTmbKn_pHt~>45kDmakop+sf%Kw_?kzWK zW$6y@&xnr882M=iKQX@4O8XXjNryvY_($vp3Fom&=d#op#>d;oo+=&5dhXGx_egjz zpuijcHXs>q@1Mns(eQ3#SLB3uZ-eH!?||KVDNlLb0)Y1nlh|1cO#&npQgd<^;O&s# zx@s}NI|uLPzzX_*Cf(n{Extr3p+;0nk_jE}_aRTk*_?UtiAbE0^(UA1e)I>@l#W7m z0e#YRhj%}sLm4B#dcU1wPxxrBAVbOx9u)q@ZjkIYbuYVN&&==>B-MzwRO#Tb9xX`& zH%LKo!cKuV{IN?i-t97JN@#e;>910U@g6YzK*D==nb~Ui^_J~hLrX+d!TWz}C5NZL z;lu=wNLNLGx5V3f35o#kWzu2S!?qEj{eEiJu~X>p|B33~mXojH#2-N7n144ew2txQ@Yi2gn@qgxy=salI!zdz=4EWCjNwCkmD;<@^eE zZ>=`^EQN;?-+6A&w*h#+VoAQG&K(Y!>`E!xk&o`)(aV1%T;p1ZH$&p|A{Nx>q@vf} zc`MZpPWy?`9o{L3j(m*#cGybB7FyAc_qq>3FT`W9-8;7P(T(5telz^`R<>#>RXR+L z?HnG@`rH50ao7KEYG8@wrSKs5`_*I*3Xf9cOF!R=qSXF9)8)RR6$9`gGXxXpq zlb6*PzCqGlfICNxjty={l|5tO1Ja2+6nMiQWGCZY&i+Od4R2MiA_&IY@umDW7;l{U z&tnS#-pNBHP3N@<(AQ?GYHfhGdb4jkjQ5lqo^S==U0oD0Ph%4ivX@P(?)!pXL7w(i zi2pt$iYFj(F3kBYbIs@#q*d5Y;UGt4y2JY%qQeFwzghyv=2xt=<6Z9VmFs+oivItJ zMi~@p!0>oSMQc)}qjA-=&u`NA{}Q<=@aDP1d6JCxaqS`vG`x9^itT{$W+UDs;l1|R z3orQf)*qq^b<%YSQ0EJM`^^CFCe`?-Fy8BOJms$fye-PV@kXs6LR?2gRPJ`7<8Aj@ zDtcqC2%a40UVWX5P=StjA$Ld3A%VqohqnWw;|fN83n4?VcXqVnZ7j4d;cXsv1!=J} z=%>(b#^2r=+7wKcj`0INTppzF|0Qx!;LYvVkV(e-nn;*B8s2wI=N*CZmUi9h0lRli zRaGN5z#y>&g-aH9l>ZnA=J2gDZe%Y8J-Qm3t(Qy9C6zQU25ab5h{VWf>wy#@jn>r5YOEpK?!^!+0Bd36q8snVk2< z`2pU8(66H7h6G4g{&Pn?!26VAZa$3n@UPYZ81Lp+xTCj!5}~!emg$np$3g2km&@P-fNt)_^^Giz>@+ ziP-g+;rst6*~?VvNLy?${3G{o|Nn23O~*fh21$s*gG6y^hsYjeC(pVB&4W_ZehI)H zRHP9}>i?ssj^F(Z_8=3xzsO$hwTD_q9iK_|#z89vqZ{G*zsgR#l1AV`J35sEFSrmP zaoywRb^fD4>bQSR=Kf6y&HlOxZ5K^Z*59&g6Y{AHnMY727@g(h6 z?7HU_tS(c*A3^m5!;5`W2V|%>M-`@D_f2BY}+fhJ7#f(eSRQ zQRjj2e)rvzg!j9<*|p;UZzssDxq8MPV%epZl@IXV(7ez|4d7j&DSf>b;2pYtZu1^p zA~aO$7Rp(JUO`^oTfuYUr6m3n5+@RKSMXatdIjk`nWuD1n*Q*BlEAu($s z+LzefcOTkJe59g+9D1lw7$?K1+%1_bm z-YrXStmFQI-Tz-%uy;OJ_X&o_`^d#0s&sr^a>TglB5D55Pl31K_PC>DyrqnG>!RVk zD@$`ejCa_y0SWJF=vv7yfVWkE79=M z%14AoE95UWWMFoWU5-}nFMxbG*Y20Tcd!h;r# zEM5XHu@d}oJNOk{acCYSVsq&vyu@0j6_U2tpJ^p-@C8dO&e}BG^`bpAcfaE#9(-a~ zw?+Pe4)7pVk%{_sz=KBHHiXU?6QPiw6+(G0(3jX-3f;SBe8up4khrbStMN(2=u7Ol zF($R=&i5$=y=DgP7d|#7su-(aXz6-_y0&l z$6KTKyVauC^mn`^4$+~7k>6>yq&2T_v@fytkHzdVnyGl+;-hKX#sdKik2lWSh&ml6 z2Y2fIsUSru@Rmqqb0p&(r+?HK4ewti&$hsLD?YeQn*UqlSSzyt-Xrq72gdH$LreNz z&Ut_X(y}%8Wi1Kq6_u`$UW-#6b?^Q{7A28Ods{nX&?u1+w9@#@v z8oi$gU_h$7+XjLgB&cMn@(#dzpY4Y)Sx1P_&xy4QJQUFJZr>76P1qobpF!e8%v56{ z*wOLktFzWyd4>M^{|-cl07iaid)n4ro~9jdQ`Z267An5p@|`bGpmSy&!(VTC-a?&@ z)SKlY@`)t8g(>hBGYpy`;~k!%ZHR`q;9*};81JJm(@Fh*{w9|_!vJqWu1?#D2774J z)*ZTeAL1aHyGID{>}|<-uy-fGo6j!%*@d%2Xd658=XyPKyoUq&D$UPG;p1U+7d-5~=;XR7z_=S<*J=unv8D_K>C)ur@ZkM^RYj50%Z5w%HPcnZ0PuN18 zj)ea6@b#9z{XeS?)>y_;aAF&(1 zK9KJM_8@)tFSt|D4c;L2Y*vH&|C!(N8NR@S!sSH1ER`cdMbg>VG;X6e zNavh+QbwmF@t2UeUGp+OEI)zXAYI7Yr|oD%e*@Aph>nXG`F-lIQ}o+Iy9XIvRI2g5 zOGO2FrOz9mafIP3NLml4CDQa zIl&#qdr$T$B{A5&>!M;~yX~Qn#HGi0K?OOFHBM3&;9d0VPWT3Zw|v`f!o=+`NMKIw zteq7)-Y<7n>ySH_Sj(&{%_IRE<|GSrVymyG_ z&JWJUKD~w8pEcqe{r|xQX@4qp)R{|Xd6NdDk`#E$*xq&~zQ@vFR9$_mRyfhStEv$YNx@OEccLx1|be0#+hulxo-}M%6LVGl^}9CPp9>KMcD{lC^;>U6Ad$!#!7B3(|Dpuk&Nw~(8Rw`^wGJT$zYwhOq! zcyE<^PTJmTS@8PGHGsEhu2lbauzOpwjo0cTxc~2~rn*oM;9b~#a>fGS?e1yO>KqmZ zU6?ZFwq-}hn@>Ae%lV@S{wxwVdn+N{r5_z{PuFJ#&^r3Vn+MV1g^^#R+q0{CtZCog z(t4QP6GP3{TaJ!Y1eruJJl;`jsMEpWaAG{9>_Os2 zD>>0Ts6s551NI<+Ng`>9W#hC;XD$H~B(|iv`QV7%t7_Mp)n!VQp z57G?OxSM~D2$kQAd>dncz6WVxvgGFHG%5UDByN)fZrf2Y^gT$ibf@e0+coI!3=&y~ zBu0Mbkp7N{WZIY5a~pdVI;nXeO)g>A=w?aA@Bh0GQl+CM%ITflpY#9n6nHBa>yQSd z@b=cTUNH_dym#To`rrm>PN|#JAT6A;+&%~zq&7X4G*LkUG~s1yy}L0Eiu%=*16PnS zqNRSD0p59w9`QSc5TTOw$9`)qM8{j>m5dNeq%{5p64%~panX1by+O)xsWUOXuSs`! zt0Ow{F!GZ~XX?E7gm%0~r}eHHabY(|!9^c5^smG*Jl>sZJyhvfFK3&r44&8l?kz`w z_u|l-5@h!ds2W^=hPP<{uW}ggbM_h}yq7Ip_u&b^Tix00ngRGgx?_`i(1}-Z(CUYV znlRpHYYelu0=ymi{c;1h5Ft%7#j6j#qF0dq8=tp1aLVA-khtq7R-~D>pyT~pJYch~ zvliXq?T6@KmiX`dKICN{beu=~3sRbqL3QEfR2+~t`83(pn9T5a<3>JHrz1_0UFXm7 z7Fi0smDafDk?~epU(Sw(x96B@3XHc_^6o#ox35p1%LI65O%zv%vk;(@>ry9Ix5q)F zR>?Qv-P_6m*55k;-aLMXFU}(nq1O5MJ4}7(c>f5R-K@tWgKtLSBo3B3>C~X(y>s73 z`}$4vhxd0xhc`xkVqc=qd)}qpy}uru+AeS&dqBE<;S2VR<+F^Bw|)y%I&|9QC@iI8IRLWjpc(DCNAVjf$h zC5@Lu;y%UJdW8SS^OhHTs*lJA(qD1HiRdW6$j{*uPio8$+VSQ!uzq?=lnVFOHy93Y z{l@t7e-%7+I;5Pn;Oi}a=l}n<*>w98s327+JVNMkf&O30|HAqiWdandSdcaHBo6vn$JSsBme{l{F?A#JUP6Q!qY%q@B4m5^ z;$063^ad%neDN8LBni9?5;rz-_}hhF=u51KilpiKKKdJw<{>)7F!H;$P%%!^hjtHY zi4gm>HHQih3epf1KdZp_OYE#FbvjOa&X)eEAeAZb*1V+hm5g`2-9kPzyzvfG9WdUn z1&c{|Yp5THh5+76{l<@RFD5`6>T*?QYT_UQah|;qz`Ln*`{;a7K_>I|Ci>0~hob8Z ztg_Fb&{W7V}l8yd#H$1K`y4iTf<*5h>Z6NyVpEuc*oront<`% zUoA%3z3s|-Y`FyB?doRQ)TRL5|BtV@t@ktz8uH9e)_Mx}0v+$=t1q51ye@&?kHoQ?@7tU1fsVJgM7nVZJN=y?CF}6R$S>EP^IPV6+VO7J z-r^d56B}=wqFkoe3Ngl?AjwKlr6Ymp{au{&f%HTr3cS_r8coP}C!H(hM#J0HD2McV zOQZV{65i+7jTKb^-r{?mSRgq9w93eED(_hwl>A{<#sJ_Q$-Ur-A;5dc0NT_4ng}rk zCzommqvOpv>ou|)FNyyh^d}DLP?ox}5gqT3EuOE}WY8bpT!@Y#jQonF-u)=cq#bWp zEx%#&UMlczdGs^HaxcTG3(T z2b~u+7De+QEvbr`YT!Yv3skniCrE8>S6(*(9<(~Q`r_#)_E2!*?xbnZ|9`hs%rF5S zq{Fo|_dV$US2#X&PqidM^Fx?^jQXONB%)ki9Wu?M8M6+MScGM+L19;CrXs&se_tb`i>od4IL zz*|2RPx^v1Jpa$Gz=@#Yef7~2S-3%}tEeX7T{IAK%pBl7*xrBBtH&PNx51(88Nj<^ z2}dQ2_ucfwuWta}-;|3y^Q6H1pXYm|{0(%xQ?K7RTvslMzlp@H-?n=+|0p`%9OWNR zjBwH)-bWD~oEZ6;A8q#aAEX^`*F|Pf{yOXl(zdm%RYKZ&48O!)(O5v0j-oro+L?bQ zNa_@L>urnaB)j)|&1NAqyj991Y+=0p{QXH2Br&BDXc@rU1Lc@4)a)DvFcI+O68B%NZW;s5R8-7zujc&IS%hgW6k_ z0&nfvv-in(k1zKTK*M{U)m#ybci#F565fa3eYmt5;NASj^g{voyru1uL{}z&_xS@V z%V4~dYg_iV0=zp#e~hgz0oz+kUJMdfqT}8E<-*#jLlSr#61Tug_<6ksI^J$!{!N;_ z^f#R7Ky@5FG?wY@J9Eb4bw|s^-lBS^^iD& zs}Yy;?a@8x-nf#(yLdUeJ3+b`(NTes-<2)N#sN{Zd(iF8n!zGd*cYUu_T;DG6nYuH z|BsrYPRBE;bA8AET#(kKz}qD4m@gUcoo|0iqT#KQ@LmwcJGj1<^aW|x3CVhHfVXl0 z$JUeM_7Gm6MlKcL9nH0=3C27524T+}SYl=7_C`I)Cqf3(@%R1B(edV%ZCia{P6Tg= z#Dy&2{w^PLG2AKu>jAy+SfhWGhz#XI2%(s}7$qzRJjx8#0N zfOlRhTaM#9d*}i;ORfsQ+ka=YBYb+RM5D$18^AkuRjbqcBqD@w&8+Q}LC3q*tUgr0 zUJ?%>aW(Vv9)4v;$D6mn$)GKl{`&t8L1ckJ`|;`-QiG&Tfwz%dt{&OFdA6pDqv3tG+oAw&kT!q*N@|eqSlX&6 z0lfDI${slT)E@dGeS+sEIKB0w?rb-V_q$gbzlH(c@w@8P4#W~6{@K;)o5j%a7R+O> z6&aMmljAAT5IEc#o0a_^c}5LWuSO>BS7KxxAB9^#4yg zx-=YaGQN8^w^OIX!{u1!pXV*KDDXC9mOf0zn{UWZ3=QvlYpvSh*_&I*sm*Zh?LVJ? zlM%o>&HQQQ9`HEv(o5pv@&NCjJGXknySGVKpIGz)y!FBkzxFspgo3wT<@1z6$NOZL zroNeu6rLRC9{PSdY#zFMm#AI;bec$icW<*09k(#@TU4^qqdAOr_kQ+aKCfjP_VJc$ zxqFozwC^)~?QIl6q)JE0?dj@)0lOx)Gum`cMGQJZ5uGn$vusm>Xw}%FwMHK!9N9?p7j77pHNJR=R*vf+bKYGiB zqCHoLP$%a}_eB=y9%No{eC*fy=E`m)ZuA{LPmLnF2U*WO6OWqcF{hM94?oZ5|IuNB zk)M7Te%aL_+C6AF(@ae+6ZRRT`FX9>ECK&I# z#}bqz0p4deXhvzJeDq2v8!v|Ni!kkYM|KVd-h4|%1?ld0TlIn^!{d!x=tY%|#DUDT6RYFk z3DOb@ydgV@Ph`C92g+s9@LqX??<|bBaV{qbZ`VE0?yCUr%ymNVi@(@I-LmDWc!2ks z_a=)C0p3-tFWQ6w-b#bV7QfyAK5toc+COOoeg3cTK4+(f&7}DV5*On0&Qtp(I^O=f znUd_D%%{8ETYW@F07ic0J!g1S2(;rJbzCEXzXE%L)Z*1?pfpm*@OU5Ve?^s!x`9vO zZ84<&-+%&dyxi6yGTu$4M`h6PPBhaDhVc%Q+35qjw_upT-bR4;`|F=vM1R{uK7LF# z)!=%|qPJ#IFy5&zhg|po-bU}u0u$B|Aq%^dD@vcx@tzjVZ#0o(!doJ7k9e5NDxag{ zZJU#cJ6FO-cX-be`=etuMt((3A*TcX504YwD5%ssyON5_iJStXwsn^n9&cPaKXp2O zoaulcNC)n%Pl31D_^Bi^-uy`$q|xvm8IiPs@y*!_Q0|3Lws(7g=b|Kl2{ z(-EL<$*hw1_x(T0LYZ!V1|DQi;X&5<^BTw=q?RwJisnHPA{)c&fCurh)$W5mXr9z1 z*?6$TmQT)`k>wyj2iWF4HwG2tuhytd@D;m&bKPP3z=QO*k6d_T84ih#HWAg|qI-~_ z=&|WBBfcsLB<}ig<4>_q&^<`Xi>c^llMJ5T{+{^|9a#A#EIZ5Tx8(zqaV>y%sY7Y|N$qfG1B-mP z&ogwq9fOWK#uFA)Z9?LF{qr@6V6ZTK56GEsq`T6$78QNdLM)tOww2iT}_K<1J{o(?|{A9Xwllu%bO2I=WUd z^Hi`e>dnX2mY@|UPT{JKA#q{@Rbr>zwxGtVyPG%PTf$3sc)vt+sAA+NA*xZ<8cI9f zX1m)>FFwJZ|3{6y85OK3Wq7=!A|6qtW3!Fc;k{2u?rlPWw@Oa~vs!^w-_fgGRaJ=R3 z`+xM-jsA~(K>u$+;X!M1e)f@?bX{kegaL2|soe$Ir4N=^_65vGt-unSnVHwa3Mxp;N?w=tAoL|RDd^Uw-JGkf$!)EwP6Y9R!U0M!)Y8%Xln+S|R_Be>u{xe6MaRjC@9g z2NfKtah(cg_zDvDHkmpdEKK`P|2bl}i~{e~k$UxHytm*!YNFvi5i8aYylwG^BFT6wg%xX{;msb%-v#4sw#tKq zw@UY`x*GuRF#>n_V^IPmB5lih9-RNze6DdD#(Vo*zwJ_hw@Fsu=dEYMp-ry&yBmzq z@qX=8T{B=HUFC+v#l$2zt(HT_J8U4M+JdM_cX*R^gk$7K4ELXKQKKDib%9}*p)qXt zj&f7%sq~*@c)W4d3RLNkbavD^{+QGtK@@ne;@19W_crB2m^vEXT)dxOz;aWIk)X#TdW+gh_ z?CE(854y#xOp!Q$xfdmUdgyrTomCOoW}-@Wc(Wop3^4NJTzG4P(QexDX4XviOy|VL zJN{<>#<=H&4BsF<-SVC)9sWHEwZGCyc;hMXwi(#}jqKj35mstwcz@S8q6XvbF?W&( z*WRCE^KnT4Z{Izx10CRb3yzVbswseXPqTtJynDNAuhJ_cfOk}-56A1h;gDO6{--T` z=y;cI+g&lLC|u=%#2pr#aQZxr-v5_Nju=npDAFC?w-FupF!H;Xrr#ZVop!wA_GZpV zR8TRTc#z~h(Dna8|9>}%IvqjTC0c*q|3_=t=_Ajjj?m1GavrOdPh&4V~U zoS%R_=yH4$X^G9f!|ta5&L9b15N{p?{r@mWC_eO29CWU=wNndt(8a)a*~fqfJ@{SQ zxH&Z(%6s)#bgwG92d&5p>RRzYv5Fk`Fl{eevH56 zpQPP`c0G{Y8F&GEiH%x(y)I#r@!uf9<+9aNqeIDP__=E;X^FL>z}sP4*(x&L%v&4u z(eVDJe{>4Q``&>b65bjqTKeJuZ~ajdUM7II{H*{N{>O39p))x~@E4@Mifq^y0r2L- z^ZrZ=4~JUBtYEFr0p9*^zvRN-|NA`d@4Exw zy{b0=Xi@H1>S`D@~&jOWoH6( z(eQ4$-HCev@K!fti-a4beNvsvW$GdOQ@!nPFybRy3P;~)`E1!s%Q>{nG+x}ro^IlK-!+R&9gMg7= zmrVb+O{;0g`>^->i7QkbZ^0#2NW66T$?*L@F5(_lI-2-XMZ*h7?!BA>Z@ahG*8GEa zDWrpjx8|JN57@o!@x3JXR`O~c8U=XQha^p~g8sijIT~*aW^d!q=2^gaKTJ|dSqbpo z7J7|Mnt4BT!nytI?;LczRaTy^lwwk-I)%gq_1%n`N=CDYK z7c9I1D##UcANME%56an^A+?nGCA74#^!?fsL}-jBi5R1Xeg^5DtEscmoLm(-u7j8N z$N_Hj1}WfBQu6yl^f&)6M|5E2XD21JLUNe){$E|`4sQ2HDk{kLV`g01IEMEi++_}P zs&xEzJFNDng0!W;dxNvae)1B_yZNyR8s1Y5#v5R~J9cdfhbu^yt&f*T0lXt;C&h-8 z2++AG(JV`VH?Lon&0>JJ@vn+WS%CMzcm4NEJ&DlgLnS%Zv*DZ^$fZf})s|`9T0PoFo@$D3HMj%qUE7u~%_T^kjR3>2%#ahXG` zPYkQk-Fw9o^@x49=@0J_M8|TB{I0Khz%o%lJKn2A1_#~ju-$uk=tG|LJ&b?6CDebK zDjiZOxVH@j-cD^(|7>rS8!a(J!#l`$lyvs?Q^X@u|G#jAD?}aOjn7lcxGV&U zlj3y~6A$Ac>m~dNngH*sIgVe70N%dqHEeuj!lB#CmgaWeMX$ZR9&lF*S14AI<0{TH zx9FThuf5sR&!}q|)8BA{tb+|BKj*yg z3RLO1zM@F_@BIINw%c^~OVIzXrSKrP<5yb9{lBgI239l=S~&Yf9lrlRnR{w4TtRl< z^jfX~23zbNYfCim$3gpU`mn+cQs7fjKNV0xc16VYv}`3pk`ETuj!dF2 zvBJZflcLhZt3;8wP;I@y%69Z6mfPP)uXRj??)D)05goi3`3-+Lr)YbK_9eD_;Y{g< z1}Z!#OGry%7vsPGk6WNlosQ3Qv$;rzn434(9)T)>V+qgE&ZLuLz_B@P=5HWElXw^q2%PR48)v>Sbi zy`jU@y4_+?l_nCGeI=@-Qj%|(Qz6hKaKX6Rf)E=<8A%;K{PK5 z_7;0o9oI7V>Oh8XkfK&gQKh4O)@i!%&+!&}3cR<7oi8TiJ-TCr84d56v8QP;-YjRd zLt*ze8oCuR4^)t6HrX~D1P7#j(o?jJK?Ql{?K*#W_txTMtEC0N+iRz|>gq>Ch|^l4 zplAa+-U)8a7Vjsds}>@0>gQhhwV0vfUHoC+(-V4Hbcc5gqT>cee)XfLBTJ6cj`xo< zCw06a?9*Fmdwli{?doKByeoc0P^IHr#L4`rNYa4RjsovZ15=J$-Dy_a^p zc@D-JZ{Wr5|8Z@Da_b8_7#?q2<~!PpZ97#A8l>^-x=Oo@2~gTLo1>dSgT$Is z?JZVyY8d+{~z9EU2$E_TeT30gJieIapj=*|F&rt z2sy3Nbmu{D5FK_H`Efo7JTWpwy9aGbwrx$c!ETV)O9q#jct8G1Wc;EK65H1CHXHM%k_~;U#9Oe90 zet`G4O)?WQ0PkDp_8FxBytBD3H9q_r2JP5pSYsQ5j<>l=#^>){d{yp9TvYz|dqLaK z@h+|J`Zc{R5nJ zM!q2BM1i-5i1jjZ1-Z7lcL5sSg|)o>Fy1qF!bo`69PD*@0PuF$G+eX=oZeDzX=SYf zySKt~FH+xV*(?;{ZaPKrF&?1Z?C0wlL>FJUyzoHDu{XQ&sFxn7H~%T-3f>~ z9l9)u@2|v?p0{wMz3ikt-}!k~WbjH{m%(ed_f6l^QW5vqEJ#Kph( z7<8Wr9q;tBES~SA=jQmdY9Q@jMnf3?L55K#iTojG%-cjWeO=p_;7#?q2 zBy~DEW7w__XOoH(2MWC1AOAi>#@qFH92*+mLVZ==VZ7TTt4Me|sk^3i1H74}l~@PB z{NKsBe)~XG97H^MXcFGNEqSA4ZVK?e&U$L)e1Lc9`)EJo|G-=5vuz|-r%2UJBu;rc z^~C)Dz`I|+ul(7{#dPQ1e29(#jQn1WzHP@((vJ76$7;?y0odDH$?b#t4`uo?Jl+Qf zsM8_wt}n^u{NMhcAy#J4|8Ju3AfGo{%gG+}*~*+B&4X~wkM-aucE6;?`@{YJ{bzkw zmV!OVkIto68n+N2-wj>bXYa;AUr!Gf!xiMo@AvnF01wLb{^hTdNrVJM2Of`WpzlHQ zjE`xLXnd>WM&fp^{rb*}4}A~v=%`(F-d$$8^Pst}e{>wj$nRISG~~2__6pLXaRttG zC3gQGmEW`5T1A`j8>G@+s&pLVFe3Elkd{~%3cS7T_r#L%z9%fshlcmP#PK6A-r4NG zcEflNzB<1VK0zv_cwXzVGXc^Txc*YIJPx|o!!{}l@IF*Mw=f#uJ^a37STukLv5Vf{ z{(e3>-mVqqVy}MSs+f>CZ?2N$wFBrCWJt}W*cD{(@w+<T-*W(Uc53x2=CjfQum_D@&1 zLCREh4uaiVXLx&8A83#^hdXkQSQ4OC&5ucgm2r^!Qms|+?(Mb4;EYoMZ_Y`}8_%~8 zA-)7RABn-|muxXm1_b zcW>nv6!iy;Vt&Xdspx~gC*9`>?}vd^DqcXeYrJi6Z#VS^+kiZ=6rU%ITCj&=&j+n zG5QiaE4d;@CP1W$-u}*K5FOJP`IYEzD0e$f`yOPPB%9x>J=hf_PBC9eD&-5qpFzUS zUZ+Zjnij#4XAU_L>*{}0dqn=f;Upy92X8Gawe`_$0UT`=BV)+)cO0p3;z zmVGJ)c&`zE&dYH-4l2BKZ4Zq1$=`$RE^vc%$YoFGfdPO_lTp!Nd7i**9dP_>d*Xq>u z48O$U(ymdZV_a>0{Hlv2yj>~q-fg__pX)8`!mUDRc%KO<5r)4Yo$K@63YL|xq~ zxc|RUcjF=Vv^PjAdk#vU41I+C)tA8# zwYZIU7$5KCz0~Pw`!5mQ-jQm1a(gNIG)7~IyCobD_`UXIt*vXkVZ2=fuUL2kyj%Kg+fm2tk$68JvlcqRdRHQ?!N!m{``*))}Q~KpXTbFar=d6$J_Vd zVDzV0%d$$i$r9-`&Q~TxL`9Hn6{r}Df%>Q>#c+kGgiGL1ATO3!B zLi3=SjNbL|1gYbqC}}`icn4<#4@mb5Wb?9ZCqQ4bp1Mzg{(t6TeFr@Mw^(y$D?I-% zNcni8|3(;;SbRFk$pXEC^zhy!yXWKrd^{58<|lO9SO&dw)_cLDKE$|Y{w##|M z7vR0h!Pzo0HVk@pjVJnr06N~HlM`-k2Hf}>B(8e&i{6nj7t}_e&wu2+%>G4mhqpAM z11rD%CtKc*%+ii`!TB{(qZhF8R!rSmpLo`T;Txpp^&V8|NH>XWI}%5#AU!DX4*vQ1 zp9|7bMNcKr@V=UAvmVA<*6X)7+#so3OIV->@c#9n@pu=&`_lWnx6%RLT-Xm|^LU-Sgty*+!nkhFWd-!w_r1mJBH()sxwz&l&ZZ`J|eeV`_CAH2O) zXq7Yv@7_A%?Yp`?!XTx%NW*pG=y)3(nH*GZ;l;}%aYLRC>!6qDcsu{p+5g>_{_r+N zbYSJz%$hl(lteq;=Wdi_Y#YO#|2sS!D~-X|FuZ#&NS>rhhp>4Gui+um?(J3zyaO-n zvLWL=k+Me&4R6n;76lmZuajasVfPMT{*1E(cxM)?J0Ayl<2qxzSOMNy+Z(yy^Z%8X z%=WDXc;C8CyfJn#3^Fq|&Qat?FHRoh%?L{7bKy;pxGQ~=;?1AY@$Nr!z2noEB;C39 zGek!pMt&{rUCw%MX~#SDS>>&B5>yN)^e1gt9=S1o?fvK%bvi!Jj=*1U`TPF=|8BYI z>bIc(_oncmi1nS)WDnZTEw6y)L1~pM&eZ@9y0~-F1NNXNjWJigf+Kc;E5rGhgD*(G zCTtXY1tv(Vw@pUD@BeA2Cu%4I50ZQ7np)`>25}$E*p@YizQn5VrrXxJ^5Hp^zf`$piOuhLQ7dXRW|&jhzxq(|1!>$o)6h#s4h+A< zM!j84m5%9n!)<0aNK3321>XCUrNYQ~yI=b*hlcmWcf38k#D3WIgtWw-%!)3X26#V` zS;}z(yN-_c(A}Y#2Z3UAx5SPkIz}+^6W%;ONj62BUgFvu@R;Fa4`biCi0vFau| zGUL6GxHOkG&h@$IcqeDM1vI?or#rm+5gjQQ`LTavv01x=cDzmWC1q}Z!ETUnk`6zI zH6JrP-Z+&&>U4a&(CG8$fV3wC-eKk6_LA|Q6h9(^hWAp|m>wAK&|`X}-P_6TcDxNo%q44IV;@d@Zm{4! z>jhngpZ{mB)T2sAk;T};>|-SN-bsOXX#Q_mGTy9@+@#U)b~=0EDLi{CPV5hWYwz!i z7d9vYynnTPG!+4}H~I7ztjT0PhXI{Z?q%he7r4KPZ^LLC2fF z>R`@=r1|*gNSuwkjoS6Q=y-QlR2{YC5~Mr4#StA{82KGqz_cgHn|8cIA9_7@3Z}xn z6MeRszFE)s{ePf8bvjgCWZ`db{q6tJx;8rcJ?Q^;Q+QAe#H&U2AgNk@RWuLU_3`mK zxc_fUuiXZF&_2h3mX*MRSa($%GUXyb;h~uaKNZJ8L1}jC@D;mXMZ6O5`+uu+T6)B6 z!4W&fyl#(o=zEYh4#LZeCuHzmNStrCjhx~`^!fkOrU|1{$=Y=1K`Rj*wHW!$9nKRA zzD0ZgKb(*6&WXfskaT;b4z;=|GkgVk$xx0e9hm~`FEmb&mRNrZybtm|j3?u5?KY^4 zhId=_CJPvE{m@Vn-a4FW`tStFf6#FO4&aT)H?9@F5eI$DmeqroSo@giOEECs1!tHY zxrtDL7t;f&^XPcr|5EO{XM+qrABmIF{{Gk{8XfQ612^ZmhqUMp?+1tuto)eUmX#%Z zp&jqd?{TjsJh3ZCTnOP9lczqzbL?H;N8wUxJ0CGV-WL0*(m@cqzbp9;$-R9k@IH{AWK71}?@5Fb8s6;s zi9#^mAvq7X!o|s+>Lpzj2v59ksWk*J>n^PH*{8;2jxNHbureq+qQg z8s6OT0Y9Gryw^Lrk?>yEC}S}Uh7-X}+MnKX5TJe5tG14T{$E)t`ie5Zd$WCLoglz_ z{Ao&;S6&#j&bU16j6QmC(&WplsWmKwcS7RAq86zy;YTk{Qq7ZBp4_2GcX+oVI*wxG z_rUjKz=s^#-P>D|D=0pUiu3|K9(nqb?sk70~|& zQ+UuJ6Qu)W4`SC`sEy`9MlpMX-~s7Q?RBL4|NRx!LTkYi+n1%wF$58yX6cucD!_x5 zPje3n0}o2^;XhR(_u={k4K#(2n;(PtS+YYbuV|=}n8Ca$n5wc;f^Isna1S zovHU{KpIGacYJf58QHzL+zK_&@Fw0enuZ%Bx6|8pzztHw>~Asn2I=bhGYg-9_y6bH zP1PiT{$Dq5`7UvQH)|Imof+U==q9aq{0s`YLa1r?;AZrtN7)3jl{J|zTEz-61_nx@YpdO*QG{xODtJO5k`L5Zw|0}?WKK*y%cy~wCy9d z2kAa_URQi=1H)I4&&%wn(vg=G@%G`!;nza_wU2X8w< zT4H;jxkzmVc+ZTOMi#3Opp7EOl_Eg}sZbEU8Sej$y8>sF0Nz{5e$;!*5Fw(8>WPUG zbi6Z;`WXwjNZ|J)arc;#1G|r*qy1OZ)Ul0{E=eX@%|NT5iN9( ziX(PETMwL%-OliMK3g5x%t>4A9F39FY*n*N)D}eVsDE0pD6BJlsWpmK^1^9R` z`nYkONuVrA360xzH%j4!0zTf3c>(Wh+E@>7%!f0b{O**tk{z{}Z;+zOZ+!B3O&{+M zR)YcuKX|fz|G#JHJBEA+v{+aUCQ|qRLuv5dpKBd}Rc}Ypg@$-|XRfY2h2UMb*@*hQ z#qcKcb!236vSLSqpEVgi+B`dTK6u_TTuySKB*6Qvi`R5#fVb)S5lx8_3Vf83_W1hW z9B=XP?#-C+k|X7#aR$#L6Z`+>c*`2ob7^}ovfkVq^Rbpre*1IERJ+zNU%j75`%MJx zp})LE@LYRujovx7@Bd@wu4KrEF3GR?&A;#eu}q8qw~2uMKZ>RX9r8Z87O6oq!3L@B zId=kH4J!Ro(2mR?=iNF@ok3dd*Z(XBYLH2G^F*Q*8NMG@HGCd?|Ib`(pENSWif$iV zzXa5vqaDe=7RgdzUj<&-muK)BBHnqe_7&>`yj>2xKg3%S4s$j9K2>Xsk9YEu_B{XXGf7xn)}phvRTB7k z2QQYArCir#x#g`C)WNCCf(GyO60g4wCvIKlZGwk){KHNM1n>QwmDJ4%Z=(@mbAWe@Ra;`c0qFmo zV}qB2{(r&lupnghwj-zbqzb@WVw%Jbl@#Q0;>#pcd3?N`ZYeF7?wCnRMB}uZD*DrZ z;9rndxm&LLS(fzvwGzr5w#KZDGO zkM}PQ1@eLe(qQgQp}{*XcwPiny|;=O&%?u8s%}^b!CQ9bAocwJpx)6!RlW+KVzjDlyQ8~kU)f@BCODDfq?I&gC?qMG9gpf7fg|8XdoLDdLBSrEN+v80T zbzsa#x!iiKfA|0YZl1?FKZ{?J$VF3wj+#&|VEun!jSDwk4cf=?Kpt6xEUucOo*-T6 zfBR}TxPx>z=hpBJ8!~Lir{5|EKC!El8z(IeY7pU&%8qzYgKQQ#>(q^d8D#$B=W+4) zHHd5>5b!Kaiu610Ph333SLuKc{tU9}nB~G zeY&}lig(xX$_E1gZ^6f#k6Z>z>|PvO)-SA$hX>wS@=XJH&q?|j9R~1r-|y_ldoLUw zOW!E>&f{zD!_v6L*et;o-fi&*3{V zgAAJbbN=7u>&3%g0N#sVyVO2i3ikgcO4AnA#KSUP2e~8w-bs>5kT1adTCZU;*_Hy^ zNjx3U`kU8Vu9Q3K>Xb>7tkJmnQR|gm{^s?Ta&7M0z7m=&hj%UN;|!hremSm7ZJWb9 z-f1h6Lq9yB-yjjrs`z=ed}V*UZ5Z=W>Yrb=C5KwQ2{d>g-hJaFhByDFI!-*i)oum# zA$XUQ1*p~g%J*?gZqOi2EO&FcyMzquWw;4VzZwtAQ^>r?2B~_H+7z-uYTY`^t=EzQ zyYT7fBtFBh-j7FWl%ZA`k`o#?*0s81?^XQjyo|NqQW#%Qez`|rKAFJsI{?&L$2 zfBXM`Rzv>Ve+o26yfiiFxTxW2tOm95*a+g)paZev1ubBR%?R=dL9W={QdrBw35Hlm zXjuG|u;Y`u2^3_%&#FC`@Wo8S8yP`VQ)2kWPMzQr{=zHi*#O==`5}_?7U8d9^Zd zgETU@?AxL?_OC&vD^D}xBjNVtQbFqZ|3n@dyz@I#gE73=?pMeYyB8O( z*oxq7`>+f80UD$aRbKawgZuyYIf9$a0N!i+T8{|=ytjwAk8}gPRU*7?MHW-wjj{D3 z-~VO?xemO8{Y8t1Pt*s}SLf_e90zz;5HFTUfdkTO;bhep_2B*g_$^Yx0B^}h^-Z?`-lyWWeqC=s zfmd|A&1-7JpFxI2t$n6^R+O|1jZ1$Kcxr12KHl?`OJ7a5WxcPrgrh!;>Ex$RIOcSz zl=&It3l8|W+#mxpNar`(hVJZVd%OwHh8gn_d0ASYdc7r)NQ3vWkWL;9?=jMOUOc=L zoCLIy_y09KmQp`&Y2Kzm=?8fG)&2k9xGv!1J(R`eotZ2_QbFVHykF91eh43LDL;?XZ$wmCu6mE6J|yYnxAxAC zvB7_EK>9+HLe;A=`u%@xM5o<&H2W`aNlkmtkdJOY&GtU(;lxCU2Jc+gK@x`dv*~+y z@bKna^Gy%goS6CDf_lAW!E~MjPXONB58k@T*^*)L&7oI1!QR`PW4Q)m0PiEyyv8yC z-u+s|yoH9~apD@{$oD3Eyw8T^JXej7Bo(1?Sxy{sd8PPxmxU}#Yo261yem;3^z!pO zK&+dQ!+iBFb}`!VF@u5XZPdTLMr@S*=idBp8T0YI{ifc({r~@L)mT%5{$Gfu29SAznTQ@mS24f=g4ZU@pJDO8P0><2Zd;B4N$TXtmlZujV^fVOy8ZPENi z$O}?DJlu=N!5bvq6P!|6SHT8pAS|)g4!;K3l&n_aBJtN_aqsinI+p0**C3^!J4BzO zG9*^}C0n9CROsY)HQ{Z>tzXR7pxA;kmwjg$*g=w;8+s%7e?k9Geip)z53Q%-xdD>M z{=Xm%-o+0dQNJLCTyNoM6%xb4d&fyfPXzCN$_^^tDel`7vH{+DPv6;Efc^hkg1+32 z)_C~S5m*yBAnhHRsipyj*w#Ev?b5(-*yb&#f66cXPwdQ5ox>r$oLIjMjf0Op{gT#+ zf5c8q^}?sj+Y&5?w?67)8lC)3?tjhsNR@fK7vHd{PyI~)ddu&G%T1T|tz!EI$@hIA zLp~A?-tLdyg`EFS6rjQTM0MACta|GjJr}{l`=I2#bqLxkCpR4*v zSd!tNI?cu=cjDnL{)P$UcuQpNp~iIp@A!RUCE;_z;S(2|o{lu&;~i(EU&?_*2(CoI>o zJ>CS-YkZ9O;0cYo8JA04-r}dhyQqAK`hj$$dK+#m5yr!N&-`&$1n&f$HB`KRl&w{~ z0q|Bmc=(yDIT>!>`78D4E%16vnDrS^fVb3Xf8#8G_gvX%u4LJ8_{@5PM(30GcsD)g z6I#9CV_i8KSA0--a&{a(-nMi1)h%ixupHi3P#??b>^Q*UcLd4yfrS$v% zls!txd6yd49`DQk=aLxl0Xxi4GsvUj%}0ZGq5XL;ta=*@?i0epd$H&lCj{@3Vp}TS z^A6{}N6y|lCdtIk1e+5pQdb)%+>D1C%nvOS0(ig8-j?10@NS&om}Vgr4s*V~d8n@l zA8!ZS0u_NL+2$N*T!xi&ZC(^U-k#grf|E9!s$;de_nGB?eDrMl`}|6)a$7C;Fpqb) zoZ|gpB?kI`multk2iMsiZ-SKuV?K`CJU|X7{`>wPtNlOX|B?@wL5kDVpfg-MoBpan zqsG#BHK;A)%%Z!X2Awq#jX?VUl$kppDS;X^*5fcBI)@BT8+rfkVn;k&((!UGazWbW z{^!}VK@E!L+Zy^dI~>j$=CMS?J zx}rYl<>&UTW9s%M<{Kn?@521OCm5JPhBg+N5WCrb4YJ9RAs^YL6E5pYsY9$74c@2Q z-u$)yuRBPXj)!-wz1K_x?;o{0CgRyRdl}J!5?CeY<3z}HBe(Y zymz5K=;i0>BJ%lWKJ$3HUi~3uT}XchxpSdnT*j0&+YhmU36-&o_{gNp`2Oe!6>m`* zyvxcAPGQwMDXd2l5AP1SkGf7AarT-nVT zu|kFA@ODOh+@zD=6_{V=@nh!kp3M_QDwbtn2HE`~m(PIxm$wM1dl>TpmO6C*?Ej0< z;C;%S(t+Xq;d!nE9^Q*HeeWQ6Z?{#X;;px~GjavM+dfKNDaL{f@0WZ&EDZ2IuIHbO z-2c!2eJeo-;B7V%u(hE+91gnL{JofrKRMad`Y|lsS*$)7jayc}Yh9T>{^TUaQRqs+ zpd!oR?Th-@O((y;c^W#ViOl02ei^(1T1)@*7NJ=3mAYUz+gESGWvd=Wd<=isr+2!V zTD^s7@IGlouE6jX;MhD35AT3ZyBq{>jkq;Ck?MV{j>Fgw;GH4sswxAnw=9ZWwrxc_ z*qk`Yy8*fXzbRiri2(2p@qhQ~-nno%Z+^yRw?+7PQ~WFH?Iwik^U*l>vE)xgC49UM z6Fj=4%xAJ3-rG?hv+3mb!PeM+w1IiN1N#;{__~}v-UlCCDQJ!~W&7(btDjWmGvY(~ z8;CBN5`$E!h(!F+N^4Z79r9fs5(!?oj2 zw}BcIre7z-IURh1WVcV%M=-=XF0|`HKCvT|zq76h?EjC=N!ur7LxFEiy&`Vt#;-w7 zHqCC^a8IJX8I22ZO_=fUI(`k>*(#H8bcHI*)u8*Rj~#UKD;A$-eexgd|8MB^6FPXU zh3?K%Mcrcki4P8JKg8;*EMdsUSZm$QMCvDY6QyYIKHn?)3d8%=Jeiqzc#rXgEl2R? zAJ(NVv8zOy@AC(EUq~Ep)|x?v8>L^X3xodO?y_{=41jmRHZ8Lk0Phv;!!5Dj!(nn} z^1i+U_;?T8l+M?Vm8xHf#u?-H)mt#x^)1r?+xiV!THI-nkKdA(hSH z@FgpoUr$}}@qR^lwNaHvy8bd6xB8d7hWLDZyu0_-kCbfJV7cnuiTa?IpU56hZ@uTt z<8555s~~ZaKHeAFzB*c*ea`lH9~>QL$j6d&t;Fy9sK;9*Xz)Jk9QOgk`+7>IEFRu( zKCZ4q@NOy^r{aB(^NkzQ|7-86Rz08wUT@9Z{lXF89lGft2ht#I<8XqBph2q5X-m^N z5)Qw)Ud%g32OsaWi`)(BzohH2IP&52XgfZ9yz{pSpT6v^$#Qrnp+4y4w_A6eNXl>K zH%LXknPuI$K)*pE99k$qh<(NOc*pEDW5~ygO#Jr_tbDF;|%n!yAtEl)=Nh z&iMNjg7=bNpQ+1RC+;_>BCEG$vmDQ8=#t@Ca^eSeBbyT|e;r3wZ*8ospUePw?^JB& z?L80<`^U^&eDrUgw>;@8+n_EWQ;)^9We4{8OyO@%kT!n$;kuRe@GeAs(916~Q6}Q) zKX|=mUW4766l(_Xu23iXkD0N3|4%rl!jO-O$dp?_;PsY&_y1Y1-Tyx_0{y=nO%1v{ z+MV)O4Z5PFidTa!OlVC-J0QIR^>K+#e!7bb^a8gtKZCrVxBk+b)eJn4_NsZSQ;r(j53z(h#~Jf6`Ao-h zJ@x$m3>v&IU2OepgEarfureOrL7VQbK=7XGQrV8+EtPZDObFn8b+%iwC%8dcuU@}- z3LLTXH+k?}5#U|_HsVbZz4| zNJm1CEpcd$htmo|jwk@USE-0B$^&?tTAnU`l1PD#tvZjKRm8{pRf1RJ-sY$Tcu!?swcyxDf!|xsn)>+ze{%BNYpzM| zb+P&ZG*11hm8N13e)T@Q{r1!4o3w%yr0|^pzghe-Dhs^t?{FwZppj| zxMn|;-tYjwdXEwwJnXZYR*%IQb*ZF)hS6A$l>pA}0Gyc0|YsCdueZ@K#d;4Ny>aG)cI48LiO9P$D0 z|8I8U&PMPax(n^u0Px;K@;K0J76Ip-b=}(Y6n}^nCJ1(~6?j;ekH)p8Jq*&hj*s`C z7v(@~;%jqOs~;`D1*krH>Ex$d)XLvHi+Q}u91QhONVejZ3GDZAd#73L&bt$AKZBGt zWXwlrlW63Y2I>Z>0uA1^kyqof>fL^*LIV%)M&prC1n+^iQ$a}ej&i&x`WfIYzC`R{ zrXLxW4|^*}1TRR1?j8$6@D_UnTloOI9aJ|jtmch?>quMdty z$YCK5aQ^?6-tOxFZ&*v*5y88?(N5eK;QixQ%jn6U6j(D!5#>=G zfo#9L)hx@HkF{2dl=d8?R_~cKcwe3NpdG`T{C>F_9^Pb=oYx56#zMZ-$BEUKHB>DE zcwbl^vgD-`88&HlK3o8vw=5M=(ns(vH);6b2k=&?uimiPngUxI-+xp15`TFMo+j4i zC%{pU#X;vhmyKP+U*0Oc=so%TxG2lvZH)RTrjuWL-H-hB3z)Co7e-V<%H`=_PTV(I zdNk2@8rxUzI)?;?eB|&G&WVA`iU0Qh*z}Zz{}=TC>NGW|vFA-OR)d@tiW}h7pwsi> z?V3Oh@>V+LjtsF*ZxtIBf*GW}y|8a)BpLp6IK0^f?Ek|HF7+Ta=+G#?-WpJYK4{)} zr8j36tg1aPU_<8?+@WEs>(0i9&lE|TXj~Pnl*ilQjvMb@{qV+%Z3gwM_M6^@`dCjV zzl}Gy*QtFJ$MuKjYiNezC)npM{Xf@U+&g>L7~9t%f;MA5M%H|K+Z|1vL8{Tzz?eesHa=YN1+NP^JZsOxzykg^}E0vO@Tr_Th*3YA*XVaHW%<+vXm1?p0FsG5sH$JC@g;-=cGm?w>2H+U>KsFOKbJkYhh$81nIbWO%%> zEf3isRi(kZA#%xIc)#R7I|~o*67ATp2;L8uZ=-%7t@d(n)MkLU^|zvJG6>#r=j}Ve z46^*_k|zk>e!;J@*8#jkrqs{>xD)|*MQ*B|a>8G|eH!)q%A+z~QV$yEAHPq;bm2PO z|BQkqFC}(MNwZw_?m>Ns(8(`vQbTy36Z6&krZva><2>{mq?cYR-;M`{vOV5sa>xw% zXz=PVz7|hykW^^!zTwedgjMg@rQy1Gcn^CezDFKNH||*Jk4#P;Gzs@40lZBz6tnI| zkYRzfqdL~0{~w(b^9aHF-es;%cYwF!y>K_hq6j#my>E4~1wP(SdhEf09 zuT(bb;NzX?s4Nhw%FA+i_n|(r=;ZgoAkC^ip85X2e?`)CYaRN>TL^9kqn5qf#`bu} zm}N5LBTV0XzHUBsa-vLw_jPgO1`Kb#wM%sH@PthBWi1Sd#2510t6gBrA~U#8Ru)S&vWvRB%c?}7*9 zm*gdV!EcaO3O<>!tIUuzg2u&Fd?~8>fZrf}IkO_#4PMA{L#zYpgI<1jewFlEOHRX` zA>+ZrOZf5Rp*{oq{~TvbH}C9Y`x+GU>@-6@j&016*`!7tVzp`TzEe>A8^gP|_Sqaf zybtJbiZ=qh`*X5f5xjMh)=3!xycZ2Vx#*Nah9^l`hP6%cu%P`FS2cjQxrF8#7~uW> zo#)~n(k{4>Z`PnyKR(`-!`GC%|JS0y`?jy%U*G@R z_aJvR9^MK{O)C(*S5;)VA$Tv_yXgXgxAP>tbJbolEFtaaY0wxCd&(a^t_twhZdw~| z2k@Q~o7P!vvI{QDxOe|Y4?fg=f15?BK;yO%6vxgy!pA#S)s@q7u{q1(jrrI^ zCqJhjO3sCe%;Wt&)M?(~ZS;4L2-ZJ4Up=s4d%Ot)zZml&m@cmN=YX^(4c^Vht7c-= z`);nU5gy(gW`{EoypLs-u0imYReO+Z1n?IAAXVH5mbWyUzHe}8h==>``Sv3XlBVGX zq8q^5r*BO}mE|s2dBgB7%Rzj+XKs?5x&M_mNezvwh^CBKzQV_QTw0g2*xZ!m@Wy<6 zqLbeS7qQGD3+D0GeBCiJ^_YJ3zIZ$I$FBoR*?w{&D9M-)gZkqtt7EB?6Ac=?Z;1*N zVt7x?v@yiPyZ6>fD&CZC=I}n36jzbt6bXNb9&>T{ir@d2_A0;+_NkLb&^TB{d#g`B ze*b^H{I-n4@3}08H|FC8o&1j5n*A0eF^@O@nOeVhpBSj#{FJxyGyWHRy+t>iF&}3> ziYS2U{qO!iUf0G#e;>>s4QOgmNAD2zfi!vWiJj+H+z5CzD0cDCDP)L!ZpFVA8Df2& ze)UlYL+pjzifhq3$na3dK$$c6f|QlMwvR3tVkJ*C%iZQ|hpVOs{}>yMfHMWodGn^? z*Pvc_iXd2RL^^`T?bA}7Z54rEgDip*DXEr=Sgr=WMtv-#lOI?0E3aAw=68@hB%aOb zJVn3%kEwmQvb2W%@Bhav8DPjqh^u%YxsW=<>eJwT@1V*iY=|A)e%lle@1viLd=b2V zt(c@XNJ=N)j%Wb9lM|oKa*8IyQnG7rEC+apRxLKs0eFk{iKKM`yqEN4)WtrEfGZuv zW4>;~$NTxJIo~hLm`%Ej#_?3FF->#F$Gfb?aZhV0>*3vr`Z!G|zekR_60_Wy$9u;G zqu7Ne4B#!3wIw$)o$Y6k7ITXj@^Lgcbu6cXinksO-tBA7Ex_=WX-=Duhqq~kr#ynU zp;sGqdFyKCM6VXW`+J?k{?G(6yy=9lt0lm@OhTTZ4e;LiNV#?t;C=L()Ha(Z5pYKT zyPA#=e7wukzOQy%F`JZ)#*Gfn`W)qfk2lAC2c_9BSP${CbaGACgvMeg=6h zG;qU~JO(aEr^xEQeA>_UcoWj)81r%WvoHGo|1283+cbksFudVU-X?f>?>bS~j%-f2 zi0-9sPV60g7px2LmLKt2F+Y?AGT%fja$U0w)TY|KHeiIY-Dy;u^!$(P#^U2+te>|)8;kv)%)OD zx1yX7`VG>R6ZdX&&TwY?<*n0O9x&uXsJl4g5V#->=H9wAc;DsmI)mXIl5RQ=5AT~r zDJ2Nrb<1A4Aan2a@t;V@-kY^m&_#};WO!cGmIbqJ$HTWLYwMA{H$w6vS9O5*i{y{t zEjJ?JAkyh+avSlNw=UZ>u8O>7L<&XY4$RdPyzYX(yw#bn^ssq3>*0L`^+7K`XTFRR zdp(%1-hpe5%IiF3;O(uQyE?x(yRd)tj*Dc>hv6Nk=U)Hz|18wyO63=(_Y-WZ0Qg>EK-O4HCcP z!Z%3&f3o!iXC0V9N_^HmE1OP%our|-7!CX@cCtN>#~dbRk=)R@M;EjUZ}H<_vD4SN zChTp&dOJv%k2!Sm8_(GKy>%1wXOR56c5GS_&%g|l=hr*q0#EjTgJiD!C__GY16HC> z?98FT`*D0gBZl`+UR5F<-d!qR79x1x7}`$7n;cp8egNQoWPgXYDfs^1jMJ;gac%MN zYr`VKEP%JRi(^U+!28{`h`|ws2>3~jZTS5w_;_oF<}99q^+}y*oWJvjt>p#yc)!#z zp0PNV#B$49n2%mM`IXE%uvt=%dAtqFW;Y~WrGLaOrtVzcYr+?{$2&&I>;xk|7AHI0 z=qRAhAZOFy{b=RNa18IU@Q+-0cqei==plIT8djy^{iW74XB^;d663(P8a!`V=ajE< z@oqePIKLCY0qLg=<(B#QcyCx_^IF!?fE0tq&3vMHa8Eow z-h;=QzW(TiSq^V+)W-;&{OpO^Wo0{<$9s!rgn#x22Jo&LcwAQD#r88ui_PN<`S@PD zjl=L16>lRNydTO*|5d&BRMc?d;VtUWEsfya71h2DX^@)zLi>LKye&2@c3!dqOirXv zhc$!u|90H0g%P}ezR}!!8Q^`5tlfAIyfKuB4|iTN8{#?2rWC9 zgpc>m^Q4%FV%9soRfGDV(8=#e*52@V7v>wJvmUnovXb;yZwdS(N3x&>w#S>0Ju8(V zAL;FdNB=xdWJrVe{crnAuBB1~0O%54~aVNvQ zw}sp)TH@iLWiDO_-hm$%f4YcFPKtjoFA|A>XXjK{E;xmccM~7SdfBIjBvUl*=KS`s z`>FVNKd>8r@FIZq&feZaeLSR-pHGadzCsT3%Uf#BKQ}BoMgR2{1J^c(UCQQczr5xB zOnU(%K9aM4ChppG@ZbG^{H~jIeggV`Q<@soRXKbXt3hTO%LMUiP_eYPEpo-qPUQMV zWQa{T|I_R|s6mSp8{{fTWcb}@%VsaI#Qr!V+*J$IpsR%h@gJZDeVCs+O}mW(H&hds z4tV3&Ac}wE4iY$n)QrY$70OnOx52MLM;86gU;2yn&LBmiJ__jM$20U}8h0!6Z;&Xa zS8ojqr+>tbptR#)=EUkttOMRZ%;ffo8b*9r+-`9mJx85E&Zoh<7o;o7IjI+4eS1VgNoNU$NYLHcIlrobV9 z_wZ)_1Bz7?_}SG1k&A5c@s64}PmasgB)vrAWO%mLF4V)v+dMC9-59qC%QZ+bs1Hjz z`NePD@~z+>yddS!K3J-@j{XkPae0pYQqb@SZZ0*@)nsDk`@Dsov>x3|9C6ye$;>m?nYcEuF7>^nF2t)RVGV6gl2f z-l?$QCBVD;ZtI0@=O{2V23zf4ijQ|+{~)LKL2VK*8khGh&||j_KHixo?WfO<&u2Nj z`%xb`bn+{{K9*|j%6$KSyzPBe+(iaaU~_Vc`Wc+a)&eSXPoGagdF-g6C6wyzLEFOqXm} zz;bwFJ{;-f7u1#>KB2%o-rZ%pe{|iWKRJmB*4}cwMUn0M|ClM$Z}|-PsCDhVWb@~6 zqA?BLPrFwNV|X9!r10S3y(Yhzy7#sulDWON#7JZHhdU$S4L8k89!cOIZ<#)yf9hz^ zERr7@x9n4f!SkQ^c&nzCO?K9ru^ir*4{bX6=@&K5@eX7j?_F_sG+X-VPfo}dAC~dG zwPX9u2|wFx7e;)DmG3TrQ~tgG{|`Hy|Lz|H{Xa}ogI?!LhG8|xUJDk-t3eN^UD}Pz zAor#1q0S(+rhadW0&kE$+0tk4>`R7;l)&3WaQ}b#Qte6P43elj$9olU21#s<>^#00 z3jD+Rj^SfT{2?}E`?=JMElQ-{Xx#O&7)PH;{5MEHy$g9A=5EMxH7FGIF-a#s?y0); zc5mj_ATLZvx^Pv|UxOTwyL3(KkkjS=E?ocb|7{bqM;P)^y_C|wGm83x6p04!UcW5r zCw7tk-|Hry7#`kNJ)Tz~cyB%L;Egm$!Am}U^9OkEPf1c6@Fc_G>5o2<0N&*C#zh(c z?_H}GOvnSg6RRI>w=$=|lfJ_rLhj=~v0JTY{ODb~66qHjH+-t*okt};-n$Q*-a6pL zdU#_#_R`6(XzBTx#)p_6Vl7%Ye@?4pU z`;}#TDOSCe*1r+K!`sng%?AYU>Gej`@he~SUYJJ?A$YrP{G?lOAj)&}q%x9{yi z@V;62ElL95y}e-m+n?MN__cn{%ibJ(yrcU~g_UZRNdsuy%s!%QbT~fVZ@0*cYuFmG z+~j08>f=3~{5Ge2akZ9UesVJQX5v+E4*mY0(Bl8}^{E!N$D5$Kk1-!Yvwd>@?Ef#I z!TaUN5iJbw*qR6-JiIl^K5j(tc0Xa{i%d>RE&a5)0p7QRuP54WzG>!D`T`vVk;S4H}j?un}2euWlNmo*?a9 z^8`KyYLFx0@(|}?GAyWKKJVncc=)|n0~c}z$@8J@cjSnj??=^yjm8u>x>2BNO$&Yv zdPm6Sd;d+9v>S~};HxVCS%zPO1TV~+xs5W1;-uDYx(<_wuHmE zRZ2F8*WlwFp{Zrp=%zx-L*s0)ToA!ce3yPm9KSK5AW-!k92zZeb_yrJ-|HP zv+BHp@-8!QIgwnT{QkfUw#S=Lki(b{6Db{?KgU}vXz+eBSR{wxz0n|i8Xn%m5_%*A zZ|B<0UP$#G;%wcP0Px-$KAtr{gbb(lEaqGX&fa!pMw=o1|MaKc(}h6)-ymS##}!C{ z^GrW`x^v<0y=`Bgw=wmD5~%=<^RMrDzoQQy?@5(M92vVg|Z4nkSa{hM)8D5-si_;cdke=MK{w;F< z|LH2N##%7M#%z%@Ge1v(moo5}VK(u27+4EbnE;8dvj^Tdud z4c^0RwEnt5dgsBU93I|x)PiCVyn`EqsK;BP4(t=-0C-2Pc#wY!ydV{;<7;^h;4N7o zGE9BmGDY_#a{u2ZL~ec20Se4({eE7l3O?RGYbpcYg5@oKG;T=ouH!mx{3CXAH6+5L zSa5j@^I=LSKj+Wer1ChJzd<^=%sKzJJOeXGH_a_cTl3f+Z-SI6V?ItdTcOWeETzGF zNPqrGta>+B-JF4k_d>myItboxb;PMN$R~u^w+6rrGPp9}`I&>DK?;g4Sqhf7w1-{4 zAb95}<%}Tr|F=dz-qWrU0k69CLoK`xAMe*Yg*anm)JaZgoT`lF^wA=Gyian^3AV{( zz1v%uk2Cc0ljOTFag+J#t$87O`n5*-`~L(1`=@I(wAgU3BZ5AR6<|2AZKYoTcdb$Kh(@?QUKfOpE4(64pi<3t;y)2s#n-mYE5 zp9tQ1PwXeJ0K78~Iq1EWkAQP?8gGPL#>d;gINNnusX8eijoX))75pF%AMar~ZdH|C>a%;UX2%Ey^-hyLm2X3U58FO6JqyoDchvah(V6GX;E-ikaCxh-;4q+BFVBuyk%Bt&GR$Z8Q=5i=1z z5k(Pk5lDDKctH4t@Ll10;d8=;!Uu)-3hxvS5MC>6FKi^NDl8?;EA(AxNT^$=L#RRM zf>4Q2w$Of|NTEO>4kX}qz#A-o%TSM%EPn(^xKD)Nf+LOc^Z13WKy?()?0 zoZ~6vImok@XD3ep&srXP9t$2L9#tMG9$xP6+(X>m+#TEv+!we@xU;$Ub4PLqa(i$) za4+UI=GNqvUA1jNlX$@PJ&i>saMx?qgpHbHMeXF+R0Q$bxp zc|lP@PJzz?{Q}PfS_EnZDg+7yG6ePrgbDZwxCz(^kOT|_lm#RNxcMjfKk#?)xAR{Y zw&1GdI>D92mB2;e+RWw7Mdn(>HHS-`OPY(HbBc3>^A+a<&PL9QoF_Sta3*s`aRzgG zaXNA?;WXjY=9J?U{?Bp-N9BM1`rp4|{ojBP7dPkhA|a;@@e7X;bui^+*m0bwjVX_b z@{L3-Os#)#Y(G&GQ|@IP=|l}ot=kwlL{!Jr+J)yRL^VvU5$5zJs$$BuJM%D61yid_ zvm1!Ym~z>vai6G!Dd%-(&WfvFXmAq$DJm|Ff_wTdW%DZ8tmBZ$(NS{66HoCsFd|NNG09e3;|N@2=IU!tBU zi79J+hpR*hOf9+lWDRi|rmPO9ni9n^wRi)+8Bq*Vma{DCiK3WVB%>fs6v325+tz%d zFs9&wm)D3wm?Gt_TuT(hl)3S~RYU9{ zru6!=0-@iSnpKlO2>rs8?*6i^&`(V1tQjnTrZA=bSg{8Bfho<=s}0b1OldSFr$XN_ zrJhPS0!?B{&BM|S`id!4y9jA$0#nLAbTXhXm{NKieir(SDaE{!nb0RpDTKz#L*tl| zH@B;SK4NO7aM%iH3{x|nt%9LZOv&c;ia{fok_q})2MuFN+VZX@G=!c^DGz^;W*AEtyGCP>g*ObMM{ zAOO9=lwd;281x!b0=gHbLA{vb=lPTgy}}f4^Kd29gDIX94P{U_rnq;y4?!<6MV#X| z1$AKxB06k?Ix)rB8FCSN@t2aZxeh(Y6k#W~5A+OGj=vXG`an-H^-C`C0rUh@Q_s#c zLXR=^qdI62^axYmx9xoiJ;c;EE15aa158bNmrFtSF*Wh_F(1@{sV~>GmO%F~^?84w zA=HkkPfqK*p*Bp7YyF6V?qcer!1IStE2c(o4{AUym_pXup*xsDmM5Xxm_k-_pk_=V z%`bEdQ%J7>HDL-lwFfm~3OVEi-NY1fCIo806taa5-M|#G;|N{H6ms_ux`rv_suWa@ zDdc7eREH_#AU;%!DdgNTRD&tx1tI7vrjQ3$pevX{-lu>rV+y&>4_(3(a{C#&h$-Y9 zVyGHZ$g{1`1xz8YTtZctLLLQ#Dlvt;p$47D6!JAA=p3eykH0`?F@=091FFCj@@WC+ z45pBm*r9S%IqknJ{G4cqsl<$!tHfoPN>~xyu6>$-!cAXsAKwOBaNN>qS zL<>wsIIiF)!kD6Pe(5KYFtxMi<{hFrrgogQTuU^=RM_qo5^({hLTxjOh^Ckd;om$# zoR6t(U*k21CYaj#XmkT{9;SkKjO!DPF%{(gNt!qpQ-KmkRETphwT0hrDRDNYHeJbF zPBg+)K)TmHq9LaIH;0W74KU@W=$S**$CR(&&M=}LrhNK4b%?Vt<$X9|B~ceuj>s3T zq0^W`J_rnzVG8+vDs&1{$mb@ZlbAxj&IgrZsC?8Wb)?e+RJWO4k_Mja)hN;V= z-6>EmrY>D!f%EnaXm#5j#VN9Lx6@3L|Vd~tm zL{I1trp`LYeSi*Ps$#A(AC!ryGh92HpbSi%ZhI39rDLkB%-|H1hN)BTlny8rQzwnc z6;KMMN;!RhLI+Uglr-?gi?|&7S@DBMVNf!rPE>cThmtT=R6b-4?Z;H1{dq4a5mU!S z4NpS}n9A==4Tkn%Dz8M$7TSxcVfN z0-|6lRfkXxg=6Z#uLYsdPD~}YiOE4bFqM?`H5LlP)c#!S04NkwiKgn&Pza_HWIElU z?U>s8pw$f8hN<|%2R+bMOznw3oe2eFDh?Lahk`H_D|%xu6!`D=|5(4rBY^#Xdzv*! zWLAT%L8^w#RK;6^G*~-L61jtag4r`#9>ul}>&~W{6}THeh}SY4D2$spLKV{eQyV38LMVH1=PEtej%VM*!b( z?RCegOYF;O@J6QT7~W;8zbfP5Eh~12iuY{j0Tu7?anYZbkqy#&*Dmb@*ISYb`vWoo z-fMP$ia?Iol|OcWi+n-K|J|9zH?1jff>d0Tz)O6*E%t=+oJ^QWN=D;2_K%DY)#2kU zdYrFf_G4X^!`l+|Ax$U0^d_eg-U;UM4!V^ok`>qj(<`J8$@0A&*5YixgVdz0!jKO) z1@A>O_fem>u%p2n={qsJ6Q0~q!o$0H`&TO7KkhxG;_VtVpxgrR7S`;PkIDiMq{m24 zzyNP~pTlv;0cq_=vLc_s2I=&%1D@|h!TtXON(oPj@bTWdKxfC8n*wP!8pr4Ku5Wc5 zKHf2hPoCeBtH*M9hoC+Z>E!p~9^d(CI?Us(YUD5N-c0`nDM4c1m8-rp*&c6#8Dlo}b8{y?-JcCfDuS`78k+?^`Rw;(oO%l2)N{6$%F2 zmwoZ^COyk|IqqY?a(FkRJ}l|vr}1UMjGoWT<9#Viw2<7 z;>`f><#UoNk;{o68;|eo0C>+6PuR6?ARM0GW|-|v!N>a?_!70bq%vs%8s|Pqx!AiJ zA8#K^g;DQP);s@y9`zAGC%=f2yWd^)na4YJSU+~~H2wYmm}-h->UbvG<4p);%*XTb z)CrsVf6xEZo3ygT&q4pcilzo3dm~s4YIr$K8?Od!T&Ny~46!~+Yp8FKL1I4^>mekA^#AAH6%kdD2I;NfA*teUI3z#kt>0Yy8pQcBK_U5y z6lo_K=Wry^*+3k>24!(*C5Gy&v)m9%M135gli%nE<8*5w=4(*+ro$aIjtm@-PBRMg z=D*JVFGzP8Fy@1QWv=$0D|QYvcq5yA7~XLBTTMK?yU$H{Ab6V(KvcX(-|zI@3GkLy z_CJyh@NO?My`9<=4;M&R7$bQ5$tmno1b9E+UQXN+6%HTU{Paz`5I){-&B>zQ-c2VR zN8=VeELvOm-VL|UU83^r=>=yEmczRr^`G$~EoGU$Nt_uBn@xq>uNbsf;yW zN01k!qJ>l)5WJVhym%xB@Q$^p*{iT49KN;w!pl|M_;{Cmp%ltV z$&l`%aZh{oxPJ8FRb}A)|GLK+ zW}FMz9&f@*27MH)+phAbdXs7JMvh}(cpEK_R>#BJ_vJMM1n(JpEvR@qLt^6x0p7}r z0k7_Z&52QUgYdcF{{NetjR6SWvAbUiAkSOYb?bd!@--a(6c|9sO2o(8*4szzzP&7I z5{)zX*ytYUhd(*FKRL(ubA=Ym;cbWdctR(?BRS_RQ(rS*z0Y4ZTbHw!fz64@*GFGG zZ(x7C^BMC|W`Ffmej0UoYXuG7$oV1+?-N&+tKs2IY2l)--n#5$Ztv}s@B7DfQWQ9L zm2_XnDSW&G`8hua+07s&pm77?&wRHh;^XbDHkgxKqRn!62cteV(aA5tN%+@}+00jO z_swEyfj=3j-a0Q2cll0df4uMYG33KlPTdR!tGEB||FcAg|My9N{(tp0&$Pjy~ z&*JBFFvPn4w!Zl$CLBKWlk(J66u$;7i!3xWIz63q1dR)*R$e-12!93{bM}@hWd`dt zNXtm2h#Z2Yf>l}h{RH%Np5PNk|)IrgtXzeE`Gq4us>`p*o~2yV#E%-yMLze4mj$AdC z8)73-AC7eLn}T~CvbQmh_jH%tt&{iZ?;sI)BWJAAJk9=id&e;3qjCOL$xq;k9Z`*i`uz@^PZ< z)dt^@j}v8Yo9TsooalFPrbTp9I9$=rm6q#_kN3^qb-MSGBuJHL+`|ip-1O(*<9$QI zgl|%q_3&;&eKgU@FCcoL)-!_n>Ro*dzPGxL{st-Gu5Z{8HAS|^oA8w}ANI$JWHbLf zPUJ{~H*!k}!@Ko{y$&AU>d?tV1n;u&GV11pUBR`-8v)+k8P9dJj*#J+bW2a48}V@5 zsbAj^ygPIgf;0f$NlVyUo|L;-x#k3-MHE!d?-za z7a`3=A$W&+ zOh1M^kUqZbamVc4WcY;ejn8YEX@-~psTA_tg~Mry)gzn{|H zkL>XA-mSrJxlu)yv>A;%zPyp7qK#j@Z`h_Q)bC-v{r^3vkDGMzt607N(9}QJocO)q zeDH;2@)-2N=jf#WXLG`p7H{y@35Iv{4GTj&yx$AeK0%(h{GES= z`n=`+OGiCAz~;p3fl;p;;Oi~^u_giPPvYU#Uq(%k)myiak|5;smKpoQ4llbL4$Je| zte3UH$Ggi#hJ!LJO;SPQQj7x*u2RRx+jyU^mZ~%Bo!;t3eaxeiU+4MLtA721>b))? zp`~|_e*eFL+^&$2BFgsFo15~KAs=F0RddcA`nUgQkq-aw(*XUy7flU9UVB1nkOKHX z`f49H0$vR=OpBl(4btkoL~4WdV|a$4=TAR^)Szb- zU5|J{4e~85wEs3mfo~t_TVHz!{|!>f)x4)9W?wgNLgR9#WpMID;J-myo>zMIPU*e6 zzc>5e|LGCb$LjpQ&+lICMuR|C=68_NZZ4k~SwsJcUBVIlz-`e%Y+r*2d&C*?@vHH9 zXM72D2I)zIH}ZTLHpC9xZ8pWj`;4f|H3V6hhQB@C_K`MoFo=49AxAlB)sJ=ykTcmUw)!p&&J`ixYA?I+d`E4{VX}L&%%p!ce zrQ>HQ{2Xm%IlK>ULVeK5Z`JpAQG$n<$NQAm`lA!I^c$q?!%rjblU}er-X+tT81f-1 zylF}0pA)1WG6`@m|5D1M zs#9I@aFFHaYNY>PcV=<}(*Ga5mO0FEoC4ck^tiis9zNa$7Fi9^mmitipm95nr$0%Q z#mD;$K_^br>@CaT{TlVrNhiOF)|=Bc9x{)2N5vXXv)lA%kOaLT#kBA@Y>zi#PatDH zPIKJiHG!*{?bJa$A;W1L z*LySp-jq&0LuB=~oHR1&0PyxmUE^C97Xgd7q<39c*o=D{>$Aaw+bwb*&9S&o7DKN# z@~*>;*BRdzY+g-Zxz$_9@Q;sqbn<)V4DD=5V;=9yTSMztjkemP+k z6KEVUT%v4;I6mG-#HV?@4VGXzykDa}3h3mQI$@`K_p2m*O#kBb&tG^eZZDR1Xs7$< z7S4z9%=am@L=DuSsl$$?$P&Bb z{Y{%!zN5fze^2W=5RE^B97(eHvRL@0ITp7{%zwJ2H~tJVwQ=IufxHJSH-mIf{^O&Q zPJZ4ET~AAtm>*(=^XmFMY8f~n?Y{0^)^snnuR#RqO$_;1#6Rtj2RMTS@ZLy+H}VKN zhIdw`A`uVolBRn_2;MQtbEtT~JN=_u5Dc--3OCEI1(V^Pq}7XK0N#s;VL?d$f1r8Q zYgvGI`y&Z$v7C+$2{H+U2k5*e4vlFVE4ecyYsr)9`B3SzA@y(_T}EIKJnB8(mphJBd_{n zc!vlKbK&8gXfPIs;9Zw}p1OKFxFFI`7vL@aczC>I2N`y7)!-!pyjy2WSRkvnYp(`@ zSFzjSXL_@HUM5lCohmgky-N6auh=Vj_1CN}^Brj1$K9FLju1ZHc}h3te%mw1a@G3) z>Z6HHey^%SpFRBt_y3pQ^{>pxq`$mHAiJ1VsP?fv-Z8hF81k{R>R78>F|~So)8LJK zrUJuztwIea9^RMYG(8c#H`Xds@qW-9-0B4IzMFCRYZEw}xXFI&yY1ca@Mz9MY2@|R zIiEgG{00xCxh$7+Nr|Jt>RXmXxXa+_5nq7dUAby+0Mh>xMovbj0K6^aWM1t^B*Q#~TH&|A=7iZ= z+wTb8dxL*Aegt^SS`4_a%Amj>{Rd7(YvSWQ$z$U;%j~}S2pU%uI!9Sa0Kaw86@%W2Q?~*+gT%2+{YLDkaCnny6g!A#Cazfm_ZhV zp1+(o#QrsC+JhoSeB7z}rc?fBiG33d-pHraFuZfiB?R#BZqiYcM^2Dx-1+mo#lo3- zd#?e!DcxI+ow6sxgKq{GIsv@pMvM0$cvn@$h9docgX9Grt=e#SVzg35b2&cVyWAE} z=)UG7eMRH0iEN|z{>=$euJUD@eXV3z4(~mv4?a5ine(aUXE!sCcMJDP4*_NRc$c{t z*0kpMuziEH#4_RnBR*zW7Bu8@F~1Lw9dJKOr}g5+B3ieHYOohLNAV=f#)Y|HbRA_}4d*N8ZtJKzh7>xN|6u>G8&W zc6myZj!3pZi$C-K5GuUkk6lvmJ~eZe6AkaLcrG9KdQ0i_EcyQb`k=yfJpgacCP-tc z8v$y%w!vf(*xnlHQ*MKY6VLbBTu=gdrz8YK4adYnzg5lI@SNy)m*4P?J#9Z~PKnFr zd9m^S2>RnhJR=Wvyl;MGxCW^O(IJhI-`h-%^V@srcki$Ufxb8z4oHV)CT@5{{LS=u zSB?GhqD99~qA8)hnC#xcRCvQ*Z>8YvzdC~h4R2%r#lmp^Usd=v1g^cmXc-CK2YAQN z*#GwMAwa~oocAYSyjwM0V7%L;ISn)c-U=rPJX*w9h}6?ul+A^X_du8}YgYS-mR2P0 zl>WjkI-}@#O9_g#mr6F8|KE+p|Nc)p8~^B-n*ZznbDfVxf3JG!N3uEG+8) z9@JfM-WB$s8In`=4DcYF@OrmHCkfE!VyhNDa6$UMDf=l+;6d)Bs+lUV2l;IHyx*hE zL})|E3x8WK^gYOgIZHm46fD9AAaM#S+wO3@N3S5u-x?lm6{tUZ5|r`wa$H)%q*oiAY?IUXuEBJ38Ld1@7u_8yB{zOmEt+(cz15vJaf^)iCMvuo z2Am-Z-VgML=Aq#|u|Yf;#+wW0bSm#sZD8T#oVd?5}aQ>g`puUGJI6*3E+7b$X zAgwMx`^6K0_j$cy4~Zp2XeVhI7uOARyrb}oAK@3u;ggWKdp)ypR@LZubARhhKX!)k zK9IH<(ZP$6U$CEhE{TQy3R08(Hb?tG8Y)OO>E5MpRx>@`xbs@H>EN)|=lj$DM^ND{ zUi?CUg7;g~U#k1>5Z3-TS5p>jPIa*Bsl;7h;^hM z9*{nsGU=QGcwcc)&C?hnLTfjN%9?IRFHWpf(6+i4@jM>S8uHo zX1uSrE=P2@V&r#Wp`pU)HTvDVLClHk;|uK5Te!qrKM(mE%#U}`ZJKoOhxJO|__KQ( zPKEcvO1UKEKFFep5wKt#v8#UJNzBcJi`rs%-R@1?-mu)0h1 zTlpC*#KZ(RuRk8Nlsh~GVw?o~2;D?PEt~jCSz{-z5Qu|Xrk$$|5 zZs!Sy^wZG)f2!yYkr`%wyh$f$(y^lCeJcM+vU^8U;VrXumox?M&);K((C~InHGp8e zOO8seh28s>(np)Q0B`-ebCtX;1c+bOaGw!)z199_n4vbn`?9pj>wN(4u5arC4>l1Y z-!;LPE;yp&?YHw${_hfHygw3$&nHyqEJ4Rxw>T>7^?XBy!<(W*4<8Mrc(ib`~Uy#)}E&SKIs4Bs60rmU-qB* zKdx0%8qI@hia&6|9%LzL>H>R^YKBJ}>_Mr8R(+&11ZWNSyj^{uLGpTU2*GENye4XY zYlHq@-_KMbONj_sPqDrhY(lRf_Xj*Z=iRM}w?X3WHl=cR=A&1TdnEbgG_@G7f;@oe z$i&Fcnzxu3GCLphEs_8HJ57vpm3JDz?*DOj9{Ifeevj!r2nX$4Pm2zxZ>6pA$H+@8 zkqU2>Pfb@SOKe=ilq4G7Q%kzNV7w16IzV1xEepoR*#X{KS@+L(UL-)u3pKuofbFe2 zZX!W2-ko_~YVZ*|){5U55cvL|{D_X<#eL{_Yk!)rY^14*S3=?>`j0xV4MWF!)d5r7 zm0ZTFAaxKO4jB2J`7zm`X- zl#F*Q72e97d-qfD_K&_UfrfWdonRx3_rV-?a{uqu&HoW@kd#ta$`&^hpxb46+#vvO zJ%jW6VZ0lSv>-KrcWlx5BR_{@q15{7uaCE&<1MKg+p-V_}_G4kUX+_$LNjDEZg#%2dfpU}|%A8Oy>v+4@-p1iZ9kPkgy%>pOK1%3#hsN-^)vQ#-KS1IfVjD&;aH9AB<+(OR zJI^v6-V_~W82P1I2pX7i(%=7AOt9rw$zb>YAHF^Kn!oo6)7Rcbaa!MK(a~YCD8VcD zZ~y5J{eP}JUS=impvT&2 z0&8;#5T|0O#GU>W=<>ITGq4A3=6L%WZjeqL2%Q}R{eQ{DZ-?UlrT@>o`8JWGUmahD z#D%#_WoQx z49OrpNu7+RO~;3RW8FU$Lpx`~i@<|>I?{dhg1IC-(a3LA*L9JF33xIdv ztt%Hb!TJ9O0Ubs%;0sbWR1*%sc$=2_vccP18JxFypOq0IxkG%oaAWi(*18I}xUxeX zuYkl&hR5hHmPB7-Ma!R6ZkAv?yq6(5u<~nqwT$offAK)t{hw`V+MP6f-a_K(-qzyu zMtVqM$XLhgH0fCV*3v%t47vYLpu$`8a>;uN-fA}Oa%gzV3rx1bcqdl~knx_Ub~iu| z;9b;yv+q_h_<~f7)8le5L2?=?4Ttf*YTm1@1Mucab5dWIM1;2Gs3uB^qT_wEUnMJe zk2*dEi96$04)Om$ckh$ujwxonG+{XRE$RF-CM|we)mpt(R-rrjg9xJFTDpg z#D8XbyxUmXY0|+{Ab0m^1{v=iRCsG-)hK6l3kSEij8wCi!FX%>+K1@^yg62E7MI%sPH*|HOV9k5%ZdClR|@py z)bScf+{EkQ!z%xBIWei)w(@yAf=^mtnjWzsx$rwf6`MA&>*$ zop3L$ z)$qAU+$uJ48H?BG?p-wC9!I>(c(b>Sh>k*x{Em&kC{Mpl|Mr&bsW*0GlGy#fN^k=U zJNtE}@Bbfkd$7@>!?or3_QABj{Xat%nE#m+=>OTNJjh@k%Lj@F^?VRiL-Qcn-ycfh z3DQ_?3HgYf_Z%LRZNP)3bId(6&l8|QZ&lKGZwe$G809AqJV;q7Tq_iK(7T;Ui%olp zkYQLw&@+E@4>H}$yZS|=3f>rrTe3|=>#Qw$gY;%W)KLiq#@mCmLUdr|$HV)ud9s84 zC3gK&kNHwj-I(VFl=fGRw13>l^cCdoi%KtP(Q!N3?CI2A_<{6HHY&XJpQ(0H@YX6B zRYAl1cEYwO7;l~QLGt{+Okc1e65!1;Px#$#u*626NMyITl>+@X9{Ar zduCC=(jR+?kOIfCaV`aPyzlv0X87Gv#V$ZA_0h?o}yGI_kX~q(6~AZ<)zTh4;c}yh&zMf8;OuQ=fS{Q96H{2uCw)9-%`VCA#oc&x^d1MMz0_TuZleG*I>K`=>ehx zD?g4+7h|8Equ;$#)>IBVe#OSy>HJ|K(N^YfkfNl^Y0`16hC{$%7umg8sPNW{8w;S| zy(1%02@P)xkw|tJ@7ISE$cGavq9Rh(1H6s;lSS(a2@v7(>B_x#Q=p1u_YW}Mou^;2 znFGArOe{`7&P3>I%z-m6U!xyyQDi@vA-PK(KZV2zd}Z~lyN-_cO66qJ%}*E)Z&gGG zR(_Agg%&-3MZbHSx!X5Qm1Fn+iP71vM&jd4@7{@(2WZlfqWFA({f~Rkp~72t#bh4^ zZ-s}e7NOx?eeie}-2b1trbOP}O4X3~;0*94oZH1OmrZ~q+vauG-3PC?NEh6K`~NJ3 zrU4CrH~zjTx9vJ2G^>)sV(=9m?}<=V{tJ!jcox+^acVIgNA3I3@qQ?>!tKg@#v4vd zB02^z@-y+gF7K~GzkAp3_J3nphJ85k$gbB(kE}j1{p^i*?GQ~mt{qm5)ZUZ)_x}HX z_S%g2GiZ>wsXWNcY#bhZ~2#!um^4H^LK>zAe+ynJ52!(suyXv%>@of zukycdW^z3R>Ra=0C;WnR@SJ`n_ynol9fK?KT14pEhPhck+R;7e;+MO7J111}-;p>! z)@2+|kD+_eMxMLb32PazL25yCgkj{z$F}XjnjZR>*ovR!+r}lZD@fwY=NBLHL>n<8 zg7oCX^?8gY9SxN72YO4TAL|&pFBIGg@(7^=-WUT??H}3PB7kSE6skt z0eC;nJ6&7{@IIPb>o@}NUhHm}4==Iz*2NVV0lbr%wCt?AW1(be@4dC2=y-qgf3nW& znF>A~iF0e?`9QC@BbP{`s#VLjD z9^4ee^myacf@srGmd3Lz0G=Raa#G=KTz_wzf_Is8wI&+gW!`Tt!gxnC4w5HG*P~Wj zJ_LA|c}5+IXdpl`oP(p4H&UR0^Ssq?gQOZZSYQM2e*SSD*SZx%s9vnI=EXB~ygl7K zq%Jlq8j$F!p3ZE~~OX+(qZZji1=bYSHd=5q91e+B*S9mi@T`;ny^bN3e4 zK6Nr631>`?Q!-@i>?4|VByUYm+f@Y5|1&wL@HW~q@eke^K|~ESyi>M9JaGRXX=p_5 z{|V~uO>F>g{u0Y%LL&jVzk74%C2&b_ z_F&?@VWQmWhjKL2o_{z$u6QK7jb2LI1)E9Pgm4B6&>#aw+s*8EXKn-6VZW{-|)GupKQ+2@7`h-X>V3n zVbA|@B9YlEJp7p+Z(L5}ep+-C6qHYA9{$_^Gvo^VpGkowb{>@nSuK! z51OvKwL9K04ssTF8Pk0SeS&mzozWETu_@^001p;%@Q;iJuB@i{7Xb z3f@)R_w~{6j#|w{e*fQI%AI_Jw7%eO>u!MewuIJUGZL8pZ+O4;_{|ikyj)2WUSc=0 zx9^Jpco$w(w>dp84$9l~dJ{`EI^NcX`~%tP>i9w=ZgP3`P(l_u-gP6*GxaYRZ-TS} z(SeoU0Xbp8%Ov`j*gTm~d%YLf{eR+N#nOp1N2c%p6FcN-($SI5a*jm4L7K@&g*Q|> z*h;~B$h&ee8s3k?$|c|m@|9%_xj|Yher5N0fcF3|AAfQa0ZMJm)h-7O(z2oG6>$GA zB>LzVJpWI*vu!>%PaJe6*@X>XfsVJ z)KUerCCAb6jy&^g&G{pYhj%riBMKwGPa8Lx>)O#@oV+vNEBGdZh7Y8d-3>J0-N5t* zq;YjawCPy9L4EFe^6o7U72f6sY0eb9w@e!9qTwBS^ecJx_EUg9yzlB?@r-W-+gnjJ zNp-8y@vaR2pdQYvj$ez!1s%GtHD@t8-p8`saEZZ;SDc(gbd+J_7msUN%JE-(-tvz3 zJo{q`*vDIN(Q;}7T2suA_YystbP#(?GSv>m{GI>*XRpnOKZ7M!n974}wVj$^50Vv3 z33wP3f8mhr?{~x|{VYw2hAPX+;k4di}Kxd=f)5;&DKnH)lbC(1a zWOTp|$?Kqklyca@t0Wi)$t=0BxwaPFgFKs#t#l1ofR{kxLg%n7vp<0DLB_r>ql}&{ zVz@2#AVh~LMt*rl_*GWv^e?e>(b}G`G-%j^B#7^^(M@Ff1_>v#kR~0;bu6!oE6Eci zAu7C=-+bUnSz@Q(UN=F*`(XCtAQ*2`oKO&q_YK`)S!ICtE}gFegF(>5$?3lWseeVdGu&ZDH74o9|4I_X$lgnsnr+ zl_VcZCU0*EQsKQUZ@&oz@45GKjnVKvv*oE2jQ9TDkpLL)$hA3bFy4vI$L`dh1-rNV z%H-C76QsBD8=PUh-zUuz>;`!2DyU5@XeL5>3K5Di&ggij$+`u#YRlnuk+=-62bJ#) z(D7D0nDMr)i}Akymxbt9gpr@N;f4pqRQlcfv+>RJgc9ug|G11Jl0Up>m>zH3*+Vqx z@Ro@aPi!Q+w*VF1OZ~XbD0s_t2OFW`J*x8K<~4wKzsC`O7;n|KIXNl-Z=Hyz_l{pC zKx1#E>j%O4e{tJ3Cm8SRuLGrf0N%IesyupfjtGT`^E$JxM8{i;SA}qOog$tRCw2iE zFxNuI`>b$?mha2O4CmhZhz_j$1dkkCf9WRuc(Y}T568=3YGlkw*NZx9_=`DqK@+Be^Y{^EpNnK;tpK|}vPAbBBz=l=(9 zZ+A=3rh})&F&8{|CrxP!5gH)Zztc10}t}6 znV0q$c+lt-bCE|ch*0pBqKef-^d;6)wAm-QbE3r$iR)T&-v71_x(B`a_`oTX*?W z<%bqV!@CmEp@ETKk4r&zKM(zQ>%6=5(r6KO|G%EADu3s>ai+)nwSFZ{Iwo&VS-sC7 z_y3|)c(2?&?m)r&gZ&sQ8s2yE)U{!}XR5s-V7$vVYt7~Yyp0|Up6fkAfUb|}>1+qz z|GOx*?+A?dbc2`i9f0>dIipFlUEl_(FD~C%3?1)QUH;kj*;(^nNSxgMv7wM@^b@29 zEJIFbTh3#+2I(!LBM&3LkNuvui!JGIkUDdkIHE?d-8&JN;Anh-`M0+c+v8}`F;@3s zy-5YRL0UkC_lh;!lPGxC9cyDj!#hWD;^1|F_tc5!8)3XjPG-yQ0=#X1RXoZ9_y1X3 z64L9z_y0_qM8Cs$t9S^mx(V?1^7$a3lR$)QXU%Msh0*aYYMpN`%*KOXhQ!Go){2*z zM8`Y+PHv70IOj{G54^p#Ou|673*ddVai}ZoAQ9r#Nd59c6&>%K^XY;=%?0pWNZc~@ z&vxFt=*0>57I8O&2eJ%@cQK-a7bCyq7wf%;dg*uXRk<(Ni!NfH-oj-K+#SyS#QgLB z2Sc>!@E*#8-`@V)|1(;-{y*dc`hRIE4{{zePNpoesv8}6(LAVL%jY<}#CquKhru4y zEf%gxIJ4Ly;;v5G>j~o4Nc1JP)_zLUe!B?6_5aO?juRO9DMN$`C4KrEq_nhK z_qMgr;6XP%zPR8;nZ7~7WgenU$02=TJ@WhinNn1EJJo9IQ1HI^WC0Hv-e-Ex&cb-# zbUPYOUSeC4cLxK!FFF#=&ejm1mpXMz96zQ&CyIBu!&~fOOVy7b0(eVA)?Te|iG@}u z-LaHkjgGffMAF;JA}-Q0ByOsWEi_029q*~7Wf={>#TX86Lqx|{jQq}}U7ywcLjMxG zVtcH#UM2SV|0`m_J(h7fOpmvk5_h@egjqZrI^Lf|k6-#}EWvPiA3=0{z{oG&W?cA! zA^q+xIU-P>n7V_uyEcwejYe%D({fS$bnt|9a$1$wAxln6ISu1!N<8v)*1PqXZ7 zS0zGMU-k^&Y(dA{+GB1;K`9TZ4T<~pWcjYPqv&{d6v@fjPKq-e-ir|(tr+?F$n>tl z|DxZ$jqXaMr(eaM|Kn8Jiu2N?n123`D{CvEMTf(ruG_so+gsvPc&}F3VoAaKOvHW; zG`u@KW{lz4o5Phd^6c$nW{3C?!24rJy`xV70eYjKG)LxT3iNW}<9+b29qh38jozdoM7bi`hhN9GU#vb(18+2&IU z}UJrkBu2-O@D}#;sfO{suttG=dn;{Z)%Qq% zHyfMc>!}g~w0dQ*@fg6HASG@j2k?&UT|MIu@V?G-P3z}tB6MVVZ|;RebiC`*f(922 zeQY^^#7Q_t`-KLeibF80DXth>mKE{CbXle0BUZ{qEg82WMBQf_=Ot zx6-6E-BXn5E6Ac#YiQE(N>d|;kWO}QSt`8OdY|4+!Mp6`DSkA(UwKB!!@IY!JA^`E z_co2$uiyvpHVXQl`vh!nDda2|bpgYPfs!{C@Z&`HZ1XF&0KBvFYRBy#5+T#wC+{EK zgpPNXox9-3%9$1eB<^rs;Pp4o=y8>oc-@%TVF%!u3Lmg7>fVNIo>Y>wc^v z&))bZ7t=L+i@xWy$QHPF7T+`B>7D3!&nq>(>@LAV%0%KcMa~?r@khrye)i%$iCO`M z!Tb~^gT$zy@E?p4|wscNZb~g zo_gzM^gT%bW8;+@RU{d%|6haX2*Sv3VCb7sXD$6pY=hN3g;hN?Jh9Ukw5y2|$MhbA z)2C5K$Z;O^KNBQnD!hGa<{Y5ltt2lXiiUTXQ^+P5Z;Jq9^8J6FMDsuefcKTR4w5Tk z2++3A6?1w=QXqA~?{0Aa-i3)voE?}Z?WU_abK1^%wm4L z8-IPKMaQKDcUph^PJtgtQ=-D#J1~O$^;Y-RE?|q041C0EtUx^quchZk{$>HP9x?0#3WTwQ) zjAI>NnI7-<^lF-PGz(N1oy{XRNQHGPjRA1g|{a^i$4YL-o7v)G`zQ74&4speJj!258mG5 zxbkpECcqot9wgiazW?Xwy(E(z?A}(_q`!pm{?NNK+8E&djO2`4M~s7(vn|0_FF?Ql zzbCSYbb2lu-U5lURa3H^`HhZuP}b<4XIVlFhj$L5BNQXQ%xfbt`~HjJL}K?Yj|=Cq zcW-fDBbT=YNHRa(SBNy}a8m8j+*bX!|Nqy%n^FEHs30||JSgDR6LpFQ{f<$WM)RQY zCwEuDN9_DQekR`_P5YG6)CxQ(T6n$Mg8kqVJI(i#_J9gUKELWKB?Tx6%*(U;g+*YWCt(f8(TNSvBw--F}k=pMAo&?L~w@+ZR$NV(nq=*Yy# zZ*O7YN$z#@FR?y9gB^~UV>d`QUv2stdwVm}d(hR~NSbsUO7trWv?EuL8dP}u=cPMR z@GctuDT#)6iH;g8jJI=pBl-NlsF9oH0Kj``_lehs(g{%VQi%)PqbX3$A;I0-7_Qe2VNFsF6o~^QUE;`;bQG-b*PO;+akhs;YAD`R2LEpXY{In6j&XDmc zNL=(E9bFjt3BN4O6MaN~|KE8yj(6!Z?Bgx(!Zi9C#>BET^LgEypWZI%1qT{XT zH0^h*N0i~*+Y`~Dgppr_J@2%LDE)X#-46@(+eL$W&)>r$#m)Smw@h4=Nt2Gjims14 zE|QBARVuvKPo4~<;9Ylr{X#UnU2z8|;N4q^2zT=R|9i>jg53b#yUv&v*oK4cEy>ph zJHgvq&hwr+!Lv8LHI@dE0B@6nFSkl=BSQPTrj-SF(cQbYGxer+4>vvoiE~Ox9(+26 zjyK`z{MENr8SiplXOtHIU-JO{zaEtbZM<~wpBJRYm&qxjc~E{tV*-2!Nh$W$W_S-0fA@fr zC-9)uua`8TP6FhQk5CmJ0&kG!-wPB49<+Fp*d_$}f3^?)8S^uV(Dh-l6~|@KJ?NX- zn|(98L0aFnR(e64DE?oy{xAGXiVh!){7P9_KP3L7--C{sa)v8# zVlT0MZi*9}j*(2?|6f?EK$DK)--B|wyU9zeE*0LP2R5Wpme|tRX?ZlfMU@V&gz-Kl z`I~&ju9L-TE(GviQ~W)55WFC*y~9)H+Vd1>p3;4J7;njwWjIlQw_z(sXt*B{s<5v~ z=KFzOK~76g$Sv$u$4Fkm2zDj_44^$Zt@IL)XiS{{COr z)Pcw5G7S@?&*jF4C5TLqH!krQZ91lLKbHKNAn8!y9TK+fBL(kDg%&w9yr1Sp3d490 z1WA(dzO(h^atVO9kHs9jiFyL`-i1@KbvOljUm*Q>0l>S<&BsR^;BD&}{l%3n4!YIz z+3ML*bocfxIsDDAWvZnMiE9xJI%%~V-MuTfxN(oDaxfg;K8TJ|jQr*nwcsN;=*L^H z<>1ROBN`@1Jl#6MciEY~|Ho~(Nt2FMQS>JpL-bXAmWzq0nEfoI{ z-n}(>EFT3ICq@<8&L6<`R-IF?l_>Z)(XX2tCW2u1)?xXhJuu!UJ6j%00lec?&arR( z33hKEZqsYYMaO&b9sUoAks~bxBref)mgi+GI^Ic!L1txN#~JQ=iyERM1|z?mQ;w}R zkLbtS;KYT9@_KB%x4n-EBxP=4dc42?jH5{hk5}dP>#5}JEiEd%gLq@MQSeUr;wFQJ z_XerNTo~{6BlF46TX@?1cwYa-Uj8Bb!K2qH&<(?91~A?SaHZSi0NxS< zTp?*QL`X+}B%uE=I^IJ8oPOPR8_iXaII*c=JGOXqyf@U@pBf0d&Tz9gjle%T$}#f8 z%P-1WDM>%xnxAX#tg6GFz2W>ed4zqN%k;%bqEr-3IzC+~h%l@A+yDPBw43z*Cqe&j zNaaCM_doejJV^Dah#Hy)C5&%8+Y3A>sdXX|UScyk;@k~E1(}_Zm*&Od2<5Q3jC=(R z5|?-v4t_x@`{IeI^I#8h{nq5shl+8KM95}2`&M)hdg}bD)oGDDNeqd*lyO`gDNVMsAAD+Fo z`p@_O45;vq+&->N!JFVcqJoAu%lpS%Fy2-LPy&p%M#Rrf_*fS8ivO;}&$h zPp6w)FLl&lIJ`F@I%+ZUi;6nIx`|B~^O=hO^si(gtD0mQp4f4dN#79={E_MLmcN`v zla9W-nNqLtyqY`td&XDrBg>6MOd-w>K~FTHrUP z#~YVQqmI$rdU=12x9C&h9U)wxK*4)eL!uHI-laA@89e~+VouQ*81KpKsbDXFckaG- zdh*Y}>n)FbZq$GQX{DL~-$H=*RQR&^?*MPYHj6ps?L3FNYIJN7jt8D9bV&-fD=BW{mto5-*88jiae zB-8i*Cu?cbktHu4p|ykD|1YM(JDfY%hJv?4r_&-dyxpzto`QF8C9Jczzf2T{AN2n>H00Dh!P(pMOCn>}dZ4?vYr4pb zgi&77DJ0G;W%&ykJi2?&_wCP?*Oz2CyeT^PG4i`pv;J;g1O2nN9~q4@@h@p`@AW$U zD}J#szkBc2rb&n0rf|W5qQCwBe-^V0`7`MM&8R$R`)O-0iU)~{i0GhsQ0Ckt&*2Kv zQzm~0>_G=7l~mG!2Ynr#=Og@@0NuTR`O_ir1*!8JcMIzP50WCNbi}jtL9sp(8s49Y zP}joQ{fQaq9wf+h?}rJyD(MOmms2{c7Z8E&L0t-0e$my8Y`-mEKI7qCis;D3$d4%B zy={F6{qB8TKCWG^hK36A3ICZo*56EzH}2&;nsi*_iPX9M=YX^^72aF8!zL+sXBuqR zK*Rfi;ha$z@3swBli=cH#mP4s1c0~JgSpGwX2J6oInUiH!1mVe{_=*L@E+A&jthOf6o8?(fjT6!>j|34kdN|O%J_`|M2f4<&gM1^S%axFetO{19*!Hhwp~*E{}@3tPSu!*_M3Tp2ra~h$6D5fa@)zW?RkS>n&ri z6{ku7-bT|(Ug>AS;Y8nqclB4GtC4u{6B6!jXL^Psi=a(iGRQU$B-TW z|D6=*|1GIJXvc|<|IGgbK5`kLc~JP+L;$?RewOdp34734FW>8mz=PO+ur7Igod6XN z7N6(`-ylgEo|=OD|G7GydxJoOlr*sXXKHdRv}2Q>*KuL=1Jbpv#G{;xlu490ji9SX zmwxs@9U#hm>(!of#DL*Es0Ps?jgjB6v>!bA_vqh)tn`c8_+sn|>YvL$f7yqjSC^yagphjbXfB2XK+`e*NG?z5&2{ z@7=+Gyrymzo({VX>W3-PWWS{EOMj(2zI`-c&N z$|Pz%)@xUrmmyhrW_TROU6U$MiTaNVPB zRLT5!8wt>)Lp$^$_xi3R7;lIQ@3=LqxhZ&$rZp@^!#mv7lpDs|JjAufKyR9y0NzqE3$!90#X{#-cQ32kh>myDxh++j zd6h|Lkhq^-hHG}%q2paM##!)HT7TG#GC@72ZUaZ?7nLr-y~`bqapT5r z%-Vb6#p8rpqbQ~?PDB!E)A9L+&cirxyyb8I|4;YDxW52P>~bm(+MUN)4||XtctQF% z>joT}2X&3luZ1hfp$9|c36j&hH&W)ngFXb@T0PW8fI?*wTjanCQdzOPm9>EfacT!o zqyi7R3bCj2tYd6XUc?Hq12N~@sQ{hs;{CkjQ!nElKjIEISb3u9;72dntwm+jR zvBnFpnxNtRLDZ%k#@laR8yRmQpV>2u0p6)08`n;@6QG6o-6jjb_SOZcY8Q;Rc)p%% zBEZ{XL-4*Wi9{&<(|)CW3(%L?my^aEA9g5{C~;fokOVEhqvKsol<9x{k@4^zL3C7M zHOc_*^S_>)HSZum`;O%p7=R1XyaRWKV7wud znV49BH~!;Q=eyg9(2tv*ZmoRic;6=|#U~t4CQ;&=ZnDeRenQ9ll%tf*&pC`&LEb}j z)L`UCT3GGwtxbP}q<>w?VS%!Fh6I{)G>FHQN^p^nw^&o*z4QBu zf3~-L4|*A);a&ei{Q!)2l)^SL-hSQ${{;YV@Qm5kj;jP{P+(0&7I>U^>%&?+Je-g* z2ylr8c(1S>E%wL>5Z>gh2hsc0miCz3|czer=3h#ue zNoPuN(sA9=5Do9F6>?;}=Y8Kw7v85$_nh>ujD<9VZCor2&};7<+H%e*%E}~4+?~%$ z7M2O3en(Fn$_!1SAMfjpyWj7Z!QS555&r!4u(A9<-9mgEDdwn<)MN{xZT`G!Kd%U(ZKA|DSC}g!dp< z3Ei8(fhE@Cgo3u?H3IZ*olD*<=>PkbS#(vw5-YZAq3T<(#LC$Xc&d%YLfelKjGeZl zdyvAVkvg?9dD1o{F0Q<9(fc*%9uyX{U`ex%9>dN5@ATDMH&F1t+ab-4hPScp^-vh^ z;ib*w3(~$WudeX|yf=96E&2i~$oDFPXVU@R4JIoh)BxUG&6?lt1H6wIUo~&3h=tk= zWi z`Ty~yKfiK_U~hgoNkauGF~ueE*p}(>#_@1+)1u>aTJyz_8gl<{M}>EqzTX`R-nBk6 ztY~=akb-Z+c%P~9CJ#u}dKcV;-~X#xoXFz>`v2#w!ePI`@fO$RS&i`ZmR6SZ@2voD z`SV4c(z|1!E5daaUj)(d{^=0dIhC@AM2Wl5;3uH|5&iU5`KNMS94q6UAe}~Zlw#z! z&95-r`UCxVZ4E`I(w7hbST)pRo67h^8|R??CqMb3Glu%@K&h? z;QhhI`-083ScnaOtMCpxI^J2KF5BW0l}PMJ+?V<_i5<_;@s7dQmgGz^9^U&99osPS zldA8U`fNmhapIriti1j{4a13VX;V^FrA&`E?qDu$I-K$fB>oI1Y^d-~nYV%bc?)>< zW>cI$2MuqRqpQhpZ}Irgko$kr8$;`?LVwhhKdl z>;riF;6#ntRESXfFFu#Im(lTVn{!igKtq{y1&O=&vcht0A$oE0)c2-YZwce||E-9Q zM;Q4fF1%sBeKq}fzwszL;5&@n|KDHt?#`R;eN4Z-W&ipFO**1X)_L{b{CofZKZ{w0 z{2BEB1S${OUmSCI0>F}AmOlbL>r zwb0v6la4IMzDDm{a)Y#*3hylYUJnZ1jd)oeG`xrWsy4xRhn1Wr<2@5&b+!`V-A9V^ zmgpluYG+P-F8lyakP41Sz@OOFB-Na>0eBxZ8DG)g8Vi-YuTJB4M92G#zx*R9*M+1a zBu>nt@>R7aI^Mb5B>i*EDh!ABX+%dBMt+M|21R~(MnB$?1}0h@A84o`=O=hb>0~iI z-nbYdZ94Yal&buxAXic0y-(ooJ__E;9u0G$;eFCxF9pV1<0cpRfi$nIh}=s6Z$k4@ zLED=IsD4c9g(LVtx@mc5wIaa#oz%I*+5qn|QN_3)E=1_%RQ&1wcj$O8oLr|`Ge?p% zjKq!UmEP9qLB~7!&b7x}uIdbj_X0#m0!Ds&7W8*d6w;5km3rIY^>f&}x46e_TV8Gu zW&Q)wleFnrpg1=WcZlrX4peyWdGqa`-P?B~mpIYz7X7~9D2#W|;cznESHH~E+=Gjg z_O)Y@-2^CeYtfk!@Id;hV)qqF0B^zL7I_N*-tt9G>{rc*5MJ^DKl>eYyw#5S9Qrvc zO)^K~&bS(-x7MTMT{X%1P|aG4;qX>Qbd+M`H`aY#VEupbfi!{7pgc_L#@zJ{(spe5 zQnZ`t@%GT7O~*3ckBcVK$ioSHD!elr`5#f-`@^+V4m7+EO4>HSc=z-?CgUBrcqkD5 zdaLk_-VZyw!10z_{ci)o;Y8)hC$sSDE%DxaN`8Un(15i&Zz|*@B70Y zPkyq=ktlJ?di56`DMH74yr8ng?WhjJ;e8L$@d+b8qu&i7R{urq-L`A1gUw6q(_1+G zRNU?z*Ob@y74)s z^jDAxUkfX{WwG}laS@Bs`K7a&zd>50NShAbFj37v4bmDaymObkbx`nL@_vB;8s7Xm z3VP%dq|Zjl7o@G0bZV>yc;7dRu0IKu*qw`t^!ld2^OgeHk7NPfFSfbQ2>^J1BzykdQ>EXI_>)o$Ok|=R`sTbb+$NSxd?nsg+tcRTT>n%p2cQ{jD(?T0)C?@zAx z=Aq$zPeQQ^p8s0~Ymw*w@3bDIy8*nDrAa}tHwaLJ&IdM+$rPy3VL=^?w>w|?vtWSt zu{+ii_qGtBPE>dwc$$+$ z!J9YvBtIJ7KNs?mKX0)+&w+e;tA6I^Mt^{J(}QNdoE`#n_52aXDR)_}}z81F}$ z7Y&60yrp7x7OMosLZ(aCZG|R7Q2$zXZfdg`7+@*T@=qtE~Ij18v`rZC>; zEp{L}vN7`Gt}yE2a;4wB4Q}zCjk3iaPH;AVF0s(v$Mks5_Z_22hw^BBX-qxYy&b9W z&ORgGL&4kd%T7Ktyx(Pp-h=yp&)Q|N@a!#hw-x&qfcLW~iI3c1IB|;bVPWk!7)~s; zafk8#u_uu&3gG?VJh3|3B^FxQGSVXU5*_ay?7gZgq9UXfNSserstq>@9q;h0$_o{T z6&cRG;}9J|82OD492^KaN~U+W*~;$7yJfk>OtRKum=SkOZ;I0Jjm=(8eShf zkTw%J+kD_2@lN9z4zLDzzi|$qYX}CU zVjVlf^QKcEqGHfE{6PBeF*9`wfH%*apFPd<;vk20!8JP7=y=DCy%b5ls7SI$;xu=^ zkXFh<$NR$f8J7YheTJ(bV-X$o82RnJQh#yrBKrIPA)mDZeao=t{|{DeKHE2$%=CCC z*wUtBiS<0Yia#GnccsER@4<*K1@EcIQeiZ_?{?&0fbq7kWF_P6>*1ui4B%Z;aBg-j zc%1mjfoBg!!Ei$BYUwOIoY-IJxsd?y=8`JU?*w0OJ%8wX;h`*ayuVz_vtD*cfpiv$ z8*I}E8jVKBn|EBFeX%s--QN0)=-|M}FKxfxA$u?S-CJk1^|A9p*dItwY_RyLAI|)E z<0@#=p}y^RRO&IZd#|O!`|!~_=P7ve9|#sg!~5JdzFZjZ@3Jv;&ECv1pADUyB|_g7 zf>$;iLC4$q<1zQy0D00R5*O?yCA@40I^OxAQFh{!jQ8zrCqzdsMt-eYxpIa7#pT3x zqD_;rtFgDYf=h~ZZZ0P>eeFFrt%xQa3#>M-6hHX){6FJ0`~O2mpg~$kfdZUCMjeQw`Lo*)r5qcp|9603FV6cqK60Ld>}lyAk73N^M6d*BPw zyQj=G8o?PP)s8Ui{tA79baIPUJzF;8 zRghkYj!KODq^-Rgaw6zoVhMJEnX3-b(Epz>+4^dXmFYbQCuK^TjO`_b{dB&kHqn@CS{!3jK0L?c}Edf zHZflRAC2fZfRUfJl;OCaGW~d8<^Q}{c#wu8b{BTF9l4sz{CFqrrb)+B(tI(K266@I zO@(&}+shmZ-h2mcNTA`}888qI4cfF2yZ;aK6O%ZQ&(HMze?i_tnsn5RG>~k! zljr|lRCph~`J|PCx4CYSI2zv4`!{sJcxNwJO78zFlvFqC0=%D_&mQ;gCqQ|)`f~!m zQy@*-=}Gwf|BZ+IqtgIyjs?)1<-J7cnsvt#*#LCBUv3=RXI7_7qQp5Bo9czwqT}r? zP;z{OG~>PhH-hMJ!^m&9p_IOvJpFi|T6!R*X9&ANO6+?!FK5ntrpFtnI7E|9(&1#O9gJ*BJuUE;lH}Q>^CE?lIo1Jm(p*LUMF8)Z0Ob}zu)Xym@WZpy!$e47r`rwwICQ+Dr^Ov_*(sAKak1N0e0<@9 zj`x6BmZVcN20 ze!7A(H||IlqS-fw~a-=E5ZjvpXKP?lJk4ogKe4~o{f{i+*yklT@@t?>MRyEtg`j#3n9uxJJ??f)Avvjce&dKmUL0 z^PZuZtqVyUNSyDhwqv+T^#0$)Y&z@bW5&B6-Hqt5#>j78)%%vmR`h$2nCH?B4|8bf z|6?8t53Cqv{yRtyr)kq+>=KWh|M#Q9yGq6A76os-&u4iwyuB(Fm%>Nv+J#ui_x~He zFWk2Y;Qb)Y@%{nui5=Ao^Z0IpCH82WYbuO)@j?YBk{*@2FA^cahtajo4(Lnl z5B=on6IY~2^N={(*CksBI_OI*aTlj_8J{M@4M@KsI)X9so9itzetdd9>WNx3Uwjo~ zGQ#qdhW>xQ(Za}r?abf*FQQGy++%B^e_S9}kQ=D*uK3m@N5T8awq`jryidJ3Rs-Wb zC31p%gS1uk8jCx?d%4w|%C$)Oc)*S(0D_QW#x=_dus~O;fs+U^y1l*+!p%XyHF-Z zMq3QK|5rUH9W9$Q&h&T}ZJ?Y}0V2jhKytcRxz;C=WI$EM$Vh)@{M zPE#X!bi6$iT%JeXmM4WGac7eBYnvO`MI9@vRCyB{q8*< zzrgX%eeC`p*JiikQ`}dk$2+l)HXZJ|?e%^YWcOZAg?Cws>p!oz?Ah-sgNFBw3fy5B z@0#LB^7sGhdG&q^0=!K`INdeg5TMrJ>kcbeQz4$bwpsY~R=op1L&^c(ME3Uw-yS1E zW~m&+(?;lc%NvBRI{j6FWQxSy`;_c{UmP88-_&nCo8lPnc#ABe!yO~P!r14cX^ZK1 z?-P9!=}WP-H3wu@pgdDMMm^7 z9^UPU4ik+0cCD5Dpm&&l_x4FUwBoclcK=`eljjYe`zxl$+fPoECLO+c7wlwr`GqQmbB0}~-@WUT9adKLWB31wRg=Qo++H$0-nhJPH0k(ys>w1Y zkL=z7RCu4rGRdU4w;8X~A~d{j@mOcWc#jNAZh_tVvw+%({Q&RW=697v&j^rIl`m-+ zTyOc^wx$QhTT%Ar;-dg>TbD-fkgV{aPom`~L#D+_Ue>`&dV#JNk{e$ z`n(rp|1(sl|34=K`u_+j4?4H3;-5E2c5w0Qpm~rPpZj-s57J!q4f*{4Jt(PU z5_r(HqEAs?-w9CkLlb`eu@orZBA6S#V)tuTky;2igVfTp{pYfUySELhY%gb82JgkeZ_&}r~d}2o8_3~FCXkH zc8?^V<|(~q{xe7)?H|&l<6LIG?KrrD1n>^0!uu?j>pusi@23uEq2ayq>5pa@Z>^z8 z@)mnwxU$VBfcIB(JMNjE1n980XEPDtO?u_Z2jBl+<9hWV{Qm#6(Ne#b2qF}^SoDq@ z8#> zv#x7h>$=y4`fbZT*HZo(e~JAXs&>MC4)cxJ`JMeo#~_XP0(Qo(BCcf|Z$FjVq5MkP zJ4nJ=!uhnvtpAA}p_q+69g9*|C-0|>w>U_JcYc?^BWwq`V(jW-JiMd&E&UL@!+6Ii z1Jb-S#J{`&cwfJpD6@oM25)~eL2L$i54D_>L2i)prz&^I0le$CFS$3v&?>xKPosXHe_UDITZoT$Yrgb)g$>MCAPt~8%4o#5>Aw5nau3FLkmv7x zPq-{byZ#UOw0_rF=o`xyNG;|Y>C$n3!=V{Af9n4ORCwn-I4F(by>g|83Lf5RMz#`mVONJ_5j7&vVYjVP$Z7 z+cU_KUxAOe!?79p=Z?)R7f1a#4XkXkQ}OXWuwiIoVwMck)&F*=4l5e*9nrabHixz6TkDa{`D4uk}F+0E{>NT_xjWS-%o{iZmex4hIcq=gEAi8?K8H# zMNV(!LlY?T|K_AfeyRg_KT1)G9OE&A6$oGX(*fRHR$&3i$BC<&US~W9^?%ir!|%xD zKJZoJ+5Oqg_;?riPi4Inm|32Q`rYv<5c+ZbAMh?*+59An`A%>1Q5}{v;!Dxa)HpcE zINqd(zIQU|=>Iq0I8bb#{+Q+Ke;spIx^$=&{km^-@^AhBp9^j#`za`p+^KTVUF%gF zu^e>o^K5Or92EZh=`iw%oi(YF@`>Gw`ZLnMKn}A15Tkqh85zDAv1-Xt@IYFgfa|9@ zAO}6{@5$){ODtiViLFE!xIwBKvtC~czd%YXFWCz7N|hf#{j6@^=}9Eu*Z;MIrLOK9 zneU06XjDfrjri)n80l>AWxPPD4{*Kb^MiJSbkr~;kxMp=<#&*KB_rw5@pJ4LxgwU* zL2{$QyO{HrJcf5*^kYptyi=nq?jv|Vs+>c?yY$Ft-%o%y$L|km+~D(;wCQ_^F#vC; zqhiW)0p1EiOI9=jyyF!@u9=wn!0Qd>?E2V`zr+qMZEIAun^(RD^|MmtJWy7Nzr@bh z-G4Xa2J_AT??ZLWq!C}=aFIbpCgTN?<(B*Fk7UwO|GPpw*>~bt9`68{hb|pY?~cEk zf0c5)b(jk8!pC3#HUFRV1O#t!_dS#eQX_orrxCm-3nCm>fD6*gtd2o9 z0N#R2<{gp*cn9uEpIZpp?7CeyF)%K!m-akB$cHu@@dauCf7naAHK-8d5 zhxNVcMSm_Q9-_kgj#K^#kC&GXBZer4wX$ zN51UsNq~1O*OZtPzYekOO&kkr% z`u_&chs&El4!Zo=P+aFR8TJt?3f}lJ7#`G5Jt+=ykfcqO)da{v=X2(KQCjH>e?O|~ z*7X!W2fc{PUGV+dyz*t`QPwCR3TNyp-_J~p-c~RkA&Z!ZJEwNDsZMt}P$Jx4w zB1^27=Vr}1XRc}tjX2l;csA04}B#CP*4dt!bn z<2y*pb;9JgJdHH*UbW5X_rkaAEI&a?w&5UMI;OVUgvCWtj<-Ci@GdR){?`Z6uB6!I zczF9CZ`_68tq~kaDUe)026XlUyob4s&+U6chV@TQHH!kgpYCRI69&Brxiczi4Keg7|j>LAjHk7IGI ztZpOY*}G+#3ukX8?fyUE^{lSJULKamo1iX2mkyrm=Y{0{G)O(D@Vn*Zpqw^5Fy~}=o`U3Ed z_PpsO4Ceoh?=mU-vm%GUl!j-@D9_cIfURX zJgy=%T<-&KOYJJUx(gp~*X`A(%eP6FZ$|y9xX*maFv8E?{Rdl%?!0Bb&B;MjM>~!9 z^esm`3@aGV-q9R;I`eC3_udF&r`D_u=4buAw`4S3Iy}qkbH0J>{rCR=e=fP1>ZhRo zKSq^i@&{)c(x>zrQ(T=`9WYE@4ICh#@lEt5UGy z{`+89=Z2 z@HHyxm6nH1r%J{&?9F~VJEx^aSTz%t`v6k88Zm3_` zoQOolcznDGO`9rQjO3ZF{=bRp_}ci-@qKGeK3LktINn`hswIb8AJDA-33Yrj_F+ye zk2hf<4}Ch^Hc2b}=^*)1;ayc4JPRBLAd8?VPgR~yiAxI-W13|b}G?{U{a}zTbO!LsuL6V#r?2ega zeY`h+qf5u9n)Fw*{*1Tqp~CxqxW*WU_llwlHaxuR%@ooQymzL0Qt-ZcT5kOZP#|gd zTl1uKk>QX-8$E)+@m7msnkRBO(WNUle-sE|4-b!Ux)PGGN!f%wq5suWx6AmaT(#`ZF|XH z=&aS;axv6zrolb&{qp#DZ+K{-xBE8p-QF@obr{f!?@H2ae^thhw|1I7_>{;;d+$vU zc=RA6f0E_z{}XOJp-)Fu!Zj7JIr&@vGgYPkpMweB9>GSHgBn$>rm-AUW@5vKmxK5X zp?Am(l8o(pDI<1H`P7G}fE^?`S+jOy8W|RjTbH`HFBrD?)fgiUa*)-J9&SI7gWmEV z$XFoZ11}fdD@(}5FOWuhHSaVDe=A#p`Yq#%lIV@ZFOWPw$mwkL<6^o3sT|d@l}3DD z*S)>iBf$6)t8-x@UVjel9VB7IDEIR#=i>hi0So=qb2VK$&PS{6;F=u_me`0HRCw3F z==h4^ZN5gB7Z2~gxP+C+Cw4;FWt0JFkF#W+!~neYS1sH27=O4Y!|ky_n;Sk9RuP*wPP19OaFupF&#=@1zMn-lKc!l$JIK zGacUHsE%G5@$Cy^=l*5NINod?JJu8^(cVGs)4Eb9d*cbq<85|^J{_7~+(IdV$PO}s zK!tbRohf|`Z>3Xjx$*E8UcWL4!Q1?o8fALxN}0Z>lK}6g1f5>RVluq3ZM{s-KrnpM zMaCGxJJg8VEehbheQe#G&|BUx^l_tQmmxmhbuS15k=?xI)1!al=+hd8^ z&0Mv)Oow+as>6Xse6Mzkj66EcINrVUa=vAMq~n6LE2I@}+0OEK6TIlu(Rr3%{m=2% zaVoqYdVej&@Lq5+p9>G~OC;5A2;TR#t0^By2a-z*+yLGK8;&m8TT6zG1J>V{e-jLk zJ-U=IAK>lcuwDBs!25TgQ+t=C51d?h;-&g1KHl3B`m7BkXO%~zeq$CtBvV`P@%|XQ z=i$y==KKEN1l2J_BR-QFziPMtB74g|_jqhnLdW%%l@<@hSFOIwLfer49BMCpI{X&( zE$sdC{+~Y;-nC|XFJgELn+0*=;msbcmEp>2B=XL53 zGK2JnYgZ_;gVg8i+M<<5hHtD+lim+@kp1G^aY+3y-WKZP4RX-4Z?i4gVtruwFKf3q zEW$s7eubdlvoebaG0*}?d42HGmJdQ^2*7V?%@Bw)5H@4lo z)X4`vrMjr>*Dw4fc4=m-#jg9m^iH6Dw%(Bn?S1%5ta8AIlJk%N)8V}X)nP&-K68#^ zN>iH{$2-X-hEMe??IZS7$5}!JZ+%%FZw}c3L3(tUfB81-{0DD{3h$O4hdK;ziR}Y| zczCmY;*&*AZ%JWVZV28z)t)Ai0PpdN`w@F`$neo(`8Yvh-kqa! zCB3$Q>^(8%RrL-Z@5ZY!`>#A1)0>a_8NXQgO1J?ZZ?Ph&i4zA2Oo#V3REHLg_zHCd zOMb;Lj`!`MJ5QIT&{6+e*!iCh4Pbe^3Hs~l(@|oau12ZG>;^%?Udd-c8Hj&cX0b z;dbT6!`tQC=eG#nB|?n#-s(HnpRyJ7g^jDHi>2v#>pKLMaL# z@BYA3`}U7a=rJ4KY^aWlG~#Qw46=}z&v^Y`(VWW{qDA|7t6_6y)6NA}ERT23L;7?$ z4fgsKhy1PoneG3F{}>Ob|M{qLP^X~Q7c2*H)vpl8%Rwee8SW234mw|%YyF z-v*Z0r8RXTw((@xt1cv15u8Di$wEpBU8;9iJIFj##~B*&3GTjfDeW-hIVc-;IB7`F zh#f15m14r&ET4l22Sn)8u`#Ad{?87QmkRHWNB8bwct<%C#qjVxVx-!R;5`y`-x0z4 z%FJ_hwg}!IIiG$zM~3-cXZcwT2EzspH*Dkq-Y-@KRL%xF$e9rtT$+VhNVcze|H zh`QR*#`~z>(6*640?Ri@7dgiks!~FdVbxmFe!y?87ak2pK6+VY1EdbvAx36BXYxjY3 zzCVA|au6SHW3_sN6<#w*X{g^^p}=<=$oP0`d0I#f^2snA-sY%|l{Dh}6nTCAP!8jG z8{fFpId-3p=7eYU+)GKUk2m2mojR%-)|{oh-V(t@h4*8f{C*5?#ghkw@$i0TeoGB$ zPDEH+yC8UXmh$Wm0C?|TZ?-w&CK)yh$uyY&y|)VA841YgtwdFF?@@sF%8Y8Kj81TR zYj08_=ZcTFqj}uMSvUDeQm7w0Z)?Kc&G>ltUnw=)z$VFbcppb~e54Vdd-w0-v;T|P zTh^zmcbuC;yZ%qM%OziLrg!TZ#+TSuxMik*3++2doh_gEV)liwd=9c5tfEWDiQX5X8NtYi zod_W+yq{M;Jc8lfK4U@>5AVF*$8!<9FIxO?MwZxx))LM=$Pyc9am)nN|DQK_-0FD| z3`ZW_n}s~FJIS^3+8u!RRo)M8^f|zIi`0!eVM+LS4;o}WHxipqGC=))Jn>tS?}3lE z?7+u^&UTBL4(|`B4rLngP5p$IXI3)aAm!Q6zQenUjtVf-h%1~qY>YF3!rd)#6?dy}6p-tCl4yZ#TT$PPAKKZoVjUD zWY}ayAM_kY-cmpjYhELs$-ac6FW{UJgo1^Wa1Zq}_vAlme+f zYp`MxzGU*r&d;N5fAn|7ST z&q2;_9&#RQm`U1>`e~^1+duNc&p~TtiZ$o&V7?=EcT@+NMtpZH$(@cljOQTp+2h5p z=@_vSpm<|zPwZ}%FOXzyztE*auD48hbr5BV6{W)aWmS?5hWAE+PqKJ;pD`7dMDVse z|DA&OW*w+;0^mKMu|4$WJ~Hh0&A{MFXE5C8duF``zdZ#Nz7wz5`lxT7Iq z?S)jB2;+yhwvT3@OI-bk-@`T@<^CEg17p> zHcAJnuj5V1IKcbrzL&uXhskh8&VAp|F7Sc$mByE90Pmx-8l~(3-eNsZ{e@k8;E&su zU2SE@?;yGD^^3kGEle6h{T|KmTkQH8AMblGM~3!wS*EN1kD@xNX~cJiY-bS5AToS zKTQz4V>Xpi@Gda_BJl+&kPO)CC61Bd>v4yTBA*4rYEo+*mjb+J9nLND26+F>oRq1)Di~-Z|8YRl-}FE3;i;m0N#Ny-yi3Pli}~9eA_F!gW)sg$uCp^-We6yW^n-T zCW~~P6p{~YHoBj<>Iwel#9dAFxcrCNBoowcmEq6j^|$cx?%C%^xV}rC>G1YJb-bYw zU&FlK2-|YTv$vO8?snHK+Wmh*;*w?8Zy#rQya`+0)1@Os)=_FRxSaTR{@;JBxS8vR zp#Gmrm4n{CJEw)^pnUx~N_aWQqcQ6!l7se-dQoyvV3Xt4ZjghfFNYO-x{=`y^V0@K zV2O=u9_CaBIq3fNrII^A4tjQ2S9gyEcp$CA?qSd;{2k<>U9l_O?DJ8 z@$Vp6kF6Te&11ehNPeh}{WRix>&Cq|E0^&cl;*V6(X5n?9Hbq6XJhRDg86@unRMyU zzmev|nMc_{N>JfFbk(yA!@GB?M*$D-%N^4@5xl2DXHoE;Fwhz71$ZwtEpoi)0wzei zcNMgN0x9H>XeNSpWUcl3tpM+d3zsze<$dAuJnMvkN_@PhD$c#Hs}>{`pni7O*GF__ z;^QrEs{KfwU5e?JSYqWL9ojVF+onNy;p)!#4zk}H+7J~^yFfbiVovtw$8T7^{x4Qv zOqY(H0mU^}PEfA5%%Q@2@c6C87~U`K@)qIYy}rVc<8sI$w^%x_^Tf&p-lF0Fv&C?k+L?a*g=!xd#NnQ9m$dB7j9Ddg#L^_1} z-I5=2{a%E>gLE$RF+Sla&2)HAqB=Zi#3y)Y_mY$>#Omhg9=0<9Ju?ec&~(jgHq_6pgov7CmBl zya}ds>M(ogf}Y-rQQ`esx;PlaTSVV@As*ghwtsqWCT|$)y^YLVSgQ5e2aa@1$QF#i z-<(uMKOV^Gm`Msk{e%t6&3at$Hz#ZbYj1HnF(2Obs19Bl@qO%)KfC5S<9MH)mH*~9 z7wxaN2ud+3A8f~pn5*#nFQVyhpi77Q%+Xq>OMmPC|Kd0N|NTD#>VIjf95niA^fQ)& zKE&}X#mhnO%`JB#caTPNU+hILNT2S1qv->d*jn{|kycwW?CH7P(&0%kO!PfczZ@*F z>n8X|24=Ltdgim;>WqEh9hWONYQMnWL4MHe9oh6=oMemol`lJda(5~I66+$|_}X}j z0@Ljv$59;~G~x?Ycwg9hL5Sv2`TqoDDqx$Zs~a6TXi#s4OydRCUt*h9(xt;rrl_#K z?HF?ZUy2Iv56>-4Fua9{d`s}~=KH`_fZ!c7w32eg?vqpX6Xc2=-~BI~I=jfQ>!K~N zX?rlNmHggR2jIPU)uPwa0Po_V4^@h4KJaVV2S@m8@bOk~*)HU8Sd{b<^-Jrhipa~r z$D0tz*J1RL`8r5TP#v5!;uAfP+QR;falF%qM!%LUqT_h$Xz9_>wAn0w#2%1!k1icA zo-cWv`a2xKdp;H3BmN`e7~ZdRa~I>`z46@K1;_>I(^>?|1?k^ozrV!-ycOcd^yEQ- zw4muZheby)e9=WAOB>*QYYV|&6ck8Jes5MU81aUm1b8m;t#1k`QbB3k5E64 z#LXXfZpX*FqeIVwD9wC3NPbjD4~_WTgGie~<}<#7WZPS|r9_C1>|M>dPH{Ou%i~Q@ zpijqmN#R(*M@s!aj|%Vi22vsz-g`@qsNmu4W>*x8;5~Gq<^Zxe`P#*sn-1`{vDF+d zcOt`AhR-gF0GAV23E%jETuz*pXJ zVV1{xB)N$$9UV}mr5v~*4YIc+72d;A5kVNd|DV+w6WSmLEu_jp<8RvBu^a^DacJY^ATP_| z&$S>2*}af)K$h5NN|O^vfwU&KHt~)Z8FuH8*|n=J7~W}p(iH|dDA7&UDFhTqv;55z zpSAhGmy^@^_B!F8L8eYd*c(pEkT5@&o1GW$t;auu?CX=O$~vvabU7#u)iFRLzLct| z$&ZqZH%NzfZH_*WLVJlN5a+!!6H#FO`oB_=J{^KLXPo~tVn>b&?=M%gT`{~r54LOK z;qB3!!GqNQ7bXHJcyk7=S%Exnu{1|+=sLLGA{Q2}TLbWxIbS0|0(h@7`LO9cz*~Es zpS(hf4}7?oNA-{zKHfuVz8A)nWJs>4-yzY$An#fDc(e5t3#&X}zEA9iQ5_JC_;ycv zb7_zn-$8Pe+qipn(*8iY{H>mAUfXq+$J;-aJ{=<5+mfGzQTqQ2sPO)L+^qw{d&$Fe z4LrP+9vqiL@P5%WLcx36@>$#`0N$1nLETRelHpS-JzJMQ4u%(OTUopk;2kd1Ot=m3 z{w{cY2Eoe*cKFGy=Exn*0WNqbPg4de9^S4Qx6ka`lIeO|v_!gSd?9M!R! zMtqyrbDPx$F@C%i-)iT)$AgaSJ=kz|D|CzH@eatOPe)t7$T@E;h zGyuHEGnH&kdHTS!9h^?H{{!B0)?B+PT05U4iu%=YRnIi|2fP`nOj&Z#6FMbxU-%k7MtrndGrIZH(EMFi==f=~e<6KpX_`+BU-ZE5pkFiC` zV|Y*GFH^(AJF%dP(tCSV+Q(4uEvJ9g@b_pRc;lhCk@@oY**ii%Q2A($BxwWcx3Hk5 zikB0Ab0S{&@`90=3e#opI8=uejrh37JUSZ%8Q+{7OR);nDWv0i%Xm`acV|wP&)x)4 zI(6{fz7@IiZ~f1N)&Bn*5~%-`sB+Nv9ZxBDkQRXV{~Xu7BjDvAar>>ekosRvY5pFh z{tvq~sdxq~v4Njc<(ebN@O}?l-ehpZe)#7)1*AawnNfHr2`sU5*76#i{0ip(6}%TO z`-cJPXD&$h-90Qvl0*HD9#`8{jOQ@bfmyT218P%)YVv!?uMJl|%C9#=eOKgHpoh}~U8V&nO z5xhNDtfAn&w=Y@(X^={rTNT!vBExS8%~wM}gVgA^Sq*}B_aVVi({}X06I=0RaVST(U8tBr|WY2X)&DjmXTY(DisTX_FFucEaaNy!yF+Na@ z;N4iakAk3i3J>n*Dm%3C3)w=z{Q9P$OodDE{ynVn^YfR+=+d#`_Lc8jBF-atFQUTx zt1^ENhPSB9E*-q={qQ?)8-llz<5>#cPo}*DA^_gK-6DarPJrRW1`yl~>i>DS=0W-h z-czF2d;#7YhIctyPy4{O-(=bA;_$QguZn`KR>=h<%&%_ok@SQaaB*dUPD=86EnWPO1Op zsqmiUPs+sb9-6Jb3=i+As#z}(ysdrfD0okJ$8Qe-c=JHzR z1i@P)!^+?=zYx2q7JFT5yF>gk8e_;@R)*ARl!Wl5MHXZ>Kp4qzl#43e-{5){&0Rjeiwc_esg{! zerz*Kq4_D{)J53vd&-K6Ab1ddgMDRl;?h zE0rsTE0F65*Iq75E)%YmT&i5sT(h`1I43#Za&~hzah7xDbEb2~bB1sp<=oF{!?}@D zpHrPvj&n9A7jc?6LhL0zB32Ra5VMG9iQz;)q6^WEXihXDY7-TR5=1`e7c>S9K8YYtNm z630>wSq>2nBKs8kFnbSs3wtGB0G}J*9zF{`V?JFz6~6g=LVRqz++gx7aVUC$gVn_hCQCzJs02 zZosa|F3&E`&cpVDZIrE_?J-+5TOnIETQXZDn?IW?n?2hWwl!=zY)WjBYy$t@o6NZN z??3oCvsrcp0BE^M0U*D-SI`8$c9<=KH}rV z8JM+e{S9y#8nf)=2ZNyBn6=}BychHfvusQ3^`M`aWfSzC7y5x&+bvbgpzoMvEtOIN zO=Fhj`%Tu+H_X~rwKg7_!Yqrk6K9~Wn6=eqOa+?6tSzuy12lnI=94uqpmEGHtBP`h zzF-#lx|RU+8M8LoR^5d@Vb(^Hb}=-DSsMiUxS)@iwZ84!31}3vOs>^!gg#)_x`@>} z&R*7?8 zfZkvhJTjsRy~ZrkFIj8o6=vy09aDq`Fl(hcA|OCob2ZcFam7PIC;L)K6YX3e=5cL%D*Eb$UcQRo3?i8=4G zhpI4Zwq}qDbRV-sek@OdDltpAtL!pVfmySzH2Fd0m^IV!&RnPrvxKzH=R&2JCCKx* z47!I|0&_2DLnWBSmo88P-Nh{45bY_b7_)eccJG9WFpFFHasyO|S)2o11yBKI5sM|b zpgWiao$4e&w=s*u#{Ld;3$xhm$llOR%$o6iXD^hGS%gB{XHXt$ZT%f?y%NgBtY5AJ zW6%xE`l&RB6S|IB-@h&+K-d0df%A6gDrOOPGaxDg|A{Eab})C>67ii}=t5 z%tG!hL+3FInIHtEU=}iP1xm&&WIhFS4zrNY`JuCzg?#-CC1DmahZsu4EM#melz>^t zluIZcvyh>H&>74^W~f1Nn1#G%1jS+&^7soBgIUO18BjE4Ax{fHQJ95HVuwznmPL}t z_8Y{-n3YiB>_}9>toX>p7er;uI%A>ul&FMRaZAeciHevNJ45{wQ311}9}>!li!duH zLh2(?9=3stgyCmSE4Ltow|G=jVOazp&{H3L}|n<#`??rLmZL_y4QJCW5x6u>Ok_GCRGKWc47Ubu!LF$;MR7>d9w z%xdXzsDpwrtJ!0W??uQTvuX^LnxSKu^?%gig z3VC2w$wrtlO(E zH$pC`WpQ??X*p39`+K*zx5Yuun3dlp@CZ7HS$Pi*N<#-QD>v3Q6WWhiH!OEbKu(x- zU0l>3a>T5w6GlPMKFrD~PozFS=0NRdO zDL3ttAZyG@HuUd?tT5}G_;dhdiCIZcU+sdnVOHXWwmXmoW+iwiH$Yo4D}IgT1856o zo#FT<3vI@%*q*o(kU3_>+>~vE%rGnZvh;F@j9F2p&DPMSzxV%{zs4hgBlac#K7+JC zb~VTuB+~!qtJ+A!JA<@*VA+FQu`70aMfpHF{G`s5)NKv@#3hib02r}5%POJv$fIDm z%Oq|0YH$W=?>xs!4xB;Oh%e%btMY+KfxCxxTH&8T<_IX6Xo@Z%tw8KAZDO*&v1{uiXZv6&^;OPKEq z(g&!Hx3uEhEB!+@n(-X;ZN&ae)DZ0@_L1H}n;XipEMFj9+;oU89W4qe2fv3?c90rW zcq7d|4DU6&=kns=ZKSy66oU8K8DW(A|BUzfBoTo3`0h{NVDJTLCHJ090|0NCCB)>l z0B`ZgY!!BZcVt1w+wEt)VTs*t(Y1^4@%||5aXes-G)WBglkNWEnK=U=?@qOB*YmE- zhxY`kV}M3{Vw=1qHr;3Zie1m(%Olm1w2!w4c5+h6+~-&x?|^;Ebm{1Bt)EqKm9m3W zr@|ZQUSoJS_zrU8;hprx;0c1ab5tqi^meRr+3W=X@2OkvJXK&o8uyCgxoet&;rmJx zdyN6!qpP~(CI~HXgoq4>Xs9>b^=XhGI~yPGApKSPyOgC#?WkYrSp&a}kJh+#Zc1l^ zYQP!h!#f<+kx3&yzO5StUa~Qsy(gXg=REbJeY|!4=lLzQZNFF^Z}F#@bm_Pezu`++ zI0bJtD!h^F7#QAensr=wc$fHTFGS}5<@NAU##=&F+vjQnya~IOpA!HB(qvSQ=H3H% zzq^p6yAI%8AgSRy1n>?KJpFc4v^VT9aIyXTe0;pa+Sjqyrb&}_p?-EBUzpfW;o}_; zCiKBZkNKvzM58)_X~Y*@=;v#+mT|mmHUt|gy`$p;>2CKZ5xZ%Y$D3e(ggzZMydmm; zUT*}`sUdiqt%50d|FG!4qzmwN$=G)L<54m!-Ep6@swEgs zpY8Av*_`+}lc#?Iyj^VhCwSiYz{(QZy_fv(>;E+AA*U)Lxc`s(m8PiAAKHOm{|}#& zmYY7ue6zQ%pgKO%h|l1?)#mb0f@pZ5KKf?HkWY#|ZW$2);O9Y0bNYbA63 z&i`lTvj1PPf%<!^qfPWKoagcbRnp~8$MJ2C2jv|{3Z5H%*wfI&1FcD zs9&ca=f1mA_ytk`iLI{d9rG=*?@=AWG~!c;dVg-~L&giF65n}gC6g{AR~57 z$}H;TlE`rRnx-5MfcK2Mlk<@Ne^>LkvJJpnS~bRW`6+L>^LzxKkQhGRawmB<39ptR zwV{67Hb^aA}7`5+~zJ?BHn)d9gt{M(kb+7CnD7 zg5~ihIEK=vLv~ZM+MgZdGAg{0JMb9ZNrhd4cz8#M`hP(1&i=^rXL_s3pl$=eyVAGL zWf|!I6S?1o!Og+2j+odkLx8tLTkPms29weG_H* z4iaHm3|%?`S6vdCPNQURZ7RHxk2)~CAKbeufQL87E6XVa@7;HFD0u71G!6Cxyls|Q zsvJH-h8rG#aoPsze}68|TSfqH(Yrfds{_2N8|o{U^ZUR~ht@QZFXH1JtT&Q!y%mhN zME#bO9F~3Ki;wpWjdSY__cI^fk*JPaG~&yA;;5z_!+7@oGIGCNWlsa{u^+YxO@uQ% z^eaxXJl^8%S#;@`b+oKY%%9Sn(4xW{`AP}HyWGr!9}jQ4H)}bN)7$H>_fzohRG6Ij z4e&NfQQrLnyuEeWq>a}AG$*eAIwg$s-kzJA{gMQD+mysMZ6Nx<()Hy5tIy)&t+?(| zr(T#eNdom7bMIVMdITSDJ(s3+o(q`|@1>{?LmKgkXof6|Z(=-qUp-N<$*Guj?~U*+ zRiotU|AP8IDvd53N6*Bby>jty{g0(Lrv59a|4CFi2>DJE%RwjPG{o_8kmPc%ht(hl z9UWh8gItgv;J1iEI!L44Rh7R$fm9G5B%cSCSk+tdkB|vc>7|FQPJ$dXa{H5$v%e24 zA^XvXUl{)kQr2HOS994yk_hS-^YLTHqR;p_DEZlDUEd<+yMv^F>bOKBzCNDNXUhJJ z=b)@-vGQB#xnie&^Rsvq>-YZ&CiLmB8(AYcqmZ(L)T6>1`S2LS`$j&y7#`lc{EjWJ z0eBN^1$H2KKb9Br765q5ht0WIbDj*Z-N)~u3JN5vPw~wN-u9#H^ANmKb60tIf)}Lu zu6Sz|cH%Fw+Gn==S%)tm5mCR*E|xR*7vSSvbt&`dRT1X9|GyH|QAZ=bqY~-EmsT^r zgPeW&c<_)O?E>kbYwk&b64t*UZE%b}9W$T36{!iL>>yWC;f;JrkKuhZvRM=l?~jUO z1qj|bH+k(4yp10>=6?Y@$o>>nqb=#+^Omn}fmHzSo%JL22;Ld7RWAbp-h{HM-CqQK z-~sQc*6}oayuBRfdPpkEl6p|TI%Vgdd;Ib7Ze093_Hr5Xb&!ssI@)N&M=p_L&*<|?hd&y6(;Plp9<5@L=cW3&IYy@wC=hltyzk9<@ zna6*6p2o-fWud~EN+TJPJ?iJeZnn?W2_Ns+7eTkKGU4g%5UL}IMtsSKH*G)hUmS1E zb9ek54byH;+~O#+K4)~0o#k=2eWECv6J092ky$4g-UY4)h4Jtn%ADFNHmqT^jq!C|2!O>J%A;vc+ zv4eAEI(TT`-XcVj?PhXAtlyj>i>6ep#C?c%0bAqCoBiq++8>y zF9*GI-L~=p$U$tU2eu+htmKB_$eo}-5(p<9xB@6NIAZ_WEnyv9=1=D>& zYJ%#pq7mP)hnjgOk?|b#JkLedabqLRBX;TDXc3O*f-Jwp&MiGnmkznIG>)5p9!N8w z!W$W1hT)y)!Z8mIZ~x)~X9VwLwOk7XZno0hqFc)$C+BOSqe<>t_B2;O>PCys9cc>gf_6>#Pp8P3jaoA(po zeRQC@Z8^YOu%yf79oRvx_@rg9YMVDKa$h#D>a`PY*6Avmecq;0ktBfnIoB;L3@gRQ zd$mN*4!4ENnGWw>REG(T`0iA+f&uW1<2}#0r-$t$9oJg~+!x>e!TR+-!PS*M9db7p zpcka|sqjVyOk#Kk?@W}y!`n*e+;ht2MA6+6!Tarp+dS zF}T?7N8`bfhMtp_lhvT-WGmiIZ8%J{IFWLo?Y|Tj8>|Lz?dW-3n(&@I(4j4+p7RB zC;pxP_wO>BY5xRvkj7Lw2$>m;<)9=7c{#isbm4uXGm?Xj&3$N%Oe~TOtM0?|_0)aZn&>gg!U#arJ@2?{+TMg7EAASMcl=Zqa--*e3wd##T%o`bA^i1!vhq2m)fm4O4d zT>lr`L5k?7PY3jMp7Ngy(rc;kMuwnccvo_a%i`gkbbpyLg7=BMLdp`G-ks)n8sJ?L zp93Gm(#y3TYZ_{47Wftb@f|KSt6;$y|Ff~~5g z^{AiswL@y(Z1In`#ENaA3Pnjwhj%HeV?K@e8sX$RR~^RjE;w+Ob8;3P4N{-*pR-Le zSpSH9^(ne^Ea!0VUz|nhAg!Uo8=2~l;e9WwOa>3{lTRNEAO%vP^=V3hl-7R`4g`1y zy}tRq84O74kWKI0`T$ICc|WfKIlZ-$KlM@y;C;$%v(WuoAK1=qru0Hv{OoEb)bFgnz|5a|_;@$%tITz-V?MkuqdK0@h>x_QtvTo@<9LTWu6?FrO8a#>0E_;u~iWyn{Q9DaTv4<_smf z1HAXE{(Sp1o(w;G{i%*r6ATl(pZXwp|GMW8zX0H^o)((1w$uk+wdBE-edhRhmkZUZ zEl2&{4{);mP{+r6pkzhu%dgCbcNMDREsgkMIWAalzQ;J;^6~`!Eputt|Af9e znI z-WN9D9V(I5!5?qAQsB8)UcM?x7xnvf(qeS^eEjj2)^=|Qyi?4#_tr;s*wKiuGj5gN z4L`>5z8lv&c1*Pa_Z0kJH6KZ#+&C$W^*1M>@^tA?=o^$+18#5qt^fZ;0Q3F<;8u8UHH%|#Y&v*`k!qQ8vWN2TI4s<9|Iv1C~@;PWY@*G_{goezf z??h29NSjjOjXb4>;e9*dg90Aj5uxJQ2;NfcsgxaLm;CNsVgT>*()Q&i!SU9^YZe8w zii6?stz)&i0PoVx9pB#oyi>wz1H!*}!+nQmt{Dl!$9tB;?ro3etB{_eetGbzb@6ui zc&py^PPp#De0YnZIy7m-_dUbx!Q6Tw+DqmCNR*Y+$}75_(=Lz*`EREsdDB@Q?|?nc zbmy`Bnh31i1F+l%hi3CbCPy}q;%hDP0$rymM@U9 zk7?7T<3O7cTlAmlEhbcWBadBTc!!z#%j4mFr9pN+a(b)u;soXN_D#^@j$u&$|8h&} zZ8}MYgS*|OIqreaTcQgMk?SqSUoVXR0C-2Pv|qfU&>Nm_^VWX;8hpG3_BVgL-L6a$ zMg3NKxW6!v#>ZRXwcUW}V&=npCaPmGjrin(x_34hGLCmqQSWwzi*z(d4OWbI1kPf4 zya`Hzbn5Upp!ui%Uq^*E@_H+V_l#p(7UJQ(#&6>;1n+r^6DYkmF(M?@0PwcS(Mv1| zB*UMc3~hW_8Vp~~d+V+P@c!XHCd>_vw-&?^-FUBg!=7?d<(&N1ucLz7y9G^SA#0AA4EmG{FwioGJ$)?^k0vXplp2DP9h0y6jwlro%_mKn_ZkzH#i#1XyCf25b=v z#m_;9H%z!sPAZVZQ9n14xWW#5{2X+(GTiiqoetAANROgA@@T}D*|Bn;{Vv9r*s)lb zlIgj$>wlR!zl9Sg?ODD+GWlg7LXQr%O|q_+|J?sKqrw|`kR8L@C-u219^O92rNJ)BxTqFYrzH0lYI_YpLzK=?&lM zs*=!Og^%~K0{u#=AZzp}*8d&q<3@g|slrc1|89kXRo*_8U9Oog`szd{R!_X35i#dvrxY;jqQ z;QjNwG-U^=HSL%e3-ET_0;zs-Cc}2hV$oILdW-mvh&T;^w<(Wtjs?JbKUWId&j@e$ z@*WArVF`S^kJ>n>a@#1AE}(wW9Y4mQar_&k!~A#J{EL|H^Oj?%j*m3rTcfF)<=4tM z-cvSWb02-Ay@MPa-BUh1GRX3H>n4QKrDNJix_fgR1@BE%c*_r)I%0TxRUTKt!~5a# zVF>U+?tK!aR0ih%!AHV8OUl7`%Y~ZaNdKQa^Zb-5z*}`Z?wN?M zH<<2X_%4APA8(nNAtWg?6%q;cd#>RmzIp&3Z?EOWD;{MrUx6f#>hPlx-~QTRp>iR{ zHz)mrO&<=#(oz3c#>8BnH^K6F6E>fwPexhjC;t;xWHB}n~$?)m2y2;kky{kCsJ z-Uo)xi)@Lyi;uT=u+@UTUKP@hls|qw)*^1+iTIlnx&5!!>#D6}y1lnQszZ@Rd|zeC zAEZBGJbQoaG*x}wMaTTVih_Vk`&hsJC#2k_OGgNSD?1_nZ~f1l1^@qu3e^AGsB+L! zXB~bl2OW$4sfCw=Y_8SiAxkXpwTF}f$zq55LuACRs!5qs`yMhpdYk*_doV#NqI}cE zB_IcRxST#14RX+;m*WS*)6(sNM3W4 zm;JMYw4lO!iD_LFhW82CmzsEZ|M0$%kKld%LNf*LiMy*5KLWgU8dRO50N!3pf1l_B z<1OE`<#-@?r+U8|hy!@@$_t*{?B@+fY}s1Q$&0_lM$Ug6})@lHC-+`<>DQ&qRRtmPGZJF=Al;|G?zVUpe@Aw{awmJj`B5szCkDl-NpUh2ZZX zi%X70r^++m7o<;79c47)+ghBo!y%P%yrumwzYo7b`}CF|bRg`U-w&3@o1kw&myWA- z#ivY8QSjbEg}2HRmunc_^_|Y@czBCE8@h$yy~6A{1#cs%>@#8j?sAF=t_^IUdF#t2S8kI@x z`n|3DJ*(UtA8)TqY3GL|m~XtrZB&OJjrg?3lM?EZ7|-4T>zZ9Ib<$D)Pe>RG+FPy2f*A8RI!f z=yh;{02l27>Cu>raGAaU%kLnK68-4X@iNxC%Vj@h2f3XJZ>?q9E3qZEPpw545AS6? ziq8?e&ChsH@E$AJom&9#t`@Ey={`V)<7dQqJ^|w`A+w=i1n;A>Y@jTF_YvWO`T$TM zy?f1FEqE0l?@Kx>EDyNKlHQO z<9HizpCu+%)6qeSUo4$z^S|JDYd(oS9T7bbjQ@0ytf}zU`1SNAhPURq*yVV5H=LYk zM)1B^p-;h^aEbHv34r%TSH9vwCo=4wc{U>i3`jG4wC5Fqx3Ic#MJmAChS@oxRDcu5|--tqzUdpfc+{NPUf&B^R_A&0A&@b#9*s16Al@kJh}TC>uL zalF&d4|)m7(2>2XCfe9sBUv7Ag83AEI#NV7DE-OamQ;AF#WwuwapIzAg+dVXXH?K7C@-igfV)-=dHgf;#x)E$Wg_wMh!ekt9&RZ2immOT_WVTSSxhN5>^G zU+=96)p3SKe9qU5cG@js9B&7$V>>Q1)9$?mOh&k`cg|SGq!l3jVa>{0Y7gY{gX;-9))&E>MmPEW9w958PKJo_1r0wKxkA z3E8QHM1xYP45eY01`R@zgpd?XNRkE`Wr#`&NtB3+QlUX<@>|dL?DN{MdwDtn@YW6M`#|PhJsY$Djko`T-0$%Ff6F&~BEA17 z*pdAq3GgOVwKXt+7o>OhIITVfR&R~;$~lw(?}LXd@;(6GCCZ!1WQ&N8CAJp*h~4kT{$$`e)E!u~wC3{=7Y$qwBr5 zP_h5d@IupASdad9kXFB>Dvs&Y=}Su(65;H?J~_G{<{dZO zMS8vUgze|p8o>ME-mx>9?gYqQ@W7=$aR1-QX#HKvfcKb(LS_Tto$3=<_x=D8D%7_s zZ&--V`>25_*X{S>cyc?=?RA#l`q3vRWm1-3wh(FWfwbdD92FS-V>l50JJw|WygTl< z4rFLxZ%*V~Uvxk^jEnAh$2f6N702rj&tIQCL7JR6QSjC}9h^$$o#JzX0gd-UhtLst zd28(C3)1pdpZr3%-*EO`>%4c`j{y0sOAHVMyxmjJK3f5Jvu~(-a~trUV2cc>i6%nZ z1(RDR1<`pA-H~GGb(X+8A?@N-@wfI&qVrx?Aj%RmNqfA%A#vDX^zU||ice!17o{$sU9gMSZ(SPzOEWb7(PB6<_uXTVgGS%gdcyU8f|Z<`7|1~*XJ*VhL4nj>`z%=sd?1|@s8=Haa**Fs z|LQPM|1a5AcBl4CDCEMh+i+MN{SML?+e!`ni3NCPq+Q?8l~#Wt^gBoecCyxLk6RNGijbLCdB5SgPOA+9rN?2Vg{Katm}R(kp2rKaS^KG2(I3lv*QYBh;^sn zZ6wHkk<7bGNnjBg@BAOH(qP^Xx0UaLdGD4mXORWG1%z!RV{HkLwu-?*eK5qbMzfuf z0=#qWOhTOi?=NxJGTnkhA-AQ!wVv>!^EU9V3fi5v5KnGrd_1-1&@c1?$^F-OiT<1r z&G9xy;y8fOKOxq_>BDvN=iQkWx}kqb1Lm^W!6d1SI}SZ`&wE@%nyNUazK?~;*`0z5 zq@5JJp}|2FGVk@tpV`rPXWmfX1oK`bbKV2yy}fH`r3&D^(XlA+#0CPSY<4~%4%GiW z#@eAWfcK&HeX<6CwyVPYBOP-9O z^L}P-{p8h<1kLegSoSB5*BJdX;|>t^dOd&MrL5jT(x-tRn(b7@ z0r3OC*s?5;MGYHmb`H_5)>$pre| z8}0;trP%kD)a_XxeJj4bNi=BUf52Sx?`LX!+J_00XZa(@8%pmte3|Y&;5ZlWW zG;sqAv9f8e9%XL}g??O9)3`Q)K7%}1D(aHFyrXIaX=k<1-e{r|eTe1JyXna9GGOqZ z1N`6pC%#A=r*;3ne^ItO!-c_YQ%WLx4`-THCZwD zZh`v$TvJ>G%sV|Gb;B*ddnhC6tA%kWB!X9ny3mQvdp|>~-`Iji19H1uRaUcAwdlMX zhHULeliybT?_&PXzj_K1$D`rD?;p#X+zHwB^XEOOxN5``!X9EDMc+$s^Ngf>-fsT2 zRK+3jGk_?2p2XXWg16bY&0#Wc&vRqkXuK;}M{Ydt}X_=PqbOD$kYpk!dg5Fs$QY3F%l%mBppCg6%-bXPg6SQ=dyUKbm3_Qn(B@blZuwj2^}p(rt+ANRxBd`aKImmA^ugg+jr_j9;jR5nw#fIl z!F!~gR#@Jc?iO_3&t90G*jmCxd%Tf2zG3vwp=RO0p`Y{Tz5A%=)%qUn&55i#YZZ0C z^T+>r`b1y2>N2BcMRm9o>S+| zjbDU7K6~#GC*9E3AcNe3OP34_R+HN?mhdkugwWR@pMU$NWoa*ur?ubmKqQU^jQ)jq z#C-Hontu+mk$f=nW{`?ANIOSpdHpcb5k9 zQZ(N0Jl?-)1iT-5h=#ztdn>~?tOUFRFRXA8x=DbhcVFhp2fVWy*iB&G-nDb7Nr3k& zrfa_zZ6-oY$IE_C4WjebUpH=pH{h=(w^QL6bZ2;q&inY;p9ynyk~GJg97h~R|DGM) z7}Rxp{!8o&--ep$ms2r=4Au{97Y5pW`il6uj3y{}n~%?a9!x z7>&1v7tzg}fcJXo=mRkCRYX=9Zos?kT>rdCEGDeNRg>FE`s}_xdky{e)>y{OP@xQNn&Zum#Nmz6 zzn%K)%nT09KYK^YnU|^iVlQv$ho@fmO+7^Syd|`$i-Wy)N0bz}APvmDeJFUZIcBC! z<~`&Q#*fB(j_12R%zNy6*nXJz*P~6541jm*x-HHOF$AbSV0N<_INowetyl);9b$eZ zE(`G9Q+B2HNOuUNx%fezuRnVBZXC!6+j8oAl?Ku-V3qnMrw!=YyQ^&AWV1Yu=6F9r z;;6;w-`7r$hl8^7&)zq)hF899e1MuJ{;EY5OdiVSiJ*JlxXV<=p}qgjvVYG1|Mj1r zrvC!upaT>+$PSWjAm^aWMAhYJIjC|?%o=!uly%uv(*D0jc-fwCut6I9mME-plmJCV zFIC}bjfKuO1lq#i|4VuIUtt0{=)k#w-;JO^I;d84sb>g12lZ}TFg_b6R2_k|V=LW$ zZ&4F^4iXC*y?$qa_UiwSNF2f#{d+rX9ishTxFFpNRUET745~xA-G| ztZEDT25ELO;Y;}iWttme$B{TLVf63xqZez>a?O8;Re$NC_Gyrc1JV<2Kbm{~4}AZx z<3&{*Rx^8fh{dECq(233oBN4gWZs(+9*Cgv_W5!p1D-)zNlOI4yrn)q7OMfgm+u<% zVM`-G0j49;-OaI3AN!^RX}~*NTyBLK;C&{xf5Y8-MCdN=Vx;wEbl#U8nwxrA#H-2e z4qt7kVAe(FeI!EtO7ohPG{-v=iQ^DP|MF%M69en#&l@)#9xtbfy}V_`d@|+rUO~E_ zL2~t;rz#Gm=AeSqC{q2upMp0be-#&*_YJQr!f3n;#p8Fv%Uf2hhNR`K@zzIE-vMvI zMbfw*xdcemS?{zEc${e9qT?A!zxqvQauUpOn4#QSjd2bpI}ycgd8K5E^f`*6pOdHyNpddF{RNd^m9QZUqrq zxn#6l)E1rhxks7tVP2xu71I!ED8>}22Rkj@~rFx&_yf+1FU(s{RKC;>8X8+$6#77KAcsGEc9|MZQ= z=ThHkAY{MR6TfG+E_}+4q?(2Wc(#d>k;wb1ivAX8Z`+p%6 zyf=T{@Yffl+Ij<$XuL0&TZzI)?D|wbl6b#dJDC;)c*obKT0R3$?AGaWFXRTiMNK_T z;rsv29$Q#60(f^Ci*wrEB|@*wnYtSZ=)4OE$+i2mSgOhG-WJIxZBa+(O;DUYE>^IZ z=6Gi#aadyXPq@>m@LJmZdCNamKi*%3J;dTvXPt}2PSZVa+|&SdacnjjP4Fh&{})Wb z+u^=N3ORdoey))~<6XGP%L?Z0eEA&dfV5hV$dEta{Zu;Rd}=rW8v7}3F!m}In!LFy z0p=ZKoUwEm@E#S9yf&RggeKnk#0ATt^X{AsvX;x>tR}ac4(Y+Ou%YwDFXr9%vVR%P z@oq)pSdGy?*SVp`3U%|JL1swoRT<;QuK$lMcRVwOUrP4{Qn8>3RdF;3F*R-XCe{Bz z6udX3j-Mj)?jB1KN8`=ISQ!fQc39`S8(!YxW6D~%2k=(xOmwY?1h2O)b<=7EytkBo zA>H0ua;0EXKj6(iE+nlKPK4f?dB>>! zBxsIzCK5+7M*j}4E9W`$dH(f(MnvS-r*E*ccck+3#5SwNbk94o_BK^Qn!B-58_hpw3($`x|8FG=aaVDvlqehdRo@H%NeYI0f(RL$X0+-U5dG@@TweLc$YZ-tQ{%Ni#^o+mp5V zfcN$uF9D$w1nA?J&#Vq_V`~L?icsrH58jyJ(^eB@<<9)I(XCus8th9zy|982R zif01er9ruZ_#@y8Qi7hJ#+z8^*3G7Fxc*Q5$}Z9ecyD*rKlEiqD73(UZ>P=^^z2^M}Jw#9V!(H9XI{mbhHYc zx2BDI|ChZVs}hiQ8{bBY-OWVj9r<8E$eW2DG?%^kkT~2i`nS4ny4Z3dANE1#|1i@{ z#I=7ntitA<(B1PsWAj0}=PfJQM^zm0IWgryF{H^!C!7-gp&z88qITJ`^^= zdv87;(@A%4Z(6s!ISlZAs(=5|WC#J8d6ck22W(DQ3%XUndv64m>X2!`+rzNJpaSp~ z@a9Wz{2ShW*9+uKH;z`3+daASu4LwKc=JAy`K;N_NOSeS6A}j#M*q5Y;F>kH=AXS| zY@Ssvx{tm0hO>WkMCrnEx}TijT#KoSBjo6L?<3j&)c^k>8`9?A#yTb}pvXZU+_HbY zAaz`jQxz=-S+0C}0v=-ROR7l)lDmO~RvXAco3;wdYl1b%vm4i6T=gy%l2A7rgmcil z@K)(jkb`<$4wbiT358yKF@CH(jy}Zx-gs*#>#jQ!2 z8)AEqI0zX1lU{bKLfU)&IjBx{yX-+`>@P@hi#K!c%!sG|9AxiIRUBFAnuZ@P!!yVP zCJNp=Csh8rAboB9M-?>Qr<M6P|X=1yb{$L8h1O+8WK?h&l5-^uzaxPZAT|&mgat`BN3g*`R>b zyK(RgGJ%nTx7({xb@B{SuOW8@8t=|mFDqf*y*~p;yoF?BMVkO`@l~D#fdm31U$;x( zQD-cqFlx3EUf$|+y%pF6cr)|_oY!Uug-qA^NbEh2&U^B6c49^RP?ZtV&fnXNvG^c5 zZ!7=I@Ra5mn&aJp#G#7Ozfk|qix1Y#KYO2Ery3iahg~4yikA7U31p{x-nfG0RK z=)C3uW{`k40|jqaqTm>r_fnT&Wi;Nm?gqEPyx&Z8l6V)Md*oXOc!yt;$}2fZfTA6_ zk`Dsjv5$n_z`P4~OkI2lcuVU%2o0SeLLm%R^+8GKyuB*+)fy&$tqMfiSyTn6MERrh zHqJHnO6-}UIo?)C910lyyKmz!QO!R8?5&x+@l>Hsp_?Dvk(^ z_UHFW^?w46g15`s8_UVOjXErp(0D5_r;Wh8O;k6KE+@`+lQyjaycM^|JNc&)p!Fh- z9ddxTI&XhG{CewYt1n(p0B;eOPZ`F5_mFF|KJ+)d&-ztr$=&Fw8bI2))LoKX`!~D= zZ}L{(mLH=z-UpC4ei!_G|Mn{@=Ju|hfA*GN{IV&m7JKgv7rN_Pm-7PppL_3grYepl z+1sLjUHqs1r_F-@KlBO=vFsE%$cO#+Ul*i{STL_f%RvEe)=0sh*o|zq2!xN=`KOE} zRf8PVwrJ%Gg#ZF{Q|WVc+k5cDj@Eb${DPE%%Bm?D@QK|@m5`-!TZvHh4w-(tZ|L9u zZxS`BJY~&ReFtgB>dGOo>lyk6>FcfBQYPg~X>JXYfW*;)(Laq(sayTk=bwWXM8>sx z`%!Vlj_C&VB@VuHpM#Pi0#$Le%e`E1;WTLm$wtB3yI*QAd58^n`KXD;o3}#j1pI-t z(}#Y4nD4 zX1Ws^(RqJ7{oXg|7p{60(r(4xoOiWX(Ro8zjt`HX{pAYahR2#Y#Sw)0q zR^Sf_*rOLn<-%uTV~R(rCXjZ`EHY0ntwt}9?vDD43>wnj4$=)Ij(m*%Eo&}a@OI_= zc~6rdu=IdZQ$8t+HS z9R@IO-qnXmmlLVW{!D2GyxX@_KuqB4t#@V>pA-OZZ%M~1@cVxqGMdj>0dIzfPj_A^ zBSOUeO)K~|pz}WOuF8kE{8)7WY3C^2kQ<_k&RhS>s=O<$w735sfy5z&(LYvsdy$<1 z^XKgu8izMA!aluqJe6;8t%)<;^A_!+E)E0kzKK_VCMV1kymuKsE+zBcl#EwH;~f&u z9R}C`0*!v8y*HuWQU5o9_tAj3%~=rysH{4z&=qV>7?s6tg!kSY^P(7LLH!@6qxAe{ zJrS~grn4>41)X>Jo-@_P$9t>RAno2d9o^?`g3h}p*()iGd7S3ze>WtKY>fVi6ngCH zub4k?J^YX0f`!;~Z=A_fv4agi>Hm2Pqh{*j;Ai?G`_KJ<|Dn*P(Z2=tKNm#~+8>qE z3Fjag@ctiu?^YaI4oYlM{Q%ehJVG|43(_C1W0Bi~q#yL74Aa?^vt)en(&9bNGshQ!f% z4?DK?ZRk{>Io`!c90M5rJD+gQo~S$jA$He$mi>oUVDskbcF^xI@1=X*c1Ng-V?>jC z$m}GkK;od_y(cqxoIHcvUVL5$jkjZ~>l2ta)5pPJczJ98OMzG4zzp&ZacF%6xc`sm z?OCTgU$Z$-&)fh4V+8=?l$U4O&TZclCQHS>3>PP2oyEaFu{Fp#>Fw!oEsmt@# zGxY53vuXF;axQ6_<4r)~@WSYy_!gqeSMB-p7WgrHJb{|mTP}Nvh^*a5_w_$6iMluz z_|1M?{O5SfLJHo#>Wu5jysLMv&_d%Kdc7nc=3UnmOyYe;(}ceQ@SfWs!=k&N03D1e z!5Myth3egel;FKLE@{(ED*9gL`Wz2%|Z=67;Q0d$|e8>F^S z6^EXXM9(pBIFS>Syvz*QI8KR$#;k4&V!&Vi^9QZ{4uJZfpCShZ4R0Z>LBjR_k%e|F zXgR3r8Q}|@gYGtZk_se6|Ck^rP#_5(NSDKd2h!9D`uW}96Fbgz6(!3+4oZAnr&tSe zQ2vL|aGkyoU?Y5ERxtVoX@YCi#Mni#YBr>umd5#Ijdti8r0SJU;zC_2G?#;pB5|l- z^snoS{n*0f`Pcu}yZ!jiQgOu&?sN(Fw&wzLpMxT!3#f{t!_@us)*MoS#7Dt9u;QF7 zd3np-QIZ*rw`*56iFdVw4~h4eVvck6fOk)-FaNzF0<>I}C3eo9mQT^x49E_w2I>p-Sgfz9ZFRkFV=quJxaPkDuI`R_kk44 zBr@*{KgOBRc<=UN?1!^=0^?p1Z|;Jqw`&3KB~F2hYQgKRs}qjb^a9?KdMj+DK=!t? zFT1`G@SbML9BVxq0$K1K+=3H9=dG_#Y_wApt2Rd3t#~Bx>fIRn18G@XWZKkyX^*!S z5=RC`|H3YZ^$W1gzd&;CI}jyE&Fd|DMXR=19H)EUxWpyY#lge;di9_BpNE2XfPG*d znRnyk3Pv>Ew!};lZ^idN9v|JZ}s5#;*6$hj(lpI{A>Hm2P+(&7u;_#FujEEGGCMVn!y#3V} z+sVB7B~LJ*@g8gw8Gy65*{5I_5Jl&iov_`agH_{G&KylZH1a#haM;DfEI7@r? z|5qY$lwkBP-Oqj3*~9bC-W-0ceM%bGUvKRlWEMVlFrMz0x03G93Q-fsmiA>4$0Gl! z|7oq%|Nr&})c=AMIVgN77^aZ@|E#US9B4UcEM^JEGmwKe*oq&5caR=LJ-ZwQ)*ubf zg=d@GB|ww$kr8+LzztFwn$3$r4mx@${HFYZXVA`mKA-Q8L!hVimlizPf}VrI7LLjr zUze?}L)vizIG8c|H=X9uc&TXqysgbz(#7(y z4@l!eWhGrA66wD{icF^}4%<;C-X-qQFz+Q4yhD>ZNyl5@)!Xlzzq6z9c0Yc4Jk*DO;G=vhs!xje2j(k7ezY@0^ZKOsbLI&w~>n7FL5w~T=Dqz z#i0Up-s009O|vf~s}+!T9wB=fLjGn3`CLCgyUxOP^m zq;_`*bTdif`7wWV-tUzglLV8+s;?pKY*w)(r*1&!ZU55{ANPXxR&U91*kJVUThdn( zf2a9pZ_{OFN7jg9*Z;|@e@CeM9-w>Pi5IdXsflCTME*wKBmdO@|KEC>*8U+FVnr!( zP;~D=4><=V1ex=p_6H5aI0BTcdhGUiZ!GjY zqss#xV)=_MiVlMuWN4AS@Wq2rDC&1-fQqXR>cw7B{JLwlw<=VJBJC1*C1ej-Iia@S z_40z6wU!Re4Y83(9G)2cv(G-4miKo4L+nFS+wWq#8&H2=$lNaUT+a6VLjPxw?kdJm z702H0+_<@T(gkVDD0m-wmP0y03eO-vTvO*oDqJ;2pnD<_RNb_{STlVVO zt%2Zq3y4RRTNx~GX&D(C!Ud9T-^H&uP#^{F#>ID@4~5#Qinpt3qw_uyd)uk`m}2#F zq@7M5_gJ79I`7qGD-vA>Xpc8J4y^tSU#k=-`!C!eWtn+Cq==d;c6@e))>ix<_`IbU zqAHHbz{$ReO41IJ2nFw`kP_1KmZbV$sht~*cjo0TZ158xd-$;t&UZ>0=)`U(Kv;F{+^kCUO0)Jfh22UO5`H)pSGl_*lI7Dd{{ zuibYja4|Y>?^it*joi94m%YhxcwzMK%7C&;(bM^7Z`+>uSM3AX8>AeWpEEl0`su#@ zmrO6FDvn%(H@sV-NZDJMf_Ef7r;t23`S3c63yt@Mh>fJp37It#^V*z{F6LElJRJ%h zGd~{Dua3?;RCV9aM?Vy*V~}?5US&+p2%+U60eZ5w-5#I2=U^-zP;U9>CcJAyWUfm z#M`THetU0)=Qzc2H;52}8ARA)ihlloxb#?zMv#2jZ%=U@K^`W|J7OT<2$nBvL*NWJ3=-Sg&%@S-Y?BF|RE!SH|X z|0CC4H2r5#|4UNjpd-)6{#s(+Dy1ffmV=Dg9v*`0|J9?-q%}xYQ?6K3FoP6KNtokx zCP0anKfD75W1(+Rr9PZs28nliv8E8rAm8(zmEIH<3h@L@E?X{yKEyUY@|YUJ$yBo; z?ab4czN!C>o`Xs!Z!b29qP-2$dL)iJ82w9PyZi7v*Zhar?uucTU~TLnHqB{??lQ&g zcWBxo6`gxn5JXiRHJVXBPrHzYSP2T=@maew$umd;i-k+kcw7CLafNw%Cafj#&T>;} z*a3K(<~vV%?Ib|jyiM{61F_Kk{@_twz&mpB!&DEz+l#?Y<-)E|s7ut&=q7)`rUgytyt7-_ z)lS>UR_7t@ggz}+V7!A~AU*iWF8{fH70t~cvyeC*V)W0l;W3BKvibAgrpb`|n-P2U z7H2Bj%wW_*|GWc}sfwe;dN%jSp9|8&D0s&ihLEnefS0$zTdoM8@wPtNC$Drtc^|9aHM^Ua_6j5cB#s1({sr5#<9>XbKkvQI-PJV~ zHDYc~1RL*GzN9rw_XSeRB?GGBxGkV%I(Uqhti>3b=WHNPe%((7Yn*HaB9a#$A ziO0mgk%!oY0Y8?Z@s3&-yA9^uS7%K+Anjih?{O0Fe%M!>UaPkOn%#G~J`eB?VhFQf z0K5Y~K&ruj_gt=WcM*JfYoYDT1;Wunpkr#a}n6CJ0{ocf_b zb3<%55=Syd|EAK{?ESJ~{zI(USB4w2N3jc}^wUGzf;{Hvp7(VQ>f$i>U*PKS=lwq! z3f{+eA8I7?W(#~Gg2vnF_cA4zchGPQ>3EB;gZ`1*fOi&C{a%@@4N&Rn72XbjcVyx9 z{fvOO$o<3VI{|OE-KRpVOo`A}!7l+<-=Lo$ZGE1q-6JMl{RwFocfkBw=^gYFq|kBA z=!9(A2G-Fzj^)L z{V?tEE<)nCiP68;H9Lhl9?qY4dr98#+GkX}-Xbd>XxsIP?s?2*Qmoc)1Kp?09$m{CR)dQMeOg#r}E=S5mw=nr*!7f4|uKZ}xz@pQ<EKA{}6kKovJuI@O{%C{=6WiM8P{H;mkWS?{_vsl4!gW?ME-byjQKz zCk?TUvRh8J0N#0R5^j96R?wy>8*Y5{NIkhEgAk3{JE^%u2E z!_av@-}J~+S5CTm0BNT=^3(d*4s_n#-#MmF<Q~mrged z;-lh<9Vxe&c84=ecmHQ{=D+V(sY}JZp(c)7N@jg;LrFVGiWIz0ZBl3>^IjBuR|1W< zOJmM=nD-#_8B&21^hERODBx|l&V1Bqb}h8*)_Nxuz}r2z;x5d4fs^3Z62SXcdWY2l z@cy46OYrSGfAjv|8zu)W(bY25dPqCh&y%Ba+UUHyR1}3Li)n8L*@ndN38R0fM5DSN zo6kRcZ!R=HyzMvk>8;2lMGwJEY;?~X_fmnXINGmnt?5l8o!(NQ;GMj(`mgii@j*Tg!Eo)?q8PL>)rZ-F0=PTiQ=N%y?tCmvE2N6S!l`>sFd|K%xopJY(~LC)TZ z3tYv}cLCD90M5r zlZrEwk7}KN_HO9T`nZsq*IO=gn;gsgKT!W$3Q!k^|MDnhu)Oup{r~^IiQ>QPCxiN5 zjUoqKDDnU64$`;RmMWsyE=d;|0yD@DgFT}A7a2qEn=P|> zMq?q-p)&<+U=8w_N!(!;kb~}g63Jj$L4=rj+XU|1N8dr(d(KQwQ~`%)K-$@aw%ld9 zjJ|^;w=|U@B8t2EU-tX*FZw|T$Z=rwZ-@Gh#6Z{i7f4T(JNIvTfIYQh);?*+0(eVRp5a~rc)Rj1wQ1}PfwB_TF&BoQ^Oj<|S&%#Oy($A~ zcU$-KE*S@O-tS|6Z@-&@qq+TmQ6vtQ*uU@J%fRks+R5`DVjntPb-A$&`-q)%xM6wfA-FP_4RYmIQH?D zFZ^LLBR8Yzo_A7I2vu>Y=BN}_og(pGLBad1fa47^Z}t}+GHASg-dN{10N#D9)&VeY z&&gM!cL47@yfH8NcUnM1e|fdrp#FciSnDjjyjAMeE^!_3KH0V8IT7$a{mX*I{BL+4 z+u#w56OyP-M%r!TJlJ~fZ+IU$DG7<(qP^=ak0Nm-V)So)iX^_tV*b2?YE*wjoTK9I zZGV-0r5TZQ&l@*KWgKc#8Y=(P|No*2^56VpK>fd(A_ryW5=d{5!sq`}ZnCSQ3-afmgB}JrIc>UvUH?axu&Np|nbLjzAIZc?RUCUN8nv#ckcQY*6udJ63&Y4m zY?{a$6*S&?XO^hJ%Ui6811>P{tqDIDj|1M3OeO7|KDv-wfq)FhbS%_Rb)yxo|ECto z_DX;uR{caIugd3%ZzFYWJ;!tX)aovUm0?2tj{?NDu|w$@pL=6HJ{ zacsospN{(jZsyPP=bbf?fA?H2_6)L1wTlODTS)i3htoe&701@6GdG2^NW3*Ecwbt} z_t*V@ToyN0pz-c}yHOkF{Y;aMw0awSEw%~X|Nri2w9$R7K6K@3*4M~i;Cc(8JS$ef z`+@rLabdvw!IzDPH=YcEaAQ-01Sxdhg70o7E=rfc&yN0S7j&TR>eD&&_y0tn$Gy!| zRiioH0+SOB z3f}4bI=tlUogNmTjK(|3jTwS@59LUac)t$uRUQGnwc}o<<)G&AuJ`322c^Xy*MJKoqYd)IJHQ#F zFLNh*k7%hwMOg}8xaVRawU%4k>_85x3Fq+=!99cG4F#|3n1({n7o^_2^#T11Qcjc6 z`Xd9;_!gv{{qE1K@9NOcAl>A5R3`2}MRPeQ4~YY-fBs5uuSqrYK`EtO*YS>)r;krTrcIuyQKZzRWr78d@24K_WnO^orI))MGf8a#vRqA zDvp5V#+QEGB-Q^q6uh&IN6pE+qXV)u(0E%KRaV~vyx+8*TT9}dplqW9cn7~*k!<%% z6Vf`S$FdFZ#&@%yS_OE&-gQG+7`!08cP{>>>mU*84%<`wIS!q-{;NA)`m?+6T}Zn{ zp-!|0#NJMj-%wR}*h49gtvuR=`T*Hb<>%5k{WRCbM+ zTlh3!wtw{H)*--PRP6+?Nk7~@uxF9;Rn)%I=er{wGpAH z$38qK_M-D%mLIE=F=&GiN7@~5*(Ypdht4~7wnm0M!iDB|ljAsx(LaTaUnG`}^FnhK zTi2u<%*Euo@Y8;o48WUV%Eb#$&Fd|$Rlcu^)aaf!?#mad;Gr z;T4(pTRuHCG~S_VdjsLUH^RB0?J#fh-rMBiY_*P8+7Qn75Vs59J$QTAV>#fx^YNLz z=fVAdg_Tu1R`n90j0IbsT#P{H9UHwQDEG4=J{@V7p417xYDDL4BB*t|F@ivIykn3! zj4}H6S>*fPUln}N6S?qb3tf+6@^-(`a9McNt!B-pCcDf@>~C*>Z@;~;qFa^jCnrbR z%czRO|4g&yj@WO)Q0tzHUiX3#KtS3zR> zA;Y1oy$3%xW9Fc+k3UTa${sa&`xtKQZ=vFfoqGFdw!QpxpM!7%o2ZN9YJ9K!pB*HK zf_J_f50N~?E_(P_7mYV0xqQP7!252^>@>{#=#ar#PB4Sqo9j0!%A^EwCA?3`To4Co zhFrR{51v61p9!eWH9>9_TGF@&M5v@_we=-O^dZ(Q3p%3t>N36@YtFYeyeTa1m z2+%QiFQPf#u1Fl)F!~qW(m&!`#S7gEKETlN^(iKAqQ0E`uicI{m4oS$+&tJz?2!?# zB}%tkp?}_zZ>fsIhT}+|*lp4b5>LVVy3W~AGVk$Mr*zPGhd*gQT?lwDY4K!-XOQxF zS0|+b?++cVdX-Eopte=gZ$B``L2qjuOuPZ_NrM!|8-RDbL(OgHt3>E(tKz8?BXr&w zR^VZ7V zsg1_F^FjX8+kkgfU-A-|H^Vcw923CXd0alCcjrn-p22;r85ak6UM=tR1iW1$+R`5Z z-iK@kW{tCnP+I8RjuQsxycs?Qa(vi(8h-(4Ct1?>I8Y3oH=q0PyOQr&G{>792Uh>2 zYQBAVvxX1y(CYiZXNJ8RyZO>%&m32L&CQAS35P}4r?+rv7mD^((?4$t(wmnT{fOmVsq%6$)P=C;MU%;EE-+Lx(nHuy7r)Rbq z?7cb4ZfkV`yq%738q)jS1kH9i8!m_ng=~96i7m^~@Bh>C5sJU>ort$V+HEFw@NQ;7 zzyI$_wE%}&@kN^Bt&PNi)xXF$W^RgIsRdHDx9aJy_ws!)#F;L=+!MxD9ep`JVEh zeZN5cFPb*3TuX#Zrvm*JZ$=+tt#|_anctP+Es%E01}tJ$>7Wm>p0kBGBb&!GmxId4zW9MNYlIoIzeUDqtR!^Qhq({kdnkGWHD8DbCL35caBQ6_$29Momc-J1n?uYAy1|8}Yg;!^C~xHOdrnNP|~JF1}bzQz^kYOGm; zw?x`Gc7=yu=R)V*A1d!!Q}&SNcwa~2!0O-rzI9S#v%HYAfK}*dEH>}$bH}bNm++{O zV3o))_=-Iw$By6jUQ*D76C2)LXODw|j6=lF1KvE9_eB$@o1k1C?t$Be zq0qqkE5QaG=)6~1`d#b1SA_qHv>WLX-`G@x&fBqQC@OU0eVXG1 z-gyKTi;d4Qv$rFYpw)4`jWu!|<#)BqunQ_2cYbrh9{Rr^4Og8+RUF%w&y?LfOj_PD zrr>>Z=<_l%@2|Oc7}0otcRj&>1@P9ATk-^Xq-LXk>i>U5b^h=F8KC~RqR2sa58fg@ zu>%)K!*9$v&~nhyn%hlLAP3#!?pp)rpi7&Qq->Mj4 zPy=$%K2t|78BqUQKQh{ICXNURXNs^X3Zv(s&&@K?Z8`VxVn{pXCH=FEztD5gq`zn8 zd)*f_mxIW0Okniy`J01Hwf?-2*A6AGExc`*L+mNyQ1PBzQ>gRM;k5iQ>>PCO*W{3u z;&bhPKd682uTWt!N>vFl7-sCt0G5WWlF@8 z{|b}$LF*TJbtg=rqWCnQ59g_<|9MW=HlBM=_q=g_S=7bB!SPA;PyKI6!MjXYV}#5* zWlt|V8t*K}%8{dh_jwJQJuvT|Mf!{G0^T3kOva)emO$CNO|p*y-fj-Vt`7n4gNqv+ zngQ>}#XBM-XNb@%N%Kt2Q|Q^d$?ZKu-2EDS2hxu7o3Fvr1Ly_P<6#$u5%y-9<4umE z4x@iBD_5P>2;_zCtu4=}&2Giy{q*BU@r|!7Ys@Pj?|n$k>n+haVNwF#I{)6>`akf~ zhqI`PL%vO;-8z?)y)7tsm-I<_lX(la6|$l6{`{yc>;&Lly0Rw<=KWf`dtU^cz3=y` zzw8i#BD-&nmjK>lA*)qj-VW}9sV@NUN|p}ibK^v4dK)utECHQ&^6U1^!opQ}oYS9n zr3W%Meepx*-4!^_czo|un&VB5;~hr-MouQGw;J<75*$y9D;4 z?})VPviEgdYlvPTZFF~w)Tnzyb2%smiDLss|6IeLW@SKpP;cG0(J70!m_zKk{$2ad zuo7wl)Q^a^Y{D*(B01Uk`L_$x{SrHFCo5HPjK;sb1yzt{kk%Bus}0Ra@BhKeTN7@J zc+q$>LbI#<0PjJeJHKGw+fF%uxDNB?`SH;3MIZj_Sp(^4z`Jv&Oll6`ZLfMVy9V%n zt9{wOwsG#D7i_0F-bP3qkr@3G z6A(Wv5y1zEy1TE~nfL~icirX#TMjeYLQbNYZ)eo+W48b4{rvbhk8rx@J;UBYRUCqh zH+x3^JdnPgf_Ifblma<>E5CZpjmA6EV!e((;60_G&jrsQ8^&U1o&esFQ#IqZ0h4&| zQx#sn0PkO%i&ho@-lbivYmESJ0t?UfP0B>5e}TMhVI?|mK{>lETBCLNA*9_c-qKLB zbLhOY+B{^c{n}`b_fjN|OpN}8&CRs&g75!#bDo)yZEMHmT9m?Tocwzu#F1mTFw+p5 zH?Amj1s~7h(r)`*xs>Zl==J~Mj%~T3Q>`?|8;`^hgVDbX*T!=HU%XJsxn;bU zlwM=<&bn?VXu@U&C9oW8eJp}q|7R^W%^lAlru*z2XQEG49LD|Mi?zT9(qQhrmV$Tr za$ct24&scHvaZ#}ORZTr*)o%aP>ZHcA)5Ahd~cDoh#zj?2Q&fAQ&u$t@A zOPb?Nj>80_e+lsp8%#BMp=;-N$l*(|_udGjdUv{5&7iQtY4e9~vFm?atMCR-hwb#g zIdOl^nwmJu!=Fpu`KSK>?^fpjGyguwL3R{5=n*kyoScK++|Uz5%|VZc8rFjx^Z?v< z4i`vu7wc88zy;FSZC`t{r8P%R$JgB%j)iQm2NB=`sg~8d={1-^PHiUO)?EvMgtOa9 zEmon=AaCxwu-3QkIbIxTr&BM;9LIw`gN)M(Xl&fkO>;S@5Q!reqkqOCVxnfOd{7jx z6GzUC_n1Sh-Dbu56+gDuB=y!B7hI+y2l=hLV|UAt?uXb&d26cT*i@9JSCUSu|7|IF zKh*F4>wxs;cGjh6yf1V|?Xv~Em&nQ_z`RE*O21x&XOKS@-`!)(U!!b0<8&W9Z~2w2 zTlx~DI7vvQLe1{}Wh#!hjNKg5 zx6h$_-dZt5RK;P-cF{Qg&jV>2DR@5+;))_?Z|Ajd7o+jka9samGvNL1d){T3cbbN; z?pZi{$BNxv$jw>9u={p?I=KIze_Q^7%YgT9b56abfcK}7GW_)Z5QxoHd)2mCFVz2x zOwZTbk7_2K9agPnq9ss{yE-aL&3ZDRZ0?> zH*QV302=R$zAN8s2fTy)+R9G~SQft8{k)-hxtHEiiBC?Yz4W!P$GC zPkWlt$Lgx`@CA>+=PexyyB_BQ-eUEF(OUrT0fA|^w>(71fidt=(j|1>gJQBK3W87Z z+mLoM<>iB4L(zFFnv1C|4eX#f-sCuBG5Tk8+JWf`7eC}#=_~s2DfZr*AM|2wR*6u< z^-|5+$r77)Z~h7c*CYINpS|NYP#1@xy#C4C(f{24M;B=f)c;#3a!})0g-LP_`YN$% zIa&^KU!p&|0^}euzt$0Zkb}lgvGA+`If%!^?$Oyz$~7HEUe)GJv5;}NiXJ?~awR_u zWdJkC9JQ`%EEyrtmp=aO6Y}Ue=*0D2hla0h_+g|Sp(EyrFe`cv61!~hV*9Q>n#)1t zII#Nn+|N#}WgQ<>em~EI?c+zxA@<^M(=I+4of>7%D^K3{Q89xYJg0qc2BP~Mgv&^! zE)J*UqwpJ~fcIt!-VM46#$?_LCYeOhc)wpCzIYYjy(O-T8y;fqRo?1v2E6ZeSveE; zE7W{9oEz+Y5euze^Qi~s{mrO6VFV1ZUCAefx5yKroh+a4))%Amo?3?I*!%hw-WzH6 zKAvgR;WRq$@+bM9O}F&Y9B*Q6!49^FduU3S+BYbYt=+ET}aUTWL~b(5mjI zmxsNBgqxZ1*Vy@#{&~+)7e|h7WA4;7(hSmpf_FXpmcMRqiS2$Ug2vn92LCBNzC@R*BqmwY7aLtC)g22RyE?Nm z7w}H`e)xV1;GHoW2>E;ofo3^2Ul$EP=l!Ibuh`(xOFT2@pLQ*_+hpF@p!0U{wGtPw z{X}!T>ybD%Vf4>}W4fhhAs_TAI_1V(!v{>RsrlmUe(o!3{FfN+WvRiwARSj36!bnt zm+pB}8%Of9WsETwNZH$-f_L2ocGCU-@ZrS7Fb^R#-uUVoSxdnC;dH+f%zJBM#{OKu z8z=A0CwWh}W(~e()8>I#$S!8X@f(158izuoE8tzx^{{`z_Yi1o+o1xJFm&G6{~vpA z8c5|9{{3&$ZJuRlphQxXnGAcGlOz&Rrie)9MpH5+DWQZSNi;|$QBqryRO}{cl4Puq zGSB_jcJ}@J_KW8}_kLbIdq4m4%K3J#7uUBwuC=bU*1gsVZ^yc)Z-|rBxTV%oi!VE2 z8&BS3_JHz2!O!c9Oli%6IuY!H=ML^H|DzRK8e7sFn8>%uy-AL9^`WJPF@$qg6 zRd}FmqQ&%+6QvPFx_mU$-HsQ7)%(Bm|4gs~02?G%ni}-l$-Mv_VsGfm$YIqW&h?7- zd0`FuJf7}N>HmG>Qk}G54RYTlxq4BkCg~y8_%pfY|4ob=j#4cZe1L*|y*1vjaF`ViZ&`^a3}Yz%^VUwbz5`YY?Gnh&~^nqHmyV zZiscE!TXhb*J2cJ6PA8iEWE*XZ#hwjcdBw<90l*N1OrcPi1*3RO@B9H{yo=jl3&$YJ8Z-$eK?Il2=USDB)!wet_CfWTC*VGTPnZv0M# zVdnz*E~dx(a?221KD6Ar7kWR*r7Ukb)8I{>Wz|RVjw*Y&1QT!PTYID+-bx)$aw&Kx zth!XD1M${bFnD2kuNukZFXzUhqIlq3_A~Yz#QWJ>vuDK+@A_K7m$EYlf$2VnF3uy^ zGsxs?}J`p!i<4kK_OsxNx4N}tHh|eEtelQ%~$EZH=@(WdXy<^2u5g=%OZ}`C> z`tct4{bX^iI{xyO^}dF_^q_Z4kGF^%eLnJvjJKI3%=Q1l}$7z^*W zIV!%3A>JzL;64TKc@?gKx)5)bP=2}FcB&-RiBb2|@^}y*J%39c#QRZI%tH@|cj+1) zwSdnDfsu7j>d+2syk&KOyQR)Yq6IZ>`OV0bt>)Mb(!&wy?4yO>84m9yR3CWxak7LK zE7b~v+(TV10qppAH+NTrv2IWSUyh}{+=?UQv?!B*>9&ZAd2wgsAO8*#?|MPmw zRvNq;a@%lXlZ|`p(8ucOG)l*&)9G_N^e(d>TyrVuI zY^5fSW%O9)`mk^?{e)yltX4PY8$rv#O2!MH@PBCmRiF;e~S2Ye+HbgL+nS9`UxT!+rqbo(VotuK z9;`tSZx0&0n`JhSqIk26b}h%kJA~syZXd+^@=mTE3f?Z7QZeMgkndl3`0JT{BgRtW!~@1` zHdkZgeakcTXII;AhQqs=>Z24VKRsZV!onvC@=X?%u)g??i??xy5c%~Id*CiPHP$jn z$Mcqf^9MC5wlF>3gsY3`^I^l8LOme8od)lwp-cTJ-d9s^Dq!LLwltw}7~=h`>I@fU z205$qjDraAzO4SYF)B%$ba8M0jG1RVSa9s8HsyIsi_-=duE7V=$Wq3gXJ3W^6ZzUM zJ7?_b&6@m;7F*;mtzzftTN@UB9%~J`(}F_5H;* zk9%6lUQcDpzfqY0~b zbdU76!hKq#=W-|WFDAg_Ez5joV<~zUXJaM{Cei zH7*sb8k8LWJEH;)u^jTp`6&&OnO#xpCRl?Cp2)5^!l6&9%)LFk>T?`W;C{7Kj?y6M zY0hx5lfl}&ug&Yd!$7jT4cGO4>;~!0^MlT7a=VBpsc}12UK%|76T3m0oca86h0F-U z)u2~Y9}_tFiSL$-=-(m&KCYKg_;alnw+5N%BpzB)Y74?xZNJ2S!asvVIMCuL{K}K* zXOM*ZAL;UO(tEH#?4S4lcGBS8vf$or6z{N+wpCbogBY%l)e!IRda>#hy!*xp<2DfQ z1Fp_*l#l9>q8>-c=KqKTZCgxBS3tZ!c1CSZVm0;stBb%PY z|GJatLygNl^ZQ&%AvWIqCWLnr4#NzGcQw@qUVaVSLMKj3iUKLKZ@2vB;p3exv%m6Q zwj1y>S>W?=DgFkjnvT?`{5@??q?A1{MKAY3f}FXd#9}--mkcg^c2T+NxN1zE1OQnfn7ph^0Xn|w*7uyH(ANR zhU6jK(0dSk+m-NFAs8F)vGW>ab)HUQ7d5V9OvyUM3mb3$!Bdx-T z7=LE2LGq%(`{TVeUs1e2UOA|Qh4-?_w-aw5-nCbnA}M$;R31KH1@X?@Q1V9EMwfI! ztw|_{KOUS_NlY|_c$dg>j5e^4!7Wwcq&=?=g5p~-!e{NV@xGxXlrd)7LA*(g)A#=+ z+V(FSq{9_<<33G;42O3y)dyaFxn~}%Z-mENPRDOk)YQSpJNCBr3|H^a!$yf9?r=7I zyz9jde!fJuX8QiW@XTJid@Q)~Wgh3HIlOn!;Qb+~=Pio&@UwL*vG88EYtN6*5bu)F zz4;Wp4~8R3ly7f;f49*LJF$jj)>s*g0B{90DX9L#MH0Xx{< z+aG(4zxNh>p!B(@^q+@9u5RHXm+AQSwn52=!@!E^@g^uK)90h+Ld~-O`hO;9{$Yx+ z|M#bpLF?H*qv-#et2$(-A#jc`#e7~ig#W9M-42zC&S2#PeHuj z<>#rJ0RZgCAUWTaFIdr_9zyEk}$A) zr}bl9O>DfI0}_ZH+&_rH)VNkz^++uvY`hm7&ffQC&p5;3{g&!uK2CnWL|g9I&5D3F zH*4F+y^Y+u_qhLTSsQCC?|L;eG zciY4PFBEUJ%jeax@V*tlgDVH(J?a>nN5PxJ^aDE|oIz@A4$0lNok-d`pgS-FZ}8n; z;B{^U;=R36X74IaGN?LzIx_NT7*PM3Hq9-Bjd!Z7wnfOg@5D9KIDuoxtMd}rc(eNQ za@@N&#&CG2P<^oA3USoQ^gKG8Y@*yr;p4Ipd-o7+=x1RZugyPNnVT~#l z-VG}rq?JItZ#QIrr{In5z3mz5;sIRxBzCD@G0NVX+V2{hg%IzxAII+|!M(Sd+Z7G- z^20#fp^~plR$y0e1#!E+)VgkBA~i1I%Y;nFzdUc@c8vTiz>x9qmZ$n~#mO&qe$A@U zRuN#cbJfwmr}6O)o9Yy}qp=;B&F;T+@Dv^W|6t<7!;#OKf9`D&PoIzOpQo4q*Z(t3 z{~tnAgMO&xK}8@az&l9P#hnOPHR!<^Rm2I_plj@35;wsbbmMm>zY82x5i4w!}~DR2VQ=Ti<+dyvqS)k z=1qyvu>oAXg$cub)|ih4)KRZ>T@S`@+VK77E^PM#O_xQu_aar}>AIj7UD|!Ez!S z;=qW)tMVfdZ;?o$t%(9;V5_6T@?&EdXiet3_U>OkZ!vX|_xL2)N9>@+?T$<@=Iq1X zLHg7lY&{S-#c(S+7_mShl??UJB4xquiGkHNH ziubxJdfHfcE15V(ABK2~`q-?d;9XY~Iqx0ZoM_j2aCeKRAxS~iy4`DE9O&(5xmW@5 zUgYkz*^ZYCWEcAw5Iw^{+IW6)Ko2(F4Q&Q*Q`3JE&rsuXgep8b#s^-86FHBmUl70_lcd4REnW?B7p zTUdh(bc*J#*jc{wZQg@C6Oy#3hOMJ)9I$Da+M6#mK(fn?z7@KN4E9Y5rEr9XfsKiO z{nia**P#B>=4X|j{3dRq#x;l@>sI@hH%PC({_P{~LLf2B-zzndKB^DA{B&AvcrQi> zgWuoUZ-lS^gWDht_)GC74IKoJ9!fVTPTyN1XeYQ3XaBNaLs$Y+dx7Z0ei$=HKL~d#vubfng*DUrB zo8xnKD0Jj6!_6Q?sXp-XQ~J0*mz^XG{9*^Jnq~3vPRW12?7Qwku=Ko1T!0Eb-dnd8 ziND>vhw1UI*mIdKA4jj>t9@EHhxc9@y!+lc?nLqCyTQVag}0mvtI!&V_pY{e9F+cF z5gB#a0P#*drWf0*Z$e7{%0K=B;{AP5z4S1|d&&3mFUpc+z^2`*AFdn*Bn09fpT3Tb z_o64dw(EWm5EoG6%q6%oa=u{W&68p7yIhI!@LoXmftO!ksFjI6y9l_OY`gS2J3ih? zwY_||wBRc^g10IPf6_67R5!HqMGi7O-h@tL`h1MlmQcPRg_Dy#G8$h4;so{XC`+?_t-&Y81R%W7yrcLA*!Xn?$7uCZxgs%_Nbfap2U}o%)inL1M4@ zo%~@Q87TR-tMa#pfzyvA>Qr}PZ%)WtonH1(d4QNjjdL%O>FUbB-kjLyPVihEILmO= zdnwfiUVe$|7Po(WDhyWCC4e2*@i!-~98f+qxHK5>ZdqbWxP`xZOIT3DyVhWW`SJFu zqsxbP4r#@@{JH8KN`v>$aEY^M^-dN#&Vq&anLfKa))4ROw|BWx@a{vT%K{+Y-M{W2 z0{4tb1@YTUydd7z^A@eufq2gxIucYTN(QUHylT(s3j=I%Ek7(nu<_0wIsJjd?-!Ai z8uwv&)g$8^Y`mqnDMSq3nqfG+GpRoC@@qLTIj)o`0{#jJOR)yv<84!4aA4K0AaJ1J z-G}hV=eToq$Dj5;-mUFr`n|WP`P=C7!D$>y{s3=p{jdLLv~Ki&lMftXBWP;Sh*8zt z8zht=Hl)sh532@sG^yg?G!b{KcaX@50)3 ze<*lw@NAJxf_NJm{_^G8xR%tkao^1cdU0SUNBGzhh&Q>sp8cvk8O$Qzj(LcMgE!*$ z*|f8;hgcq?4x+K!AhC%W=SS*#o;-w&cUr5agExG+n$iBPxT!u;aPqrsdCc*#h6uR* zc<2;2KR(_iV*Qh+l6=9qR+G*q2RdeuK1L~(e@-$z-UN3*myfE&NbZJ=5K4m-MvJ%B zB_kAXlTIfdEWE?khY1nj4DyQO+WC~_t=-|4R)Y}l&0!m+Pi;0QCC?+~XJ|mYJ-QOq zAl@f;vS{bZk%8wkp|8Fs;oyt3N@nsiY`k;HT)Vfg7$knB#;w%!@C;nyf?3r>pEbHU zS1=ylIaD9QIQiLg#I7}6Bnk>M_WwB3fZzY;%UQ`e?h6H}T~_x4NchiN%saOCRaJ(x z9;5yG|DWcwt2LM|ACAJkRzXweD0m;F!TZmV^))Eof{Nu_Sa{Eb#2E5Jyn7pN*--G_ zR`=K^3~rE`vPRzxT46?7^{Zh@MJWypE9=#7gLv;h;BkCv3A~(m#d+lX--BSXyT?Q; z5_@^;MoezJ%JDzM8ERbhk~6Cx*I+Mi6&|hO8I@){yi2G)3UKn{iPqj;e?S=AQ5?+g zX~f4no{INr<4wOlc;WB=zZx=6xVdkP>HB};X%o79{HXn0UYb1D{~w^i`?sg+-2MNQ zxpzi%JSP_3o43f_mV|h#Xn#LM!Tb9?lLzXs{};OOig(8|6Ovo@TXjXadfTG$@j@iT zn{eioe3J|ryxC$RJs|=&Cn7A~o1|jnEpRJPmT$!$A{RBT#^~5V;%jWYlX`Ur;LF<# zH#y;_`Z$V{pT>%voUPTuz(^^7vZw$b@4|x@oF5zv1tJkPMOW(RxSW`EyF}`Z2&V7< z37vHMC@(OV{BQsN|8#KtzY`z7?Klff4VscUIQKvrr3MwGn2TW5ph0Va)7N2xw3xl= z$wpX%9tv;`kCwnEcII!1>Xo%7Meu}VzS|fFID-n$J(e6G4a=U8xwaCX|4;A!CY=)j zCa>g|?O)-KIU~F)S1j6NHbR`B#?nC<@-orQ?N1i>*i@hOScq z@PPEGo&Hv2i1)(GBfT>#$UwRIb!%5l1X!mLFZ^5(8}Hq1XOjn-hKUx`I71|e_f{4* z-UZ2q8|17Q5AOh~j|({Y0ow-k0ufQrvMKUN?_zwsmn3nYRxREFj@gK`#K^zE{dKT7 zaNeeN13%OE|7pItboo$VF?+G{;N1EDLo|4g-~J+v;@yaR62!vW=h2mQPa)n*SZ7yL zmbYY09(IgCye$Sy){6{Vl8*8q%I7TOKv$Lj%C8Xb=chE5_9~LWOSaal#=9dxApbS9 zTjRSi|5?t-T-ep>GfWJi#<9-3&u1BijrWr+e-f{DurXZq&Y}9K!O5?O;M-kmDFWvA z-rVuvCmqXM-fVHlZf*g(=XpaHzM*4zYf-0TTR1n<<4t(nPL~h;%TGQBh0ireQ8aju zg;vF)c(dHUAb^E;Opm^L6T~~`^9C;p-uDfHgeZ7h-qTAl?6x3T4s6_~w>A!>3>8ZZ zK)iSPen0$uIT<`~wb*kkA_Be7qBFCM%wEx`SnTpZ-MD;!jRwCtk4VC;evn z$%*U9=XCj~ZZrB3l`~hpBWds+T_>N3;$6mdfFBF*P0G!Utq||Ow+N}Uc;{{s(>mX2 zL3+Slw$A|K9jUVS`8dQo1-TV%0rCFcejw{vMHpC_I>PC`27C3^BCS?HQ+J4n#&s_~ zXk(F!y*Z)&u_?^*A>-}6p*~b_@|&$ccVK?rv`0dVV@jAYf!g{nj}^Y605nhdnc?x9iyi&TEihWWM$o6Ww^xd z_NkpG)Yz8fn)tK*3S5Ic(0%0WdRT+T%km4N)XCti{D$`TDdFJ3s-lC&V%RgtbonU( z*%f2Nd(=4DbM>2Y>acf^O3h54yCx$HH-kJw^-+S8-!82K?Mruyf^tIltC6q6m@{jX zrO%DJ9xVNPfJJh7qhB-r0cnC-kBvfYKGP4e1Q9xYTu*wPy^FH{f1Klg@OJpyQu4o+ z*w-6zNMPY@8bHq63-MmNSihBmch4`8%qh4*+IMQ<)5`+3q-!%;?JMC9Qq6Scz9342 zG~FC4rAh|B)nfhMI);PWR|VA7TCj&$>x}O#z9pl?o76am4Zpi(;;`}dR{s##DaLqs zZ=(9}#L3SyT`MFp2R^audSZiL06yNqPu6Pgf3Xb==pWrYYlz<xOLj|r7$R8RMZX3@$v2~6yj`q zvJJ%45i`qqp5j(}LVnFrE%B91k2gVsJ|Dg_7iw-6Q2PJlY&3Y!oct||;>{6xRSXO7 zMOS4vr9!;9yZdb@c;D};F!6%GqnOR@2m9Qk|aN#h8Sml{`3G!~v*i;Xu&s{Ht{9^>J?fa-%4C%?ce z?PtyiiGaeMIval;e7qm`7Tf*sbpWQa=RV0B;!jQr7Z;FnN)nhJ?@w75>GI+JF?VlH z^c>!-Gke8ti_VV#4_S zKVfOx`dvy~%s==3{*^u-SC_2(@BV+ZQ)BR-aERsopBl6UnNZh8YtW{&WztwR=mpnC zQ8`$HTs3zmZ-6z(Jp_r?gJ+Or&o9a`J!wN?lW3CI{x%kzdbsy+p2Pqtton}B9U>Xn zoe@vU8HxaZlGNOTqOq6Qebfst&A&83?4!ojjQYJ=AK->LQxbdW>8bjgi{WOF{!||# zIQdQItseffL=@bM6jmyEK7#2JrAa4A$>nUdH~7sTkX0Imzr;?c%zBz5FTwOfETN1( zA7rr~QtOV)4Y52lcym0vl!4-Hb#ihc7T$mOiMFZ`@50V)k12TH5!F5}4)N|3A!!&_ z*^tW4RvIn%77M-_+-e|4#=C0QdXc-KjEDCUs*ig(`3bTFUg-WI3Yy-h%FAEH$Gg-ru~J!oKbYSW zddBnH3*29a1_kT&{?(~Wk9XTr`h2KX-@4olKe2<=o0|r2_R|s$DBhAiPZnU|y?Ief zD-q(|D0^~>f;SuQu?szL^|p-P#^YVT4TiyNwmx6av zNXR35hK>Wtm!yh(c z_y1FC%$(Eij1h&YaYy$4ezlYzyZ>holqa!@G9KQ4sXhoe`7Mci^Rre}6bybl*S$#& zAMdwRyfb>c`DFs|S8ua*&TAi9$oyw-C(Y>dao)6JVMb;g;DOCb8(TF&a8R&QuvxHP zuu`yCFjw%TV2t1%L2p4vK}$h>!Bv8b1w{ne1x5wF3w#o25O^qXQy^d9lt6;O0fAit z&H~l~Y65Zs;sRX!ll*=Bt^BX}Yxv9f3;8qollUX}1NhzfH}RYDYw<7VpU=<7H_P{% zubr=nua567-&MYId?$EHc?x(kcoKQScy{x+^4Rbg^JwraRkDCBntdIm-E+^Al$S=R?k$ocWxmI1@MzaPH!C=CtNCon^x);88RthKD=te07{S(90#Sc6zSSU0npv+A&}U|q;6fOf0|0!!)t{P%zV#rS^% z{A>uT#6|us;Y~pjNI$B=?ra-E`cQT7Ora{$i>d>v6D`P3RPE>SQ$T*8YHw%jeB?W- z_FRmqLV8dYdN{uy=|)wEW1$h!g{t6rIo?Pos)AI%FF`s`6;L{mhqR;0Kg!z$`G%_9 z0b9Q!ZK(27eU*oNMV0U1CvBt^RX%r9yOA%b+L`7uinO50+mpQz`HU*BrTvSLPpI-7 z<=cRKM3u)Qohal3s4phu+J22pLuOuWyEA1aVVo}y}lot`FAhbk*2qdUkGR9W^$ zr6aYdTKCE`7XCb>($8;iK<=VSZ|{gHQh_R6n+gM@ z993(U-=BxvL6vq-ydhGCDy`?QCy?8y(hR$K4k<;IhUxq5$SqW<^N(FeZlX%HPcsp@ zfhv_dq+p~3RjcC@?;zJvwW{%B7E+8VWq*W(Ttk%-=esfFDymjIl(>mpL6u@oh8c1h zRm*otZAOYvr69jc11Ut+viXvB$R$+Cy&oVV1*lqD&?t{wM3t;x?p-7wRZBEf?2!wo zS}f+g6UjrBbcd}ZavoKS?ww6Ta#6K#@9kzJ2UQDnq7smEsG2{on~a=AmE=dM)krp~ zByR88ie#ZmJZknml8LH$>*I;Y8B~cWb3Z~dP$epT>k4ujRl;Sd5y&Z230=+NM$%Cw z=pSf+q@hYcMg13&iYmU}{u#(gRPjFUe2S!?is!_*7;*wt+|D0Ik>jZ1QfIk?B%_M5 z-i{nY6=iu6NkSE6H3vD0DoXQrI=4Jwgp&(Z*J>_IW)u}f3)ts!TN-ql==43%tT9|MSCjnKdn-{)E{-WxnEJ+%f zMb(LKxv9tus*V?tb&zRPB}WgpB2%b3X0zorGKs1r@v7y>1ga9JHs&Mas59ql)q%FtQs}l=o8+KU7hkn?!b@it;)i;)|*;`q}Rh zA5^t0xOW@biKixDC{D>#2nq@YRA|9w}8oJbv zY)94GvMhhZ9aV466>%eOsCw<>UVylw>Xm%gV#Ebi5+ zqUyyN#c{+5RnK)5jS)vwJ>z!TiflpE)929#5C>G%o#lRq*rV!6SlkG*8CA9VKMo>x zsCq0Va2VNysz>imokVO=RegQ0A7XfKw3te-91Kz9819dLVXK z5!ryM`@I*$5i3+xKK*KrtVh+o$Xgc?OH|#pwJS!}p{ioO`XFL~syp3FcOh$0RrYvT z1u;j}?ZlL=h#9I%UHV-RQ&inrmVFR0LDh}^o`r}ps!AHIrVt}kU9afQLkv+>>?st6 z090LDb7lx3qUy@*1!u$nRhR3;6A^t>6`gaiK=e>m7-Bkx=%VV9@sK&P22};Z{3{S0 zR9)mveurqI>Ozst21E;0dHZfgAeyK;zg}c3qJgSh(KW(|I;zeMPK6+9s5*Nm^aG-b zs_f*MB1GlC`~Mif$0NWUBq5qLNXo1RU4zuPw@40a4f6M+tY=^At{Zwj;|;cgYmhgm z{5P4xHOTcR%YSsT+mLQ~jU@Z~#Dcryha!UD4w9vK&st$)GDw$r_GZ>80xWHRq0syV zdkwPFKjwy>{4{Y9H7;gv*Aw$;>@~aG9 z$Ci!ZE}8%NR`OeCegH|FuQtzmIUQ$^rYx@$8!j;a8KiMKeJFLCs?OaYeO!4&O{o5m)$>{3LWuJkTwSgIHf*X!1NoW z-hTA?Fcw~0WIOk~<#7QTyeWMriZ|OS(h@AZty@;fOhLT2utl{~@Lqc;Yxfn1_v;&8 ztDIKbkesu+<5!)G1(Bb2lOiDARw=xd$`J4Lx6f=R7DoUdn-!e>1=x726~OC}7EBR6 zsBx}$yA&m_VdHHy?{rfC7RJL{i|WG=C%t%*_@>9v?7u*d79tt%bJTWsF#mR2lae!SPy=Yy;zw_IcHdCTK`G+zS=Q4QcnW@ix||4RYVj zcz7S6`Y^=FZ*RzR+2&qRaCh_af$y#O`~NEj-q)=u^9B+o5$krG#y^}WbRlSq{8e72 z$NQ!meLj|WWIW_M@ZbIaOwj!kDEt1nJoZQx=U_;McjWRteUi2+QkMN# zd9iDdUbRh_+wNJSFEws+;84g(Z|oXWaPp$lsU!RhH^ibo@^JDKY29d98XyWBwPQ9o z8jj;ONF0hrH90OjKti{7;>}e2Ay(=5uU!txl1yKN2()Q9O-&UW?-VxDiWw=! z!}}A}M>0-+>%9`L@Rx`H>7KFdm2CKUU;V?^U+lO86iV+HiyyDY{dFL$<~jPr_5Xne zX$^foY;zb>0QAT3IRH)Z!4#aqFoLIDf!@e4hTWt8gOd-ov)?=sDH_jri6gyJ88 z`EE8Os|SZxo14UfC%U(0oFLwz30lJ0CS+jn?8*jP=LoQf!!_wFAXz3)(cxZvdHnv_|2I7SpWc-|V^Qh>jDo8y}_&%M?j zSbfjz88^qj-XihSE0YH=&M^oc4uyAHS99bsTO^qzXzO z4t9$G0&&>kq1k55}m;2)4CynJE5`1&cP$2JK#h~)RQA2G1{-f3 zts_WaE933G4N`q*;pC?m$Rpwkm$wRTeYj*`gO7I~zrZ^&r2x`C-mfd>+u?6cXq8TN zrg5ES`n|W968d}uiDZwGhuCa2?cwlGr50J(buFfp5hF9!_EZR9;8Ud=0 z7KBGBVb>tO3qB@^hY6sH8uvZ-%(orSuxn82>RsngvIsHU43d}X11~=zPwS1938KKJ zPN4D8i3!|>=Zv*x$D2Vr&>7i3B;bxegCv}Ava8Z-WcnIJuaEA}$D5*Z=Ncp_8oVh- zhEcq)?rU9zg?F2@D&JO!_m6@~GYZ}g`kCyjAl_TI8wGHMZXzwoe7d-5Q!J>I2KhA* z@8z4f-8R}l1|QuG*ln{TK&Nei*4qR#mBoEk3;}D-@k*rY}j~*$cUAF8vaX^ zrp6^a^g)iqV&fgLHuIMhf${K0eH_5aPxju&{?%!s!1wHwfUYb)-Y@;utU_*hgH74{ z*UU=LvAop~9dVF-1JmP8Xr#}F{^wxUpYR50xH%y~gE!@)4ixWoei2Goct3i>v+)4L z`|JACk12SU$nRah0OG9}F}|WB)RvTYh$q%jKNgI1c;}5mydBJ~^QPC4!G6md6@^(5 zpdlvc)_^!R-Z#q#eon!EiFMStAosxvo@3Z}&)Scqv&9H7T=hnMOycBc5O6tp;;Sey zs+w^cYR6x_-5K(0hUL#L@YFmYuc8~j|JU!kW@n>vmFe-G?5EGi3B6bm?te~iiPPXs z`AP}J+xnU1N-VsGzp-pP0`WGTSjtLS-cp?h9`HfD!(HZ0+Pt(OJ$T4@_lt5YaG&>5 zL=5)-g~8*QOD)J?6MNk^<0lcIFs$T>y%{#%lHQLuZ|k2Wo~OnYuecqdQ-Y26?;{!! zyVw{HZ`4O0PJYHGH?#4mih(QV=WR78#K$`_V&0pIU%Nntj$;#&j*mA%{LF&rrD@DR z_m-s72amla(88)gYfi;p9D8!zaNV8_#TKvz z^*UZ&auMD^T09Zm946pEVmITB{QW)_aGG13O@>3PS>FAdjy7aqq5bsw%9jyfuhH2% ztOnRMs6cz5L|Tp&gi_-cc$n&^i@9U=#qy^O%M#Ot8E%Npr}|imli$_dZa2UG5CIqT zN1i!;o5b{q67{o~XF=CkFzFocwQII5_%$ec$l!ZX$xi04K@Mhg`Pjj2YtsJD2B|a+ z-jolIQM^sm+cdE7-sFF~hYJp|zod1CDR^JYPPzXS;yr6p=%{aOPttnLBD}pK7O?CU z=}&-o=Ol9OZiIMqW)Jvou8ROGKX5LZ@Nq2%;BS5+R8Wk2>Y`pDm`4YME zSU@Q?PT?|7LAf9{-hH>qG(_ex9^RX%K6-KTD?6HV=sb%U@VuwgU=e|jci-z5!Jk|= zlIm`MCU_C(IR78SYV(?t`9E(V1kmZDVOgruKj;4!(%?OHx-t zyf1oZ#ZmB%w1_^o1~y2!cB?CYud*XKh2Ps@=ot&n#CN;rLA*J;HmB~~NCvgJXZsh< zMgSJU;AL5%*m!H)E{)#f$^vEt{)rPhQ8x(YW8)ntIF+@&nejF!P#<{tt>*faY*jA` zq~;sleW{F(H=oR+=Nze4;7!lb-yl zZ^~UKDBcRB!BT%GXAk^9V)9@FDZ$fnar(zEp| zVDs{OM7iyWQiGO@#Cr|qI1#XFkibuS(R|qdYl-BoT?>cUr8gBn zIl>uag4MZN@O3MRuY)Cf3tZxyJpWxc9M&L@Bi@}Ia0cn7sU5XbBLckAJ^Rq$Bz6tz zyZo5UXTb&#jZhHRia0}Toqxs{=b*%!vQD1-2Dj~U+xkCy!oyw(_>Tk zH6?nIwf@ZNEJ`$IqN$e@5n{s^_I>c&A zl6A50_BgkX`!>Wo&fn$49Nyx$fGfm%`R)5xC%-w7R<9IK3k{6}C#%Dr9EW&EY|~!! z1`e@Ld<-R}RU<&fWUqU03O3$>h2`8|McF_pH7>09N#(?CY`h;w@Rd#;U_8A2sXnT4 z@>_Y>j!*xA2#}Ht_c&OKkGFuqW5+}0!KC48<@U!5@$s%KsOIfe^k#azeUh5!@}XnU zGZgTA4sTf+yeaqbp?HIUv^7|GYs|jktc7@o#S-69@P6gwx7iEg{l@9@c=0_)((%;_ z-~8bNX@aK{7E)Gk9Xv-HgkbfybJRywx1yRmu3hYRQU`W z?~k?%eVebb0wHRgvyNac@){d&#ZTdvGv_fL-tVbCmf_@=!l_cytDWzs@vJL}Jlj%zBvfUE8e60Jcxi%tuu6i$~!JBep zDvG!3ejRNrynX6DmUKhBBaOCuQt)nmT)r^@;+;|W)zILf18Iom-TMBaSYXClrk(=v zMz-C#Ed}v@MGiNL1rdM@rV<}t!p8fGyF8b)7b|F_#znFsuFYq$@m71=nDgQ_x$_uWoZG!%$3T>qa-^-+$KpTyR{nwjsyU}F$> zVcMD*%)b|uml91R^z+^zp!Ah=VsSHmgA}cly=_6p1oPLRpILPI@LFpBYUrO&?3UBu zO}PXe#k*{?3I`V6gn4{Rogv;P@hwZuA>MgOQXP~7(h+T)$trHHq_>a8ZU!!o2dNs1 ze7WEdyR~#8;nfy0c**Wp;(RR}lo<4$;2y)q`%2c$Oe-mNP=v-U+p|e^CpO+u1+f7Y zA&iIjWvY)boczYl?h4zjB?6SMpT2%&Y8n@B?X~H%D@)zM+sN4zvtRf#NW1zUmHm6% znZ7})IYpljujzG!hpBTjNCg_aDYyEgcwhT8%Z7z_a)H(xe~7o{lFR-Syc6~t$~3?k zq~eTMhxcI@QrpCkvOPyUa6bJkVkyM?JMrpX6$diV?(_@(eK#Bo*<9BA#fd$Gyy<7~ zGOLpf^ity{&dpSQ`xm^`{Tq%18!{f=H>f^VZpO#Ex_4(rwSX@$XqT7BYNq4!mUYSLUzUY2|KubmlP(`gj{=|a`OQ^t zc^bSa@2;SD|I9wif`#{>N7U3wi1!Ccdje(kc4hhI?9C8wO}`vzxqI74;5E;x3lHMJ zC-qP9z7X$QFZT}j+LA%r?6VjbS9tzk=U89gU2MD`oSVuki(~_N)Hp5G`$cWD*prip z*J_KETN!V8tBUI508V~YTQA+_hW)=yL@%j&K0e+=-AwIXwI4+9@O5H^%J?5AMrU0y zkGC0Rdc4o8l+)$o5J5BYDf~F`zx{u-TVvp#u>W60Q-dfkPoXu)ugQ`Rs|K|foM#=V zy>3_{QnAex)}Y6mx1R8WcaZX)LzH$IyOZ8m>S&nN#{-L&inp<_|G#9h@#Y&hGDwj9 z!6{rG29B9`ugm?h3$qb0*8FAbKFSW_sd3F&@5^@H!oEQ|=k_JdIukL5>;D1O$61{G zPTeVX{Lv!>Kr)9sn7ikC1jO5eH_5`zoeYHDh}rj^3@>?r&q%rTMFi48YjJgK!@wVEN;?lm;9@rmHRa`Cl z9QW6uWvO-Sm#+IvkN2L%^!X6p%i$S3ok96PT8Rd4%G-b_-W!x%c(Cx!Db8{if_NW& zDbYj0TUnE}#dmQ3j+i|7M0#qcN9Uq zMYoI2mbt*&Tc^#RN(+aBg!R9ZF4$tP-j1ZHe@wP#2hr5HF9hF5)7{v3C!A+Vy?B-J z`u`!Sj~JZ%`jbu1sig^nBJ&9M=f(J&6V-(*J0#pqK+_@T_ZPp=(f_ZvN?&JV#`Jg- zCfC#D(|tLIDxZ0|mw|I-l;ijjm>H7l|Ee`oK_w+Ca` zK_NA6;pp_LxN7YFe{@a#z0miJhxb;hk3Ts1l^$iEkhm@a{7>rL2=~OtJ0U~oy=7Do zkn?AMJ}HYo_ZC=oP`!fv57YPm*&Ouw5V9j%&Sd`A|D(McL;r+BtU65%qP$;?)}U(* zYeleX5ZmettI}Zqk5v8mU<_-}-KLa@i?Bgj(juO9g5*ZhaJgc#s4E_5Yn+)r2Wyb< z+w~IK%b- z7E~W{IQeZj{WSD|qA)OclqJ{I`WLt1=^jZs(yZ!7n)vQ3V$4U!2ht@YZ0G)JGW`xx zv;}=W#%fgq*WQ>LV%2EyraZ`w;+-BSD2#>o3thsxOAzm)X&K8+Al_FcdI$0$-n~yc z$07yXNh=yck1t=ab}f+YgPr`xm@#Raq5iW+Nbq z8kaj0wzOOY8}Et!dwLI==P?}K#Z(_7IQcyzr}8`v5C+SIe+cf*!N;4+^W%l1r#(oW zLh%`fMEv6|PI)i<=MhgaJ>KO@=<_kO-&aob+#KGjGS~*fYpd`;dciUI_R?jqBa_eMO80Hr_<9jJmV}#>4wM)rTHVev%8;E?-e0 z47P{A?tU4BkGJ%dSD}ulJV?YpNOuey{_z$i7RDG0mR$I=GSHlZ zerh!@C!+(|<|l}pq9;5SHww+9HPd;TAIocJPrK7t}c z_RhaLSG`x$;H}!HnTX@dXJNa?dw55&98?rDYjSQxmVjqrU_#9rPqbm_JkQQ`pE)VOqUo$gKqyZ<-6 zC(ZM8KjW?5>Qj9fJtwBFTG$pZWP>)KVrV6Y< zx2C=WBUpo`*KLb>2bb9I@@XxWxZpxsW@0)N@-rUfD?X}6z()2J z4F}W9EvK7huxk)&+l$7;AWkqwje8Y!XuICOyg{1Uam)VF1;*?DC%*pU<2X)!)h#mV z2C)Bs`DDw68|Mgy=syqE&qEzYvTt%(f%lC>lT*LwI6*o}_~n+W!TdAGg)H>>IB}VS zI)l`v!CP|hgQwo=P&OxWZ9+URLA>+6yft5`>_+1L%)YB_ARg$R`1~Oo;$3xV z*9T*`yybN)`pr)J2(Z)Pfa=&j?EZi2=gj?PuzGt?hCc91}Pze zJ|CTJ+bg;M>Hjro@Ye2$H$?F+bKWhAh4+HtoeGB_-oMVAI7-1g|0zdp0mNIp^3e2x zAUD!ow$_=SaPHl%)Yp3v;$5oMdG97X-r^n{?D%PU1mH7!tJGnIjkgpb>CjhJPQXcx z+v2OfdAS2N-m9V)`5a)t>McU`u@Wag;;x;AeuKi`L)W^lSPp!=Z*EQFuhaD-ooY-? z`?3aqd289%{_7^=DokI!h4bn2q4Bfbq$u*g{vWG%W2ireGe`rP8f09s=`C7=UgWQm z#;QS^vg^EFKE7^v=rFMuz#0_Uq!73ho_T!XahCMH7Y`K0#Wt*lHE5R` z``b-kWFVMX|6Pa}2A*!6_t#-H_6#ztqVc1^A}&xvjngksx%_Ym_6)M%bzx|psRYAq zkOotIT)@dM$?uxC)q2O)%DCb%R#Jk4L z!l6&lg>*YxvWB}R9xVG9S)>Q?_AXRB8nc582D4He(;tU{^A*NfZysXfePC^g`N}R% zkWG!_a0q|;HV+%`+fL(r?t+YmcOccrO`QA?Rx1V5{X$?7Pu;v_Gx$R+d-;h~?y~Mc zU*Kdz*BBi$NSPsD-|)B0k2iUcE+4Yfs;#+S=XQ|vXz(^PZw^E8KF#@T0T$kBQ&mQz z5by2L;?{-`@6e>4tN$N+cOFhv_cjjvP(tP-Ljz?dDMFdD%qc^rWS-|rLW6S%QyLz1F?f z-fOo*-aXp{Qf~_Aj^lT$I70wIj|J{)pGM~$ zJoDOOyqF#MBI6pR?zP_wK7H{6E;ZY(<*thymwqk^Ot~!6Is(8AIiC1$%+-nhQ2(H2k%?v6C5CKT~St* z9548J3!Bn4!~_E9l&Bs|I*iWS!C|}W(Y@^82{O(=)MSdJgU-8)P2v^qBIEJig5=SO z5#PDh``TNB_<^D8{y`H8Ht)omD;67Gc!Q5A%S0@HWAEO^^z}|jonZdw|6^q7%OmW$ zfyBD=bJbguhWCb-BaKwvpG3SDqwy{{qI+l=S_s4_J>*fXShP<~tlym$25n4BNr2Yjoll`YG$d7t#?I=4g49Gt%`x9iGE zY~G`xmz2&FtYrGdiB$!Cc@#)T;8(?y{(Ju)tBGTTUx)p_0Zk1u%@nAo)*y3f32C$% zbivWxJP@uRyBDXk=)xLQ6Y=MHX&JnObk7NcDL;3zRDb2Nh=cLquB*jfHduocG;Yrm z3!s3G8>L-k&j?_j|N1Po8|YK)H_Cyv-!wTv2r`bRsCs%cKl&b|cfASmv8^b>_5VXi z9v&F+)hz8v?UEG$i+{gwx_%0~|1X#qe5m@K6Pb9IQZ%*>dj%=&s{GdG$U~;DL8ol! z%R^r?{!+s~D@c7B-W#1xRa1FicseAB#yg~98*4P=oxDZWVV3u^BQLv$AaCy7ygP6c zZe%Ox{LAN##siy&@3hz86F+J~?Q2O$4-T6^I{qo!jQjdnW$-2SyRNg+}cO}qx3u>HskP3OP zCUIPu<^5>ouHAa@1}VEXnF(EZ{_mx_c#~OrJQzJlvfzZgEm#zmbU@zGR^d-#q6ol5 ze*D2%FLd6dd(x7Nn>c_jGS1_R@t3-Pxk38O<}<(j`WbI~D-y{g7b8BW0WOoDN&EmO zI@%-=gw1=)uU{%TTi1Z%SK(D0Yp_?4^4e7!o5$BNegE&kOJ5$WjlL^nljnE?8s5f> z?{!mo$B0~9fyR4DV4YPV}b^h$`ZMEu=$EA>W?GC=ZZy&po!>VNRU!RKyh98~T zgdp!;BI{Qk$Xn7jE+S|T0mT2@l(57dop%$SjS!x~0iuv`dWqNBm&Kx2@Au0(_QjPm z9`Acd9=#ax-B=;u-`m0ul9OH?+wO?Xdxad~j#=>Jj^OwSu9 zOJ^P_n;#neb2y<(!`tv#*5AvC$w$4Hqw&@piR!rnc{_gi=rqf_ejt3KKHR;vni*XX zjdvyI$l@G7T#EQ0NLA@7pn6}$QTC?NUlT}|Z(0&t2yYh34#&bzkh$N~pf4q%In zTe!?i{$Ln7@45iR!LPB5$GZ~AgNzYh3~&5(t^|It?e*T`4qa^CJ6Udd)mS-zt2=)6 zCm>8U5$8t~E9lqy5eh_dx#!fgMWF4{NmV`Bku>AX~ zW3UGOA#yAP29dzPyRX!Y5B(XWr@Bc?k_Hw6Eo7Yf_0H;foSvxf#oOjvuPzx|%y9jG zE0TvbMtqB_(sj?a2!N)LWu(I^SoN^}-YiS=s=r1!l69^W`AsgOX@jJ`Yuztk#goSx%tOvBrJmHyxBE#>^L%c1f9eeTkk zm5_HsROPQ(-t5H_8MTmip^u1ri*0*G8n*GE>+@?ddC1%MS@kq4dz9`A=p9$PWub69uurIHaI zke^)ZyFG@zf*ft%cVhonAM!ba>VeNm*t~J#;mfp!Rxmwp+zLALs9Rf-6(ltKdW#Va z@6BJLPg1M*z5Xa!G~O;OX{iA6_7y#By8-fEvoObIKjdA$stcF?(4BmBa^A&sLOhT& z6%to~yq#h%Ja_>gP8_IX@2rI%NLL9i`?+frowp3@4VP-Eg+LJ*CmdJmBG-Y=yEwtA zkWG#8c#9)>T*8RY5?|5jP7nZ2qs|K+v|#f#k>}`~PzxbnI$w9*v>*{~rUVPj1=A z33ejm!aZ}6YqimN^IVV*->+#`L^#r|HY%NnKKCQR;vFKefCu^p9|gHK(aTc6-O!sZ;F3 zUEIoOHR$D3D#(Cig2kwpJI>lKllEj!3|a-<8(MT9Oz$+-v8H(^Q)dy zUdnL&{~;ugI~eiZOxSU``+@*Ccm&^5mx3}%PVM%(SvuDsnbGjJHNKrndi4$7Ak}-Tboo^h_?4TSIRkl@hKdNy52S!56|IUdgGAsc{?2&dG&=7WP6OWc zlU%?S8K<4RrFSVSI&Xs}t-#RnB@D;A6Ujp#BfgqIhh*Uo0-(mBMUFoKn|Iv6gEeU; zisbI!_d7`<*u1$~N?9}9nZH5uETk`w=%dAXS2O2$Z>HgGBV0a1-ac#{S?I~-N$$J3UPP;z1Qy7|_bh}f$kPfk3Yzfgtu~v6 zH`n`#;FbJ-^{{+&-koeOn~qmx{b|31Ct^m_j)G~PQ0!|!!M-pAbpGiP~U=uk?whrIjEZ}uC=c#`GR#I%AwlfXcS zp4TGC`+<#v?jhJ9sodGX(>+QAxh=ALOD?1H?mBMbksZwi(vWds3l1d}j-vDa@nC{e9SY4(Q%){B;vErq-{D7MPagSwVd+qgu3xZcMJ#Sod1$}ww+ImUC>iysM|8R`|AMF3FX=;#D;PfME4LTX{ zM;)yOoiy%#w+hyvZlN3P8n6as+qwkz!gr9!yZJVj=ev_P@Ndd8u_1x)2lna6zy_($ zjHN_pAH4r>$HdKJ(*z)H^y5^-A@n^+?(dnx<6YcfDKakEI!WLS{9-cNAE-#km|sQ% zNFG8M@#*=pt~~~?*lE>aHN887U4sG+c8+XP*agVK(h~_C*bP!l&QGC-!S|WI z2E|;ZFOM>rr$eI0=B8LH8s3hk1*}xw6MF4xXuJa)e(D%N-UnRLR%t@sNrRQ6=wGOPjUyl+glUF$l{ z4Xz^NjyB4E@5@Bzt;X73k(kVQyssg7ti_1$j9B33g6#s}!I&@q&=5B7yp^~kS{wF) zTgub(#J^*&AUA)`=oXJwV)_P&S0t0JJj_dF+4cWfL2jYp?I5p}LFJtnTcL`^+vHJF z%r?k7`W}D6EN}AyJxVO(J+?Jvp+5Zn-{w}KE3Td-fE#@MdJp6sF(F^RFq8s{AF6FV z+DHHjgcXZ6xuElwZX0f#@52pbka3Gux88DzN9X;=Nccm|Hpb(<0?FeyMtq%b^wx!x z34qYRv)}pNVDmO=h~0ZyYcJUUi~r`afQS=5WN70<)(i(0sg^ZK27H``45}o(`Gmit7 z$TA-9OeBwc81dykSvfeiLjY`gva0LbZEW6^ORA48RoxA)@QS@T{f>?U(t|%__3zwZ ze%^`nmn|{LNDM%g-81YH8ebaoh2M_vWOnd__VDqlsS`g6r zb}NXrirF8mfc@_6guQSid*4;2Uwiwh(3i)KZ6tk}nE&qo!!g5uu>ZHGsX-o|GTUZr zkOI6xx^Bc7hgO56FIR-$xmTuF%Kl(t9jrlTPfC5ChEuFldB|$jSQoOQs)3O7E)pn~ z_FiyCaD+UleTwD&0l3Bf>SOAX8w9X9nn$2X9DN0;u{CI)*%KaMij3PA6fX9$9({^U z*HPmyy0VPn4oKCJJWgT6SHYcd2iM0BJg*D#<@(Ii!=lsmB)>K9ge2J|BF^2wH*C3n=eR*66?C16=n44m^((rb-jhUiOvD&o{wa|Ejl=L0#khjc{w5{tQ z@A9~y&K7+1S7s5YCr1yk36BH z|4(dOqU2-3{QbW?eR=q`Y^+_rbFO;Z(C~IHbxNc1zMHAJ9*y_*nqgZJ$h+BKeBUf@ z)lI+l&x5?>b7Z3oE#1kk_7)xL<|HtBJ)n^V_W!}G^G=f@C}7pigDmWZL{Lyu{Jg9Q zoi`VeV7qq_4>*gAd$BLW(%}<2ZwXu^$B#dZ*Z*@Mc`V0>FGhyE^VGBexWiRj+{T5? zyZ7saLio~M;NLE%!^{lC$f0`28{ZZZAhq`#cLJPeOJ8`Z+sTmC!$$Liu3;MZaQ z?@UvJ{JiI1oUK8#{eRc!mIY`v2(O(RunDdp9rlhcQinC@_8F0P%i#*r3yog zJIj9neGf7+i+wN15o5UiUl+*(E50N451ysy;DO^$n?JV2*fpr=X6)5YK@+l(=Q)p$ z1udwJ=3il(CzLun9y5In!gY+(l}Dv`Yo+{!xhd9(hPSWOkQkNs4xz-6jk(vCE| zy}xr?P=Ov0<7(m zmxCa0r-h$gW)4z-o^r|KQuy@N$@lCPa*pULNWA;Z0-_x+NJhr3Y^}YpiU*x{slWQ7 zONxxgn-9qYE54&DI*SA0`TsHT>kn7|FL*D`sm{yT-;Bxo*gbvHi|x#RLAsO$eR&vJ zcxFcs=U$L@pyBOxPa~Sjdurz$Ry5u*&nIplhrF-bZcv*&oKRi;>1PS#U9FnDI#zU-y9OwoBS2z}z=qsR-Ik#XBZ z6+RVyM{ke<4u;-X%f@)T=OKCcW5hRl^ikGVcsOzS$mNQtcA+$^+V9LG)_< z3s33j|0THM(q0=fef7o_FQhAv)#o?<{`JqpiQ8y+d*(|Wq4IvNoyvm78@I70rU3HZ z`+DA~S>7*KlXYj$-rjzivZ~^6As<^;&^2!l30w{JCm)Br5AfCQeHlXmTV=lt$4(M} zrR3YqxPQ6ca@Wb+quTR$fjKhnnG%;s`UE=ftJYFu1#cK{dus=h$7PK8o^F#Y8?O)m zM+-|!x^`ppCQm11<@igHb&5}%Ok9fH|LYkPT^vz2VfwWbiVrAFM%tRudju zx7w4H8e1Gf;RmXgO0pl4hc&2-Qx-3DhyrdEEveNQCjyDzZ}6+vpf^a%eCyBQzwv?P z$hbv3>y0CN(N~bG&A$X0UKeM${$CWyV+}@p4S)JQ53}Myzqah)#)b3su*hh1uGA?j zb|iDC+FI-u$F4!RfV?Ft@7tNa2I2a1>B=KB_RRV8e?GC}PQ!b<%9DI5?~soQTxh&4 z<#-H+A#YjBRcW)l-#&GE>;rjs8FhVZwAe;=R2S#Vdr1P9+g3HKguI)QY>d7pz%BL# z*_V9liJ&R}q+8y6bl!qz#{x%g@PUWOIJ|=&S9CQxZ-qSKmwuuvk8KC!k1Rei z*C4sk@DBX?a_;{B+1*?9$`71qyq{g!FgPEsASJlYPt5YZ;{1lw0`lJ8tjrnpZX4NN z_^mceC+z?0zx1j@-ieaC+yLaArkmDWmqi582`T&ad(ays@lz4n0#SS*5*au1yj|jB z7CP@*ncu~VhK$F18IlK9e7$)=gxsG3z`Mlbj@KYI?<0OY7GA{bl4~t*R#oq#9Cylb@pdHpK0a#}(?9}e?nQ}NK;F{V*N!y7 zv$u{l0n(azL?FPC5LP&Z&ij~|Zd)lgAK*vEjVX9q?u$p~?c1{TXxIzJ+ulk<^6Zwf7-q@!kpxT)pI`inA0fBKHgLutp@3Qmm!{+c1fc9-Uy*$z5cTAvy?K3) z?je4lf{dGLSN0@=wD<*SQ;{eQ0>^7RvLZ^0ukw z7C_^z&}AG#guGSqiPvU%pY&NOEC{Dq%9G8_*I(I@zlNpWeei({{9s=kq$b$T(Ni~lAAR8IC&}|J{$#^fx7$L~pY{L#;LCCvOS%Q7%VG39*y4PLJi3pA_ zGiNz^5S{net&%Pa)cOC8%aUBC_^1HAdcSjZ@bi^qJl-Qn9v?8`D`JT>d%=MR>6{Ca zeKoLo;~t3BNPk*QcI&&g)tHlx>Me3qbD8{o=C9tm^yN|aD)i^X-MRkXlZN-sXg^nK z^`^)Zc+hw|?~+cbg}f~i?{v)aKB2p(Fah$`_HvONaJ45F8eWVqcuxY~G8fI0hP*G` z^k#R3XK#n*Uv#p8@Bb^=fO~@b&<`hm=k&UIE#U{Nka6l!;{qJQUZ`tK!P6I(dyg{S z_SR1%k3|^q^=P_Qy>7>Y-Yl7?6~frOA06N4CVSnHY(WuL4Jv6y{d1uf>CL0ue^QP# zFn#|o9#3B$Dus&;jpF`0|EK=_GxU#eiVdQvLHkvH&V6Ec_5>-dNl_H71~nXGRURdm z=?&KY@>v6GP))+slP6&R?_J%?r_gCb-rVnNs0_E*N7q#DyaXF0e*1OpR>>65KT$4q z@i_t5L@bNcZ9wn;H*dTWH#Er)ERk^yo+^vwZ=+AKIjgqLFECxfaQ**ABoD0kt}1!S zINid7ubCR_AHJV~yk#XK^zVz04lmls#zr~r6-g0~_5f5H3K8q;0onsmJX|HFM;dJXeW zv8O~l=*okurinY|%-jkxfQI*;4?Rn$D@Y~JP9ZejGfe@P#365DW3hrV^DVMDnf+zGz|k6(p{h&OAo#%-8<&{=YvB@9^^n=kEWXt=|0|d5h3^ zxA+!{u7kY&&b~f2%lqsTSM6rVyJk(Bg}^;q@+HpG?|!@{f!K(YHC>SR!~>^%tz#4* zo!4w)oJas&0TX-997125tc;yfkFVwj&yjI&I4<5?yaS!LsJ0z`J3r&`mPPVdj1k|& zVR@$?^Y9?(cMBWaNo?N1GMabnI!wvFYMrSz7IgIgo4ay%PFXU4|4*hbkD@wJ=a`DQ z>g`9vJ1q9x5Vd++D})H5@fP}$t!DvwFK~Q6Jj)yZ+;iC%$h(d6H2=HRc4UX*W4;^V z*;`(;*;GH|Z9F}#EOnFu(l?H-sVX7>vz+hlH?N@c?tI2JEM5Y?hlh;I<+>JC7>dsO zxVQfT8yw^DZbR}&!iX<6Po(>^9UidYo;W*`uzB|%)sOJ0(kF*xwrtH=jJ-HXY|MYU zdL{FJoT&c{eR&LOCb$j3`zQZ<|DT~d|9^sm{r@hS8WgQ!u1u{#?IcBUv>LR+V_Jy_ z`~O{~x_gvh4XOk}cW=WQWN8w0K;OffY)~0;f**bZ@?2u>vS3()9;{m!rgD-3NY7Vr zj9ef9nMUcTjNRxp=uq_w+x;#AKoS|ZZ)B(P`se61Xz`*G3ac+LUJZ&v^1zDkd#ed$ zdK(@r5UISNj%U-ulJjwj+tzr*pG(|kj$0LK& zNeYCy{y&(8cN9LglFEDcnt5Vqyyav4&Za`%(vG=Zv%FpJ2L)Y&ywy)H;<}J$P5vXb z)_5eB1l*#JcaK9UDFMtn=;4AmB$5CC%FFE8*dz~0>HmXJf| z{dCgk;!8CF0FZH+&9!P9Q_*>63^)%t#4sN3CrBQc@pWxaFzylnZHK;QicDayAl+n~ zv~HCfljl8mKBuIJ&AZO!n~IQvz>?w5le)aMk?;SL}2{)X_sl16Qxl7P^ z!?*3-??K+r*lwPlU$>S?bbN0v0B51eAg)SVPqu<_$}qOjEB5$B}jSXo}d7Z z14dWu%n5)k_15Xb|H3;rwyjb|LIAKJ<9y@aiCv9D=N-8r(1a(L@pxw;c@Qz;yYu<> zs(X@nklK24{nRIH-epD$JSTzA zHM|_`n16B7PhTDhCTmVDxcOiIPwl-J`bXIRhtt#`lA+h!_y1p*3V6Fe zI_sk!5foq6vHQ9N{Smw7iv?nX*9AZ!GVT{=uD3b?{TZbDHSw3(elT7QdWhsvhY?@R z@_Xy}hyuVhWUob^Ep~&{Eb@Lh_K*jtuGtmL&5M2hkIM*XXpw7V{u)$IUmgL9EyjY^ z=2nnlG`!uZb$f6}*~Ua%RP_sQTz&nHjWfbTu|q3;A9VXh!M z?80ub%os5J3R09vUmg>s!uRV*bK6^?G`wT$-u~Uaef6PQ0*$vUpG56i$XoJvjQ%Rf zyO!rEaDlulxicFYhONkFM%8MEi6n4mY+;i;weC^|1w1s;upny_K&|Ro&W3+^ zyruWT??S&6c%w2hZp2-6-3l`L3KDnuzNL02sX1upug3JeUGLGChr55Arr{lPo$o8Pdb_G;uR!D7 z;YP%pLEe3P{#=^nJ>zJTm;ia-mp}PNeW5jZWynF@oACYXrxIpmCXjd2yWY)r(rzOpE|ng^b%`BQNo;44rrHLPCyi1LN@yM)G)v5#P41 z$rbY(1;EVL6N}q)v3Xmp7gPIlzy_!{R$ly?QIA=@aZ)`C7bUJ`dfqrWI`cT`s*Lpi zAvC-Xcydipd8dguEJx$rr{uMwC%oDhpyy1y3kW=pl{?N_uWmp%%~$T>^` z>Lus*xI^AcIvyU7Jw*ZGqCAVrJ`jMN+mbBjQuM{i)M8uSMd1R#3K^&V!amiM4SjK9 zZ1+aX;11*Q{*L5<72k)7fn8GYa6(f}LHe*HHtzva_2zZAwvwA`k4X|f&~d$G#-B%j zV*d|(dn=p1Jl6VNcF;QgU;oe0eLpogIK@WL)Sx56)$-IDRJj4a60HVJMkSp+bhk|J z4og*l0<1xk(;Gi_TvpY)kSfqIB4JIoSlo0`(w+qR95uIXhW&q?x}Qn+1qz6;<#A&> zOaSTX4~{Isqt_sNt*z>~}TLYtSX9z+VRH5@c#xjPj!AcBf5;m8@({Ztyf+rk zfsprp8s3M0Z8`Usci|U#G~O-SzpCa#-dDv#+h%#M%p)xAfxJV;UbHOWu_pVToay=Q zL;_-4ANIII-WwFpvqu(CfCTBPzr6XB}v;{oZOuc6wR zcbT3yZh+1_4*aS?R*?H>cptjo_xA+J?PRqa8gGsO>ra)C_chk*S}P&%YW0fN&ye?K zuUr}52`jRL#JwA7@cVxb?WJjvkau;hY{A8I6!3BXmEyN=2w=zA!F81c^y>Xfw!E*p zM*#RC;}UIaCf3-X^R}I;sSy%mJl<1C9$4}9iY?2{mJ|Si-JV%u2e5hHPgF2{wcigs zs-Qg7;G^UIzu4liy-gdLzd<@oUmgNuUfGFP=c@N!8r}&<4yRD7_q>$}vS_@G+-d^b zAa9vm+4Hl!OS)WSenQ@R60={az};JRkJ@}Se-hX-xaxd9#1B0Vyp%yI-~w zz{ca`Sg9~{-r`|--PfK900U&4q30gadVtPbhHFuosvzU>UWVj>6<_%gd8vI|2t1C+(Fg6l8Z!X=c3ua9MU=uQK;m7U8zFO$KPo;K> z4s$XdZw@4nlNj;c6**b-zD5AB3FD*I24eGGE;X#a`#}JxKl(J!oBsj!_Lf$oQ}B&- z%)dCvqce{ep3!Rm-T%iZE$F|;0c%h+O$|zsB#TpPQ0@+XWwaVpEA`!o3)Y~r_oH@l zum(|f9@Tb%caVf_2;1i0U`77aWNVSMh6G|tcdhQ=A0gw#<>rN!!3U(jh*z1x1JbH5 zlkXBPpx2*Z+YAX_XCqd7N8tS^1ww?4oFRC-t5_ zLFHXJ(7hUsH>GFZNomMiMNQ@2EN}OwJL1bAZv%_9yf&|_$nT$w5!Ba_z;oG2nJ8P!paYxtr z34M8dFVGM9cyVq88A-$Ycp*iD%DYy(Knaca(Z+%F4Ul(4s?I8T$h&T-@wM3(q!%ki zef9rlMLumRIy|_61gdJe5066Lzs##^av|^4+I(l#+lXMFpZ1G0|MLAm-qePDQBruY z8yV;Rdhw7eKRRzwAth5yXU5~rjpQMM5#QcY$MmnULcrx}*iP{pY~Gz^de5)s*?^A6 z_Z+@VwW9vBr%v6D^M8J`t*0=3gJiytzC5~;ImGSi=00ypq~U!mW}=76+bAt!6&mmR z_*>%kkoSQK!?ao6=X(%PZ50C}6k7 zXXVm+1hC6O=a#zx`r_p29d{QCK0F9O#%WS z^o}AHQh-%kRf}{T0i--lxSwW<&iit6w#_z9JUEPubNlQ*;NgSLTdDB?rNNN#c$Xr1 ztj36MrYNhio^XKgK&J&7-M7=?WzesWqs16W2Pl8YB@?_x)H6e8n!Fq9Fro zkYmgp1I2PxJ&l;arw`=K$?G-dFX~nz0nLNABDCQOQgA$9TH+Q3L|u~Tygvg^kQ!}v z&bLLcL2iEjM_LQwd*pfvjO_;oclGI=J!&WMpbi-~Q}Fc1a&`0uDe<7BsQf*~ z<6VX1aR?*6nJY`oJRZUGe^;rzFACVaj~rjU%@jBQJuCS&tN5BQ8zkJQrpCv@KIZ4W zQj4xU%rDI-v=+|x|4A$~yiZ;y{C$Fy^-sPk8t=V%b}eMcJ8YdCUKaA+r8KZU4f1aP z8k6|R!IGT$yH8Jk6?}s9Mf`(k$h%9feXysT0uE>`aPiwm1n%qjKFGXA=l$&W(}n8} z;DG}&F0~}9>%AyC@Aa<_?D=?^@pyM2d8lE;C$gF-xHiglZM~e#!e-FGt8uG@`@J=NNI_d}A zDFT4AKexkCw|WJ5 z{%^K=Z6)L#R!4HszCr;4;!pP93nqf622X-dy+P-_)2J+u*8>k8A>$OqiWiGbqp!VF zxiz#Or!pSz?MNOe81Y?bs5qW2f(KazHHASqY~HFPW!%C>RzTR4$4;Xhd+lBRjlNTccoOoDr(v^oGD^c$by!-9H{vWH0V}M_WQ!EEf4a${I_%>UER>JrHmqfea&}z`z z8$acEVGY{BEx1ey)}R<~O;s^C#a8cF)YYM6OkQ(B`eNEj5>Qf}-c-vsLgpa-Rv5cW z0re}sm<_fOz~$_P<|b_DHHhcsyL}BG@Zb_ME^Na~6Bj=8DRyS_86aD`} z;6(DkiZ3x(>}=6`0r2Hv>r4Cn*fl6nAaTgL%$96@Qn~- z6W#0Q^=1n?Z=HzTvA#cyH^qKN^1zC3`iCRC#Si$!tN@Ef4?k?)3m<-1qdH>`v^*|t zBxp5Z_y2-Z4xuM-OuvG}anhFug=4M#m)mpw{{kA`S?5Lnz922GnW>4!J3-@&tUlyT zyzTmJmiL|2<4PwX@8}8l=IT2e$x_d^jcLRF|Kxb)+YgX;j*U{q>1qn#-!zjwwt)zK z=Wkp1;vhQjpZlLyZ*9SYZ^*a~!C#>tRnd9Rh&lPLn_xWN6G$F7@qdrcYysy%$2tLU z?RL8BZ+mRse=0M{wUurlw{M=E`BiM*X%^ca{fgYf^t@&D=*#1WQ&f=Wp}GE_jfQt- zz#BJe_4X<8&_LsTZNeqQ3Gx;`yuwo&^1hrc+cmp;>to(_{*2=$GSR!M&J^z6#`LT0 z`U82B8y4=GsiJ_jKIb(86^LLe&8YNkC_3+G;=VqIdOR3M#@S1Km;Aa6o%hf6+k~Ts z7>_pr$zuv5zJpO0GPnKV2Qdx)&&{@A^FD1P;hFo;4OCq|{wT1Np8j9t2YX5=)ANpb zOJ5!fY*bh!|2dqPPs2OIyy_5@_xkT^)}!&huA_A|4Dy!js%)9%?YXx7yazmcQ+ukR zy=;>i`PvFH&ym$6@Q5s5E(-hq*NLpF?QX-@TSVj}{56Sy{k&Q5szh|&mahWV3Dw{M z4jC8uUVPYL2|Dl3Q)1hRpBRt#W+V@+_@)hH4=vg(04kpYqZ&hO-s@@x_I*3%2fkW} zO`7Y_!Fwi)&DeHYl)Cyd|R7Aibd;QZD`bPBx&Sq@w=IW5O{ z{l5;92UdL9S4(d`3KRgzW6j^>PGQ#|ccCHog+=aUPKi?zr_-_T|4Y7kJotG{EYtV@ zIaT!Kp}2LDt@_H`3X+?KcYag(M=I~}1CnfLy!T#>Jb4N7PEoTCl7PI&)n>}xLf)39 zd{WL8`eX~z=YxktNnl&hWKRy{?XZ(vX9jtz>TIbRT|op|4U*nU|MCQBqvBG~i4z2> z$hh@YMG30{(0M=5lnowQ!FasyBY9xO7gERX)04*!xH1~E1yitjCvIyRIDEmKEKq06 zq27o61Szh5@@?VDqfE~mcbUFCTsGHsj?~We|6DY@&*Z$Rq4IwAVq_i~?|2q>o;t|e zYK{E!S>Cnw5qqWJ3DWSNpe#2p1G3e*-P)dFB#^m|JM0|fZJ%NM?sY8%@YvfczL-x0 zMFBUevhw{j`t@wPznz=|(|*YnxgAOR5l zL?-lMA~tWw;SbX#BM#*4mJMeNq?<6exBgt`T@i4Th3OllV}5HUQGUB{_4$3 zUmnY(H-9^RZmxQB((uk(Yx#xBJEuR11&z1ShL5!qkoWr69am;~+uyO#8Hc>npLaW~ zl{F%_#+0QG!SjEoidfl7$lF49^|L)>3h>-t{yUqU2u^PsTYYRjI`2x+V@1cm;Xx)c zF7=bUDT^jL?}$afwO5q!cvm2K?8k`jli}um&0VCx5V%)gs%OTki!wwqm57 z0tOm&qSM|G!ARR(sn}QOHR$sf;w{S@K`?-f>+`eUTrcH=I+Z-jd3$T?6~?PU)I7Q{ z;;Y?wSv0AaAKcJCUi`Khy9Swk{=Dt*9|ge2a%y=B9arr9D(-pvL*xe2*Pw?a`ts1g z*SZ+OJ4hjK0UF*HD-R!_^7d5|;X>mr^F{TT9OTV^$IWm#ck>uQf&D)Aw;|SMA1(3H${D~~* z1Jr-^e{1Z7&gs3!?l3)XTnC+be5+EC{O9o&ej45vjy__i@-||9$BD*!kqmdW{%rMr z&|ERgdm{VZ%Qm>ZHEFqb$<%gT@*=6XGV$yraLagkS0d!i8Mk;Zv5o@d^2J`+Cqx2& z^QoYt>FC#6#Iz4O=_CpQPh=e4C&q;8IP{J`?? zR*k+J*t}=g0Vml*N0VDH}Ib_nc}DAQ&7{vQ`iUmo}!eu9fm&Q)(d8r}t4 zS8Sm2zW=C%1C6)a@l}tUA@Ayr3aQz{i3Q(s3t}N}HRYAtHL~@{l51|PtKo;26Q>e( zoq)W5KR&x?3hv&Xa;{LyKN$%IYIL~Di_m%7?i&uOj1vSOka0e4IQtrZbl$J8EDsCG zVLaYeNFF^H@rm3tc=NbK0IdI%efZBsY~E%44r&@F?8zLydk_8Kz`ng@Rd8#fdi5yN zACUgpM_(SpUqzod`pj)_@zU@gs#9>_b&eSZoq@2a8h3dbBh za<7&3#%jphapRTPBapYXlmbT(tloK+Y5w`?MDR#c_-J}L`r?G&{mr$5f`Xs{8FzWG zFu9eC-v9G%S~1M8!g#!SkUaP>;;Rox98t>W2Y!pq`-{$C^L}Srl<_6ap8RBzJi4m9 z343w!%;0-Z$b9BsoV=qi4}8Bo-X!q9^Z&n#Q%3#?Y>-4~YEaoA-z2pL8L;T%(Q449 z6IoqH@4zoe?-DIo2B%n)Pn)l;gOAwh@7^cf;{C* zUmlCQ@0u++GB?Ev)9@~RldMPO{kBv_0FC#`EpOLeguJ8PY!?!Pyj33eeHDegQ(7v6 z)S4v8PfV;g4}XmVJ}t6>&5-v(=XUl23I&|gj;N^4fG0>iIKD6fI`6MgRegoqTPr@~Up`^JlDr&jG`~L<2LzS+21g<9cCkC9DlPB}(lcf0 zGw|yzer#u|oI=ofb6k1uw#Zlzcq8NP6|21Q3`6Igt&%fj>BM-v7b1D&V8rLsNGa2D zga@P>v+PYiV)MR!_Sd2^O;6y~`uMKhPVDWi&D*4oi7M7JJ#TkM`tn%zsZrGQ)Lj3+ zh=zBun|2tLx9_oXUNqhb)6xwuAn$7if#b8h#}^p4kRfjkj*_Xd(<)>u4&_arqj8`o zWa(}}*dSRH^i9uirhslghx6lE1R%R`QbX$yI&Z62W>M=61c4+n?#!5_GdUEU_bTxp zmIoaekGBnyhZ077wv;e?7T6$lmwY&OxEGuEK_cZEVVx&$m&uSniw zdfqq#I`i0VR3iP)?yVpV?;^P$WmMiTx9;OXRr8i2^wU!5WfAnaP95lv?JRT@?P~?=Rjct1#t7ki$`)rg4RnGahdiBoAqf_1#gn|E2Z(e=3H z_Q3OWi1P|gI-dW3A9}X=nHlr<|5xeDV_rbk>Vp~o_5Xhtr;Pj)xPn|pQ-dlxpFg42 zpa!?KqG&aUOHaCj4c4H-vM)YMU=2FQy`*mgY>+&j@&^9!kOV%W#XIeVNkAg#-uPXf z5wcNv_L$2X3gBDOMtYGE2?E6GzikLauR)dZSC>A1BM5wvaV<0QbqBto*PvTI!jDBi zFCX)P*m4qgcnG~TYB_Pxs??+BLa&RO2Qq{u(|kT=dO z>Pc*>FkoNLVlc{00xbjiQUj28Mu?thX*UIYxA>xVo)ii6xUR+R_?HXP&D7%ZihBfs zE;25Sr$agPEjn)z)qYQY2IOslUqrqVI8GG~Nqh z8kVa=-kW}Ns4RuN?{6R8vT>F-`vu}Ds~@_#ODf5qS>Wp}*Lrs^g#AB0!%?~9B?XLK z895w&H4?})^ocDdp;zzL#fcKxe*}RPGR}yHC+Nd3bl#a953+{Yq{xi+*Yg<3BMT$G zoQutOemL=i`I{ZxEoZP-kSByPqR&9y@rQ##P6cE0##!~~-6{=YdfqrY`tksGiC&vp zGG}=&rr~{6GuD>M8>g4K2#t4Aj*gTA$h%x~ zo%iavZ{<84jJG)HqvnAT-)o}Z@Ha&PkehshCGQtDZ=)5F+V>0h0-$?d@3dDlX7%PK zbsKNLQOooVlJs%<@>m|dXDL2*?r=hshWC|#)C4MT9mQxtG~Rv#Z@=z_ym2aL)n?D$ zsJw9x<6X1TxX5xI263~z_Z$ zPg85qM?pn#v>G%|a`o<*sxrOPt4C!;VGSB?Y;H?{Q!IzY@uhkE8vv`|u9Gb$B+#8m zte1ifl9XDq_*6dykaXBS4?HITlFMSdti$LvC@N3eJUB`a97M+b?C;tsycB(k71+M~ z)UP=M66N}!)}naa9YY(>Hg5weS9=y>Ld0ElC0OVamoFw zn7;oH;G!=N{u^Fu3*a3jkoO82-j#(jLR8*2KTIw|<1KrppeY;jwm-v?ImHFQ?DS}`K8FzQIa2MZp^y*E1tE2xugYkG%^T3Ml>>t^th(2Dh zZz+M}fgm<-!{3@=MKeJ__GEjwcNKPngxloizxMMprmx;Hru60ULD7H5WM#@MZ*dyl zH_gxdeK@g}J#z_K^-er2#L)(MFWG%2W-;VltK-*V2YDZ6+qd$#k1BZ6bvAUqGQ7Q2 zcf~b-$h+vmmDdd)D1fuHcJS76BDf$@={nMjUcIkeSB!AmCkP6Vaqn)HPOp|h=bdhN zXv8m;@pxZF^1zC(m-Wl3P49pf8W6^N&~iB+o5Q#AtZm5Dhs(U7RG|-o6-(cMboh{a+yOIP>@8v%KrQhA(JA z-d1le9oZHo55907xifp7kX%QGSGxS#^f#$E~-Y>H~%|A7d~*OV4kT|}?mQ#$j9 z#oq~ntH?NZ5ntD=9CY41lPcr-{fx)^7m^27d>WfLl^$sEgL5|t^M?emdHesq{P@)_ zZ!o01W$T1W1NP!1c(al1{Qm=slL9*P_-OiMDSW);zx)6Gr-qxs{y#Xy%F@&za=qw6 zY7Hv$lafZOLGy;@Y5l%kruT5G=CBZ~LGtamS0k_ni7q)Zm@Kdn+)OCC-sI7pPqBKw?n8CT z+)O{k;1RGtJ{O3_L9I@(ve+XAa9*})oVNkDIn*=rRzWOk>LGO_xB+;(0N~a z^di=+Ul6=Q#)+5nmfvJU=ban?LUTSc9`7O~k0gxvey^No^H7i%j5_7Ib1cW^ZD*IW zU(;NYY!XnTIwp(F8~4h0PxyyG=I8C_Nmm|07dY-6-V!?7AW75kuKBI~jLKVLOc9m0 z|CUVzCCK}zr^WqQ-iq;?lB*zZhg}Qyw&WTBp60;uBIuexgk;>}7q4Sn|ky)3{x(HlF#+_K0oc~=8oj2#R%-bq6jK^CZ$%6wUK9XhE z<vD18F*zVwaobH^S4xDFTwZ#O4_ z>-VlKSPXev2?$4?`%D2>hUz1&TO&c~gPb)≈e?NKFN*MhyspB4ixpZIz&oGdgb$ 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

I!4X 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 diff --git a/planning/autoware_static_centerline_generator/test/data/lanelet2_map.osm b/planning/autoware_static_centerline_generator/test/data/lanelet2_map.osm deleted file mode 100644 index 406cd85c151ea..0000000000000 --- a/planning/autoware_static_centerline_generator/test/data/lanelet2_map.osm +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/planning/autoware_static_centerline_generator/test/test_static_centerline_generator.test.py b/planning/autoware_static_centerline_generator/test/test_static_centerline_generator.test.py deleted file mode 100644 index ca2621212ef83..0000000000000 --- a/planning/autoware_static_centerline_generator/test/test_static_centerline_generator.test.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2022 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. - -import os -import unittest - -from ament_index_python import get_package_share_directory -import launch -from launch import LaunchDescription -from launch_ros.actions import Node -import launch_testing -import pytest - - -@pytest.mark.launch_test -def generate_test_description(): - lanelet2_map_path = os.path.join( - get_package_share_directory("autoware_static_centerline_generator"), - "test/data/lanelet2_map.osm", - ) - - static_centerline_generator_node = Node( - package="autoware_static_centerline_generator", - executable="main", - output="screen", - parameters=[ - {"lanelet2_map_path": lanelet2_map_path}, - {"mode": "AUTO"}, - {"rviz": False}, - {"centerline_source": "optimization_trajectory_base"}, - {"lanelet2_input_file_path": lanelet2_map_path}, - {"lanelet2_output_file_path": "/tmp/lanelet2_map.osm"}, - {"start_lanelet_id": 215}, - {"end_lanelet_id": 216}, - os.path.join( - get_package_share_directory("autoware_mission_planner"), - "config", - "mission_planner.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_static_centerline_generator"), - "config/static_centerline_generator.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_behavior_path_planner"), - "config/behavior_path_planner.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_behavior_velocity_planner"), - "config/behavior_velocity_planner.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_path_smoother"), - "config/elastic_band_smoother.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_path_optimizer"), - "config/path_optimizer.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_map_loader"), - "config/lanelet2_map_loader.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_static_centerline_generator"), - "config/common.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_static_centerline_generator"), - "config/nearest_search.param.yaml", - ), - os.path.join( - get_package_share_directory("autoware_static_centerline_generator"), - "config/vehicle_info.param.yaml", - ), - ], - ) - - context = {} - - return ( - LaunchDescription( - [ - static_centerline_generator_node, - # Start test after 1s - gives time for the autoware_static_centerline_generator to finish initialization - launch.actions.TimerAction( - period=1.0, actions=[launch_testing.actions.ReadyToTest()] - ), - ] - ), - context, - ) - - -@launch_testing.post_shutdown_test() -class TestProcessOutput(unittest.TestCase): - def test_exit_code(self, proc_info): - # Check that process exits with code 0: no error - launch_testing.asserts.assertExitCodes(proc_info) From 7ac40b7d5e29bee9a1eeed604e9340fdbd58e762 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:30:58 +0900 Subject: [PATCH 053/127] feat: tier4_debug_msgs changed to autoware-internal_debug_msgs in files localization/autoware_ndt_scan_matcher (#9861) Signed-off-by: vish0012 Co-authored-by: SakodaShintaro --- .../autoware_ndt_scan_matcher/README.md | 40 +++++++++---------- .../ndt_scan_matcher_core.hpp | 23 ++++++----- .../autoware_ndt_scan_matcher/package.xml | 2 +- .../src/ndt_scan_matcher_core.cpp | 33 ++++++++------- 4 files changed, 51 insertions(+), 47 deletions(-) diff --git a/localization/autoware_ndt_scan_matcher/README.md b/localization/autoware_ndt_scan_matcher/README.md index 22e56930a0048..ee177608bdefe 100644 --- a/localization/autoware_ndt_scan_matcher/README.md +++ b/localization/autoware_ndt_scan_matcher/README.md @@ -25,26 +25,26 @@ One optional function is regularization. Please see the regularization chapter i ### Output -| Name | Type | Description | -| --------------------------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| `ndt_pose` | `geometry_msgs::msg::PoseStamped` | estimated pose | -| `ndt_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | estimated pose with covariance | -| `/diagnostics` | `diagnostic_msgs::msg::DiagnosticArray` | diagnostics | -| `points_aligned` | `sensor_msgs::msg::PointCloud2` | [debug topic] pointcloud aligned by scan matching | -| `points_aligned_no_ground` | `sensor_msgs::msg::PointCloud2` | [debug topic] no ground pointcloud aligned by scan matching | -| `initial_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | [debug topic] initial pose used in scan matching | -| `multi_ndt_pose` | `geometry_msgs::msg::PoseArray` | [debug topic] estimated poses from multiple initial poses in real-time covariance estimation | -| `multi_initial_pose` | `geometry_msgs::msg::PoseArray` | [debug topic] initial poses for real-time covariance estimation | -| `exe_time_ms` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] execution time for scan matching [ms] | -| `transform_probability` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] score of scan matching | -| `no_ground_transform_probability` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] score of scan matching based on no ground LiDAR scan | -| `iteration_num` | `tier4_debug_msgs::msg::Int32Stamped` | [debug topic] number of scan matching iterations | -| `initial_to_result_relative_pose` | `geometry_msgs::msg::PoseStamped` | [debug topic] relative pose between the initial point and the convergence point | -| `initial_to_result_distance` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the initial point and the convergence point [m] | -| `initial_to_result_distance_old` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the older of the two initial points used in linear interpolation and the convergence point [m] | -| `initial_to_result_distance_new` | `tier4_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the newer of the two initial points used in linear interpolation and the convergence point [m] | -| `ndt_marker` | `visualization_msgs::msg::MarkerArray` | [debug topic] markers for debugging | -| `monte_carlo_initial_pose_marker` | `visualization_msgs::msg::MarkerArray` | [debug topic] particles used in initial position estimation | +| Name | Type | Description | +| --------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `ndt_pose` | `geometry_msgs::msg::PoseStamped` | estimated pose | +| `ndt_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | estimated pose with covariance | +| `/diagnostics` | `diagnostic_msgs::msg::DiagnosticArray` | diagnostics | +| `points_aligned` | `sensor_msgs::msg::PointCloud2` | [debug topic] pointcloud aligned by scan matching | +| `points_aligned_no_ground` | `sensor_msgs::msg::PointCloud2` | [debug topic] no ground pointcloud aligned by scan matching | +| `initial_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | [debug topic] initial pose used in scan matching | +| `multi_ndt_pose` | `geometry_msgs::msg::PoseArray` | [debug topic] estimated poses from multiple initial poses in real-time covariance estimation | +| `multi_initial_pose` | `geometry_msgs::msg::PoseArray` | [debug topic] initial poses for real-time covariance estimation | +| `exe_time_ms` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] execution time for scan matching [ms] | +| `transform_probability` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] score of scan matching | +| `no_ground_transform_probability` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] score of scan matching based on no ground LiDAR scan | +| `iteration_num` | `autoware_internal_debug_msgs::msg::Int32Stamped` | [debug topic] number of scan matching iterations | +| `initial_to_result_relative_pose` | `geometry_msgs::msg::PoseStamped` | [debug topic] relative pose between the initial point and the convergence point | +| `initial_to_result_distance` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the initial point and the convergence point [m] | +| `initial_to_result_distance_old` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the older of the two initial points used in linear interpolation and the convergence point [m] | +| `initial_to_result_distance_new` | `autoware_internal_debug_msgs::msg::Float32Stamped` | [debug topic] distance difference between the newer of the two initial points used in linear interpolation and the convergence point [m] | +| `ndt_marker` | `visualization_msgs::msg::MarkerArray` | [debug topic] markers for debugging | +| `monte_carlo_initial_pose_marker` | `visualization_msgs::msg::MarkerArray` | [debug topic] particles used in initial position estimation | ### Service diff --git a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp index e083e6751c3db..d6e629ee2f1c3 100644 --- a/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp +++ b/localization/autoware_ndt_scan_matcher/include/autoware/ndt_scan_matcher/ndt_scan_matcher_core.hpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include #include @@ -33,8 +35,6 @@ #include #include #include -#include -#include #include #include @@ -166,23 +166,24 @@ class NDTScanMatcher : public rclcpp::Node initial_pose_with_covariance_pub_; rclcpp::Publisher::SharedPtr multi_ndt_pose_pub_; rclcpp::Publisher::SharedPtr multi_initial_pose_pub_; - rclcpp::Publisher::SharedPtr exe_time_pub_; - rclcpp::Publisher::SharedPtr transform_probability_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr exe_time_pub_; + rclcpp::Publisher::SharedPtr + transform_probability_pub_; + rclcpp::Publisher::SharedPtr nearest_voxel_transformation_likelihood_pub_; rclcpp::Publisher::SharedPtr voxel_score_points_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr no_ground_transform_probability_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr no_ground_nearest_voxel_transformation_likelihood_pub_; - rclcpp::Publisher::SharedPtr iteration_num_pub_; + rclcpp::Publisher::SharedPtr iteration_num_pub_; rclcpp::Publisher::SharedPtr initial_to_result_relative_pose_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr initial_to_result_distance_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr initial_to_result_distance_old_pub_; - rclcpp::Publisher::SharedPtr + rclcpp::Publisher::SharedPtr initial_to_result_distance_new_pub_; rclcpp::Publisher::SharedPtr ndt_marker_pub_; rclcpp::Publisher::SharedPtr diff --git a/localization/autoware_ndt_scan_matcher/package.xml b/localization/autoware_ndt_scan_matcher/package.xml index f2047418310aa..ebd1ebda2d573 100644 --- a/localization/autoware_ndt_scan_matcher/package.xml +++ b/localization/autoware_ndt_scan_matcher/package.xml @@ -17,6 +17,7 @@ ament_cmake_auto autoware_cmake + autoware_internal_debug_msgs autoware_localization_util autoware_map_msgs autoware_universe_utils @@ -35,7 +36,6 @@ tf2_geometry_msgs tf2_ros tf2_sensor_msgs - tier4_debug_msgs tier4_localization_msgs visualization_msgs diff --git a/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp b/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp index d3e1fa5982867..3d06dfffa16ed 100644 --- a/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp +++ b/localization/autoware_ndt_scan_matcher/src/ndt_scan_matcher_core.cpp @@ -53,18 +53,18 @@ using autoware::localization_util::SmartPoseBuffer; using autoware::localization_util::TreeStructuredParzenEstimator; using autoware::universe_utils::DiagnosticsInterface; -tier4_debug_msgs::msg::Float32Stamped make_float32_stamped( +autoware_internal_debug_msgs::msg::Float32Stamped make_float32_stamped( const builtin_interfaces::msg::Time & stamp, const float data) { - using T = tier4_debug_msgs::msg::Float32Stamped; - return tier4_debug_msgs::build().stamp(stamp).data(data); + using T = autoware_internal_debug_msgs::msg::Float32Stamped; + return autoware_internal_debug_msgs::build().stamp(stamp).data(data); } -tier4_debug_msgs::msg::Int32Stamped make_int32_stamped( +autoware_internal_debug_msgs::msg::Int32Stamped make_int32_stamped( const builtin_interfaces::msg::Time & stamp, const int32_t data) { - using T = tier4_debug_msgs::msg::Int32Stamped; - return tier4_debug_msgs::build().stamp(stamp).data(data); + using T = autoware_internal_debug_msgs::msg::Int32Stamped; + return autoware_internal_debug_msgs::build().stamp(stamp).data(data); } std::array rotate_covariance( @@ -158,31 +158,34 @@ NDTScanMatcher::NDTScanMatcher(const rclcpp::NodeOptions & options) multi_ndt_pose_pub_ = this->create_publisher("multi_ndt_pose", 10); multi_initial_pose_pub_ = this->create_publisher("multi_initial_pose", 10); - exe_time_pub_ = this->create_publisher("exe_time_ms", 10); + exe_time_pub_ = + this->create_publisher("exe_time_ms", 10); transform_probability_pub_ = - this->create_publisher("transform_probability", 10); + this->create_publisher( + "transform_probability", 10); nearest_voxel_transformation_likelihood_pub_ = - this->create_publisher( + this->create_publisher( "nearest_voxel_transformation_likelihood", 10); voxel_score_points_pub_ = this->create_publisher("voxel_score_points", 10); no_ground_transform_probability_pub_ = - this->create_publisher( + this->create_publisher( "no_ground_transform_probability", 10); no_ground_nearest_voxel_transformation_likelihood_pub_ = - this->create_publisher( + this->create_publisher( "no_ground_nearest_voxel_transformation_likelihood", 10); iteration_num_pub_ = - this->create_publisher("iteration_num", 10); + this->create_publisher("iteration_num", 10); initial_to_result_relative_pose_pub_ = this->create_publisher("initial_to_result_relative_pose", 10); initial_to_result_distance_pub_ = - this->create_publisher("initial_to_result_distance", 10); + this->create_publisher( + "initial_to_result_distance", 10); initial_to_result_distance_old_pub_ = - this->create_publisher( + this->create_publisher( "initial_to_result_distance_old", 10); initial_to_result_distance_new_pub_ = - this->create_publisher( + this->create_publisher( "initial_to_result_distance_new", 10); ndt_marker_pub_ = this->create_publisher("ndt_marker", 10); ndt_monte_carlo_initial_pose_marker_pub_ = From 22ca70398f7785af65446ee6a363b476c0fe72bd Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:57:04 +0900 Subject: [PATCH 054/127] feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in fies localization/autoware_ekf_localizer (#9860) Signed-off-by: vish0012 Co-authored-by: SakodaShintaro --- localization/autoware_ekf_localizer/README.md | 22 +++++++++---------- .../autoware/ekf_localizer/ekf_localizer.hpp | 9 ++++---- .../autoware_ekf_localizer/package.xml | 2 +- .../src/ekf_localizer.cpp | 16 ++++++++------ 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/localization/autoware_ekf_localizer/README.md b/localization/autoware_ekf_localizer/README.md index 802bf7dbb16c3..a46ea7181315f 100644 --- a/localization/autoware_ekf_localizer/README.md +++ b/localization/autoware_ekf_localizer/README.md @@ -44,17 +44,17 @@ This package includes the following features: ### Published Topics -| Name | Type | Description | -| --------------------------------- | ------------------------------------------------ | ----------------------------------------------------- | -| `ekf_odom` | `nav_msgs::msg::Odometry` | Estimated odometry. | -| `ekf_pose` | `geometry_msgs::msg::PoseStamped` | Estimated pose. | -| `ekf_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | Estimated pose with covariance. | -| `ekf_biased_pose` | `geometry_msgs::msg::PoseStamped` | Estimated pose including the yaw bias | -| `ekf_biased_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | Estimated pose with covariance including the yaw bias | -| `ekf_twist` | `geometry_msgs::msg::TwistStamped` | Estimated twist. | -| `ekf_twist_with_covariance` | `geometry_msgs::msg::TwistWithCovarianceStamped` | The estimated twist with covariance. | -| `diagnostics` | `diagnostics_msgs::msg::DiagnosticArray` | The diagnostic information. | -| `debug/processing_time_ms` | `tier4_debug_msgs::msg::Float64Stamped` | The processing time [ms]. | +| Name | Type | Description | +| --------------------------------- | --------------------------------------------------- | ----------------------------------------------------- | +| `ekf_odom` | `nav_msgs::msg::Odometry` | Estimated odometry. | +| `ekf_pose` | `geometry_msgs::msg::PoseStamped` | Estimated pose. | +| `ekf_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | Estimated pose with covariance. | +| `ekf_biased_pose` | `geometry_msgs::msg::PoseStamped` | Estimated pose including the yaw bias | +| `ekf_biased_pose_with_covariance` | `geometry_msgs::msg::PoseWithCovarianceStamped` | Estimated pose with covariance including the yaw bias | +| `ekf_twist` | `geometry_msgs::msg::TwistStamped` | Estimated twist. | +| `ekf_twist_with_covariance` | `geometry_msgs::msg::TwistWithCovarianceStamped` | The estimated twist with covariance. | +| `diagnostics` | `diagnostics_msgs::msg::DiagnosticArray` | The diagnostic information. | +| `debug/processing_time_ms` | `autoware_internal_debug_msgs::msg::Float64Stamped` | The processing time [ms]. | ### Published TF diff --git a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp index 0561e250298ac..84018c043cc14 100644 --- a/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp +++ b/localization/autoware_ekf_localizer/include/autoware/ekf_localizer/ekf_localizer.hpp @@ -25,6 +25,8 @@ #include #include +#include +#include #include #include #include @@ -34,8 +36,6 @@ #include #include #include -#include -#include #include #include @@ -78,7 +78,7 @@ class EKFLocalizer : public rclcpp::Node //!< @brief ekf estimated twist with covariance publisher rclcpp::Publisher::SharedPtr pub_twist_cov_; //!< @brief ekf estimated yaw bias publisher - rclcpp::Publisher::SharedPtr pub_yaw_bias_; + rclcpp::Publisher::SharedPtr pub_yaw_bias_; //!< @brief ekf estimated yaw bias publisher rclcpp::Publisher::SharedPtr pub_biased_pose_; //!< @brief ekf estimated yaw bias publisher @@ -86,7 +86,8 @@ class EKFLocalizer : public rclcpp::Node //!< @brief diagnostics publisher rclcpp::Publisher::SharedPtr pub_diag_; //!< @brief processing_time publisher - rclcpp::Publisher::SharedPtr pub_processing_time_; + rclcpp::Publisher::SharedPtr + pub_processing_time_; //!< @brief initial pose subscriber rclcpp::Subscription::SharedPtr sub_initialpose_; //!< @brief measurement pose with covariance subscriber diff --git a/localization/autoware_ekf_localizer/package.xml b/localization/autoware_ekf_localizer/package.xml index 8dc3cc9844c50..e0e37f59d1acb 100644 --- a/localization/autoware_ekf_localizer/package.xml +++ b/localization/autoware_ekf_localizer/package.xml @@ -22,6 +22,7 @@ eigen + autoware_internal_debug_msgs autoware_kalman_filter autoware_localization_util autoware_universe_utils @@ -34,7 +35,6 @@ std_srvs tf2 tf2_ros - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/localization/autoware_ekf_localizer/src/ekf_localizer.cpp b/localization/autoware_ekf_localizer/src/ekf_localizer.cpp index 11d7788adfade..5638a5416e6ab 100644 --- a/localization/autoware_ekf_localizer/src/ekf_localizer.cpp +++ b/localization/autoware_ekf_localizer/src/ekf_localizer.cpp @@ -70,13 +70,14 @@ EKFLocalizer::EKFLocalizer(const rclcpp::NodeOptions & node_options) pub_twist_ = create_publisher("ekf_twist", 1); pub_twist_cov_ = create_publisher( "ekf_twist_with_covariance", 1); - pub_yaw_bias_ = create_publisher("estimated_yaw_bias", 1); + pub_yaw_bias_ = + create_publisher("estimated_yaw_bias", 1); pub_biased_pose_ = create_publisher("ekf_biased_pose", 1); pub_biased_pose_cov_ = create_publisher( "ekf_biased_pose_with_covariance", 1); pub_diag_ = this->create_publisher("/diagnostics", 10); - pub_processing_time_ = - create_publisher("debug/processing_time_ms", 1); + pub_processing_time_ = create_publisher( + "debug/processing_time_ms", 1); sub_initialpose_ = create_subscription( "initialpose", 1, std::bind(&EKFLocalizer::callback_initial_pose, this, _1)); sub_pose_with_cov_ = create_subscription( @@ -235,9 +236,10 @@ void EKFLocalizer::timer_callback() /* publish processing time */ const double elapsed_time = stop_watch_timer_cb_.toc(); - pub_processing_time_->publish(tier4_debug_msgs::build() - .stamp(current_time) - .data(elapsed_time)); + pub_processing_time_->publish( + autoware_internal_debug_msgs::build() + .stamp(current_time) + .data(elapsed_time)); } /* @@ -343,7 +345,7 @@ void EKFLocalizer::publish_estimate_result( pub_twist_cov_->publish(twist_cov); /* publish yaw bias */ - tier4_debug_msgs::msg::Float64Stamped yawb; + autoware_internal_debug_msgs::msg::Float64Stamped yawb; yawb.stamp = current_ekf_twist.header.stamp; yawb.data = ekf_module_->get_yaw_bias(); pub_yaw_bias_->publish(yawb); From bb66275f29f829dd02a729de0df7fda8deb0884b Mon Sep 17 00:00:00 2001 From: Ryuta Kambe Date: Thu, 9 Jan 2025 16:27:44 +0900 Subject: [PATCH 055/127] ci(cppcheck): ignore benchmarks directories for cppcheck (#9842) Signed-off-by: veqcc --- .cppcheck_suppressions | 1 + 1 file changed, 1 insertion(+) diff --git a/.cppcheck_suppressions b/.cppcheck_suppressions index ab267ec3ac007..4119e69ed72e1 100644 --- a/.cppcheck_suppressions +++ b/.cppcheck_suppressions @@ -1,5 +1,6 @@ *:*/test/* *:*/examples/* +*:*/benchmarks/* checkersReport missingInclude From c8ee48bd6828ba0b7352250541425e66aa96f2b3 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 9 Jan 2025 20:38:17 +0900 Subject: [PATCH 056/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9880)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_detection_by_tracker Signed-off-by: vish0012 Co-authored-by: Taekjin LEE --- .../autoware_detection_by_tracker/src/debugger/debugger.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perception/autoware_detection_by_tracker/src/debugger/debugger.hpp b/perception/autoware_detection_by_tracker/src/debugger/debugger.hpp index 39dd3db10cfa9..8bd1deba35ccb 100644 --- a/perception/autoware_detection_by_tracker/src/debugger/debugger.hpp +++ b/perception/autoware_detection_by_tracker/src/debugger/debugger.hpp @@ -89,9 +89,9 @@ class Debugger void startMeasureProcessingTime() { stop_watch_ptr_->tic("processing_time"); } void publishProcessingTime() { - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/cyclic_time_ms", stop_watch_ptr_->toc("cyclic_time", true)); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_time_ms", stop_watch_ptr_->toc("processing_time", true)); } From 56ff9b8de27e050787f9b2fe610f5df1348c4a03 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:49:20 +0900 Subject: [PATCH 057/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9858)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files evaluator/autoware_control_evaluator Signed-off-by: vish0012 --- .../autoware/control_evaluator/control_evaluator_node.hpp | 5 +++-- .../src/control_evaluator_node.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/evaluator/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp b/evaluator/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp index c510b2ea46779..9606dea577bd0 100644 --- a/evaluator/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp +++ b/evaluator/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp @@ -25,9 +25,9 @@ #include #include "geometry_msgs/msg/accel_with_covariance_stamped.hpp" +#include #include #include -#include #include #include @@ -85,7 +85,8 @@ class ControlEvaluatorNode : public rclcpp::Node LaneletMapBin, autoware::universe_utils::polling_policy::Newest> vector_map_subscriber_{this, "~/input/vector_map", rclcpp::QoS{1}.transient_local()}; - rclcpp::Publisher::SharedPtr processing_time_pub_; + rclcpp::Publisher::SharedPtr + processing_time_pub_; rclcpp::Publisher::SharedPtr metrics_pub_; // update Route Handler diff --git a/evaluator/autoware_control_evaluator/src/control_evaluator_node.cpp b/evaluator/autoware_control_evaluator/src/control_evaluator_node.cpp index b0db41b0fdc73..79e89423af6dd 100644 --- a/evaluator/autoware_control_evaluator/src/control_evaluator_node.cpp +++ b/evaluator/autoware_control_evaluator/src/control_evaluator_node.cpp @@ -34,8 +34,8 @@ ControlEvaluatorNode::ControlEvaluatorNode(const rclcpp::NodeOptions & node_opti using std::placeholders::_1; // Publisher - processing_time_pub_ = - this->create_publisher("~/debug/processing_time_ms", 1); + processing_time_pub_ = this->create_publisher( + "~/debug/processing_time_ms", 1); metrics_pub_ = create_publisher("~/metrics", 1); // Parameters @@ -288,7 +288,7 @@ void ControlEvaluatorNode::onTimer() metrics_msg_ = MetricArrayMsg{}; // Publish processing time - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); processing_time_pub_->publish(processing_time_msg); From 6fe89228f731af6f97541de0f3b163752a5baefc Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:49:37 +0900 Subject: [PATCH 058/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9857)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files control/control_performance_analysis Signed-off-by: vish0012 --- control/control_performance_analysis/package.xml | 2 +- .../scripts/control_performance_plot.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/control/control_performance_analysis/package.xml b/control/control_performance_analysis/package.xml index 9c2ef69e0137b..f2630a7d47f62 100644 --- a/control/control_performance_analysis/package.xml +++ b/control/control_performance_analysis/package.xml @@ -25,6 +25,7 @@ builtin_interfaces autoware_control_msgs + autoware_internal_debug_msgs autoware_motion_utils autoware_planning_msgs autoware_signal_processing @@ -41,7 +42,6 @@ tf2 tf2_eigen tf2_ros - tier4_debug_msgs autoware_global_parameter_loader builtin_interfaces rosidl_default_runtime diff --git a/control/control_performance_analysis/scripts/control_performance_plot.py b/control/control_performance_analysis/scripts/control_performance_plot.py index c5e5cabd5b059..d4a6038465e12 100644 --- a/control/control_performance_analysis/scripts/control_performance_plot.py +++ b/control/control_performance_analysis/scripts/control_performance_plot.py @@ -17,13 +17,13 @@ import argparse import math +from autoware_internal_debug_msgs.msg import BoolStamped from control_performance_analysis.msg import DrivingMonitorStamped from control_performance_analysis.msg import ErrorStamped import matplotlib.pyplot as plt from nav_msgs.msg import Odometry import rclpy from rclpy.node import Node -from tier4_debug_msgs.msg import BoolStamped parser = argparse.ArgumentParser() parser.add_argument("-i", "--interval", help="interval distance to plot") From 4d0a86f10df9462696a1955511f882042914db5d Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:50:28 +0900 Subject: [PATCH 059/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fmsgs=20in=20files=20con=E2=80=A6?= =?UTF-8?q?=20(#9852)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_msgs in files control/autoware_trajectory_follower_base Signed-off-by: vish0012 --- control/autoware_trajectory_follower_base/package.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control/autoware_trajectory_follower_base/package.xml b/control/autoware_trajectory_follower_base/package.xml index e7b00e4b19cdc..195c077835910 100644 --- a/control/autoware_trajectory_follower_base/package.xml +++ b/control/autoware_trajectory_follower_base/package.xml @@ -21,6 +21,7 @@ autoware_adapi_v1_msgs autoware_control_msgs + autoware_internal_debug_msgs autoware_interpolation autoware_motion_utils autoware_osqp_interface @@ -37,7 +38,6 @@ std_msgs tf2 tf2_ros - tier4_debug_msgs ament_cmake_ros ament_lint_auto From 926ad7f3d6d1e0a6c689ce6e2a1a104d850913e3 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:52:15 +0900 Subject: [PATCH 060/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9848)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files control/autoware_pid_longitudinal_controller Signed-off-by: vish0012 --- .../pid_longitudinal_controller.hpp | 8 +++++--- control/autoware_pid_longitudinal_controller/package.xml | 2 +- .../src/pid_longitudinal_controller.cpp | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/pid_longitudinal_controller.hpp b/control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/pid_longitudinal_controller.hpp index 1d03d1b339af6..db5fa09b5eeee 100644 --- a/control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/pid_longitudinal_controller.hpp +++ b/control/autoware_pid_longitudinal_controller/include/autoware/pid_longitudinal_controller/pid_longitudinal_controller.hpp @@ -34,11 +34,11 @@ #include "autoware_adapi_v1_msgs/msg/operation_mode_state.hpp" #include "autoware_control_msgs/msg/longitudinal.hpp" +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" #include "autoware_planning_msgs/msg/trajectory.hpp" #include "geometry_msgs/msg/pose_stamped.hpp" #include "nav_msgs/msg/odometry.hpp" #include "tf2_msgs/msg/tf_message.hpp" -#include "tier4_debug_msgs/msg/float32_multi_array_stamped.hpp" #include "visualization_msgs/msg/marker.hpp" #include @@ -98,8 +98,10 @@ class PidLongitudinalController : public trajectory_follower::LongitudinalContro rclcpp::Clock::SharedPtr clock_; rclcpp::Logger logger_; // ros variables - rclcpp::Publisher::SharedPtr m_pub_slope; - rclcpp::Publisher::SharedPtr m_pub_debug; + rclcpp::Publisher::SharedPtr + m_pub_slope; + rclcpp::Publisher::SharedPtr + m_pub_debug; rclcpp::Publisher::SharedPtr m_pub_virtual_wall_marker; rclcpp::Node::OnSetParametersCallbackHandle::SharedPtr m_set_param_res; diff --git a/control/autoware_pid_longitudinal_controller/package.xml b/control/autoware_pid_longitudinal_controller/package.xml index 67e95a9d4c0ac..127ce8e76d69d 100644 --- a/control/autoware_pid_longitudinal_controller/package.xml +++ b/control/autoware_pid_longitudinal_controller/package.xml @@ -21,6 +21,7 @@ autoware_adapi_v1_msgs autoware_control_msgs + autoware_internal_debug_msgs autoware_interpolation autoware_motion_utils autoware_planning_msgs @@ -37,7 +38,6 @@ std_msgs tf2 tf2_ros - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/control/autoware_pid_longitudinal_controller/src/pid_longitudinal_controller.cpp b/control/autoware_pid_longitudinal_controller/src/pid_longitudinal_controller.cpp index ec95ce656fa6f..c87e936de3e40 100644 --- a/control/autoware_pid_longitudinal_controller/src/pid_longitudinal_controller.cpp +++ b/control/autoware_pid_longitudinal_controller/src/pid_longitudinal_controller.cpp @@ -214,9 +214,9 @@ PidLongitudinalController::PidLongitudinalController( : node.declare_parameter("ego_nearest_yaw_threshold"); // [rad] // subscriber, publisher - m_pub_slope = node.create_publisher( + m_pub_slope = node.create_publisher( "~/output/slope_angle", rclcpp::QoS{1}); - m_pub_debug = node.create_publisher( + m_pub_debug = node.create_publisher( "~/output/longitudinal_diagnostic", rclcpp::QoS{1}); m_pub_virtual_wall_marker = node.create_publisher("~/virtual_wall", 1); @@ -931,7 +931,7 @@ void PidLongitudinalController::publishDebugData( m_debug_values.setValues(DebugValues::TYPE::ACC_CMD_PUBLISHED, ctrl_cmd.acc); // publish debug values - tier4_debug_msgs::msg::Float32MultiArrayStamped debug_msg{}; + autoware_internal_debug_msgs::msg::Float32MultiArrayStamped debug_msg{}; debug_msg.stamp = clock_->now(); for (const auto & v : m_debug_values.getValues()) { debug_msg.data.push_back(static_cast(v)); @@ -939,7 +939,7 @@ void PidLongitudinalController::publishDebugData( m_pub_debug->publish(debug_msg); // slope angle - tier4_debug_msgs::msg::Float32MultiArrayStamped slope_msg{}; + autoware_internal_debug_msgs::msg::Float32MultiArrayStamped slope_msg{}; slope_msg.stamp = clock_->now(); slope_msg.data.push_back( static_cast(control_data.slope_angle)); From 0b73c13206e4185b0182a8ec11710e7c17959006 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 10 Jan 2025 01:52:55 +0900 Subject: [PATCH 061/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9846)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files ontrol/autoware_mpc_lateral_controller Signed-off-by: vish0012 * style(pre-commit): autofix --------- Signed-off-by: vish0012 Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../lane_departure_checker_node.hpp | 5 +++-- control/autoware_lane_departure_checker/package.xml | 2 +- .../lane_departure_checker_node.cpp | 12 +++++++----- .../include/autoware/mpc_lateral_controller/mpc.hpp | 4 ++-- .../mpc_lateral_controller.hpp | 8 ++++---- control/autoware_mpc_lateral_controller/package.xml | 2 +- .../test/test_mpc.cpp | 4 ++-- 7 files changed, 20 insertions(+), 17 deletions(-) diff --git a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp index 7e2229d7b5754..4d99b1a134b3a 100644 --- a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp +++ b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include #include #include @@ -115,7 +115,8 @@ class LaneDepartureCheckerNode : public rclcpp::Node autoware::universe_utils::DebugPublisher debug_publisher_{this, "~/debug"}; autoware::universe_utils::ProcessingTimePublisher processing_diag_publisher_{ this, "~/debug/processing_time_ms_diag"}; - rclcpp::Publisher::SharedPtr processing_time_publisher_; + rclcpp::Publisher::SharedPtr + processing_time_publisher_; // Timer rclcpp::TimerBase::SharedPtr timer_; diff --git a/control/autoware_lane_departure_checker/package.xml b/control/autoware_lane_departure_checker/package.xml index 2689b4a4dbcb7..97ad5eaf82e00 100644 --- a/control/autoware_lane_departure_checker/package.xml +++ b/control/autoware_lane_departure_checker/package.xml @@ -14,6 +14,7 @@ autoware_cmake autoware_adapi_v1_msgs + autoware_internal_debug_msgs autoware_lanelet2_extension autoware_map_msgs autoware_motion_utils @@ -32,7 +33,6 @@ tf2_eigen tf2_geometry_msgs tf2_ros - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp index 366b84a1f6131..d9775415d3ed3 100644 --- a/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp +++ b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp @@ -171,7 +171,8 @@ LaneDepartureCheckerNode::LaneDepartureCheckerNode(const rclcpp::NodeOptions & o // Publisher processing_time_publisher_ = - this->create_publisher("~/debug/processing_time_ms", 1); + this->create_publisher( + "~/debug/processing_time_ms", 1); // Nothing // Diagnostic Updater @@ -342,10 +343,11 @@ void LaneDepartureCheckerNode::onTimer() { const auto & deviation = output_.trajectory_deviation; - debug_publisher_.publish( + debug_publisher_.publish( "deviation/lateral", deviation.lateral); - debug_publisher_.publish("deviation/yaw", deviation.yaw); - debug_publisher_.publish( + debug_publisher_.publish( + "deviation/yaw", deviation.yaw); + debug_publisher_.publish( "deviation/yaw_deg", rad2deg(deviation.yaw)); } processing_time_map["Node: publishTrajectoryDeviation"] = stop_watch.toc(true); @@ -361,7 +363,7 @@ void LaneDepartureCheckerNode::onTimer() processing_time_map["Total"] = stop_watch.toc("Total"); processing_diag_publisher_.publish(processing_time_map); - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = processing_time_map["Total"]; processing_time_publisher_->publish(processing_time_msg); diff --git a/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc.hpp b/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc.hpp index 4c8d5df2c22a7..166dfa1814562 100644 --- a/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc.hpp +++ b/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc.hpp @@ -24,11 +24,11 @@ #include "rclcpp/rclcpp.hpp" #include "autoware_control_msgs/msg/lateral.hpp" +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" #include "autoware_planning_msgs/msg/trajectory.hpp" #include "autoware_vehicle_msgs/msg/steering_report.hpp" #include "geometry_msgs/msg/pose.hpp" #include "nav_msgs/msg/odometry.hpp" -#include "tier4_debug_msgs/msg/float32_multi_array_stamped.hpp" #include #include @@ -41,11 +41,11 @@ namespace autoware::motion::control::mpc_lateral_controller using autoware::motion::control::trajectory_follower::LateralHorizon; using autoware_control_msgs::msg::Lateral; +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; using autoware_planning_msgs::msg::Trajectory; using autoware_vehicle_msgs::msg::SteeringReport; using geometry_msgs::msg::Pose; using nav_msgs::msg::Odometry; -using tier4_debug_msgs::msg::Float32MultiArrayStamped; using Eigen::MatrixXd; using Eigen::VectorXd; diff --git a/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc_lateral_controller.hpp b/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc_lateral_controller.hpp index d7442f64b028a..0f3004775e5bd 100644 --- a/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc_lateral_controller.hpp +++ b/control/autoware_mpc_lateral_controller/include/autoware/mpc_lateral_controller/mpc_lateral_controller.hpp @@ -26,13 +26,13 @@ #include #include "autoware_control_msgs/msg/lateral.hpp" +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" +#include "autoware_internal_debug_msgs/msg/float32_stamped.hpp" #include "autoware_planning_msgs/msg/trajectory.hpp" #include "autoware_vehicle_msgs/msg/steering_report.hpp" #include "geometry_msgs/msg/pose.hpp" #include "geometry_msgs/msg/pose_stamped.hpp" #include "nav_msgs/msg/odometry.hpp" -#include "tier4_debug_msgs/msg/float32_multi_array_stamped.hpp" -#include "tier4_debug_msgs/msg/float32_stamped.hpp" #include #include @@ -45,11 +45,11 @@ namespace autoware::motion::control::mpc_lateral_controller namespace trajectory_follower = ::autoware::motion::control::trajectory_follower; using autoware_control_msgs::msg::Lateral; +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; +using autoware_internal_debug_msgs::msg::Float32Stamped; using autoware_planning_msgs::msg::Trajectory; using autoware_vehicle_msgs::msg::SteeringReport; using nav_msgs::msg::Odometry; -using tier4_debug_msgs::msg::Float32MultiArrayStamped; -using tier4_debug_msgs::msg::Float32Stamped; using trajectory_follower::LateralHorizon; class MpcLateralController : public trajectory_follower::LateralControllerBase diff --git a/control/autoware_mpc_lateral_controller/package.xml b/control/autoware_mpc_lateral_controller/package.xml index b450af05ea0e1..719d11ef7948b 100644 --- a/control/autoware_mpc_lateral_controller/package.xml +++ b/control/autoware_mpc_lateral_controller/package.xml @@ -19,6 +19,7 @@ autoware_cmake autoware_control_msgs + autoware_internal_debug_msgs autoware_interpolation autoware_motion_utils autoware_osqp_interface @@ -36,7 +37,6 @@ std_msgs tf2 tf2_ros - tier4_debug_msgs ament_cmake_ros ament_lint_auto diff --git a/control/autoware_mpc_lateral_controller/test/test_mpc.cpp b/control/autoware_mpc_lateral_controller/test/test_mpc.cpp index 9c30369305f6e..0a34302f8f60c 100644 --- a/control/autoware_mpc_lateral_controller/test/test_mpc.cpp +++ b/control/autoware_mpc_lateral_controller/test/test_mpc.cpp @@ -24,11 +24,11 @@ #include #include "autoware_control_msgs/msg/lateral.hpp" +#include "autoware_internal_debug_msgs/msg/float32_multi_array_stamped.hpp" #include "autoware_planning_msgs/msg/trajectory.hpp" #include "autoware_planning_msgs/msg/trajectory_point.hpp" #include "autoware_vehicle_msgs/msg/steering_report.hpp" #include "geometry_msgs/msg/pose.hpp" -#include "tier4_debug_msgs/msg/float32_multi_array_stamped.hpp" #ifdef ROS_DISTRO_GALACTIC #include "tf2_geometry_msgs/tf2_geometry_msgs.h" @@ -45,12 +45,12 @@ namespace autoware::motion::control::mpc_lateral_controller using autoware::motion::control::trajectory_follower::LateralHorizon; using autoware_control_msgs::msg::Lateral; +using autoware_internal_debug_msgs::msg::Float32MultiArrayStamped; using autoware_planning_msgs::msg::Trajectory; using autoware_planning_msgs::msg::TrajectoryPoint; using autoware_vehicle_msgs::msg::SteeringReport; 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) { From 4dc720114dab3d07989b365bdd64be84bf5f4b60 Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:20:00 +0900 Subject: [PATCH 062/127] refactor(lane_change): refactor transit failure function (#9835) * refactor(lane_change): refactor transit failure function Signed-off-by: Zulfaqar Azmi * fixed failed scenario Signed-off-by: Zulfaqar Azmi * remove is abort from debug Signed-off-by: Zulfaqar Azmi * set is abort state Signed-off-by: Zulfaqar Azmi * add comments for clarity Signed-off-by: Zulfaqar Azmi * include what you use. Signed-off-by: Zulfaqar Azmi --------- Signed-off-by: Zulfaqar Azmi --- .../interface.hpp | 5 + .../structs/data.hpp | 1 + .../structs/debug.hpp | 8 +- .../utils/markers.hpp | 8 +- .../src/interface.cpp | 154 ++++++++---------- .../src/scene.cpp | 19 +-- .../src/utils/markers.cpp | 41 +++-- 7 files changed, 111 insertions(+), 125 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp index a69ae0d92647a..4b97fb0d069a0 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp @@ -35,6 +35,7 @@ #include #include #include +#include namespace autoware::behavior_path_planner { @@ -120,6 +121,8 @@ class LaneChangeInterface : public SceneModuleInterface } } + std::pair check_transit_failure(); + void updateDebugMarker() const; void updateSteeringFactorPtr(const BehaviorModuleOutput & output); @@ -134,6 +137,8 @@ class LaneChangeInterface : public SceneModuleInterface bool is_abort_path_approved_{false}; bool is_abort_approval_requested_{false}; + + lane_change::InterfaceDebug interface_debug_; }; } // namespace autoware::behavior_path_planner diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp index d5bbfe25fe1e9..9e6b9d229d2f2 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp @@ -48,6 +48,7 @@ enum class States { Cancel, Abort, Stop, + Warning, }; struct PhaseInfo diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp index 90b13f86976b2..1541846841f20 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp @@ -58,7 +58,6 @@ struct Debug double distance_to_abort_finished{std::numeric_limits::max()}; bool is_able_to_return_to_current_lane{true}; bool is_stuck{false}; - bool is_abort{false}; void reset() { @@ -83,9 +82,14 @@ struct Debug distance_to_abort_finished = std::numeric_limits::max(); is_able_to_return_to_current_lane = true; is_stuck = false; - is_abort = false; } }; + +struct InterfaceDebug +{ + std::string_view failing_reason; + LaneChangeStates lc_state; +}; } // namespace autoware::behavior_path_planner::lane_change #endif // AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__STRUCTS__DEBUG_HPP_ diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/markers.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/markers.hpp index 059db8e38300f..a9ea35cb9b83e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/markers.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/markers.hpp @@ -32,6 +32,7 @@ namespace marker_utils::lane_change_markers using autoware::behavior_path_planner::FilteredLanesObjects; using autoware::behavior_path_planner::LaneChangePath; using autoware::behavior_path_planner::lane_change::Debug; +using autoware::behavior_path_planner::lane_change::InterfaceDebug; using autoware::behavior_path_planner::utils::path_safety_checker::ExtendedPredictedObjects; using visualization_msgs::msg::MarkerArray; MarkerArray showAllValidLaneChangePath( @@ -42,9 +43,12 @@ MarkerArray createLaneChangingVirtualWallMarker( MarkerArray showFilteredObjects( const FilteredLanesObjects & filtered_objects, const std::string & ns); MarkerArray createExecutionArea(const geometry_msgs::msg::Polygon & execution_area); -MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose); +MarkerArray showExecutionInfo( + const InterfaceDebug & interface_debug_data, const Debug & scene_debug_data, + const geometry_msgs::msg::Pose & ego_pose); MarkerArray createDebugMarkerArray( - const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose); + const InterfaceDebug & interface_debug_data, const Debug & scene_debug_data, + const geometry_msgs::msg::Pose & ego_pose); } // namespace marker_utils::lane_change_markers #endif // AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__MARKERS_HPP_ diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp index 9f3c6c9ef48bf..ebcd4eb4809fc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp @@ -139,9 +139,8 @@ BehaviorModuleOutput LaneChangeInterface::plan() const auto force_activated = std::any_of( rtc_interface_ptr_map_.begin(), rtc_interface_ptr_map_.end(), [&](const auto & rtc) { return rtc.second->isForceActivated(uuid_map_.at(rtc.first)); }); - const bool safe = force_activated ? false : true; updateRTCStatus( - path.start_distance_to_path_change, path.finish_distance_to_path_change, safe, + path.start_distance_to_path_change, path.finish_distance_to_path_change, !force_activated, State::RUNNING); } } @@ -220,9 +219,7 @@ bool LaneChangeInterface::canTransitSuccessState() if (module_type_->specialExpiredCheck() && isWaitingApproval()) { log_debug_throttled("Run specialExpiredCheck."); - if (isWaitingApproval()) { - return true; - } + return true; } if (module_type_->hasFinishedLaneChange()) { @@ -237,13 +234,6 @@ bool LaneChangeInterface::canTransitSuccessState() bool LaneChangeInterface::canTransitFailureState() { - auto log_debug_throttled = [&](std::string_view message) -> void { - RCLCPP_DEBUG(getLogger(), "%s", message.data()); - }; - - updateDebugMarker(); - log_debug_throttled(__func__); - const auto force_activated = std::any_of( rtc_interface_ptr_map_.begin(), rtc_interface_ptr_map_.end(), [&](const auto & rtc) { return rtc.second->isForceActivated(uuid_map_.at(rtc.first)); }); @@ -253,121 +243,106 @@ bool LaneChangeInterface::canTransitFailureState() return false; } - if (module_type_->isAbortState() && !module_type_->hasFinishedAbort()) { - log_debug_throttled("Abort process has on going."); - return false; - } + const auto [state, reason] = check_transit_failure(); - if (isWaitingApproval()) { - if (module_type_->is_near_regulatory_element()) { - log_debug_throttled("Ego is close to regulatory element. Cancel lane change"); - updateRTCStatus( - std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, - State::FAILED); - return true; - } - log_debug_throttled("Can't transit to failure state. Module is WAITING_FOR_APPROVAL"); - return false; - } + interface_debug_.failing_reason = reason; + interface_debug_.lc_state = state; - if (!module_type_->isValidPath()) { - log_debug_throttled("Transit to failure state due not to find valid path"); + updateDebugMarker(); + + if (state == LaneChangeStates::Cancel) { updateRTCStatus( std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, State::FAILED); + module_type_->toCancelState(); return true; } - if (module_type_->isAbortState() && module_type_->hasFinishedAbort()) { - log_debug_throttled("Abort process has completed."); - updateRTCStatus( - std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, - State::FAILED); - return true; + if (state == LaneChangeStates::Abort) { + module_type_->toAbortState(); + return false; } - if (module_type_->is_near_terminal()) { - log_debug_throttled("Unsafe, but ego is approaching terminal. Continue lane change"); + // Note: Ideally, if it is unsafe, but for some reason, we can't abort or cancel, then we should + // stop. Note: This feature is not working properly for now. + const auto [is_safe, unsafe_trailing_obj] = post_process_safety_status_; + if (!is_safe && module_type_->isRequiredStop(unsafe_trailing_obj)) { + module_type_->toStopState(); + return false; + } + + module_type_->toNormalState(); + return false; +} - if (module_type_->isRequiredStop(post_process_safety_status_.is_trailing_object)) { - log_debug_throttled("Module require stopping"); +std::pair LaneChangeInterface::check_transit_failure() +{ + if (module_type_->isAbortState()) { + if (module_type_->hasFinishedAbort()) { + return {LaneChangeStates::Cancel, "Aborted"}; } - return false; + return {LaneChangeStates::Abort, "Aborting"}; } - if (module_type_->isCancelEnabled() && module_type_->isEgoOnPreparePhase()) { - if (module_type_->isStoppedAtRedTrafficLight()) { - log_debug_throttled("Stopping at traffic light while in prepare phase. Cancel lane change"); - module_type_->toCancelState(); - updateRTCStatus( - std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, - State::FAILED); - return true; + if (isWaitingApproval()) { + if (module_type_->is_near_regulatory_element()) { + return {LaneChangeStates::Cancel, "CloseToRegElement"}; } + return {LaneChangeStates::Normal, "WaitingForApproval"}; + } + if (!module_type_->isValidPath()) { + return {LaneChangeStates::Cancel, "InvalidPath"}; + } + + const auto is_preparing = module_type_->isEgoOnPreparePhase(); + const auto can_return_to_current = module_type_->isAbleToReturnCurrentLane(); + + // regardless of safe and unsafe, we want to cancel lane change. + if (is_preparing) { const auto force_deactivated = std::any_of( rtc_interface_ptr_map_.begin(), rtc_interface_ptr_map_.end(), [&](const auto & rtc) { return rtc.second->isForceDeactivated(uuid_map_.at(rtc.first)); }); - if (force_deactivated && module_type_->isAbleToReturnCurrentLane()) { - log_debug_throttled("Cancel lane change due to force deactivation"); - module_type_->toCancelState(); - updateRTCStatus( - std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, - State::FAILED); - return true; - } - - if (post_process_safety_status_.is_safe) { - log_debug_throttled("Can't transit to failure state. Ego is on prepare, and it's safe."); - return false; - } - - if (module_type_->isAbleToReturnCurrentLane()) { - log_debug_throttled("It's possible to return to current lane. Cancel lane change."); - updateRTCStatus( - std::numeric_limits::lowest(), std::numeric_limits::lowest(), true, - State::FAILED); - return true; + if (force_deactivated && can_return_to_current) { + return {LaneChangeStates::Cancel, "ForceDeactivation"}; } } if (post_process_safety_status_.is_safe) { - log_debug_throttled("Can't transit to failure state. Ego is lane changing, and it's safe."); - return false; + return {LaneChangeStates::Normal, "SafeToLaneChange"}; } - if (module_type_->isRequiredStop(post_process_safety_status_.is_trailing_object)) { - log_debug_throttled("Module require stopping"); + if (!module_type_->isCancelEnabled()) { + return {LaneChangeStates::Warning, "CancelDisabled"}; } - if (!module_type_->isCancelEnabled()) { - log_debug_throttled( - "Lane change path is unsafe but cancel was not enabled. Continue lane change."); - return false; + // We also check if the ego can return to the current lane, as prepare segment might be out of the + // lane, for example, during an evasive maneuver around a static object. + if (is_preparing && can_return_to_current) { + return {LaneChangeStates::Cancel, "SafeToCancel"}; + } + + if (module_type_->is_near_terminal()) { + return {LaneChangeStates::Warning, "TooNearTerminal"}; } if (!module_type_->isAbortEnabled()) { - log_debug_throttled( - "Lane change path is unsafe but abort was not enabled. Continue lane change."); - return false; + return {LaneChangeStates::Warning, "AbortDisabled"}; } - if (!module_type_->isAbleToReturnCurrentLane()) { - log_debug_throttled("It's is not possible to return to original lane. Continue lane change."); - return false; + // To prevent the lane module from having to check rear objects in the current lane, we limit the + // abort maneuver to cases where the ego vehicle is still in the current lane. + if (!can_return_to_current) { + return {LaneChangeStates::Warning, "TooLateToAbort"}; } const auto found_abort_path = module_type_->calcAbortPath(); if (!found_abort_path) { - log_debug_throttled( - "Lane change path is unsafe but abort path not found. Continue lane change."); - return false; + return {LaneChangeStates::Warning, "AbortPathNotFound"}; } - log_debug_throttled("Lane change path is unsafe. Abort lane change."); - module_type_->toAbortState(); - return false; + return {LaneChangeStates::Abort, "SafeToAbort"}; } void LaneChangeInterface::updateDebugMarker() const @@ -377,7 +352,8 @@ void LaneChangeInterface::updateDebugMarker() const return; } using marker_utils::lane_change_markers::createDebugMarkerArray; - debug_marker_ = createDebugMarkerArray(module_type_->getDebugData(), module_type_->getEgoPose()); + debug_marker_ = createDebugMarkerArray( + interface_debug_, module_type_->getDebugData(), module_type_->getEgoPose()); } MarkerArray LaneChangeInterface::getModuleVirtualWall() diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 2719239baaed8..09a4216bf5857 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -892,7 +892,6 @@ bool NormalLaneChange::isAbleToStopSafely() const bool NormalLaneChange::hasFinishedAbort() const { if (!abort_path_) { - lane_change_debug_.is_abort = true; return true; } @@ -901,7 +900,6 @@ bool NormalLaneChange::hasFinishedAbort() const lane_change_debug_.distance_to_abort_finished = distance_to_finish; const auto has_finished_abort = distance_to_finish < 0.0; - lane_change_debug_.is_abort = has_finished_abort; return has_finished_abort; } @@ -916,12 +914,7 @@ bool NormalLaneChange::isAbortState() const return false; } - if (!abort_path_) { - return false; - } - - lane_change_debug_.is_abort = true; - return true; + return abort_path_ != nullptr; } int NormalLaneChange::getNumToPreferredLane(const lanelet::ConstLanelet & lane) const @@ -1491,14 +1484,8 @@ bool NormalLaneChange::isValidPath(const PathWithLaneId & path) const bool NormalLaneChange::isRequiredStop(const bool is_trailing_object) { universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); - if ( - common_data_ptr_->transient_data.is_ego_near_current_terminal_start && isAbleToStopSafely() && - is_trailing_object) { - current_lane_change_state_ = LaneChangeStates::Stop; - return true; - } - current_lane_change_state_ = LaneChangeStates::Normal; - return false; + return common_data_ptr_->transient_data.is_ego_near_current_terminal_start && + isAbleToStopSafely() && is_trailing_object; } bool NormalLaneChange::calcAbortPath() diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp index da9ee52b038c6..eb120e006a229 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -164,7 +165,9 @@ MarkerArray showFilteredObjects( return marker_array; } -MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose) +MarkerArray showExecutionInfo( + const InterfaceDebug & interface_debug_data, const Debug & scene_debug_data, + const geometry_msgs::msg::Pose & ego_pose) { auto default_text_marker = [&]() { return createDefaultMarker( @@ -177,11 +180,15 @@ MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg auto safety_check_info_text = default_text_marker(); safety_check_info_text.pose = ego_pose; safety_check_info_text.pose.position.z += 4.0; + const auto lc_state = interface_debug_data.lc_state; + const auto & failing_reason = interface_debug_data.failing_reason; safety_check_info_text.text = fmt::format( - "{stuck} | {return_lane} | {abort}", fmt::arg("stuck", debug_data.is_stuck ? "is stuck" : ""), - fmt::arg("return_lane", debug_data.is_able_to_return_to_current_lane ? "" : "can't return"), - fmt::arg("abort", debug_data.is_abort ? "aborting" : "")); + "{stuck} | {return_lane} | {state} : {reason}", + fmt::arg("stuck", scene_debug_data.is_stuck ? "is stuck" : ""), + fmt::arg( + "return_lane", scene_debug_data.is_able_to_return_to_current_lane ? "" : "can't return"), + fmt::arg("state", magic_enum::enum_name(lc_state)), fmt::arg("reason", failing_reason)); marker_array.markers.push_back(safety_check_info_text); return marker_array; } @@ -227,7 +234,8 @@ MarkerArray ShowLaneChangeMetricsInfo( } MarkerArray createDebugMarkerArray( - const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose) + const InterfaceDebug & interface_debug_data, const Debug & scene_debug_data, + const geometry_msgs::msg::Pose & ego_pose) { using lanelet::visualization::laneletsAsTriangleMarkerArray; using marker_utils::showPolygon; @@ -236,31 +244,32 @@ MarkerArray createDebugMarkerArray( using marker_utils::lane_change_markers::showAllValidLaneChangePath; using marker_utils::lane_change_markers::showFilteredObjects; - const auto & debug_collision_check_object = debug_data.collision_check_objects; + const auto & debug_collision_check_object = scene_debug_data.collision_check_objects; const auto & debug_collision_check_object_after_approval = - debug_data.collision_check_objects_after_approval; - const auto & debug_valid_paths = debug_data.valid_paths; - const auto & debug_filtered_objects = debug_data.filtered_objects; + scene_debug_data.collision_check_objects_after_approval; + const auto & debug_valid_paths = scene_debug_data.valid_paths; + const auto & debug_filtered_objects = scene_debug_data.filtered_objects; MarkerArray debug_marker; const auto add = [&debug_marker](const MarkerArray & added) { autoware::universe_utils::appendMarkerArray(added, &debug_marker); }; - if (!debug_data.execution_area.points.empty()) { + if (!scene_debug_data.execution_area.points.empty()) { add(createPolygonMarkerArray( - debug_data.execution_area, "execution_area", 0, 0.16, 1.0, 0.69, 0.1)); + scene_debug_data.execution_area, "execution_area", 0, 0.16, 1.0, 0.69, 0.1)); } - add(showExecutionInfo(debug_data, ego_pose)); - add(ShowLaneChangeMetricsInfo(debug_data, ego_pose)); + add(showExecutionInfo(interface_debug_data, scene_debug_data, ego_pose)); + add(ShowLaneChangeMetricsInfo(scene_debug_data, ego_pose)); // lanes add(laneletsAsTriangleMarkerArray( - "current_lanes", debug_data.current_lanes, colors::light_yellow(0.2))); - add(laneletsAsTriangleMarkerArray("target_lanes", debug_data.target_lanes, colors::aqua(0.2))); + "current_lanes", scene_debug_data.current_lanes, colors::light_yellow(0.2))); add(laneletsAsTriangleMarkerArray( - "target_backward_lanes", debug_data.target_backward_lanes, colors::blue(0.2))); + "target_lanes", scene_debug_data.target_lanes, colors::aqua(0.2))); + add(laneletsAsTriangleMarkerArray( + "target_backward_lanes", scene_debug_data.target_backward_lanes, colors::blue(0.2))); add(showAllValidLaneChangePath(debug_valid_paths, "lane_change_valid_paths")); add(showFilteredObjects(debug_filtered_objects, "object_filtered")); From 485ccc660cfacc0e939e3019b5cc13c0f25fd9ae Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:05:23 +0900 Subject: [PATCH 063/127] refactor(lane_departure_checker): improve LaneDepartureChecker initialization and parameter handling (#9791) * refactor(lane_departure_checker): improve LaneDepartureChecker initialization and parameter handling Signed-off-by: kyoichi-sugahara --------- Signed-off-by: Kyoichi Sugahara --- .../CMakeLists.txt | 1 + .../lane_departure_checker.hpp | 73 ++------- .../lane_departure_checker_node.hpp | 16 +- .../lane_departure_checker/parameters.hpp | 101 +++++++++++++ .../lane_departure_checker_node.cpp | 35 +---- .../parameters.cpp | 59 ++++++++ .../examples/plot_map_case1.cpp | 7 +- .../examples/plot_map_case2.cpp | 5 +- .../src/goal_planner_module.cpp | 4 +- .../src/start_planner_module.cpp | 6 +- .../test/test_geometric_pull_out.cpp | 138 ++++++------------ .../test/test_shift_pull_out.cpp | 8 +- 12 files changed, 230 insertions(+), 223 deletions(-) create mode 100644 control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/parameters.hpp create mode 100644 control/autoware_lane_departure_checker/src/lane_departure_checker_node/parameters.cpp diff --git a/control/autoware_lane_departure_checker/CMakeLists.txt b/control/autoware_lane_departure_checker/CMakeLists.txt index 199195fc88b08..19046a09922f0 100644 --- a/control/autoware_lane_departure_checker/CMakeLists.txt +++ b/control/autoware_lane_departure_checker/CMakeLists.txt @@ -14,6 +14,7 @@ ament_auto_add_library(autoware_lane_departure_checker SHARED src/lane_departure_checker_node/lane_departure_checker.cpp src/lane_departure_checker_node/lane_departure_checker_node.cpp src/lane_departure_checker_node/utils.cpp + src/lane_departure_checker_node/parameters.cpp ) rclcpp_components_register_node(${PROJECT_NAME} diff --git a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker.hpp b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker.hpp index 1ac984394a25e..101338551cbf3 100644 --- a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker.hpp +++ b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker.hpp @@ -15,15 +15,12 @@ #ifndef AUTOWARE__LANE_DEPARTURE_CHECKER__LANE_DEPARTURE_CHECKER_HPP_ #define AUTOWARE__LANE_DEPARTURE_CHECKER__LANE_DEPARTURE_CHECKER_HPP_ -#include -#include +#include "autoware/lane_departure_checker/parameters.hpp" + #include #include #include -#include -#include -#include #include #include #include @@ -48,81 +45,33 @@ namespace autoware::lane_departure_checker { -using autoware::universe_utils::LinearRing2d; -using autoware::universe_utils::PoseDeviation; using autoware::universe_utils::Segment2d; -using autoware_planning_msgs::msg::LaneletRoute; -using autoware_planning_msgs::msg::Trajectory; -using autoware_planning_msgs::msg::TrajectoryPoint; using tier4_planning_msgs::msg::PathWithLaneId; -using TrajectoryPoints = std::vector; typedef boost::geometry::index::rtree> SegmentRtree; -struct Param -{ - double footprint_margin_scale{0.0}; - double footprint_extra_margin{0.0}; - double resample_interval{0.0}; - double max_deceleration{0.0}; - double delay_time{0.0}; - double max_lateral_deviation{0.0}; - double max_longitudinal_deviation{0.0}; - double max_yaw_deviation_deg{0.0}; - double min_braking_distance{0.0}; - // nearest search to ego - double ego_nearest_dist_threshold{0.0}; - double ego_nearest_yaw_threshold{0.0}; -}; - -struct Input -{ - nav_msgs::msg::Odometry::ConstSharedPtr current_odom{}; - lanelet::LaneletMapPtr lanelet_map{}; - LaneletRoute::ConstSharedPtr route{}; - lanelet::ConstLanelets route_lanelets{}; - lanelet::ConstLanelets shoulder_lanelets{}; - Trajectory::ConstSharedPtr reference_trajectory{}; - Trajectory::ConstSharedPtr predicted_trajectory{}; - std::vector boundary_types_to_detect{}; -}; - -struct Output -{ - std::map processing_time_map{}; - bool will_leave_lane{}; - bool is_out_of_lane{}; - bool will_cross_boundary{}; - PoseDeviation trajectory_deviation{}; - lanelet::ConstLanelets candidate_lanelets{}; - TrajectoryPoints resampled_trajectory{}; - std::vector vehicle_footprints{}; - std::vector vehicle_passing_areas{}; -}; - class LaneDepartureChecker { public: - LaneDepartureChecker( + explicit LaneDepartureChecker( std::shared_ptr time_keeper = std::make_shared()) : time_keeper_(time_keeper) { } - Output update(const Input & input); - void setParam(const Param & param, const autoware::vehicle_info_utils::VehicleInfo vehicle_info) + LaneDepartureChecker( + const Param & param, const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, + std::shared_ptr time_keeper = + std::make_shared()) + : param_(param), + vehicle_info_ptr_(std::make_shared(vehicle_info)), + time_keeper_(time_keeper) { - param_ = param; - vehicle_info_ptr_ = std::make_shared(vehicle_info); } + Output update(const Input & input); void setParam(const Param & param) { param_ = param; } - void setVehicleInfo(const autoware::vehicle_info_utils::VehicleInfo vehicle_info) - { - vehicle_info_ptr_ = std::make_shared(vehicle_info); - } - bool checkPathWillLeaveLane( const lanelet::ConstLanelets & lanelets, const PathWithLaneId & path) const; diff --git a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp index 4d99b1a134b3a..7aaf4816708bd 100644 --- a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp +++ b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/lane_departure_checker_node.hpp @@ -16,6 +16,7 @@ #define AUTOWARE__LANE_DEPARTURE_CHECKER__LANE_DEPARTURE_CHECKER_NODE_HPP_ #include "autoware/lane_departure_checker/lane_departure_checker.hpp" +#include "autoware/lane_departure_checker/parameters.hpp" #include "autoware/universe_utils/ros/polling_subscriber.hpp" #include @@ -47,21 +48,6 @@ namespace autoware::lane_departure_checker { using autoware_map_msgs::msg::LaneletMapBin; -struct NodeParam -{ - bool will_out_of_lane_checker; - bool out_of_lane_checker; - bool boundary_departure_checker; - - double update_rate; - bool visualize_lanelet; - bool include_right_lanes; - bool include_left_lanes; - bool include_opposite_lanes; - bool include_conflicting_lanes; - std::vector boundary_types_to_detect; -}; - class LaneDepartureCheckerNode : public rclcpp::Node { public: diff --git a/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/parameters.hpp b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/parameters.hpp new file mode 100644 index 0000000000000..425b032af425f --- /dev/null +++ b/control/autoware_lane_departure_checker/include/autoware/lane_departure_checker/parameters.hpp @@ -0,0 +1,101 @@ +// Copyright 2024 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. + +#ifndef AUTOWARE__LANE_DEPARTURE_CHECKER__PARAMETERS_HPP_ +#define AUTOWARE__LANE_DEPARTURE_CHECKER__PARAMETERS_HPP_ + +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include + +namespace autoware::lane_departure_checker +{ +using autoware::universe_utils::PoseDeviation; +using autoware_planning_msgs::msg::LaneletRoute; +using autoware_planning_msgs::msg::Trajectory; +using autoware_planning_msgs::msg::TrajectoryPoint; +using TrajectoryPoints = std::vector; +using autoware::universe_utils::LinearRing2d; + +struct Param +{ + static Param init(rclcpp::Node & node); + double footprint_margin_scale{}; + double footprint_extra_margin{}; + double resample_interval{}; + double max_deceleration{}; + double delay_time{}; + double max_lateral_deviation{}; + double max_longitudinal_deviation{}; + double max_yaw_deviation_deg{}; + double min_braking_distance{}; + // nearest search to ego + double ego_nearest_dist_threshold{}; + double ego_nearest_yaw_threshold{}; +}; + +struct NodeParam +{ + static NodeParam init(rclcpp::Node & node); + bool will_out_of_lane_checker{}; + bool out_of_lane_checker{}; + bool boundary_departure_checker{}; + + double update_rate{}; + bool visualize_lanelet{}; + bool include_right_lanes{}; + bool include_left_lanes{}; + bool include_opposite_lanes{}; + bool include_conflicting_lanes{}; + std::vector boundary_types_to_detect{}; +}; + +struct Input +{ + nav_msgs::msg::Odometry::ConstSharedPtr current_odom{}; + lanelet::LaneletMapPtr lanelet_map{}; + LaneletRoute::ConstSharedPtr route{}; + lanelet::ConstLanelets route_lanelets{}; + lanelet::ConstLanelets shoulder_lanelets{}; + Trajectory::ConstSharedPtr reference_trajectory{}; + Trajectory::ConstSharedPtr predicted_trajectory{}; + std::vector boundary_types_to_detect{}; +}; + +struct Output +{ + std::map processing_time_map{}; + bool will_leave_lane{}; + bool is_out_of_lane{}; + bool will_cross_boundary{}; + PoseDeviation trajectory_deviation{}; + lanelet::ConstLanelets candidate_lanelets{}; + TrajectoryPoints resampled_trajectory{}; + std::vector vehicle_footprints{}; + std::vector vehicle_passing_areas{}; +}; +} // namespace autoware::lane_departure_checker + +#endif // AUTOWARE__LANE_DEPARTURE_CHECKER__PARAMETERS_HPP_ diff --git a/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp index d9775415d3ed3..32384b7e6c7dd 100644 --- a/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp +++ b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/lane_departure_checker_node.cpp @@ -126,48 +126,19 @@ LaneDepartureCheckerNode::LaneDepartureCheckerNode(const rclcpp::NodeOptions & o : Node("lane_departure_checker_node", options) { using std::placeholders::_1; - - // Enable feature - node_param_.will_out_of_lane_checker = declare_parameter("will_out_of_lane_checker"); - node_param_.out_of_lane_checker = declare_parameter("out_of_lane_checker"); - node_param_.boundary_departure_checker = declare_parameter("boundary_departure_checker"); - - // Node Parameter - node_param_.update_rate = declare_parameter("update_rate"); - node_param_.visualize_lanelet = declare_parameter("visualize_lanelet"); - node_param_.include_right_lanes = declare_parameter("include_right_lanes"); - node_param_.include_left_lanes = declare_parameter("include_left_lanes"); - node_param_.include_opposite_lanes = declare_parameter("include_opposite_lanes"); - node_param_.include_conflicting_lanes = declare_parameter("include_conflicting_lanes"); - - // Boundary_departure_checker - node_param_.boundary_types_to_detect = - declare_parameter>("boundary_types_to_detect"); + node_param_ = NodeParam::init(*this); + param_ = Param::init(*this); // Vehicle Info const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(*this).getVehicleInfo(); vehicle_length_m_ = vehicle_info.vehicle_length_m; - // Core Parameter - param_.footprint_margin_scale = declare_parameter("footprint_margin_scale"); - param_.footprint_extra_margin = declare_parameter("footprint_extra_margin"); - param_.resample_interval = declare_parameter("resample_interval"); - param_.max_deceleration = declare_parameter("max_deceleration"); - param_.delay_time = declare_parameter("delay_time"); - param_.max_lateral_deviation = declare_parameter("max_lateral_deviation"); - param_.max_longitudinal_deviation = declare_parameter("max_longitudinal_deviation"); - param_.max_yaw_deviation_deg = declare_parameter("max_yaw_deviation_deg"); - param_.ego_nearest_dist_threshold = declare_parameter("ego_nearest_dist_threshold"); - param_.ego_nearest_yaw_threshold = declare_parameter("ego_nearest_yaw_threshold"); - param_.min_braking_distance = declare_parameter("min_braking_distance"); - // Parameter Callback set_param_res_ = add_on_set_parameters_callback(std::bind(&LaneDepartureCheckerNode::onParameter, this, _1)); // Core - lane_departure_checker_ = std::make_unique(); - lane_departure_checker_->setParam(param_, vehicle_info); + lane_departure_checker_ = std::make_unique(param_, vehicle_info); // Publisher processing_time_publisher_ = diff --git a/control/autoware_lane_departure_checker/src/lane_departure_checker_node/parameters.cpp b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/parameters.cpp new file mode 100644 index 0000000000000..f3aa23275e35c --- /dev/null +++ b/control/autoware_lane_departure_checker/src/lane_departure_checker_node/parameters.cpp @@ -0,0 +1,59 @@ +// Copyright 2024 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. + +#include "autoware/lane_departure_checker/parameters.hpp" + +#include +#include + +#include + +namespace autoware::lane_departure_checker +{ +using autoware::universe_utils::getOrDeclareParameter; + +Param Param::init(rclcpp::Node & node) +{ + Param p; + p.footprint_margin_scale = getOrDeclareParameter(node, "footprint_margin_scale"); + p.footprint_extra_margin = getOrDeclareParameter(node, "footprint_extra_margin"); + p.resample_interval = getOrDeclareParameter(node, "resample_interval"); + p.max_deceleration = getOrDeclareParameter(node, "max_deceleration"); + p.delay_time = getOrDeclareParameter(node, "delay_time"); + p.max_lateral_deviation = getOrDeclareParameter(node, "max_lateral_deviation"); + p.max_longitudinal_deviation = getOrDeclareParameter(node, "max_longitudinal_deviation"); + p.max_yaw_deviation_deg = getOrDeclareParameter(node, "max_yaw_deviation_deg"); + p.min_braking_distance = getOrDeclareParameter(node, "min_braking_distance"); + p.ego_nearest_dist_threshold = getOrDeclareParameter(node, "ego_nearest_dist_threshold"); + p.ego_nearest_yaw_threshold = getOrDeclareParameter(node, "ego_nearest_yaw_threshold"); + return p; +} + +NodeParam NodeParam::init(rclcpp::Node & node) +{ + NodeParam p; + p.will_out_of_lane_checker = getOrDeclareParameter(node, "will_out_of_lane_checker"); + p.out_of_lane_checker = getOrDeclareParameter(node, "out_of_lane_checker"); + p.boundary_departure_checker = getOrDeclareParameter(node, "boundary_departure_checker"); + p.update_rate = getOrDeclareParameter(node, "update_rate"); + p.visualize_lanelet = getOrDeclareParameter(node, "visualize_lanelet"); + p.include_right_lanes = getOrDeclareParameter(node, "include_right_lanes"); + p.include_left_lanes = getOrDeclareParameter(node, "include_left_lanes"); + p.include_opposite_lanes = getOrDeclareParameter(node, "include_opposite_lanes"); + p.include_conflicting_lanes = getOrDeclareParameter(node, "include_conflicting_lanes"); + p.boundary_types_to_detect = + getOrDeclareParameter>(node, "boundary_types_to_detect"); + return p; +} +} // namespace autoware::lane_departure_checker diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp index 46d3b97b71e58..6172fb75978cd 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case1.cpp @@ -564,13 +564,12 @@ int main(int argc, char ** argv) node.get(), "goal_planner."); goal_planner_parameter.bus_stop_area.use_bus_stop_area = true; goal_planner_parameter.lane_departure_check_expansion_margin = 0.2; - const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(*node).getVehicleInfo(); - autoware::lane_departure_checker::LaneDepartureChecker lane_departure_checker{}; - lane_departure_checker.setVehicleInfo(vehicle_info); autoware::lane_departure_checker::Param lane_departure_checker_params; lane_departure_checker_params.footprint_extra_margin = goal_planner_parameter.lane_departure_check_expansion_margin; - lane_departure_checker.setParam(lane_departure_checker_params); + autoware::lane_departure_checker::LaneDepartureChecker lane_departure_checker( + lane_departure_checker_params, vehicle_info); + const auto footprint = vehicle_info.createFootprint(); autoware::behavior_path_planner::GoalSearcher goal_searcher(goal_planner_parameter, footprint); auto goal_candidates = goal_searcher.search(planner_data); diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp index 3518b5041be53..f7fefa8ba9dc0 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/examples/plot_map_case2.cpp @@ -573,12 +573,11 @@ int main(int argc, char ** argv) autoware::behavior_path_planner::GoalPlannerModuleManager::initGoalPlannerParameters( node.get(), "goal_planner."); const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(*node).getVehicleInfo(); - autoware::lane_departure_checker::LaneDepartureChecker lane_departure_checker{}; - lane_departure_checker.setVehicleInfo(vehicle_info); autoware::lane_departure_checker::Param lane_departure_checker_params; lane_departure_checker_params.footprint_extra_margin = goal_planner_parameter.lane_departure_check_expansion_margin; - lane_departure_checker.setParam(lane_departure_checker_params); + autoware::lane_departure_checker::LaneDepartureChecker lane_departure_checker( + lane_departure_checker_params, vehicle_info); const auto footprint = vehicle_info.createFootprint(); autoware::behavior_path_planner::GoalSearcher goal_searcher(goal_planner_parameter, footprint); auto goal_candidates = goal_searcher.search(planner_data); diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp index 8272ddde0189e..96aeb5f5e4da8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp @@ -290,12 +290,10 @@ LaneParkingPlanner::LaneParkingPlanner( logger_(logger) { const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo(); - LaneDepartureChecker lane_departure_checker{}; - lane_departure_checker.setVehicleInfo(vehicle_info); lane_departure_checker::Param lane_departure_checker_params; lane_departure_checker_params.footprint_extra_margin = parameters.lane_departure_check_expansion_margin; - lane_departure_checker.setParam(lane_departure_checker_params); + LaneDepartureChecker lane_departure_checker(lane_departure_checker_params, vehicle_info); for (const std::string & planner_type : parameters.efficient_path_order) { if (planner_type == "SHIFT" && parameters.enable_shift_parking) { diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp index f45924b9542dc..83c1d55c7d022 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp @@ -68,13 +68,11 @@ StartPlannerModule::StartPlannerModule( vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()}, is_freespace_planner_cb_running_{false} { - lane_departure_checker_ = std::make_shared(time_keeper_); - lane_departure_checker_->setVehicleInfo(vehicle_info_); autoware::lane_departure_checker::Param lane_departure_checker_params{}; lane_departure_checker_params.footprint_extra_margin = parameters->lane_departure_check_expansion_margin; - - lane_departure_checker_->setParam(lane_departure_checker_params); + lane_departure_checker_ = std::make_shared( + lane_departure_checker_params, vehicle_info_, time_keeper_); // set enabled planner if (parameters_->enable_shift_pull_out) { diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp index dd8bb02c97dea..726c9ccc4c5d7 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp @@ -24,9 +24,7 @@ #include -#include #include -#include #include #include @@ -44,7 +42,7 @@ namespace autoware::behavior_path_planner class TestGeometricPullOut : public ::testing::Test { public: - std::optional plan( + std::optional call_plan( const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) { return geometric_pull_out_->plan(start_pose, goal_pose, planner_debug_data); @@ -54,27 +52,51 @@ class TestGeometricPullOut : public ::testing::Test void SetUp() override { rclcpp::init(0, nullptr); - node_ = rclcpp::Node::make_shared("geometric_pull_out", get_node_options()); + node_ = rclcpp::Node::make_shared("geometric_pull_out", make_node_options()); - load_parameters(); - initialize_vehicle_info(); initialize_lane_departure_checker(); - initialize_routeHandler(); initialize_geometric_pull_out_planner(); - initialize_planner_data(); } void TearDown() override { rclcpp::shutdown(); } + + PlannerData make_planner_data( + const Pose & start_pose, const int route_start_lane_id, const int route_goal_lane_id) + { + PlannerData planner_data; + planner_data.init_parameters(*node_); + + // Load a sample lanelet map and create a route handler + const auto shoulder_map_path = autoware::test_utils::get_absolute_path_to_lanelet_map( + "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); + const auto map_bin_msg = autoware::test_utils::make_map_bin_msg(shoulder_map_path, 0.5); + auto route_handler = std::make_shared(map_bin_msg); + + // Set up current odometry at start pose + auto odometry = std::make_shared(); + odometry->pose.pose = start_pose; + odometry->header.frame_id = "map"; + planner_data.self_odometry = odometry; + + // Setup route + const auto route = makeBehaviorRouteFromLaneId( + route_start_lane_id, route_goal_lane_id, "autoware_test_utils", + "road_shoulder/lanelet2_map.osm"); + route_handler->setRoute(route); + + // Update planner data with the route handler + planner_data.route_handler = route_handler; + + return planner_data; + } + // Member variables std::shared_ptr node_; - std::shared_ptr route_handler_; - autoware::vehicle_info_utils::VehicleInfo vehicle_info_; std::shared_ptr geometric_pull_out_; std::shared_ptr lane_departure_checker_; - PlannerData planner_data_; private: - rclcpp::NodeOptions get_node_options() const + rclcpp::NodeOptions make_node_options() const { // Load common configuration files auto node_options = rclcpp::NodeOptions{}; @@ -102,84 +124,22 @@ class TestGeometricPullOut : public ::testing::Test return node_options; } - void load_parameters() - { - const auto dp_double = [&](const std::string & s) { - return node_->declare_parameter(s); - }; - const auto dp_bool = [&](const std::string & s) { return node_->declare_parameter(s); }; - // Load parameters required for planning - const std::string ns = "start_planner."; - lane_departure_check_expansion_margin_ = - dp_double(ns + "lane_departure_check_expansion_margin"); - pull_out_max_steer_angle_ = dp_double(ns + "pull_out_max_steer_angle"); - pull_out_arc_path_interval_ = dp_double(ns + "arc_path_interval"); - center_line_path_interval_ = dp_double(ns + "center_line_path_interval"); - th_moving_object_velocity_ = dp_double(ns + "th_moving_object_velocity"); - divide_pull_out_path_ = dp_bool(ns + "divide_pull_out_path"); - backward_path_length_ = dp_double("backward_path_length"); - forward_path_length_ = dp_double("forward_path_length"); - } - - void initialize_vehicle_info() - { - vehicle_info_ = autoware::vehicle_info_utils::VehicleInfoUtils(*node_).getVehicleInfo(); - } - void initialize_lane_departure_checker() { - lane_departure_checker_ = std::make_shared(); - lane_departure_checker_->setVehicleInfo(vehicle_info_); - autoware::lane_departure_checker::Param lane_departure_checker_params{}; - lane_departure_checker_params.footprint_extra_margin = lane_departure_check_expansion_margin_; - lane_departure_checker_->setParam(lane_departure_checker_params); - } - - void initialize_routeHandler() - { - // Load a sample lanelet map and create a route handler - const auto shoulder_map_path = autoware::test_utils::get_absolute_path_to_lanelet_map( - "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); - const auto map_bin_msg = autoware::test_utils::make_map_bin_msg(shoulder_map_path, 0.5); - - route_handler_ = std::make_shared(map_bin_msg); + const auto vehicle_info = + autoware::vehicle_info_utils::VehicleInfoUtils(*node_).getVehicleInfo(); + lane_departure_checker_ = + std::make_shared(lane_departure_checker_params, vehicle_info); } void initialize_geometric_pull_out_planner() { - auto parameters = std::make_shared(); - parameters->parallel_parking_parameters.pull_out_max_steer_angle = pull_out_max_steer_angle_; - parameters->parallel_parking_parameters.pull_out_arc_path_interval = - pull_out_arc_path_interval_; - parameters->parallel_parking_parameters.center_line_path_interval = center_line_path_interval_; - parameters->th_moving_object_velocity = th_moving_object_velocity_; - parameters->divide_pull_out_path = divide_pull_out_path_; + auto parameters = StartPlannerParameters::init(*node_); geometric_pull_out_ = - std::make_shared(*node_, *parameters, lane_departure_checker_); - } - - void initialize_planner_data() - { - planner_data_.parameters.backward_path_length = backward_path_length_; - planner_data_.parameters.forward_path_length = forward_path_length_; - planner_data_.parameters.wheel_base = vehicle_info_.wheel_base_m; - planner_data_.parameters.wheel_tread = vehicle_info_.wheel_tread_m; - planner_data_.parameters.front_overhang = vehicle_info_.front_overhang_m; - planner_data_.parameters.left_over_hang = vehicle_info_.left_overhang_m; - planner_data_.parameters.right_over_hang = vehicle_info_.right_overhang_m; + std::make_shared(*node_, parameters, lane_departure_checker_); } - - // Parameter variables - double lane_departure_check_expansion_margin_{0.0}; - double pull_out_max_steer_angle_{0.0}; - double pull_out_arc_path_interval_{0.0}; - double center_line_path_interval_{0.0}; - double th_moving_object_velocity_{0.0}; - double backward_path_length_{0.0}; - double forward_path_length_{0.0}; - bool divide_pull_out_path_{false}; }; TEST_F(TestGeometricPullOut, GenerateValidGeometricPullOutPath) @@ -197,25 +157,13 @@ TEST_F(TestGeometricPullOut, GenerateValidGeometricPullOutPath) .orientation( geometry_msgs::build().x(0.0).y(0.0).z(0.705897).w( 0.708314)); + const auto planner_data = make_planner_data(start_pose, 4619, 4635); - // Set up current odometry at start pose - auto odometry = std::make_shared(); - odometry->pose.pose = start_pose; - odometry->header.frame_id = "map"; - planner_data_.self_odometry = odometry; - - // Setup route - const auto route = makeBehaviorRouteFromLaneId( - 4619, 4635, "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); - route_handler_->setRoute(route); - - // Update planner data with the route handler - planner_data_.route_handler = route_handler_; - geometric_pull_out_->setPlannerData(std::make_shared(planner_data_)); + geometric_pull_out_->setPlannerData(std::make_shared(planner_data)); // Plan the pull out path PlannerDebugData debug_data; - auto result = plan(start_pose, goal_pose, debug_data); + auto result = call_plan(start_pose, goal_pose, debug_data); // Assert that a valid geometric geometric pull out path is generated ASSERT_TRUE(result.has_value()) << "Geometric pull out path generation failed."; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp index 474da055b4de7..05a9201dad41d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp @@ -126,13 +126,11 @@ class TestShiftPullOut : public ::testing::Test void initialize_lane_departure_checker() { + autoware::lane_departure_checker::Param lane_departure_checker_params{}; const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(*node_).getVehicleInfo(); - lane_departure_checker_ = std::make_shared(); - lane_departure_checker_->setVehicleInfo(vehicle_info); - - autoware::lane_departure_checker::Param lane_departure_checker_params{}; - lane_departure_checker_->setParam(lane_departure_checker_params); + lane_departure_checker_ = + std::make_shared(lane_departure_checker_params, vehicle_info); } void initialize_shift_pull_out_planner() From 23a77640da41966fc9fc28355905dc4db6df6fe0 Mon Sep 17 00:00:00 2001 From: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:53:18 +0900 Subject: [PATCH 064/127] fix(planning): text revisions (#9886) * fix(planning): text revisions Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> * style(pre-commit): autofix --------- Signed-off-by: Atto Armoo <168620037+AA-T4@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../autoware_behavior_path_planner/README.md | 126 +++++++++--------- 1 file changed, 62 insertions(+), 64 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/README.md b/planning/behavior_path_planner/autoware_behavior_path_planner/README.md index ab8d02dc83f92..81cb945802595 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/README.md @@ -4,11 +4,11 @@ The Behavior Path Planner's main objective is to significantly enhance the safet The module begins by thoroughly analyzing the ego vehicle's current situation, including its position, speed, and surrounding environment. This analysis leads to essential driving decisions about lane changes or stopping and subsequently generates a path that is both safe and efficient. It considers road geometry, traffic rules, and dynamic conditions while also incorporating obstacle avoidance to respond to static and dynamic obstacles such as other vehicles, pedestrians, or unexpected roadblocks, ensuring safe navigation. -Moreover, the planner actively interacts with other traffic participants, predicting their actions and accordingly adjusting the vehicle's path. This ensures not only the safety of the autonomous vehicle but also contributes to smooth traffic flow. Its adherence to traffic laws, including speed limits and traffic signals, further guarantees lawful and predictable driving behavior. The planner is also designed to minimize sudden or abrupt maneuvers, aiming for a comfortable and natural driving experience. +Moreover, the planner responds to the behavior of other traffic participants, predicting their actions and accordingly adjusting the vehicle's path. This ensures not only the safety of the autonomous vehicle but also contributes to smooth traffic flow. Its adherence to traffic laws, including speed limits and compliance with traffic signals, further guarantees lawful and predictable driving behavior. The planner is also designed to minimize sudden or abrupt maneuvers, aiming for a comfortable and natural driving experience. !!! note - The [Planning Component Design](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-architecture/planning/) Document outlines the foundational philosophy guiding the design and future development of the Behavior Path Planner module. We strongly encourage readers to consult this document to understand the rationale behind its current configuration and the direction of its ongoing development. + The [Planning Component Design](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-architecture/planning/) documentation outlines the foundational philosophy guiding the design and future development of the Behavior Path Planner module. We strongly encourage readers to consult this document to understand the rationale behind its current configuration and the direction of its ongoing development. ## Purpose / Use Cases @@ -22,23 +22,23 @@ Essentially, the module has three primary responsibilities: ### Supported Scene Modules -Behavior Path Planner has following scene modules +Behavior Path Planner has the following scene modules -| Name | Description | Details | -| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------- | -| Lane Following | this module generates reference path from lanelet centerline. | LINK | -| Static Obstacle Avoidance | this module generates avoidance path when there is objects that should be avoid. | [LINK](../autoware_behavior_path_static_obstacle_avoidance_module/README.md) | -| Dynamic Obstacle Avoidance | WIP | [LINK](../autoware_behavior_path_dynamic_obstacle_avoidance_module/README.md) | -| Avoidance By Lane Change | this module generates lane change path when there is objects that should be avoid. | [LINK](../behavior_path_avoidance_by_lane_change_module/README.md) | -| Lane Change | this module is performed when it is necessary and a collision check with other vehicles is cleared. | [LINK](../autoware_behavior_path_lane_change_module/README.md) | -| External Lane Change | WIP | LINK | -| Goal Planner | this module is performed when ego-vehicle is in the road lane and goal is in the shoulder lane. ego-vehicle will stop at the goal. | [LINK](../autoware_behavior_path_goal_planner_module/README.md) | -| Start Planner | this module is performed when ego-vehicle is stationary and footprint of ego-vehicle is included in shoulder lane. This module ends when ego-vehicle merges into the road. | [LINK](../autoware_behavior_path_start_planner_module/README.md) | -| Side Shift | (for remote control) shift the path to left or right according to an external instruction. | [LINK](../autoware_behavior_path_side_shift_module/README.md) | +| Name | Description | Details | +| :------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------- | +| Lane Following | This module generates a reference path from lanelet centerline. | LINK | +| Static Obstacle Avoidance | This module generates an avoidance path when there are objects that should be avoided. | [LINK](../autoware_behavior_path_static_obstacle_avoidance_module/README.md) | +| Dynamic Obstacle Avoidance | WIP | [LINK](../autoware_behavior_path_dynamic_obstacle_avoidance_module/README.md) | +| Avoidance By Lane Change | This module generates a lane change path when there are objects that should be avoided. | [LINK](../behavior_path_avoidance_by_lane_change_module/README.md) | +| Lane Change | This module is performed when it is necessary and a collision check with other vehicles is cleared. | [LINK](../autoware_behavior_path_lane_change_module/README.md) | +| External Lane Change | WIP | LINK | +| Goal Planner | This module is performed when the ego vehicle is in a driving lane and the goal is in the shoulder lane. The ego vehicle will stop at the goal. | [LINK](../autoware_behavior_path_goal_planner_module/README.md) | +| Start Planner | This module is performed when the ego vehicle is stationary and the footprint of the ego vehicle is included in the shoulder lane. This module ends when the ego vehicle merges into the road. | [LINK](../autoware_behavior_path_start_planner_module/README.md) | +| Side Shift | This module shifts the path to the left or right based on external instructions, intended for remote control applications. | [LINK](../autoware_behavior_path_side_shift_module/README.md) | !!! Note - click on the following images to view the video of their execution + Click on the following images to view videos of their execution

@@ -59,13 +59,13 @@ Behavior Path Planner has following scene modules Users can refer to [Planning component design](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-architecture/planning/#supported-functions) for some additional behavior. -#### How to add or implement new module? +#### How to add or implement new module -All scene modules are implemented by inheriting base class `scene_module_interface.hpp`. +All scene modules are implemented by inheriting the base class `scene_module_interface.hpp`. !!! Warning - The remainder of this subsection is work in progress (WIP). + The remainder of this subsection is a work in progress (WIP). ### Planner Manager @@ -77,65 +77,65 @@ The Planner Manager's responsibilities include: !!! note - To check the scene module's transition, i.e.: registered, approved and candidate modules, set `verbose: true` in the [behavior path planner configuration file](https://github.com/autowarefoundation/autoware_launch/blob/0cd5d891a36ac34a32a417205905c109f2bafe7b/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/behavior_path_planner.param.yaml#L3). + To check the scene module's transition – i.e., registered, approved and candidate modules – set `verbose: true` in the [Behavior Path Planner configuration file](https://github.com/autowarefoundation/autoware_launch/blob/0cd5d891a36ac34a32a417205905c109f2bafe7b/autoware_launch/config/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/behavior_path_planner.param.yaml#L3). ![Scene module's transition table](./image/checking_module_transition.png) !!! note - For more in-depth information, refer to [Manager design](./docs/behavior_path_planner_manager_design.md) document. + For more in-depth information, refer to the [Manager design](./docs/behavior_path_planner_manager_design.md) document. ## Inputs / Outputs / API ### Input -| Name | Required? | Type | Description | -| :---------------------------- | :-------: | :------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| ~/input/odometry | ○ | `nav_msgs::msg::Odometry` | for ego velocity. | -| ~/input/accel | ○ | `geometry_msgs::msg::AccelWithCovarianceStamped` | for ego acceleration. | -| ~/input/objects | ○ | `autoware_perception_msgs::msg::PredictedObjects` | dynamic objects from perception module. | -| ~/input/occupancy_grid_map | ○ | `nav_msgs::msg::OccupancyGrid` | occupancy grid map from perception module. This is used for only Goal Planner module. | -| ~/input/traffic_signals | ○ | `autoware_perception_msgs::msg::TrafficLightGroupArray` | traffic signals information from the perception module | -| ~/input/vector_map | ○ | `autoware_map_msgs::msg::LaneletMapBin` | vector map information. | -| ~/input/route | ○ | `autoware_planning_msgs::msg::LaneletRoute` | current route from start to goal. | -| ~/input/scenario | ○ | `tier4_planning_msgs::msg::Scenario` | Launches behavior path planner if current scenario == `Scenario:LaneDriving`. | -| ~/input/lateral_offset | △ | `tier4_planning_msgs::msg::LateralOffset` | lateral offset to trigger side shift | -| ~/system/operation_mode/state | ○ | `autoware_adapi_v1_msgs::msg::OperationModeState` | Allows planning module to know if vehicle is in autonomous mode or can be controlled[ref](https://github.com/autowarefoundation/autoware.universe/blob/main/system/autoware_default_adapi/document/operation-mode.md) | - -- ○ Mandatory: Planning Module would not work if anyone of this is not present. -- △ Optional: Some module would not work, but Planning Module can still be operated. +| Name | Required? | Type | Description | +| :---------------------------- | :-------: | :------------------------------------------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ~/input/odometry | ○ | `nav_msgs::msg::Odometry` | For ego velocity | +| ~/input/accel | ○ | `geometry_msgs::msg::AccelWithCovarianceStamped` | For ego acceleration | +| ~/input/objects | ○ | `autoware_perception_msgs::msg::PredictedObjects` | Dynamic objects from the perception module | +| ~/input/occupancy_grid_map | ○ | `nav_msgs::msg::OccupancyGrid` | Occupancy grid map from the perception module. This is used for only the Goal Planner module | +| ~/input/traffic_signals | ○ | `autoware_perception_msgs::msg::TrafficLightGroupArray` | Traffic signal information from the perception module | +| ~/input/vector_map | ○ | `autoware_map_msgs::msg::LaneletMapBin` | Vector map information | +| ~/input/route | ○ | `autoware_planning_msgs::msg::LaneletRoute` | Current route from start to goal | +| ~/input/scenario | ○ | `tier4_planning_msgs::msg::Scenario` | Launches Behavior Path Planner if current scenario == `Scenario:LaneDriving` | +| ~/input/lateral_offset | △ | `tier4_planning_msgs::msg::LateralOffset` | Lateral offset to trigger side shift | +| ~/system/operation_mode/state | ○ | `autoware_adapi_v1_msgs::msg::OperationModeState` | Allows the planning module to know if vehicle is in autonomous mode or if it can be controlled[ref](https://github.com/autowarefoundation/autoware.universe/blob/main/system/autoware_default_adapi/document/operation-mode.md) | + +- ○ Mandatory: The planning module would not work if anyone of these were not present. +- △ Optional: Some modules would not work, but the planning module can still be operated. ### Output -| Name | Type | Description | QoS Durability | -| :---------------------------- | :-------------------------------------------------- | :--------------------------------------------------------------------------------------------- | ----------------- | -| ~/output/path | `tier4_planning_msgs::msg::PathWithLaneId` | the path generated by modules. | `volatile` | -| ~/output/turn_indicators_cmd | `autoware_vehicle_msgs::msg::TurnIndicatorsCommand` | turn indicators command. | `volatile` | -| ~/output/hazard_lights_cmd | `autoware_vehicle_msgs::msg::HazardLightsCommand` | hazard lights command. | `volatile` | -| ~/output/modified_goal | `autoware_planning_msgs::msg::PoseWithUuidStamped` | output modified goal commands. | `transient_local` | -| ~/output/reroute_availability | `tier4_planning_msgs::msg::RerouteAvailability` | the path the module is about to take. to be executed as soon as external approval is obtained. | `volatile` | +| Name | Type | Description | QoS Durability | +| :---------------------------- | :-------------------------------------------------- | :-------------------------------------------------------------------------------------------- | ----------------- | +| ~/output/path | `tier4_planning_msgs::msg::PathWithLaneId` | The path generated by modules | `volatile` | +| ~/output/turn_indicators_cmd | `autoware_vehicle_msgs::msg::TurnIndicatorsCommand` | Turn indicators command | `volatile` | +| ~/output/hazard_lights_cmd | `autoware_vehicle_msgs::msg::HazardLightsCommand` | Hazard lights command | `volatile` | +| ~/output/modified_goal | `autoware_planning_msgs::msg::PoseWithUuidStamped` | Output modified goal commands | `transient_local` | +| ~/output/reroute_availability | `tier4_planning_msgs::msg::RerouteAvailability` | The path the module is about to take. To be executed as soon as external approval is obtained | `volatile` | ### Debug -| Name | Type | Description | QoS Durability | -| :-------------------------------------- | :-------------------------------------------------- | :---------------------------------------------------------------------------------------- | -------------- | -| ~/debug/avoidance_debug_message_array | `tier4_planning_msgs::msg::AvoidanceDebugMsgArray` | debug message for avoidance. notify users reasons for avoidance path cannot be generated. | `volatile` | -| ~/debug/lane_change_debug_message_array | `tier4_planning_msgs::msg::LaneChangeDebugMsgArray` | debug message for lane change. notify users unsafe reason during lane changing process | `volatile` | -| ~/debug/maximum_drivable_area | `visualization_msgs::msg::MarkerArray` | shows maximum static drivable area. | `volatile` | -| ~/debug/turn_signal_info | `visualization_msgs::msg::MarkerArray` | TBA | `volatile` | -| ~/debug/bound | `visualization_msgs::msg::MarkerArray` | debug for static drivable area | `volatile` | -| ~/planning/path_candidate/\* | `autoware_planning_msgs::msg::Path` | the path before approval. | `volatile` | -| ~/planning/path_reference/\* | `autoware_planning_msgs::msg::Path` | reference path generated by each modules. | `volatile` | +| Name | Type | Description | QoS Durability | +| :-------------------------------------- | :-------------------------------------------------- | :---------------------------------------------------------------------------------------------- | -------------- | +| ~/debug/avoidance_debug_message_array | `tier4_planning_msgs::msg::AvoidanceDebugMsgArray` | Debug message for avoidance. Notifies users of reasons avoidance path cannot be generated | `volatile` | +| ~/debug/lane_change_debug_message_array | `tier4_planning_msgs::msg::LaneChangeDebugMsgArray` | Debug message for lane change. Notifies users of unsafe conditions during lane-changing process | `volatile` | +| ~/debug/maximum_drivable_area | `visualization_msgs::msg::MarkerArray` | Shows maximum static drivable area | `volatile` | +| ~/debug/turn_signal_info | `visualization_msgs::msg::MarkerArray` | TBA | `volatile` | +| ~/debug/bound | `visualization_msgs::msg::MarkerArray` | Debug for static drivable area | `volatile` | +| ~/planning/path_candidate/\* | `autoware_planning_msgs::msg::Path` | The path before approval | `volatile` | +| ~/planning/path_reference/\* | `autoware_planning_msgs::msg::Path` | Reference path generated by each module | `volatile` | !!! note - For specific information of which topics are being subscribed and published, refer to [behavior_path_planner.xml](https://github.com/autowarefoundation/autoware.universe/blob/9000f430c937764c14e43109539302f1f878ed70/planning/behavior_path_planner/launch/behavior_path_planner.launch.xml#L36-L49). + For specific information about which topics are being subscribed to and published, refer to [behavior_path_planner.xml](https://github.com/autowarefoundation/autoware.universe/blob/9000f430c937764c14e43109539302f1f878ed70/planning/behavior_path_planner/launch/behavior_path_planner.launch.xml#L36-L49). -## How to enable or disable the modules +## How to Enable or Disable Modules -Enabling and disabling the modules in the behavior path planner is primarily managed through two key files: `default_preset.yaml` and `behavior_path_planner.launch.xml`. +Enabling and disabling the modules in the Behavior Path Planner is primarily managed through two key files: `default_preset.yaml` and `behavior_path_planner.launch.xml`. -The `default_preset.yaml` file acts as a configuration file for enabling or disabling specific modules within the planner. It contains a series of arguments which represent the behavior path planner's modules or features. For example: +The `default_preset.yaml` file acts as a configuration file for enabling or disabling specific modules within the planner. It contains a series of arguments which represent the Behavior Path Planner's modules or features. For example: - `launch_static_obstacle_avoidance_module`: Set to `true` to enable the avoidance module, or `false` to disable it. @@ -143,14 +143,12 @@ The `default_preset.yaml` file acts as a configuration file for enabling or disa Click [here](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/config/planning/preset/default_preset.yaml) to view the `default_preset.yaml`. -The `behavior_path_planner.launch.xml` file references the settings defined in `default_preset.yaml` to apply the configurations when the behavior path planner's node is running. For instance, the parameter `static_obstacle_avoidance.enable_module` in +The `behavior_path_planner.launch.xml` file references the settings defined in `default_preset.yaml` to apply the configurations when the Behavior Path Planner's node is running. For instance, the parameter `static_obstacle_avoidance.enable_module` in the following segment corresponds to launch_static_obstacle_avoidance_module from `default_preset.yaml`: ```xml ``` -corresponds to launch_static_obstacle_avoidance_module from `default_preset.yaml`. - Therefore, to enable or disable a module, simply set the corresponding module in `default_preset.yaml` to `true` or `false`. These changes will be applied upon the next launch of Autoware. ## Generating Path @@ -163,13 +161,13 @@ The `ShiftLine` struct (as seen [here](https://github.com/autowarefoundation/aut Furthermore, the design and its implementation incorporate various equations and mathematical models to calculate essential parameters for the path shift. These include the total distance of the lateral shift, the maximum allowable lateral acceleration and jerk, and the total time required for the shift. Practical considerations are also noted, such as simplifying assumptions in the absence of a specific time interval for most lane change and avoidance cases. -The shifted path generation logic enables the behavior path planner to dynamically generate safe and efficient paths, precisely controlling the vehicle’s lateral movements to ensure the smooth execution of lane changes and avoidance maneuvers. This careful planning and execution adhere to the vehicle's dynamic capabilities and safety constraints, maximizing efficiency and safety in autonomous vehicle navigation. +The shifted path generation logic enables the Behavior Path Planner to dynamically generate safe and efficient paths, precisely controlling the vehicle’s lateral movements to ensure the smooth execution of lane changes and avoidance maneuvers. This careful planning and execution adhere to the vehicle's dynamic capabilities and safety constraints, maximizing efficiency and safety in autonomous vehicle navigation. !!! note If you're a math lover, refer to [Path Generation Design](../autoware_behavior_path_planner_common/docs/behavior_path_planner_path_generation_design.md) for the nitty-gritty. -## Collision Assessment / Safety check +## Collision Assessment / Safety Check The purpose of the collision assessment function in the Behavior Path Planner is to evaluate the potential for collisions with target objects across all modules. It is utilized in two scenarios: @@ -207,7 +205,7 @@ Static drivable area expansion operates under assumptions about the correct arra !!! note - Further details can is provided in [Drivable Area Design](../autoware_behavior_path_planner_common/docs/behavior_path_planner_drivable_area_design.md). + Further details can be found in [Drivable Area Design](../autoware_behavior_path_planner_common/docs/behavior_path_planner_drivable_area_design.md). ### Dynamic Drivable Area Logic @@ -233,7 +231,7 @@ The `TurnIndicatorsCommand` message structure has a command field that can take !!! warning - Rerouting is a feature that was still under progress. Further information will be included on a later date. + The rerouting feature is under development. Further information will be included at a later date. ## Parameters and Configuration @@ -278,5 +276,5 @@ preset ## Limitations & Future Work -1. Goal Planner module cannot be simultaneously executed together with other modules. -2. Module is not designed as plugin. Integrating custom module is not straightforward and user have to modify some part of the behavior path planner main code. +1. The Goal Planner module cannot be simultaneously executed together with other modules. +2. The module is not designed as a plugin. Integrating a custom module is not straightforward. Users have to modify part of the Behavior Path Planner's main code. From 00892a10702536fbcd071f9decc8953addddfd24 Mon Sep 17 00:00:00 2001 From: Kosuke Takeuchi Date: Fri, 10 Jan 2025 16:55:14 +0900 Subject: [PATCH 065/127] feat(goal_planner): cut stop path to goal (#9829) Signed-off-by: kosuke55 --- .../src/goal_planner_module.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp index 96aeb5f5e4da8..87a6e28ff0007 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp @@ -1671,7 +1671,10 @@ PathWithLaneId GoalPlannerModule::generateStopPath( const auto reference_path = std::invoke([&]() -> PathWithLaneId { const auto s_current = lanelet::utils::getArcCoordinates(current_lanes, current_pose).length; const double s_start = std::max(0.0, s_current - common_parameters.backward_path_length); - const double s_end = s_current + common_parameters.forward_path_length; + const double s_end = std::clamp( + lanelet::utils::getArcCoordinates(current_lanes, route_handler->getGoalPose()).length, + s_current + std::numeric_limits::epsilon(), + s_current + common_parameters.forward_path_length); return route_handler->getCenterLinePath(current_lanes, s_start, s_end, true); }); From 594c099daf4413d6807f5dbe2f0d5d88a914afe9 Mon Sep 17 00:00:00 2001 From: Kazunori-Nakajima <169115284+Kazunori-Nakajima@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:55:44 +0900 Subject: [PATCH 066/127] feat(goal_planner): update lateral_deviation_thresh from `0.3` to `0.1` (#9850) * fix(goal_planner): Update lateral_deviation_thresh from 0.3 to 0.1 Signed-off-by: Kasunori-Nakajima * unified hasDeviatedFrom{Last|Current}PreviousModulePath Signed-off-by: Kasunori-Nakajima * style(pre-commit): autofix * hasDeviatedFromPath argument modification Signed-off-by: Kasunori-Nakajima * style(pre-commit): autofix --------- Signed-off-by: Kasunori-Nakajima Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../goal_planner_module.hpp | 6 ++--- .../src/goal_planner_module.cpp | 26 +++++++------------ 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp index 0765147cbeb80..cabbeb3435087 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp @@ -135,10 +135,8 @@ bool isOnModifiedGoal( bool hasPreviousModulePathShapeChanged( const BehaviorModuleOutput & upstream_module_output, const BehaviorModuleOutput & last_upstream_module_output); -bool hasDeviatedFromLastPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & last_upstream_module_output); -bool hasDeviatedFromCurrentPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & upstream_module_output); +bool hasDeviatedFromPath( + const Point & ego_position, const BehaviorModuleOutput & upstream_module_output); bool needPathUpdate( const Pose & current_pose, const double path_update_duration, const rclcpp::Time & now, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp index 87a6e28ff0007..d4f3953c557b4 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp @@ -155,7 +155,7 @@ bool hasPreviousModulePathShapeChanged( { // Calculate the lateral distance between each point of the current path and the nearest point of // the last path - constexpr double LATERAL_DEVIATION_THRESH = 0.3; + constexpr double LATERAL_DEVIATION_THRESH = 0.1; for (const auto & p : upstream_module_output.path.points) { const size_t nearest_seg_idx = autoware::motion_utils::findNearestSegmentIndex( last_upstream_module_output.path.points, p.point.pose.position); @@ -184,21 +184,12 @@ bool hasPreviousModulePathShapeChanged( return false; } -bool hasDeviatedFromLastPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & last_upstream_module_output) +bool hasDeviatedFromPath( + const Point & ego_position, const BehaviorModuleOutput & upstream_module_output) { + constexpr double LATERAL_DEVIATION_THRESH = 0.1; return std::abs(autoware::motion_utils::calcLateralOffset( - last_upstream_module_output.path.points, - planner_data.self_odometry->pose.pose.position)) > 0.3; -} - -bool hasDeviatedFromCurrentPreviousModulePath( - const PlannerData & planner_data, const BehaviorModuleOutput & upstream_module_output) -{ - constexpr double LATERAL_DEVIATION_THRESH = 0.3; - return std::abs(autoware::motion_utils::calcLateralOffset( - upstream_module_output.path.points, planner_data.self_odometry->pose.pose.position)) > - LATERAL_DEVIATION_THRESH; + upstream_module_output.path.points, ego_position)) > LATERAL_DEVIATION_THRESH; } bool needPathUpdate( @@ -371,7 +362,8 @@ void LaneParkingPlanner::onTimer() local_planner_data->self_odometry->pose.pose, modified_goal_opt, parameters_)) { return false; } - if (hasDeviatedFromCurrentPreviousModulePath(*local_planner_data, upstream_module_output)) { + if (hasDeviatedFromPath( + local_planner_data->self_odometry->pose.pose.position, upstream_module_output)) { RCLCPP_DEBUG(getLogger(), "has deviated from current previous module path"); return false; } @@ -381,8 +373,8 @@ void LaneParkingPlanner::onTimer() return true; } if ( - hasDeviatedFromLastPreviousModulePath( - *local_planner_data, original_upstream_module_output_) && + hasDeviatedFromPath( + local_planner_data->self_odometry->pose.pose.position, original_upstream_module_output_) && current_state != PathDecisionState::DecisionKind::DECIDED) { RCLCPP_DEBUG(getLogger(), "has deviated from last previous module path"); return true; From 2a94090ec5a5c658dd4108bf8c07862b4bbe59bd Mon Sep 17 00:00:00 2001 From: Amadeusz Szymko Date: Fri, 10 Jan 2025 17:12:56 +0900 Subject: [PATCH 067/127] refactor(autoware_tensorrt_common): multi-TensorRT compatibility & tensorrt_common as unified lib for all perception components (#9762) * refactor(autoware_tensorrt_common): multi-TensorRT compatibility & tensorrt_common as unified lib for all perception components Signed-off-by: Amadeusz Szymko * style(pre-commit): autofix * style(autoware_tensorrt_common): linting Signed-off-by: Amadeusz Szymko * style(autoware_lidar_centerpoint): typo Co-authored-by: Kenzo Lobos Tsunekawa * docs(autoware_tensorrt_common): grammar Co-authored-by: Kenzo Lobos Tsunekawa * fix(autoware_lidar_transfusion): reuse cast variable Signed-off-by: Amadeusz Szymko * fix(autoware_tensorrt_common): remove deprecated inference API Signed-off-by: Amadeusz Szymko * style(autoware_tensorrt_common): grammar Co-authored-by: Kenzo Lobos Tsunekawa * style(autoware_tensorrt_common): grammar Co-authored-by: Kenzo Lobos Tsunekawa * fix(autoware_tensorrt_common): const pointer Signed-off-by: Amadeusz Szymko * fix(autoware_tensorrt_common): remove unused method declaration Signed-off-by: Amadeusz Szymko * style(pre-commit): autofix * refactor(autoware_tensorrt_common): readability Co-authored-by: Kotaro Uetake <60615504+ktro2828@users.noreply.github.com> * fix(autoware_tensorrt_common): return if layer not registered Signed-off-by: Amadeusz Szymko * refactor(autoware_tensorrt_common): readability Co-authored-by: Kotaro Uetake <60615504+ktro2828@users.noreply.github.com> * fix(autoware_tensorrt_common): rename struct Signed-off-by: Amadeusz Szymko * style(pre-commit): autofix --------- Signed-off-by: Amadeusz Szymko Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Kenzo Lobos Tsunekawa Co-authored-by: Kotaro Uetake <60615504+ktro2828@users.noreply.github.com> --- .../pointpainting_trt.hpp | 5 +- .../src/pointpainting_fusion/node.cpp | 8 +- .../pointpainting_trt.cpp | 4 +- .../src/detector.cpp | 23 +- .../autoware_lidar_centerpoint/CMakeLists.txt | 2 - .../lidar_centerpoint/centerpoint_trt.hpp | 31 +- .../lidar_centerpoint/network/network_trt.hpp | 53 - .../network/tensorrt_wrapper.hpp | 67 -- .../lib/centerpoint_trt.cpp | 100 +- .../lib/network/network_trt.cpp | 85 -- .../lib/network/tensorrt_wrapper.cpp | 169 --- .../autoware_lidar_centerpoint/src/node.cpp | 4 +- .../autoware_lidar_transfusion/CMakeLists.txt | 1 - .../lidar_transfusion/network/network_trt.hpp | 87 -- .../lidar_transfusion/transfusion_config.hpp | 78 +- .../lidar_transfusion/transfusion_trt.hpp | 31 +- .../lib/network/network_trt.cpp | 357 ------- .../lib/transfusion_trt.cpp | 104 +- .../src/lidar_transfusion_node.cpp | 6 +- .../autoware_shape_estimation/CMakeLists.txt | 3 + .../tensorrt_shape_estimator.hpp | 6 +- .../lib/tensorrt_shape_estimator.cpp | 49 +- .../src/shape_estimation_node.cpp | 3 +- .../CMakeLists.txt | 3 + .../tensorrt_classifier.hpp | 21 +- .../src/tensorrt_classifier.cpp | 95 +- .../autoware_tensorrt_common/CMakeLists.txt | 9 +- perception/autoware_tensorrt_common/README.md | 70 +- .../tensorrt_common/conv_profiler.hpp | 108 ++ .../autoware/tensorrt_common/logger.hpp | 40 +- .../autoware/tensorrt_common/profiler.hpp | 96 ++ .../tensorrt_common/simple_profiler.hpp | 73 -- .../tensorrt_common/tensorrt_common.hpp | 449 +++++--- .../tensorrt_common/tensorrt_conv_calib.hpp | 241 +++++ .../autoware/tensorrt_common/utils.hpp | 408 +++++++ .../autoware_tensorrt_common/src/profiler.cpp | 113 ++ .../src/simple_profiler.cpp | 138 --- .../src/tensorrt_common.cpp | 992 +++++++++--------- .../autoware_tensorrt_yolox/CMakeLists.txt | 3 + .../tensorrt_yolox/tensorrt_yolox.hpp | 46 +- .../src/tensorrt_yolox.cpp | 184 ++-- .../src/tensorrt_yolox_node.cpp | 15 +- .../src/yolox_single_image_inference_node.cpp | 4 +- .../CMakeLists.txt | 1 - .../src/classifier/cnn_classifier.cpp | 7 +- .../CMakeLists.txt | 1 - .../src/traffic_light_fine_detector_node.cpp | 15 +- 47 files changed, 2345 insertions(+), 2063 deletions(-) delete mode 100644 perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/network_trt.hpp delete mode 100644 perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp delete mode 100644 perception/autoware_lidar_centerpoint/lib/network/network_trt.cpp delete mode 100644 perception/autoware_lidar_centerpoint/lib/network/tensorrt_wrapper.cpp delete mode 100644 perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/network/network_trt.hpp delete mode 100644 perception/autoware_lidar_transfusion/lib/network/network_trt.cpp create mode 100644 perception/autoware_tensorrt_common/include/autoware/tensorrt_common/conv_profiler.hpp create mode 100644 perception/autoware_tensorrt_common/include/autoware/tensorrt_common/profiler.hpp delete mode 100644 perception/autoware_tensorrt_common/include/autoware/tensorrt_common/simple_profiler.hpp create mode 100644 perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_conv_calib.hpp create mode 100644 perception/autoware_tensorrt_common/include/autoware/tensorrt_common/utils.hpp create mode 100644 perception/autoware_tensorrt_common/src/profiler.cpp delete mode 100644 perception/autoware_tensorrt_common/src/simple_profiler.cpp diff --git a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/pointpainting_trt.hpp b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/pointpainting_trt.hpp index a89ee3d02cd8b..a1d12bcb56384 100644 --- a/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/pointpainting_trt.hpp +++ b/perception/autoware_image_projection_based_fusion/include/autoware/image_projection_based_fusion/pointpainting_fusion/pointpainting_trt.hpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -29,8 +30,8 @@ class PointPaintingTRT : public autoware::lidar_centerpoint::CenterPointTRT using autoware::lidar_centerpoint::CenterPointTRT::CenterPointTRT; explicit PointPaintingTRT( - const autoware::lidar_centerpoint::NetworkParam & encoder_param, - const autoware::lidar_centerpoint::NetworkParam & head_param, + const autoware::tensorrt_common::TrtCommonConfig & encoder_param, + const autoware::tensorrt_common::TrtCommonConfig & head_param, const autoware::lidar_centerpoint::DensificationParam & densification_param, const autoware::lidar_centerpoint::CenterPointConfig & config); diff --git a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp index bcd62383319c1..ef03cf6c3a7cf 100644 --- a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp +++ b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/node.cpp @@ -176,10 +176,10 @@ PointPaintingFusionNode::PointPaintingFusionNode(const rclcpp::NodeOptions & opt iou_bev_nms_.setParameters(p); } - autoware::lidar_centerpoint::NetworkParam encoder_param( - encoder_onnx_path, encoder_engine_path, trt_precision); - autoware::lidar_centerpoint::NetworkParam head_param( - head_onnx_path, head_engine_path, trt_precision); + autoware::tensorrt_common::TrtCommonConfig encoder_param( + encoder_onnx_path, trt_precision, encoder_engine_path); + autoware::tensorrt_common::TrtCommonConfig head_param( + head_onnx_path, trt_precision, head_engine_path); autoware::lidar_centerpoint::DensificationParam densification_param( densification_world_frame_id, densification_num_past_frames); autoware::lidar_centerpoint::CenterPointConfig config( diff --git a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/pointpainting_trt.cpp b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/pointpainting_trt.cpp index cc3eb17cc32ab..1fe860e68a967 100644 --- a/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/pointpainting_trt.cpp +++ b/perception/autoware_image_projection_based_fusion/src/pointpainting_fusion/pointpainting_trt.cpp @@ -27,8 +27,8 @@ namespace autoware::image_projection_based_fusion { PointPaintingTRT::PointPaintingTRT( - const autoware::lidar_centerpoint::NetworkParam & encoder_param, - const autoware::lidar_centerpoint::NetworkParam & head_param, + const autoware::tensorrt_common::TrtCommonConfig & encoder_param, + const autoware::tensorrt_common::TrtCommonConfig & head_param, const autoware::lidar_centerpoint::DensificationParam & densification_param, const autoware::lidar_centerpoint::CenterPointConfig & config) : autoware::lidar_centerpoint::CenterPointTRT( diff --git a/perception/autoware_lidar_apollo_instance_segmentation/src/detector.cpp b/perception/autoware_lidar_apollo_instance_segmentation/src/detector.cpp index 60aa09c8e16d7..2e3a7a2243399 100644 --- a/perception/autoware_lidar_apollo_instance_segmentation/src/detector.cpp +++ b/perception/autoware_lidar_apollo_instance_segmentation/src/detector.cpp @@ -18,7 +18,6 @@ #include -#include #include #include @@ -51,12 +50,9 @@ LidarApolloInstanceSegmentation::LidarApolloInstanceSegmentation(rclcpp::Node * const auto precision = node_->declare_parameter("precision", "fp32"); trt_common_ = std::make_unique( - onnx_file, precision, nullptr, autoware::tensorrt_common::BatchConfig{1, 1, 1}, 1 << 30); - trt_common_->setup(); - - if (!trt_common_->isInitialized()) { - RCLCPP_ERROR_STREAM(node_->get_logger(), "failed to create tensorrt engine file."); - return; + tensorrt_common::TrtCommonConfig(onnx_file, precision)); + if (!trt_common_->setup()) { + throw std::runtime_error("Failed to setup TensorRT"); } if (node_->declare_parameter("build_only", false)) { @@ -65,11 +61,11 @@ LidarApolloInstanceSegmentation::LidarApolloInstanceSegmentation(rclcpp::Node * } // GPU memory allocation - const auto input_dims = trt_common_->getBindingDimensions(0); + const auto input_dims = trt_common_->getTensorShape(0); const auto input_size = std::accumulate(input_dims.d + 1, input_dims.d + input_dims.nbDims, 1, std::multiplies()); input_d_ = autoware::cuda_utils::make_unique(input_size); - const auto output_dims = trt_common_->getBindingDimensions(1); + const auto output_dims = trt_common_->getTensorShape(1); output_size_ = std::accumulate( output_dims.d + 1, output_dims.d + output_dims.nbDims, 1, std::multiplies()); output_d_ = autoware::cuda_utils::make_unique(output_size_); @@ -127,10 +123,6 @@ bool LidarApolloInstanceSegmentation::detectDynamicObjects( const sensor_msgs::msg::PointCloud2 & input, tier4_perception_msgs::msg::DetectedObjectsWithFeature & output) { - if (!trt_common_->isInitialized()) { - return false; - } - // move up pointcloud z_offset in z axis sensor_msgs::msg::PointCloud2 transformed_cloud; transformCloud(input, transformed_cloud, z_offset_); @@ -169,7 +161,10 @@ bool LidarApolloInstanceSegmentation::detectDynamicObjects( std::vector buffers = {input_d_.get(), output_d_.get()}; - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); CHECK_CUDA_ERROR(cudaMemcpyAsync( output_h_.get(), output_d_.get(), sizeof(float) * output_size_, cudaMemcpyDeviceToHost, diff --git a/perception/autoware_lidar_centerpoint/CMakeLists.txt b/perception/autoware_lidar_centerpoint/CMakeLists.txt index 88244b3153349..322907c67c6ae 100644 --- a/perception/autoware_lidar_centerpoint/CMakeLists.txt +++ b/perception/autoware_lidar_centerpoint/CMakeLists.txt @@ -84,8 +84,6 @@ if(TRT_AVAIL AND CUDA_AVAIL AND CUDNN_AVAIL) lib/detection_class_remapper.cpp lib/utils.cpp lib/ros_utils.cpp - lib/network/network_trt.cpp - lib/network/tensorrt_wrapper.cpp lib/postprocess/non_maximum_suppression.cpp lib/preprocess/pointcloud_densification.cpp lib/preprocess/voxel_generator.cpp diff --git a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp index 671ff54f8ce0d..4b531e34877d6 100644 --- a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp +++ b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/centerpoint_trt.hpp @@ -16,12 +16,13 @@ #define AUTOWARE__LIDAR_CENTERPOINT__CENTERPOINT_TRT_HPP_ #include "autoware/lidar_centerpoint/cuda_utils.hpp" -#include "autoware/lidar_centerpoint/network/network_trt.hpp" #include "autoware/lidar_centerpoint/postprocess/postprocess_kernel.hpp" #include "autoware/lidar_centerpoint/preprocess/voxel_generator.hpp" #include "pcl/point_cloud.h" #include "pcl/point_types.h" +#include + #include "sensor_msgs/msg/point_cloud2.hpp" #include @@ -31,31 +32,14 @@ namespace autoware::lidar_centerpoint { -class NetworkParam -{ -public: - NetworkParam(std::string onnx_path, std::string engine_path, std::string trt_precision) - : onnx_path_(std::move(onnx_path)), - engine_path_(std::move(engine_path)), - trt_precision_(std::move(trt_precision)) - { - } - - std::string onnx_path() const { return onnx_path_; } - std::string engine_path() const { return engine_path_; } - std::string trt_precision() const { return trt_precision_; } - -private: - std::string onnx_path_; - std::string engine_path_; - std::string trt_precision_; -}; +using autoware::tensorrt_common::ProfileDims; +using autoware::tensorrt_common::TrtCommonConfig; class CenterPointTRT { public: explicit CenterPointTRT( - const NetworkParam & encoder_param, const NetworkParam & head_param, + const TrtCommonConfig & encoder_param, const TrtCommonConfig & head_param, const DensificationParam & densification_param, const CenterPointConfig & config); virtual ~CenterPointTRT(); @@ -66,6 +50,7 @@ class CenterPointTRT protected: void initPtr(); + void initTrt(const TrtCommonConfig & encoder_param, const TrtCommonConfig & head_param); virtual bool preprocess( const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const tf2_ros::Buffer & tf_buffer); @@ -75,8 +60,8 @@ class CenterPointTRT void postProcess(std::vector & det_boxes3d); std::unique_ptr vg_ptr_{nullptr}; - std::unique_ptr encoder_trt_ptr_{nullptr}; - std::unique_ptr head_trt_ptr_{nullptr}; + std::unique_ptr encoder_trt_ptr_{nullptr}; + std::unique_ptr head_trt_ptr_{nullptr}; std::unique_ptr post_proc_ptr_{nullptr}; cudaStream_t stream_{nullptr}; diff --git a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/network_trt.hpp b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/network_trt.hpp deleted file mode 100644 index 17778d77ed798..0000000000000 --- a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/network_trt.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2021 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. - -#ifndef AUTOWARE__LIDAR_CENTERPOINT__NETWORK__NETWORK_TRT_HPP_ -#define AUTOWARE__LIDAR_CENTERPOINT__NETWORK__NETWORK_TRT_HPP_ - -#include "autoware/lidar_centerpoint/centerpoint_config.hpp" -#include "autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp" - -#include - -namespace autoware::lidar_centerpoint -{ -class VoxelEncoderTRT : public TensorRTWrapper -{ -public: - using TensorRTWrapper::TensorRTWrapper; - -protected: - bool setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) override; -}; - -class HeadTRT : public TensorRTWrapper -{ -public: - using TensorRTWrapper::TensorRTWrapper; - - HeadTRT(const std::vector & out_channel_sizes, const CenterPointConfig & config); - -protected: - bool setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) override; - - std::vector out_channel_sizes_; -}; - -} // namespace autoware::lidar_centerpoint - -#endif // AUTOWARE__LIDAR_CENTERPOINT__NETWORK__NETWORK_TRT_HPP_ diff --git a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp b/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp deleted file mode 100644 index d56ccc699add3..0000000000000 --- a/perception/autoware_lidar_centerpoint/include/autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2021 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. - -#ifndef AUTOWARE__LIDAR_CENTERPOINT__NETWORK__TENSORRT_WRAPPER_HPP_ -#define AUTOWARE__LIDAR_CENTERPOINT__NETWORK__TENSORRT_WRAPPER_HPP_ - -#include "NvInfer.h" -#include "autoware/lidar_centerpoint/centerpoint_config.hpp" -#include "autoware/tensorrt_common/tensorrt_common.hpp" - -#include -#include -#include - -namespace autoware::lidar_centerpoint -{ - -class TensorRTWrapper -{ -public: - explicit TensorRTWrapper(const CenterPointConfig & config); - - virtual ~TensorRTWrapper(); - - bool init( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision); - - autoware::tensorrt_common::TrtUniquePtr context_{nullptr}; - -protected: - virtual bool setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) = 0; - - CenterPointConfig config_; - autoware::tensorrt_common::Logger logger_; - -private: - bool parseONNX( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision, - std::size_t workspace_size = (1ULL << 30)); - - bool saveEngine(const std::string & engine_path); - - bool loadEngine(const std::string & engine_path); - - bool createContext(); - - autoware::tensorrt_common::TrtUniquePtr runtime_{nullptr}; - autoware::tensorrt_common::TrtUniquePtr plan_{nullptr}; - autoware::tensorrt_common::TrtUniquePtr engine_{nullptr}; -}; - -} // namespace autoware::lidar_centerpoint - -#endif // AUTOWARE__LIDAR_CENTERPOINT__NETWORK__TENSORRT_WRAPPER_HPP_ diff --git a/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp b/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp index 530f59179d25b..c586eeb961716 100644 --- a/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp +++ b/perception/autoware_lidar_centerpoint/lib/centerpoint_trt.cpp @@ -28,39 +28,22 @@ #include #include #include +#include +#include #include namespace autoware::lidar_centerpoint { CenterPointTRT::CenterPointTRT( - const NetworkParam & encoder_param, const NetworkParam & head_param, + const TrtCommonConfig & encoder_param, const TrtCommonConfig & head_param, const DensificationParam & densification_param, const CenterPointConfig & config) : config_(config) { vg_ptr_ = std::make_unique(densification_param, config_); post_proc_ptr_ = std::make_unique(config_); - // encoder - encoder_trt_ptr_ = std::make_unique(config_); - encoder_trt_ptr_->init( - encoder_param.onnx_path(), encoder_param.engine_path(), encoder_param.trt_precision()); - encoder_trt_ptr_->context_->setBindingDimensions( - 0, - nvinfer1::Dims3( - config_.max_voxel_size_, config_.max_point_in_voxel_size_, config_.encoder_in_feature_size_)); - - // head - std::vector out_channel_sizes = { - config_.class_size_, config_.head_out_offset_size_, config_.head_out_z_size_, - config_.head_out_dim_size_, config_.head_out_rot_size_, config_.head_out_vel_size_}; - head_trt_ptr_ = std::make_unique(out_channel_sizes, config_); - head_trt_ptr_->init(head_param.onnx_path(), head_param.engine_path(), head_param.trt_precision()); - head_trt_ptr_->context_->setBindingDimensions( - 0, nvinfer1::Dims4( - config_.batch_size_, config_.encoder_out_feature_size_, config_.grid_size_y_, - config_.grid_size_x_)); - initPtr(); + initTrt(encoder_param, head_param); cudaStreamCreate(&stream_); } @@ -126,6 +109,66 @@ void CenterPointTRT::initPtr() cudaMemcpyHostToDevice, stream_)); } +void CenterPointTRT::initTrt( + const TrtCommonConfig & encoder_param, const TrtCommonConfig & head_param) +{ + // encoder input profile + auto enc_in_dims = nvinfer1::Dims{ + 3, + {static_cast(config_.max_voxel_size_), + static_cast(config_.max_point_in_voxel_size_), + static_cast(config_.encoder_in_feature_size_)}}; + std::vector encoder_profile_dims{ + tensorrt_common::ProfileDims(0, enc_in_dims, enc_in_dims, enc_in_dims)}; + auto encoder_profile_dims_ptr = + std::make_unique>(encoder_profile_dims); + + // head input profile + auto head_in_dims = nvinfer1::Dims{ + 4, + {static_cast(config_.batch_size_), + static_cast(config_.encoder_out_feature_size_), + static_cast(config_.grid_size_y_), static_cast(config_.grid_size_x_)}}; + std::vector head_profile_dims{ + tensorrt_common::ProfileDims(0, head_in_dims, head_in_dims, head_in_dims)}; + std::unordered_map out_channel_map = { + {1, static_cast(config_.class_size_)}, + {2, static_cast(config_.head_out_offset_size_)}, + {3, static_cast(config_.head_out_z_size_)}, + {4, static_cast(config_.head_out_dim_size_)}, + {5, static_cast(config_.head_out_rot_size_)}, + {6, static_cast(config_.head_out_vel_size_)}}; + for (const auto & [tensor_name, channel_size] : out_channel_map) { + auto dims = nvinfer1::Dims{ + 4, + {static_cast(config_.batch_size_), channel_size, + static_cast(config_.down_grid_size_y_), + static_cast(config_.down_grid_size_x_)}}; + head_profile_dims.emplace_back(tensor_name, dims, dims, dims); + } + auto head_profile_dims_ptr = + std::make_unique>(head_profile_dims); + + // initialize trt wrappers + encoder_trt_ptr_ = std::make_unique(encoder_param); + + head_trt_ptr_ = std::make_unique(head_param); + + // setup trt engines + if ( + !encoder_trt_ptr_->setup(std::move(encoder_profile_dims_ptr)) || + !head_trt_ptr_->setup(std::move(head_profile_dims_ptr))) { + throw std::runtime_error("Failed to setup TRT engine."); + } + + // set input shapes + if ( + !encoder_trt_ptr_->setInputShape(0, enc_in_dims) || + !head_trt_ptr_->setInputShape(0, head_in_dims)) { + throw std::runtime_error("Failed to set input shape."); + } +} + bool CenterPointTRT::detect( const sensor_msgs::msg::PointCloud2 & input_pointcloud_msg, const tf2_ros::Buffer & tf_buffer, std::vector & det_boxes3d, bool & is_num_pillars_within_range) @@ -210,13 +253,10 @@ bool CenterPointTRT::preprocess( void CenterPointTRT::inference() { - if (!encoder_trt_ptr_->context_ || !head_trt_ptr_->context_) { - throw std::runtime_error("Failed to create tensorrt context."); - } - // pillar encoder network - std::vector encoder_buffers{encoder_in_features_d_.get(), pillar_features_d_.get()}; - encoder_trt_ptr_->context_->enqueueV2(encoder_buffers.data(), stream_, nullptr); + std::vector encoder_tensors = {encoder_in_features_d_.get(), pillar_features_d_.get()}; + encoder_trt_ptr_->setTensorsAddresses(encoder_tensors); + encoder_trt_ptr_->enqueueV3(stream_); // scatter CHECK_CUDA_ERROR(scatterFeatures_launch( @@ -225,11 +265,13 @@ void CenterPointTRT::inference() spatial_features_d_.get(), stream_)); // head network - std::vector head_buffers = {spatial_features_d_.get(), head_out_heatmap_d_.get(), + std::vector head_tensors = {spatial_features_d_.get(), head_out_heatmap_d_.get(), head_out_offset_d_.get(), head_out_z_d_.get(), head_out_dim_d_.get(), head_out_rot_d_.get(), head_out_vel_d_.get()}; - head_trt_ptr_->context_->enqueueV2(head_buffers.data(), stream_, nullptr); + head_trt_ptr_->setTensorsAddresses(head_tensors); + + head_trt_ptr_->enqueueV3(stream_); } void CenterPointTRT::postProcess(std::vector & det_boxes3d) diff --git a/perception/autoware_lidar_centerpoint/lib/network/network_trt.cpp b/perception/autoware_lidar_centerpoint/lib/network/network_trt.cpp deleted file mode 100644 index 7767c0b5cbb02..0000000000000 --- a/perception/autoware_lidar_centerpoint/lib/network/network_trt.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2021 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. - -#include "autoware/lidar_centerpoint/network/network_trt.hpp" - -#include -#include - -namespace autoware::lidar_centerpoint -{ -bool VoxelEncoderTRT::setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) -{ - auto profile = builder.createOptimizationProfile(); - auto in_name = network.getInput(0)->getName(); - auto in_dims = nvinfer1::Dims3( - config_.max_voxel_size_, config_.max_point_in_voxel_size_, config_.encoder_in_feature_size_); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kMIN, in_dims); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kOPT, in_dims); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kMAX, in_dims); - - auto out_name = network.getOutput(0)->getName(); - auto out_dims = nvinfer1::Dims2(config_.max_voxel_size_, config_.encoder_out_feature_size_); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kMIN, out_dims); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kOPT, out_dims); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kMAX, out_dims); - config.addOptimizationProfile(profile); - - return true; -} - -HeadTRT::HeadTRT( - const std::vector & out_channel_sizes, const CenterPointConfig & config) -: TensorRTWrapper(config), out_channel_sizes_(out_channel_sizes) -{ -} - -bool HeadTRT::setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) -{ - auto profile = builder.createOptimizationProfile(); - auto in_name = network.getInput(0)->getName(); - auto in_dims = nvinfer1::Dims4( - config_.batch_size_, config_.encoder_out_feature_size_, config_.grid_size_y_, - config_.grid_size_x_); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kMIN, in_dims); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kOPT, in_dims); - profile->setDimensions(in_name, nvinfer1::OptProfileSelector::kMAX, in_dims); - - for (std::size_t ci = 0; ci < out_channel_sizes_.size(); ci++) { - auto out_name = network.getOutput(ci)->getName(); - - if ( - out_name == std::string("heatmap") && - network.getOutput(ci)->getDimensions().d[1] != static_cast(out_channel_sizes_[ci])) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Expected and actual number of classes do not match" << std::endl; - return false; - } - auto out_dims = nvinfer1::Dims4( - config_.batch_size_, out_channel_sizes_[ci], config_.down_grid_size_y_, - config_.down_grid_size_x_); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kMIN, out_dims); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kOPT, out_dims); - profile->setDimensions(out_name, nvinfer1::OptProfileSelector::kMAX, out_dims); - } - config.addOptimizationProfile(profile); - - return true; -} - -} // namespace autoware::lidar_centerpoint diff --git a/perception/autoware_lidar_centerpoint/lib/network/tensorrt_wrapper.cpp b/perception/autoware_lidar_centerpoint/lib/network/tensorrt_wrapper.cpp deleted file mode 100644 index 6d4c2e053b34f..0000000000000 --- a/perception/autoware_lidar_centerpoint/lib/network/tensorrt_wrapper.cpp +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2021 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. - -#include "autoware/lidar_centerpoint/network/tensorrt_wrapper.hpp" - -#include "NvOnnxParser.h" - -#include -#include -#include - -namespace autoware::lidar_centerpoint -{ -TensorRTWrapper::TensorRTWrapper(const CenterPointConfig & config) : config_(config) -{ -} - -TensorRTWrapper::~TensorRTWrapper() -{ - context_.reset(); - runtime_.reset(); - plan_.reset(); - engine_.reset(); -} - -bool TensorRTWrapper::init( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision) -{ - runtime_ = autoware::tensorrt_common::TrtUniquePtr( - nvinfer1::createInferRuntime(logger_)); - if (!runtime_) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create runtime" << std::endl; - return false; - } - - bool success; - std::ifstream engine_file(engine_path); - if (engine_file.is_open()) { - success = loadEngine(engine_path); - } else { - auto log_thread = logger_.log_throttle( - nvinfer1::ILogger::Severity::kINFO, - "Applying optimizations and building TRT CUDA engine. Please wait a minutes...", 5); - success = parseONNX(onnx_path, engine_path, precision); - logger_.stop_throttle(log_thread); - } - success &= createContext(); - - return success; -} - -bool TensorRTWrapper::createContext() -{ - if (!engine_) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Failed to create context: Engine was not created" << std::endl; - return false; - } - - context_ = autoware::tensorrt_common::TrtUniquePtr( - engine_->createExecutionContext()); - if (!context_) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create context" << std::endl; - return false; - } - - return true; -} - -bool TensorRTWrapper::parseONNX( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision, - const std::size_t workspace_size) -{ - auto builder = autoware::tensorrt_common::TrtUniquePtr( - nvinfer1::createInferBuilder(logger_)); - if (!builder) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create builder" << std::endl; - return false; - } - - auto config = autoware::tensorrt_common::TrtUniquePtr( - builder->createBuilderConfig()); - if (!config) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create config" << std::endl; - return false; - } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8400 - config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, workspace_size); -#else - config->setMaxWorkspaceSize(workspace_size); -#endif - if (precision == "fp16") { - if (builder->platformHasFastFp16()) { - autoware::tensorrt_common::LOG_INFO(logger_) << "Using TensorRT FP16 Inference" << std::endl; - config->setFlag(nvinfer1::BuilderFlag::kFP16); - } else { - autoware::tensorrt_common::LOG_INFO(logger_) - << "TensorRT FP16 Inference isn't supported in this environment" << std::endl; - } - } - - const auto flag = - 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); - auto network = autoware::tensorrt_common::TrtUniquePtr( - builder->createNetworkV2(flag)); - if (!network) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create network" << std::endl; - return false; - } - - auto parser = autoware::tensorrt_common::TrtUniquePtr( - nvonnxparser::createParser(*network, logger_)); - parser->parseFromFile(onnx_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kERROR)); - - if (!setProfile(*builder, *network, *config)) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to set profile" << std::endl; - return false; - } - - plan_ = autoware::tensorrt_common::TrtUniquePtr( - builder->buildSerializedNetwork(*network, *config)); - if (!plan_) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Failed to create serialized network" << std::endl; - return false; - } - engine_ = autoware::tensorrt_common::TrtUniquePtr( - runtime_->deserializeCudaEngine(plan_->data(), plan_->size())); - if (!engine_) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create engine" << std::endl; - return false; - } - - return saveEngine(engine_path); -} - -bool TensorRTWrapper::saveEngine(const std::string & engine_path) -{ - autoware::tensorrt_common::LOG_INFO(logger_) << "Writing to " << engine_path << std::endl; - std::ofstream file(engine_path, std::ios::out | std::ios::binary); - file.write(reinterpret_cast(plan_->data()), plan_->size()); - return true; -} - -bool TensorRTWrapper::loadEngine(const std::string & engine_path) -{ - std::ifstream engine_file(engine_path); - std::stringstream engine_buffer; - engine_buffer << engine_file.rdbuf(); - std::string engine_str = engine_buffer.str(); - engine_ = - autoware::tensorrt_common::TrtUniquePtr(runtime_->deserializeCudaEngine( - reinterpret_cast(engine_str.data()), engine_str.size())); - autoware::tensorrt_common::LOG_INFO(logger_) << "Loaded engine from " << engine_path << std::endl; - return true; -} - -} // namespace autoware::lidar_centerpoint diff --git a/perception/autoware_lidar_centerpoint/src/node.cpp b/perception/autoware_lidar_centerpoint/src/node.cpp index 825fc40234120..19d1475db9051 100644 --- a/perception/autoware_lidar_centerpoint/src/node.cpp +++ b/perception/autoware_lidar_centerpoint/src/node.cpp @@ -86,8 +86,8 @@ LidarCenterPointNode::LidarCenterPointNode(const rclcpp::NodeOptions & node_opti iou_bev_nms_.setParameters(p); } - NetworkParam encoder_param(encoder_onnx_path, encoder_engine_path, trt_precision); - NetworkParam head_param(head_onnx_path, head_engine_path, trt_precision); + TrtCommonConfig encoder_param(encoder_onnx_path, trt_precision, encoder_engine_path); + TrtCommonConfig head_param(head_onnx_path, trt_precision, head_engine_path); DensificationParam densification_param( densification_world_frame_id, densification_num_past_frames); diff --git a/perception/autoware_lidar_transfusion/CMakeLists.txt b/perception/autoware_lidar_transfusion/CMakeLists.txt index c3a56f883fbe5..fdb978c64946f 100644 --- a/perception/autoware_lidar_transfusion/CMakeLists.txt +++ b/perception/autoware_lidar_transfusion/CMakeLists.txt @@ -84,7 +84,6 @@ if(TRT_AVAIL AND CUDA_AVAIL AND CUDNN_AVAIL) ament_auto_add_library(${PROJECT_NAME}_lib SHARED lib/detection_class_remapper.cpp - lib/network/network_trt.cpp lib/postprocess/non_maximum_suppression.cpp lib/preprocess/voxel_generator.cpp lib/preprocess/pointcloud_densification.cpp diff --git a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/network/network_trt.hpp b/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/network/network_trt.hpp deleted file mode 100644 index 71cd08acdb8c8..0000000000000 --- a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/network/network_trt.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2024 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. - -#ifndef AUTOWARE__LIDAR_TRANSFUSION__NETWORK__NETWORK_TRT_HPP_ -#define AUTOWARE__LIDAR_TRANSFUSION__NETWORK__NETWORK_TRT_HPP_ - -#include "autoware/lidar_transfusion/transfusion_config.hpp" -#include "autoware/lidar_transfusion/utils.hpp" - -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace autoware::lidar_transfusion -{ - -struct ProfileDimension -{ - nvinfer1::Dims min; - nvinfer1::Dims opt; - nvinfer1::Dims max; - - bool operator!=(const ProfileDimension & rhs) const - { - return min.nbDims != rhs.min.nbDims || opt.nbDims != rhs.opt.nbDims || - max.nbDims != rhs.max.nbDims || !std::equal(min.d, min.d + min.nbDims, rhs.min.d) || - !std::equal(opt.d, opt.d + opt.nbDims, rhs.opt.d) || - !std::equal(max.d, max.d + max.nbDims, rhs.max.d); - } -}; - -class NetworkTRT -{ -public: - explicit NetworkTRT(const TransfusionConfig & config); - ~NetworkTRT(); - - bool init( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision); - const char * getTensorName(NetworkIO name); - - autoware::tensorrt_common::TrtUniquePtr engine{nullptr}; - autoware::tensorrt_common::TrtUniquePtr context{nullptr}; - -private: - bool parseONNX( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision, - std::size_t workspace_size = (1ULL << 30)); - bool saveEngine(const std::string & engine_path); - bool loadEngine(const std::string & engine_path); - bool createContext(); - bool setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config); - bool validateNetworkIO(); - nvinfer1::Dims validateTensorShape(NetworkIO name, const std::vector shape); - - autoware::tensorrt_common::TrtUniquePtr runtime_{nullptr}; - autoware::tensorrt_common::TrtUniquePtr plan_{nullptr}; - autoware::tensorrt_common::Logger logger_; - TransfusionConfig config_; - std::vector tensors_names_; - - std::array in_profile_dims_; -}; - -} // namespace autoware::lidar_transfusion - -#endif // AUTOWARE__LIDAR_TRANSFUSION__NETWORK__NETWORK_TRT_HPP_ diff --git a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_config.hpp b/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_config.hpp index 363ee17a0d6e0..e60ee04150b5c 100644 --- a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_config.hpp +++ b/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_config.hpp @@ -35,21 +35,21 @@ class TransfusionConfig if (voxels_num.size() == 3) { max_voxels_ = voxels_num[2]; - voxels_num_[0] = voxels_num[0]; - voxels_num_[1] = voxels_num[1]; - voxels_num_[2] = voxels_num[2]; + voxels_num_[0] = static_cast(voxels_num[0]); + voxels_num_[1] = static_cast(voxels_num[1]); + voxels_num_[2] = static_cast(voxels_num[2]); - min_voxel_size_ = voxels_num[0]; - opt_voxel_size_ = voxels_num[1]; - max_voxel_size_ = voxels_num[2]; + min_voxel_size_ = static_cast(voxels_num[0]); + opt_voxel_size_ = static_cast(voxels_num[1]); + max_voxel_size_ = static_cast(voxels_num[2]); - min_points_size_ = voxels_num[0]; - opt_points_size_ = voxels_num[1]; - max_points_size_ = voxels_num[2]; + min_points_size_ = static_cast(voxels_num[0]); + opt_points_size_ = static_cast(voxels_num[1]); + max_points_size_ = static_cast(voxels_num[2]); - min_coors_size_ = voxels_num[0]; - opt_coors_size_ = voxels_num[1]; - max_coors_size_ = voxels_num[2]; + min_coors_size_ = static_cast(voxels_num[0]); + opt_coors_size_ = static_cast(voxels_num[1]); + max_coors_size_ = static_cast(voxels_num[2]); } if (point_cloud_range.size() == 6) { min_x_range_ = static_cast(point_cloud_range[0]); @@ -91,7 +91,7 @@ class TransfusionConfig std::size_t cloud_capacity_{}; ///// KERNEL PARAMETERS ///// const std::size_t threads_for_voxel_{256}; // threads number for a block - const std::size_t points_per_voxel_{20}; + const int32_t points_per_voxel_{20}; const std::size_t warp_size_{32}; // one warp(32 threads) for one pillar const std::size_t pillars_per_block_{64}; // one thread deals with one pillar // and a block has pillars_per_block threads @@ -99,9 +99,9 @@ class TransfusionConfig std::size_t max_voxels_{60000}; ///// NETWORK PARAMETERS ///// - const std::size_t batch_size_{1}; - const std::size_t num_classes_{5}; - const std::size_t num_point_feature_size_{5}; // x, y, z, intensity, lag + const int32_t batch_size_{1}; + const int32_t num_classes_{5}; + const int32_t num_point_feature_size_{5}; // x, y, z, intensity, lag // the dimension of the input cloud float min_x_range_{-76.8}; float max_x_range_{76.8}; @@ -114,9 +114,9 @@ class TransfusionConfig float voxel_y_size_{0.3}; float voxel_z_size_{8.0}; const std::size_t out_size_factor_{4}; - const std::size_t max_num_points_per_pillar_{points_per_voxel_}; - const std::size_t num_point_values_{4}; - std::size_t num_proposals_{200}; + const int32_t max_num_points_per_pillar_{points_per_voxel_}; + const int32_t num_point_values_{4}; + int32_t num_proposals_{200}; // the number of feature maps for pillar scatter const std::size_t num_feature_scatter_{pillar_feature_size_}; // the score threshold for classification @@ -126,7 +126,7 @@ class TransfusionConfig std::size_t max_num_pillars_{max_voxels_}; const std::size_t pillar_points_bev_{max_num_points_per_pillar_ * max_num_pillars_}; // the detected boxes result decode by (x, y, z, w, l, h, yaw) - const std::size_t num_box_values_{8}; + const int32_t num_box_values_{8}; // the input size of the 2D backbone network std::size_t grid_x_size_{512}; std::size_t grid_y_size_{512}; @@ -136,33 +136,33 @@ class TransfusionConfig std::size_t feature_y_size_{grid_y_size_ / out_size_factor_}; ///// RUNTIME DIMENSIONS ///// - std::vector voxels_num_{5000, 30000, 60000}; + std::vector voxels_num_{5000, 30000, 60000}; // voxels - std::size_t min_voxel_size_{voxels_num_[0]}; - std::size_t opt_voxel_size_{voxels_num_[1]}; - std::size_t max_voxel_size_{voxels_num_[2]}; + int32_t min_voxel_size_{voxels_num_[0]}; + int32_t opt_voxel_size_{voxels_num_[1]}; + int32_t max_voxel_size_{voxels_num_[2]}; - std::size_t min_point_in_voxel_size_{points_per_voxel_}; - std::size_t opt_point_in_voxel_size_{points_per_voxel_}; - std::size_t max_point_in_voxel_size_{points_per_voxel_}; + int32_t min_point_in_voxel_size_{points_per_voxel_}; + int32_t opt_point_in_voxel_size_{points_per_voxel_}; + int32_t max_point_in_voxel_size_{points_per_voxel_}; - std::size_t min_network_feature_size_{num_point_feature_size_}; - std::size_t opt_network_feature_size_{num_point_feature_size_}; - std::size_t max_network_feature_size_{num_point_feature_size_}; + int32_t min_network_feature_size_{num_point_feature_size_}; + int32_t opt_network_feature_size_{num_point_feature_size_}; + int32_t max_network_feature_size_{num_point_feature_size_}; // num_points - std::size_t min_points_size_{voxels_num_[0]}; - std::size_t opt_points_size_{voxels_num_[1]}; - std::size_t max_points_size_{voxels_num_[2]}; + int32_t min_points_size_{voxels_num_[0]}; + int32_t opt_points_size_{voxels_num_[1]}; + int32_t max_points_size_{voxels_num_[2]}; // coors - std::size_t min_coors_size_{voxels_num_[0]}; - std::size_t opt_coors_size_{voxels_num_[1]}; - std::size_t max_coors_size_{voxels_num_[2]}; + int32_t min_coors_size_{voxels_num_[0]}; + int32_t opt_coors_size_{voxels_num_[1]}; + int32_t max_coors_size_{voxels_num_[2]}; - std::size_t min_coors_dim_size_{num_point_values_}; - std::size_t opt_coors_dim_size_{num_point_values_}; - std::size_t max_coors_dim_size_{num_point_values_}; + int32_t min_coors_dim_size_{num_point_values_}; + int32_t opt_coors_dim_size_{num_point_values_}; + int32_t max_coors_dim_size_{num_point_values_}; }; } // namespace autoware::lidar_transfusion diff --git a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_trt.hpp b/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_trt.hpp index 06dd65b4b805f..00bb5e726706c 100644 --- a/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_trt.hpp +++ b/perception/autoware_lidar_transfusion/include/autoware/lidar_transfusion/transfusion_trt.hpp @@ -16,7 +16,6 @@ #define AUTOWARE__LIDAR_TRANSFUSION__TRANSFUSION_TRT_HPP_ #include "autoware/lidar_transfusion/cuda_utils.hpp" -#include "autoware/lidar_transfusion/network/network_trt.hpp" #include "autoware/lidar_transfusion/postprocess/postprocess_kernel.hpp" #include "autoware/lidar_transfusion/preprocess/pointcloud_densification.hpp" #include "autoware/lidar_transfusion/preprocess/preprocess_kernel.hpp" @@ -24,6 +23,7 @@ #include "autoware/lidar_transfusion/utils.hpp" #include "autoware/lidar_transfusion/visibility_control.hpp" +#include #include #include @@ -34,38 +34,17 @@ #include #include #include -#include #include namespace autoware::lidar_transfusion { -class NetworkParam -{ -public: - NetworkParam(std::string onnx_path, std::string engine_path, std::string trt_precision) - : onnx_path_(std::move(onnx_path)), - engine_path_(std::move(engine_path)), - trt_precision_(std::move(trt_precision)) - { - } - - std::string onnx_path() const { return onnx_path_; } - std::string engine_path() const { return engine_path_; } - std::string trt_precision() const { return trt_precision_; } - -private: - std::string onnx_path_; - std::string engine_path_; - std::string trt_precision_; -}; - class LIDAR_TRANSFUSION_PUBLIC TransfusionTRT { public: explicit TransfusionTRT( - const NetworkParam & network_param, const DensificationParam & densification_param, - const TransfusionConfig & config); + const tensorrt_common::TrtCommonConfig & trt_config, + const DensificationParam & densification_param, const TransfusionConfig config); virtual ~TransfusionTRT(); bool detect( @@ -73,6 +52,8 @@ class LIDAR_TRANSFUSION_PUBLIC TransfusionTRT std::vector & det_boxes3d, std::unordered_map & proc_timing); protected: + void initTrt(const tensorrt_common::TrtCommonConfig & trt_config); + void initPtr(); bool preprocess(const sensor_msgs::msg::PointCloud2 & msg, const tf2_ros::Buffer & tf_buffer); @@ -81,7 +62,7 @@ class LIDAR_TRANSFUSION_PUBLIC TransfusionTRT bool postprocess(std::vector & det_boxes3d); - std::unique_ptr network_trt_ptr_{nullptr}; + std::unique_ptr network_trt_ptr_{nullptr}; std::unique_ptr vg_ptr_{nullptr}; std::unique_ptr> stop_watch_ptr_{ nullptr}; diff --git a/perception/autoware_lidar_transfusion/lib/network/network_trt.cpp b/perception/autoware_lidar_transfusion/lib/network/network_trt.cpp deleted file mode 100644 index 8e3cb8a55ec7e..0000000000000 --- a/perception/autoware_lidar_transfusion/lib/network/network_trt.cpp +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright 2024 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. - -#include "autoware/lidar_transfusion/network/network_trt.hpp" - -#include - -#include -#include -#include -#include -#include - -namespace autoware::lidar_transfusion -{ - -inline NetworkIO nameToNetworkIO(const char * name) -{ - static const std::unordered_map name_to_enum = { - {"voxels", NetworkIO::voxels}, {"num_points", NetworkIO::num_points}, - {"coors", NetworkIO::coors}, {"cls_score0", NetworkIO::cls_score}, - {"bbox_pred0", NetworkIO::bbox_pred}, {"dir_cls_pred0", NetworkIO::dir_pred}}; - - auto it = name_to_enum.find(name); - if (it != name_to_enum.end()) { - return it->second; - } - throw std::runtime_error("Invalid input name: " + std::string(name)); -} - -std::ostream & operator<<(std::ostream & os, const ProfileDimension & profile) -{ - std::string delim = ""; - os << "min->["; - for (int i = 0; i < profile.min.nbDims; ++i) { - os << delim << profile.min.d[i]; - delim = ", "; - } - os << "], opt->["; - delim = ""; - for (int i = 0; i < profile.opt.nbDims; ++i) { - os << delim << profile.opt.d[i]; - delim = ", "; - } - os << "], max->["; - delim = ""; - for (int i = 0; i < profile.max.nbDims; ++i) { - os << delim << profile.max.d[i]; - delim = ", "; - } - os << "]"; - return os; -} - -NetworkTRT::NetworkTRT(const TransfusionConfig & config) : config_(config) -{ - ProfileDimension voxels_dims = { - nvinfer1::Dims3( - config_.min_voxel_size_, config_.min_point_in_voxel_size_, config_.min_network_feature_size_), - nvinfer1::Dims3( - config_.opt_voxel_size_, config_.opt_point_in_voxel_size_, config_.opt_network_feature_size_), - nvinfer1::Dims3( - config_.max_voxel_size_, config_.max_point_in_voxel_size_, - config_.max_network_feature_size_)}; - ProfileDimension num_points_dims = { - nvinfer1::Dims{1, {static_cast(config_.min_points_size_)}}, - nvinfer1::Dims{1, {static_cast(config_.opt_points_size_)}}, - nvinfer1::Dims{1, {static_cast(config_.max_points_size_)}}}; - ProfileDimension coors_dims = { - nvinfer1::Dims2(config_.min_coors_size_, config_.min_coors_dim_size_), - nvinfer1::Dims2(config_.opt_coors_size_, config_.opt_coors_dim_size_), - nvinfer1::Dims2(config_.max_coors_size_, config_.max_coors_dim_size_)}; - in_profile_dims_ = {voxels_dims, num_points_dims, coors_dims}; -} - -NetworkTRT::~NetworkTRT() -{ - context.reset(); - runtime_.reset(); - plan_.reset(); - engine.reset(); -} - -bool NetworkTRT::init( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision) -{ - runtime_ = autoware::tensorrt_common::TrtUniquePtr( - nvinfer1::createInferRuntime(logger_)); - if (!runtime_) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create runtime" << std::endl; - return false; - } - - bool success; - std::ifstream engine_file(engine_path); - if (engine_file.is_open()) { - success = loadEngine(engine_path); - } else { - auto log_thread = logger_.log_throttle( - nvinfer1::ILogger::Severity::kINFO, - "Applying optimizations and building TRT CUDA engine. Please wait a minutes...", 5); - success = parseONNX(onnx_path, engine_path, precision); - logger_.stop_throttle(log_thread); - } - success &= createContext(); - - return success; -} - -bool NetworkTRT::setProfile( - nvinfer1::IBuilder & builder, nvinfer1::INetworkDefinition & network, - nvinfer1::IBuilderConfig & config) -{ - auto profile = builder.createOptimizationProfile(); - - auto voxels_name = network.getInput(NetworkIO::voxels)->getName(); - auto num_points_name = network.getInput(NetworkIO::num_points)->getName(); - auto coors_name = network.getInput(NetworkIO::coors)->getName(); - - profile->setDimensions( - voxels_name, nvinfer1::OptProfileSelector::kMIN, in_profile_dims_[NetworkIO::voxels].min); - profile->setDimensions( - voxels_name, nvinfer1::OptProfileSelector::kOPT, in_profile_dims_[NetworkIO::voxels].opt); - profile->setDimensions( - voxels_name, nvinfer1::OptProfileSelector::kMAX, in_profile_dims_[NetworkIO::voxels].max); - - profile->setDimensions( - num_points_name, nvinfer1::OptProfileSelector::kMIN, - in_profile_dims_[NetworkIO::num_points].min); - profile->setDimensions( - num_points_name, nvinfer1::OptProfileSelector::kOPT, - in_profile_dims_[NetworkIO::num_points].opt); - profile->setDimensions( - num_points_name, nvinfer1::OptProfileSelector::kMAX, - in_profile_dims_[NetworkIO::num_points].max); - - profile->setDimensions( - coors_name, nvinfer1::OptProfileSelector::kMIN, in_profile_dims_[NetworkIO::coors].min); - profile->setDimensions( - coors_name, nvinfer1::OptProfileSelector::kOPT, in_profile_dims_[NetworkIO::coors].opt); - profile->setDimensions( - coors_name, nvinfer1::OptProfileSelector::kMAX, in_profile_dims_[NetworkIO::coors].max); - - config.addOptimizationProfile(profile); - return true; -} - -bool NetworkTRT::createContext() -{ - if (!engine) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Failed to create context: Engine was not created" << std::endl; - return false; - } - - context = autoware::tensorrt_common::TrtUniquePtr( - engine->createExecutionContext()); - if (!context) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create context" << std::endl; - return false; - } - - return true; -} - -bool NetworkTRT::parseONNX( - const std::string & onnx_path, const std::string & engine_path, const std::string & precision, - const size_t workspace_size) -{ - auto builder = autoware::tensorrt_common::TrtUniquePtr( - nvinfer1::createInferBuilder(logger_)); - if (!builder) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create builder" << std::endl; - return false; - } - - auto config = autoware::tensorrt_common::TrtUniquePtr( - builder->createBuilderConfig()); - if (!config) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create config" << std::endl; - return false; - } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8400 - config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, workspace_size); -#else - config->setMaxWorkspaceSize(workspace_size); -#endif - if (precision == "fp16") { - if (builder->platformHasFastFp16()) { - autoware::tensorrt_common::LOG_INFO(logger_) << "Using TensorRT FP16 Inference" << std::endl; - config->setFlag(nvinfer1::BuilderFlag::kFP16); - } else { - autoware::tensorrt_common::LOG_INFO(logger_) - << "TensorRT FP16 Inference isn't supported in this environment" << std::endl; - } - } - - const auto flag = - 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); - auto network = autoware::tensorrt_common::TrtUniquePtr( - builder->createNetworkV2(flag)); - if (!network) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create network" << std::endl; - return false; - } - - auto parser = autoware::tensorrt_common::TrtUniquePtr( - nvonnxparser::createParser(*network, logger_)); - parser->parseFromFile(onnx_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kERROR)); - - if (!setProfile(*builder, *network, *config)) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to set profile" << std::endl; - return false; - } - - plan_ = autoware::tensorrt_common::TrtUniquePtr( - builder->buildSerializedNetwork(*network, *config)); - if (!plan_) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Failed to create serialized network" << std::endl; - return false; - } - engine = autoware::tensorrt_common::TrtUniquePtr( - runtime_->deserializeCudaEngine(plan_->data(), plan_->size())); - if (!engine) { - autoware::tensorrt_common::LOG_ERROR(logger_) << "Failed to create engine" << std::endl; - return false; - } - - return saveEngine(engine_path); -} - -bool NetworkTRT::saveEngine(const std::string & engine_path) -{ - autoware::tensorrt_common::LOG_INFO(logger_) << "Writing to " << engine_path << std::endl; - std::ofstream file(engine_path, std::ios::out | std::ios::binary); - file.write(reinterpret_cast(plan_->data()), plan_->size()); - return validateNetworkIO(); -} - -bool NetworkTRT::loadEngine(const std::string & engine_path) -{ - std::ifstream engine_file(engine_path); - std::stringstream engine_buffer; - engine_buffer << engine_file.rdbuf(); - std::string engine_str = engine_buffer.str(); - engine = - autoware::tensorrt_common::TrtUniquePtr(runtime_->deserializeCudaEngine( - reinterpret_cast(engine_str.data()), engine_str.size())); - autoware::tensorrt_common::LOG_INFO(logger_) << "Loaded engine from " << engine_path << std::endl; - return validateNetworkIO(); -} - -bool NetworkTRT::validateNetworkIO() -{ - // Whether the number of IO match the expected size - if (engine->getNbIOTensors() != NetworkIO::ENUM_SIZE) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Invalid network IO. Expected size: " << NetworkIO::ENUM_SIZE - << ". Actual size: " << engine->getNbIOTensors() << "." << std::endl; - throw std::runtime_error("Failed to initialize TRT network."); - } - - // Initialize tensors_names_ with null values - tensors_names_.resize(NetworkIO::ENUM_SIZE, nullptr); - - // Loop over the tensor names and place them in the correct positions - for (int i = 0; i < NetworkIO::ENUM_SIZE; ++i) { - const char * name = engine->getIOTensorName(i); - tensors_names_[nameToNetworkIO(name)] = name; - } - - // Log the network IO - std::string tensors = std::accumulate( - tensors_names_.begin(), tensors_names_.end(), std::string(), - [](const std::string & a, const std::string & b) -> std::string { return a + b + " "; }); - autoware::tensorrt_common::LOG_INFO(logger_) << "Network IO: " << tensors << std::endl; - - // Whether the current engine input profile match the config input profile - for (int i = 0; i <= NetworkIO::coors; ++i) { - ProfileDimension engine_dims{ - engine->getProfileShape(tensors_names_[i], 0, nvinfer1::OptProfileSelector::kMIN), - engine->getProfileShape(tensors_names_[i], 0, nvinfer1::OptProfileSelector::kOPT), - engine->getProfileShape(tensors_names_[i], 0, nvinfer1::OptProfileSelector::kMAX)}; - - autoware::tensorrt_common::LOG_INFO(logger_) - << "Profile for " << tensors_names_[i] << ": " << engine_dims << std::endl; - - if (engine_dims != in_profile_dims_[i]) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Invalid network input dimension. Config: " << in_profile_dims_[i] - << ". Please change the input profile or delete the engine file and build engine again." - << std::endl; - throw std::runtime_error("Failed to initialize TRT network."); - } - } - - // Whether the IO tensor shapes match the network config, -1 for dynamic size - validateTensorShape( - NetworkIO::voxels, {-1, static_cast(config_.points_per_voxel_), - static_cast(config_.num_point_feature_size_)}); - validateTensorShape(NetworkIO::num_points, {-1}); - validateTensorShape(NetworkIO::coors, {-1, static_cast(config_.num_point_values_)}); - auto cls_score = validateTensorShape( - NetworkIO::cls_score, - {static_cast(config_.batch_size_), static_cast(config_.num_classes_), - static_cast(config_.num_proposals_)}); - autoware::tensorrt_common::LOG_INFO(logger_) - << "Network num classes: " << cls_score.d[1] << std::endl; - validateTensorShape( - NetworkIO::dir_pred, - {static_cast(config_.batch_size_), 2, static_cast(config_.num_proposals_)}); // x, y - validateTensorShape( - NetworkIO::bbox_pred, - {static_cast(config_.batch_size_), static_cast(config_.num_box_values_), - static_cast(config_.num_proposals_)}); - - return true; -} - -const char * NetworkTRT::getTensorName(NetworkIO name) -{ - return tensors_names_.at(name); -} - -nvinfer1::Dims NetworkTRT::validateTensorShape(NetworkIO name, const std::vector shape) -{ - auto tensor_shape = engine->getTensorShape(tensors_names_[name]); - if (tensor_shape.nbDims != static_cast(shape.size())) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Invalid tensor shape for " << tensors_names_[name] << ". Expected size: " << shape.size() - << ". Actual size: " << tensor_shape.nbDims << "." << std::endl; - throw std::runtime_error("Failed to initialize TRT network."); - } - for (int i = 0; i < tensor_shape.nbDims; ++i) { - if (tensor_shape.d[i] != static_cast(shape[i])) { - autoware::tensorrt_common::LOG_ERROR(logger_) - << "Invalid tensor shape for " << tensors_names_[name] << ". Expected: " << shape[i] - << ". Actual: " << tensor_shape.d[i] << "." << std::endl; - throw std::runtime_error("Failed to initialize TRT network."); - } - } - return tensor_shape; -} - -} // namespace autoware::lidar_transfusion diff --git a/perception/autoware_lidar_transfusion/lib/transfusion_trt.cpp b/perception/autoware_lidar_transfusion/lib/transfusion_trt.cpp index 4e100f2e794d5..dd075a45cb29c 100644 --- a/perception/autoware_lidar_transfusion/lib/transfusion_trt.cpp +++ b/perception/autoware_lidar_transfusion/lib/transfusion_trt.cpp @@ -17,6 +17,7 @@ #include "autoware/lidar_transfusion/preprocess/preprocess_kernel.hpp" #include "autoware/lidar_transfusion/transfusion_config.hpp" +#include #include #include @@ -27,25 +28,23 @@ #include #include #include +#include #include namespace autoware::lidar_transfusion { TransfusionTRT::TransfusionTRT( - const NetworkParam & network_param, const DensificationParam & densification_param, - const TransfusionConfig & config) -: config_(config) + const tensorrt_common::TrtCommonConfig & trt_config, + const DensificationParam & densification_param, TransfusionConfig config) +: config_(std::move(config)) { - network_trt_ptr_ = std::make_unique(config_); - - network_trt_ptr_->init( - network_param.onnx_path(), network_param.engine_path(), network_param.trt_precision()); vg_ptr_ = std::make_unique(densification_param, config_, stream_); stop_watch_ptr_ = std::make_unique>(); stop_watch_ptr_->tic("processing/inner"); initPtr(); + initTrt(trt_config); CHECK_CUDA_ERROR(cudaStreamCreate(&stream_)); } @@ -99,6 +98,51 @@ void TransfusionTRT::initPtr() post_ptr_ = std::make_unique(config_, stream_); } +void TransfusionTRT::initTrt(const tensorrt_common::TrtCommonConfig & trt_config) +{ + std::vector network_io{ + autoware::tensorrt_common::NetworkIO( + "voxels", {3, {-1, config_.points_per_voxel_, config_.num_point_feature_size_}}), + autoware::tensorrt_common::NetworkIO("num_points", {1, {-1}}), + autoware::tensorrt_common::NetworkIO("coors", {2, {-1, config_.num_point_values_}}), + autoware::tensorrt_common::NetworkIO( + "cls_score0", {3, {config_.batch_size_, config_.num_classes_, config_.num_proposals_}}), + autoware::tensorrt_common::NetworkIO( + "bbox_pred0", {3, {config_.batch_size_, config_.num_box_values_, config_.num_proposals_}}), + autoware::tensorrt_common::NetworkIO( + "dir_cls_pred0", {3, {config_.batch_size_, 2, config_.num_proposals_}})}; + + std::vector profile_dims{ + autoware::tensorrt_common::ProfileDims( + "voxels", + {3, + {config_.min_voxel_size_, config_.min_point_in_voxel_size_, + config_.min_network_feature_size_}}, + {3, + {config_.opt_voxel_size_, config_.opt_point_in_voxel_size_, + config_.opt_network_feature_size_}}, + {3, + {config_.max_voxel_size_, config_.max_point_in_voxel_size_, + config_.max_network_feature_size_}}), + autoware::tensorrt_common::ProfileDims( + "num_points", {1, {static_cast(config_.min_points_size_)}}, + {1, {static_cast(config_.opt_points_size_)}}, + {1, {static_cast(config_.max_points_size_)}}), + autoware::tensorrt_common::ProfileDims( + "coors", {2, {config_.min_coors_size_, config_.min_coors_dim_size_}}, + {2, {config_.opt_coors_size_, config_.opt_coors_dim_size_}}, + {2, {config_.max_coors_size_, config_.max_coors_dim_size_}})}; + + auto network_io_ptr = + std::make_unique>(network_io); + auto profile_dims_ptr = + std::make_unique>(profile_dims); + + network_trt_ptr_ = std::make_unique(trt_config); + if (!network_trt_ptr_->setup(std::move(profile_dims_ptr), std::move(network_io_ptr))) + throw std::runtime_error("Failed to setup TRT engine."); +} + bool TransfusionTRT::detect( const sensor_msgs::msg::PointCloud2 & msg, const tf2_ros::Buffer & tf_buffer, std::vector & det_boxes3d, std::unordered_map & proc_timing) @@ -166,8 +210,9 @@ bool TransfusionTRT::preprocess( CHECK_CUDA_ERROR(cudaMemcpyAsync( ¶ms_input, params_input_d_.get(), sizeof(unsigned int), cudaMemcpyDeviceToHost, stream_)); CHECK_CUDA_ERROR(cudaStreamSynchronize(stream_)); + auto params_input_i32 = static_cast(params_input); - if (params_input < config_.min_voxel_size_) { + if (params_input_i32 < config_.min_voxel_size_) { RCLCPP_WARN_STREAM( rclcpp::get_logger("lidar_transfusion"), "Too few voxels (" << params_input << ") for actual optimization profile (" @@ -185,39 +230,34 @@ bool TransfusionTRT::preprocess( params_input = config_.max_voxels_; } + RCLCPP_DEBUG_STREAM( rclcpp::get_logger("lidar_transfusion"), "Generated input voxels: " << params_input); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::voxels), voxel_features_d_.get()); - network_trt_ptr_->context->setInputShape( - network_trt_ptr_->getTensorName(NetworkIO::voxels), + bool success = true; + + // Inputs + success &= network_trt_ptr_->setTensor( + "voxels", voxel_features_d_.get(), nvinfer1::Dims3{ - static_cast(params_input), static_cast(config_.max_num_points_per_pillar_), + params_input_i32, config_.max_num_points_per_pillar_, static_cast(config_.num_point_feature_size_)}); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::num_points), voxel_num_d_.get()); - network_trt_ptr_->context->setInputShape( - network_trt_ptr_->getTensorName(NetworkIO::num_points), - nvinfer1::Dims{1, {static_cast(params_input)}}); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::coors), voxel_idxs_d_.get()); - network_trt_ptr_->context->setInputShape( - network_trt_ptr_->getTensorName(NetworkIO::coors), - nvinfer1::Dims2{ - static_cast(params_input), static_cast(config_.num_point_values_)}); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::cls_score), cls_output_d_.get()); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::bbox_pred), box_output_d_.get()); - network_trt_ptr_->context->setTensorAddress( - network_trt_ptr_->getTensorName(NetworkIO::dir_pred), dir_cls_output_d_.get()); - return true; + success &= network_trt_ptr_->setTensor( + "num_points", voxel_num_d_.get(), nvinfer1::Dims{1, {params_input_i32}}); + success &= network_trt_ptr_->setTensor( + "coors", voxel_idxs_d_.get(), nvinfer1::Dims2{params_input_i32, config_.num_point_values_}); + + // Outputs + success &= network_trt_ptr_->setTensor("cls_score0", cls_output_d_.get()); + success &= network_trt_ptr_->setTensor("bbox_pred0", box_output_d_.get()); + success &= network_trt_ptr_->setTensor("dir_cls_pred0", dir_cls_output_d_.get()); + + return success; } bool TransfusionTRT::inference() { - auto status = network_trt_ptr_->context->enqueueV3(stream_); + auto status = network_trt_ptr_->enqueueV3(stream_); CHECK_CUDA_ERROR(cudaStreamSynchronize(stream_)); if (!status) { diff --git a/perception/autoware_lidar_transfusion/src/lidar_transfusion_node.cpp b/perception/autoware_lidar_transfusion/src/lidar_transfusion_node.cpp index 8bb70a821621f..563abd97698e0 100644 --- a/perception/autoware_lidar_transfusion/src/lidar_transfusion_node.cpp +++ b/perception/autoware_lidar_transfusion/src/lidar_transfusion_node.cpp @@ -75,7 +75,6 @@ LidarTransfusionNode::LidarTransfusionNode(const rclcpp::NodeOptions & options) const float score_threshold = static_cast(this->declare_parameter("score_threshold", descriptor)); - NetworkParam network_param(onnx_path, engine_path, trt_precision); DensificationParam densification_param( densification_world_frame_id, densification_num_past_frames); TransfusionConfig config( @@ -91,7 +90,9 @@ LidarTransfusionNode::LidarTransfusionNode(const rclcpp::NodeOptions & options) detection_class_remapper_.setParameters( allow_remapping_by_area_matrix, min_area_matrix, max_area_matrix); - detector_ptr_ = std::make_unique(network_param, densification_param, config); + auto trt_config = tensorrt_common::TrtCommonConfig(onnx_path, trt_precision, engine_path); + + detector_ptr_ = std::make_unique(trt_config, densification_param, config); cloud_sub_ = this->create_subscription( "~/input/pointcloud", rclcpp::SensorDataQoS{}.keep_last(1), @@ -155,7 +156,6 @@ void LidarTransfusionNode::cloudCallback(const sensor_msgs::msg::PointCloud2::Co objects_pub_->publish(output_msg); published_time_pub_->publish_if_subscribed(objects_pub_, output_msg.header.stamp); } - // add processing time for debug if (debug_publisher_ptr_ && stop_watch_ptr_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic", true); diff --git a/perception/autoware_shape_estimation/CMakeLists.txt b/perception/autoware_shape_estimation/CMakeLists.txt index d0eb2aa5535a8..d7313111e6ade 100644 --- a/perception/autoware_shape_estimation/CMakeLists.txt +++ b/perception/autoware_shape_estimation/CMakeLists.txt @@ -4,6 +4,9 @@ project(autoware_shape_estimation) find_package(autoware_cmake REQUIRED) autoware_package() +# TODO(amadeuszsz): Remove -Wno-deprecated-declarations once removing implicit quantization +add_compile_options(-Wno-deprecated-declarations) + find_package(PCL REQUIRED COMPONENTS common) find_package(pcl_conversions REQUIRED) diff --git a/perception/autoware_shape_estimation/include/autoware/shape_estimation/tensorrt_shape_estimator.hpp b/perception/autoware_shape_estimation/include/autoware/shape_estimation/tensorrt_shape_estimator.hpp index d39dce65d224d..4328246ff395f 100644 --- a/perception/autoware_shape_estimation/include/autoware/shape_estimation/tensorrt_shape_estimator.hpp +++ b/perception/autoware_shape_estimation/include/autoware/shape_estimation/tensorrt_shape_estimator.hpp @@ -48,11 +48,7 @@ class TrtShapeEstimator { public: TrtShapeEstimator( - const std::string & model_path, const std::string & precision, - const autoware::tensorrt_common::BatchConfig & batch_config, - const size_t max_workspace_size = (1 << 30), - const autoware::tensorrt_common::BuildConfig build_config = - autoware::tensorrt_common::BuildConfig("MinMax", -1, false, false, false, 0.0)); + const std::string & model_path, const std::string & precision, const int batch_size); ~TrtShapeEstimator() = default; diff --git a/perception/autoware_shape_estimation/lib/tensorrt_shape_estimator.cpp b/perception/autoware_shape_estimation/lib/tensorrt_shape_estimator.cpp index b4b1f18832da7..fa3c3cb09bad3 100644 --- a/perception/autoware_shape_estimation/lib/tensorrt_shape_estimator.cpp +++ b/perception/autoware_shape_estimation/lib/tensorrt_shape_estimator.cpp @@ -29,47 +29,41 @@ namespace autoware::shape_estimation { TrtShapeEstimator::TrtShapeEstimator( - const std::string & model_path, const std::string & precision, - const autoware::tensorrt_common::BatchConfig & batch_config, const size_t max_workspace_size, - const autoware::tensorrt_common::BuildConfig build_config) + const std::string & model_path, const std::string & precision, const int batch_size) { trt_common_ = std::make_unique( - model_path, precision, nullptr, batch_config, max_workspace_size, build_config); + tensorrt_common::TrtCommonConfig(model_path, precision)); + batch_size_ = batch_size; - trt_common_->setup(); - - if (!trt_common_->isInitialized()) { - std::cerr << "Failed to initialize TensorRT" << std::endl; - return; + if (!trt_common_->setup()) { + throw std::runtime_error("Failed to setup TensorRT"); } - const auto pc_input_dims = trt_common_->getBindingDimensions(0); + const auto pc_input_dims = trt_common_->getTensorShape(0); const auto pc_input_size = std::accumulate( pc_input_dims.d + 1, pc_input_dims.d + pc_input_dims.nbDims, 1, std::multiplies()); - input_pc_d_ = autoware::cuda_utils::make_unique(pc_input_size * batch_config[2]); - batch_size_ = batch_config[2]; - const auto one_hot_input_dims = trt_common_->getBindingDimensions(1); + input_pc_d_ = autoware::cuda_utils::make_unique(pc_input_size * batch_size_); + const auto one_hot_input_dims = trt_common_->getTensorShape(1); const auto one_hot_input_size = std::accumulate( one_hot_input_dims.d + 1, one_hot_input_dims.d + one_hot_input_dims.nbDims, 1, std::multiplies()); - input_one_hot_d_ = - autoware::cuda_utils::make_unique(one_hot_input_size * batch_config[2]); + input_one_hot_d_ = autoware::cuda_utils::make_unique(one_hot_input_size * batch_size_); - const auto stage1_center_out_dims = trt_common_->getBindingDimensions(2); + const auto stage1_center_out_dims = trt_common_->getTensorShape(2); out_s1center_elem_num_ = std::accumulate( stage1_center_out_dims.d + 1, stage1_center_out_dims.d + stage1_center_out_dims.nbDims, 1, std::multiplies()); - out_s1center_elem_num_ = out_s1center_elem_num_ * batch_config[2]; - out_s1center_elem_num_per_batch_ = static_cast(out_s1center_elem_num_ / batch_config[2]); + out_s1center_elem_num_ = out_s1center_elem_num_ * batch_size_; + out_s1center_elem_num_per_batch_ = static_cast(out_s1center_elem_num_ / batch_size_); out_s1center_prob_d_ = autoware::cuda_utils::make_unique(out_s1center_elem_num_); out_s1center_prob_h_ = autoware::cuda_utils::make_unique_host(out_s1center_elem_num_, cudaHostAllocPortable); - const auto pred_out_dims = trt_common_->getBindingDimensions(3); + const auto pred_out_dims = trt_common_->getTensorShape(3); out_pred_elem_num_ = std::accumulate( pred_out_dims.d + 1, pred_out_dims.d + pred_out_dims.nbDims, 1, std::multiplies()); - out_pred_elem_num_ = out_pred_elem_num_ * batch_config[2]; - out_pred_elem_num_per_batch_ = static_cast(out_pred_elem_num_ / batch_config[2]); + out_pred_elem_num_ = out_pred_elem_num_ * batch_size_; + out_pred_elem_num_per_batch_ = static_cast(out_pred_elem_num_ / batch_size_); out_pred_prob_d_ = autoware::cuda_utils::make_unique(out_pred_elem_num_); out_pred_prob_h_ = autoware::cuda_utils::make_unique_host(out_pred_elem_num_, cudaHostAllocPortable); @@ -83,10 +77,6 @@ TrtShapeEstimator::TrtShapeEstimator( bool TrtShapeEstimator::inference( const DetectedObjectsWithFeature & input, DetectedObjectsWithFeature & output) { - if (!trt_common_->isInitialized()) { - return false; - } - bool result = false; for (size_t i = 0; i < input.feature_objects.size(); i += batch_size_) { @@ -111,13 +101,13 @@ bool TrtShapeEstimator::inference( void TrtShapeEstimator::preprocess(const DetectedObjectsWithFeature & input) { - auto input_dims_pc = trt_common_->getBindingDimensions(0); + auto input_dims_pc = trt_common_->getTensorShape(0); int batch_size = static_cast(input.feature_objects.size()); const auto input_chan = static_cast(input_dims_pc.d[1]); const auto input_pc_size = static_cast(input_dims_pc.d[2]); - auto input_dims_one_hot = trt_common_->getBindingDimensions(1); + auto input_dims_one_hot = trt_common_->getTensorShape(1); const auto input_one_hot_size = static_cast(input_dims_one_hot.d[1]); int volume_pc = batch_size * input_chan * input_pc_size; @@ -229,7 +219,10 @@ bool TrtShapeEstimator::feed_forward_and_decode( int batch_size = static_cast(input.feature_objects.size()); std::vector buffers = { input_pc_d_.get(), input_one_hot_d_.get(), out_s1center_prob_d_.get(), out_pred_prob_d_.get()}; - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); CHECK_CUDA_ERROR(cudaMemcpyAsync( out_s1center_prob_h_.get(), out_s1center_prob_d_.get(), out_s1center_elem_num_ * sizeof(float), diff --git a/perception/autoware_shape_estimation/src/shape_estimation_node.cpp b/perception/autoware_shape_estimation/src/shape_estimation_node.cpp index 67402f68d63ef..c5450dc14adb0 100644 --- a/perception/autoware_shape_estimation/src/shape_estimation_node.cpp +++ b/perception/autoware_shape_estimation/src/shape_estimation_node.cpp @@ -63,9 +63,8 @@ ShapeEstimationNode::ShapeEstimationNode(const rclcpp::NodeOptions & node_option min_points_ = declare_parameter("model_params.minimum_points"); std::string precision = declare_parameter("model_params.precision"); int batch_size = declare_parameter("model_params.batch_size"); - autoware::tensorrt_common::BatchConfig batch_config{batch_size, batch_size, batch_size}; tensorrt_shape_estimator_ = - std::make_unique(model_path, precision, batch_config); + std::make_unique(model_path, precision, batch_size); if (this->declare_parameter("model_params.build_only", false)) { RCLCPP_INFO(this->get_logger(), "TensorRT engine is built and shutdown node."); rclcpp::shutdown(); diff --git a/perception/autoware_tensorrt_classifier/CMakeLists.txt b/perception/autoware_tensorrt_classifier/CMakeLists.txt index 88747a1e9240c..59ce7b18afcc3 100644 --- a/perception/autoware_tensorrt_classifier/CMakeLists.txt +++ b/perception/autoware_tensorrt_classifier/CMakeLists.txt @@ -6,6 +6,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -O3 -Wno-write-strings -fopen find_package(autoware_cmake REQUIRED) autoware_package() +# TODO(amadeuszsz): Remove -Wno-deprecated-declarations once removing implicit quantization +add_compile_options(-Wno-deprecated-declarations) + find_package(CUDA) find_package(CUDNN) find_package(TENSORRT) diff --git a/perception/autoware_tensorrt_classifier/include/autoware/tensorrt_classifier/tensorrt_classifier.hpp b/perception/autoware_tensorrt_classifier/include/autoware/tensorrt_classifier/tensorrt_classifier.hpp index ee16343b956d1..4f7a5865c72ae 100644 --- a/perception/autoware_tensorrt_classifier/include/autoware/tensorrt_classifier/tensorrt_classifier.hpp +++ b/perception/autoware_tensorrt_classifier/include/autoware/tensorrt_classifier/tensorrt_classifier.hpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -44,22 +45,18 @@ class TrtClassifier * @param[in] mode_path ONNX model_path * @param[in] precision precision for inference * @param[in] calibration_images path for calibration files (only require for quantization) - * @param[in] batch_config configuration for batched execution - * @param[in] max_workspace_size maximum workspace for building TensorRT engine * @param[in] mean mean for preprocess * @param[in] std std for preprocess - * @param[in] buildConfig configuration including precision, calibration method, dla, remaining - * fp16 for first layer, remaining fp16 for last layer and profiler for builder + * @param[in] calib_config calibration configuration * @param[in] cuda whether use cuda gpu for preprocessing */ TrtClassifier( const std::string & model_path, const std::string & precision, - const autoware::tensorrt_common::BatchConfig & batch_config = {1, 1, 1}, const std::vector & mean = {123.675, 116.28, 103.53}, const std::vector & std = {58.395, 57.12, 57.375}, - const size_t max_workspace_size = (1 << 30), const std::string & calibration_images = "", - const autoware::tensorrt_common::BuildConfig build_config = - autoware::tensorrt_common::BuildConfig("MinMax", -1, false, false, false, 0.0), + const std::string & calibration_images = "", + const tensorrt_common::CalibrationConfig & calibration_config = + tensorrt_common::CalibrationConfig("MinMax", false, false, 0.0), const bool cuda = false); /** * @brief Deconstruct TrtClassifier @@ -84,6 +81,12 @@ class TrtClassifier */ void initPreprocessBuffer(int width, int height); + /** + * @brief get batch size + * @return batch size + */ + [[nodiscard]] int getBatchSize() const; + private: /** * @brief run preprocess including resizing, letterbox, BGR2RGB, NHWC2NCHW and toFloat on CPU @@ -102,7 +105,7 @@ class TrtClassifier const std::vector & images, std::vector & results, std::vector & probabilities); - std::unique_ptr trt_common_; + std::unique_ptr trt_common_; std::vector input_h_; CudaUniquePtr input_d_; diff --git a/perception/autoware_tensorrt_classifier/src/tensorrt_classifier.cpp b/perception/autoware_tensorrt_classifier/src/tensorrt_classifier.cpp index 4aa008e42c966..7666ae4f9d068 100644 --- a/perception/autoware_tensorrt_classifier/src/tensorrt_classifier.cpp +++ b/perception/autoware_tensorrt_classifier/src/tensorrt_classifier.cpp @@ -100,11 +100,9 @@ std::vector loadImageList(const std::string & filename, const std:: namespace autoware::tensorrt_classifier { TrtClassifier::TrtClassifier( - const std::string & model_path, const std::string & precision, - const autoware::tensorrt_common::BatchConfig & batch_config, const std::vector & mean, - const std::vector & std, const size_t max_workspace_size, - const std::string & calibration_image_list_path, - autoware::tensorrt_common::BuildConfig build_config, const bool cuda) + const std::string & model_path, const std::string & precision, const std::vector & mean, + const std::vector & std, const std::string & calibration_image_list_path, + const tensorrt_common::CalibrationConfig & calib_config, const bool cuda) { src_width_ = -1; src_height_ = -1; @@ -114,22 +112,36 @@ TrtClassifier::TrtClassifier( for (size_t i = 0; i < inv_std_.size(); i++) { inv_std_[i] = 1.0 / inv_std_[i]; } - batch_size_ = batch_config[2]; + trt_common_ = std::make_unique( + tensorrt_common::TrtCommonConfig(model_path, precision)); + + const auto network_input_dims = trt_common_->getTensorShape(0); + batch_size_ = network_input_dims.d[0]; + const auto input_channel = network_input_dims.d[1]; + const auto input_height = network_input_dims.d[2]; + const auto input_width = network_input_dims.d[3]; + + std::vector profile_dims{ + autoware::tensorrt_common::ProfileDims( + 0, {4, {batch_size_, input_channel, input_height, input_width}}, + {4, {batch_size_, input_channel, input_height, input_width}}, + {4, {batch_size_, input_channel, input_height, input_width}})}; + auto profile_dims_ptr = + std::make_unique>(profile_dims); + if (precision == "int8") { - int max_batch_size = batch_config[2]; - nvinfer1::Dims input_dims = autoware::tensorrt_common::get_input_dims(model_path); std::vector calibration_images; if (calibration_image_list_path != "") { calibration_images = loadImageList(calibration_image_list_path, ""); } autoware::tensorrt_classifier::ImageStream stream( - max_batch_size, input_dims, calibration_images); + batch_size_, network_input_dims, calibration_images); fs::path calibration_table{model_path}; std::string ext = ""; - if (build_config.calib_type_str == "Entropy") { + if (calib_config.calib_type_str == "Entropy") { ext = "EntropyV2-"; } else if ( - build_config.calib_type_str == "Legacy" || build_config.calib_type_str == "Percentile") { + calib_config.calib_type_str == "Legacy" || calib_config.calib_type_str == "Percentile") { ext = "Legacy-"; } else { ext = "MinMax-"; @@ -141,11 +153,11 @@ TrtClassifier::TrtClassifier( histogram_table.replace_extension(ext); std::unique_ptr calibrator; - if (build_config.calib_type_str == "Entropy") { + if (calib_config.calib_type_str == "Entropy") { calibrator.reset(new autoware::tensorrt_classifier::Int8EntropyCalibrator( stream, calibration_table, mean_, std_)); } else if ( - build_config.calib_type_str == "Legacy" || build_config.calib_type_str == "Percentile") { + calib_config.calib_type_str == "Legacy" || calib_config.calib_type_str == "Percentile") { double quantile = 0.999999; double cutoff = 0.999999; calibrator.reset(new autoware::tensorrt_classifier::Int8LegacyCalibrator( @@ -154,29 +166,27 @@ TrtClassifier::TrtClassifier( calibrator.reset(new autoware::tensorrt_classifier::Int8MinMaxCalibrator( stream, calibration_table, mean_, std_)); } - trt_common_ = std::make_unique( - model_path, precision, std::move(calibrator), batch_config, max_workspace_size, build_config); + if (!trt_common_->setupWithCalibrator( + std::move(calibrator), calib_config, std::move((profile_dims_ptr)))) { + throw std::runtime_error("Failed to setup TensorRT engine with calibrator"); + } } else { - trt_common_ = std::make_unique( - model_path, precision, nullptr, batch_config, max_workspace_size, build_config); - } - trt_common_->setup(); - - if (!trt_common_->isInitialized()) { - return; + if (!trt_common_->setup(std::move(profile_dims_ptr))) { + throw std::runtime_error("Failed to setup TensorRT engine"); + } } // GPU memory allocation - const auto input_dims = trt_common_->getBindingDimensions(0); + const auto input_dims = trt_common_->getTensorShape(0); const auto input_size = std::accumulate(input_dims.d + 1, input_dims.d + input_dims.nbDims, 1, std::multiplies()); - const auto output_dims = trt_common_->getBindingDimensions(1); - input_d_ = autoware::cuda_utils::make_unique(batch_config[2] * input_size); + const auto output_dims = trt_common_->getTensorShape(1); + input_d_ = autoware::cuda_utils::make_unique(batch_size_ * input_size); out_elem_num_ = std::accumulate( output_dims.d + 1, output_dims.d + output_dims.nbDims, 1, std::multiplies()); - out_elem_num_ = out_elem_num_ * batch_config[2]; - out_elem_num_per_batch_ = static_cast(out_elem_num_ / batch_config[2]); + out_elem_num_ = out_elem_num_ * batch_size_; + out_elem_num_per_batch_ = static_cast(out_elem_num_ / batch_size_); out_prob_d_ = autoware::cuda_utils::make_unique(out_elem_num_); out_prob_h_ = autoware::cuda_utils::make_unique_host(out_elem_num_, cudaHostAllocPortable); @@ -224,7 +234,7 @@ void TrtClassifier::initPreprocessBuffer(int width, int height) src_width_ = width; src_height_ = height; if (m_cuda) { - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); bool const hasRuntimeDim = std::any_of( input_dims.d, input_dims.d + input_dims.nbDims, [](int32_t input_dim) { return input_dim == -1; }); @@ -232,7 +242,9 @@ void TrtClassifier::initPreprocessBuffer(int width, int height) input_dims.d[0] = batch_size_; } if (!h_img_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } } if (!h_img_) { CHECK_CUDA_ERROR(cudaMallocHost( @@ -245,10 +257,15 @@ void TrtClassifier::initPreprocessBuffer(int width, int height) } } +int TrtClassifier::getBatchSize() const +{ + return batch_size_; +} + void TrtClassifier::preprocessGpu(const std::vector & images) { const auto batch_size = images.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; for (const auto & image : images) { @@ -272,7 +289,9 @@ void TrtClassifier::preprocessGpu(const std::vector & images) src_height_ = height; } if (!h_img_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); @@ -305,9 +324,11 @@ void TrtClassifier::preprocessGpu(const std::vector & images) void TrtClassifier::preprocess_opt(const std::vector & images) { int batch_size = static_cast(images.size()); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } const float input_chan = static_cast(input_dims.d[1]); const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); @@ -354,9 +375,6 @@ bool TrtClassifier::doInference( const std::vector & images, std::vector & results, std::vector & probabilities) { - if (!trt_common_->isInitialized()) { - return false; - } preprocess_opt(images); return feedforwardAndDecode(images, results, probabilities); @@ -369,7 +387,10 @@ bool TrtClassifier::feedforwardAndDecode( results.clear(); probabilities.clear(); std::vector buffers = {input_d_.get(), out_prob_d_.get()}; - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); int batch_size = static_cast(images.size()); diff --git a/perception/autoware_tensorrt_common/CMakeLists.txt b/perception/autoware_tensorrt_common/CMakeLists.txt index 3105523a509e3..d7d8026866124 100644 --- a/perception/autoware_tensorrt_common/CMakeLists.txt +++ b/perception/autoware_tensorrt_common/CMakeLists.txt @@ -16,9 +16,14 @@ if(NOT (CUDAToolkit_FOUND AND CUDNN_FOUND AND TENSORRT_FOUND)) return() endif() +if(TENSORRT_VERSION VERSION_LESS 8.5) + message(WARNING "Unsupported version TensorRT ${TENSORRT_VERSION} detected. This package requires TensorRT 8.5 or later.") + return() +endif() + add_library(${PROJECT_NAME} SHARED src/tensorrt_common.cpp - src/simple_profiler.cpp + src/profiler.cpp ) target_link_libraries(${PROJECT_NAME} @@ -42,7 +47,7 @@ set_target_properties(${PROJECT_NAME} CXX_EXTENSIONS NO ) -# TODO(autoware_tensorrt_common): Remove -Wno-deprecated-declarations once upgrading to TensorRT 8.5 is complete +# TODO(amadeuszsz): Remove -Wno-deprecated-declarations once removing implicit quantization target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic -Werror -Wno-deprecated-declarations ) diff --git a/perception/autoware_tensorrt_common/README.md b/perception/autoware_tensorrt_common/README.md index c828be58c1c1c..54bfccdfcb561 100644 --- a/perception/autoware_tensorrt_common/README.md +++ b/perception/autoware_tensorrt_common/README.md @@ -1,6 +1,70 @@ # autoware_tensorrt_common -## Purpose +This package provides a high-level API to work with TensorRT. This library simplifies the process of loading, building, and executing TensorRT inference engines using ONNX models. It also includes utilities for profiling and managing TensorRT execution contexts, making it easier to integrate TensorRT-based packages in Autoware. -This package contains a library of common functions related to TensorRT. -This package may include functions for handling TensorRT engine and calibration algorithm used for quantization +## Usage + +Here is an example usage of the library. For the full API documentation, please refer to the doxygen documentation (see header [file](include/autoware/tensorrt_common/tensorrt_common.hpp)). + +```c++ +#include + +#include +#include +#include + +using autoware::tensorrt_common::TrtCommon; +using autoware::tensorrt_common::TrtCommonConfig; +using autoware::tensorrt_common::TensorInfo; +using autoware::tensorrt_common::NetworkIO; +using autoware::tensorrt_common::ProfileDims; + +std::unique_ptr trt_common_; +``` + +### Create a tensorrt common instance and setup engine + +- With minimal configuration. + +```c++ +trt_common_ = std::make_unique(TrtCommonConfig("/path/to/onnx/model.onnx")); +trt_common_->setup(); +``` + +- With full configuration. + +```c++ +trt_common_ = std::make_unique(TrtCommonConfig("/path/to/onnx/model.onnx", "fp16", "/path/to/engine/model.engine", (1ULL << 30U), -1, false)); + +std::vector network_io{ + NetworkIO("sample_input", {3, {-1, 64, 512}}), NetworkIO("sample_output", {1, {50}})}; +std::vector profile_dims{ + ProfileDims("sample_input", {3, {1, 64, 512}}, {3, {3, 64, 512}}, {3, {9, 64, 512}})}; + +auto network_io_ptr = std::make_unique>(network_io); +auto profile_dims_ptr = std::make_unique>(profile_dims); + +trt_common_->setup(std::move(profile_dims_ptr), std::move(network_io_ptr)); +``` + +By defining network IO names and dimensions, an extra shapes validation will be performed after building / loading engine. This is useful to ensure the model is compatible with current code for preprocessing as it might consists of operations dependent on tensor shapes. + +Profile dimension is used to specify the min, opt, and max dimensions for dynamic shapes. + +Network IO or / and profile dimensions can be omitted if not needed. + +### Setting input and output tensors + +```c++ +bool success = true; +success &= trt_common_->setTensor("sample_input", sample_input_d_.get(), nvinfer1::Dims{3, {var_size, 64, 512}}); +success &= trt_common_->setTensor("sample_output", sample_output_d_.get()); +return success; +``` + +### Execute inference + +```c++ +auto success = trt_common_->enqueueV3(stream_); +return success; +``` diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/conv_profiler.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/conv_profiler.hpp new file mode 100644 index 0000000000000..0b58a797d8b9b --- /dev/null +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/conv_profiler.hpp @@ -0,0 +1,108 @@ +// 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. + +#ifndef AUTOWARE__TENSORRT_COMMON__CONV_PROFILER_HPP_ +#define AUTOWARE__TENSORRT_COMMON__CONV_PROFILER_HPP_ + +#include + +#include + +#include +#include +#include + +namespace autoware +{ +namespace tensorrt_common +{ +/** + * @struct ConvLayerInfo + * @brief Information of a layer. + */ +struct ConvLayerInfo +{ + //! @brief Input channel. + int in_c; + //! @brief Output channel. + int out_c; + //! @brief Width. + int w; + //! @brief Height. + int h; + //! @brief Kernel size. + int k; + //! @brief Stride. + int stride; + //! @brief Number of groups. + int groups; + //! @brief Layer type. + nvinfer1::LayerType type; +}; + +/** + * @class ConvProfiler + * @brief Collect per-layer profile information, assuming times are reported in the same order. + */ +class ConvProfiler : public tensorrt_common::Profiler +{ +public: + /** + * @brief Construct Profiler for convolutional layers. + * + * @param[in] src_profilers Source profilers to merge. + */ + explicit ConvProfiler( + const std::vector & src_profilers = std::vector()) + : Profiler(src_profilers) + { + } + + /** + * @brief Set per-layer profile information for model. + * + * @param[in] layer Layer to set profile information. + */ + void setProfDict(nvinfer1::ILayer * const layer) noexcept final + { + if (const auto type = layer->getType(); type == nvinfer1::LayerType::kCONVOLUTION) { + const auto name = layer->getName(); + auto conv = dynamic_cast(layer); + + nvinfer1::ITensor * in = layer->getInput(0); + nvinfer1::Dims in_dim = in->getDimensions(); + + nvinfer1::ITensor * out = layer->getOutput(0); + nvinfer1::Dims out_dim = out->getDimensions(); + + nvinfer1::Dims k_dims = conv->getKernelSizeNd(); + nvinfer1::Dims s_dims = conv->getStrideNd(); + + int32_t kernel = k_dims.d[0]; + int32_t stride = s_dims.d[0]; + int32_t groups = conv->getNbGroups(); + + layer_dict_.insert_or_assign( + name, ConvLayerInfo{ + in_dim.d[1], out_dim.d[1], in_dim.d[3], in_dim.d[2], kernel, stride, groups, type}); + } + } + +private: + //! @brief Per-layer information. + std::map layer_dict_; +}; +} // namespace tensorrt_common +} // namespace autoware +#endif // AUTOWARE__TENSORRT_COMMON__CONV_PROFILER_HPP_ diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/logger.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/logger.hpp index 5aa897983af72..b9b9048cd8204 100644 --- a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/logger.hpp +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/logger.hpp @@ -17,18 +17,19 @@ #ifndef AUTOWARE__TENSORRT_COMMON__LOGGER_HPP_ #define AUTOWARE__TENSORRT_COMMON__LOGGER_HPP_ -#include "NvInferRuntimeCommon.h" +#include #include #include +#include #include #include -#include #include #include #include #include #include +#include namespace autoware { @@ -46,7 +47,7 @@ class LogStreamConsumerBuffer : public std::stringbuf LogStreamConsumerBuffer(LogStreamConsumerBuffer && other) : mOutput(other.mOutput) {} - ~LogStreamConsumerBuffer() + ~LogStreamConsumerBuffer() override { // std::streambuf::pbase() gives a pointer to the beginning of the buffered part of the output // sequence std::streambuf::pptr() gives a pointer to the current position of the output @@ -60,7 +61,7 @@ class LogStreamConsumerBuffer : public std::stringbuf // synchronizes the stream buffer and returns 0 on success // synchronizing the stream buffer consists of inserting the buffer contents into the stream, // resetting the buffer and flushing the stream - virtual int sync() + int sync() override { putOutput(); return 0; @@ -252,6 +253,37 @@ class Logger : public nvinfer1::ILogger // NOLINT } } + void log(Severity severity, const char * msg, ...) const noexcept + { + if (mVerbose) { + va_list args; + va_start(args, msg); + + // Buffer size + va_list args_copy; + va_copy(args_copy, args); + int required_size = std::vsnprintf(nullptr, 0, msg, args_copy); + va_end(args_copy); + + // Formatting error + if (required_size < 0) { + log(Severity::kINTERNAL_ERROR, "Error formatting log message"); + va_end(args); + return; + } + + // Format msg + std::vector buffer(required_size + 1); + std::vsnprintf(buffer.data(), buffer.size(), msg, args); + + va_end(args); // End variadic argument processing + + // Send the formatted message to LogStreamConsumer + LogStreamConsumer(mReportableSeverity, severity) + << "[TRT] " << std::string(buffer.data()) << std::endl; + } + } + /** * @brief Logging with throttle. * diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/profiler.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/profiler.hpp new file mode 100644 index 0000000000000..d45351f97fd01 --- /dev/null +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/profiler.hpp @@ -0,0 +1,96 @@ +// 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. + +#ifndef AUTOWARE__TENSORRT_COMMON__PROFILER_HPP_ +#define AUTOWARE__TENSORRT_COMMON__PROFILER_HPP_ + +#include + +#include +#include +#include +#include + +namespace autoware +{ +namespace tensorrt_common +{ + +/** + * @class Profiler + * @brief Collect per-layer profile information, assuming times are reported in the same order. + */ +class Profiler : public nvinfer1::IProfiler +{ +public: + /** + * @struct Record + * @brief Record of layer profile information. + */ + struct Record + { + float time{0}; + int count{0}; + float min_time{-1.0}; + int index; + }; + + /** + * @brief Construct Profiler. + * + * @param[in] src_profilers Source profilers to merge. + */ + explicit Profiler(const std::vector & src_profilers = std::vector()); + + /** + * @brief Report layer time. + * + * @param[in] layerName Layer name. + * @param[in] ms Time in milliseconds. + */ + void reportLayerTime(const char * layerName, float ms) noexcept final; + + /** + * @brief Get printable representation of Profiler. + * + * @return String representation for current state of Profiler. + */ + [[nodiscard]] std::string toString() const; + + /** + * @brief Set per-layer profile information for model. + * + * @param[in] layer Layer to set profile information. + */ + virtual void setProfDict([[maybe_unused]] nvinfer1::ILayer * layer) noexcept {}; + + /** + * @brief Output Profiler to ostream. + * + * @param[out] out Output stream. + * @param[in] value Profiler to output. + * @return Output stream. + */ + friend std::ostream & operator<<(std::ostream & out, const Profiler & value); + +private: + //!< @brief Profile information for layers. + std::map profile_; + + //!< @brief Index for layer. + int index_; +}; +} // namespace tensorrt_common +} // namespace autoware +#endif // AUTOWARE__TENSORRT_COMMON__PROFILER_HPP_ diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/simple_profiler.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/simple_profiler.hpp deleted file mode 100644 index a8d504fb2861a..0000000000000 --- a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/simple_profiler.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// 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. - -#ifndef AUTOWARE__TENSORRT_COMMON__SIMPLE_PROFILER_HPP_ -#define AUTOWARE__TENSORRT_COMMON__SIMPLE_PROFILER_HPP_ - -#include - -#include -#include -#include -#include - -namespace autoware -{ -namespace tensorrt_common -{ -struct LayerInfo -{ - int in_c; - int out_c; - int w; - int h; - int k; - int stride; - int groups; - nvinfer1::LayerType type; -}; - -/** - * @class Profiler - * @brief Collect per-layer profile information, assuming times are reported in the same order - */ -class SimpleProfiler : public nvinfer1::IProfiler -{ -public: - struct Record - { - float time{0}; - int count{0}; - float min_time{-1.0}; - int index; - }; - SimpleProfiler( - std::string name, - const std::vector & src_profilers = std::vector()); - - void reportLayerTime(const char * layerName, float ms) noexcept override; - - void setProfDict(nvinfer1::ILayer * layer) noexcept; - - friend std::ostream & operator<<(std::ostream & out, const SimpleProfiler & value); - -private: - std::string m_name; - std::map m_profile; - int m_index; - std::map m_layer_dict; -}; -} // namespace tensorrt_common -} // namespace autoware -#endif // AUTOWARE__TENSORRT_COMMON__SIMPLE_PROFILER_HPP_ diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_common.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_common.hpp index 2b3b3f02f315f..9355732962e23 100644 --- a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_common.hpp +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_common.hpp @@ -15,226 +15,367 @@ #ifndef AUTOWARE__TENSORRT_COMMON__TENSORRT_COMMON_HPP_ #define AUTOWARE__TENSORRT_COMMON__TENSORRT_COMMON_HPP_ -#ifndef YOLOX_STANDALONE -#include - -#include -#endif +#include "autoware/tensorrt_common/logger.hpp" +#include "autoware/tensorrt_common/profiler.hpp" +#include "autoware/tensorrt_common/utils.hpp" #include #include -#if (defined(_MSC_VER) or (defined(__GNUC__) and (7 <= __GNUC_MAJOR__))) -#include -namespace fs = ::std::filesystem; -#else -#include -namespace fs = ::std::experimental::filesystem; -#endif - -#include -#include - #include -#include #include +#include +#include #include namespace autoware { namespace tensorrt_common { -/** - * @struct BuildConfig - * @brief Configuration to provide fine control regarding TensorRT builder - */ -struct BuildConfig -{ - // type for calibration - std::string calib_type_str; - - // DLA core ID that the process uses - int dla_core_id; - - // flag for partial quantization in first layer - bool quantize_first_layer; // For partial quantization - - // flag for partial quantization in last layer - bool quantize_last_layer; // For partial quantization - - // flag for per-layer profiler using IProfiler - bool profile_per_layer; - - // clip value for implicit quantization - double clip_value; // For implicit quantization - - // Supported calibration type - const std::array valid_calib_type = {"Entropy", "Legacy", "Percentile", "MinMax"}; - - BuildConfig() - : calib_type_str("MinMax"), - dla_core_id(-1), - quantize_first_layer(false), - quantize_last_layer(false), - profile_per_layer(false), - clip_value(0.0) - { - } - - explicit BuildConfig( - const std::string & calib_type_str, const int dla_core_id = -1, - const bool quantize_first_layer = false, const bool quantize_last_layer = false, - const bool profile_per_layer = false, const double clip_value = 0.0) - : calib_type_str(calib_type_str), - dla_core_id(dla_core_id), - quantize_first_layer(quantize_first_layer), - quantize_last_layer(quantize_last_layer), - profile_per_layer(profile_per_layer), - clip_value(clip_value) - { -#ifndef YOLOX_STANDALONE - if ( - std::find(valid_calib_type.begin(), valid_calib_type.end(), calib_type_str) == - valid_calib_type.end()) { - std::stringstream message; - message << "Invalid calibration type was specified: " << calib_type_str << std::endl - << "Valid value is one of: [Entropy, (Legacy | Percentile), MinMax]" << std::endl - << "Default calibration type will be used: MinMax" << std::endl; - std::cerr << message.str(); - } -#endif - } -}; - -nvinfer1::Dims get_input_dims(const std::string & onnx_file_path); - -const std::array valid_precisions = {"fp32", "fp16", "int8"}; -bool is_valid_precision_string(const std::string & precision); - template struct InferDeleter // NOLINT { - void operator()(T * obj) const - { - if (obj) { -#if TENSORRT_VERSION_MAJOR >= 8 - delete obj; -#else - obj->destroy(); -#endif - } - } + void operator()(T * obj) const { delete obj; } }; template using TrtUniquePtr = std::unique_ptr>; -using BatchConfig = std::array; +using NetworkIOPtr = std::unique_ptr>; +using ProfileDimsPtr = std::unique_ptr>; +using TensorsVec = std::vector>; +using TensorsMap = std::unordered_map>; /** * @class TrtCommon - * @brief TensorRT common library + * @brief TensorRT common library. */ class TrtCommon // NOLINT { public: /** * @brief Construct TrtCommon. - * @param[in] mode_path ONNX model_path - * @param[in] precision precision for inference - * @param[in] calibrator pointer for any type of INT8 calibrator - * @param[in] batch_config configuration for batched execution - * @param[in] max_workspace_size maximum workspace for building TensorRT engine - * @param[in] buildConfig configuration including precision, calibration method, dla, remaining - * fp16 for first layer, remaining fp16 for last layer and profiler for builder - * @param[in] plugin_paths path for custom plugin + * + * @param[in] trt_config Base configuration with ONNX model path as minimum required. + * parameter. + * @param[in] profiler Per-layer profiler. + * @param[in] plugin_paths Paths for TensorRT plugins. */ TrtCommon( - const std::string & model_path, const std::string & precision, - std::unique_ptr calibrator = nullptr, - const BatchConfig & batch_config = {1, 1, 1}, const size_t max_workspace_size = (16 << 20), - const BuildConfig & buildConfig = BuildConfig(), + const TrtCommonConfig & trt_config, + const std::shared_ptr & profiler = std::make_shared(), const std::vector & plugin_paths = {}); - /** * @brief Deconstruct TrtCommon */ ~TrtCommon(); /** - * @brief Load TensorRT engine - * @param[in] engine_file_path path for a engine file - * @return flag for whether loading are succeeded or failed + * @brief Setup for TensorRT execution including building and loading engine. + * + * @param[in] profile_dims Optimization profile of tensors for dynamic shapes. + * @param[in] network_io Network input/output tensors information. + * @return Whether setup is successful. + */ + [[nodiscard]] virtual bool setup( + ProfileDimsPtr profile_dims = nullptr, NetworkIOPtr network_io = nullptr); + + /** + * @brief Get TensorRT engine precision. + * + * @return string representation of TensorRT engine precision. + */ + [[nodiscard]] std::string getPrecision() const; + + /** + * @brief Get tensor name by index from TensorRT engine with fallback from TensorRT network. + * + * @param[in] index Tensor index. + * @return Tensor name. + */ + [[nodiscard]] const char * getIOTensorName(const int32_t index) const; + + /** + * @brief Get number of IO tensors from TensorRT engine with fallback from TensorRT network. + * + * @return Number of IO tensors. + */ + [[nodiscard]] int32_t getNbIOTensors() const; + + /** + * @brief Get tensor shape by index from TensorRT engine with fallback from TensorRT network. + * + * @param[in] index Tensor index. + * @return Tensor shape. + */ + [[nodiscard]] nvinfer1::Dims getTensorShape(const int32_t index) const; + + /** + * @brief Get tensor shape by name from TensorRT engine. + * + * @param[in] tensor_name Tensor name. + * @return Tensor shape. + */ + [[nodiscard]] nvinfer1::Dims getTensorShape(const char * tensor_name) const; + + /** + * @brief Get input tensor shape by index from TensorRT network. + * + * @param[in] index Tensor index. + * @return Tensor shape. + */ + [[nodiscard]] nvinfer1::Dims getInputDims(const int32_t index) const; + + /** + * @brief Get output tensor shape by index from TensorRT network. + * + * @param[in] index Tensor index. + * @return Tensor shape. + */ + [[nodiscard]] nvinfer1::Dims getOutputDims(const int32_t index) const; + + /** + * @brief Set tensor address by index via TensorRT context. + * + * @param[in] index Tensor index. + * @param[in] data Tensor pointer. + * @return Whether setting tensor address is successful. + */ + bool setTensorAddress(const int32_t index, void * data); + + /** + * @brief Set tensor address by name via TensorRT context. + * + * @param[in] tensor_name Tensor name. + * @param[in] data Tensor pointer. + * @return Whether setting tensor address is successful. + */ + bool setTensorAddress(const char * tensor_name, void * data); + + /** + * @brief Set tensors addresses by indices via TensorRT context. + * + * @param[in] tensors Tensors pointers. + * @return Whether setting tensors addresses is successful. + */ + bool setTensorsAddresses(std::vector & tensors); + + /** + * @brief Set tensors addresses by names via TensorRT context. + * + * @param[in] tensors Tensors pointers. + * @return Whether setting tensors addresses is successful. + */ + bool setTensorsAddresses(std::unordered_map & tensors); + + /** + * @brief Set input shape by index via TensorRT context. + * + * @param[in] index Tensor index. + * @param[in] dimensions Tensor dimensions. + * @return Whether setting input shape is successful. + */ + bool setInputShape(const int32_t index, const nvinfer1::Dims & dimensions); + + /** + * @brief Set input shape by name via TensorRT context. + * + * @param[in] tensor_name Tensor name. + * @param[in] dimensions Tensor dimensions. + * @return Whether setting input shape is successful. + */ + bool setInputShape(const char * tensor_name, const nvinfer1::Dims & dimensions); + + /** + * @brief Set inputs shapes by indices via TensorRT context. + * + * @param[in] dimensions Vector of tensor dimensions with corresponding indices. + * @return Whether setting input shapes is successful. + */ + bool setInputsShapes(const std::vector & dimensions); + + /** + * @brief Set inputs shapes by names via TensorRT context. + * + * @param[in] dimensions Map of tensor dimensions with corresponding names as keys. + * @return Whether setting input shapes is successful. + */ + bool setInputsShapes(const std::unordered_map & dimensions); + + /** + * @brief Set tensor (address and shape) by index via TensorRT context. + * + * @param[in] index Tensor index. + * @param[in] data Tensor pointer. + * @param[in] dimensions Tensor dimensions. + * @return Whether setting tensor is successful. + */ + bool setTensor(const int32_t index, void * data, nvinfer1::Dims dimensions = {}); + + /** + * @brief Set tensor (address and shape) by name via TensorRT context. + * + * @param[in] tensor_name Tensor name. + * @param[in] data Tensor pointer. + * @param[in] dimensions Tensor dimensions. + * @return Whether setting tensor is successful. + */ + bool setTensor(const char * tensor_name, void * data, nvinfer1::Dims dimensions = {}); + + /** + * @brief Set tensors (addresses and shapes) by indices via TensorRT context. + * + * @param[in] tensors Vector of tensor pointers and dimensions with corresponding indices. + * @return Whether setting tensors is successful. */ - bool loadEngine(const std::string & engine_file_path); + bool setTensors(TensorsVec & tensors); /** - * @brief Output layer information including GFLOPs and parameters - * @param[in] onnx_file_path path for a onnx file - * @warning This function is based on darknet log. + * @brief Set tensors (addresses and shapes) by names via TensorRT context. + * + * @param[in] tensors Map of tensor pointers and dimensions with corresponding names as keys. + * @return Whether setting tensors is successful. */ - void printNetworkInfo(const std::string & onnx_file_path); + bool setTensors(TensorsMap & tensors); /** - * @brief build TensorRT engine from ONNX - * @param[in] onnx_file_path path for a onnx file - * @param[in] output_engine_file_path path for a engine file + * @brief Get per-layer profiler for model. + * + * @return Per-layer profiler. */ - bool buildEngineFromOnnx( - const std::string & onnx_file_path, const std::string & output_engine_file_path); + [[nodiscard]] std::shared_ptr getModelProfiler(); /** - * @brief setup for TensorRT execution including building and loading engine + * @brief Get per-layer profiler for host. + * + * @return Per-layer profiler. */ - void setup(); + [[nodiscard]] std::shared_ptr getHostProfiler(); -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8500 - void setupBindings(std::vector & bindings); -#endif + /** + * @brief Get TensorRT common configuration. + * + * @return TensorRT common configuration. + */ + [[nodiscard]] std::shared_ptr getTrtCommonConfig(); - bool isInitialized(); + /** + * @brief Get TensorRT builder configuration. + * + * @return TensorRT builder configuration. + */ + [[nodiscard]] std::shared_ptr getBuilderConfig(); + + /** + * @brief Get TensorRT network definition. + * + * @return TensorRT network definition. + */ + [[nodiscard]] std::shared_ptr getNetwork(); - nvinfer1::Dims getBindingDimensions(const int32_t index) const; - int32_t getNbBindings(); - bool setBindingDimensions(const int32_t index, const nvinfer1::Dims & dimensions) const; -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8500 + /** + * @brief Get TensorRT logger. + * + * @return TensorRT logger. + */ + [[nodiscard]] std::shared_ptr getLogger(); + + /** + * @brief Execute inference via TensorRT context. + * + * @param[in] stream CUDA stream. + * @return Whether inference is successful. + */ bool enqueueV3(cudaStream_t stream); -#endif -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH < 10000 - bool enqueueV2(void ** bindings, cudaStream_t stream, cudaEvent_t * input_consumed); -#endif /** - * @brief output per-layer information + * @brief Print per-layer information. + */ + void printProfiling() const; + +private: + /** + * @brief Initialize TensorRT common. + * + * @return Whether initialization is successful. */ - void printProfiling(void); + [[nodiscard]] bool initialize(); -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 /** - * @brief get per-layer information for trt-engine-profiler + * @brief Get per-layer information for trt-engine-profiler. + * + * @param[in] format Format for layer information. + * @return Layer information. */ std::string getLayerInformation(nvinfer1::LayerInformationFormat format); -#endif -private: - Logger logger_; - fs::path model_file_path_; + /** + + * @brief Build TensorRT engine from ONNX. + * + * @return Whether building engine is successful. + */ + bool buildEngineFromOnnx(); + + /** + * @brief Load TensorRT engine. + * + * @return Whether loading engine is successful. + */ + bool loadEngine(); + + /** + * @brief Validate network input/output names and dimensions. + * + * @return Whether network input/output is valid. + */ + bool validateNetworkIO(); + + /** + * @brief Validate optimization profile. + * + * @return Whether optimization profile is valid. + */ + bool validateProfileDims(); + + //! @brief TensorRT runtime. TrtUniquePtr runtime_; + + //! @brief TensorRT engine. TrtUniquePtr engine_; + + //! @brief TensorRT execution context. TrtUniquePtr context_; - std::unique_ptr calibrator_; - std::string precision_; - BatchConfig batch_config_; - size_t max_workspace_size_; - bool is_initialized_{false}; + //! @brief TensorRT builder. + TrtUniquePtr builder_; + + //! @brief TensorRT engine parser. + TrtUniquePtr parser_; + + //! @brief TensorRT builder configuration. + std::shared_ptr builder_config_; + + //! @brief TensorRT network definition. + std::shared_ptr network_; + + //! @brief TrtCommon library base configuration. + std::shared_ptr trt_config_; + + //! @brief TensorRT logger. + std::shared_ptr logger_; + + //! @brief Per-layer profiler for host. + std::shared_ptr host_profiler_; + + //! @brief Per-layer profiler for model. + std::shared_ptr model_profiler_; - // profiler for per-layer - SimpleProfiler model_profiler_; - // profiler for whole model - SimpleProfiler host_profiler_; + //! @brief Model optimization profile. + ProfileDimsPtr profile_dims_; - std::unique_ptr build_config_; + //! @brief Model network input/output tensors information. + NetworkIOPtr network_io_; }; } // namespace tensorrt_common diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_conv_calib.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_conv_calib.hpp new file mode 100644 index 0000000000000..44a944031086e --- /dev/null +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/tensorrt_conv_calib.hpp @@ -0,0 +1,241 @@ +// Copyright 2024 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. + +#ifndef AUTOWARE__TENSORRT_COMMON__TENSORRT_CONV_CALIB_HPP_ +#define AUTOWARE__TENSORRT_COMMON__TENSORRT_CONV_CALIB_HPP_ + +#include +#include +#include + +#include + +#include +#include +#include +#include + +namespace autoware +{ +namespace tensorrt_common +{ +template +bool contain(const std::string & s, const T & v) +{ + return s.find(v) != std::string::npos; +} + +using autoware::tensorrt_common::CalibrationConfig; +using autoware::tensorrt_common::NetworkIOPtr; +using autoware::tensorrt_common::ProfileDimsPtr; +using autoware::tensorrt_common::Profiler; +using autoware::tensorrt_common::TrtCommonConfig; + +/** + * @class TrtConvCalib + * @brief TensorRT common library with calibration. + */ +class TrtConvCalib : public tensorrt_common::TrtCommon +{ +public: + /** + * @brief Construct TrtCommonCalib. + * + * @param[in] trt_config base trt common configuration, ONNX model path is mandatory + * @param[in] profiler per-layer profiler + * @param[in] plugin_paths paths for TensorRT plugins + */ + explicit TrtConvCalib( + const TrtCommonConfig & trt_config, + const std::shared_ptr & profiler = std::make_shared(), + const std::vector & plugin_paths = {}) + : TrtCommon(trt_config, profiler, plugin_paths) + { + } + + /** + * @brief Setup for TensorRT execution including calibration, building and loading engine. + * + * @param[in] calibrator Pointer for any type of INT8 calibrator. + * @param[in] calib_config Calibration configuration. + * @param[in] profile_dims Optimization profile of input tensors for dynamic shapes. + * @param[in] network_io Network input/output tensors information. + * @return Whether setup is successful. + */ + [[nodiscard]] bool setupWithCalibrator( + std::unique_ptr calibrator, const CalibrationConfig & calib_config, + ProfileDimsPtr profile_dims = nullptr, NetworkIOPtr network_io = nullptr) + { + calibrator_ = std::move(calibrator); + calib_config_ = std::make_unique(calib_config); + + auto builder_config = getBuilderConfig(); + builder_config->setFlag(nvinfer1::BuilderFlag::kPREFER_PRECISION_CONSTRAINTS); + builder_config->setInt8Calibrator(calibrator_.get()); + + // Model specific quantization + auto logger = getLogger(); + auto quantization_log = quantization(); + logger->log(nvinfer1::ILogger::Severity::kINFO, quantization_log.c_str()); + + return setup(std::move(profile_dims), std::move(network_io)); + } + +private: + /** + * @brief Implicit quantization for TensorRT. + * + * @return Output log for TensorRT logger. + */ + std::string quantization() + { + auto network = getNetwork(); + auto trt_config = getTrtCommonConfig(); + auto model_profiler = getModelProfiler(); + + const int num = network->getNbLayers(); + bool first = calib_config_->quantize_first_layer; + bool last = calib_config_->quantize_last_layer; + std::stringstream ss; + + // Partial Quantization + if (getPrecision() == "int8") { + auto builder_config = getBuilderConfig(); + builder_config->setFlag(nvinfer1::BuilderFlag::kFP16); + network->getInput(0)->setDynamicRange(0, 255.0); + for (int i = 0; i < num; i++) { + nvinfer1::ILayer * layer = network->getLayer(i); + auto layer_type = layer->getType(); + std::string name = layer->getName(); + nvinfer1::ITensor * out = layer->getOutput(0); + if (calib_config_->clip_value > 0.0) { + ss << "Set max value for outputs: " << calib_config_->clip_value << " " << name + << std::endl; + out->setDynamicRange(0.0, calib_config_->clip_value); + } + + if (layer_type == nvinfer1::LayerType::kCONVOLUTION) { + if (first) { + layer->setPrecision(nvinfer1::DataType::kHALF); + ss << "Set kHALF in " << name << std::endl; + first = false; + } + if (last) { + // cspell: ignore preds + if ( + contain(name, "reg_preds") || contain(name, "cls_preds") || + contain(name, "obj_preds")) { + layer->setPrecision(nvinfer1::DataType::kHALF); + ss << "Set kHALF in " << name << std::endl; + } + for (int j = num - 1; j >= 0; j--) { + nvinfer1::ILayer * inner_layer = network->getLayer(j); + auto inner_layer_type = inner_layer->getType(); + std::string inner_name = inner_layer->getName(); + if (inner_layer_type == nvinfer1::LayerType::kCONVOLUTION) { + inner_layer->setPrecision(nvinfer1::DataType::kHALF); + ss << "Set kHALF in " << inner_name << std::endl; + break; + } + if (inner_layer_type == nvinfer1::LayerType::kMATRIX_MULTIPLY) { + inner_layer->setPrecision(nvinfer1::DataType::kHALF); + ss << "Set kHALF in " << inner_name << std::endl; + break; + } + } + } + } + } + builder_config->setFlag(nvinfer1::BuilderFlag::kINT8); + } + + // Print layer information + float total_gflops = 0.0; + int total_params = 0; + + for (int i = 0; i < num; i++) { + nvinfer1::ILayer * layer = network->getLayer(i); + auto layer_type = layer->getType(); + if (trt_config->profile_per_layer) { + model_profiler->setProfDict(layer); + } + if (layer_type == nvinfer1::LayerType::kCONSTANT) { + continue; + } + nvinfer1::ITensor * in = layer->getInput(0); + nvinfer1::Dims dim_in = in->getDimensions(); + nvinfer1::ITensor * out = layer->getOutput(0); + nvinfer1::Dims dim_out = out->getDimensions(); + + if (layer_type == nvinfer1::LayerType::kCONVOLUTION) { + auto conv = dynamic_cast(layer); + nvinfer1::Dims k_dims = conv->getKernelSizeNd(); + nvinfer1::Dims s_dims = conv->getStrideNd(); + int groups = conv->getNbGroups(); + int stride = s_dims.d[0]; + int num_weights = (dim_in.d[1] / groups) * dim_out.d[1] * k_dims.d[0] * k_dims.d[1]; + float gflops = (2.0 * num_weights) * (static_cast(dim_in.d[3]) / stride * + static_cast(dim_in.d[2]) / stride / 1e9); + total_gflops += gflops; + total_params += num_weights; + ss << "L" << i << " [conv " << k_dims.d[0] << "x" << k_dims.d[1] << " (" << groups << ") " + << ") " << "/" << s_dims.d[0] << "] " << dim_in.d[3] << "x" << dim_in.d[2] << "x" + << " -> " << dim_out.d[3] << "x" << dim_out.d[2] << "x" << dim_out.d[1]; + ss << " weights:" << num_weights; + ss << " GFLOPs:" << gflops; + ss << std::endl; + } else if (layer_type == nvinfer1::LayerType::kPOOLING) { + auto pool = dynamic_cast(layer); + auto p_type = pool->getPoolingType(); + nvinfer1::Dims dim_stride = pool->getStrideNd(); + nvinfer1::Dims dim_window = pool->getWindowSizeNd(); + + ss << "L" << i << " ["; + if (p_type == nvinfer1::PoolingType::kMAX) { + ss << "max "; + } else if (p_type == nvinfer1::PoolingType::kAVERAGE) { + ss << "avg "; + } else if (p_type == nvinfer1::PoolingType::kMAX_AVERAGE_BLEND) { + ss << "max avg blend "; + } + float gflops = static_cast(dim_in.d[1]) * + (static_cast(dim_window.d[0]) / static_cast(dim_stride.d[0])) * + (static_cast(dim_window.d[1]) / static_cast(dim_stride.d[1])) * + static_cast(dim_in.d[2]) * static_cast(dim_in.d[3]) / 1e9; + total_gflops += gflops; + ss << "pool " << dim_window.d[0] << "x" << dim_window.d[1] << "]"; + ss << " GFLOPs:" << gflops; + ss << std::endl; + } else if (layer_type == nvinfer1::LayerType::kRESIZE) { + ss << "L" << i << " [resize]" << std::endl; + } + } + ss << "Total " << total_gflops << " GFLOPs" << std::endl; + ss << "Total " << total_params / 1000.0 / 1000.0 << " M params" << std::endl; + + return ss.str(); + }; + +private: + //!< Calibration configuration + std::unique_ptr calib_config_; + + //!< Calibrator used for implicit quantization + std::unique_ptr calibrator_; +}; + +} // namespace tensorrt_common +} // namespace autoware + +#endif // AUTOWARE__TENSORRT_COMMON__TENSORRT_CONV_CALIB_HPP_ diff --git a/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/utils.hpp b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/utils.hpp new file mode 100644 index 0000000000000..be640f52147d9 --- /dev/null +++ b/perception/autoware_tensorrt_common/include/autoware/tensorrt_common/utils.hpp @@ -0,0 +1,408 @@ +// Copyright 2024 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. + +#ifndef AUTOWARE__TENSORRT_COMMON__UTILS_HPP_ +#define AUTOWARE__TENSORRT_COMMON__UTILS_HPP_ + +#include +#include + +#if (defined(_MSC_VER) or (defined(__GNUC__) and (7 <= __GNUC_MAJOR__))) +#include +namespace fs = ::std::filesystem; +#else +#include +namespace fs = ::std::experimental::filesystem; +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace autoware +{ +namespace tensorrt_common +{ +constexpr std::array valid_precisions = {"fp32", "fp16", "int8"}; + +/** + * @struct TrtCommonConfig + * @brief Configuration to provide fine control regarding TensorRT builder + */ +struct TrtCommonConfig +{ + /** @brief Construct TrtCommonConfig, ONNX model path is mandatory. + * + * @param[in] onnx_path ONNX model path + * @param[in] precision precision for inference + * @param[in] engine_path TensorRT engine path + * @param[in] max_workspace_size maximum workspace size for TensorRT + * @param[in] dla_core_id DLA core ID + * @param[in] profile_per_layer flag for per-layer profiler using IProfiler + */ + explicit TrtCommonConfig( + const std::string onnx_path, const std::string precision = "fp16", + const std::string engine_path = "", const size_t max_workspace_size = (1ULL << 30U), + const int32_t dla_core_id = -1, const bool profile_per_layer = false) + : onnx_path(onnx_path), + precision(precision), + engine_path(engine_path), + max_workspace_size(max_workspace_size), + dla_core_id(dla_core_id), + profile_per_layer(profile_per_layer) + { + validatePrecision(); + + if (engine_path.empty()) { + this->engine_path = onnx_path; + this->engine_path.replace_extension(".engine"); + } + } + + /** + * @brief Validate configured TensorRT engine precision. + */ + void validatePrecision() const + { + if ( + std::find(valid_precisions.begin(), valid_precisions.end(), precision) == + valid_precisions.end()) { + std::stringstream message; + message << "Invalid precision was specified: " << precision << std::endl + << "Valid string is one of: [" << valid_precisions[0]; + for (size_t i = 1; i < valid_precisions.size(); ++i) { + message << ", " << valid_precisions[i]; + } + message << "] (case sensitive)" << std::endl; + + throw std::runtime_error(message.str()); + } + } + + //!< @brief ONNX model path. + const fs::path onnx_path; + + //!< @brief Precision for inference. + const std::string precision; + + //!< @brief TensorRT engine path. + fs::path engine_path; + + //!< @brief TensorRT max workspace size. + const size_t max_workspace_size; + + //!< @brief DLA core ID that the process uses. + const int32_t dla_core_id; + + //!< @brief Flag for per-layer profiler using IProfiler. + const bool profile_per_layer; +}; + +/** + * @brief Represents a tensor with its name or index. + */ +struct TensorInfo +{ + /** + * @brief Construct TensorInfo with tensor name. + * + * @param[in] name Tensor name. + */ + explicit TensorInfo(std::string name) : tensor_name(std::move(name)), tensor_index(-1) {} + + /** + * @brief Construct TensorInfo with tensor index. + * + * @param[in] index Tensor index. + */ + explicit TensorInfo(int32_t index) : tensor_index(index) {} + + /** + * @brief Check if dimensions are equal. + * + * @param lhs Left-hand side tensor dimensions. + * @param rhs Right-hand side tensor dimensions. + * @return Whether dimensions are equal. + */ + static bool dimsEqual(const nvinfer1::Dims & lhs, const nvinfer1::Dims & rhs) + { + if (lhs.nbDims != rhs.nbDims) return false; + return std::equal(lhs.d, lhs.d + lhs.nbDims, rhs.d); // NOLINT + } + + /** + * @brief Get printable representation of tensor dimensions. + * + * @param[in] dims Tensor dimensions. + * @return String representation of tensor dimensions. + */ + static std::string dimsRepr(const nvinfer1::Dims & dims) + { + if (dims.nbDims == 0) return "[]"; + std::string repr = "[" + std::to_string(dims.d[0]); + for (int i = 1; i < dims.nbDims; ++i) { + repr += ", " + std::to_string(dims.d[i]); + } + repr += "]"; + return repr; + } + + //!< @brief Tensor name. + std::string tensor_name; + + //!< @brief Tensor index. + int32_t tensor_index; +}; + +/** + * @brief Represents a network input/output tensor with its dimensions. + * + * Example usage: + * @code + * nvinfer1::Dims tensor_dims = {3, {1, 2, 3}}; + * NetworkIO input("input_tensor", tensor_dims); + * NetworkIO output("output_tensor", tensor_dims); + * bool is_equal = input == output; // false + * @endcode + */ +struct NetworkIO : public TensorInfo +{ + /** + * @brief Construct NetworkIO with tensor name and dimensions. + * + * @param[in] name Tensor name. + * @param[in] tensor_dims Tensor dimensions. + */ + NetworkIO(std::string name, const nvinfer1::Dims & tensor_dims) + : TensorInfo(std::move(name)), dims(tensor_dims) + { + } + + /** + * @brief Construct NetworkIO with tensor index and dimensions. + * + * @param[in] index Tensor index. + * @param[in] tensor_dims Tensor dimensions. + */ + NetworkIO(int32_t index, const nvinfer1::Dims & tensor_dims) + : TensorInfo(index), dims(tensor_dims) + { + } + + /** + * @brief Get printable representation of NetworkIO. + * + * @return String representation of NetworkIO. + */ + [[nodiscard]] std::string toString() const + { + std::stringstream ss; + ss << tensor_name << " {" << TensorInfo::dimsRepr(dims) << "}"; + return ss.str(); + } + + /** + * @brief Check if NetworkIO is equal to another NetworkIO. + * + * @param rhs Right-hand side NetworkIO. + * @return Whether NetworkIO is equal to another NetworkIO. + */ + bool operator==(const NetworkIO & rhs) const + { + if (tensor_name != rhs.tensor_name) return false; + return dimsEqual(dims, rhs.dims); + } + + /** + * @brief Check if NetworkIO is not equal to another NetworkIO. + * + * @param rhs Right-hand side NetworkIO. + * @return Whether NetworkIO is not equal to another NetworkIO. + */ + bool operator!=(const NetworkIO & rhs) const { return !(*this == rhs); } + + /** + * @brief Output NetworkIO to ostream. + * + * @param os Output stream. + * @param io NetworkIO. + * @return Output stream. + */ + friend std::ostream & operator<<(std::ostream & os, const NetworkIO & io) + { + os << io.toString(); + return os; + } + + //!< @brief Tensor dimensions. + nvinfer1::Dims dims; +}; + +/** + * @brief Represents a tensor optimization profile with minimum, optimal, and maximum dimensions. + * + * Example usage: + * @code + * nvinfer1::Dims min = {3, {1, 2, 3}}; + * nvinfer1::Dims opt = {3, {1, 3, 4}}; + * nvinfer1::Dims max = {3, {1, 4, 5}}; + * ProfileDims entry_1("tensor_name", min, opt, max); + * ProfileDims entry_2("tensor_name", {3, {1, 2, 3}}, {3, {1, 3, 4}}, {3, {1, 4, 5}}); + * bool is_equal = entry_1 == entry_2; // true + * @endcode + */ +struct ProfileDims : public TensorInfo +{ + /** + * @brief Construct ProfileDims with tensor name and dimensions. + * + * @param[in] name Tensor name. + * @param[in] min Minimum dimensions for optimization profile. + * @param[in] opt Optimal dimensions for optimization profile. + * @param[in] max Maximum dimensions for optimization profile. + */ + ProfileDims( + std::string name, const nvinfer1::Dims & min, const nvinfer1::Dims & opt, + const nvinfer1::Dims & max) + : TensorInfo(std::move(name)), min_dims(min), opt_dims(opt), max_dims(max) + { + } + + /** + * @brief Construct ProfileDims with tensor index and dimensions. + * + * @param[in] index Tensor index. + * @param[in] min Minimum dimensions for optimization profile. + * @param[in] opt Optimal dimensions for optimization profile. + * @param[in] max Maximum dimensions for optimization profile. + */ + ProfileDims( + int32_t index, const nvinfer1::Dims & min, const nvinfer1::Dims & opt, + const nvinfer1::Dims & max) + : TensorInfo(index), min_dims(min), opt_dims(opt), max_dims(max) + { + } + + /** + * @brief Get printable representation of ProfileDims. + * + * @return String representation of ProfileDims. + */ + [[nodiscard]] std::string toString() const + { + std::ostringstream oss; + oss << tensor_name << " {min " << TensorInfo::dimsRepr(min_dims) << ", opt " + << TensorInfo::dimsRepr(opt_dims) << ", max " << TensorInfo::dimsRepr(max_dims) << "}"; + return oss.str(); + } + + /** + * @brief Check if ProfileDims is equal to another ProfileDims. + * + * @param rhs Right-hand side ProfileDims. + * @return Whether ProfileDims is equal to another ProfileDims. + */ + bool operator==(const ProfileDims & rhs) const + { + if (tensor_name != rhs.tensor_name) return false; + return dimsEqual(min_dims, rhs.min_dims) && dimsEqual(opt_dims, rhs.opt_dims) && + dimsEqual(max_dims, rhs.max_dims); + } + + /** + * @brief Check if ProfileDims is not equal to another ProfileDims. + * + * @param rhs Right-hand side ProfileDims. + * @return Whether ProfileDims is not equal to another ProfileDims. + */ + bool operator!=(const ProfileDims & rhs) const { return !(*this == rhs); } + + /** + * @brief Output ProfileDims to ostream. + * + * @param os Output stream. + * @param profile ProfileDims. + * @return Output stream. + */ + friend std::ostream & operator<<(std::ostream & os, const ProfileDims & profile) + { + os << profile.toString(); + return os; + } + + //!< @brief Minimum dimensions for optimization profile. + nvinfer1::Dims min_dims; + + //!< @brief Optimal dimensions for optimization profile. + nvinfer1::Dims opt_dims; + + //!< @brief Maximum dimensions for optimization profile. + nvinfer1::Dims max_dims; +}; + +//!< @brief Valid calibration types for TensorRT. +constexpr std::array valid_calib_type = { + "Entropy", "Legacy", "Percentile", "MinMax"}; + +/** + * @brief Configuration for implicit calibration. + */ +struct CalibrationConfig +{ + /** + * @brief Construct CalibrationConfig with its parameters. + * + * @param[in] calib_type_str Calibration type. + * @param[in] quantize_first_layer Flag for partial quantization in first layer. + * @param[in] quantize_last_layer Flag for partial quantization in last layer. + * @param[in] clip_value Clip value for implicit quantization. + */ + explicit CalibrationConfig( + const std::string & calib_type_str = "MinMax", const bool quantize_first_layer = false, + const bool quantize_last_layer = false, const double clip_value = 0.0) + : calib_type_str(calib_type_str), + quantize_first_layer(quantize_first_layer), + quantize_last_layer(quantize_last_layer), + clip_value(clip_value) + { + if ( + std::find(valid_calib_type.begin(), valid_calib_type.end(), calib_type_str) == + valid_calib_type.end()) { + throw std::runtime_error( + "Invalid calibration type was specified: " + std::string(calib_type_str) + + "\nValid value is one of: [Entropy, (Legacy | Percentile), MinMax]"); + } + } + + //!< @brief type of calibration + const std::string calib_type_str; + + //!< @brief flag for partial quantization in first layer + const bool quantize_first_layer; + + //!< @brief flag for partial quantization in last layer + const bool quantize_last_layer; + + //!< @brief clip value for implicit quantization + const double clip_value; +}; + +} // namespace tensorrt_common +} // namespace autoware + +#endif // AUTOWARE__TENSORRT_COMMON__UTILS_HPP_ diff --git a/perception/autoware_tensorrt_common/src/profiler.cpp b/perception/autoware_tensorrt_common/src/profiler.cpp new file mode 100644 index 0000000000000..433cca51f2b4f --- /dev/null +++ b/perception/autoware_tensorrt_common/src/profiler.cpp @@ -0,0 +1,113 @@ +// 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. + +#include + +#include +#include +#include +#include + +namespace autoware +{ +namespace tensorrt_common +{ + +Profiler::Profiler(const std::vector & src_profilers) +{ + index_ = 0; + for (const auto & src_profiler : src_profilers) { + for (const auto & [name, record] : src_profiler.profile_) { + auto it = profile_.find(name); + if (it == profile_.end()) { + profile_.emplace(name, record); + } else { + it->second.time += record.time; + it->second.count += record.count; + } + } + } +} + +void Profiler::reportLayerTime(const char * layerName, float ms) noexcept +{ + if (profile_.find(layerName) == profile_.end()) { + return; + } + profile_[layerName].count++; + profile_[layerName].time += ms; + if (profile_[layerName].min_time == -1.0) { + profile_[layerName].min_time = ms; + profile_[layerName].index = index_; + index_++; + } else if (profile_[layerName].min_time > ms) { + profile_[layerName].min_time = ms; + } +} + +std::string Profiler::toString() const +{ + std::ostringstream out; + float total_time = 0.0; + std::string layer_name = "Operation"; + + int max_layer_name_length = static_cast(layer_name.size()); + for (const auto & elem : profile_) { + total_time += elem.second.time; + max_layer_name_length = std::max(max_layer_name_length, static_cast(elem.first.size())); + } + + auto old_settings = out.flags(); + auto old_precision = out.precision(); + // Output header + { + out << "index, " << std::setw(12); + out << std::setw(max_layer_name_length) << layer_name << " "; + out << std::setw(12) << "Runtime" << "%," << " "; + out << std::setw(12) << "Invocations" << " , "; + out << std::setw(12) << "Runtime[ms]" << " , "; + out << std::setw(12) << "Avg Runtime[ms]" << " ,"; + out << std::setw(12) << "Min Runtime[ms]" << std::endl; + } + int index = index_; + for (int i = 0; i < index; i++) { + for (const auto & elem : profile_) { + if (elem.second.index == i) { + out << i << ", "; + out << std::setw(max_layer_name_length) << elem.first << ","; + out << std::setw(12) << std::fixed << std::setprecision(1) + << (elem.second.time * 100.0F / total_time) << "%" << ","; + out << std::setw(12) << elem.second.count << ","; + out << std::setw(12) << std::fixed << std::setprecision(2) << elem.second.time << ", "; + out << std::setw(12) << std::fixed << std::setprecision(2) + << elem.second.time / elem.second.count << ", "; + out << std::setw(12) << std::fixed << std::setprecision(2) << elem.second.min_time + << std::endl; + } + } + } + out.flags(old_settings); + out.precision(old_precision); + out << "========== total runtime = " << total_time << " ms ==========" << std::endl; + + return out.str(); +} + +std::ostream & operator<<(std::ostream & out, const Profiler & value) +{ + out << value.toString(); + return out; +} +} // namespace tensorrt_common +} // namespace autoware diff --git a/perception/autoware_tensorrt_common/src/simple_profiler.cpp b/perception/autoware_tensorrt_common/src/simple_profiler.cpp deleted file mode 100644 index 2bcc1c4f9da06..0000000000000 --- a/perception/autoware_tensorrt_common/src/simple_profiler.cpp +++ /dev/null @@ -1,138 +0,0 @@ -// 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. - -#include - -#include -#include -#include -#include - -namespace autoware -{ -namespace tensorrt_common -{ - -SimpleProfiler::SimpleProfiler(std::string name, const std::vector & src_profilers) -: m_name(name) -{ - m_index = 0; - for (const auto & src_profiler : src_profilers) { - for (const auto & rec : src_profiler.m_profile) { - auto it = m_profile.find(rec.first); - if (it == m_profile.end()) { - m_profile.insert(rec); - } else { - it->second.time += rec.second.time; - it->second.count += rec.second.count; - } - } - } -} - -void SimpleProfiler::reportLayerTime(const char * layerName, float ms) noexcept -{ - m_profile[layerName].count++; - m_profile[layerName].time += ms; - if (m_profile[layerName].min_time == -1.0) { - m_profile[layerName].min_time = ms; - m_profile[layerName].index = m_index; - m_index++; - } else if (m_profile[layerName].min_time > ms) { - m_profile[layerName].min_time = ms; - } -} - -void SimpleProfiler::setProfDict(nvinfer1::ILayer * layer) noexcept -{ - std::string name = layer->getName(); - m_layer_dict[name]; - m_layer_dict[name].type = layer->getType(); - if (layer->getType() == nvinfer1::LayerType::kCONVOLUTION) { - nvinfer1::IConvolutionLayer * conv = (nvinfer1::IConvolutionLayer *)layer; - nvinfer1::ITensor * in = layer->getInput(0); - nvinfer1::Dims dim_in = in->getDimensions(); - nvinfer1::ITensor * out = layer->getOutput(0); - nvinfer1::Dims dim_out = out->getDimensions(); - nvinfer1::Dims k_dims = conv->getKernelSizeNd(); - nvinfer1::Dims s_dims = conv->getStrideNd(); - int groups = conv->getNbGroups(); - int stride = s_dims.d[0]; - int kernel = k_dims.d[0]; - m_layer_dict[name].in_c = dim_in.d[1]; - m_layer_dict[name].out_c = dim_out.d[1]; - m_layer_dict[name].w = dim_in.d[3]; - m_layer_dict[name].h = dim_in.d[2]; - m_layer_dict[name].k = kernel; - ; - m_layer_dict[name].stride = stride; - m_layer_dict[name].groups = groups; - } -} - -std::ostream & operator<<(std::ostream & out, const SimpleProfiler & value) -{ - out << "========== " << value.m_name << " profile ==========" << std::endl; - float totalTime = 0; - std::string layerNameStr = "Operation"; - - int maxLayerNameLength = static_cast(layerNameStr.size()); - for (const auto & elem : value.m_profile) { - totalTime += elem.second.time; - maxLayerNameLength = std::max(maxLayerNameLength, static_cast(elem.first.size())); - } - - auto old_settings = out.flags(); - auto old_precision = out.precision(); - // Output header - { - out << "index, " << std::setw(12); - out << std::setw(maxLayerNameLength) << layerNameStr << " "; - out << std::setw(12) << "Runtime" - << "%," - << " "; - out << std::setw(12) << "Invocations" - << " , "; - out << std::setw(12) << "Runtime[ms]" - << " , "; - out << std::setw(12) << "Avg Runtime[ms]" - << " ,"; - out << std::setw(12) << "Min Runtime[ms]" << std::endl; - } - int index = value.m_index; - for (int i = 0; i < index; i++) { - for (const auto & elem : value.m_profile) { - if (elem.second.index == i) { - out << i << ", "; - out << std::setw(maxLayerNameLength) << elem.first << ","; - out << std::setw(12) << std::fixed << std::setprecision(1) - << (elem.second.time * 100.0F / totalTime) << "%" - << ","; - out << std::setw(12) << elem.second.count << ","; - out << std::setw(12) << std::fixed << std::setprecision(2) << elem.second.time << ", "; - out << std::setw(12) << std::fixed << std::setprecision(2) - << elem.second.time / elem.second.count << ", "; - out << std::setw(12) << std::fixed << std::setprecision(2) << elem.second.min_time - << std::endl; - } - } - } - out.flags(old_settings); - out.precision(old_precision); - out << "========== " << value.m_name << " total runtime = " << totalTime - << " ms ==========" << std::endl; - return out; -} -} // namespace tensorrt_common -} // namespace autoware diff --git a/perception/autoware_tensorrt_common/src/tensorrt_common.cpp b/perception/autoware_tensorrt_common/src/tensorrt_common.cpp index 990433ee277a0..ba422277416ab 100644 --- a/perception/autoware_tensorrt_common/src/tensorrt_common.cpp +++ b/perception/autoware_tensorrt_common/src/tensorrt_common.cpp @@ -12,102 +12,38 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include "autoware/tensorrt_common/tensorrt_common.hpp" +#include "autoware/tensorrt_common/logger.hpp" +#include "autoware/tensorrt_common/utils.hpp" + +#include #include +#include #include +#include #include -#include #include #include #include +#include #include #include -namespace -{ -template -bool contain(const std::string & s, const T & v) -{ - return s.find(v) != std::string::npos; -} -} // anonymous namespace - namespace autoware { namespace tensorrt_common { -nvinfer1::Dims get_input_dims(const std::string & onnx_file_path) -{ - Logger logger_; - auto builder = TrtUniquePtr(nvinfer1::createInferBuilder(logger_)); - if (!builder) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder"); - } - - const auto explicitBatch = - 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); - - auto network = - TrtUniquePtr(builder->createNetworkV2(explicitBatch)); - if (!network) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create network"); - } - - auto config = TrtUniquePtr(builder->createBuilderConfig()); - if (!config) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder config"); - } - - auto parser = TrtUniquePtr(nvonnxparser::createParser(*network, logger_)); - if (!parser->parseFromFile( - onnx_file_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kERROR))) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Failed to parse onnx file"); - } - - const auto input = network->getInput(0); - return input->getDimensions(); -} - -bool is_valid_precision_string(const std::string & precision) -{ - if ( - std::find(valid_precisions.begin(), valid_precisions.end(), precision) == - valid_precisions.end()) { - std::stringstream message; - message << "Invalid precision was specified: " << precision << std::endl - << "Valid string is one of: ["; - for (const auto & s : valid_precisions) { - message << s << ", "; - } - message << "] (case sensitive)" << std::endl; - std::cerr << message.str(); - return false; - } else { - return true; - } -} TrtCommon::TrtCommon( - const std::string & model_path, const std::string & precision, - std::unique_ptr calibrator, const BatchConfig & batch_config, - const size_t max_workspace_size, const BuildConfig & build_config, + const TrtCommonConfig & trt_config, const std::shared_ptr & profiler, const std::vector & plugin_paths) -: model_file_path_(model_path), - calibrator_(std::move(calibrator)), - precision_(precision), - batch_config_(batch_config), - max_workspace_size_(max_workspace_size), - model_profiler_("Model"), - host_profiler_("Host") +: trt_config_(std::make_shared(trt_config)), + host_profiler_(profiler), + model_profiler_(profiler) { - // Check given precision is valid one - if (!is_valid_precision_string(precision)) { - return; - } - build_config_ = std::make_unique(build_config); - + logger_ = std::make_shared(); for (const auto & plugin_path : plugin_paths) { int32_t flags{RTLD_LAZY}; // cspell: ignore asan @@ -120,523 +56,595 @@ TrtCommon::TrtCommon( #endif // ENABLE_ASAN void * handle = dlopen(plugin_path.c_str(), flags); if (!handle) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Could not load plugin library"); + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Could not load plugin library"); + } else { + logger_->log( + nvinfer1::ILogger::Severity::kINFO, "Loaded plugin library: %s", plugin_path.c_str()); } } - runtime_ = TrtUniquePtr(nvinfer1::createInferRuntime(logger_)); - if (build_config_->dla_core_id != -1) { - runtime_->setDLACore(build_config_->dla_core_id); + runtime_ = TrtUniquePtr(nvinfer1::createInferRuntime(*logger_)); + if (trt_config_->dla_core_id != -1) { + runtime_->setDLACore(trt_config_->dla_core_id); } - initLibNvInferPlugins(&logger_, ""); -} + initLibNvInferPlugins(&*logger_, ""); -TrtCommon::~TrtCommon() -{ + if (!initialize()) { + throw std::runtime_error("Failed to initialize TensorRT"); + } } -void TrtCommon::setup() +TrtCommon::~TrtCommon() = default; + +bool TrtCommon::setup(ProfileDimsPtr profile_dims, NetworkIOPtr network_io) { - if (!fs::exists(model_file_path_)) { - is_initialized_ = false; - return; - } - // cppcheck-suppress unreadVariable - std::string engine_path = model_file_path_; - if (model_file_path_.extension() == ".engine") { - std::cout << "Load ... " << model_file_path_ << std::endl; - loadEngine(model_file_path_); - } else if (model_file_path_.extension() == ".onnx") { - fs::path cache_engine_path{model_file_path_}; - std::string ext; - std::string calib_name = ""; - if (precision_ == "int8") { - if (build_config_->calib_type_str == "Entropy") { - calib_name = "EntropyV2-"; - } else if ( - build_config_->calib_type_str == "Legacy" || - build_config_->calib_type_str == "Percentile") { - calib_name = "Legacy-"; - } else { - calib_name = "MinMax-"; + profile_dims_ = std::move(profile_dims); + network_io_ = std::move(network_io); + + // Set input profile + if (profile_dims_ && !profile_dims_->empty()) { + auto profile = builder_->createOptimizationProfile(); + for (auto & profile_dim : *profile_dims_) { + if (profile_dim.tensor_name.empty()) { + profile_dim.tensor_name = getIOTensorName(profile_dim.tensor_index); } + logger_->log( + nvinfer1::ILogger::Severity::kINFO, "Setting optimization profile for tensor: %s", + profile_dim.toString().c_str()); + profile->setDimensions( + profile_dim.tensor_name.c_str(), nvinfer1::OptProfileSelector::kMIN, profile_dim.min_dims); + profile->setDimensions( + profile_dim.tensor_name.c_str(), nvinfer1::OptProfileSelector::kOPT, profile_dim.opt_dims); + profile->setDimensions( + profile_dim.tensor_name.c_str(), nvinfer1::OptProfileSelector::kMAX, profile_dim.max_dims); } - if (build_config_->dla_core_id != -1) { - ext = "DLA" + std::to_string(build_config_->dla_core_id) + "-" + calib_name + precision_; - if (build_config_->quantize_first_layer) { - ext += "-firstFP16"; - } - if (build_config_->quantize_last_layer) { - ext += "-lastFP16"; - } - ext += "-batch" + std::to_string(batch_config_[0]) + ".engine"; - } else { - ext = calib_name + precision_; - if (build_config_->quantize_first_layer) { - ext += "-firstFP16"; - } - if (build_config_->quantize_last_layer) { - ext += "-lastFP16"; - } - ext += "-batch" + std::to_string(batch_config_[0]) + ".engine"; + builder_config_->addOptimizationProfile(profile); + } + + auto build_engine_with_log = [this]() -> bool { + logger_->log(nvinfer1::ILogger::Severity::kINFO, "Starting to build engine"); + auto log_thread = logger_->log_throttle( + nvinfer1::ILogger::Severity::kINFO, + "Applying optimizations and building TensorRT CUDA engine. Please wait for a few minutes...", + 5); + auto success = buildEngineFromOnnx(); + logger_->stop_throttle(log_thread); + logger_->log(nvinfer1::ILogger::Severity::kINFO, "Engine build completed"); + return success; + }; + + // Load engine file if it exists + if (fs::exists(trt_config_->engine_path)) { + logger_->log(nvinfer1::ILogger::Severity::kINFO, "Loading engine"); + if (!loadEngine()) { + return false; } - cache_engine_path.replace_extension(ext); - - // Output Network Information - printNetworkInfo(model_file_path_); - - if (fs::exists(cache_engine_path)) { - std::cout << "Loading... " << cache_engine_path << std::endl; - loadEngine(cache_engine_path); - } else { - std::cout << "Building... " << cache_engine_path << std::endl; - logger_.log(nvinfer1::ILogger::Severity::kINFO, "Start build engine"); - auto log_thread = logger_.log_throttle( - nvinfer1::ILogger::Severity::kINFO, - "Applying optimizations and building TRT CUDA engine. Please wait for a few minutes...", 5); - buildEngineFromOnnx(model_file_path_, cache_engine_path); - logger_.stop_throttle(log_thread); - logger_.log(nvinfer1::ILogger::Severity::kINFO, "End build engine"); + logger_->log(nvinfer1::ILogger::Severity::kINFO, "Network validation"); + // Validate engine tensor shapes and optimization profile + if (!validateNetworkIO() || !validateProfileDims()) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Network validation failed for loaded engine from file. Rebuilding engine"); + // Rebuild engine if the tensor shapes or optimization profile mismatch + if (!build_engine_with_log()) { + return false; + } } - // cppcheck-suppress unreadVariable - engine_path = cache_engine_path; } else { - is_initialized_ = false; - return; + // Build engine if engine has not been cached + if (!build_engine_with_log()) { + return false; + } } - context_ = TrtUniquePtr(engine_->createExecutionContext()); - if (!context_) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create context"); - is_initialized_ = false; - return; + // Validate engine nevertheless is loaded or rebuilt + if (!validateNetworkIO() || !validateProfileDims()) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, + "Final network validation failed. Possibly the input / output of the currently " + "deployed model has changed. Check your configuration file with the current model."); + return false; } - if (build_config_->profile_per_layer) { - context_->setProfiler(&model_profiler_); + logger_->log(nvinfer1::ILogger::Severity::kINFO, "Engine setup completed"); + return true; +} + +std::string TrtCommon::getPrecision() const +{ + return trt_config_->precision; +} + +const char * TrtCommon::getIOTensorName(const int32_t index) const +{ + if (!engine_) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Engine is not initialized. Retrieving data from network"); + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Network is not initialized"); + return nullptr; + } + auto num_inputs = network_->getNbInputs(); + auto num_outputs = network_->getNbOutputs(); + if (index < 0 || index >= num_inputs + num_outputs) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, + "Invalid index for I/O tensor: %d. Total I/O tensors: %d", index, num_inputs + num_outputs); + return nullptr; + } + if (index < num_inputs) { + return network_->getInput(index)->getName(); + } + return network_->getOutput(index - num_inputs)->getName(); } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 - // Write profiles for trt-engine-explorer - // See: https://github.com/NVIDIA/TensorRT/tree/main/tools/experimental/trt-engine-explorer - std::string j_ext = ".json"; - fs::path json_path{engine_path}; - json_path.replace_extension(j_ext); - std::string ret = getLayerInformation(nvinfer1::LayerInformationFormat::kJSON); - std::ofstream os(json_path, std::ofstream::trunc); - os << ret << std::flush; -#endif - is_initialized_ = true; + return engine_->getIOTensorName(index); } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8500 -void TrtCommon::setupBindings(std::vector & bindings) +int32_t TrtCommon::getNbIOTensors() const { - for (int32_t i = 0, e = engine_->getNbIOTensors(); i < e; i++) { - auto const name = engine_->getIOTensorName(i); - context_->setTensorAddress(name, bindings.at(i)); + if (!engine_) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Engine is not initialized. Retrieving data from network"); + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Network is not initialized"); + return 0; + } + return network_->getNbInputs() + network_->getNbOutputs(); } + return engine_->getNbIOTensors(); } -#endif -bool TrtCommon::loadEngine(const std::string & engine_file_path) +nvinfer1::Dims TrtCommon::getTensorShape(const int32_t index) const { - std::ifstream engine_file(engine_file_path); - std::stringstream engine_buffer; - engine_buffer << engine_file.rdbuf(); - std::string engine_str = engine_buffer.str(); - engine_ = TrtUniquePtr(runtime_->deserializeCudaEngine( - reinterpret_cast(engine_str.data()), engine_str.size())); - return true; + if (!engine_) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Engine is not initialized. Retrieving data from network"); + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Network is not initialized"); + return nvinfer1::Dims{}; + } + auto num_inputs = network_->getNbInputs(); + auto num_outputs = network_->getNbOutputs(); + if (index < 0 || index >= num_inputs + num_outputs) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, + "Invalid index for I/O tensor: %d. Total I/O tensors: %d", index, num_inputs + num_outputs); + return nvinfer1::Dims{}; + } + if (index < num_inputs) { + return network_->getInput(index)->getDimensions(); + } + return network_->getOutput(index - num_inputs)->getDimensions(); + } + auto const & name = getIOTensorName(index); + return getTensorShape(name); } -void TrtCommon::printNetworkInfo(const std::string & onnx_file_path) +nvinfer1::Dims TrtCommon::getTensorShape(const char * tensor_name) const { - auto builder = TrtUniquePtr(nvinfer1::createInferBuilder(logger_)); - if (!builder) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder"); - return; + if (!engine_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Engine is not initialized"); + return nvinfer1::Dims{}; } + return engine_->getTensorShape(tensor_name); +} - const auto explicitBatch = - 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); +nvinfer1::Dims TrtCommon::getInputDims(const int32_t index) const +{ + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Network is not initialized"); + return {}; + } + const auto input = network_->getInput(index); + return input->getDimensions(); +} - auto network = - TrtUniquePtr(builder->createNetworkV2(explicitBatch)); - if (!network) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create network"); - return; +nvinfer1::Dims TrtCommon::getOutputDims(const int32_t index) const +{ + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Network is not initialized"); + return {}; } + const auto output = network_->getOutput(index); + return output->getDimensions(); +} + +bool TrtCommon::setTensorAddress(const int32_t index, void * data) +{ + auto const & name = getIOTensorName(index); + return setTensorAddress(name, data); +} - auto config = TrtUniquePtr(builder->createBuilderConfig()); - if (!config) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder config"); - return; +bool TrtCommon::setTensorAddress(const char * tensor_name, void * data) +{ + if (!context_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Context is not initialized"); + return false; + } + auto success = context_->setTensorAddress(tensor_name, data); + if (!success) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, + "Failed to set tensor address for tensor: ", tensor_name); } + return success; +} - if (precision_ == "fp16" || precision_ == "int8") { - config->setFlag(nvinfer1::BuilderFlag::kFP16); +bool TrtCommon::setTensorsAddresses(std::vector & tensors) +{ + bool success = true; + for (std::size_t i = 0, e = tensors.size(); i < e; i++) { + auto const name = getIOTensorName(i); + success &= setTensorAddress(name, tensors.at(i)); } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8400 - config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, max_workspace_size_); -#else - config->setMaxWorkspaceSize(max_workspace_size_); -#endif + return success; +} - auto parser = TrtUniquePtr(nvonnxparser::createParser(*network, logger_)); - if (!parser->parseFromFile( - onnx_file_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kERROR))) { - return; - } - int num = network->getNbLayers(); - float total_gflops = 0.0; - int total_params = 0; - for (int i = 0; i < num; i++) { - nvinfer1::ILayer * layer = network->getLayer(i); - auto layer_type = layer->getType(); - if (build_config_->profile_per_layer) { - model_profiler_.setProfDict(layer); - } - if (layer_type == nvinfer1::LayerType::kCONSTANT) { - continue; - } - nvinfer1::ITensor * in = layer->getInput(0); - nvinfer1::Dims dim_in = in->getDimensions(); - nvinfer1::ITensor * out = layer->getOutput(0); - nvinfer1::Dims dim_out = out->getDimensions(); - - if (layer_type == nvinfer1::LayerType::kCONVOLUTION) { - nvinfer1::IConvolutionLayer * conv = (nvinfer1::IConvolutionLayer *)layer; - nvinfer1::Dims k_dims = conv->getKernelSizeNd(); - nvinfer1::Dims s_dims = conv->getStrideNd(); - int groups = conv->getNbGroups(); - int stride = s_dims.d[0]; - int num_weights = (dim_in.d[1] / groups) * dim_out.d[1] * k_dims.d[0] * k_dims.d[1]; - float gflops = (2.0 * num_weights) * (static_cast(dim_in.d[3]) / stride * - static_cast(dim_in.d[2]) / stride / 1e9); - total_gflops += gflops; - total_params += num_weights; - std::cout << "L" << i << " [conv " << k_dims.d[0] << "x" << k_dims.d[1] << " (" << groups - << ") " - << "/" << s_dims.d[0] << "] " << dim_in.d[3] << "x" << dim_in.d[2] << "x" - << dim_in.d[1] << " -> " << dim_out.d[3] << "x" << dim_out.d[2] << "x" - << dim_out.d[1]; - std::cout << " weights:" << num_weights; - std::cout << " GFLOPs:" << gflops; - std::cout << std::endl; - } else if (layer_type == nvinfer1::LayerType::kPOOLING) { - nvinfer1::IPoolingLayer * pool = (nvinfer1::IPoolingLayer *)layer; - auto p_type = pool->getPoolingType(); - nvinfer1::Dims dim_stride = pool->getStrideNd(); - nvinfer1::Dims dim_window = pool->getWindowSizeNd(); - - std::cout << "L" << i << " ["; - if (p_type == nvinfer1::PoolingType::kMAX) { - std::cout << "max "; - } else if (p_type == nvinfer1::PoolingType::kAVERAGE) { - std::cout << "avg "; - } else if (p_type == nvinfer1::PoolingType::kMAX_AVERAGE_BLEND) { - std::cout << "max avg blend "; - } - float gflops = static_cast(dim_in.d[1]) * - (static_cast(dim_window.d[0]) / static_cast(dim_stride.d[0])) * - (static_cast(dim_window.d[1]) / static_cast(dim_stride.d[1])) * - static_cast(dim_in.d[2]) * static_cast(dim_in.d[3]) / 1e9; - total_gflops += gflops; - std::cout << "pool " << dim_window.d[0] << "x" << dim_window.d[1] << "]"; - std::cout << " GFLOPs:" << gflops; - std::cout << std::endl; - } else if (layer_type == nvinfer1::LayerType::kRESIZE) { - std::cout << "L" << i << " [resize]" << std::endl; - } +bool TrtCommon::setTensorsAddresses(std::unordered_map & tensors) +{ + bool success = true; + for (auto const & tensor : tensors) { + success &= setTensorAddress(tensor.first, tensor.second); } - std::cout << "Total " << total_gflops << " GFLOPs" << std::endl; - std::cout << "Total " << total_params / 1000.0 / 1000.0 << " M params" << std::endl; - return; + return success; +} + +bool TrtCommon::setInputShape(const int32_t index, const nvinfer1::Dims & dimensions) +{ + auto const & name = getIOTensorName(index); + return setInputShape(name, dimensions); } -bool TrtCommon::buildEngineFromOnnx( - const std::string & onnx_file_path, const std::string & output_engine_file_path) +bool TrtCommon::setInputShape(const char * tensor_name, const nvinfer1::Dims & dimensions) { - auto builder = TrtUniquePtr(nvinfer1::createInferBuilder(logger_)); - if (!builder) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder"); + if (!context_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Context is not initialized"); return false; } + auto success = context_->setInputShape(tensor_name, dimensions); + if (!success) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, "Failed to set input shape for tensor: ", tensor_name); + } + return success; +} - const auto explicitBatch = - 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); +bool TrtCommon::setInputsShapes(const std::vector & dimensions) +{ + bool success = true; + for (std::size_t i = 0, e = dimensions.size(); i < e; i++) { + success &= setInputShape(i, dimensions.at(i)); + } + return success; +} - auto network = - TrtUniquePtr(builder->createNetworkV2(explicitBatch)); - if (!network) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create network"); - return false; +bool TrtCommon::setInputsShapes(const std::unordered_map & dimensions) +{ + bool success = true; + for (auto const & dim : dimensions) { + success &= setInputShape(dim.first, dim.second); } + return success; +} - auto config = TrtUniquePtr(builder->createBuilderConfig()); - if (!config) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder config"); - return false; +bool TrtCommon::setTensor(const int32_t index, void * data, nvinfer1::Dims dimensions) +{ + auto success = setTensorAddress(index, data); + if (dimensions.nbDims > 0) { + success &= setInputShape(index, dimensions); } + return success; +} - int num_available_dla = builder->getNbDLACores(); - if (build_config_->dla_core_id != -1) { - if (num_available_dla > 0) { - std::cout << "###" << num_available_dla << " DLAs are supported! ###" << std::endl; - } else { - std::cout << "###Warning : " - << "No DLA is supported! ###" << std::endl; - } - config->setDefaultDeviceType(nvinfer1::DeviceType::kDLA); - config->setDLACore(build_config_->dla_core_id); -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 - config->setFlag(nvinfer1::BuilderFlag::kPREFER_PRECISION_CONSTRAINTS); -#else - config->setFlag(nvinfer1::BuilderFlag::kSTRICT_TYPES); -#endif - config->setFlag(nvinfer1::BuilderFlag::kGPU_FALLBACK); +bool TrtCommon::setTensor(const char * tensor_name, void * data, nvinfer1::Dims dimensions) +{ + auto success = setTensorAddress(tensor_name, data); + if (dimensions.nbDims > 0) { + success &= setInputShape(tensor_name, dimensions); } - if (precision_ == "fp16" || precision_ == "int8") { - config->setFlag(nvinfer1::BuilderFlag::kFP16); + return success; +} + +bool TrtCommon::setTensors(TensorsVec & tensors) +{ + bool success = true; + for (std::size_t i = 0, e = tensors.size(); i < e; i++) { + success &= setTensor(i, tensors.at(i).first, tensors.at(i).second); } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8400 - config->setMemoryPoolLimit(nvinfer1::MemoryPoolType::kWORKSPACE, max_workspace_size_); -#else - config->setMaxWorkspaceSize(max_workspace_size_); -#endif + return success; +} - auto parser = TrtUniquePtr(nvonnxparser::createParser(*network, logger_)); - if (!parser->parseFromFile( - onnx_file_path.c_str(), static_cast(nvinfer1::ILogger::Severity::kERROR))) { - std::cout << "Failed to parse onnx file" << std::endl; - return false; +bool TrtCommon::setTensors(TensorsMap & tensors) +{ + bool success = true; + for (auto const & tensor : tensors) { + success &= setTensor(tensor.first, tensor.second.first, tensor.second.second); } + return success; +} - const int num = network->getNbLayers(); - bool first = build_config_->quantize_first_layer; - bool last = build_config_->quantize_last_layer; - // Partial Quantization - if (precision_ == "int8") { - network->getInput(0)->setDynamicRange(0, 255.0); - for (int i = 0; i < num; i++) { - nvinfer1::ILayer * layer = network->getLayer(i); - auto layer_type = layer->getType(); - std::string name = layer->getName(); - nvinfer1::ITensor * out = layer->getOutput(0); - if (build_config_->clip_value > 0.0) { - std::cout << "Set max value for outputs : " << build_config_->clip_value << " " << name - << std::endl; - out->setDynamicRange(0.0, build_config_->clip_value); - } +std::shared_ptr TrtCommon::getModelProfiler() +{ + return model_profiler_; +} - if (layer_type == nvinfer1::LayerType::kCONVOLUTION) { - if (first) { - layer->setPrecision(nvinfer1::DataType::kHALF); - std::cout << "Set kHALF in " << name << std::endl; - first = false; - } - if (last) { - // cspell: ignore preds - if ( - contain(name, "reg_preds") || contain(name, "cls_preds") || - contain(name, "obj_preds")) { - layer->setPrecision(nvinfer1::DataType::kHALF); - std::cout << "Set kHALF in " << name << std::endl; - } - for (int j = num - 1; j >= 0; j--) { - nvinfer1::ILayer * inner_layer = network->getLayer(j); - auto inner_layer_type = inner_layer->getType(); - std::string inner_name = inner_layer->getName(); - if (inner_layer_type == nvinfer1::LayerType::kCONVOLUTION) { - inner_layer->setPrecision(nvinfer1::DataType::kHALF); - std::cout << "Set kHALF in " << inner_name << std::endl; - break; - } - if (inner_layer_type == nvinfer1::LayerType::kMATRIX_MULTIPLY) { - inner_layer->setPrecision(nvinfer1::DataType::kHALF); - std::cout << "Set kHALF in " << inner_name << std::endl; - break; - } - } - } - } - } +std::shared_ptr TrtCommon::getHostProfiler() +{ + return host_profiler_; +} + +std::shared_ptr TrtCommon::getTrtCommonConfig() +{ + return trt_config_; +} + +std::shared_ptr TrtCommon::getBuilderConfig() +{ + return builder_config_; +} + +std::shared_ptr TrtCommon::getNetwork() +{ + return network_; +} + +std::shared_ptr TrtCommon::getLogger() +{ + return logger_; +} + +bool TrtCommon::enqueueV3(cudaStream_t stream) +{ + if (!context_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Context is not initialized"); + return false; + } + if (trt_config_->profile_per_layer) { + auto inference_start = std::chrono::high_resolution_clock::now(); + auto success = context_->enqueueV3(stream); + auto inference_end = std::chrono::high_resolution_clock::now(); + host_profiler_->reportLayerTime( + "inference_host", + std::chrono::duration(inference_end - inference_start).count()); + return success; } + return context_->enqueueV3(stream); +} - const auto input = network->getInput(0); - const auto input_dims = input->getDimensions(); - const auto input_channel = input_dims.d[1]; - const auto input_height = input_dims.d[2]; - const auto input_width = input_dims.d[3]; - const auto input_batch = input_dims.d[0]; +void TrtCommon::printProfiling() const +{ + logger_->log( + nvinfer1::ILogger::Severity::kINFO, "Host Profiling\n", host_profiler_->toString().c_str()); + logger_->log( + nvinfer1::ILogger::Severity::kINFO, "Model Profiling\n", model_profiler_->toString().c_str()); +} + +std::string TrtCommon::getLayerInformation(nvinfer1::LayerInformationFormat format) +{ + if (!context_ || !engine_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Context or engine are not initialized"); + return {}; + } + auto inspector = std::unique_ptr(engine_->createEngineInspector()); + inspector->setExecutionContext(&(*context_)); + std::string result = inspector->getEngineInformation(format); + return result; +} - if (input_batch > 1) { - batch_config_[0] = input_batch; +bool TrtCommon::initialize() +{ + if (!fs::exists(trt_config_->onnx_path) || trt_config_->onnx_path.extension() != ".onnx") { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Invalid ONNX file path or extension"); + return false; } - if (batch_config_.at(0) > 1 && (batch_config_.at(0) == batch_config_.at(2))) { - // Attention : below API is deprecated in TRT8.4 - builder->setMaxBatchSize(batch_config_.at(2)); - } else { - if (build_config_->profile_per_layer) { - auto profile = builder->createOptimizationProfile(); - profile->setDimensions( - network->getInput(0)->getName(), nvinfer1::OptProfileSelector::kMIN, - nvinfer1::Dims4{batch_config_.at(0), input_channel, input_height, input_width}); - profile->setDimensions( - network->getInput(0)->getName(), nvinfer1::OptProfileSelector::kOPT, - nvinfer1::Dims4{batch_config_.at(1), input_channel, input_height, input_width}); - profile->setDimensions( - network->getInput(0)->getName(), nvinfer1::OptProfileSelector::kMAX, - nvinfer1::Dims4{batch_config_.at(2), input_channel, input_height, input_width}); - config->addOptimizationProfile(profile); - } + builder_ = TrtUniquePtr(nvinfer1::createInferBuilder(*logger_)); + if (!builder_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder"); + return false; } - if (precision_ == "int8" && calibrator_) { - config->setFlag(nvinfer1::BuilderFlag::kINT8); -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 - config->setFlag(nvinfer1::BuilderFlag::kPREFER_PRECISION_CONSTRAINTS); + +#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH < 10000 + const auto explicit_batch = + 1U << static_cast(nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); + network_ = TrtUniquePtr(builder_->createNetworkV2(explicit_batch)); #else - config->setFlag(nvinfer1::BuilderFlag::kSTRICT_TYPES); + network_ = TrtUniquePtr(builder_->createNetworkV2(0)); #endif - // QAT requires no calibrator. - // assert((calibrator != nullptr) && "Invalid calibrator for INT8 precision"); - config->setInt8Calibrator(calibrator_.get()); + + if (!network_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create network"); + return false; } - if (build_config_->profile_per_layer) { -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 - config->setProfilingVerbosity(nvinfer1::ProfilingVerbosity::kDETAILED); -#else - config->setProfilingVerbosity(nvinfer1::ProfilingVerbosity::kVERBOSE); -#endif + + builder_config_ = TrtUniquePtr(builder_->createBuilderConfig()); + if (!builder_config_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create builder config"); + return false; + } + + auto num_available_dla = builder_->getNbDLACores(); + if (trt_config_->dla_core_id != -1) { + logger_->log( + nvinfer1::ILogger::Severity::kINFO, "Number of DLAs supported: %d", num_available_dla); + builder_config_->setDefaultDeviceType(nvinfer1::DeviceType::kDLA); + builder_config_->setDLACore(trt_config_->dla_core_id); + builder_config_->setFlag(nvinfer1::BuilderFlag::kPREFER_PRECISION_CONSTRAINTS); + builder_config_->setFlag(nvinfer1::BuilderFlag::kGPU_FALLBACK); } + if (trt_config_->precision == "fp16") { + builder_config_->setFlag(nvinfer1::BuilderFlag::kFP16); + } else if (trt_config_->precision == "int8") { + builder_config_->setFlag(nvinfer1::BuilderFlag::kINT8); + } + builder_config_->setMemoryPoolLimit( + nvinfer1::MemoryPoolType::kWORKSPACE, trt_config_->max_workspace_size); + + parser_ = TrtUniquePtr(nvonnxparser::createParser(*network_, *logger_)); + if (!parser_->parseFromFile( + trt_config_->onnx_path.c_str(), + static_cast(nvinfer1::ILogger::Severity::kERROR))) { + return false; + } + + if (trt_config_->profile_per_layer) { + builder_config_->setProfilingVerbosity(nvinfer1::ProfilingVerbosity::kDETAILED); + } + + return true; +} -#if TENSORRT_VERSION_MAJOR >= 8 - auto plan = - TrtUniquePtr(builder->buildSerializedNetwork(*network, *config)); +bool TrtCommon::buildEngineFromOnnx() +{ + // Build engine + auto plan = TrtUniquePtr( + builder_->buildSerializedNetwork(*network_, *builder_config_)); if (!plan) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create host memory"); + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create host memory"); return false; } engine_ = TrtUniquePtr( runtime_->deserializeCudaEngine(plan->data(), plan->size())); -#else - engine_ = TrtUniquePtr(builder->buildEngineWithConfig(*network, *config)); -#endif if (!engine_) { - logger_.log(nvinfer1::ILogger::Severity::kERROR, "Fail to create engine"); + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create engine"); return false; } - // save engine -#if TENSORRT_VERSION_MAJOR < 8 - auto data = TrtUniquePtr(engine_->serialize()); -#endif + // Save engine std::ofstream file; - file.open(output_engine_file_path, std::ios::binary | std::ios::out); + file.open(trt_config_->engine_path, std::ios::binary | std::ios::out); if (!file.is_open()) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to open engine file"); return false; } -#if TENSORRT_VERSION_MAJOR < 8 - file.write(reinterpret_cast(data->data()), data->size()); -#else - file.write(reinterpret_cast(plan->data()), plan->size()); -#endif - + file.write(reinterpret_cast(plan->data()), plan->size()); // NOLINT file.close(); - return true; -} - -bool TrtCommon::isInitialized() -{ - return is_initialized_; -} - -nvinfer1::Dims TrtCommon::getBindingDimensions(const int32_t index) const -{ -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + (NV_TENSOR_PATCH * 10) >= 8500 - auto const & name = engine_->getIOTensorName(index); - auto dims = context_->getTensorShape(name); - bool const has_runtime_dim = - std::any_of(dims.d, dims.d + dims.nbDims, [](int32_t dim) { return dim == -1; }); + context_ = TrtUniquePtr(engine_->createExecutionContext()); + if (!context_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create context"); + return false; + } - if (has_runtime_dim) { - return dims; - } else { - return context_->getBindingDimensions(index); + if (trt_config_->profile_per_layer) { + context_->setProfiler(&*model_profiler_); } -#else - return context_->getBindingDimensions(index); -#endif -} -int32_t TrtCommon::getNbBindings() -{ - return engine_->getNbBindings(); -} + fs::path json_path = trt_config_->engine_path.replace_extension(".json"); + auto ret = getLayerInformation(nvinfer1::LayerInformationFormat::kJSON); + std::ofstream os(json_path, std::ofstream::trunc); + os << ret << std::flush; + os.close(); -bool TrtCommon::setBindingDimensions(const int32_t index, const nvinfer1::Dims & dimensions) const -{ - return context_->setBindingDimensions(index, dimensions); + return true; } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8500 -bool TrtCommon::enqueueV3(cudaStream_t stream) +bool TrtCommon::loadEngine() { - if (build_config_->profile_per_layer) { - auto inference_start = std::chrono::high_resolution_clock::now(); - - bool ret = context_->enqueueV3(stream); + std::ifstream engine_file(trt_config_->engine_path); + std::stringstream engine_buffer; + engine_buffer << engine_file.rdbuf(); + std::string engine_str = engine_buffer.str(); - auto inference_end = std::chrono::high_resolution_clock::now(); - host_profiler_.reportLayerTime( - "inference", - std::chrono::duration(inference_end - inference_start).count()); - return ret; + engine_ = TrtUniquePtr(runtime_->deserializeCudaEngine( + reinterpret_cast( // NOLINT + engine_str.data()), + engine_str.size())); + if (!engine_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create engine"); + return false; } - return context_->enqueueV3(stream); -} -#endif -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH < 10000 -bool TrtCommon::enqueueV2(void ** bindings, cudaStream_t stream, cudaEvent_t * input_consumed) -{ - if (build_config_->profile_per_layer) { - auto inference_start = std::chrono::high_resolution_clock::now(); - bool ret = context_->enqueueV2(bindings, stream, input_consumed); + context_ = TrtUniquePtr(engine_->createExecutionContext()); + if (!context_) { + logger_->log(nvinfer1::ILogger::Severity::kERROR, "Fail to create context"); + return false; + } - auto inference_end = std::chrono::high_resolution_clock::now(); - host_profiler_.reportLayerTime( - "inference", - std::chrono::duration(inference_end - inference_start).count()); - return ret; - } else { - return context_->enqueueV2(bindings, stream, input_consumed); + if (trt_config_->profile_per_layer) { + context_->setProfiler(&*model_profiler_); } + + return true; } -#endif -void TrtCommon::printProfiling() +bool TrtCommon::validateProfileDims() { - std::cout << host_profiler_; - std::cout << std::endl; - std::cout << model_profiler_; + auto success = true; + if (!profile_dims_ || profile_dims_->empty()) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Input profile is empty, skipping validation. If network has dynamic shapes, it might lead " + "to undefined behavior."); + return success; + } + if (engine_->getNbOptimizationProfiles() != 1) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Number of optimization profiles in the engine (%d) is not equal to 1. Selecting the first " + "cached profile.", + engine_->getNbOptimizationProfiles()); + } + + for (const auto & profile_dim : *profile_dims_) { + nvinfer1::Dims min_dims = engine_->getProfileShape( + profile_dim.tensor_name.c_str(), 0, nvinfer1::OptProfileSelector::kMIN); + nvinfer1::Dims opt_dims = engine_->getProfileShape( + profile_dim.tensor_name.c_str(), 0, nvinfer1::OptProfileSelector::kOPT); + nvinfer1::Dims max_dims = engine_->getProfileShape( + profile_dim.tensor_name.c_str(), 0, nvinfer1::OptProfileSelector::kMAX); + ProfileDims profile_from_engine{profile_dim.tensor_name, min_dims, opt_dims, max_dims}; + if (profile_dim != profile_from_engine) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Invalid profile. Current configuration: %s. Cached engine: %s", + profile_dim.toString().c_str(), profile_from_engine.toString().c_str()); + success = false; + } + } + return success; } -#if (NV_TENSORRT_MAJOR * 1000) + (NV_TENSORRT_MINOR * 100) + NV_TENSOR_PATCH >= 8200 -std::string TrtCommon::getLayerInformation(nvinfer1::LayerInformationFormat format) +bool TrtCommon::validateNetworkIO() { - auto runtime = std::unique_ptr(nvinfer1::createInferRuntime(logger_)); - auto inspector = std::unique_ptr(engine_->createEngineInspector()); - if (context_ != nullptr) { - inspector->setExecutionContext(&(*context_)); + auto success = true; + if (!network_io_ || network_io_->empty()) { + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Network IO is empty, skipping validation. It might lead to undefined behavior"); + return success; + } + + if (network_io_->size() != static_cast(getNbIOTensors())) { + std::string tensor_names = "[" + std::string(getIOTensorName(0)); + for (int32_t i = 1; i < getNbIOTensors(); ++i) { + tensor_names += ", " + std::string(getIOTensorName(i)); + } + tensor_names += "]"; + logger_->log( + nvinfer1::ILogger::Severity::kWARNING, + "Number of tensors in the engine (%d) does not match number of tensors in the config (%d). " + "Tensors in the built engine: %s", + getNbIOTensors(), network_io_->size(), tensor_names.c_str()); + success = false; + } + for (const auto & io : *network_io_) { + NetworkIO tensor_from_engine{io.tensor_name, getTensorShape(io.tensor_name.c_str())}; + if (io != tensor_from_engine) { + logger_->log( + nvinfer1::ILogger::Severity::kERROR, + "Invalid tensor. Current configuration: %s. Cached engine: %s", io.toString().c_str(), + tensor_from_engine.toString().c_str()); + success = false; + } } - std::string result = inspector->getEngineInformation(format); - return result; + + return success; } -#endif } // namespace tensorrt_common } // namespace autoware diff --git a/perception/autoware_tensorrt_yolox/CMakeLists.txt b/perception/autoware_tensorrt_yolox/CMakeLists.txt index 17b31fc7e8df1..cc0d793151781 100644 --- a/perception/autoware_tensorrt_yolox/CMakeLists.txt +++ b/perception/autoware_tensorrt_yolox/CMakeLists.txt @@ -10,6 +10,9 @@ endif() find_package(autoware_cmake REQUIRED) autoware_package() +# TODO(amadeuszsz): Remove -Wno-deprecated-declarations once removing implicit quantization +add_compile_options(-Wno-deprecated-declarations) + find_package(OpenCV REQUIRED) option(CUDA_VERBOSE "Verbose output of CUDA modules" OFF) diff --git a/perception/autoware_tensorrt_yolox/include/autoware/tensorrt_yolox/tensorrt_yolox.hpp b/perception/autoware_tensorrt_yolox/include/autoware/tensorrt_yolox/tensorrt_yolox.hpp index 483adfbdf2757..7d49df145b72e 100644 --- a/perception/autoware_tensorrt_yolox/include/autoware/tensorrt_yolox/tensorrt_yolox.hpp +++ b/perception/autoware_tensorrt_yolox/include/autoware/tensorrt_yolox/tensorrt_yolox.hpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -44,6 +46,13 @@ struct Object using ObjectArray = std::vector; using ObjectArrays = std::vector; +using autoware::tensorrt_common::CalibrationConfig; +using autoware::tensorrt_common::NetworkIOPtr; +using autoware::tensorrt_common::ProfileDimsPtr; +using autoware::tensorrt_common::Profiler; +using autoware::tensorrt_common::TrtCommon; +using autoware::tensorrt_common::TrtCommonConfig; +using autoware::tensorrt_common::TrtConvCalib; struct GridAndStride { @@ -70,31 +79,26 @@ class TrtYoloX public: /** * @brief Construct TrtYoloX. - * @param[in] mode_path ONNX model_path - * @param[in] precision precision for inference + * @param[in] trt_config base trt common configuration * @param[in] num_class classifier-ed num * @param[in] score_threshold threshold for detection * @param[in] nms_threshold threshold for NMS - * @param[in] build_config configuration including precision, calibration method, DLA, remaining - * fp16 for first layer, remaining fp16 for last layer and profiler for builder * @param[in] use_gpu_preprocess whether use cuda gpu for preprocessing - * @param[in] calibration_image_list_file path for calibration files (only require for + * @param[in] gpu_id GPU id for inference + * @param[in] calibration_image_list_path path for calibration files (only require for * quantization) * @param[in] norm_factor scaling factor for preprocess * @param[in] cache_dir unused variable - * @param[in] batch_config configuration for batched execution - * @param[in] max_workspace_size maximum workspace for building TensorRT engine + * @param[in] color_map_path path for colormap for masks + * @param[in] calib_config calibration configuration */ TrtYoloX( - const std::string & model_path, const std::string & precision, const int num_class = 8, - const float score_threshold = 0.3, const float nms_threshold = 0.7, - const autoware::tensorrt_common::BuildConfig build_config = - autoware::tensorrt_common::BuildConfig(), - const bool use_gpu_preprocess = false, const uint8_t gpu_id = 0, - std::string calibration_image_list_file = std::string(), const double norm_factor = 1.0, - [[maybe_unused]] const std::string & cache_dir = "", - const autoware::tensorrt_common::BatchConfig & batch_config = {1, 1, 1}, - const size_t max_workspace_size = (1 << 30), const std::string & color_map_path = ""); + TrtCommonConfig & trt_config, const int num_class = 8, const float score_threshold = 0.3, + const float nms_threshold = 0.7, const bool use_gpu_preprocess = false, + const uint8_t gpu_id = 0, std::string calibration_image_list_path = std::string(), + const double norm_factor = 1.0, [[maybe_unused]] const std::string & cache_dir = "", + const std::string & color_map_path = "", + const CalibrationConfig & calib_config = CalibrationConfig()); /** * @brief Deconstruct TrtYoloX */ @@ -168,6 +172,12 @@ class TrtYoloX cv::Mat & colorized_mask); inline std::vector getColorMap() { return sematic_color_map_; } + /** + * @brief get batch size + * @return batch size + */ + [[nodiscard]] int getBatchSize() const; + private: /** * @brief run preprocess including resizing, letterbox, NHWC2NCHW and toFloat on CPU @@ -266,7 +276,7 @@ class TrtYoloX */ cv::Mat getMaskImageGpu(float * d_prob, nvinfer1::Dims dims, int out_w, int out_h, int b); - std::unique_ptr trt_common_; + std::unique_ptr trt_common_; std::vector input_h_; CudaUniquePtr input_d_; @@ -288,7 +298,7 @@ class TrtYoloX int num_class_; float score_threshold_; float nms_threshold_; - int batch_size_; + int32_t batch_size_; CudaUniquePtrHost out_prob_h_; // flag whether preprocess are performed on GPU diff --git a/perception/autoware_tensorrt_yolox/src/tensorrt_yolox.cpp b/perception/autoware_tensorrt_yolox/src/tensorrt_yolox.cpp index 7e2e327bf6f5e..74d8d73ecaed4 100644 --- a/perception/autoware_tensorrt_yolox/src/tensorrt_yolox.cpp +++ b/perception/autoware_tensorrt_yolox/src/tensorrt_yolox.cpp @@ -155,13 +155,11 @@ std::vector get_seg_colormap(const std::stri namespace autoware::tensorrt_yolox { TrtYoloX::TrtYoloX( - const std::string & model_path, const std::string & precision, const int num_class, - const float score_threshold, const float nms_threshold, - autoware::tensorrt_common::BuildConfig build_config, const bool use_gpu_preprocess, - const uint8_t gpu_id, std::string calibration_image_list_path, const double norm_factor, - [[maybe_unused]] const std::string & cache_dir, - const autoware::tensorrt_common::BatchConfig & batch_config, const size_t max_workspace_size, - const std::string & color_map_path) + TrtCommonConfig & trt_config, const int num_class, const float score_threshold, + const float nms_threshold, const bool use_gpu_preprocess, const uint8_t gpu_id, + std::string calibration_image_list_path, const double norm_factor, + [[maybe_unused]] const std::string & cache_dir, const std::string & color_map_path, + const CalibrationConfig & calib_config) : gpu_id_(gpu_id), is_gpu_initialized_(false) { if (!setCudaDeviceId(gpu_id_)) { @@ -172,13 +170,29 @@ TrtYoloX::TrtYoloX( src_width_ = -1; src_height_ = -1; norm_factor_ = norm_factor; - batch_size_ = batch_config[2]; multitask_ = 0; sematic_color_map_ = get_seg_colormap(color_map_path); stream_ = makeCudaStream(); - if (precision == "int8") { - if (build_config.clip_value <= 0.0) { + trt_common_ = std::make_unique(trt_config); + + const auto network_input_dims = trt_common_->getTensorShape(0); + batch_size_ = network_input_dims.d[0]; + const auto input_channel = network_input_dims.d[1]; + const auto input_height = network_input_dims.d[2]; + const auto input_width = network_input_dims.d[3]; + + auto profile_dims_ptr = std::make_unique>(); + + std::vector profile_dims{ + autoware::tensorrt_common::ProfileDims( + 0, {4, {batch_size_, input_channel, input_height, input_width}}, + {4, {batch_size_, input_channel, input_height, input_width}}, + {4, {batch_size_, input_channel, input_height, input_width}})}; + *profile_dims_ptr = profile_dims; + + if (trt_config.precision == "int8") { + if (calib_config.clip_value <= 0.0) { if (calibration_image_list_path.empty()) { throw std::runtime_error( "calibration_image_list_path should be passed to generate int8 engine " @@ -189,19 +203,17 @@ TrtYoloX::TrtYoloX( calibration_image_list_path = ""; } - int max_batch_size = batch_size_; - nvinfer1::Dims input_dims = autoware::tensorrt_common::get_input_dims(model_path); std::vector calibration_images; if (calibration_image_list_path != "") { calibration_images = loadImageList(calibration_image_list_path, ""); } - tensorrt_yolox::ImageStream stream(max_batch_size, input_dims, calibration_images); - fs::path calibration_table{model_path}; + tensorrt_yolox::ImageStream stream(batch_size_, network_input_dims, calibration_images); + fs::path calibration_table{trt_config.onnx_path}; std::string ext = ""; - if (build_config.calib_type_str == "Entropy") { + if (calib_config.calib_type_str == "Entropy") { ext = "EntropyV2-"; } else if ( - build_config.calib_type_str == "Legacy" || build_config.calib_type_str == "Percentile") { + calib_config.calib_type_str == "Legacy" || calib_config.calib_type_str == "Percentile") { ext = "Legacy-"; } else { ext = "MinMax-"; @@ -209,17 +221,17 @@ TrtYoloX::TrtYoloX( ext += "calibration.table"; calibration_table.replace_extension(ext); - fs::path histogram_table{model_path}; + fs::path histogram_table{trt_config.onnx_path}; ext = "histogram.table"; histogram_table.replace_extension(ext); std::unique_ptr calibrator; - if (build_config.calib_type_str == "Entropy") { + if (calib_config.calib_type_str == "Entropy") { calibrator.reset( new tensorrt_yolox::Int8EntropyCalibrator(stream, calibration_table, norm_factor_)); } else if ( - build_config.calib_type_str == "Legacy" || build_config.calib_type_str == "Percentile") { + calib_config.calib_type_str == "Legacy" || calib_config.calib_type_str == "Percentile") { const double quantile = 0.999999; const double cutoff = 0.999999; calibrator.reset(new tensorrt_yolox::Int8LegacyCalibrator( @@ -228,22 +240,20 @@ TrtYoloX::TrtYoloX( calibrator.reset( new tensorrt_yolox::Int8MinMaxCalibrator(stream, calibration_table, norm_factor_)); } - trt_common_ = std::make_unique( - model_path, precision, std::move(calibrator), batch_config, max_workspace_size, build_config); + if (!trt_common_->setupWithCalibrator( + std::move(calibrator), calib_config, std::move((profile_dims_ptr)))) { + throw std::runtime_error("Failed to setup TensorRT engine with calibrator"); + } } else { - trt_common_ = std::make_unique( - model_path, precision, nullptr, batch_config, max_workspace_size, build_config); - } - trt_common_->setup(); - - if (!trt_common_->isInitialized()) { - return; + if (!trt_common_->setup(std::move(profile_dims_ptr))) { + throw std::runtime_error("Failed to setup TensorRT engine"); + } } // Judge whether decoding output is required // Plain models require decoding, while models with EfficientNMS_TRT module don't. // If getNbBindings == 5, the model contains EfficientNMS_TRT - switch (trt_common_->getNbBindings()) { + switch (trt_common_->getNbIOTensors()) { case 2: // Specified model is plain one. // Bindings are: [input, output] @@ -273,16 +283,16 @@ TrtYoloX::TrtYoloX( */ } // GPU memory allocation - const auto input_dims = trt_common_->getBindingDimensions(0); + const auto input_dims = trt_common_->getTensorShape(0); const auto input_size = std::accumulate(input_dims.d + 1, input_dims.d + input_dims.nbDims, 1, std::multiplies()); if (needs_output_decode_) { - const auto output_dims = trt_common_->getBindingDimensions(1); - input_d_ = autoware::cuda_utils::make_unique(batch_config[2] * input_size); + const auto output_dims = trt_common_->getTensorShape(1); + input_d_ = autoware::cuda_utils::make_unique(batch_size_ * input_size); out_elem_num_ = std::accumulate( output_dims.d + 1, output_dims.d + output_dims.nbDims, 1, std::multiplies()); - out_elem_num_ = out_elem_num_ * batch_config[2]; - out_elem_num_per_batch_ = static_cast(out_elem_num_ / batch_config[2]); + out_elem_num_ = out_elem_num_ * batch_size_; + out_elem_num_per_batch_ = static_cast(out_elem_num_ / batch_size_); out_prob_d_ = autoware::cuda_utils::make_unique(out_elem_num_); out_prob_h_ = autoware::cuda_utils::make_unique_host(out_elem_num_, cudaHostAllocPortable); @@ -298,29 +308,27 @@ TrtYoloX::TrtYoloX( output_strides_ = {8, 16, 32, 4}; } } else { - const auto out_scores_dims = trt_common_->getBindingDimensions(3); + const auto out_scores_dims = trt_common_->getTensorShape(3); max_detections_ = out_scores_dims.d[1]; - input_d_ = autoware::cuda_utils::make_unique(batch_config[2] * input_size); - out_num_detections_d_ = autoware::cuda_utils::make_unique(batch_config[2]); - out_boxes_d_ = - autoware::cuda_utils::make_unique(batch_config[2] * max_detections_ * 4); - out_scores_d_ = autoware::cuda_utils::make_unique(batch_config[2] * max_detections_); - out_classes_d_ = - autoware::cuda_utils::make_unique(batch_config[2] * max_detections_); + input_d_ = autoware::cuda_utils::make_unique(batch_size_ * input_size); + out_num_detections_d_ = autoware::cuda_utils::make_unique(batch_size_); + out_boxes_d_ = autoware::cuda_utils::make_unique(batch_size_ * max_detections_ * 4); + out_scores_d_ = autoware::cuda_utils::make_unique(batch_size_ * max_detections_); + out_classes_d_ = autoware::cuda_utils::make_unique(batch_size_ * max_detections_); } if (multitask_) { // Allocate buffer for segmentation segmentation_out_elem_num_ = 0; for (int m = 0; m < multitask_; m++) { const auto output_dims = - trt_common_->getBindingDimensions(m + 2); // 0 : input, 1 : output for detections + trt_common_->getTensorShape(m + 2); // 0 : input, 1 : output for detections size_t out_elem_num = std::accumulate( output_dims.d + 1, output_dims.d + output_dims.nbDims, 1, std::multiplies()); - out_elem_num = out_elem_num * batch_config[2]; + out_elem_num = out_elem_num * batch_size_; segmentation_out_elem_num_ += out_elem_num; } segmentation_out_elem_num_per_batch_ = - static_cast(segmentation_out_elem_num_ / batch_config[2]); + static_cast(segmentation_out_elem_num_ / batch_size_); segmentation_out_prob_d_ = autoware::cuda_utils::make_unique(segmentation_out_elem_num_); segmentation_out_prob_h_ = autoware::cuda_utils::make_unique_host( @@ -387,7 +395,7 @@ void TrtYoloX::initPreprocessBuffer(int width, int height) src_width_ = width; src_height_ = height; if (use_gpu_preprocess_) { - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); bool const hasRuntimeDim = std::any_of( input_dims.d, input_dims.d + input_dims.nbDims, [](int32_t input_dim) { return input_dim == -1; }); @@ -395,7 +403,9 @@ void TrtYoloX::initPreprocessBuffer(int width, int height) input_dims.d[0] = batch_size_; } if (!image_buf_h_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } scales_.clear(); } const float input_height = static_cast(input_dims.d[2]); @@ -414,7 +424,7 @@ void TrtYoloX::initPreprocessBuffer(int width, int height) size_t argmax_out_elem_num = 0; for (int m = 0; m < multitask_; m++) { const auto output_dims = - trt_common_->getBindingDimensions(m + 2); // 0 : input, 1 : output for detections + trt_common_->getTensorShape(m + 2); // 0 : input, 1 : output for detections const float scale = std::min( output_dims.d[3] / static_cast(width), output_dims.d[2] / static_cast(height)); @@ -441,7 +451,7 @@ void TrtYoloX::printProfiling(void) void TrtYoloX::preprocessGpu(const std::vector & images) { const auto batch_size = images.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; for (const auto & image : images) { @@ -469,7 +479,9 @@ void TrtYoloX::preprocessGpu(const std::vector & images) src_height_ = height; } if (!image_buf_h_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } scales_.clear(); } const float input_height = static_cast(input_dims.d[2]); @@ -495,7 +507,7 @@ void TrtYoloX::preprocessGpu(const std::vector & images) if (multitask_) { for (int m = 0; m < multitask_; m++) { const auto output_dims = - trt_common_->getBindingDimensions(m + 2); // 0: input, 1: output for detections + trt_common_->getTensorShape(m + 2); // 0: input, 1: output for detections const float scale = std::min( output_dims.d[3] / static_cast(image.cols), output_dims.d[2] / static_cast(image.rows)); @@ -530,9 +542,11 @@ void TrtYoloX::preprocessGpu(const std::vector & images) void TrtYoloX::preprocess(const std::vector & images) { const auto batch_size = images.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); std::vector dst_images; @@ -567,9 +581,6 @@ bool TrtYoloX::doInference( if (!setCudaDeviceId(gpu_id_)) { return false; } - if (!trt_common_->isInitialized()) { - return false; - } if (use_gpu_preprocess_) { preprocessGpu(images); @@ -588,7 +599,7 @@ void TrtYoloX::preprocessWithRoiGpu( const std::vector & images, const std::vector & rois) { const auto batch_size = images.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; for (const auto & image : images) { @@ -610,7 +621,9 @@ void TrtYoloX::preprocessWithRoiGpu( src_height_ = height; } if (!image_buf_h_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); @@ -662,9 +675,11 @@ void TrtYoloX::preprocessWithRoi( const std::vector & images, const std::vector & rois) { const auto batch_size = images.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); std::vector dst_images; @@ -700,7 +715,7 @@ void TrtYoloX::preprocessWithRoi( void TrtYoloX::multiScalePreprocessGpu(const cv::Mat & image, const std::vector & rois) { const auto batch_size = rois.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; @@ -722,7 +737,9 @@ void TrtYoloX::multiScalePreprocessGpu(const cv::Mat & image, const std::vector< src_height_ = height; if (!image_buf_h_) { - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); @@ -770,9 +787,11 @@ void TrtYoloX::multiScalePreprocessGpu(const cv::Mat & image, const std::vector< void TrtYoloX::multiScalePreprocess(const cv::Mat & image, const std::vector & rois) { const auto batch_size = rois.size(); - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); input_dims.d[0] = batch_size; - trt_common_->setBindingDimensions(0, input_dims); + if (!trt_common_->setInputShape(0, input_dims)) { + return; + } const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); std::vector dst_images; @@ -806,9 +825,6 @@ void TrtYoloX::multiScalePreprocess(const cv::Mat & image, const std::vector & images, ObjectArrays & objects, const std::vector & rois) { - if (!trt_common_->isInitialized()) { - return false; - } if (use_gpu_preprocess_) { preprocessWithRoiGpu(images, rois); } else { @@ -827,9 +843,6 @@ bool TrtYoloX::doInferenceWithRoi( bool TrtYoloX::doMultiScaleInference( const cv::Mat & image, ObjectArrays & objects, const std::vector & rois) { - if (!trt_common_->isInitialized()) { - return false; - } if (use_gpu_preprocess_) { multiScalePreprocessGpu(image, rois); } else { @@ -849,8 +862,10 @@ bool TrtYoloX::feedforward(const std::vector & images, ObjectArrays & o std::vector buffers = { input_d_.get(), out_num_detections_d_.get(), out_boxes_d_.get(), out_scores_d_.get(), out_classes_d_.get()}; - - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); const auto batch_size = images.size(); auto out_num_detections = std::make_unique(batch_size); @@ -903,7 +918,11 @@ bool TrtYoloX::feedforwardAndDecode( if (multitask_) { buffers = {input_d_.get(), out_prob_d_.get(), segmentation_out_prob_d_.get()}; } - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); const auto batch_size = images.size(); @@ -933,7 +952,7 @@ bool TrtYoloX::feedforwardAndDecode( static_cast(segmentation_out_elem_num_ / segmentation_out_elem_num_per_batch_); for (int m = 0; m < multitask_; m++) { const auto output_dims = - trt_common_->getBindingDimensions(m + 2); // 0 : input, 1 : output for detections + trt_common_->getTensorShape(m + 2); // 0 : input, 1 : output for detections size_t out_elem_num = std::accumulate( output_dims.d + 1, output_dims.d + output_dims.nbDims, 1, std::multiplies()); out_elem_num = out_elem_num * batch; @@ -972,7 +991,10 @@ bool TrtYoloX::multiScaleFeedforward(const cv::Mat & image, int batch_size, Obje input_d_.get(), out_num_detections_d_.get(), out_boxes_d_.get(), out_scores_d_.get(), out_classes_d_.get()}; - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); auto out_num_detections = std::make_unique(batch_size); auto out_boxes = std::make_unique(4 * batch_size * max_detections_); @@ -1020,7 +1042,10 @@ bool TrtYoloX::multiScaleFeedforwardAndDecode( const cv::Mat & image, int batch_size, ObjectArrays & objects) { std::vector buffers = {input_d_.get(), out_prob_d_.get()}; - trt_common_->enqueueV2(buffers.data(), *stream_, nullptr); + if (!trt_common_->setTensorsAddresses(buffers)) { + return false; + } + trt_common_->enqueueV3(*stream_); CHECK_CUDA_ERROR(cudaMemcpyAsync( out_prob_h_.get(), out_prob_d_.get(), sizeof(float) * out_elem_num_, cudaMemcpyDeviceToHost, @@ -1042,7 +1067,7 @@ void TrtYoloX::decodeOutputs( float * prob, ObjectArray & objects, float scale, cv::Size & img_size) const { ObjectArray proposals; - auto input_dims = trt_common_->getBindingDimensions(0); + auto input_dims = trt_common_->getTensorShape(0); const float input_height = static_cast(input_dims.d[2]); const float input_width = static_cast(input_dims.d[3]); std::vector grid_strides; @@ -1298,4 +1323,9 @@ void TrtYoloX::getColorizedMask( } } +int TrtYoloX::getBatchSize() const +{ + return batch_size_; +} + } // namespace autoware::tensorrt_yolox diff --git a/perception/autoware_tensorrt_yolox/src/tensorrt_yolox_node.cpp b/perception/autoware_tensorrt_yolox/src/tensorrt_yolox_node.cpp index 94a3a37a4d08f..2048279dcf3f1 100644 --- a/perception/autoware_tensorrt_yolox/src/tensorrt_yolox_node.cpp +++ b/perception/autoware_tensorrt_yolox/src/tensorrt_yolox_node.cpp @@ -83,19 +83,18 @@ TrtYoloXNode::TrtYoloXNode(const rclcpp::NodeOptions & node_options) roi_overlay_segment_labels_.ANIMAL = declare_parameter("roi_overlay_segment_label.ANIMAL"); replaceLabelMap(); - autoware::tensorrt_common::BuildConfig build_config( - calibration_algorithm, dla_core_id, quantize_first_layer, quantize_last_layer, - profile_per_layer, clip_value); + TrtCommonConfig trt_config( + model_path, precision, "", (1ULL << 30U), dla_core_id, profile_per_layer); + + CalibrationConfig calib_config( + calibration_algorithm, quantize_first_layer, quantize_last_layer, clip_value); const double norm_factor = 1.0; const std::string cache_dir = ""; - const autoware::tensorrt_common::BatchConfig batch_config{1, 1, 1}; - const size_t max_workspace_size = (1 << 30); trt_yolox_ = std::make_unique( - model_path, precision, label_map_.size(), score_threshold, nms_threshold, build_config, - preprocess_on_gpu, gpu_id, calibration_image_list_path, norm_factor, cache_dir, batch_config, - max_workspace_size, color_map_path); + trt_config, label_map_.size(), score_threshold, nms_threshold, preprocess_on_gpu, gpu_id, + calibration_image_list_path, norm_factor, cache_dir, color_map_path, calib_config); if (!trt_yolox_->isGPUInitialized()) { RCLCPP_ERROR(this->get_logger(), "GPU %d does not exist or is not suitable.", gpu_id); diff --git a/perception/autoware_tensorrt_yolox/src/yolox_single_image_inference_node.cpp b/perception/autoware_tensorrt_yolox/src/yolox_single_image_inference_node.cpp index 243e82c65dab9..63c0ee0cd3e8a 100644 --- a/perception/autoware_tensorrt_yolox/src/yolox_single_image_inference_node.cpp +++ b/perception/autoware_tensorrt_yolox/src/yolox_single_image_inference_node.cpp @@ -46,7 +46,9 @@ class YoloXSingleImageInferenceNode : public rclcpp::Node const auto output_image_path = declare_parameter("output_image_path", p.string() + "_detect" + ext); - auto trt_yolox = std::make_unique(model_path, precision); + auto trt_config = tensorrt_common::TrtCommonConfig(model_path, precision); + + auto trt_yolox = std::make_unique(trt_config); auto image = cv::imread(image_path); tensorrt_yolox::ObjectArrays objects; std::vector masks; diff --git a/perception/autoware_traffic_light_classifier/CMakeLists.txt b/perception/autoware_traffic_light_classifier/CMakeLists.txt index d132577743ab0..181037caebfa5 100644 --- a/perception/autoware_traffic_light_classifier/CMakeLists.txt +++ b/perception/autoware_traffic_light_classifier/CMakeLists.txt @@ -34,7 +34,6 @@ if(NVINFER AND NVONNXPARSER AND NVINFER_PLUGIN) if(CUDA_VERBOSE) message(STATUS "TensorRT is available!") message(STATUS "NVINFER: ${NVINFER}") - message(STATUS "NVPARSERS: ${NVPARSERS}") message(STATUS "NVINFER_PLUGIN: ${NVINFER_PLUGIN}") message(STATUS "NVONNXPARSER: ${NVONNXPARSER}") endif() diff --git a/perception/autoware_traffic_light_classifier/src/classifier/cnn_classifier.cpp b/perception/autoware_traffic_light_classifier/src/classifier/cnn_classifier.cpp index f9bf2509aa2ae..d47cb1500fffd 100644 --- a/perception/autoware_traffic_light_classifier/src/classifier/cnn_classifier.cpp +++ b/perception/autoware_traffic_light_classifier/src/classifier/cnn_classifier.cpp @@ -51,13 +51,10 @@ CNNClassifier::CNNClassifier(rclcpp::Node * node_ptr) : node_ptr_(node_ptr) } readLabelfile(label_file_path, labels_); - nvinfer1::Dims input_dim = autoware::tensorrt_common::get_input_dims(model_file_path); - assert(input_dim.d[0] > 0); - batch_size_ = input_dim.d[0]; - autoware::tensorrt_common::BatchConfig batch_config{batch_size_, batch_size_, batch_size_}; classifier_ = std::make_unique( - model_file_path, precision, batch_config, mean_, std_); + model_file_path, precision, mean_, std_); + batch_size_ = classifier_->getBatchSize(); if (node_ptr_->declare_parameter("build_only", false)) { RCLCPP_INFO(node_ptr_->get_logger(), "TensorRT engine is built and shutdown node."); rclcpp::shutdown(); diff --git a/perception/autoware_traffic_light_fine_detector/CMakeLists.txt b/perception/autoware_traffic_light_fine_detector/CMakeLists.txt index 80d6e43c098ed..dffbab0e77681 100644 --- a/perception/autoware_traffic_light_fine_detector/CMakeLists.txt +++ b/perception/autoware_traffic_light_fine_detector/CMakeLists.txt @@ -39,7 +39,6 @@ if(NVINFER AND NVONNXPARSER AND NVINFER_PLUGIN) if(CUDA_VERBOSE) message(STATUS "TensorRT is available!") message(STATUS "NVINFER: ${NVINFER}") - message(STATUS "NVPARSERS: ${NVPARSERS}") message(STATUS "NVINFER_PLUGIN: ${NVINFER_PLUGIN}") message(STATUS "NVONNXPARSER: ${NVONNXPARSER}") endif() diff --git a/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp b/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp index 37ffca4a9526c..d9e0471a43d62 100644 --- a/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp +++ b/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp @@ -75,21 +75,18 @@ TrafficLightFineDetectorNode::TrafficLightFineDetectorNode(const rclcpp::NodeOpt RCLCPP_ERROR(this->get_logger(), "Could not find tlr id"); } - const autoware::tensorrt_common::BuildConfig build_config = - autoware::tensorrt_common::BuildConfig("MinMax", -1, false, false, false, 0.0); - const bool cuda_preprocess = true; const std::string calib_image_list = ""; const double scale = 1.0; const std::string cache_dir = ""; - nvinfer1::Dims input_dim = autoware::tensorrt_common::get_input_dims(model_path); - assert(input_dim.d[0] > 0); - batch_size_ = input_dim.d[0]; - const autoware::tensorrt_common::BatchConfig batch_config{batch_size_, batch_size_, batch_size_}; + + auto trt_config = autoware::tensorrt_common::TrtCommonConfig(model_path, precision); trt_yolox_ = std::make_unique( - model_path, precision, num_class, score_thresh_, nms_threshold, build_config, cuda_preprocess, - gpu_id, calib_image_list, scale, cache_dir, batch_config); + trt_config, num_class, score_thresh_, nms_threshold, cuda_preprocess, gpu_id, calib_image_list, + scale, cache_dir); + + batch_size_ = trt_yolox_->getBatchSize(); if (!trt_yolox_->isGPUInitialized()) { RCLCPP_ERROR(this->get_logger(), "GPU %d does not exist or is not suitable.", gpu_id); From 76aa83fcd1a716692789fdc50fed6369c154cb43 Mon Sep 17 00:00:00 2001 From: Kazunori-Nakajima <169115284+Kazunori-Nakajima@users.noreply.github.com> Date: Fri, 10 Jan 2025 17:35:41 +0900 Subject: [PATCH 068/127] fix(planning_evaluator): update lateral_trajectory_displacement to absolute value (#9696) * fix(planning_evaluator): update lateral_trajectory_displacement to absolute value Signed-off-by: Kasunori-Nakajima * style(pre-commit): autofix --------- Signed-off-by: Kasunori-Nakajima Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../src/metrics/deviation_metrics.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp b/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp index 82ba86c65d6af..9b5959948f8cb 100644 --- a/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp +++ b/evaluator/autoware_planning_evaluator/src/metrics/deviation_metrics.cpp @@ -58,7 +58,8 @@ Accumulator calcLocalLateralTrajectoryDisplacement( autoware::motion_utils::calcLateralOffset(prev.points, ego_pose.position); const auto traj_lateral_deviation = autoware::motion_utils::calcLateralOffset(traj.points, ego_pose.position); - const auto lateral_trajectory_displacement = traj_lateral_deviation - prev_lateral_deviation; + const auto lateral_trajectory_displacement = + std::abs(traj_lateral_deviation - prev_lateral_deviation); stat.add(lateral_trajectory_displacement); return stat; } From 7d63242e089ec25e0a976d4b6c3c8cda21def59a Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:02:48 +0900 Subject: [PATCH 069/127] docs(lane_change): explaining cancel and abort process (#9845) * docs(lane_change): explaining cancel and abort process Signed-off-by: Zulfaqar Azmi * slight fix in formatting Signed-off-by: Zulfaqar Azmi * rephrase sentence Signed-off-by: Zulfaqar Azmi * rephrase and replace image for cancel Signed-off-by: Zulfaqar Azmi * Cancel explanations and limitations Signed-off-by: Zulfaqar Azmi * revise abort figure Signed-off-by: Zulfaqar Azmi * revise flow chart Signed-off-by: Zulfaqar Azmi * rephase sentence Signed-off-by: Zulfaqar Azmi * minor fix Signed-off-by: Zulfaqar Azmi * finish up Signed-off-by: Zulfaqar Azmi * offers change to reduces for negative connotation Signed-off-by: Zulfaqar Azmi * minor fix Signed-off-by: Zulfaqar Azmi * move limitation all the way down Signed-off-by: Zulfaqar Azmi * precommit Signed-off-by: Zulfaqar Azmi * equation mistake Signed-off-by: Zulfaqar Azmi * Update planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md Co-authored-by: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> * Update planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md Co-authored-by: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> * rename subheading Signed-off-by: Zulfaqar Azmi --------- Signed-off-by: Zulfaqar Azmi Co-authored-by: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> --- .../README.md | 277 ++++++++++++------ .../images/check_able_to_return.png | Bin 0 -> 26510 bytes .../images/lane_change-abort.png | Bin 222968 -> 22119 bytes .../images/lane_change-abort_computation.png | Bin 0 -> 19345 bytes .../images/lane_change-cancel.png | Bin 175745 -> 25706 bytes .../lane_change-cant_cancel_no_abort.png | Bin 138829 -> 16484 bytes 6 files changed, 193 insertions(+), 84 deletions(-) create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/check_able_to_return.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-abort_computation.png diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index 0508dc753a2e8..c5cdf0bb68bc2 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -722,47 +722,129 @@ If the ego vehicle gets stuck, to avoid stuck, it enables lane change in crosswa If the ego vehicle stops more than `stuck_detection.stop_time` seconds, it is regarded as a stuck. If the ego vehicle velocity is smaller than `stuck_detection.velocity`, it is regarded as stopping. -### Aborting lane change +## Lane change completion checks + +To determine if the ego vehicle has successfully changed lanes, one of two criteria must be met: either the longitudinal or the lateral criteria. + +For the longitudinal criteria, the ego vehicle must pass the lane-changing end pose and be within the `finish_judge_buffer` distance from it. The module then checks if the ego vehicle is in the target lane. If true, the module returns success. This check ensures that the planner manager updates the root lanelet correctly based on the ego vehicle's current pose. Without this check, if the ego vehicle is changing lanes while avoiding an obstacle and its current pose is in the original lane, the planner manager might set the root lanelet as the original lane. This would force the ego vehicle to perform the lane change again. With the target lane check, the ego vehicle is confirmed to be in the target lane, and the planner manager can correctly update the root lanelets. -The abort process may result in three different outcome; Cancel, Abort and Stop/Cruise. +If the longitudinal criteria are not met, the module evaluates the lateral criteria. For the lateral criteria, the ego vehicle must be within `finish_judge_lateral_threshold` distance from the target lane's centerline, and the angle deviation must be within `finish_judge_lateral_angle_deviation` degrees. The angle deviation check ensures there is no sudden steering. If the angle deviation is set too high, the ego vehicle's orientation could deviate significantly from the centerline, causing the trajectory follower to aggressively correct the steering to return to the centerline. Keeping the angle deviation value as small as possible avoids this issue. -The following depicts the flow of the abort lane change check. +The process of determining lane change completion is shown in the following diagram. ```plantuml @startuml -skinparam monochrome true skinparam defaultTextAlignment center +skinparam backgroundColor #WHITE + +title Lane change completion judge + +start + +:Calculate distance from current ego pose to lane change end pose; + +if (Is ego velocity < 1.0?) then (YES) + :Set finish_judge_buffer to 0.0; +else (NO) + :Set finish_judge_buffer to lane_change_finish_judge_buffer; +endif + +if (ego has passed the end_pose and ego is finish_judge_buffer meters away from end_pose?) then (YES) + if (Current ego pose is in target lanes' polygon?) then (YES) + :Lane change is completed; + stop + else (NO) +:Lane change is NOT completed; +stop + endif +else (NO) +endif + +if (ego's yaw deviation to centerline exceeds finish_judge_lateral_angle_deviation?) then (YES) + :Lane change is NOT completed; + stop +else (NO) + :Calculate distance to the target lanes' centerline; + if (abs(distance to the target lanes' centerline) is less than finish_judge_lateral_threshold?) then (YES) + :Lane change is completed; + stop + else (NO) + :Lane change is NOT completed; + stop + endif +endif + +@enduml +``` + +## Terminal Lane Change Path + +Depending on the space configuration around the Ego vehicle, it is possible that a valid LC path cannot be generated. If that happens, then Ego will get stuck at `terminal_start` and not be able to proceed. Therefore we introduced the terminal LC path feature; when ego gets near to the terminal point (dist to `terminal_start` is less than the maximum lane change length) a terminal lane changing path will be computed starting from the terminal start point on the current lane and connects to the target lane. The terminal path only needs to be computed once in each execution of LC module. If no valid candidate paths are found in the path generation process, then the terminal path will be used as a fallback candidate path, the safety of the terminal path is not ensured and therefore it can only be force approved. The following images illustrate the expected behavior without and with the terminal path feature respectively: + +![no terminal path](./images/lane_change-no_terminal_path.png) + +![terminal path](./images/lane_change-terminal_path.png) + +Additionally if terminal path feature is enabled and path is computed, stop point placement can be configured to be at the edge of the current lane instead of at the `terminal_start` position, as indicated by the dashed red line in the image above. + +## Aborting a Previously Approved Lane Change + +Once the lane change path is approved, there are several situations where we may need to abort the maneuver. The abort process is triggered when any of the following conditions is met + +1. The ego vehicle is near a traffic light, crosswalk, or intersection, and it is possible to complete the lane change after the ego vehicle passes these areas. +2. The target object list is updated, requiring us to [delay lane change](#delay-lane-change-check) +3. The lane change is forcefully canceled via [RTC](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/cooperation/). +4. The path has become unsafe. + +Furthermore, if the path has become unsafe, there are three possible outcomes for the maneuver: + +1. **CANCEL**: The approved lane change path is canceled, and the ego vehicle resumes its previous maneuver. +2. **ABORT**: The lane change module generates a return path to bring the ego vehicle back to its current lane. +3. **CRUISE** or **STOP**: If aborting is not feasible, the ego vehicle continues with the lane change. [Another module](https://autowarefoundation.github.io/autoware.universe/main/planning/autoware_obstacle_cruise_planner/) should decide whether the ego vehicle should cruise or stop in this scenario. + +**CANCEL** can be enabled by setting the `cancel.enable_on_prepare_phase` flag to `true`, and **ABORT** can be enabled by setting the `cancel.enable_on_lane_changing_phase` flag to true. + +!!! warning + + Enabling **CANCEL** is a prerequisite for enabling **ABORT**. + +!!! warning + + When **CANCEL** is disabled, all maneuvers will default to either **CRUISE** or **STOP**. + +The chart shows the high level flow of the lane change abort process. + +```plantuml +@startuml +skinparam defaultTextAlignment center +skinparam backgroundColor #WHITE -title Abort Lane Change +title High-Level Flow of Lane Change Abort Process while(Lane Following) if (Lane Change required) then (**YES**) - if (Safe to change lane) then (**SAFE**) - while(Lane Changing) - if (Lane Change Completed) then (**YES**) - break - else (**NO**) - if (Is Abort Condition Satisfied) then (**NO**) + if (Safe to change lane) then (SAFE) + :Approve safe path; + while(Lane change maneuver is completed?) is (**NO**) + if (Is cancel/abort Condition satisfied) then (**NO**) else (**YES**) if (Is Enough margin to retry lane change) then (**YES**) - if (Ego is on lane change prepare phase) then (**YES**) - :Cancel lane change; + if (Ego is preparing to change lane) then (**YES**) + #LightPink:CANCEL; break else (**NO**) - if (Will the overhang to target lane be less than threshold?) then (**YES**) - :Perform abort maneuver; + if (Overhang from current lanes is less than threshold?) then (**YES**) + #Cyan:ABORT; break else (NO) - :Stop or Cruise depending on the situation; endif endif else (**NO**) endif + #Yellow:CRUISE/STOP; endif - endif - :Stop and wait; - endwhile - else (**UNSAFE**) + endwhile (**YES**) + else (UNSAFE) endif else (**NO**) endif @@ -772,117 +854,137 @@ detach @enduml ``` -During a lane change, a safety check is made in consideration of the deceleration of the ego vehicle, and a safety check is made for `cancel.deceleration_sampling_num` deceleration patterns, and the lane change will be canceled if the abort condition is satisfied for all deceleration patterns. +### Preventing Oscillating Paths When Unsafe -To preventive measure for lane change path oscillations caused by alternating safe and unsafe conditions, an additional hysteresis count check is implemented before executing an abort or cancel maneuver. If unsafe, the `unsafe_hysteresis_count_` is incremented and compared against `unsafe_hysteresis_threshold`; exceeding it prompts an abort condition check, ensuring decisions are made with consideration to recent safety assessments as shown in flow chart above. This mechanism stabilizes decision-making, preventing abrupt changes due to transient unsafe conditions. +Lane change paths can oscillate when conditions switch between safe and unsafe. To address this, a hysteresis count check is added before executing an abort maneuver. When the path is unsafe, the `unsafe_hysteresis_count_` increases. If it exceeds the `unsafe_hysteresis_threshold`, an abort condition check is triggered. This logic stabilizes the path approval process and prevents abrupt changes caused by temporary unsafe conditions. ```plantuml @startuml skinparam defaultTextAlignment center skinparam backgroundColor #WHITE -title Abort Lane Change +title Hysteresis count flow for oscillation prevention +while (lane changing completed?) is (FALSE) if (Perform collision check?) then (SAFE) :Reset unsafe_hysteresis_count_; else (UNSAFE) :Increase unsafe_hysteresis_count_; - if (unsafe_hysteresis_count_ > unsafe_hysteresis_threshold?) then (FALSE) + if (unsafe_hysteresis_count_ is more than\n unsafe_hysteresis_threshold?) then (FALSE) else (TRUE) #LightPink:Check abort condition; - stop + -[hidden]-> + detach endif endif -:Continue lane changing; +endwhile (TRUE) +stop @enduml ``` -#### Cancel +### Evaluating Ego Vehicle's Position to Prevent Abrupt Maneuvers -Suppose the lane change trajectory is evaluated as unsafe. In that case, if the ego vehicle has not departed from the current lane yet, the trajectory will be reset, and the ego vehicle will resume the lane following the maneuver. +To avoid abrupt maneuvers during **CANCEL** or **ABORT**, the lane change module ensures the ego vehicle can safely return to the original lane. This is done through geometric checks that verify whether the ego vehicle remains within the lane boundaries. -The function can be enabled by setting `enable_on_prepare_phase` to `true`. +The edges of the ego vehicle’s footprint are compared against the boundary of the current lane to determine if they exceed the overhang tolerance, `cancel.overhang_tolerance`. If the distance from any edge of the footprint to the boundary exceeds this threshold, the vehicle is considered to be diverging. -The following image illustrates the cancel process. +The footprints checked against the lane boundary include: -![cancel](./images/lane_change-cancel.png) +1. Current Footprint: Based on the ego vehicle's current position. +2. Future Footprint: Based on the ego vehicle's estimated position after traveling a distance, calculated as $𝑑_{est}=𝑣_{ego} \cdot \Delta_{𝑡}$, where -#### Abort + - $v_{ego}$ is ego vehicle's current velocity + - $\Delta_{t}$ is parameterized time constant value, `cancel.delta_time`. -Assume the ego vehicle has already departed from the current lane. In that case, it is dangerous to cancel the path, and it will cause the ego vehicle to change the heading direction abruptly. In this case, planning a trajectory that allows the ego vehicle to return to the current path while minimizing the heading changes is necessary. In this case, the lane change module will generate an abort path. The following images show an example of the abort path. Do note that the function DOESN'T GUARANTEE a safe abort process, as it didn't check the presence of the surrounding objects and/or their reactions. The function can be enable manually by setting both `enable_on_prepare_phase` and `enable_on_lane_changing_phase` to `true`. The parameter `max_lateral_jerk` need to be set to a high value in order for it to work. + as depicted in the following diagram -![abort](./images/lane_change-abort.png) + ![can_return](./images/check_able_to_return.png) -#### Stop/Cruise +!!! note -The last behavior will also occur if the ego vehicle has departed from the current lane. If the abort function is disabled or the abort is no longer possible, the ego vehicle will attempt to stop or transition to the obstacle cruise mode. Do note that the module DOESN'T GUARANTEE safe maneuver due to the unexpected behavior that might've occurred during these critical scenarios. The following images illustrate the situation. + The ego vehicle is considered capable of safely returning to the current lane only if **BOTH** the current and future footprint checks are `true`. -![stop](./images/lane_change-cant_cancel_no_abort.png) +### Checking Approved Path Safety -## Lane change completion checks +The lane change module samples accelerations along the path and recalculates velocity to perform safety checks. The motivation for this feature is explained in the [Limitation](#limitation) section. -To determine if the ego vehicle has successfully changed lanes, one of two criteria must be met: either the longitudinal or the lateral criteria. +The computation of sampled accelerations is as follows: -For the longitudinal criteria, the ego vehicle must pass the lane-changing end pose and be within the `finish_judge_buffer` distance from it. The module then checks if the ego vehicle is in the target lane. If true, the module returns success. This check ensures that the planner manager updates the root lanelet correctly based on the ego vehicle's current pose. Without this check, if the ego vehicle is changing lanes while avoiding an obstacle and its current pose is in the original lane, the planner manager might set the root lanelet as the original lane. This would force the ego vehicle to perform the lane change again. With the target lane check, the ego vehicle is confirmed to be in the target lane, and the planner manager can correctly update the root lanelets. +Let -If the longitudinal criteria are not met, the module evaluates the lateral criteria. For the lateral criteria, the ego vehicle must be within `finish_judge_lateral_threshold` distance from the target lane's centerline, and the angle deviation must be within `finish_judge_lateral_angle_deviation` degrees. The angle deviation check ensures there is no sudden steering. If the angle deviation is set too high, the ego vehicle's orientation could deviate significantly from the centerline, causing the trajectory follower to aggressively correct the steering to return to the centerline. Keeping the angle deviation value as small as possible avoids this issue. +$$ +\text{resolution} = \frac{a_{\text{min}} - a_{\text{LC}}}{N} +$$ -The process of determining lane change completion is shown in the following diagram. +The sequence of sampled accelerations is then given as -```plantuml -@startuml -skinparam defaultTextAlignment center -skinparam backgroundColor #WHITE +$$ +\text{acc} = a_{\text{LC}} + k \cdot \text{resolution}, \quad k = [0, N] +$$ -title Lane change completion judge +where -start +- $a_{\text{min}}$, is the minimum of the parameterized [global acceleration constant](https://github.com/autowarefoundation/autoware_launch/blob/main/autoware_launch/config/planning/scenario_planning/common/common.param.yaml) `normal.min_acc` or the [parameterized constant](#essential-lane-change-parameters) `trajectory.min_longitudinal_acceleration`. +- $a_{\text{LC}}$ is the acceleration used to generate the approved path. +- $N$ is the parameterized constant `cancel.deceleration_sampling` -:Calculate distance from current ego pose to lane change end pose; +If none of the sampled accelerations pass the safety check, the lane change path will be canceled, subject to the [hysteresis check](#preventing-oscillating-paths-when-unsafe). -if (Is ego velocity < 1.0?) then (YES) - :Set finish_judge_buffer to 0.0; -else (NO) - :Set finish_judge_buffer to lane_change_finish_judge_buffer; -endif +### Cancel -if (ego has passed the end_pose and ego is finish_judge_buffer meters away from end_pose?) then (YES) - if (Current ego pose is in target lanes' polygon?) then (YES) - :Lane change is completed; - stop - else (NO) -:Lane change is NOT completed; -stop - endif -else (NO) -endif +When lane change is canceled, the approved path is reset. After the reset, the ego vehicle will return to following the original reference path (the last approved path before the lane change started), as illustrated in the following image -if (ego's yaw deviation to centerline exceeds finish_judge_lateral_angle_deviation?) then (YES) - :Lane change is NOT completed; - stop -else (NO) - :Calculate distance to the target lanes' centerline; - if (abs(distance to the target lanes' centerline) is less than finish_judge_lateral_threshold?) then (YES) - :Lane change is completed; - stop - else (NO) - :Lane change is NOT completed; - stop - endif -endif +![cancel](./images/lane_change-cancel.png) -@enduml -``` +The following parameters can be configured to tune the behavior of the cancel process: -## Terminal Lane Change Path +1. [Safety constraints](#safety-constraints-to-cancel-lane-change-path) for cancel. +2. [Safety constraints](#safety-constraints-specifically-for-stopped-or-parked-vehicles) for parked vehicle. -Depending on the space configuration around the Ego vehicle, it is possible that a valid LC path cannot be generated. If that happens, then Ego will get stuck at `terminal_start` and will be not be able to proceed. Therefore we introduced the terminal LC path feature; when ego gets near to the terminal point (dist to `terminal_start` is less than the maximum lane change length) a terminal lane changing path will be computed starting from the terminal start point on the current lane and connects to the target lane. The terminal path only needs to be computed once in each execution of LC module. If no valid candidate paths are found in the path generation process, then the terminal path will be used as a fallback candidate path, the safety of the terminal path is not ensured and therefore it can only be force approved. The following images illustrate the expected behavior without and with the terminal path feature respectively: +!!! note -![no terminal path](./images/lane_change-no_terminal_path.png) + To ensure feasible behavior, all safety constraint values must be equal to or less than their corresponding parameters in the [execution](#safety-constraints-during-lane-change-path-is-computed) settings. -![terminal path](./images/lane_change-terminal_path.png) + - The closer the values, the more conservative the lane change behavior will be. This means it will be easier to cancel the lane change but harder for the ego vehicle to complete a lane change. + - The larger the difference, the more aggressive the lane change behavior will be. This makes it harder to cancel the lane change but easier for the ego vehicle to change lanes. -Additionally if terminal path feature is enabled and path is computed, stop point placement can be configured to be at the edge of the current lane instead of at the `terminal_start` position, as indicated by the dashed red line in the image above. +### Abort + +During the prepare phase, the ego vehicle follows the previously approved path. However, once the ego vehicle begins the lane change, its heading starts to diverge from this path. Resetting to the previously approved path in this situation would cause abrupt steering, as the controller would attempt to rapidly realign the vehicle with the reference trajectory. + +Instead, the lane change module generates an abort path. This return path is specifically designed to guide the ego vehicle back to the current lane, avoiding any sudden maneuvers. The following image provides an illustration of the abort process. + +![abort](./images/lane_change-abort.png) + +The abort path is generated by shifting the approved lane change path using the path shifter. This ensures the continuity in lateral velocity, and prevents abrupt changes in the vehicle’s movement. The abort start shift and abort end shift are computed as follows: + +1. Start Shift: $d_{start}^{abort} = v_{ego} \cdot \Delta_{t}$ +2. End Shift: $d_{end}^{abort} = v_{ego} \cdot ( \Delta_{t} + t_{end} )$ + +- $v_{ego}$ is ego vehicle's current velocity +- $\Delta_{t}$ is parameterized time constant value, `cancel.delta_time`. +- $t_{end}$ is the parameterized time constant value, `cancel.duration`. + +as depicted in the following diagram + +![abort_computation](./images/lane_change-abort_computation.png) + +!!! note + + When executing the abort process, comfort is not a primary concern. However, due to safety considerations, limited real-world testing has been conducted to tune or validate this parameter. Currently, the maximum lateral jerk is set to an arbitrary value. To avoid generating a path with excessive lateral jerk, this value can be configured using `cancel.max_lateral_jerk`. + +!!! note + + Lane change module returns `ModuleStatus::FAILURE` once abort is completed. + +### Stop/Cruise + +Once canceling or aborting the lane change is no longer an option, the ego vehicle will proceed with the lane change. This can happen in the following situations: + +- The ego vehicle is performing a lane change near a terminal or dead-end, making it impossible to return to the original lane. In such cases, completing the lane change is necessary. +- If safety parameters are tuned too aggressively, it becomes harder to cancel or abort the lane change. This reduces tolerance for unexpected behaviors from surrounding vehicles, such as a trailing vehicle in the target lane suddenly accelerating or a leading vehicle suddenly decelerating. Aggressive settings leave less room for error during the maneuver. + +![stop](./images/lane_change-cant_cancel_no_abort.png) ## Parameters @@ -1095,3 +1197,10 @@ Available information 3. Object is safe or not, shown by the color of the polygon (Green = Safe, Red = unsafe) 4. Valid candidate paths. 5. Position when lane changing start and end. + +## Limitation + +1. When a lane change is canceled, the lane change module returns `ModuleStatus::FAILURE`. As the module is removed from the approved module stack (see [Failure modules](https://autowarefoundation.github.io/autoware.universe/main/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design/#failure-modules)), a new instance of the lane change module is initiated. Due to this, any information stored prior to the reset is lost. For example, the `lane_change_prepare_duration` in the `TransientData` is reset to its maximum value. +2. The lane change module has no knowledge of any velocity modifications introduced to the path after it is approved. This is because other modules may add deceleration points after subscribing to the behavior path planner output, and the final velocity is managed by the [velocity smoother](https://autowarefoundation.github.io/autoware.universe/pr-9845/planning/autoware_velocity_smoother/). Since this limitation affects **CANCEL**, the lane change module mitigates it by [sampling accelerations along the approved lane change path](#checking-approved-path-safety). These sampled accelerations are used during safety checks to estimate the velocity that might occur if the ego vehicle decelerates. +3. Ideally, the abort path should account for whether its execution would affect trailing vehicles in the current lane. However, the lane change module does not evaluate such interactions or assess whether the abort path is safe. As a result, **the abort path is not guaranteed to be safe**. To minimize the risk of unsafe situations, the abort maneuver is only permitted if the ego vehicle has not yet diverged from the current lane. +4. Due to limited resources, the abort path logic is not fully optimized. The generated path may overshoot, causing the return trajectory to slightly shift toward the opposite lane. This can be dangerous, especially if the opposite lane has traffic moving in the opposite direction. Furthermore, the logic does not account for different vehicle types, which can lead to varying effects. For instance, the behavior might differ significantly between a bus and a small passenger car. diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/check_able_to_return.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/check_able_to_return.png new file mode 100644 index 0000000000000000000000000000000000000000..1f01b6df5464ad77971fb0eea37c587b3434fc85 GIT binary patch literal 26510 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 literal 0 HcmV?d00001 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-abort.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-abort.png index 0913912b6a332683a5d3a5a13bcdf1297c85a4bf..41e2bddbdafba1bc01a7aa07b7e9fa322e5bdb0d 100644 GIT binary patch literal 22119 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�zoI~=eIEP3^i|B;#g6)56| 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 M=$q(0K7k7TFKX##kpKVy literal 222968 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

(BLtBT-s?3%j;-xPC*?WGF9@IR*NO>*uoj=g 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

Z|8)We1+TGdDCnhZ*ghyL3;pEzNqF?{6Q2M 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

H7g6^DA1pY5Feqj0J;V{;WI&k_@O;{}mpENA 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 Nzau(;xzr+s|1YX%!Lk4V diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-abort_computation.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-abort_computation.png new file mode 100644 index 0000000000000000000000000000000000000000..47d4ba81b335450a24f95dd83ebbf080fc32f49a GIT binary patch literal 19345 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 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-cant_cancel_no_abort.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/lane_change-cant_cancel_no_abort.png index c3780540f8d006bf06b294c2e0e95e0d02d557f2..f142b42c8a6447a6a587b46311b4abc906e7ee4d 100644 GIT binary patch literal 16484 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 boZ}4`^06a1Pf_3#$m0j9_e<{?zyALKN{t$; literal 138829 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

_+MoqV;HcRO7ABq<&l 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 Date: Fri, 10 Jan 2025 19:47:29 +0900 Subject: [PATCH 070/127] test(autoware_behavior_path_start_planner_module): add test helper and implement unit tests for FreespacePullOut (#9832) * refactor(autoware_behavior_path_start_planner_module): remove unnecessary time_keeper parameter from pull-out planners Signed-off-by: Kyoichi Sugahara * refactor(autoware_behavior_path_start_planner_module): remove TimeKeeper parameter from pull-out planners Signed-off-by: Kyoichi Sugahara * refactor(lane_departure_checker): improve LaneDepartureChecker initialization and parameter handling Signed-off-by: kyoichi-sugahara * refactor(planner): add planner_data parameter to plan methods in pull out planners Signed-off-by: kyoichi-sugahara * refactor(autoware_behavior_path_start_planner_module): remove LaneDepartureChecker dependency from pull-out planners Signed-off-by: Kyoichi Sugahara --------- Signed-off-by: Kyoichi Sugahara --- .../goal_planner_module.hpp | 3 - .../pull_over_planner/bezier_pull_over.hpp | 4 +- .../pull_over_planner/freespace_pull_over.hpp | 4 +- .../pull_over_planner/geometric_pull_over.hpp | 3 +- .../pull_over_planner/shift_pull_over.hpp | 4 +- .../src/goal_planner_module.cpp | 19 +-- .../pull_over_planner/bezier_pull_over.cpp | 12 +- .../pull_over_planner/freespace_pull_over.cpp | 6 +- .../pull_over_planner/geometric_pull_over.cpp | 7 +- .../src/pull_over_planner/shift_pull_over.cpp | 7 +- .../CMakeLists.txt | 14 ++- .../freespace_pull_out.hpp | 6 +- .../geometric_pull_out.hpp | 3 +- .../pull_out_planner_base.hpp | 17 ++- .../shift_pull_out.hpp | 5 +- .../start_planner_module.hpp | 4 - .../src/freespace_pull_out.cpp | 15 +-- .../src/geometric_pull_out.cpp | 25 ++-- .../src/pull_out_planner_base.cpp | 7 +- .../src/shift_pull_out.cpp | 36 +++--- .../src/start_planner_module.cpp | 21 +--- .../include/start_planner_test_helper.hpp | 39 ++++++ .../test/src/start_planner_test_helper.cpp | 98 +++++++++++++++ .../test/test_freespace_pull_out.cpp | 113 ++++++++++++++++++ .../test/test_geometric_pull_out.cpp | 96 +++------------ .../test/test_shift_pull_out.cpp | 94 +++------------ 26 files changed, 385 insertions(+), 277 deletions(-) create mode 100644 planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/include/start_planner_test_helper.hpp create mode 100644 planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/src/start_planner_test_helper.cpp create mode 100644 planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp index cabbeb3435087..41524b1b8193c 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp @@ -23,8 +23,6 @@ #include "autoware/behavior_path_planner_common/utils/parking_departure/common_module_data.hpp" #include "autoware/behavior_path_planner_common/utils/path_safety_checker/path_safety_checker_parameters.hpp" -#include - #include #include @@ -40,7 +38,6 @@ namespace autoware::behavior_path_planner { -using autoware::lane_departure_checker::LaneDepartureChecker; using autoware_vehicle_msgs::msg::HazardLightsCommand; using geometry_msgs::msg::PoseArray; using nav_msgs::msg::OccupancyGrid; diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/bezier_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/bezier_pull_over.hpp index fabbd667298bb..9b97f87c933a8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/bezier_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/bezier_pull_over.hpp @@ -29,9 +29,7 @@ using autoware::lane_departure_checker::LaneDepartureChecker; class BezierPullOver : public PullOverPlannerBase { public: - BezierPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker); + BezierPullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters); PullOverPlannerType getPlannerType() const override { return PullOverPlannerType::BEZIER; } std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp index 37c82ea904a55..06ff47224dd44 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/freespace_pull_over.hpp @@ -30,9 +30,7 @@ using autoware::freespace_planning_algorithms::AbstractPlanningAlgorithm; class FreespacePullOver : public PullOverPlannerBase { public: - FreespacePullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info); + FreespacePullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters); PullOverPlannerType getPlannerType() const override { return PullOverPlannerType::FREESPACE; } diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp index d15c1e796bbe7..e12a759eb2137 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/geometric_pull_over.hpp @@ -32,8 +32,7 @@ class GeometricPullOver : public PullOverPlannerBase { public: GeometricPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker, const bool is_forward); + rclcpp::Node & node, const GoalPlannerParameters & parameters, const bool is_forward); PullOverPlannerType getPlannerType() const override { diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp index 2c6aec919bfbb..994d8283fe36c 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/pull_over_planner/shift_pull_over.hpp @@ -31,9 +31,7 @@ using autoware::lane_departure_checker::LaneDepartureChecker; class ShiftPullOver : public PullOverPlannerBase { public: - ShiftPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker); + ShiftPullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters); PullOverPlannerType getPlannerType() const override { return PullOverPlannerType::SHIFT; }; std::optional plan( const GoalCandidate & modified_goal_pose, const size_t id, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp index d4f3953c557b4..0a6185127fcf0 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp @@ -101,7 +101,7 @@ GoalPlannerModule::GoalPlannerModule( // freespace parking if (parameters_->enable_freespace_parking) { - auto freespace_planner = std::make_shared(node, *parameters, vehicle_info); + auto freespace_planner = std::make_shared(node, *parameters); const auto freespace_parking_period_ns = rclcpp::Rate(1.0).period(); freespace_parking_timer_cb_group_ = node.create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); @@ -280,22 +280,15 @@ LaneParkingPlanner::LaneParkingPlanner( is_lane_parking_cb_running_(is_lane_parking_cb_running), logger_(logger) { - const auto vehicle_info = autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo(); - lane_departure_checker::Param lane_departure_checker_params; - lane_departure_checker_params.footprint_extra_margin = - parameters.lane_departure_check_expansion_margin; - LaneDepartureChecker lane_departure_checker(lane_departure_checker_params, vehicle_info); - for (const std::string & planner_type : parameters.efficient_path_order) { if (planner_type == "SHIFT" && parameters.enable_shift_parking) { - pull_over_planners_.push_back( - std::make_shared(node, parameters, lane_departure_checker)); + pull_over_planners_.push_back(std::make_shared(node, parameters)); } else if (planner_type == "ARC_FORWARD" && parameters.enable_arc_forward_parking) { - pull_over_planners_.push_back(std::make_shared( - node, parameters, lane_departure_checker, /*is_forward*/ true)); + pull_over_planners_.push_back( + std::make_shared(node, parameters, /*is_forward*/ true)); } else if (planner_type == "ARC_BACKWARD" && parameters.enable_arc_backward_parking) { - pull_over_planners_.push_back(std::make_shared( - node, parameters, lane_departure_checker, /*is_forward*/ false)); + pull_over_planners_.push_back( + std::make_shared(node, parameters, /*is_forward*/ false)); } } diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp index ad42ccf1582ab..ec3984a6d9443 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp @@ -31,15 +31,13 @@ #include namespace autoware::behavior_path_planner { -BezierPullOver::BezierPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker) -: PullOverPlannerBase{node, parameters}, - lane_departure_checker_{lane_departure_checker}, - left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE} +BezierPullOver::BezierPullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters) +: PullOverPlannerBase(node, parameters), + lane_departure_checker_( + lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_), + left_side_parking_(parameters.parking_policy == ParkingPolicy::LEFT_SIDE) { } - std::optional BezierPullOver::plan( [[maybe_unused]] const GoalCandidate & modified_goal_pose, [[maybe_unused]] const size_t id, [[maybe_unused]] const std::shared_ptr planner_data, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp index 473f76b5904d6..6605d258a8d5e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/freespace_pull_over.cpp @@ -32,9 +32,7 @@ namespace autoware::behavior_path_planner using autoware::freespace_planning_algorithms::AstarSearch; using autoware::freespace_planning_algorithms::RRTStar; -FreespacePullOver::FreespacePullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const autoware::vehicle_info_utils::VehicleInfo & vehicle_info) +FreespacePullOver::FreespacePullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters) : PullOverPlannerBase{node, parameters}, velocity_{parameters.freespace_parking_velocity}, left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE}, @@ -45,7 +43,7 @@ FreespacePullOver::FreespacePullOver( } { autoware::freespace_planning_algorithms::VehicleShape vehicle_shape( - vehicle_info, parameters.vehicle_shape_margin); + vehicle_info_, parameters.vehicle_shape_margin); if (parameters.freespace_parking_algorithm == "astar") { planner_ = std::make_unique( parameters.freespace_parking_common_parameters, vehicle_shape, parameters.astar_parameters, diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp index 74b3fe149fd1d..bf2ce86b49bab 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp @@ -26,11 +26,10 @@ namespace autoware::behavior_path_planner { GeometricPullOver::GeometricPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker, const bool is_forward) + rclcpp::Node & node, const GoalPlannerParameters & parameters, const bool is_forward) : PullOverPlannerBase{node, parameters}, - parallel_parking_parameters_{parameters.parallel_parking_parameters}, - lane_departure_checker_{lane_departure_checker}, + lane_departure_checker_{ + lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_}, is_forward_{is_forward}, left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE} { diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp index 9a3e2d6b13db9..8350252369cc6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp @@ -30,11 +30,10 @@ namespace autoware::behavior_path_planner { -ShiftPullOver::ShiftPullOver( - rclcpp::Node & node, const GoalPlannerParameters & parameters, - const LaneDepartureChecker & lane_departure_checker) +ShiftPullOver::ShiftPullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters) : PullOverPlannerBase{node, parameters}, - lane_departure_checker_{lane_departure_checker}, + lane_departure_checker_{ + lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_}, left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE} { } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/CMakeLists.txt b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/CMakeLists.txt index e28339fb51a6c..5961b98bdda08 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/CMakeLists.txt +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/CMakeLists.txt @@ -19,12 +19,22 @@ ament_auto_add_library(${PROJECT_NAME} SHARED if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) ament_lint_auto_find_test_dependencies() + + # Add test helper library + ament_auto_add_library(start_planner_test_helper SHARED + test/src/start_planner_test_helper.cpp + ) + target_include_directories(start_planner_test_helper PUBLIC + test/include + ) + file(GLOB_RECURSE TEST_SOURCES test/*.cpp) ament_add_ros_isolated_gtest(test_${PROJECT_NAME} ${TEST_SOURCES} ) - target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) + target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME} + start_planner_test_helper + ) endif() - ament_auto_package(INSTALL_TO_SHARE config) diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp index 364d2d31a2577..e1a7ae455e374 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/freespace_pull_out.hpp @@ -40,7 +40,11 @@ class FreespacePullOut : public PullOutPlannerBase PlannerType getPlannerType() const override { return PlannerType::FREESPACE; } std::optional plan( - const Pose & start_pose, const Pose & end_pose, PlannerDebugData & planner_debug_data) override; + const Pose & start_pose, const Pose & end_pose, + const std::shared_ptr & planner_data, + PlannerDebugData & planner_debug_data) override; + + friend class TestFreespacePullOut; protected: std::unique_ptr planner_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp index 78eb72183cdf5..5d36c996cca3a 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/geometric_pull_out.hpp @@ -33,14 +33,13 @@ class GeometricPullOut : public PullOutPlannerBase public: explicit GeometricPullOut( rclcpp::Node & node, const StartPlannerParameters & parameters, - const std::shared_ptr - lane_departure_checker, std::shared_ptr time_keeper = std::make_shared()); PlannerType getPlannerType() const override { return PlannerType::GEOMETRIC; }; std::optional plan( const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) override; GeometricParallelParking planner_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp index dfd972aff9be0..0316d6a14a4f9 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp @@ -42,33 +42,30 @@ class PullOutPlannerBase rclcpp::Node & node, const StartPlannerParameters & parameters, std::shared_ptr time_keeper = std::make_shared()) - : parameters_(parameters), - vehicle_info_(autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()), - vehicle_footprint_(vehicle_info_.createFootprint()), + : parameters_{parameters}, + vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()}, + vehicle_footprint_{vehicle_info_.createFootprint()}, time_keeper_(time_keeper) { } virtual ~PullOutPlannerBase() = default; - void setPlannerData(const std::shared_ptr & planner_data) - { - planner_data_ = planner_data; - } - void setCollisionCheckMargin(const double collision_check_margin) { collision_check_margin_ = collision_check_margin; }; virtual PlannerType getPlannerType() const = 0; virtual std::optional plan( - const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) = 0; + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, + PlannerDebugData & planner_debug_data) = 0; protected: bool isPullOutPathCollided( autoware::behavior_path_planner::PullOutPath & pull_out_path, + const std::shared_ptr & planner_data, double collision_check_distance_from_end) const; - std::shared_ptr planner_data_; StartPlannerParameters parameters_; autoware::vehicle_info_utils::VehicleInfo vehicle_info_; LinearRing2d vehicle_footprint_; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp index 8da104940d327..1000437bdea56 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/shift_pull_out.hpp @@ -35,18 +35,19 @@ class ShiftPullOut : public PullOutPlannerBase public: explicit ShiftPullOut( rclcpp::Node & node, const StartPlannerParameters & parameters, - std::shared_ptr & lane_departure_checker, std::shared_ptr time_keeper = std::make_shared()); PlannerType getPlannerType() const override { return PlannerType::SHIFT; }; std::optional plan( const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) override; std::vector calcPullOutPaths( const RouteHandler & route_handler, const lanelet::ConstLanelets & road_lanes, - const Pose & start_pose, const Pose & goal_pose); + const Pose & start_pose, const Pose & goal_pose, + const BehaviorPathPlannerParameters & behavior_path_parameters); double calcBeforeShiftedArcLength( const PathWithLaneId & path, const double target_after_arc_length, const double dr); diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp index 47eecb54e2b2a..cf9227c2387f8 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp @@ -27,7 +27,6 @@ #include "autoware/behavior_path_start_planner_module/pull_out_path.hpp" #include "autoware/behavior_path_start_planner_module/shift_pull_out.hpp" -#include #include #include @@ -51,7 +50,6 @@ using autoware::behavior_path_planner::utils::path_safety_checker::ObjectsFilter using autoware::behavior_path_planner::utils::path_safety_checker::PoseWithVelocityStamped; using autoware::behavior_path_planner::utils::path_safety_checker::SafetyCheckParams; using autoware::behavior_path_planner::utils::path_safety_checker::TargetObjectsOnLane; -using autoware::lane_departure_checker::LaneDepartureChecker; using geometry_msgs::msg::PoseArray; using PriorityOrder = std::vector>>; @@ -310,8 +308,6 @@ ego pose. std::vector searchPullOutStartPoseCandidates( const PathWithLaneId & back_path_from_start_pose) const; - std::shared_ptr lane_departure_checker_; - // turn signal TurnSignalInfo calcTurnSignalInfo(); diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp index a089f6a8a83fc..6893c7d11d09d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/freespace_pull_out.cpp @@ -47,13 +47,14 @@ FreespacePullOut::FreespacePullOut(rclcpp::Node & node, const StartPlannerParame } std::optional FreespacePullOut::plan( - const Pose & start_pose, const Pose & end_pose, PlannerDebugData & planner_debug_data) + const Pose & start_pose, const Pose & end_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) { - const auto & route_handler = planner_data_->route_handler; - const double backward_path_length = planner_data_->parameters.backward_path_length; - const double forward_path_length = planner_data_->parameters.forward_path_length; + const auto & route_handler = planner_data->route_handler; + const double backward_path_length = planner_data->parameters.backward_path_length; + const double forward_path_length = planner_data->parameters.forward_path_length; - planner_->setMap(*planner_data_->costmap); + planner_->setMap(*planner_data->costmap); try { if (!planner_->makePlan(start_pose, end_pose)) { @@ -65,11 +66,11 @@ std::optional FreespacePullOut::plan( } const auto road_lanes = utils::getExtendedCurrentLanes( - planner_data_, backward_path_length, std::numeric_limits::max(), + planner_data, backward_path_length, std::numeric_limits::max(), /*forward_only_in_route*/ true); // find candidate paths const auto pull_out_lanes = - start_planner_utils::getPullOutLanes(planner_data_, backward_path_length); + start_planner_utils::getPullOutLanes(planner_data, backward_path_length); const auto lanes = utils::combineLanelets(road_lanes, pull_out_lanes); const PathWithLaneId path = diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp index bbc6c05725434..69c5c41405932 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp @@ -36,35 +36,37 @@ using start_planner_utils::getPullOutLanes; GeometricPullOut::GeometricPullOut( rclcpp::Node & node, const StartPlannerParameters & parameters, - const std::shared_ptr - lane_departure_checker, std::shared_ptr time_keeper) : PullOutPlannerBase{node, parameters, time_keeper}, - parallel_parking_parameters_{parameters.parallel_parking_parameters}, - lane_departure_checker_(lane_departure_checker) + parallel_parking_parameters_{parameters.parallel_parking_parameters} { + lane_departure_checker_ = + std::make_shared( + autoware::lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, + vehicle_info_, time_keeper_); planner_.setParameters(parallel_parking_parameters_); } std::optional GeometricPullOut::plan( - const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) { PullOutPath output; // combine road lane and pull out lane const double backward_path_length = - planner_data_->parameters.backward_path_length + parameters_.max_back_distance; + planner_data->parameters.backward_path_length + parameters_.max_back_distance; const auto road_lanes = utils::getExtendedCurrentLanes( - planner_data_, backward_path_length, std::numeric_limits::max(), + planner_data, backward_path_length, std::numeric_limits::max(), /*forward_only_in_route*/ true); - const auto pull_out_lanes = getPullOutLanes(planner_data_, backward_path_length); + const auto pull_out_lanes = getPullOutLanes(planner_data, backward_path_length); // check if the ego is at left or right side of road lane center const bool left_side_start = 0 < getArcCoordinates(road_lanes, start_pose).distance; planner_.setTurningRadius( - planner_data_->parameters, parallel_parking_parameters_.pull_out_max_steer_angle); - planner_.setPlannerData(planner_data_); + planner_data->parameters, parallel_parking_parameters_.pull_out_max_steer_angle); + planner_.setPlannerData(planner_data); const bool found_valid_path = planner_.planPullOut( start_pose, goal_pose, road_lanes, pull_out_lanes, left_side_start, lane_departure_checker_); if (!found_valid_path) { @@ -122,7 +124,8 @@ std::optional GeometricPullOut::plan( output.start_pose = planner_.getArcPaths().at(0).points.front().point.pose; output.end_pose = planner_.getArcPaths().at(1).points.back().point.pose; - if (isPullOutPathCollided(output, parameters_.geometric_collision_check_distance_from_end)) { + if (isPullOutPathCollided( + output, planner_data, parameters_.geometric_collision_check_distance_from_end)) { planner_debug_data.conditions_evaluation.emplace_back("collision"); return {}; } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/pull_out_planner_base.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/pull_out_planner_base.cpp index 42c5bead33604..a475b3ad582cb 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/pull_out_planner_base.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/pull_out_planner_base.cpp @@ -14,21 +14,24 @@ #include "autoware/behavior_path_start_planner_module/pull_out_planner_base.hpp" +#include + namespace autoware::behavior_path_planner { bool PullOutPlannerBase::isPullOutPathCollided( autoware::behavior_path_planner::PullOutPath & pull_out_path, + const std::shared_ptr & planner_data, double collision_check_distance_from_end) const { universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); // check for collisions - const auto & dynamic_objects = planner_data_->dynamic_object; + const auto & dynamic_objects = planner_data->dynamic_object; if (!dynamic_objects) { return false; } const auto pull_out_lanes = start_planner_utils::getPullOutLanes( - planner_data_, planner_data_->parameters.backward_path_length + parameters_.max_back_distance); + planner_data, planner_data->parameters.backward_path_length + parameters_.max_back_distance); // extract stop objects in pull out lane for collision check const auto stop_objects = utils::path_safety_checker::filterObjectsByVelocity( *dynamic_objects, parameters_.th_moving_object_velocity); diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp index 4759559619870..8f4de1d3636de 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp @@ -41,31 +41,36 @@ using start_planner_utils::getPullOutLanes; ShiftPullOut::ShiftPullOut( rclcpp::Node & node, const StartPlannerParameters & parameters, - std::shared_ptr & lane_departure_checker, std::shared_ptr time_keeper) -: PullOutPlannerBase{node, parameters, time_keeper}, lane_departure_checker_{lane_departure_checker} +: PullOutPlannerBase{node, parameters, time_keeper} { + lane_departure_checker_ = + std::make_shared( + autoware::lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, + vehicle_info_, time_keeper_); } std::optional ShiftPullOut::plan( - const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) { - const auto & route_handler = planner_data_->route_handler; - const auto & common_parameters = planner_data_->parameters; + const auto & route_handler = planner_data->route_handler; + const auto & common_parameters = planner_data->parameters; const double backward_path_length = - planner_data_->parameters.backward_path_length + parameters_.max_back_distance; + planner_data->parameters.backward_path_length + parameters_.max_back_distance; const auto road_lanes = utils::getExtendedCurrentLanes( - planner_data_, backward_path_length, std::numeric_limits::max(), + planner_data, backward_path_length, std::numeric_limits::max(), /*forward_only_in_route*/ true); // find candidate paths - auto pull_out_paths = calcPullOutPaths(*route_handler, road_lanes, start_pose, goal_pose); + auto pull_out_paths = + calcPullOutPaths(*route_handler, road_lanes, start_pose, goal_pose, common_parameters); if (pull_out_paths.empty()) { planner_debug_data.conditions_evaluation.emplace_back("no path found"); return std::nullopt; } - const auto lanelet_map_ptr = planner_data_->route_handler->getLaneletMapPtr(); + const auto lanelet_map_ptr = planner_data->route_handler->getLaneletMapPtr(); std::vector fused_id_start_to_end{}; std::optional fused_polygon_start_to_end = std::nullopt; @@ -159,9 +164,10 @@ std::optional ShiftPullOut::plan( continue; } shift_path.points = cropped_path.points; - shift_path.header = planner_data_->route_handler->getRouteHeader(); + shift_path.header = planner_data->route_handler->getRouteHeader(); - if (isPullOutPathCollided(pull_out_path, parameters_.shift_collision_check_distance_from_end)) { + if (isPullOutPathCollided( + pull_out_path, planner_data, parameters_.shift_collision_check_distance_from_end)) { planner_debug_data.conditions_evaluation.emplace_back("collision"); continue; } @@ -227,7 +233,8 @@ bool ShiftPullOut::refineShiftedPathToStartPose( std::vector ShiftPullOut::calcPullOutPaths( const RouteHandler & route_handler, const lanelet::ConstLanelets & road_lanes, - const Pose & start_pose, const Pose & goal_pose) + const Pose & start_pose, const Pose & goal_pose, + const BehaviorPathPlannerParameters & behavior_path_parameters) { universe_utils::ScopedTimeTrack st(__func__, *time_keeper_); @@ -238,9 +245,8 @@ std::vector ShiftPullOut::calcPullOutPaths( } // rename parameter - const auto & common_parameters = planner_data_->parameters; - const double forward_path_length = common_parameters.forward_path_length; - const double backward_path_length = common_parameters.backward_path_length; + const double forward_path_length = behavior_path_parameters.forward_path_length; + const double backward_path_length = behavior_path_parameters.backward_path_length; const double lateral_jerk = parameters_.lateral_jerk; const double minimum_lateral_acc = parameters_.minimum_lateral_acc; const double maximum_lateral_acc = parameters_.maximum_lateral_acc; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp index 83c1d55c7d022..0bac50a37fdbf 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp @@ -68,20 +68,12 @@ StartPlannerModule::StartPlannerModule( vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()}, is_freespace_planner_cb_running_{false} { - autoware::lane_departure_checker::Param lane_departure_checker_params{}; - lane_departure_checker_params.footprint_extra_margin = - parameters->lane_departure_check_expansion_margin; - lane_departure_checker_ = std::make_shared( - lane_departure_checker_params, vehicle_info_, time_keeper_); - // set enabled planner if (parameters_->enable_shift_pull_out) { - start_planners_.push_back( - std::make_shared(node, *parameters, lane_departure_checker_, time_keeper_)); + start_planners_.push_back(std::make_shared(node, *parameters, time_keeper_)); } if (parameters_->enable_geometric_pull_out) { - start_planners_.push_back( - std::make_shared(node, *parameters, lane_departure_checker_, time_keeper_)); + start_planners_.push_back(std::make_shared(node, *parameters, time_keeper_)); } if (start_planners_.empty()) { RCLCPP_ERROR(getLogger(), "Not found enabled planner"); @@ -983,17 +975,16 @@ bool StartPlannerModule::findPullOutPath( const bool backward_is_unnecessary = backwards_distance < epsilon; planner->setCollisionCheckMargin(collision_check_margin); - planner->setPlannerData(planner_data_); PlannerDebugData debug_data{ planner->getPlannerType(), {}, collision_check_margin, backwards_distance}; - const auto pull_out_path = planner->plan(start_pose_candidate, goal_pose, debug_data); + const auto pull_out_path = + planner->plan(start_pose_candidate, goal_pose, planner_data_, debug_data); debug_data_vector.push_back(debug_data); // If no path is found, return false if (!pull_out_path) { return false; } - if (backward_is_unnecessary) { updateStatusWithCurrentPath(*pull_out_path, start_pose_candidate, planner->getPlannerType()); return true; @@ -1592,9 +1583,9 @@ std::optional StartPlannerModule::planFreespacePath( for (const auto & p : center_line_path.points) { const Pose end_pose = p.point.pose; - freespace_planner_->setPlannerData(planner_data); PlannerDebugData debug_data{freespace_planner_->getPlannerType(), {}, 0.0, 0.0}; - auto freespace_path = freespace_planner_->plan(current_pose, end_pose, debug_data); + auto freespace_path = + freespace_planner_->plan(current_pose, end_pose, planner_data, debug_data); DEBUG_PRINT( "\nFreespace Pull out path search results\n%s%s", debug_data.header_str().c_str(), debug_data.str().c_str()); diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/include/start_planner_test_helper.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/include/start_planner_test_helper.hpp new file mode 100644 index 0000000000000..a1d294b279ff6 --- /dev/null +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/include/start_planner_test_helper.hpp @@ -0,0 +1,39 @@ +// Copyright 2024 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. +#pragma once + +#include +#include + +#include + +namespace autoware::behavior_path_planner::testing +{ + +class StartPlannerTestHelper +{ +public: + static rclcpp::NodeOptions make_node_options(); + + static void set_odometry( + std::shared_ptr & planner_data, const geometry_msgs::msg::Pose & start_pose); + static void set_route( + std::shared_ptr & planner_data, const int route_start_lane_id, + const int route_goal_lane_id); + static void set_costmap( + std::shared_ptr & planner_data, const geometry_msgs::msg::Pose & start_pose, + const double grid_resolution, const double grid_length_x, const double grid_length_y); +}; + +} // namespace autoware::behavior_path_planner::testing diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/src/start_planner_test_helper.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/src/start_planner_test_helper.cpp new file mode 100644 index 0000000000000..0f0720edc4a15 --- /dev/null +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/src/start_planner_test_helper.cpp @@ -0,0 +1,98 @@ +// Copyright 2024 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. +// pull_out_test_utils.cpp +#include "start_planner_test_helper.hpp" + +#include +#include + +#include +#include + +namespace autoware::behavior_path_planner::testing +{ +using autoware::test_utils::get_absolute_path_to_config; +using autoware_planning_test_manager::utils::makeBehaviorRouteFromLaneId; + +rclcpp::NodeOptions StartPlannerTestHelper::make_node_options() +{ + // Load common configuration files + auto node_options = rclcpp::NodeOptions{}; + + const auto common_param_path = + get_absolute_path_to_config("autoware_test_utils", "test_common.param.yaml"); + const auto nearest_search_param_path = + get_absolute_path_to_config("autoware_test_utils", "test_nearest_search.param.yaml"); + const auto vehicle_info_param_path = + get_absolute_path_to_config("autoware_test_utils", "test_vehicle_info.param.yaml"); + const auto behavior_path_planner_param_path = get_absolute_path_to_config( + "autoware_behavior_path_planner", "behavior_path_planner.param.yaml"); + const auto drivable_area_expansion_param_path = get_absolute_path_to_config( + "autoware_behavior_path_planner", "drivable_area_expansion.param.yaml"); + const auto scene_module_manager_param_path = get_absolute_path_to_config( + "autoware_behavior_path_planner", "scene_module_manager.param.yaml"); + const auto start_planner_param_path = get_absolute_path_to_config( + "autoware_behavior_path_start_planner_module", "start_planner.param.yaml"); + + autoware::test_utils::updateNodeOptions( + node_options, {common_param_path, nearest_search_param_path, vehicle_info_param_path, + behavior_path_planner_param_path, drivable_area_expansion_param_path, + scene_module_manager_param_path, start_planner_param_path}); + + return node_options; +} + +void StartPlannerTestHelper::set_odometry( + std::shared_ptr & planner_data, const geometry_msgs::msg::Pose & start_pose) +{ + auto odometry = std::make_shared(); + odometry->pose.pose = start_pose; + odometry->header.frame_id = "map"; + planner_data->self_odometry = odometry; +} + +void StartPlannerTestHelper::set_route( + std::shared_ptr & planner_data, const int route_start_lane_id, + const int route_goal_lane_id) +{ + const auto shoulder_map_path = autoware::test_utils::get_absolute_path_to_lanelet_map( + "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); + const auto map_bin_msg = autoware::test_utils::make_map_bin_msg(shoulder_map_path, 0.5); + auto route_handler = std::make_shared(map_bin_msg); + + const auto route = makeBehaviorRouteFromLaneId( + route_start_lane_id, route_goal_lane_id, "autoware_test_utils", + "road_shoulder/lanelet2_map.osm"); + route_handler->setRoute(route); + planner_data->route_handler = route_handler; +} + +void StartPlannerTestHelper::set_costmap( + std::shared_ptr & planner_data, const geometry_msgs::msg::Pose & start_pose, + const double grid_resolution, const double grid_length_x, const double grid_length_y) +{ + nav_msgs::msg::OccupancyGrid costmap; + costmap.header.frame_id = "map"; + costmap.info.width = static_cast(grid_length_x / grid_resolution); + costmap.info.height = static_cast(grid_length_y / grid_resolution); + costmap.info.resolution = grid_resolution; + + costmap.info.origin.position.x = start_pose.position.x - grid_length_x / 2; + costmap.info.origin.position.y = start_pose.position.y - grid_length_y / 2; + costmap.data = std::vector(costmap.info.width * costmap.info.height, 0); + + planner_data->costmap = std::make_shared(costmap); +} + +} // namespace autoware::behavior_path_planner::testing diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp new file mode 100644 index 0000000000000..79c58c37f0dcf --- /dev/null +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp @@ -0,0 +1,113 @@ +// Copyright 2024 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. + +#include "start_planner_test_helper.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +using autoware::behavior_path_planner::FreespacePullOut; +using autoware::behavior_path_planner::StartPlannerParameters; +using autoware::test_utils::get_absolute_path_to_config; +using autoware_planning_msgs::msg::LaneletRoute; +using RouteSections = std::vector; +using autoware::behavior_path_planner::testing::StartPlannerTestHelper; +using autoware_planning_test_manager::utils::makeBehaviorRouteFromLaneId; + +namespace autoware::behavior_path_planner +{ + +class TestFreespacePullOut : public ::testing::Test +{ +public: + std::optional call_plan( + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) + { + return freespace_pull_out_->plan(start_pose, goal_pose, planner_data, planner_debug_data); + } + +protected: + void SetUp() override + { + rclcpp::init(0, nullptr); + node_ = + rclcpp::Node::make_shared("freespace_pull_out", StartPlannerTestHelper::make_node_options()); + + planner_data_ = std::make_shared(); + planner_data_->init_parameters(*node_); + + initialize_freespace_pull_out_planner(); + } + + void TearDown() override { rclcpp::shutdown(); } + + // Member variables + std::shared_ptr node_; + std::shared_ptr freespace_pull_out_; + std::shared_ptr planner_data_; + +private: + void initialize_freespace_pull_out_planner() + { + auto parameters = StartPlannerParameters::init(*node_); + freespace_pull_out_ = std::make_shared(*node_, parameters); + } +}; + +TEST_F(TestFreespacePullOut, GenerateValidFreespacePullOutPath) +{ + const auto start_pose = + geometry_msgs::build() + .position(geometry_msgs::build().x(299.796).y(303.529).z(100.000)) + .orientation( + geometry_msgs::build().x(0.0).y(0.0).z(-0.748629).w( + 0.662990)); + + const auto goal_pose = + geometry_msgs::build() + .position(geometry_msgs::build().x(280.721).y(301.025).z(100.000)) + .orientation( + geometry_msgs::build().x(0.0).y(0.0).z(0.991718).w( + 0.128435)); + + StartPlannerTestHelper::set_odometry(planner_data_, start_pose); + StartPlannerTestHelper::set_route(planner_data_, 508, 720); + StartPlannerTestHelper::set_costmap(planner_data_, start_pose, 0.3, 70.0, 70.0); + + // Plan the pull out path + PlannerDebugData debug_data; + auto result = call_plan(start_pose, goal_pose, planner_data_, debug_data); + + // Assert that a valid Freespace pull out path is generated + ASSERT_TRUE(result.has_value()) << "Freespace pull out path generation failed."; + // EXPECT_EQ(result->partial_paths.size(), 2UL) + // << "Freespace pull out path does not have the expected number of partial paths."; + EXPECT_EQ(debug_data.conditions_evaluation.back(), "success") + << "Freespace pull out path planning did not succeed."; +} + +} // namespace autoware::behavior_path_planner diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp index 726c9ccc4c5d7..4548c058b871d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_geometric_pull_out.cpp @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "start_planner_test_helper.hpp" + #include #include #include #include -#include #include #include #include @@ -30,10 +31,10 @@ using autoware::behavior_path_planner::GeometricPullOut; using autoware::behavior_path_planner::StartPlannerParameters; -using autoware::lane_departure_checker::LaneDepartureChecker; using autoware::test_utils::get_absolute_path_to_config; using autoware_planning_msgs::msg::LaneletRoute; using RouteSections = std::vector; +using autoware::behavior_path_planner::testing::StartPlannerTestHelper; using autoware_planning_test_manager::utils::makeBehaviorRouteFromLaneId; namespace autoware::behavior_path_planner @@ -43,102 +44,33 @@ class TestGeometricPullOut : public ::testing::Test { public: std::optional call_plan( - const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) { - return geometric_pull_out_->plan(start_pose, goal_pose, planner_debug_data); + return geometric_pull_out_->plan(start_pose, goal_pose, planner_data, planner_debug_data); } protected: void SetUp() override { rclcpp::init(0, nullptr); - node_ = rclcpp::Node::make_shared("geometric_pull_out", make_node_options()); + node_ = + rclcpp::Node::make_shared("geometric_pull_out", StartPlannerTestHelper::make_node_options()); - initialize_lane_departure_checker(); initialize_geometric_pull_out_planner(); } - void TearDown() override { rclcpp::shutdown(); } - PlannerData make_planner_data( - const Pose & start_pose, const int route_start_lane_id, const int route_goal_lane_id) - { - PlannerData planner_data; - planner_data.init_parameters(*node_); - - // Load a sample lanelet map and create a route handler - const auto shoulder_map_path = autoware::test_utils::get_absolute_path_to_lanelet_map( - "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); - const auto map_bin_msg = autoware::test_utils::make_map_bin_msg(shoulder_map_path, 0.5); - auto route_handler = std::make_shared(map_bin_msg); - - // Set up current odometry at start pose - auto odometry = std::make_shared(); - odometry->pose.pose = start_pose; - odometry->header.frame_id = "map"; - planner_data.self_odometry = odometry; - - // Setup route - const auto route = makeBehaviorRouteFromLaneId( - route_start_lane_id, route_goal_lane_id, "autoware_test_utils", - "road_shoulder/lanelet2_map.osm"); - route_handler->setRoute(route); - - // Update planner data with the route handler - planner_data.route_handler = route_handler; - - return planner_data; - } - // Member variables std::shared_ptr node_; std::shared_ptr geometric_pull_out_; - std::shared_ptr lane_departure_checker_; private: - rclcpp::NodeOptions make_node_options() const - { - // Load common configuration files - auto node_options = rclcpp::NodeOptions{}; - - const auto common_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_common.param.yaml"); - const auto nearest_search_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_nearest_search.param.yaml"); - const auto vehicle_info_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_vehicle_info.param.yaml"); - const auto behavior_path_planner_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "behavior_path_planner.param.yaml"); - const auto drivable_area_expansion_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "drivable_area_expansion.param.yaml"); - const auto scene_module_manager_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "scene_module_manager.param.yaml"); - const auto start_planner_param_path = get_absolute_path_to_config( - "autoware_behavior_path_start_planner_module", "start_planner.param.yaml"); - - autoware::test_utils::updateNodeOptions( - node_options, {common_param_path, nearest_search_param_path, vehicle_info_param_path, - behavior_path_planner_param_path, drivable_area_expansion_param_path, - scene_module_manager_param_path, start_planner_param_path}); - - return node_options; - } - - void initialize_lane_departure_checker() - { - autoware::lane_departure_checker::Param lane_departure_checker_params{}; - const auto vehicle_info = - autoware::vehicle_info_utils::VehicleInfoUtils(*node_).getVehicleInfo(); - lane_departure_checker_ = - std::make_shared(lane_departure_checker_params, vehicle_info); - } - void initialize_geometric_pull_out_planner() { auto parameters = StartPlannerParameters::init(*node_); - geometric_pull_out_ = - std::make_shared(*node_, parameters, lane_departure_checker_); + geometric_pull_out_ = std::make_shared(*node_, parameters); } }; @@ -157,15 +89,17 @@ TEST_F(TestGeometricPullOut, GenerateValidGeometricPullOutPath) .orientation( geometry_msgs::build().x(0.0).y(0.0).z(0.705897).w( 0.708314)); - const auto planner_data = make_planner_data(start_pose, 4619, 4635); - geometric_pull_out_->setPlannerData(std::make_shared(planner_data)); + auto planner_data = std::make_shared(); + planner_data->init_parameters(*node_); + StartPlannerTestHelper::set_odometry(planner_data, start_pose); + StartPlannerTestHelper::set_route(planner_data, 4619, 4635); // Plan the pull out path PlannerDebugData debug_data; - auto result = call_plan(start_pose, goal_pose, debug_data); + auto result = call_plan(start_pose, goal_pose, planner_data, debug_data); - // Assert that a valid geometric geometric pull out path is generated + // Assert that a valid geometric pull out path is generated ASSERT_TRUE(result.has_value()) << "Geometric pull out path generation failed."; EXPECT_EQ(result->partial_paths.size(), 2UL) << "Generated geometric pull out path does not have the expected number of partial paths."; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp index 05a9201dad41d..d2c7c60e1a4ca 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_shift_pull_out.cpp @@ -12,11 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "start_planner_test_helper.hpp" + #include #include #include #include -#include #include #include #include @@ -25,15 +26,16 @@ #include #include +#include #include #include using autoware::behavior_path_planner::ShiftPullOut; using autoware::behavior_path_planner::StartPlannerParameters; -using autoware::lane_departure_checker::LaneDepartureChecker; using autoware::test_utils::get_absolute_path_to_config; using autoware_planning_msgs::msg::LaneletRoute; using RouteSections = std::vector; +using autoware::behavior_path_planner::testing::StartPlannerTestHelper; using autoware_planning_test_manager::utils::makeBehaviorRouteFromLaneId; namespace autoware::behavior_path_planner @@ -43,101 +45,34 @@ class TestShiftPullOut : public ::testing::Test { public: std::optional call_plan( - const Pose & start_pose, const Pose & goal_pose, PlannerDebugData & planner_debug_data) + const Pose & start_pose, const Pose & goal_pose, + const std::shared_ptr & planner_data, PlannerDebugData & planner_debug_data) { - return shift_pull_out_->plan(start_pose, goal_pose, planner_debug_data); + return shift_pull_out_->plan(start_pose, goal_pose, planner_data, planner_debug_data); } protected: void SetUp() override { rclcpp::init(0, nullptr); - node_ = rclcpp::Node::make_shared("shift_pull_out", make_node_options()); + node_ = + rclcpp::Node::make_shared("shift_pull_out", StartPlannerTestHelper::make_node_options()); - initialize_lane_departure_checker(); initialize_shift_pull_out_planner(); } void TearDown() override { rclcpp::shutdown(); } - PlannerData make_planner_data( - const Pose & start_pose, const int route_start_lane_id, const int route_goal_lane_id) - { - PlannerData planner_data; - planner_data.init_parameters(*node_); - - // Load a sample lanelet map and create a route handler - const auto shoulder_map_path = autoware::test_utils::get_absolute_path_to_lanelet_map( - "autoware_test_utils", "road_shoulder/lanelet2_map.osm"); - const auto map_bin_msg = autoware::test_utils::make_map_bin_msg(shoulder_map_path, 0.5); - auto route_handler = std::make_shared(map_bin_msg); - - // Set up current odometry at start pose - auto odometry = std::make_shared(); - odometry->pose.pose = start_pose; - odometry->header.frame_id = "map"; - planner_data.self_odometry = odometry; - - // Setup route - const auto route = makeBehaviorRouteFromLaneId( - route_start_lane_id, route_goal_lane_id, "autoware_test_utils", - "road_shoulder/lanelet2_map.osm"); - route_handler->setRoute(route); - - // Update planner data with the route handler - planner_data.route_handler = route_handler; - - return planner_data; - } - // Member variables std::shared_ptr node_; std::shared_ptr shift_pull_out_; - std::shared_ptr lane_departure_checker_; private: - rclcpp::NodeOptions make_node_options() const - { - // Load common configuration files - auto node_options = rclcpp::NodeOptions{}; - - const auto common_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_common.param.yaml"); - const auto nearest_search_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_nearest_search.param.yaml"); - const auto vehicle_info_param_path = - get_absolute_path_to_config("autoware_test_utils", "test_vehicle_info.param.yaml"); - const auto behavior_path_planner_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "behavior_path_planner.param.yaml"); - const auto drivable_area_expansion_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "drivable_area_expansion.param.yaml"); - const auto scene_module_manager_param_path = get_absolute_path_to_config( - "autoware_behavior_path_planner", "scene_module_manager.param.yaml"); - const auto start_planner_param_path = get_absolute_path_to_config( - "autoware_behavior_path_start_planner_module", "start_planner.param.yaml"); - - autoware::test_utils::updateNodeOptions( - node_options, {common_param_path, nearest_search_param_path, vehicle_info_param_path, - behavior_path_planner_param_path, drivable_area_expansion_param_path, - scene_module_manager_param_path, start_planner_param_path}); - - return node_options; - } - - void initialize_lane_departure_checker() - { - autoware::lane_departure_checker::Param lane_departure_checker_params{}; - const auto vehicle_info = - autoware::vehicle_info_utils::VehicleInfoUtils(*node_).getVehicleInfo(); - lane_departure_checker_ = - std::make_shared(lane_departure_checker_params, vehicle_info); - } - void initialize_shift_pull_out_planner() { auto parameters = StartPlannerParameters::init(*node_); - shift_pull_out_ = std::make_shared(*node_, parameters, lane_departure_checker_); + shift_pull_out_ = std::make_shared(*node_, parameters); } }; @@ -156,13 +91,14 @@ TEST_F(TestShiftPullOut, GenerateValidShiftPullOutPath) .orientation( geometry_msgs::build().x(0.0).y(0.0).z(0.705897).w( 0.708314)); - const auto planner_data = make_planner_data(start_pose, 4619, 4635); - - shift_pull_out_->setPlannerData(std::make_shared(planner_data)); + auto planner_data = std::make_shared(); + planner_data->init_parameters(*node_); + StartPlannerTestHelper::set_odometry(planner_data, start_pose); + StartPlannerTestHelper::set_route(planner_data, 4619, 4635); // Plan the pull out path PlannerDebugData debug_data; - auto result = call_plan(start_pose, goal_pose, debug_data); + auto result = call_plan(start_pose, goal_pose, planner_data, debug_data); // Assert that a valid shift pull out path is generated ASSERT_TRUE(result.has_value()) << "shift pull out path generation failed."; From f0d7d8dd2872a886faa956d755c1272d45f165e1 Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Tue, 14 Jan 2025 09:08:30 +0900 Subject: [PATCH 071/127] docs(lane_change): fix broken link (#9892) Signed-off-by: Zulfaqar Azmi --- .../autoware_behavior_path_lane_change_module/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index c5cdf0bb68bc2..b4f848e0809aa 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -1201,6 +1201,6 @@ Available information ## Limitation 1. When a lane change is canceled, the lane change module returns `ModuleStatus::FAILURE`. As the module is removed from the approved module stack (see [Failure modules](https://autowarefoundation.github.io/autoware.universe/main/planning/behavior_path_planner/autoware_behavior_path_planner/docs/behavior_path_planner_manager_design/#failure-modules)), a new instance of the lane change module is initiated. Due to this, any information stored prior to the reset is lost. For example, the `lane_change_prepare_duration` in the `TransientData` is reset to its maximum value. -2. The lane change module has no knowledge of any velocity modifications introduced to the path after it is approved. This is because other modules may add deceleration points after subscribing to the behavior path planner output, and the final velocity is managed by the [velocity smoother](https://autowarefoundation.github.io/autoware.universe/pr-9845/planning/autoware_velocity_smoother/). Since this limitation affects **CANCEL**, the lane change module mitigates it by [sampling accelerations along the approved lane change path](#checking-approved-path-safety). These sampled accelerations are used during safety checks to estimate the velocity that might occur if the ego vehicle decelerates. +2. The lane change module has no knowledge of any velocity modifications introduced to the path after it is approved. This is because other modules may add deceleration points after subscribing to the behavior path planner output, and the final velocity is managed by the [velocity smoother](https://autowarefoundation.github.io/autoware.universe/main/planning/autoware_velocity_smoother/). Since this limitation affects **CANCEL**, the lane change module mitigates it by [sampling accelerations along the approved lane change path](#checking-approved-path-safety). These sampled accelerations are used during safety checks to estimate the velocity that might occur if the ego vehicle decelerates. 3. Ideally, the abort path should account for whether its execution would affect trailing vehicles in the current lane. However, the lane change module does not evaluate such interactions or assess whether the abort path is safe. As a result, **the abort path is not guaranteed to be safe**. To minimize the risk of unsafe situations, the abort maneuver is only permitted if the ego vehicle has not yet diverged from the current lane. 4. Due to limited resources, the abort path logic is not fully optimized. The generated path may overshoot, causing the return trajectory to slightly shift toward the opposite lane. This can be dangerous, especially if the opposite lane has traffic moving in the opposite direction. Furthermore, the logic does not account for different vehicle types, which can lead to varying effects. For instance, the behavior might differ significantly between a bus and a small passenger car. From 4b11912180be2a8fadcfd42889bba54e42cc9324 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:30:45 +0900 Subject: [PATCH 072/127] =?UTF-8?q?feat:=20=20tier4=5Fdebug=5Fmsgs=20to=20?= =?UTF-8?q?autoware=5Finternal=5Fdebug=5Fmsgs=20in=20file=20contr=E2=80=A6?= =?UTF-8?q?=20(#9837)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs to autoware_internal_debug_msgs in file control/autoware_control_validator Signed-off-by: vish0012 --- .../autoware/control_validator/control_validator.hpp | 5 +++-- .../autoware_control_validator/src/control_validator.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/control/autoware_control_validator/include/autoware/control_validator/control_validator.hpp b/control/autoware_control_validator/include/autoware/control_validator/control_validator.hpp index 080e8f0e6abc3..b828c8d07ac49 100644 --- a/control/autoware_control_validator/include/autoware/control_validator/control_validator.hpp +++ b/control/autoware_control_validator/include/autoware/control_validator/control_validator.hpp @@ -25,10 +25,10 @@ #include #include +#include #include #include #include -#include #include #include @@ -139,7 +139,8 @@ class ControlValidator : public rclcpp::Node universe_utils::InterProcessPollingSubscriber::SharedPtr sub_reference_traj_; rclcpp::Publisher::SharedPtr pub_status_; rclcpp::Publisher::SharedPtr pub_markers_; - rclcpp::Publisher::SharedPtr pub_processing_time_; + rclcpp::Publisher::SharedPtr + pub_processing_time_; // system parameters int64_t diag_error_count_threshold_ = 0; diff --git a/control/autoware_control_validator/src/control_validator.cpp b/control/autoware_control_validator/src/control_validator.cpp index 0c16fae065939..e0b9c7135e5f0 100644 --- a/control/autoware_control_validator/src/control_validator.cpp +++ b/control/autoware_control_validator/src/control_validator.cpp @@ -48,8 +48,8 @@ ControlValidator::ControlValidator(const rclcpp::NodeOptions & options) pub_markers_ = create_publisher("~/output/markers", 1); - pub_processing_time_ = - this->create_publisher("~/debug/processing_time_ms", 1); + pub_processing_time_ = this->create_publisher( + "~/debug/processing_time_ms", 1); debug_pose_publisher_ = std::make_shared(this); @@ -181,7 +181,7 @@ void ControlValidator::publish_debug_info() debug_pose_publisher_->publish(); // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); pub_processing_time_->publish(processing_time_msg); From c47cd5d6a985df04f61c4499d90e6d273e0abdb2 Mon Sep 17 00:00:00 2001 From: mkquda <168697710+mkquda@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:43:58 +0900 Subject: [PATCH 073/127] feat(lane_change): append candidate path index to metric debug table (#9885) add candidate path index to metrics debug table Signed-off-by: mohammad alqudah --- .../scene.hpp | 3 +- .../structs/debug.hpp | 2 +- .../src/scene.cpp | 20 ++++--- .../src/utils/markers.cpp | 56 ++++++------------- 4 files changed, 32 insertions(+), 49 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp index fe1d18ea6ea0c..a8b7a670c881b 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp @@ -135,7 +135,8 @@ class NormalLaneChange : public LaneChangeBase std::vector get_prepare_metrics() const; std::vector get_lane_changing_metrics( const PathWithLaneId & prep_segment, const LaneChangePhaseMetrics & prep_metrics, - const double shift_length, const double dist_to_reg_element) const; + const double shift_length, const double dist_to_reg_element, + lane_change::MetricsDebug & debug_metrics) const; bool get_lane_change_paths(LaneChangePaths & candidate_paths) const; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp index 1541846841f20..589f2f20ba258 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp @@ -34,7 +34,7 @@ using utils::path_safety_checker::CollisionCheckDebugMap; struct MetricsDebug { LaneChangePhaseMetrics prep_metric; - std::vector lc_metrics; + std::vector> lc_metrics; double max_prepare_length; double max_lane_changing_length; }; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 09a4216bf5857..88f58debb886a 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -1083,7 +1083,8 @@ std::vector NormalLaneChange::get_prepare_metrics() cons std::vector NormalLaneChange::get_lane_changing_metrics( const PathWithLaneId & prep_segment, const LaneChangePhaseMetrics & prep_metric, - const double shift_length, const double dist_to_reg_element) const + const double shift_length, const double dist_to_reg_element, + lane_change::MetricsDebug & debug_metrics) const { const auto & transient_data = common_data_ptr_->transient_data; const auto dist_lc_start_to_end_of_lanes = calculation::calc_dist_from_pose_to_terminal_end( @@ -1100,15 +1101,11 @@ std::vector NormalLaneChange::get_lane_changing_metrics( return max_length; }); + debug_metrics.max_lane_changing_length = max_lane_changing_length; const auto max_path_velocity = prep_segment.points.back().point.longitudinal_velocity_mps; - const auto lc_metrics = calculation::calc_shift_phase_metrics( + return calculation::calc_shift_phase_metrics( common_data_ptr_, shift_length, prep_metric.velocity, max_path_velocity, prep_metric.sampled_lon_accel, max_lane_changing_length); - - const auto max_prep_length = common_data_ptr_->transient_data.dist_to_terminal_start; - lane_change_debug_.lane_change_metrics.push_back( - {prep_metric, lc_metrics, max_prep_length, max_lane_changing_length}); - return lc_metrics; } bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) const @@ -1185,8 +1182,12 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) const auto shift_length = lanelet::utils::getLateralDistanceToClosestLanelet(target_lanes, lane_changing_start_pose); + lane_change_debug_.lane_change_metrics.emplace_back(); + auto & debug_metrics = lane_change_debug_.lane_change_metrics.back(); + debug_metrics.prep_metric = prep_metric; + debug_metrics.max_prepare_length = common_data_ptr_->transient_data.dist_to_terminal_start; const auto lane_changing_metrics = get_lane_changing_metrics( - prepare_segment, prep_metric, shift_length, dist_to_next_regulatory_element); + prepare_segment, prep_metric, shift_length, dist_to_next_regulatory_element, debug_metrics); // set_prepare_velocity must only be called after computing lane change metrics, as lane change // metrics rely on the prepare segment's original velocity as max_path_velocity. @@ -1194,6 +1195,8 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) prepare_segment, common_data_ptr_->get_ego_speed(), prep_metric.velocity); for (const auto & lc_metric : lane_changing_metrics) { + debug_metrics.lc_metrics.push_back({lc_metric, -1}); + const auto debug_print_lat = [&](const std::string & s) { RCLCPP_DEBUG( logger_, "%s | lc_time: %.5f | lon_acc: %.5f | lat_acc: %.5f | lc_len: %.5f", s.c_str(), @@ -1215,6 +1218,7 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) } candidate_paths.push_back(candidate_path); + debug_metrics.lc_metrics.back().second = candidate_paths.size() - 1; try { if (check_candidate_path_safety(candidate_path, target_objects)) { diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp index eb120e006a229..ef899cceea0d4 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp @@ -73,32 +73,6 @@ MarkerArray showAllValidLaneChangePath( marker.points.push_back(point.point.pose.position); } - const auto & info = lc_path.info; - auto text_marker = createDefaultMarker( - "map", current_time, ns_with_idx, ++id, visualization_msgs::msg::Marker::TEXT_VIEW_FACING, - createMarkerScale(0.1, 0.1, 0.8), colors::yellow()); - const auto prep_idx = points.size() / 4; - text_marker.pose = points.at(prep_idx).point.pose; - text_marker.pose.position.z += 2.0; - text_marker.text = fmt::format( - "vel: {vel:.3f}[m/s] | lon_acc: {lon_acc:.3f}[m/s2] | t: {time:.3f}[s] | L: {length:.3f}[m]", - fmt::arg("vel", info.velocity.prepare), - fmt::arg("lon_acc", info.longitudinal_acceleration.prepare), - fmt::arg("time", info.duration.prepare), fmt::arg("length", info.length.prepare)); - marker_array.markers.push_back(text_marker); - - const auto lc_idx = points.size() / 2; - text_marker.id = ++id; - text_marker.pose = points.at(lc_idx).point.pose; - text_marker.text = fmt::format( - "vel: {vel:.3f}[m/s] | lon_acc: {lon_acc:.3f}[m/s2] | lat_acc: {lat_acc:.3f}[m/s2] | t: " - "{time:.3f}[s] | L: {length:.3f}[m]", - fmt::arg("vel", info.velocity.lane_changing), - fmt::arg("lon_acc", info.longitudinal_acceleration.lane_changing), - fmt::arg("lat_acc", info.lateral_acceleration), fmt::arg("time", info.duration.lane_changing), - fmt::arg("length", info.length.lane_changing)); - marker_array.markers.push_back(text_marker); - marker_array.markers.push_back(marker); } return marker_array; @@ -206,26 +180,30 @@ MarkerArray ShowLaneChangeMetricsInfo( createMarkerScale(0.6, 0.6, 0.6), colors::yellow()); text_marker.pose = autoware::universe_utils::calcOffsetPose(pose, 10.0, 15.0, 0.0); - text_marker.text = fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lat_accel[m/s2]") + - fmt::format("{:^18}|", "lon_accel[m/s2]") + - fmt::format("{:^17}|", "velocity[m/s]") + - fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + - fmt::format("{:^20}\n", "max_length_th[m]"); + text_marker.text = + fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lat_accel[m/s2]") + + fmt::format("{:^18}|", "lon_accel[m/s2]") + fmt::format("{:^17}|", "velocity[m/s]") + + fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + + fmt::format("{:^20}|", "max_length_th[m]") + fmt::format("{:^15}\n", "path_index"); for (const auto & metrics : debug_data.lane_change_metrics) { - text_marker.text += fmt::format("{:-<170}\n", ""); + text_marker.text += fmt::format("{:-<190}\n", ""); const auto & p_m = metrics.prep_metric; text_marker.text += fmt::format("{:<17}", "prep_metrics:") + fmt::format("{:^10.3f}", p_m.lat_accel) + fmt::format("{:^21.3f}", p_m.actual_lon_accel) + fmt::format("{:^12.3f}", p_m.velocity) + fmt::format("{:^15.3f}", p_m.duration) + fmt::format("{:^15.3f}", p_m.length) + - fmt::format("{:^17.3f}\n", metrics.max_prepare_length); + fmt::format("{:^17.3f}", metrics.max_prepare_length) + fmt::format("{:^15}\n", "-"); text_marker.text += fmt::format("{:<20}\n", "lc_metrics:"); - for (const auto lc_m : metrics.lc_metrics) { - text_marker.text += - fmt::format("{:<15}", "") + fmt::format("{:^10.3f}", lc_m.lat_accel) + - fmt::format("{:^21.3f}", lc_m.actual_lon_accel) + fmt::format("{:^12.3f}", lc_m.velocity) + - fmt::format("{:^15.3f}", lc_m.duration) + fmt::format("{:^15.3f}", lc_m.length) + - fmt::format("{:^17.3f}\n", metrics.max_lane_changing_length); + for (const auto & lc_m : metrics.lc_metrics) { + const auto & metric = lc_m.first; + const auto path_index = lc_m.second < 0 ? "-" : std::to_string(lc_m.second); + text_marker.text += fmt::format("{:<15}", "") + fmt::format("{:^10.3f}", metric.lat_accel) + + fmt::format("{:^21.3f}", metric.actual_lon_accel) + + fmt::format("{:^12.3f}", metric.velocity) + + fmt::format("{:^15.3f}", metric.duration) + + fmt::format("{:^15.3f}", metric.length) + + fmt::format("{:^17.3f}", metrics.max_lane_changing_length) + + fmt::format("{:^15}\n", path_index); } } From 3c5ace825f71da53e41a67fa6c89cc316b1b3c38 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:49:39 +0900 Subject: [PATCH 074/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9859)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files evaluator/autoware_planning_evaluator Signed-off-by: vish0012 --- .../autoware/planning_evaluator/planning_evaluator_node.hpp | 5 +++-- .../src/planning_evaluator_node.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/planning_evaluator_node.hpp b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/planning_evaluator_node.hpp index 9c268206846d9..8c0b49ce2dd26 100644 --- a/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/planning_evaluator_node.hpp +++ b/evaluator/autoware_planning_evaluator/include/autoware/planning_evaluator/planning_evaluator_node.hpp @@ -31,8 +31,8 @@ #include "autoware_planning_msgs/msg/trajectory_point.hpp" #include "geometry_msgs/msg/accel_with_covariance_stamped.hpp" #include "nav_msgs/msg/odometry.hpp" +#include #include -#include #include #include @@ -145,7 +145,8 @@ class PlanningEvaluatorNode : public rclcpp::Node autoware::universe_utils::InterProcessPollingSubscriber accel_sub_{ this, "~/input/acceleration"}; - rclcpp::Publisher::SharedPtr processing_time_pub_; + rclcpp::Publisher::SharedPtr + processing_time_pub_; rclcpp::Publisher::SharedPtr metrics_pub_; std::shared_ptr transform_listener_{nullptr}; std::unique_ptr tf_buffer_; diff --git a/evaluator/autoware_planning_evaluator/src/planning_evaluator_node.cpp b/evaluator/autoware_planning_evaluator/src/planning_evaluator_node.cpp index 5889f15e48390..53319ffa4c1fd 100644 --- a/evaluator/autoware_planning_evaluator/src/planning_evaluator_node.cpp +++ b/evaluator/autoware_planning_evaluator/src/planning_evaluator_node.cpp @@ -59,8 +59,8 @@ PlanningEvaluatorNode::PlanningEvaluatorNode(const rclcpp::NodeOptions & node_op output_metrics_ = declare_parameter("output_metrics"); ego_frame_str_ = declare_parameter("ego_frame"); - processing_time_pub_ = - this->create_publisher("~/debug/processing_time_ms", 1); + processing_time_pub_ = this->create_publisher( + "~/debug/processing_time_ms", 1); // List of metrics to calculate and publish metrics_pub_ = create_publisher("~/metrics", 1); @@ -282,7 +282,7 @@ void PlanningEvaluatorNode::onTimer() metrics_msg_ = MetricArrayMsg{}; // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); processing_time_pub_->publish(processing_time_msg); From e12bd85c41f8fa8aa1cdc67b528d39c1b3fec813 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Tue, 14 Jan 2025 12:20:54 +0900 Subject: [PATCH 075/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20to=20aut?= =?UTF-8?q?oware=5Finternal=5Fdebug=5Fmsgs=20in=20files=20contr=E2=80=A6?= =?UTF-8?q?=20(#9839)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs to autoware_internal_debug_msgs in files control/autoware_lane_departure_checker Signed-off-by: vish0012 From b5005b6bc117980991a5dd474924c4cb10ca7ed3 Mon Sep 17 00:00:00 2001 From: kobayu858 <129580202+kobayu858@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:44:01 +0900 Subject: [PATCH 076/127] fix(autoware_rtc_interface): fix bugprone-branch-clone (#9698) Signed-off-by: kobayu858 --- planning/autoware_rtc_interface/src/rtc_interface.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/planning/autoware_rtc_interface/src/rtc_interface.cpp b/planning/autoware_rtc_interface/src/rtc_interface.cpp index 47bc278c30564..7fcd0596b6b32 100644 --- a/planning/autoware_rtc_interface/src/rtc_interface.cpp +++ b/planning/autoware_rtc_interface/src/rtc_interface.cpp @@ -80,9 +80,7 @@ Module getModuleType(const std::string & module_name) module.type = Module::OCCLUSION_SPOT; } else if (module_name == "stop_line") { module.type = Module::NONE; - } else if (module_name == "traffic_light") { - module.type = Module::TRAFFIC_LIGHT; - } else if (module_name == "virtual_traffic_light") { + } else if (module_name == "traffic_light" || module_name == "virtual_traffic_light") { module.type = Module::TRAFFIC_LIGHT; } else if (module_name == "lane_change_left") { module.type = Module::LANE_CHANGE_LEFT; From 0715615b684e1a8b98a560ff2cd9ef03a1232783 Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:57:42 +0900 Subject: [PATCH 077/127] feat(lane_change): using frenet planner to generate lane change path when ego near terminal (#9767) * frenet planner Signed-off-by: Zulfaqar Azmi * minor refactoring Signed-off-by: Zulfaqar Azmi * adding parameter Signed-off-by: Zulfaqar Azmi * Add diff th param Signed-off-by: Zulfaqar Azmi * limit curvature for prepare segment Signed-off-by: Zulfaqar Azmi * minor refactoring Signed-off-by: Zulfaqar Azmi * print average curvature Signed-off-by: Zulfaqar Azmi * refactor Signed-off-by: Zulfaqar Azmi * filter the path directly Signed-off-by: Zulfaqar Azmi * fix some conflicts Signed-off-by: Zulfaqar Azmi * include curvature smoothing Signed-off-by: Zulfaqar Azmi * document Signed-off-by: Zulfaqar Azmi * fix image folder Signed-off-by: Zulfaqar Azmi * image size Signed-off-by: Zulfaqar Azmi * doxygen Signed-off-by: Zulfaqar Azmi * add debug for state Signed-off-by: Zulfaqar Azmi * use sign function instead Signed-off-by: Zulfaqar Azmi * rename argument Signed-off-by: Zulfaqar Azmi * readme Signed-off-by: Zulfaqar Azmi * fix failed test due to empty value Signed-off-by: Zulfaqar Azmi * add additional note Signed-off-by: Zulfaqar Azmi * fix conflict Signed-off-by: Zulfaqar Azmi --------- Signed-off-by: Zulfaqar Azmi --- .../README.md | 58 +++ .../config/lane_change.param.yaml | 7 + .../images/terminal_branched_frenet.png | Bin 0 -> 53664 bytes .../images/terminal_branched_path_shifter.png | Bin 0 -> 59599 bytes .../images/terminal_curved_frenet.png | Bin 0 -> 76194 bytes .../images/terminal_curved_path_shifter.png | Bin 0 -> 71940 bytes .../images/terminal_straight_frenet.png | Bin 0 -> 29125 bytes .../images/terminal_straight_path_shifter.png | Bin 0 -> 24433 bytes .../scene.hpp | 12 + .../structs/data.hpp | 1 + .../structs/debug.hpp | 15 + .../structs/parameters.hpp | 9 + .../structs/path.hpp | 37 +- .../utils/path.hpp | 62 ++- .../utils/utils.hpp | 46 +- .../package.xml | 1 + .../src/manager.cpp | 18 + .../src/scene.cpp | 100 +++- .../src/utils/markers.cpp | 119 +++-- .../src/utils/path.cpp | 471 +++++++++++++++++- .../src/utils/utils.cpp | 80 ++- .../src/frenet_planner/frenet_planner.cpp | 9 + 22 files changed, 991 insertions(+), 54 deletions(-) create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_branched_frenet.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_branched_path_shifter.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_curved_frenet.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_curved_path_shifter.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_straight_frenet.png create mode 100644 planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_straight_path_shifter.png diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index b4f848e0809aa..ee371f8592833 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -787,6 +787,51 @@ Depending on the space configuration around the Ego vehicle, it is possible that Additionally if terminal path feature is enabled and path is computed, stop point placement can be configured to be at the edge of the current lane instead of at the `terminal_start` position, as indicated by the dashed red line in the image above. +## Generating Path Using Frenet Planner + +!!! warning + + Generating path using Frenet planner applies only when ego is near terminal start + +If the ego vehicle is far from the terminal, the lane change module defaults to using the [path shifter](https://autowarefoundation.github.io/autoware.universe/main/planning/behavior_path_planner/autoware_behavior_path_planner_common/docs/behavior_path_planner_path_generation_design/). This ensures that the lane change is completed while the target lane remains a neighbor of the current lane. However, this approach may result in high curvature paths near the terminal, potentially causing long vehicles to deviate from the lane. + +To address this, the lane change module provides an option to choose between the path shifter and the [Frenet planner](https://autowarefoundation.github.io/autoware.universe/main/planning/sampling_based_planner/autoware_frenet_planner/). The Frenet planner allows for some flexibility in the lane change endpoint, extending the lane changing end point slightly beyond the current lane's neighbors. + +The following table provides comparisons between the planners + +

+ + + + + + + + + + + + + + + + +
With Path ShifterWith Frenet Planner
Path shifter result at straight laneletsFrenet planner result at straight lanelets
Path shifter result at branching laneletsFrenet planner result at branching lanelets
Path shifter result at curved laneletsFrenet planner result at curved lanelets
+
+ +!!! note + + The planner can be enabled or disabled using the `frenet.enable` flag. + +!!! note + + Since only a segment of the target lane is used as input to generate the lane change path, the end pose of the lane change segment may not smoothly connect to the target lane centerline. To address this, increase the value of `frenet.th_curvature_smoothing` to improve the smoothness. + +!!! note + + The yaw difference threshold (`frenet.th_yaw_diff`) limits the maximum curvature difference between the end of the prepare segment and the lane change segment. This threshold might prevent the generation of a lane change path when the lane curvature is high. In such cases, you can increase the frenet.th_yaw_diff value. However, note that if the prepare path was initially shifted by other modules, the resultant steering may not be continuous. + ## Aborting a Previously Approved Lane Change Once the lane change path is approved, there are several situations where we may need to abort the maneuver. The abort process is triggered when any of the following conditions is met @@ -1008,6 +1053,7 @@ The following parameters are configurable in [lane_change.param.yaml](https://gi | `trajectory.max_longitudinal_acc` | [m/s2] | double | maximum longitudinal acceleration for lane change | 1.0 | | `trajectory.min_longitudinal_acc` | [m/s2] | double | maximum longitudinal deceleration for lane change | -1.0 | | `trajectory.lane_changing_decel_factor` | [-] | double | longitudinal deceleration factor during lane changing phase | 0.5 | +| `trajectory.th_prepare_curvature` | [-] | double | If the maximum curvature of the prepare segment exceeds the threshold, the prepare segment is invalid. | 0.03 | | `min_length_for_turn_signal_activation` | [m] | double | Turn signal will be activated if the ego vehicle approaches to this length from minimum lane change length | 10.0 | | `lateral_acceleration.velocity` | [m/s] | double | Reference velocity for lateral acceleration calculation (look up table) | [0.0, 4.0, 10.0] | | `lateral_acceleration.min_values` | [m/s2] | double | Min lateral acceleration values corresponding to velocity (look up table) | [0.4, 0.4, 0.4] | @@ -1057,6 +1103,18 @@ The following parameters are used to configure terminal lane change path feature | `terminal_path.disable_near_goal` | [-] | bool | Flag to disable terminal path feature if ego is near goal | true | | `terminal_path.stop_at_boundary` | [-] | bool | If true, ego will stop at current lane boundary instead of middle of lane | false | +### Generating Lane Changing Path using Frenet Planner + +!!! warning + + Only applicable when ego is near terminal start + +| Name | Unit | Type | Description | Default value | +| :------------------------------ | ----- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `frenet.enable` | [-] | bool | Flag to enable/disable frenet planner when ego is near terminal start. | true | +| `frenet.th_yaw_diff` | [deg] | double | If the yaw diff between of the prepare segment's end and lane changing segment's start exceed the threshold , the lane changing segment is invalid. | 10.0 | +| `frenet.th_curvature_smoothing` | [-] | double | Filters and appends target path points with curvature below the threshold to candidate path. | 0.1 | + ### Collision checks #### Target Objects diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml index 91b296f8bd40f..df9491576a4ee 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml @@ -29,6 +29,7 @@ lon_acc_sampling_num: 5 lat_acc_sampling_num: 3 lane_changing_decel_factor: 0.5 + th_prepare_curvature: 0.03 # [/] # delay lane change delay_lane_change: @@ -37,6 +38,12 @@ min_road_shoulder_width: 0.5 # [m] th_parked_vehicle_shift_ratio: 0.6 + # trajectory generation near terminal using frenet planner + frenet: + enable: true + th_yaw_diff: 10.0 # [deg] + th_curvature_smoothing: 0.1 # [/] + # safety check safety_check: allow_loose_check_for_cancel: true diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_branched_frenet.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_branched_frenet.png new file mode 100644 index 0000000000000000000000000000000000000000..51f3a2fc46500039d3a136d93a7918b2de82cc36 GIT binary patch literal 53664 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 Y3kY*Xz9Xxr8vp;8S$x@Qq=RsK8%D5cvv0 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 literal 0 HcmV?d00001 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_curved_frenet.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_curved_frenet.png new file mode 100644 index 0000000000000000000000000000000000000000..f834a64867e6c0a62b37609f4c5eceb01361a9a8 GIT binary patch literal 76194 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

((%ZrwfGx>S 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 literal 0 HcmV?d00001 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_straight_frenet.png b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/images/terminal_straight_frenet.png new file mode 100644 index 0000000000000000000000000000000000000000..9a36642b2d5451830d70974a84715c7f2d16f9f1 GIT binary patch literal 29125 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 uM literal 0 HcmV?d00001 diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp index a8b7a670c881b..c11839f0356c6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/scene.hpp @@ -140,6 +140,18 @@ class NormalLaneChange : public LaneChangeBase bool get_lane_change_paths(LaneChangePaths & candidate_paths) const; + bool get_path_using_frenet( + const std::vector & prepare_metrics, + const lane_change::TargetObjects & target_objects, + const std::vector> & sorted_lane_ids, + LaneChangePaths & candidate_paths) const; + + bool get_path_using_path_shifter( + const std::vector & prepare_metrics, + const lane_change::TargetObjects & target_objects, + const std::vector> & sorted_lane_ids, + LaneChangePaths & candidate_paths) const; + bool check_candidate_path_safety( const LaneChangePath & candidate_path, const lane_change::TargetObjects & target_objects) const; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp index 9e6b9d229d2f2..c844b6b218d10 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/data.hpp @@ -269,6 +269,7 @@ struct CommonData LanesPolygonPtr lanes_polygon_ptr; TransientData transient_data; PathWithLaneId current_lanes_path; + PathWithLaneId target_lanes_path; ModuleType lc_type; Direction direction; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp index 589f2f20ba258..eb07d2f0d3704 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/debug.hpp @@ -39,6 +39,20 @@ struct MetricsDebug double max_lane_changing_length; }; +struct FrenetStateDebug +{ + LaneChangePhaseMetrics prep_metric; + frenet_planner::SamplingParameter sampling_parameter; + double max_lane_changing_length; + + FrenetStateDebug( + LaneChangePhaseMetrics prep_metric, frenet_planner::SamplingParameter sampling_param, + const double max_len) + : prep_metric(prep_metric), sampling_parameter(sampling_param), max_lane_changing_length(max_len) + { + } +}; + struct Debug { std::string module_type; @@ -52,6 +66,7 @@ struct Debug lanelet::ConstLanelets target_lanes; lanelet::ConstLanelets target_backward_lanes; std::vector lane_change_metrics; + std::vector frenet_states; double collision_check_object_debug_lifetime{0.0}; double distance_to_end_of_current_lane{std::numeric_limits::max()}; double distance_to_lane_change_finished{std::numeric_limits::max()}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp index b25dbc99189e8..f0adcb1d69b42 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp @@ -113,6 +113,13 @@ struct SafetyParameters CollisionCheckParameters collision_check{}; }; +struct FrenetPlannerParameters +{ + bool enable{true}; + double th_yaw_diff_deg{10.0}; + double th_curvature_smoothing{0.1}; +}; + struct TrajectoryParameters { double max_prepare_duration{4.0}; @@ -124,6 +131,7 @@ struct TrajectoryParameters double th_lane_changing_length_diff{0.5}; double min_lane_changing_velocity{5.6}; double lane_changing_decel_factor{0.5}; + double th_prepare_curvature{0.03}; int lon_acc_sampling_num{10}; int lat_acc_sampling_num{10}; LateralAccelerationMap lat_acc_map{}; @@ -151,6 +159,7 @@ struct Parameters CancelParameters cancel{}; DelayParameters delay{}; TerminalPathParameters terminal_path{}; + FrenetPlannerParameters frenet{}; // lane change parameters double backward_lane_length{200.0}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/path.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/path.hpp index 0fa0a9d977a26..0fa2c6cc8dfbc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/path.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/path.hpp @@ -19,19 +19,53 @@ #include "autoware/behavior_path_planner_common/turn_signal_decider.hpp" #include "autoware/behavior_path_planner_common/utils/path_shifter/path_shifter.hpp" +#include + #include +#include #include namespace autoware::behavior_path_planner::lane_change { +enum class PathType { ConstantJerk = 0, FrenetPlanner }; + using autoware::behavior_path_planner::TurnSignalInfo; using tier4_planning_msgs::msg::PathWithLaneId; +struct TrajectoryGroup +{ + PathWithLaneId prepare; + PathWithLaneId target_lane_ref_path; + std::vector target_lane_ref_path_dist; + LaneChangePhaseMetrics prepare_metric; + frenet_planner::Trajectory lane_changing; + frenet_planner::FrenetState initial_state; + double max_lane_changing_length{0.0}; + + TrajectoryGroup() = default; + TrajectoryGroup( + PathWithLaneId prepare, PathWithLaneId target_lane_ref_path, + std::vector target_lane_ref_path_dist, LaneChangePhaseMetrics prepare_metric, + frenet_planner::Trajectory lane_changing, frenet_planner::FrenetState initial_state, + const double max_lane_changing_length) + : prepare(std::move(prepare)), + target_lane_ref_path(std::move(target_lane_ref_path)), + target_lane_ref_path_dist(std::move(target_lane_ref_path_dist)), + prepare_metric(prepare_metric), + lane_changing(std::move(lane_changing)), + initial_state(initial_state), + max_lane_changing_length(max_lane_changing_length) + { + } +}; + struct Path { + Info info; PathWithLaneId path; ShiftedPath shifted_path; - Info info; + TrajectoryGroup frenet_path; + PathType type = PathType::ConstantJerk; }; struct Status @@ -39,7 +73,6 @@ struct Status Path lane_change_path; bool is_safe{false}; bool is_valid_path{false}; - double start_distance{0.0}; }; } // namespace autoware::behavior_path_planner::lane_change diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp index 77ba8fe68a653..42586e7b1df92 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/path.hpp @@ -11,7 +11,6 @@ // 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 AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__PATH_HPP_ #define AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__PATH_HPP_ @@ -26,6 +25,7 @@ namespace autoware::behavior_path_planner::utils::lane_change { using behavior_path_planner::LaneChangePath; using behavior_path_planner::lane_change::CommonDataPtr; +using behavior_path_planner::lane_change::TrajectoryGroup; /** * @brief Generates a prepare segment for a lane change maneuver. @@ -98,5 +98,65 @@ LaneChangePath construct_candidate_path( const LaneChangeInfo & lane_change_info, const PathWithLaneId & prepare_segment, const PathWithLaneId & target_lane_reference_path, const std::vector> & sorted_lane_ids); + +/** + * @brief Generates candidate trajectories in the Frenet frame for a lane change maneuver. + * + * This function computes a set of candidate trajectories for the ego vehicle in the Frenet frame, + * based on the provided metrics, target lane reference path, and preparation segments. It ensures + * that the generated trajectories adhere to specified constraints, such as lane boundaries and + * velocity limits, while optimizing for smoothness and curvature. + * + * @param common_data_ptr Shared pointer to CommonData containing route, lane, and transient + * information. + * @param prev_module_path The previous module's path used as a base for preparation segments. + * @param prep_metric Metrics for the preparation phase, including path length and velocity. + * + * @return std::vector A vector of trajectory groups representing + * valid lane change candidates, each containing the prepare segment, target reference path, and + * Frenet trajectory. + */ +std::vector generate_frenet_candidates( + const CommonDataPtr & common_data_ptr, const PathWithLaneId & prev_module_path, + const std::vector & prep_metrics); + +/** + * @brief Constructs a lane change path candidate based on a Frenet trajectory group. + * + * This function generates a candidate lane change path by converting a Frenet trajectory group + * into a shifted path and combining it with a prepare segment. It validates the path's feasibility + * by ensuring yaw differences are within allowable thresholds and calculates lane change + * information, such as acceleration, velocity, and duration. + * + * @param trajectory_group A Frenet trajectory group containing the prepared path and Frenet + * trajectory data. + * @param common_data_ptr Shared pointer to CommonData providing parameters and constraints for lane + * changes. + * @param sorted_lane_ids A vector of sorted lane IDs used to update the lane IDs in the path. + * + * @return std::optional The constructed candidate lane change path if valid, or + * std::nullopt if the path is not feasible. + * + * @throws std::logic_error If the yaw difference exceeds the threshold, or other critical errors + * occur. + */ +std::optional get_candidate_path( + const TrajectoryGroup & trajectory_group, const CommonDataPtr & common_data_ptr, + const std::vector> & sorted_lane_ids); + +/** + * @brief Appends the target lane reference path to the candidate lane change path. + * + * This function extends the lane change candidate path by appending points from the + * target lane reference path beyond the lane change end position. The appending process + * is constrained by a curvature threshold to ensure smooth transitions and avoid sharp turns. + * + * @param frenet_candidate The candidate lane change path to which the target reference path is + * appended. This includes the lane change path and associated Frenet trajectory data. + * @param th_curvature_smoothing A threshold for the allowable curvature during the extension + * process. Points with curvature exceeding this threshold are excluded. + */ +void append_target_ref_to_candidate(LaneChangePath & frenet_candidate, const double th_curvature); } // namespace autoware::behavior_path_planner::utils::lane_change + #endif // AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__PATH_HPP_ diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp index 69362994dbbac..422c392cac462 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp @@ -24,6 +24,8 @@ #include #include +#include +#include #include #include @@ -56,6 +58,7 @@ using behavior_path_planner::lane_change::LCParamPtr; using behavior_path_planner::lane_change::ModuleType; using behavior_path_planner::lane_change::PathSafetyStatus; using behavior_path_planner::lane_change::TargetLaneLeadingObjects; +using behavior_path_planner::lane_change::TrajectoryGroup; using geometry_msgs::msg::Point; using geometry_msgs::msg::Pose; using geometry_msgs::msg::Twist; @@ -69,9 +72,27 @@ bool is_mandatory_lane_change(const ModuleType lc_type); void set_prepare_velocity( PathWithLaneId & prepare_segment, const double current_velocity, const double prepare_velocity); -std::vector replaceWithSortedIds( - const std::vector & original_lane_ids, - const std::vector> & sorted_lane_ids); +/** + * @brief Replaces the current lane IDs with a sorted set of IDs based on a predefined mapping. + * + * This function checks if the current lane IDs match the previously processed lane IDs. + * If they do, it returns the previously sorted IDs for efficiency. Otherwise, it matches + * the current lane IDs to the appropriate sorted IDs from the provided mapping and updates + * the cached values. + * + * @param current_lane_ids The current lane IDs to be replaced or verified. + * @param sorted_lane_ids A vector of sorted lane ID groups, each representing a predefined + * order of IDs for specific conditions. + * @param prev_lane_ids Reference to the previously processed lane IDs for caching purposes. + * @param prev_sorted_lane_ids Reference to the previously sorted lane IDs for caching purposes. + * + * @return std::vector The sorted lane IDs if a match is found, or the original + * `current_lane_ids` if no match exists. + */ +std::vector replace_with_sorted_ids( + const std::vector & current_lane_ids, + const std::vector> & sorted_lane_ids, std::vector & prev_lane_ids, + std::vector & prev_sorted_lane_ids); std::vector> get_sorted_lane_ids(const CommonDataPtr & common_data_ptr); @@ -432,5 +453,24 @@ std::vector> convert_to_predicted_paths( * @return true if the pose is within the target or target neighbor polygons, false otherwise. */ bool is_valid_start_point(const lane_change::CommonDataPtr & common_data_ptr, const Pose & pose); + +/** + * @brief Converts a lane change frenet candidate into a predicted path for the ego vehicle. + * + * This function generates a predicted path based on the provided Frenet candidate, + * simulating the vehicle's trajectory during the preparation and lane-changing phases. + * It interpolates poses and velocities over the duration of the prediction, considering + * the ego vehicle's initial conditions and the candidate's trajectory data. + * + * @param common_data_ptr Shared pointer to CommonData containing parameters and ego vehicle state. + * @param frenet_candidate A Frenet trajectory group representing the lane change candidate. + * @param deceleration_sampling_num Unused parameter for deceleration sampling count. + * + * @return std::vector The predicted path as a series of stamped poses + * with associated velocities over the prediction time. + */ +std::vector convert_to_predicted_path( + const CommonDataPtr & common_data_ptr, const lane_change::TrajectoryGroup & frenet_candidate, + [[maybe_unused]] const size_t deceleration_sampling_num); } // namespace autoware::behavior_path_planner::utils::lane_change #endif // AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__UTILS_HPP_ diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/package.xml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/package.xml index fad98ecf8f8e1..cf7600556080e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/package.xml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/package.xml @@ -23,6 +23,7 @@ autoware_behavior_path_planner autoware_behavior_path_planner_common + autoware_frenet_planner autoware_motion_utils autoware_rtc_interface autoware_universe_utils diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index ec000b8fee97c..06a9d505f90ad 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -63,6 +63,8 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s getOrDeclareParameter(*node, parameter("trajectory.min_lane_changing_velocity")); p.trajectory.lane_changing_decel_factor = getOrDeclareParameter(*node, parameter("trajectory.lane_changing_decel_factor")); + p.trajectory.th_prepare_curvature = + getOrDeclareParameter(*node, parameter("trajectory.th_prepare_curvature")); p.trajectory.lon_acc_sampling_num = getOrDeclareParameter(*node, parameter("trajectory.lon_acc_sampling_num")); p.trajectory.lat_acc_sampling_num = @@ -213,6 +215,12 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s p.delay.th_parked_vehicle_shift_ratio = getOrDeclareParameter( *node, parameter("delay_lane_change.th_parked_vehicle_shift_ratio")); + // trajectory generation near terminal using frenet planner + p.frenet.enable = getOrDeclareParameter(*node, parameter("frenet.enable")); + p.frenet.th_yaw_diff_deg = getOrDeclareParameter(*node, parameter("frenet.th_yaw_diff")); + p.frenet.th_curvature_smoothing = + getOrDeclareParameter(*node, parameter("frenet.th_curvature_smoothing")); + // lane change cancel p.cancel.enable_on_prepare_phase = getOrDeclareParameter(*node, parameter("cancel.enable_on_prepare_phase")); @@ -338,6 +346,8 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortrajectory.max_longitudinal_acc); updateParam( parameters, ns + "lane_changing_decel_factor", p->trajectory.lane_changing_decel_factor); + updateParam( + parameters, ns + "th_prepare_curvature", p->trajectory.th_prepare_curvature); int longitudinal_acc_sampling_num = 0; updateParam(parameters, ns + "lon_acc_sampling_num", longitudinal_acc_sampling_num); if (longitudinal_acc_sampling_num > 0) { @@ -356,6 +366,14 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortrajectory.th_lane_changing_length_diff); } + { + const std::string ns = "lane_change.frenet."; + updateParam(parameters, ns + "enable", p->frenet.enable); + updateParam(parameters, ns + "th_yaw_diff", p->frenet.th_yaw_diff_deg); + updateParam( + parameters, ns + "th_curvature_smoothing", p->frenet.th_curvature_smoothing); + } + { const std::string ns = "lane_change.safety_check.lane_expansion."; updateParam(parameters, ns + "left_offset", p->safety.lane_expansion_left_offset); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 88f58debb886a..7748795851865 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -28,7 +28,10 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -36,8 +39,11 @@ #include #include +#include + #include #include +#include #include #include @@ -104,6 +110,9 @@ void NormalLaneChange::update_lanes(const bool is_approved) common_data_ptr_->current_lanes_path = route_handler_ptr->getCenterLinePath(current_lanes, 0.0, std::numeric_limits::max()); + common_data_ptr_->target_lanes_path = + route_handler_ptr->getCenterLinePath(target_lanes, 0.0, std::numeric_limits::max()); + common_data_ptr_->lanes_ptr->target_neighbor = utils::lane_change::get_target_neighbor_lanes( *route_handler_ptr, current_lanes, common_data_ptr_->lc_type); @@ -232,8 +241,6 @@ void NormalLaneChange::updateLaneChangeStatus() // Update status status_.is_valid_path = found_valid_path; status_.is_safe = found_safe_path; - - status_.start_distance = common_data_ptr_->transient_data.target_lanes_ego_arc.length; status_.lane_change_path.path.header = getRouteHeader(); } @@ -1124,15 +1131,92 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) } const auto & current_lanes = get_current_lanes(); - const auto & target_lanes = get_target_lanes(); - const auto sorted_lane_ids = utils::lane_change::get_sorted_lane_ids(common_data_ptr_); const auto target_objects = get_target_objects(filtered_objects_, current_lanes); const auto prepare_phase_metrics = get_prepare_metrics(); + const auto sorted_lane_ids = utils::lane_change::get_sorted_lane_ids(common_data_ptr_); + if ( + common_data_ptr_->lc_param_ptr->frenet.enable && + common_data_ptr_->transient_data.is_ego_near_current_terminal_start) { + return get_path_using_frenet( + prepare_phase_metrics, target_objects, sorted_lane_ids, candidate_paths); + } + + return get_path_using_path_shifter( + prepare_phase_metrics, target_objects, sorted_lane_ids, candidate_paths); +} + +bool NormalLaneChange::get_path_using_frenet( + const std::vector & prepare_metrics, + const lane_change::TargetObjects & target_objects, + const std::vector> & sorted_lane_ids, + LaneChangePaths & candidate_paths) const +{ + stop_watch_.tic("frenet_candidates"); + constexpr auto found_safe_path = true; + const auto frenet_candidates = utils::lane_change::generate_frenet_candidates( + common_data_ptr_, prev_module_output_.path, prepare_metrics); + RCLCPP_DEBUG( + logger_, "Generated %lu candidate paths in %2.2f[us]", frenet_candidates.size(), + stop_watch_.toc("frenet_candidates")); + + candidate_paths.reserve(frenet_candidates.size()); + lane_change_debug_.frenet_states.clear(); + lane_change_debug_.frenet_states.reserve(frenet_candidates.size()); + for (const auto & frenet_candidate : frenet_candidates) { + lane_change_debug_.frenet_states.emplace_back( + frenet_candidate.prepare_metric, frenet_candidate.lane_changing.sampling_parameter, + frenet_candidate.max_lane_changing_length); + + std::optional candidate_path_opt; + try { + candidate_path_opt = + utils::lane_change::get_candidate_path(frenet_candidate, common_data_ptr_, sorted_lane_ids); + } catch (const std::exception & e) { + RCLCPP_DEBUG(logger_, "%s", e.what()); + } + + if (!candidate_path_opt) { + continue; + } + + try { + if (check_candidate_path_safety(*candidate_path_opt, target_objects)) { + RCLCPP_DEBUG( + logger_, "Found safe path after %lu candidate(s). Total time: %2.2f[us]", + frenet_candidates.size(), stop_watch_.toc("frenet_candidates")); + utils::lane_change::append_target_ref_to_candidate( + *candidate_path_opt, common_data_ptr_->lc_param_ptr->frenet.th_curvature_smoothing); + candidate_paths.push_back(*candidate_path_opt); + return found_safe_path; + } + } catch (const std::exception & e) { + RCLCPP_DEBUG(logger_, "%s", e.what()); + } + + // appending all paths affect performance + if (candidate_paths.empty()) { + candidate_paths.push_back(*candidate_path_opt); + } + } + + RCLCPP_DEBUG( + logger_, "No safe path after %lu candidate(s). Total time: %2.2f[us]", frenet_candidates.size(), + stop_watch_.toc("frenet_candidates")); + return !found_safe_path; +} + +bool NormalLaneChange::get_path_using_path_shifter( + const std::vector & prepare_metrics, + const lane_change::TargetObjects & target_objects, + const std::vector> & sorted_lane_ids, + LaneChangePaths & candidate_paths) const +{ + const auto & target_lanes = get_target_lanes(); candidate_paths.reserve( - prepare_phase_metrics.size() * lane_change_parameters_->trajectory.lat_acc_sampling_num); + prepare_metrics.size() * lane_change_parameters_->trajectory.lat_acc_sampling_num); const bool only_tl = getStopTime() >= lane_change_parameters_->th_stop_time; const auto dist_to_next_regulatory_element = @@ -1151,7 +1235,7 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) return lc_diff > lane_change_parameters_->trajectory.th_lane_changing_length_diff; }; - for (const auto & prep_metric : prepare_phase_metrics) { + for (const auto & prep_metric : prepare_metrics) { const auto debug_print = [&](const std::string & s) { RCLCPP_DEBUG( logger_, "%s | prep_time: %.5f | lon_acc: %.5f | prep_len: %.5f", s.c_str(), @@ -1195,7 +1279,7 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) prepare_segment, common_data_ptr_->get_ego_speed(), prep_metric.velocity); for (const auto & lc_metric : lane_changing_metrics) { - debug_metrics.lc_metrics.push_back({lc_metric, -1}); + debug_metrics.lc_metrics.emplace_back(lc_metric, -1); const auto debug_print_lat = [&](const std::string & s) { RCLCPP_DEBUG( @@ -1218,7 +1302,7 @@ bool NormalLaneChange::get_lane_change_paths(LaneChangePaths & candidate_paths) } candidate_paths.push_back(candidate_path); - debug_metrics.lc_metrics.back().second = candidate_paths.size() - 1; + debug_metrics.lc_metrics.back().second = static_cast(candidate_paths.size()) - 1; try { if (check_candidate_path_safety(candidate_path, target_objects)) { diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp index ef899cceea0d4..bf0af0d133dc7 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp @@ -73,6 +73,34 @@ MarkerArray showAllValidLaneChangePath( marker.points.push_back(point.point.pose.position); } + const auto & info = lc_path.info; + auto text_marker = createDefaultMarker( + "map", current_time, ns_with_idx, ++id, visualization_msgs::msg::Marker::TEXT_VIEW_FACING, + createMarkerScale(0.1, 0.1, 0.8), colors::yellow()); + const auto prep_idx = points.size() / 4; + text_marker.pose = points.at(prep_idx).point.pose; + text_marker.pose.position.z += 2.0; + text_marker.text = fmt::format( + "vel: {vel:.3f}[m/s] | lon_acc: {lon_acc:.3f}[m/s2] | t: {time:.3f}[s] | L: {length:.3f}[m]", + fmt::arg("vel", info.velocity.prepare), + fmt::arg("lon_acc", info.longitudinal_acceleration.prepare), + fmt::arg("time", info.duration.prepare), fmt::arg("length", info.length.prepare)); + marker_array.markers.push_back(text_marker); + + const auto lc_idx = points.size() / 2; + text_marker.id = ++id; + text_marker.pose = points.at(lc_idx).point.pose; + text_marker.text = fmt::format( + "type: {type} | vel: {vel:.3f}[m/s] | lon_acc: {lon_acc:.3f}[m/s2] | lat_acc: " + "{lat_acc:.3f}[m/s2] | t: " + "{time:.3f}[s] | L: {length:.3f}[m]", + fmt::arg("type", magic_enum::enum_name(lc_path.type)), + fmt::arg("vel", info.velocity.lane_changing), + fmt::arg("lon_acc", info.longitudinal_acceleration.lane_changing), + fmt::arg("lat_acc", info.lateral_acceleration), fmt::arg("time", info.duration.lane_changing), + fmt::arg("length", info.length.lane_changing)); + marker_array.markers.push_back(text_marker); + marker_array.markers.push_back(marker); } return marker_array; @@ -171,43 +199,78 @@ MarkerArray ShowLaneChangeMetricsInfo( const Debug & debug_data, const geometry_msgs::msg::Pose & pose) { MarkerArray marker_array; - if (debug_data.lane_change_metrics.empty()) { - return marker_array; - } auto text_marker = createDefaultMarker( "map", rclcpp::Clock{RCL_ROS_TIME}.now(), "sampling_metrics", 0, Marker::TEXT_VIEW_FACING, createMarkerScale(0.6, 0.6, 0.6), colors::yellow()); text_marker.pose = autoware::universe_utils::calcOffsetPose(pose, 10.0, 15.0, 0.0); - text_marker.text = - fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lat_accel[m/s2]") + - fmt::format("{:^18}|", "lon_accel[m/s2]") + fmt::format("{:^17}|", "velocity[m/s]") + - fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + - fmt::format("{:^20}|", "max_length_th[m]") + fmt::format("{:^15}\n", "path_index"); - for (const auto & metrics : debug_data.lane_change_metrics) { - text_marker.text += fmt::format("{:-<190}\n", ""); - const auto & p_m = metrics.prep_metric; - text_marker.text += - fmt::format("{:<17}", "prep_metrics:") + fmt::format("{:^10.3f}", p_m.lat_accel) + - fmt::format("{:^21.3f}", p_m.actual_lon_accel) + fmt::format("{:^12.3f}", p_m.velocity) + - fmt::format("{:^15.3f}", p_m.duration) + fmt::format("{:^15.3f}", p_m.length) + - fmt::format("{:^17.3f}", metrics.max_prepare_length) + fmt::format("{:^15}\n", "-"); - text_marker.text += fmt::format("{:<20}\n", "lc_metrics:"); - for (const auto & lc_m : metrics.lc_metrics) { - const auto & metric = lc_m.first; - const auto path_index = lc_m.second < 0 ? "-" : std::to_string(lc_m.second); - text_marker.text += fmt::format("{:<15}", "") + fmt::format("{:^10.3f}", metric.lat_accel) + - fmt::format("{:^21.3f}", metric.actual_lon_accel) + - fmt::format("{:^12.3f}", metric.velocity) + - fmt::format("{:^15.3f}", metric.duration) + - fmt::format("{:^15.3f}", metric.length) + - fmt::format("{:^17.3f}", metrics.max_lane_changing_length) + - fmt::format("{:^15}\n", path_index); + if (!debug_data.lane_change_metrics.empty()) { + text_marker.text = + fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lat_accel[m/s2]") + + fmt::format("{:^18}|", "lon_accel[m/s2]") + fmt::format("{:^17}|", "velocity[m/s]") + + fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + + fmt::format("{:^20}|", "max_length_th[m]") + fmt::format("{:^15}\n", "path_index"); + for (const auto & metrics : debug_data.lane_change_metrics) { + text_marker.text += fmt::format("{:-<190}\n", ""); + const auto & p_m = metrics.prep_metric; + text_marker.text += + fmt::format("{:<17}", "prep_metrics:") + fmt::format("{:^10.3f}", p_m.lat_accel) + + fmt::format("{:^21.3f}", p_m.actual_lon_accel) + fmt::format("{:^12.3f}", p_m.velocity) + + fmt::format("{:^15.3f}", p_m.duration) + fmt::format("{:^15.3f}", p_m.length) + + fmt::format("{:^17.3f}", metrics.max_prepare_length) + fmt::format("{:^15}\n", "-"); + text_marker.text += fmt::format("{:<20}\n", "lc_metrics:"); + for (const auto & lc_m : metrics.lc_metrics) { + const auto & metric = lc_m.first; + const auto path_index = lc_m.second < 0 ? "-" : std::to_string(lc_m.second); + text_marker.text += fmt::format("{:<15}", "") + fmt::format("{:^10.3f}", metric.lat_accel) + + fmt::format("{:^21.3f}", metric.actual_lon_accel) + + fmt::format("{:^12.3f}", metric.velocity) + + fmt::format("{:^15.3f}", metric.duration) + + fmt::format("{:^15.3f}", metric.length) + + fmt::format("{:^17.3f}", metrics.max_lane_changing_length) + + fmt::format("{:^15}\n", path_index); + } } + marker_array.markers.push_back(text_marker); + } + + if (!debug_data.frenet_states.empty()) { + text_marker.text = fmt::format("{:<12}", "") + fmt::format("{:^18}|", "lon_accel[m/s2]") + + fmt::format("{:^17}|", "lon_vel[m/s]") + + fmt::format("{:^15}|", "duration[s]") + fmt::format("{:^15}|", "length[m]") + + fmt::format("{:^17}|", "lat_accel[m/s2]") + + fmt::format("{:^15}|", "lat_vel[m/s2]") + fmt::format("{:^15}|", "s[m]") + + fmt::format("{:^15}|", "d[m]") + fmt::format("{:^20}\n", "max_length_th[m]"); + for (const auto & metrics : debug_data.frenet_states) { + text_marker.text += fmt::format("{:-<250}\n", ""); + const auto & p_m = metrics.prep_metric; + const auto max_len = metrics.max_lane_changing_length; + text_marker.text += + fmt::format("{:<17}", "prep_metrics:") + fmt::format("{:^13.3f}", p_m.actual_lon_accel) + + fmt::format("{:^15.3f}", p_m.velocity) + fmt::format("{:^15.3f}", p_m.duration) + + fmt::format("{:^12.3f}", p_m.length) + + fmt::format("{:^13}", "") + // Empty string for lat_accel + fmt::format("{:^13}", "") + // Empty string for lat_vel + fmt::format("{:^15}", "") + // Empty string for s + fmt::format("{:^15}", "") + // Empty string for d // Empty string for d + fmt::format("{:^20.3f}\n", max_len); // Empty string for max_length_t + const auto & lc_m = metrics.sampling_parameter.target_state; // Assuming lc_metric exists + const auto duration = metrics.sampling_parameter.target_duration; + text_marker.text += + fmt::format("{:<17}", "frenet_state:") + + fmt::format("{:^15.3f}", lc_m.longitudinal_acceleration) + + fmt::format("{:^13.3f}", lc_m.longitudinal_velocity) + fmt::format("{:^17.3f}", duration) + + fmt::format("{:^10.3f}", lc_m.position.s) + + fmt::format("{:^19.3f}", lc_m.lateral_acceleration) + + fmt::format("{:^10.3f}", lc_m.lateral_velocity) + + fmt::format("{:^18.3f}", lc_m.position.s) + fmt::format("{:^15.3f}", lc_m.position.d) + + fmt::format("{:^16.3f}\n", max_len); // Empty string for max_length_t + } + + marker_array.markers.push_back(text_marker); } - marker_array.markers.push_back(text_marker); return marker_array; } diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp index 44ee1624f0f51..df45da3f08fa1 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/path.cpp @@ -15,17 +15,22 @@ #include "autoware/behavior_path_lane_change_module/utils/path.hpp" #include "autoware/behavior_path_lane_change_module/structs/data.hpp" +#include "autoware/behavior_path_lane_change_module/utils/calculation.hpp" #include "autoware/behavior_path_lane_change_module/utils/utils.hpp" #include "autoware/behavior_path_planner_common/utils/path_utils.hpp" #include "autoware/behavior_path_planner_common/utils/utils.hpp" #include #include +#include #include +#include #include #include #include +#include + #include #include #include @@ -42,8 +47,22 @@ using autoware::behavior_path_planner::lane_change::LCParamPtr; using autoware::behavior_path_planner::LaneChangePhaseMetrics; using autoware::behavior_path_planner::ShiftLine; +using autoware::behavior_path_planner::lane_change::TrajectoryGroup; +using autoware::frenet_planner::FrenetState; +using autoware::frenet_planner::SamplingParameters; +using autoware::route_handler::Direction; +using autoware::sampler_common::FrenetPoint; +using autoware::sampler_common::transform::Spline2D; +using autoware::universe_utils::LineString2d; +using autoware::universe_utils::Point2d; using geometry_msgs::msg::Pose; +template +T sign(const Direction direction) +{ + return static_cast(direction == Direction::LEFT ? 1.0 : -1.0); +} + double calc_resample_interval( const double lane_changing_length, const double lane_changing_velocity) { @@ -53,7 +72,7 @@ double calc_resample_interval( lane_changing_length / min_resampling_points, lane_changing_velocity * resampling_dt); } -PathWithLaneId get_reference_path_from_target_Lane( +PathWithLaneId get_reference_path_from_target_lane( const CommonDataPtr & common_data_ptr, const Pose & lane_changing_start_pose, const double lane_changing_length, const double resample_interval) { @@ -146,11 +165,197 @@ std::optional exceed_yaw_threshold( } return std::nullopt; } + +Spline2D init_reference_spline(const std::vector & target_lanes_ref_path) +{ + std::vector xs; + std::vector ys; + xs.reserve(target_lanes_ref_path.size()); + ys.reserve(target_lanes_ref_path.size()); + for (const auto & p : target_lanes_ref_path) { + xs.push_back(p.point.pose.position.x); + ys.push_back(p.point.pose.position.y); + } + + return {xs, ys}; +} + +FrenetState init_frenet_state( + const FrenetPoint & start_position, const LaneChangePhaseMetrics & prepare_metrics) +{ + FrenetState initial_state; + initial_state.position = start_position; + initial_state.longitudinal_velocity = prepare_metrics.velocity; + initial_state.lateral_velocity = + 0.0; // TODO(Maxime): this can be sampled if we want but it would impact the LC duration + initial_state.longitudinal_acceleration = prepare_metrics.sampled_lon_accel; + initial_state.lateral_acceleration = prepare_metrics.lat_accel; + return initial_state; +} + +std::optional init_sampling_parameters( + const CommonDataPtr & common_data_ptr, const LaneChangePhaseMetrics & prepare_metrics, + const FrenetState & initial_state, const Spline2D & ref_spline, const Pose & lc_start_pose) +{ + const auto & trajectory = common_data_ptr->lc_param_ptr->trajectory; + const auto min_lc_vel = trajectory.min_lane_changing_velocity; + const auto [min_lateral_acc, max_lateral_acc] = + trajectory.lat_acc_map.find(std::max(min_lc_vel, prepare_metrics.velocity)); + const auto duration = autoware::motion_utils::calc_shift_time_from_jerk( + std::abs(initial_state.position.d), trajectory.lateral_jerk, max_lateral_acc); + const auto final_velocity = + std::max(min_lc_vel, prepare_metrics.velocity + prepare_metrics.sampled_lon_accel * duration); + const auto lc_length = duration * (prepare_metrics.velocity + final_velocity) * 0.5; + const auto target_s = initial_state.position.s + lc_length; + const auto initial_yaw = tf2::getYaw(lc_start_pose.orientation); + const auto target_lat_vel = + (1.0 - ref_spline.curvature(target_s + 1e-3) * initial_state.position.d) * + std::tan(initial_yaw - ref_spline.yaw(target_s)); + + if (std::isnan(target_lat_vel)) { + return std::nullopt; + } + + SamplingParameters sampling_parameters; + const auto & safety = common_data_ptr->lc_param_ptr->safety; + sampling_parameters.resolution = safety.collision_check.prediction_time_resolution; + sampling_parameters.parameters.emplace_back(); + sampling_parameters.parameters.back().target_duration = duration; + sampling_parameters.parameters.back().target_state.position = {target_s, 0.0}; + // TODO(Maxime): not sure if we should use curvature at initial or target s + sampling_parameters.parameters.back().target_state.lateral_velocity = + sign(common_data_ptr->direction) * target_lat_vel; + sampling_parameters.parameters.back().target_state.lateral_acceleration = 0.0; + sampling_parameters.parameters.back().target_state.longitudinal_velocity = final_velocity; + sampling_parameters.parameters.back().target_state.longitudinal_acceleration = + prepare_metrics.sampled_lon_accel; + return sampling_parameters; +} + +std::vector calc_curvatures( + const std::vector & points, const Pose & current_pose) +{ + const auto nearest_segment_idx = + autoware::motion_utils::findNearestSegmentIndex(points, current_pose.position); + + // Ignore all path points behind ego vehicle. + if (points.size() <= nearest_segment_idx + 2) { + return {}; + } + + std::vector curvatures; + curvatures.reserve(points.size() - nearest_segment_idx + 2); + for (const auto & [p1, p2, p3] : ranges::views::zip( + points | ranges::views::drop(nearest_segment_idx), + points | ranges::views::drop(nearest_segment_idx + 1), + points | ranges::views::drop(nearest_segment_idx + 2))) { + const auto point1 = autoware::universe_utils::getPoint(p1); + const auto point2 = autoware::universe_utils::getPoint(p2); + const auto point3 = autoware::universe_utils::getPoint(p3); + + curvatures.push_back(autoware::universe_utils::calcCurvature(point1, point2, point3)); + } + + return curvatures; +} + +double calc_average_curvature(const std::vector & curvatures) +{ + const auto filter_zeros = [](const auto & k) { return k != 0.0; }; + auto filtered_k = curvatures | ranges::views::filter(filter_zeros); + if (filtered_k.empty()) { + return 0.0; + } + const auto sums_of_curvatures = [](float sum, const double k) { return sum + std::abs(k); }; + const auto sum_of_k = ranges::accumulate(filtered_k, 0.0, sums_of_curvatures); + const auto count_k = static_cast(ranges::distance(filtered_k)); + return sum_of_k / count_k; +} + +LineString2d get_linestring_bound(const lanelet::ConstLanelets & lanes, const Direction direction) +{ + LineString2d line_string; + const auto & get_bound = [&](const lanelet::ConstLanelet & lane) { + return (direction == Direction::LEFT) ? lane.leftBound2d() : lane.rightBound2d(); + }; + + const auto reserve_size = ranges::accumulate( + lanes, 0UL, + [&](auto sum, const lanelet::ConstLanelet & lane) { return sum + get_bound(lane).size(); }); + line_string.reserve(reserve_size); + for (const auto & lane : lanes) { + ranges::for_each(get_bound(lane), [&line_string](const auto & point) { + boost::geometry::append(line_string, Point2d(point.x(), point.y())); + }); + } + return line_string; +} + +Point2d shift_point(const Point2d & p1, const Point2d & p2, const double offset) +{ + // Calculate the perpendicular vector + double dx = p2.x() - p1.x(); + double dy = p2.y() - p1.y(); + double length = std::sqrt(dx * dx + dy * dy); + + // Normalize and find the perpendicular direction + double nx = -dy / length; + double ny = dx / length; + + return {p1.x() + nx * offset, p1.y() + ny * offset}; +} + +bool check_out_of_bound_paths( + const CommonDataPtr & common_data_ptr, const std::vector & lane_changing_poses, + const LineString2d & lane_boundary, const Direction direction) +{ + const auto distance = (0.5 * common_data_ptr->bpp_param_ptr->vehicle_width + 0.1); + const auto offset = sign(direction) * distance; // invert direction + if (lane_changing_poses.size() <= 2) { + return true; // Remove candidates with insufficient poses + } + + LineString2d path_ls; + path_ls.reserve(lane_changing_poses.size()); + + const auto segments = lane_changing_poses | ranges::views::sliding(2); + ranges::for_each(segments | ranges::views::drop(1), [&](const auto & segment) { + const auto & p1 = segment[0].position; + const auto & p2 = segment[1].position; + boost::geometry::append(path_ls, shift_point({p2.x, p2.y}, {p1.x, p1.y}, offset)); + }); + + return boost::geometry::disjoint(path_ls, lane_boundary); // Remove if disjoint +} + +double calc_limit(const CommonDataPtr & common_data_ptr, const Pose & lc_end_pose) +{ + const auto dist_to_target_end = std::invoke([&]() { + if (common_data_ptr->lanes_ptr->target_lane_in_goal_section) { + return autoware::motion_utils::calcSignedArcLength( + common_data_ptr->target_lanes_path.points, lc_end_pose.position, + common_data_ptr->route_handler_ptr->getGoalPose().position); + } + return autoware::motion_utils::calcSignedArcLength( + common_data_ptr->target_lanes_path.points, lc_end_pose.position, + common_data_ptr->target_lanes_path.points.back().point.pose.position); + }); + + // v2 = u2 + 2ad + // u = sqrt(2ad) + return std::clamp( + std::sqrt( + std::abs(2.0 * common_data_ptr->bpp_param_ptr->min_acc * std::max(dist_to_target_end, 0.0))), + common_data_ptr->lc_param_ptr->trajectory.min_lane_changing_velocity, + common_data_ptr->bpp_param_ptr->max_vel); +} + }; // namespace namespace autoware::behavior_path_planner::utils::lane_change { using behavior_path_planner::lane_change::CommonDataPtr; +using behavior_path_planner::lane_change::PathType; bool get_prepare_segment( const CommonDataPtr & common_data_ptr, const PathWithLaneId & prev_module_path, @@ -187,7 +392,17 @@ bool get_prepare_segment( throw std::logic_error("lane change start is behind target lanelet!"); } - return true; + const auto curvatures = calc_curvatures(prepare_segment.points, common_data_ptr->get_ego_pose()); + + // curvatures may be empty if ego is near the terminal start of the path. + if (curvatures.empty()) { + return true; + } + + const auto average_curvature = calc_average_curvature(curvatures); + + RCLCPP_DEBUG(get_logger(), "average curvature: %.3f", average_curvature); + return average_curvature <= common_data_ptr->lc_param_ptr->trajectory.th_prepare_curvature; } LaneChangePath get_candidate_path( @@ -205,7 +420,7 @@ LaneChangePath get_candidate_path( } const auto & lc_start_pose = prep_segment.points.back().point.pose; - const auto target_lane_reference_path = get_reference_path_from_target_Lane( + const auto target_lane_reference_path = get_reference_path_from_target_lane( common_data_ptr, lc_start_pose, lc_metric.length, resample_interval); if (target_lane_reference_path.points.empty()) { @@ -259,10 +474,14 @@ LaneChangePath construct_candidate_path( throw std::logic_error("Lane change end idx not found on target path."); } + std::vector prev_ids; + std::vector prev_sorted_ids; for (size_t i = 0; i < shifted_path.path.points.size(); ++i) { auto & point = shifted_path.path.points.at(i); if (i < *lc_end_idx_opt) { - point.lane_ids = replaceWithSortedIds(point.lane_ids, sorted_lane_ids); + const auto & current_ids = point.lane_ids; + point.lane_ids = + replace_with_sorted_ids(current_ids, sorted_lane_ids, prev_ids, prev_sorted_ids); point.point.longitudinal_velocity_mps = std::min( point.point.longitudinal_velocity_mps, static_cast(terminal_lane_changing_velocity)); continue; @@ -286,7 +505,251 @@ LaneChangePath construct_candidate_path( candidate_path.path = utils::combinePath(prepare_segment, shifted_path.path); candidate_path.shifted_path = shifted_path; candidate_path.info = lane_change_info; + candidate_path.type = PathType::ConstantJerk; return candidate_path; } + +std::vector generate_frenet_candidates( + const CommonDataPtr & common_data_ptr, const PathWithLaneId & prev_module_path, + const std::vector & prep_metrics) +{ + std::vector trajectory_groups; + universe_utils::StopWatch sw; + + const auto & transient_data = common_data_ptr->transient_data; + const auto & current_lanes = common_data_ptr->lanes_ptr->current; + const auto & target_lanes = common_data_ptr->lanes_ptr->target; + const auto direction = common_data_ptr->direction; + const auto current_lane_boundary = get_linestring_bound(current_lanes, direction); + + for (const auto & metric : prep_metrics) { + PathWithLaneId prepare_segment; + try { + if (!utils::lane_change::get_prepare_segment( + common_data_ptr, prev_module_path, metric.length, prepare_segment)) { + RCLCPP_DEBUG(get_logger(), "Reject: failed to get valid prepare segment!"); + continue; + } + } catch (const std::exception & e) { + RCLCPP_WARN(get_logger(), "%s", e.what()); + break; + } + const auto lc_start_pose = prepare_segment.points.back().point.pose; + + const auto dist_to_end_from_lc_start = + calculation::calc_dist_from_pose_to_terminal_end( + common_data_ptr, target_lanes, lc_start_pose) - + common_data_ptr->lc_param_ptr->lane_change_finish_judge_buffer; + const auto max_lc_len = transient_data.lane_changing_length.max; + const auto max_lane_changing_length = std::min(dist_to_end_from_lc_start, max_lc_len); + + constexpr auto resample_interval = 0.5; + const auto target_lane_reference_path = get_reference_path_from_target_lane( + common_data_ptr, lc_start_pose, max_lane_changing_length, resample_interval); + if (target_lane_reference_path.points.empty()) { + continue; + } + + std::vector target_ref_path_sums{0.0}; + target_ref_path_sums.reserve(target_lane_reference_path.points.size() - 1); + double ref_s = 0.0; + for (auto it = target_lane_reference_path.points.begin(); + std::next(it) != target_lane_reference_path.points.end(); ++it) { + ref_s += universe_utils::calcDistance2d(*it, *std::next(it)); + target_ref_path_sums.push_back(ref_s); + } + + const auto reference_spline = init_reference_spline(target_lane_reference_path.points); + + const auto initial_state = init_frenet_state( + reference_spline.frenet({lc_start_pose.position.x, lc_start_pose.position.y}), metric); + + RCLCPP_DEBUG( + get_logger(), "Initial state [s=%2.2f, d=%2.2f, s'=%2.2f, d'=%2.2f, s''=%2.2f, d''=%2.2f]", + initial_state.position.s, initial_state.position.d, initial_state.longitudinal_velocity, + initial_state.lateral_velocity, initial_state.longitudinal_acceleration, + initial_state.lateral_acceleration); + + const auto sampling_parameters_opt = init_sampling_parameters( + common_data_ptr, metric, initial_state, reference_spline, lc_start_pose); + + if (!sampling_parameters_opt) { + continue; + } + + auto frenet_trajectories = frenet_planner::generateTrajectories( + reference_spline, initial_state, *sampling_parameters_opt); + + trajectory_groups.reserve(trajectory_groups.size() + frenet_trajectories.size()); + for (const auto & traj : frenet_trajectories) { + if (!trajectory_groups.empty()) { + const auto diff = std::abs( + traj.frenet_points.back().s - + trajectory_groups.back().lane_changing.frenet_points.back().s); + if (diff < common_data_ptr->lc_param_ptr->trajectory.th_lane_changing_length_diff) { + continue; + } + } + + const auto out_of_bound = + check_out_of_bound_paths(common_data_ptr, traj.poses, current_lane_boundary, direction); + + if (out_of_bound) { + continue; + } + + trajectory_groups.emplace_back( + prepare_segment, target_lane_reference_path, target_ref_path_sums, metric, traj, + initial_state, max_lane_changing_length); + } + } + + const auto limit_vel = [&](TrajectoryGroup & group) { + const auto max_vel = calc_limit(common_data_ptr, group.lane_changing.poses.back()); + for (auto & vel : group.lane_changing.longitudinal_velocities) { + vel = std::clamp(vel, 0.0, max_vel); + } + }; + + ranges::for_each(trajectory_groups, limit_vel); + + ranges::sort(trajectory_groups, [&](const auto & p1, const auto & p2) { + return calc_average_curvature(p1.lane_changing.curvatures) < + calc_average_curvature(p2.lane_changing.curvatures); + }); + + return trajectory_groups; +} + +std::optional get_candidate_path( + const TrajectoryGroup & trajectory_group, const CommonDataPtr & common_data_ptr, + const std::vector> & sorted_lane_ids) +{ + if (trajectory_group.lane_changing.frenet_points.empty()) { + return std::nullopt; + } + + ShiftedPath shifted_path; + std::vector prev_ids; + std::vector prev_sorted_ids; + const auto & lane_changing_candidate = trajectory_group.lane_changing; + const auto & target_lane_ref_path = trajectory_group.target_lane_ref_path; + const auto & prepare_segment = trajectory_group.prepare; + const auto & prepare_metric = trajectory_group.prepare_metric; + const auto & initial_state = trajectory_group.initial_state; + const auto & target_ref_sums = trajectory_group.target_lane_ref_path_dist; + auto zipped_candidates = ranges::views::zip( + lane_changing_candidate.poses, lane_changing_candidate.frenet_points, + lane_changing_candidate.longitudinal_velocities, lane_changing_candidate.lateral_velocities, + lane_changing_candidate.curvatures); + + shifted_path.path.points.reserve(zipped_candidates.size()); + shifted_path.shift_length.reserve(zipped_candidates.size()); + for (const auto & [pose, frenet_point, longitudinal_velocity, lateral_velocity, curvature] : + zipped_candidates) { + // Find the reference index + const auto & s = frenet_point.s; + auto ref_i_itr = std::find_if( + target_ref_sums.begin(), target_ref_sums.end(), + [s](const double ref_s) { return ref_s > s; }); + auto ref_i = std::distance(target_ref_sums.begin(), ref_i_itr); + + PathPointWithLaneId point; + point.point.pose = pose; + point.point.longitudinal_velocity_mps = static_cast(longitudinal_velocity); + point.point.lateral_velocity_mps = static_cast(lateral_velocity); + point.point.heading_rate_rps = static_cast(curvature); + point.point.pose.position.z = target_lane_ref_path.points[ref_i].point.pose.position.z; + const auto & current_ids = target_lane_ref_path.points[ref_i].lane_ids; + point.lane_ids = + replace_with_sorted_ids(current_ids, sorted_lane_ids, prev_ids, prev_sorted_ids); + + // Add to shifted path + shifted_path.shift_length.push_back(frenet_point.d); + shifted_path.path.points.push_back(point); + } + + if (shifted_path.path.points.empty()) { + return std::nullopt; + } + + for (auto & point : shifted_path.path.points) { + point.point.longitudinal_velocity_mps = std::min( + point.point.longitudinal_velocity_mps, + static_cast(shifted_path.path.points.back().point.longitudinal_velocity_mps)); + } + + const auto th_yaw_diff_deg = common_data_ptr->lc_param_ptr->frenet.th_yaw_diff_deg; + if ( + const auto yaw_diff_opt = exceed_yaw_threshold( + prepare_segment, shifted_path.path, autoware::universe_utils::deg2rad(th_yaw_diff_deg))) { + const auto yaw_diff_deg = autoware::universe_utils::rad2deg(yaw_diff_opt.value()); + const auto err_msg = fmt::format( + "Excessive yaw difference {yaw_diff:2.2f}[deg]. The threshold is {th_yaw_diff:2.2f}[deg].", + fmt::arg("yaw_diff", yaw_diff_deg), fmt::arg("th_yaw_diff", th_yaw_diff_deg)); + throw std::logic_error(err_msg); + } + + LaneChangeInfo info; + info.longitudinal_acceleration = { + prepare_metric.actual_lon_accel, lane_changing_candidate.longitudinal_accelerations.front()}; + info.velocity = {prepare_metric.velocity, initial_state.longitudinal_velocity}; + info.duration = { + prepare_metric.duration, lane_changing_candidate.sampling_parameter.target_duration}; + info.length = {prepare_metric.length, lane_changing_candidate.lengths.back()}; + info.lane_changing_start = prepare_segment.points.back().point.pose; + info.lane_changing_end = lane_changing_candidate.poses.back(); + + ShiftLine sl; + + sl.start = lane_changing_candidate.poses.front(); + sl.end = lane_changing_candidate.poses.back(); + sl.start_shift_length = 0.0; + sl.end_shift_length = initial_state.position.d; + sl.start_idx = 0UL; + sl.end_idx = shifted_path.shift_length.size() - 1; + + info.shift_line = sl; + info.terminal_lane_changing_velocity = lane_changing_candidate.longitudinal_velocities.back(); + info.lateral_acceleration = lane_changing_candidate.lateral_accelerations.front(); + + LaneChangePath candidate_path; + candidate_path.path = utils::combinePath(prepare_segment, shifted_path.path); + candidate_path.info = info; + candidate_path.shifted_path = shifted_path; + candidate_path.frenet_path = trajectory_group; + candidate_path.type = PathType::FrenetPlanner; + + return candidate_path; +} + +void append_target_ref_to_candidate( + LaneChangePath & frenet_candidate, const double th_curvature_smoothing) +{ + const auto & target_lane_ref_path = frenet_candidate.frenet_path.target_lane_ref_path.points; + const auto & lc_end_pose = frenet_candidate.info.lane_changing_end; + const auto lc_end_idx = + motion_utils::findNearestIndex(target_lane_ref_path, lc_end_pose.position); + auto & candidate_path = frenet_candidate.path.points; + if (target_lane_ref_path.size() <= lc_end_idx + 2) { + return; + } + const auto add_size = target_lane_ref_path.size() - (lc_end_idx + 1); + candidate_path.reserve(candidate_path.size() + add_size); + const auto & points = target_lane_ref_path; + for (const auto & [p2, p3] : ranges::views::zip( + points | ranges::views::drop(lc_end_idx + 1), + points | ranges::views::drop(lc_end_idx + 2))) { + const auto point1 = autoware::universe_utils::getPoint(candidate_path.back().point.pose); + const auto point2 = autoware::universe_utils::getPoint(p2); + const auto point3 = autoware::universe_utils::getPoint(p3); + const auto curvature = + std::abs(autoware::universe_utils::calcCurvature(point1, point2, point3)); + if (curvature < th_curvature_smoothing) { + candidate_path.push_back(p2); + } + } + candidate_path.push_back(target_lane_ref_path.back()); +} } // namespace autoware::behavior_path_planner::utils::lane_change diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp index 9360435891632..9002270185847 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp @@ -24,12 +24,18 @@ #include "autoware/object_recognition_utils/predicted_path_utils.hpp" #include "autoware/universe_utils/math/unit_conversion.hpp" +// for the geometry types +#include +#include +// for the svg mapper #include #include #include #include #include #include +#include +#include #include #include #include @@ -40,9 +46,10 @@ #include #include -#include - +#include #include +#include +#include #include #include @@ -64,9 +71,11 @@ namespace autoware::behavior_path_planner::utils::lane_change { using autoware::route_handler::RouteHandler; using autoware::universe_utils::LineString2d; +using autoware::universe_utils::Point2d; using autoware::universe_utils::Polygon2d; using autoware_perception_msgs::msg::ObjectClassification; using autoware_perception_msgs::msg::PredictedObjects; +using behavior_path_planner::lane_change::PathType; using geometry_msgs::msg::Pose; using tier4_planning_msgs::msg::PathWithLaneId; @@ -382,18 +391,26 @@ std::vector> get_sorted_lane_ids(const CommonDataPtr & comm return sorted_lane_ids; } -std::vector replaceWithSortedIds( - const std::vector & original_lane_ids, - const std::vector> & sorted_lane_ids) +std::vector replace_with_sorted_ids( + const std::vector & current_lane_ids, + const std::vector> & sorted_lane_ids, std::vector & prev_lane_ids, + std::vector & prev_sorted_lane_ids) { - for (const auto original_id : original_lane_ids) { + if (current_lane_ids == prev_lane_ids) { + return prev_sorted_lane_ids; + } + + for (const auto original_id : current_lane_ids) { for (const auto & sorted_id : sorted_lane_ids) { if (std::find(sorted_id.cbegin(), sorted_id.cend(), original_id) != sorted_id.cend()) { - return sorted_id; + prev_lane_ids = current_lane_ids; + prev_sorted_lane_ids = sorted_id; + return prev_sorted_lane_ids; } } } - return original_lane_ids; + + return current_lane_ids; } CandidateOutput assignToCandidate( @@ -475,6 +492,7 @@ std::vector convert_to_predicted_path( 0.5 * lane_changing_acceleration * delta_t * delta_t + offset; const auto pose = autoware::motion_utils::calcInterpolatedPose( path.points, vehicle_pose_frenet.length + length); + predicted_path.emplace_back(t, pose, velocity); } @@ -1127,6 +1145,10 @@ std::vector> convert_to_predicted_paths( const auto acc_resolution = (min_acc - lane_changing_acc) / static_cast(sampling_num); const auto ego_predicted_path = [&](size_t n) { + if (lane_change_path.type == PathType::FrenetPlanner) { + return convert_to_predicted_path( + common_data_ptr, lane_change_path.frenet_path, deceleration_sampling_num); + } auto acc = lane_changing_acc + static_cast(n) * acc_resolution; return utils::lane_change::convert_to_predicted_path(common_data_ptr, lane_change_path, acc); }; @@ -1135,6 +1157,48 @@ std::vector> convert_to_predicted_paths( ranges::to(); } +std::vector convert_to_predicted_path( + const CommonDataPtr & common_data_ptr, const lane_change::TrajectoryGroup & frenet_candidate, + [[maybe_unused]] const size_t deceleration_sampling_num) +{ + const auto initial_velocity = common_data_ptr->get_ego_speed(); + const auto prepare_time = frenet_candidate.prepare_metric.duration; + const auto resolution = + common_data_ptr->lc_param_ptr->safety.collision_check.prediction_time_resolution; + const auto prepare_acc = frenet_candidate.prepare_metric.sampled_lon_accel; + std::vector predicted_path; + const auto & path = frenet_candidate.prepare.points; + const auto & vehicle_pose = common_data_ptr->get_ego_pose(); + const auto & bpp_param_ptr = common_data_ptr->bpp_param_ptr; + const auto nearest_seg_idx = + autoware::motion_utils::findFirstNearestSegmentIndexWithSoftConstraints( + path, vehicle_pose, bpp_param_ptr->ego_nearest_dist_threshold, + bpp_param_ptr->ego_nearest_yaw_threshold); + + const auto vehicle_pose_frenet = + convertToFrenetPoint(path, vehicle_pose.position, nearest_seg_idx); + + for (double t = 0.0; t < prepare_time; t += resolution) { + const auto velocity = + std::clamp(initial_velocity + prepare_acc * t, 0.0, frenet_candidate.prepare_metric.velocity); + const auto length = initial_velocity * t + 0.5 * prepare_acc * t * t; + const auto pose = + autoware::motion_utils::calcInterpolatedPose(path, vehicle_pose_frenet.length + length); + predicted_path.emplace_back(t, pose, velocity); + } + + const auto & poses = frenet_candidate.lane_changing.poses; + const auto & velocities = frenet_candidate.lane_changing.longitudinal_velocities; + const auto & times = frenet_candidate.lane_changing.times; + + for (const auto [t, pose, velocity] : + ranges::views::zip(times, poses, velocities) | ranges::views::drop(1)) { + predicted_path.emplace_back(prepare_time + t, pose, velocity); + } + + return predicted_path; +} + bool is_valid_start_point(const lane_change::CommonDataPtr & common_data_ptr, const Pose & pose) { const lanelet::BasicPoint2d lc_start_point(pose.position.x, pose.position.y); diff --git a/planning/sampling_based_planner/autoware_frenet_planner/src/frenet_planner/frenet_planner.cpp b/planning/sampling_based_planner/autoware_frenet_planner/src/frenet_planner/frenet_planner.cpp index cab4acfbb8556..54d4bc2e90714 100644 --- a/planning/sampling_based_planner/autoware_frenet_planner/src/frenet_planner/frenet_planner.cpp +++ b/planning/sampling_based_planner/autoware_frenet_planner/src/frenet_planner/frenet_planner.cpp @@ -197,6 +197,15 @@ void calculateCartesian( trajectory.longitudinal_accelerations.push_back(0.0); trajectory.lateral_accelerations.push_back(0.0); } + for (auto i = 0UL; i < trajectory.points.size(); ++i) { + geometry_msgs::msg::Pose pose; + pose.position.x = trajectory.points[i].x(); + pose.position.y = trajectory.points[i].y(); + pose.position.z = 0.0; + pose.orientation = + autoware::universe_utils::createQuaternionFromRPY(0.0, 0.0, trajectory.yaws[i]); + trajectory.poses.push_back(pose); + } } } From 96998925ad72498c77e0e6a52f5132bb2cb8a92b Mon Sep 17 00:00:00 2001 From: Yukinari Hisaki <42021302+yhisaki@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:23:20 +0900 Subject: [PATCH 078/127] fix(learning_based_vehicle_model): fix clang-diagnostic-delete-abstract-non-virtual-dtor (#9506) Signed-off-by: Y.Hisaki --- .../learning_based_vehicle_model/src/interconnected_model.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/simulator/learning_based_vehicle_model/src/interconnected_model.cpp b/simulator/learning_based_vehicle_model/src/interconnected_model.cpp index d2fef15aa4e88..e495aceb8da9c 100644 --- a/simulator/learning_based_vehicle_model/src/interconnected_model.cpp +++ b/simulator/learning_based_vehicle_model/src/interconnected_model.cpp @@ -79,8 +79,7 @@ void InterconnectedModel::addSubmodel( std::tuple submodel_desc) { const auto [lib_path, param_path, class_name] = submodel_desc; - auto new_model = new SimplePyModel(lib_path, param_path, class_name); - submodels.push_back(std::unique_ptr(new_model)); + submodels.emplace_back(std::make_unique(lib_path, param_path, class_name)); } void InterconnectedModel::initState(std::vector new_state) From 215cae29afaa5923e8c74e216d99e6549980990d Mon Sep 17 00:00:00 2001 From: Ismet Atabay <56237550+ismetatabay@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:31:53 +0300 Subject: [PATCH 079/127] feat(remaining_distance_time_calculator): skip calculation during parking (#9013) Signed-off-by: ismetatabay --- .../README.md | 1 + ...aining_distance_time_calculator.launch.xml | 2 ++ ...emaining_distance_time_calculator_node.cpp | 21 ++++++++++++++++++- ...emaining_distance_time_calculator_node.hpp | 5 +++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/planning/autoware_remaining_distance_time_calculator/README.md b/planning/autoware_remaining_distance_time_calculator/README.md index 694c6764de91c..c227b73b87448 100644 --- a/planning/autoware_remaining_distance_time_calculator/README.md +++ b/planning/autoware_remaining_distance_time_calculator/README.md @@ -8,6 +8,7 @@ This package aims to provide mission remaining distance and remaining time calcu - The calculations are activated once we have a route planned for a mission in Autoware. - The calculations are triggered timely based on the `update_rate` parameter. +- The calculations are skipped if the scenario is PARKING, and the remaining time and distance values are set to 0.0. ### Module Parameters diff --git a/planning/autoware_remaining_distance_time_calculator/launch/remaining_distance_time_calculator.launch.xml b/planning/autoware_remaining_distance_time_calculator/launch/remaining_distance_time_calculator.launch.xml index cfb456c57ca41..be7898bdd8913 100644 --- a/planning/autoware_remaining_distance_time_calculator/launch/remaining_distance_time_calculator.launch.xml +++ b/planning/autoware_remaining_distance_time_calculator/launch/remaining_distance_time_calculator.launch.xml @@ -4,6 +4,7 @@ + @@ -13,6 +14,7 @@ + diff --git a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp index 383e85731604e..7932a2531185f 100644 --- a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp +++ b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp @@ -37,6 +37,7 @@ RemainingDistanceTimeCalculatorNode::RemainingDistanceTimeCalculatorNode( : Node("remaining_distance_time_calculator", options), is_graph_ready_{false}, has_received_route_{false}, + has_received_scenario_{false}, velocity_limit_{99.99}, remaining_distance_{0.0}, remaining_time_{0.0} @@ -57,6 +58,8 @@ RemainingDistanceTimeCalculatorNode::RemainingDistanceTimeCalculatorNode( sub_planning_velocity_ = create_subscription( "/planning/scenario_planning/current_max_velocity", qos_transient_local, std::bind(&RemainingDistanceTimeCalculatorNode::on_velocity_limit, this, _1)); + sub_scenario_ = this->create_subscription( + "~/input/scenario", 1, std::bind(&RemainingDistanceTimeCalculatorNode::on_scenario, this, _1)); pub_mission_remaining_distance_time_ = create_publisher( "~/output/mission_remaining_distance_time", @@ -100,9 +103,25 @@ void RemainingDistanceTimeCalculatorNode::on_velocity_limit( } } +void RemainingDistanceTimeCalculatorNode::on_scenario( + const tier4_planning_msgs::msg::Scenario::ConstSharedPtr & msg) +{ + scenario_ = msg; + has_received_scenario_ = true; +} + void RemainingDistanceTimeCalculatorNode::on_timer() { - if (is_graph_ready_ && has_received_route_) { + if (!has_received_scenario_) { + return; + } + + // check if the scenario is parking or not + if (scenario_->current_scenario == tier4_planning_msgs::msg::Scenario::PARKING) { + remaining_distance_ = 0.0; + remaining_time_ = 0.0; + publish_mission_remaining_distance_time(); + } else if (is_graph_ready_ && has_received_route_) { calculate_remaining_distance(); calculate_remaining_time(); publish_mission_remaining_distance_time(); diff --git a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp index d6c900af4dfed..b7af8861bf524 100644 --- a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp +++ b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -59,6 +60,7 @@ class RemainingDistanceTimeCalculatorNode : public rclcpp::Node rclcpp::Subscription::SharedPtr sub_map_; rclcpp::Subscription::SharedPtr sub_odometry_; rclcpp::Subscription::SharedPtr sub_planning_velocity_; + rclcpp::Subscription::SharedPtr sub_scenario_; rclcpp::Publisher::SharedPtr pub_mission_remaining_distance_time_; @@ -75,7 +77,9 @@ class RemainingDistanceTimeCalculatorNode : public rclcpp::Node geometry_msgs::msg::Pose current_vehicle_pose_; geometry_msgs::msg::Vector3 current_vehicle_velocity_; geometry_msgs::msg::Pose goal_pose_; + tier4_planning_msgs::msg::Scenario::ConstSharedPtr scenario_; bool has_received_route_; + bool has_received_scenario_; double velocity_limit_; double remaining_distance_; @@ -90,6 +94,7 @@ class RemainingDistanceTimeCalculatorNode : public rclcpp::Node void on_route(const LaneletRoute::ConstSharedPtr & msg); void on_map(const HADMapBin::ConstSharedPtr & msg); void on_velocity_limit(const VelocityLimit::ConstSharedPtr & msg); + void on_scenario(const tier4_planning_msgs::msg::Scenario::ConstSharedPtr & msg); /** * @brief calculate mission remaining distance From 36b74c23311d677c06600a55d37bfed36e01d163 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:35:13 +0900 Subject: [PATCH 080/127] =?UTF-8?q?feat(autoware=5Fobject=5Fmerger):=20tie?= =?UTF-8?q?r4=5Fdebug=5Fmsgs=20changed=20to=20autoware=5Finternal=5Fdebug?= =?UTF-8?q?=5Fmsgs=20in=20fil=E2=80=A6=20(#9893)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_object_merger Signed-off-by: vish0012 Co-authored-by: Taekjin LEE --- .../src/object_association_merger_node.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perception/autoware_object_merger/src/object_association_merger_node.cpp b/perception/autoware_object_merger/src/object_association_merger_node.cpp index 0e2b88f4aa566..40bdd0a7d6938 100644 --- a/perception/autoware_object_merger/src/object_association_merger_node.cpp +++ b/perception/autoware_object_merger/src/object_association_merger_node.cpp @@ -235,9 +235,9 @@ void ObjectAssociationMergerNode::objectsCallback( merged_object_pub_->publish(output_msg); published_time_publisher_->publish_if_subscribed(merged_object_pub_, output_msg.header.stamp); // publish processing time - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/cyclic_time_ms", stop_watch_ptr_->toc("cyclic_time", true)); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_time_ms", stop_watch_ptr_->toc("processing_time", true)); } } // namespace autoware::object_merger From 9c0e183d25c1a76a8091f7c210c95ac32f94d5f4 Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Tue, 14 Jan 2025 17:50:46 +0900 Subject: [PATCH 081/127] feat(lane_change_module): add update paramter function for non defined paramters (#9887) * feat(lane_change_module): add new parameters for collision check and delay lane change functionality Signed-off-by: Kyoichi Sugahara * feat(lane_change_module): add validation for longitudinal and lateral acceleration sampling parameters Signed-off-by: Kyoichi Sugahara * feat(lane_change): update parameter handling and add lateral acceleration mapping Signed-off-by: Kyoichi Sugahara --------- Signed-off-by: Kyoichi Sugahara --- .../src/manager.cpp | 125 +++++++++++++++++- 1 file changed, 122 insertions(+), 3 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index 06a9d505f90ad..07b05ab0ea131 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -324,10 +324,12 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectorlane_change_finish_judge_buffer); updateParam( parameters, ns + "enable_stopped_vehicle_buffer", p->enable_stopped_vehicle_buffer); - updateParam( parameters, ns + "finish_judge_lateral_threshold", p->th_finish_judge_lateral_diff); updateParam(parameters, ns + "publish_debug_marker", p->publish_debug_marker); + updateParam( + parameters, ns + "min_length_for_turn_signal_activation", + p->min_length_for_turn_signal_activation); } { @@ -338,8 +340,7 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortrajectory.min_prepare_duration); updateParam(parameters, ns + "lateral_jerk", p->trajectory.lateral_jerk); updateParam( - parameters, ns + ".min_lane_changing_velocity", p->trajectory.min_lane_changing_velocity); - // longitudinal acceleration + parameters, ns + "min_lane_changing_velocity", p->trajectory.min_lane_changing_velocity); updateParam( parameters, ns + "min_longitudinal_acc", p->trajectory.min_longitudinal_acc); updateParam( @@ -352,12 +353,22 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector(parameters, ns + "lon_acc_sampling_num", longitudinal_acc_sampling_num); if (longitudinal_acc_sampling_num > 0) { p->trajectory.lon_acc_sampling_num = longitudinal_acc_sampling_num; + } else { + RCLCPP_WARN_ONCE( + node_->get_logger(), + "Parameter 'lon_acc_sampling_num' is not updated because the value (%d) is not positive", + longitudinal_acc_sampling_num); } int lateral_acc_sampling_num = 0; updateParam(parameters, ns + "lat_acc_sampling_num", lateral_acc_sampling_num); if (lateral_acc_sampling_num > 0) { p->trajectory.lat_acc_sampling_num = lateral_acc_sampling_num; + } else { + RCLCPP_WARN_ONCE( + node_->get_logger(), + "Parameter 'lat_acc_sampling_num' is not updated because the value (%d) is not positive", + lateral_acc_sampling_num); } updateParam( @@ -380,6 +391,57 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector(parameters, ns + "right_offset", p->safety.lane_expansion_right_offset); } + { + const std::string ns = "lane_change.lateral_acceleration."; + std::vector velocity = p->trajectory.lat_acc_map.base_vel; + std::vector min_values = p->trajectory.lat_acc_map.base_min_acc; + std::vector max_values = p->trajectory.lat_acc_map.base_max_acc; + + updateParam>(parameters, ns + "velocity", velocity); + updateParam>(parameters, ns + "min_values", min_values); + updateParam>(parameters, ns + "max_values", max_values); + if ( + velocity.size() >= 2 && velocity.size() == min_values.size() && + velocity.size() == max_values.size()) { + LateralAccelerationMap lat_acc_map; + for (size_t i = 0; i < velocity.size(); ++i) { + lat_acc_map.add(velocity.at(i), min_values.at(i), max_values.at(i)); + } + p->trajectory.lat_acc_map = lat_acc_map; + } else { + RCLCPP_WARN_ONCE( + node_->get_logger(), + "Mismatched size for lateral acceleration. Expected size: %lu, but velocity: %lu, " + "min_values: %lu, max_values: %lu", + std::max(2ul, velocity.size()), velocity.size(), min_values.size(), max_values.size()); + } + } + + { + const std::string ns = "lane_change.collision_check."; + updateParam( + parameters, ns + "enable_for_prepare_phase.general_lanes", + p->safety.collision_check.enable_for_prepare_phase_in_general_lanes); + updateParam( + parameters, ns + "enable_for_prepare_phase.intersection", + p->safety.collision_check.enable_for_prepare_phase_in_intersection); + updateParam( + parameters, ns + "enable_for_prepare_phase.turns", + p->safety.collision_check.enable_for_prepare_phase_in_turns); + updateParam( + parameters, ns + "check_current_lanes", p->safety.collision_check.check_current_lane); + updateParam( + parameters, ns + "check_other_lanes", p->safety.collision_check.check_other_lanes); + updateParam( + parameters, ns + "use_all_predicted_paths", + p->safety.collision_check.use_all_predicted_paths); + updateParam( + parameters, ns + "prediction_time_resolution", + p->safety.collision_check.prediction_time_resolution); + updateParam( + parameters, ns + "yaw_diff_threshold", p->safety.collision_check.th_yaw_diff); + } + { const std::string ns = "lane_change.target_object."; updateParam(parameters, ns + "car", p->safety.target_object_types.check_car); @@ -407,6 +469,50 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector(parameters, ns + "stop_time", p->th_stop_time); } + auto update_rss_params = [¶meters](const std::string & prefix, auto & params) { + using autoware::universe_utils::updateParam; + updateParam( + parameters, prefix + "longitudinal_distance_min_threshold", + params.longitudinal_distance_min_threshold); + updateParam( + parameters, prefix + "longitudinal_velocity_delta_time", + params.longitudinal_velocity_delta_time); + updateParam( + parameters, prefix + "expected_front_deceleration", params.front_vehicle_deceleration); + updateParam( + parameters, prefix + "expected_rear_deceleration", params.rear_vehicle_deceleration); + updateParam( + parameters, prefix + "rear_vehicle_reaction_time", params.rear_vehicle_reaction_time); + updateParam( + parameters, prefix + "rear_vehicle_safety_time_margin", + params.rear_vehicle_safety_time_margin); + updateParam( + parameters, prefix + "lateral_distance_max_threshold", params.lateral_distance_max_threshold); + }; + + update_rss_params("lane_change.safety_check.execution.", p->safety.rss_params); + update_rss_params("lane_change.safety_check.parked.", p->safety.rss_params_for_parked); + update_rss_params("lane_change.safety_check.cancel.", p->safety.rss_params_for_abort); + update_rss_params("lane_change.safety_check.stuck.", p->safety.rss_params_for_stuck); + + { + const std::string ns = "lane_change.delay_lane_change."; + updateParam(parameters, ns + "enable", p->delay.enable); + updateParam( + parameters, ns + "check_only_parked_vehicle", p->delay.check_only_parked_vehicle); + updateParam( + parameters, ns + "min_road_shoulder_width", p->delay.min_road_shoulder_width); + updateParam( + parameters, ns + "th_parked_vehicle_shift_ratio", p->delay.th_parked_vehicle_shift_ratio); + } + + { + const std::string ns = "lane_change.terminal_path."; + updateParam(parameters, ns + "enable", p->terminal_path.enable); + updateParam(parameters, ns + "disable_near_goal", p->terminal_path.disable_near_goal); + updateParam(parameters, ns + "stop_at_boundary", p->terminal_path.stop_at_boundary); + } + { const std::string ns = "lane_change.cancel."; bool enable_on_prepare_phase = true; @@ -424,6 +530,18 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectorcancel.enable_on_lane_changing_phase = enable_on_lane_changing_phase; } + int deceleration_sampling_num = 0; + updateParam(parameters, ns + "deceleration_sampling_num", deceleration_sampling_num); + if (deceleration_sampling_num > 0) { + p->cancel.deceleration_sampling_num = deceleration_sampling_num; + } else { + RCLCPP_WARN_ONCE( + node_->get_logger(), + "Parameter 'deceleration_sampling_num' is not updated because the value (%d) is not " + "positive", + deceleration_sampling_num); + } + updateParam(parameters, ns + "delta_time", p->cancel.delta_time); updateParam(parameters, ns + "duration", p->cancel.duration); updateParam(parameters, ns + "max_lateral_jerk", p->cancel.max_lateral_jerk); @@ -431,6 +549,7 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector( parameters, ns + "unsafe_hysteresis_threshold", p->cancel.th_unsafe_hysteresis); } + std::for_each(observers_.begin(), observers_.end(), [&p](const auto & observer) { if (!observer.expired()) observer.lock()->updateModuleParams(p); }); From 6e0e6c09f422063d72a727229bf34daffef279a9 Mon Sep 17 00:00:00 2001 From: Yuki TAKAGI <141538661+yuki-takagi-66@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:23:19 +0900 Subject: [PATCH 082/127] fix(behavior_velocity_planner_common): fix unregister process (#9913) Signed-off-by: yuki-takagi-66 --- .../behavior_velocity_planner_common/scene_module_interface.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp index d8d640a078267..a891b011dbab8 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp @@ -228,6 +228,7 @@ class SceneModuleManagerInterface auto itr = scene_modules_.begin(); while (itr != scene_modules_.end()) { if (isModuleExpired(*itr)) { + registered_module_id_set_.erase((*itr)->getModuleId()); itr = scene_modules_.erase(itr); } else { itr++; From 5f88055f48c885733cfa6217c811a17a21470a36 Mon Sep 17 00:00:00 2001 From: Kirill Glinskiy <56448851+PurplePegasuss@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:10:07 +0300 Subject: [PATCH 083/127] docs(autoware_mission_planner): added odometry input in README.md (#7281) added odometry input in README.md Signed-off-by: Ryohsuke Mitsudome --- planning/autoware_mission_planner/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/planning/autoware_mission_planner/README.md b/planning/autoware_mission_planner/README.md index b5993d0106add..720ecd976f65f 100644 --- a/planning/autoware_mission_planner/README.md +++ b/planning/autoware_mission_planner/README.md @@ -53,6 +53,7 @@ It distributes route requests and planning results according to current MRM oper | `input/vector_map` | autoware_map_msgs/msg/LaneletMapBin | vector map of Lanelet2 | | `input/modified_goal` | geometry_msgs/PoseWithUuidStamped | modified goal pose | | `input/operation_mode_state` | autoware_adapi_v1_msgs/OperationModeState | operation mode state | +| `input/odometry` | nav_msgs/msg/Odometry | vehicle odometry | ### Publications From 951b1df19373a57c813ece9dd15dcd6a6f6bb0cf Mon Sep 17 00:00:00 2001 From: cyn-liu <104069308+cyn-liu@users.noreply.github.com> Date: Wed, 15 Jan 2025 00:22:37 +0800 Subject: [PATCH 084/127] fix(autoware_tensorrt_yolox): modify tensorrt_yolox_node name (#9156) Signed-off-by: liu cui --- .../launch/multiple_yolox.launch.xml | 16 ++++++++++++++++ .../launch/yolox_s_plus_opt.launch.xml | 6 ++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/perception/autoware_tensorrt_yolox/launch/multiple_yolox.launch.xml b/perception/autoware_tensorrt_yolox/launch/multiple_yolox.launch.xml index a7952b12414b1..606fd1299cf35 100644 --- a/perception/autoware_tensorrt_yolox/launch/multiple_yolox.launch.xml +++ b/perception/autoware_tensorrt_yolox/launch/multiple_yolox.launch.xml @@ -11,34 +11,50 @@ + + + + + + + + + + + + + + + + diff --git a/perception/autoware_tensorrt_yolox/launch/yolox_s_plus_opt.launch.xml b/perception/autoware_tensorrt_yolox/launch/yolox_s_plus_opt.launch.xml index 0096a219c8573..6d40905d78127 100644 --- a/perception/autoware_tensorrt_yolox/launch/yolox_s_plus_opt.launch.xml +++ b/perception/autoware_tensorrt_yolox/launch/yolox_s_plus_opt.launch.xml @@ -1,6 +1,8 @@ + + @@ -15,13 +17,13 @@ - + - + From bc0dcccbec3131cea2bde0761f811f971f0f10e4 Mon Sep 17 00:00:00 2001 From: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:25:04 +0900 Subject: [PATCH 085/127] test(external_velocity_limit_selector): add node test (#8944) add node smoke test Signed-off-by: Maxime CLEMENT --- .../CMakeLists.txt | 7 + .../package.xml | 1 + .../external_velocity_limit_selector_node.cpp | 1 - ...nal_velocity_limit_selector_node_launch.py | 178 ++++++++++++++++++ 4 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 planning/autoware_external_velocity_limit_selector/test/test_external_velocity_limit_selector_node_launch.py diff --git a/planning/autoware_external_velocity_limit_selector/CMakeLists.txt b/planning/autoware_external_velocity_limit_selector/CMakeLists.txt index ca758d1262b48..aa8d07d91135e 100644 --- a/planning/autoware_external_velocity_limit_selector/CMakeLists.txt +++ b/planning/autoware_external_velocity_limit_selector/CMakeLists.txt @@ -21,6 +21,13 @@ rclcpp_components_register_node(external_velocity_limit_selector_node EXECUTABLE external_velocity_limit_selector ) +if(BUILD_TESTING) + add_launch_test( + test/test_external_velocity_limit_selector_node_launch.py + TIMEOUT "30" + ) +endif() + ament_auto_package(INSTALL_TO_SHARE launch config diff --git a/planning/autoware_external_velocity_limit_selector/package.xml b/planning/autoware_external_velocity_limit_selector/package.xml index b75a4fab72d7c..5bfd3fa936d50 100644 --- a/planning/autoware_external_velocity_limit_selector/package.xml +++ b/planning/autoware_external_velocity_limit_selector/package.xml @@ -28,6 +28,7 @@ ament_lint_auto autoware_lint_common + ros_testing ament_cmake diff --git a/planning/autoware_external_velocity_limit_selector/src/external_velocity_limit_selector_node.cpp b/planning/autoware_external_velocity_limit_selector/src/external_velocity_limit_selector_node.cpp index cf42763fc6b60..cc2b134900a31 100644 --- a/planning/autoware_external_velocity_limit_selector/src/external_velocity_limit_selector_node.cpp +++ b/planning/autoware_external_velocity_limit_selector/src/external_velocity_limit_selector_node.cpp @@ -14,7 +14,6 @@ #include "autoware/external_velocity_limit_selector/external_velocity_limit_selector_node.hpp" -#include #include #include #include diff --git a/planning/autoware_external_velocity_limit_selector/test/test_external_velocity_limit_selector_node_launch.py b/planning/autoware_external_velocity_limit_selector/test/test_external_velocity_limit_selector_node_launch.py new file mode 100644 index 0000000000000..1c7e882fbc81f --- /dev/null +++ b/planning/autoware_external_velocity_limit_selector/test/test_external_velocity_limit_selector_node_launch.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 + +# Copyright 2024 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. + +import os +import unittest + +from ament_index_python import get_package_share_directory +import launch +from launch.actions import IncludeLaunchDescription +from launch.launch_description_sources import AnyLaunchDescriptionSource +from launch.logging import get_logger +import launch_testing +import pytest +from rcl_interfaces.msg import Parameter +from rcl_interfaces.msg import ParameterType +from rcl_interfaces.msg import ParameterValue +from rcl_interfaces.srv import SetParameters +import rclpy +import rclpy.qos +from tier4_planning_msgs.msg import VelocityLimit +from tier4_planning_msgs.msg import VelocityLimitClearCommand + +logger = get_logger(__name__) + + +@pytest.mark.launch_test +def generate_test_description(): + test_external_velocity_limit_selector_launch_file = os.path.join( + get_package_share_directory("autoware_external_velocity_limit_selector"), + "launch", + "external_velocity_limit_selector.launch.xml", + ) + external_velocity_limit_selector = IncludeLaunchDescription( + AnyLaunchDescriptionSource(test_external_velocity_limit_selector_launch_file), + ) + + return launch.LaunchDescription( + [ + external_velocity_limit_selector, + # Start tests right away - no need to wait for anything + launch_testing.actions.ReadyToTest(), + ] + ) + + +class TestExternalVelocityLimitSelector(unittest.TestCase): + @classmethod + def setUpClass(cls): + # Initialize the ROS context for the test node + rclpy.init() + + @classmethod + def tearDownClass(cls): + # Shutdown the ROS context + rclpy.shutdown() + + def velocity_limit_callback(self, msg): + self.msg_buffer_ = msg + + def setUp(self): + # Create a ROS node for tests + self.test_node = rclpy.create_node("test_node") + qos = rclpy.qos.QoSProfile(depth=1, durability=rclpy.qos.DurabilityPolicy.TRANSIENT_LOCAL) + self.pub_api_limit_ = self.test_node.create_publisher( + VelocityLimit, "/planning/scenario_planning/max_velocity_default", qos + ) + self.pub_internal_limit_ = self.test_node.create_publisher( + VelocityLimit, "/planning/scenario_planning/max_velocity_candidates", qos + ) + self.pub_clear_limit_ = self.test_node.create_publisher( + VelocityLimitClearCommand, "/planning/scenario_planning/clear_velocity_limit", qos + ) + self.msg_buffer_ = None + self.velocity_limit_output_ = None + self.test_node.create_subscription( + VelocityLimit, + "/planning/scenario_planning/max_velocity", + self.velocity_limit_callback, + 1, + ) + + def wait_for_output(self): + while not self.msg_buffer_: + rclpy.spin_once(self.test_node, timeout_sec=0.1) + self.velocity_limit_output_ = self.msg_buffer_ + self.msg_buffer_ = None + + def tearDown(self): + self.test_node.destroy_node() + + def update_max_vel_param(self, max_vel): + set_params_client = self.test_node.create_client( + SetParameters, "/external_velocity_limit_selector/set_parameters" + ) + while not set_params_client.wait_for_service(timeout_sec=1.0): + continue + set_params_request = SetParameters.Request() + set_params_request.parameters = [ + Parameter( + name="max_vel", + value=ParameterValue(type=ParameterType.PARAMETER_DOUBLE, double_value=max_vel), + ), + ] + future = set_params_client.call_async(set_params_request) + rclpy.spin_until_future_complete(self.test_node, future) + + if future.result() is None: + self.test_node.get_logger().error( + "Exception while calling service: %r" % future.exception() + ) + raise self.failureException("setting of initial parameters failed") + + @staticmethod + def make_velocity_limit_msg(vel): + msg = VelocityLimit() + msg.use_constraints = False + msg.max_velocity = vel + return msg + + def test_external_velocity_limit_selector_node(self): + self.update_max_vel_param(15.0) + # clear velocity limit to trigger first output + clear_cmd = VelocityLimitClearCommand(command=True) + self.pub_clear_limit_.publish(clear_cmd) + self.wait_for_output() + # velocity limit is 0 before any limit is set + self.assertEqual(self.velocity_limit_output_.max_velocity, 0.0) + + # Send velocity limits + # new API velocity limit: higher than the node param -> limit is set to the param value + api_limit = self.make_velocity_limit_msg(20.0) + self.pub_api_limit_.publish(api_limit) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 15.0) + # new API velocity limit + api_limit = self.make_velocity_limit_msg(10.0) + self.pub_api_limit_.publish(api_limit) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 10.0) + # new INTERNAL velocity limit + internal_limit = self.make_velocity_limit_msg(5.0) + self.pub_internal_limit_.publish(internal_limit) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 5.0) + # CLEAR: back to API velocity limit + self.pub_clear_limit_.publish(clear_cmd) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 10.0) + # lower the max_vel node parameter + self.update_max_vel_param(2.5) + self.pub_clear_limit_.publish(clear_cmd) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 2.5) + # velocity limit set by internal limit is no longer applied since above max_vel parameter + internal_limit = self.make_velocity_limit_msg(5.0) + self.pub_internal_limit_.publish(internal_limit) + self.wait_for_output() + self.assertEqual(self.velocity_limit_output_.max_velocity, 2.5) + + +@launch_testing.post_shutdown_test() +class TestProcessOutput(unittest.TestCase): + def test_exit_code(self, proc_info): + # Check that process exits with code 0: no error + launch_testing.asserts.assertExitCodes(proc_info) From bc409a755a2d0abce18f73c9d84aa05d851cdc5d Mon Sep 17 00:00:00 2001 From: Mitsuhiro Sakamoto <50359861+mitukou1109@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:32:12 +0900 Subject: [PATCH 086/127] feat(remaining_distance_time_calculator): integrate generate_parameter_library (#8826) * add parameter description Signed-off-by: mitukou1109 * use parameter listener Signed-off-by: mitukou1109 * supress deprecated error Signed-off-by: mitukou1109 * change scope of compile option to private Signed-off-by: mitukou1109 --------- Signed-off-by: mitukou1109 --- .../CMakeLists.txt | 12 ++++++++++++ .../package.xml | 1 + ...emaining_distance_time_calculator_parameters.yaml | 4 ++++ .../src/remaining_distance_time_calculator_node.cpp | 6 ++++-- .../src/remaining_distance_time_calculator_node.hpp | 8 ++------ 5 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 planning/autoware_remaining_distance_time_calculator/param/remaining_distance_time_calculator_parameters.yaml diff --git a/planning/autoware_remaining_distance_time_calculator/CMakeLists.txt b/planning/autoware_remaining_distance_time_calculator/CMakeLists.txt index d29a153a0ce5d..31fc4b1572f33 100644 --- a/planning/autoware_remaining_distance_time_calculator/CMakeLists.txt +++ b/planning/autoware_remaining_distance_time_calculator/CMakeLists.txt @@ -4,10 +4,22 @@ project(autoware_remaining_distance_time_calculator) find_package(autoware_cmake REQUIRED) autoware_package() +generate_parameter_library(remaining_distance_time_calculator_parameters + param/remaining_distance_time_calculator_parameters.yaml +) + ament_auto_add_library(${PROJECT_NAME} SHARED src/remaining_distance_time_calculator_node.cpp ) +target_link_libraries(${PROJECT_NAME} + remaining_distance_time_calculator_parameters +) + +target_compile_options(${PROJECT_NAME} PRIVATE + -Wno-error=deprecated-declarations +) + rclcpp_components_register_node(${PROJECT_NAME} PLUGIN "autoware::remaining_distance_time_calculator::RemainingDistanceTimeCalculatorNode" EXECUTABLE ${PROJECT_NAME}_node diff --git a/planning/autoware_remaining_distance_time_calculator/package.xml b/planning/autoware_remaining_distance_time_calculator/package.xml index 924e6d62d6aba..568f677a0c13d 100644 --- a/planning/autoware_remaining_distance_time_calculator/package.xml +++ b/planning/autoware_remaining_distance_time_calculator/package.xml @@ -18,6 +18,7 @@ autoware_route_handler autoware_test_utils autoware_universe_utils + generate_parameter_library geometry_msgs nav_msgs rclcpp diff --git a/planning/autoware_remaining_distance_time_calculator/param/remaining_distance_time_calculator_parameters.yaml b/planning/autoware_remaining_distance_time_calculator/param/remaining_distance_time_calculator_parameters.yaml new file mode 100644 index 0000000000000..0f1b1b9efbb6d --- /dev/null +++ b/planning/autoware_remaining_distance_time_calculator/param/remaining_distance_time_calculator_parameters.yaml @@ -0,0 +1,4 @@ +remaining_distance_time_calculator: + update_rate: + type: double + description: Timer callback period. [Hz] diff --git a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp index 7932a2531185f..74f3f2f43077d 100644 --- a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp +++ b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.cpp @@ -65,9 +65,11 @@ RemainingDistanceTimeCalculatorNode::RemainingDistanceTimeCalculatorNode( "~/output/mission_remaining_distance_time", rclcpp::QoS(rclcpp::KeepLast(10)).durability_volatile().reliable()); - node_param_.update_rate = declare_parameter("update_rate"); + param_listener_ = std::make_shared<::remaining_distance_time_calculator::ParamListener>( + this->get_node_parameters_interface()); + const auto param = param_listener_->get_params(); - const auto period_ns = rclcpp::Rate(node_param_.update_rate).period(); + const auto period_ns = rclcpp::Rate(param.update_rate).period(); timer_ = rclcpp::create_timer( this, get_clock(), period_ns, std::bind(&RemainingDistanceTimeCalculatorNode::on_timer, this)); } diff --git a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp index b7af8861bf524..8a38941d383ee 100644 --- a/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp +++ b/planning/autoware_remaining_distance_time_calculator/src/remaining_distance_time_calculator_node.hpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -39,11 +40,6 @@ namespace autoware::remaining_distance_time_calculator { -struct NodeParam -{ - double update_rate{0.0}; -}; - class RemainingDistanceTimeCalculatorNode : public rclcpp::Node { public: @@ -86,7 +82,7 @@ class RemainingDistanceTimeCalculatorNode : public rclcpp::Node double remaining_time_; // Parameter - NodeParam node_param_; + std::shared_ptr<::remaining_distance_time_calculator::ParamListener> param_listener_; // Callbacks void on_timer(); From 87d7988fae3ac1b135caa6de0c6911da8e4e154d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=83=E5=88=9A?= <90366790+liuXinGangChina@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:41:50 +0800 Subject: [PATCH 087/127] feat(autoware_localization_util): porting from universe to core, autoware_localization_util, remove from universe repo (#9888) task: porting from universe to core, autoware_localization_util, remove from universe repo : v0.0 Signed-off-by: liuXinGangChina --- .../autoware_localization_util/CHANGELOG.rst | 51 ---- .../autoware_localization_util/CMakeLists.txt | 29 -- .../autoware_localization_util/README.md | 5 - .../localization_util/covariance_ellipse.hpp | 44 --- .../localization_util/matrix_type.hpp | 26 -- .../localization_util/smart_pose_buffer.hpp | 71 ----- .../tree_structured_parzen_estimator.hpp | 87 ------ .../autoware/localization_util/util_func.hpp | 88 ------ .../autoware_localization_util/package.xml | 35 --- .../src/covariance_ellipse.cpp | 92 ------- .../src/smart_pose_buffer.cpp | 158 ----------- .../src/tree_structured_parzen_estimator.cpp | 185 ------------- .../src/util_func.cpp | 257 ------------------ .../test/test_smart_pose_buffer.cpp | 109 -------- .../test/test_tpe.cpp | 75 ----- 15 files changed, 1312 deletions(-) delete mode 100644 localization/autoware_localization_util/CHANGELOG.rst delete mode 100644 localization/autoware_localization_util/CMakeLists.txt delete mode 100644 localization/autoware_localization_util/README.md delete mode 100644 localization/autoware_localization_util/include/autoware/localization_util/covariance_ellipse.hpp delete mode 100644 localization/autoware_localization_util/include/autoware/localization_util/matrix_type.hpp delete mode 100644 localization/autoware_localization_util/include/autoware/localization_util/smart_pose_buffer.hpp delete mode 100644 localization/autoware_localization_util/include/autoware/localization_util/tree_structured_parzen_estimator.hpp delete mode 100644 localization/autoware_localization_util/include/autoware/localization_util/util_func.hpp delete mode 100644 localization/autoware_localization_util/package.xml delete mode 100644 localization/autoware_localization_util/src/covariance_ellipse.cpp delete mode 100644 localization/autoware_localization_util/src/smart_pose_buffer.cpp delete mode 100644 localization/autoware_localization_util/src/tree_structured_parzen_estimator.cpp delete mode 100644 localization/autoware_localization_util/src/util_func.cpp delete mode 100644 localization/autoware_localization_util/test/test_smart_pose_buffer.cpp delete mode 100644 localization/autoware_localization_util/test/test_tpe.cpp diff --git a/localization/autoware_localization_util/CHANGELOG.rst b/localization/autoware_localization_util/CHANGELOG.rst deleted file mode 100644 index be40e3ee8560e..0000000000000 --- a/localization/autoware_localization_util/CHANGELOG.rst +++ /dev/null @@ -1,51 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_localization_util -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Merge branch 'main' into release-0.40.0 -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* fix(cpplint): include what you use - localization (`#9567 `_) -* 0.39.0 -* update changelog -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Fumiya Watanabe, M. Fatih Cırıt, Ryohsuke Mitsudome, Yutaka Kondo - -0.39.0 (2024-11-25) -------------------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* refactor(localization_util)!: prefix package and namespace with autoware (`#8922 `_) - add autoware prefix to localization_util -* Contributors: Masaki Baba, Yutaka Kondo - -0.26.0 (2024-04-03) -------------------- diff --git a/localization/autoware_localization_util/CMakeLists.txt b/localization/autoware_localization_util/CMakeLists.txt deleted file mode 100644 index de62633124f3d..0000000000000 --- a/localization/autoware_localization_util/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_localization_util) - -find_package(autoware_cmake REQUIRED) -autoware_package() - -ament_auto_add_library(${PROJECT_NAME} SHARED - src/util_func.cpp - src/smart_pose_buffer.cpp - src/tree_structured_parzen_estimator.cpp - src/covariance_ellipse.cpp -) - -if(BUILD_TESTING) - find_package(ament_cmake_gtest REQUIRED) - ament_auto_add_gtest(test_smart_pose_buffer - test/test_smart_pose_buffer.cpp - src/smart_pose_buffer.cpp - ) - - ament_auto_add_gtest(test_tpe - test/test_tpe.cpp - src/tree_structured_parzen_estimator.cpp - ) -endif() - -ament_auto_package( - INSTALL_TO_SHARE -) diff --git a/localization/autoware_localization_util/README.md b/localization/autoware_localization_util/README.md deleted file mode 100644 index f7fddd9eebf05..0000000000000 --- a/localization/autoware_localization_util/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# autoware_localization_util - -`autoware_localization_util` is a localization utility package. - -This package does not have a node, it is just a library. diff --git a/localization/autoware_localization_util/include/autoware/localization_util/covariance_ellipse.hpp b/localization/autoware_localization_util/include/autoware/localization_util/covariance_ellipse.hpp deleted file mode 100644 index abd0af46856b0..0000000000000 --- a/localization/autoware_localization_util/include/autoware/localization_util/covariance_ellipse.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2024 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__LOCALIZATION_UTIL__COVARIANCE_ELLIPSE_HPP_ -#define AUTOWARE__LOCALIZATION_UTIL__COVARIANCE_ELLIPSE_HPP_ - -#include - -#include -#include - -namespace autoware::localization_util -{ - -struct Ellipse -{ - double long_radius; - double short_radius; - double yaw; - Eigen::Matrix2d P; - double size_lateral_direction; -}; - -Ellipse calculate_xy_ellipse( - const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance, const double scale); - -visualization_msgs::msg::Marker create_ellipse_marker( - const Ellipse & ellipse, const std_msgs::msg::Header & header, - const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance); - -} // namespace autoware::localization_util - -#endif // AUTOWARE__LOCALIZATION_UTIL__COVARIANCE_ELLIPSE_HPP_ diff --git a/localization/autoware_localization_util/include/autoware/localization_util/matrix_type.hpp b/localization/autoware_localization_util/include/autoware/localization_util/matrix_type.hpp deleted file mode 100644 index bda6ff19f2867..0000000000000 --- a/localization/autoware_localization_util/include/autoware/localization_util/matrix_type.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2021 TierIV -// -// 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. - -#ifndef AUTOWARE__LOCALIZATION_UTIL__MATRIX_TYPE_HPP_ -#define AUTOWARE__LOCALIZATION_UTIL__MATRIX_TYPE_HPP_ - -#include - -namespace autoware::localization_util -{ -using Matrix6d = Eigen::Matrix; -using RowMatrixXd = Eigen::Matrix; -} // namespace autoware::localization_util - -#endif // AUTOWARE__LOCALIZATION_UTIL__MATRIX_TYPE_HPP_ diff --git a/localization/autoware_localization_util/include/autoware/localization_util/smart_pose_buffer.hpp b/localization/autoware_localization_util/include/autoware/localization_util/smart_pose_buffer.hpp deleted file mode 100644 index 8c10506c36753..0000000000000 --- a/localization/autoware_localization_util/include/autoware/localization_util/smart_pose_buffer.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2015-2019 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__LOCALIZATION_UTIL__SMART_POSE_BUFFER_HPP_ -#define AUTOWARE__LOCALIZATION_UTIL__SMART_POSE_BUFFER_HPP_ - -#include "autoware/localization_util/util_func.hpp" - -#include - -#include - -#include - -namespace autoware::localization_util -{ -class SmartPoseBuffer -{ -private: - using PoseWithCovarianceStamped = geometry_msgs::msg::PoseWithCovarianceStamped; - -public: - struct InterpolateResult - { - PoseWithCovarianceStamped old_pose; - PoseWithCovarianceStamped new_pose; - PoseWithCovarianceStamped interpolated_pose; - }; - - SmartPoseBuffer() = delete; - SmartPoseBuffer( - const rclcpp::Logger & logger, const double & pose_timeout_sec, - const double & pose_distance_tolerance_meters); - - std::optional interpolate(const rclcpp::Time & target_ros_time); - - void push_back(const PoseWithCovarianceStamped::ConstSharedPtr & pose_msg_ptr); - - void pop_old(const rclcpp::Time & target_ros_time); - - void clear(); - -private: - rclcpp::Logger logger_; - std::deque pose_buffer_; - std::mutex mutex_; // This mutex is for pose_buffer_ - - const double pose_timeout_sec_; - const double pose_distance_tolerance_meters_; - - [[nodiscard]] bool validate_time_stamp_difference( - const rclcpp::Time & target_time, const rclcpp::Time & reference_time, - const double time_tolerance_sec) const; - [[nodiscard]] bool validate_position_difference( - const geometry_msgs::msg::Point & target_point, - const geometry_msgs::msg::Point & reference_point, const double distance_tolerance_m_) const; -}; -} // namespace autoware::localization_util - -#endif // AUTOWARE__LOCALIZATION_UTIL__SMART_POSE_BUFFER_HPP_ diff --git a/localization/autoware_localization_util/include/autoware/localization_util/tree_structured_parzen_estimator.hpp b/localization/autoware_localization_util/include/autoware/localization_util/tree_structured_parzen_estimator.hpp deleted file mode 100644 index ddf7625c202ec..0000000000000 --- a/localization/autoware_localization_util/include/autoware/localization_util/tree_structured_parzen_estimator.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2023 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__LOCALIZATION_UTIL__TREE_STRUCTURED_PARZEN_ESTIMATOR_HPP_ -#define AUTOWARE__LOCALIZATION_UTIL__TREE_STRUCTURED_PARZEN_ESTIMATOR_HPP_ - -/* -A implementation of tree-structured parzen estimator (TPE) -See below pdf for the TPE algorithm detail. -https://papers.nips.cc/paper_files/paper/2011/file/86e8f7ab32cfd12577bc2619bc635690-Paper.pdf - -Optuna is also used as a reference for implementation. -https://github.com/optuna/optuna -*/ - -#include -#include -#include - -namespace autoware::localization_util -{ -class TreeStructuredParzenEstimator -{ -public: - using Input = std::vector; - using Score = double; - struct Trial - { - Input input; - Score score; - }; - - enum Direction { - MINIMIZE = 0, - MAXIMIZE = 1, - }; - - enum Index { - TRANS_X = 0, - TRANS_Y = 1, - TRANS_Z = 2, - ANGLE_X = 3, - ANGLE_Y = 4, - ANGLE_Z = 5, - INDEX_NUM = 6, - }; - - TreeStructuredParzenEstimator() = delete; - TreeStructuredParzenEstimator( - const Direction direction, const int64_t n_startup_trials, std::vector sample_mean, - std::vector sample_stddev); - void add_trial(const Trial & trial); - [[nodiscard]] Input get_next_input() const; - -private: - static constexpr double max_good_rate = 0.10; - static constexpr int64_t n_ei_candidates = 100; - - static std::mt19937_64 engine; - - [[nodiscard]] double compute_log_likelihood_ratio(const Input & input) const; - [[nodiscard]] static double log_gaussian_pdf( - const Input & input, const Input & mu, const Input & sigma); - - std::vector trials_; - int64_t above_num_; - const Direction direction_; - const int64_t n_startup_trials_; - const int64_t input_dimension_; - const std::vector sample_mean_; - const std::vector sample_stddev_; - Input base_stddev_; -}; -} // namespace autoware::localization_util - -#endif // AUTOWARE__LOCALIZATION_UTIL__TREE_STRUCTURED_PARZEN_ESTIMATOR_HPP_ diff --git a/localization/autoware_localization_util/include/autoware/localization_util/util_func.hpp b/localization/autoware_localization_util/include/autoware/localization_util/util_func.hpp deleted file mode 100644 index bef9968f34b6f..0000000000000 --- a/localization/autoware_localization_util/include/autoware/localization_util/util_func.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2015-2019 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__LOCALIZATION_UTIL__UTIL_FUNC_HPP_ -#define AUTOWARE__LOCALIZATION_UTIL__UTIL_FUNC_HPP_ - -#include -#include -#include -#include - -#ifdef ROS_DISTRO_GALACTIC -#include -#include -#else -#include - -#include -#endif - -#include -#include -#include -#include -#include -#include - -namespace autoware::localization_util -{ -// ref by http://takacity.blog.fc2.com/blog-entry-69.html -std_msgs::msg::ColorRGBA exchange_color_crc(double x); - -double calc_diff_for_radian(const double lhs_rad, const double rhs_rad); - -// x: roll, y: pitch, z: yaw -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::Pose & pose); -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::PoseStamped & pose); -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::PoseWithCovarianceStamped & pose); - -geometry_msgs::msg::Quaternion rpy_rad_to_quaternion( - const double r_rad, const double p_rad, const double y_rad); -geometry_msgs::msg::Quaternion rpy_deg_to_quaternion( - const double r_deg, const double p_deg, const double y_deg); - -geometry_msgs::msg::Twist calc_twist( - const geometry_msgs::msg::PoseStamped & pose_a, const geometry_msgs::msg::PoseStamped & pose_b); - -geometry_msgs::msg::PoseStamped interpolate_pose( - const geometry_msgs::msg::PoseStamped & pose_a, const geometry_msgs::msg::PoseStamped & pose_b, - const rclcpp::Time & time_stamp); - -geometry_msgs::msg::PoseStamped interpolate_pose( - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_a, - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_b, const rclcpp::Time & time_stamp); - -Eigen::Affine3d pose_to_affine3d(const geometry_msgs::msg::Pose & ros_pose); -Eigen::Matrix4f pose_to_matrix4f(const geometry_msgs::msg::Pose & ros_pose); -geometry_msgs::msg::Pose matrix4f_to_pose(const Eigen::Matrix4f & eigen_pose_matrix); -Eigen::Vector3d point_to_vector3d(const geometry_msgs::msg::Point & ros_pos); - -template -T transform(const T & input, const geometry_msgs::msg::TransformStamped & transform) -{ - T output; - tf2::doTransform(input, output, transform); - return output; -} - -double norm(const geometry_msgs::msg::Point & p1, const geometry_msgs::msg::Point & p2); - -void output_pose_with_cov_to_log( - const rclcpp::Logger & logger, const std::string & prefix, - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_with_cov); - -} // namespace autoware::localization_util - -#endif // AUTOWARE__LOCALIZATION_UTIL__UTIL_FUNC_HPP_ diff --git a/localization/autoware_localization_util/package.xml b/localization/autoware_localization_util/package.xml deleted file mode 100644 index 89ad7c24840dd..0000000000000 --- a/localization/autoware_localization_util/package.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - autoware_localization_util - 0.40.0 - The autoware_localization_util package - Yamato Ando - Masahiro Sakamoto - Shintaro Sakoda - Kento Yabuuchi - NGUYEN Viet Anh - Taiki Yamada - Ryu Yamamoto - Apache License 2.0 - Yamato Ando - - ament_cmake_auto - autoware_cmake - - diagnostic_msgs - geometry_msgs - rclcpp - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - visualization_msgs - - ament_cmake_cppcheck - ament_lint_auto - - - ament_cmake - - diff --git a/localization/autoware_localization_util/src/covariance_ellipse.cpp b/localization/autoware_localization_util/src/covariance_ellipse.cpp deleted file mode 100644 index 847f89e0da9b3..0000000000000 --- a/localization/autoware_localization_util/src/covariance_ellipse.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2024 Autoware Foundation -// -// 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. - -#include "autoware/localization_util/covariance_ellipse.hpp" - -#include - -#include -#ifdef ROS_DISTRO_GALACTIC -#include -#else -#include -#endif - -namespace autoware::localization_util -{ - -Ellipse calculate_xy_ellipse( - const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance, const double scale) -{ - // input geometry_msgs::PoseWithCovariance contain 6x6 matrix - Eigen::Matrix2d xy_covariance; - const auto cov = pose_with_covariance.covariance; - xy_covariance(0, 0) = cov[0 * 6 + 0]; - xy_covariance(0, 1) = cov[0 * 6 + 1]; - xy_covariance(1, 0) = cov[1 * 6 + 0]; - xy_covariance(1, 1) = cov[1 * 6 + 1]; - - Eigen::SelfAdjointEigenSolver eigensolver(xy_covariance); - - Ellipse ellipse; - - // eigen values and vectors are sorted in ascending order - ellipse.long_radius = scale * std::sqrt(eigensolver.eigenvalues()(1)); - ellipse.short_radius = scale * std::sqrt(eigensolver.eigenvalues()(0)); - - // principal component vector - const Eigen::Vector2d pc_vector = eigensolver.eigenvectors().col(1); - ellipse.yaw = std::atan2(pc_vector.y(), pc_vector.x()); - - // ellipse size along lateral direction (body-frame) - ellipse.P = xy_covariance; - const double yaw_vehicle = tf2::getYaw(pose_with_covariance.pose.orientation); - const Eigen::Matrix2d & p_inv = ellipse.P.inverse(); - Eigen::MatrixXd e(2, 1); - e(0, 0) = std::cos(yaw_vehicle); - e(1, 0) = std::sin(yaw_vehicle); - const double d = std::sqrt((e.transpose() * p_inv * e)(0, 0) / p_inv.determinant()); - ellipse.size_lateral_direction = scale * d; - - return ellipse; -} - -visualization_msgs::msg::Marker create_ellipse_marker( - const Ellipse & ellipse, const std_msgs::msg::Header & header, - const geometry_msgs::msg::PoseWithCovariance & pose_with_covariance) -{ - tf2::Quaternion quat; - quat.setEuler(0, 0, ellipse.yaw); - - const double ellipse_long_radius = std::min(ellipse.long_radius, 30.0); - const double ellipse_short_radius = std::min(ellipse.short_radius, 30.0); - visualization_msgs::msg::Marker marker; - marker.header = header; - marker.ns = "error_ellipse"; - marker.id = 0; - marker.type = visualization_msgs::msg::Marker::SPHERE; - marker.action = visualization_msgs::msg::Marker::ADD; - marker.pose = pose_with_covariance.pose; - marker.pose.orientation = tf2::toMsg(quat); - marker.scale.x = ellipse_long_radius * 2; - marker.scale.y = ellipse_short_radius * 2; - marker.scale.z = 0.01; - marker.color.a = 0.1; - marker.color.r = 0.0; - marker.color.g = 0.0; - marker.color.b = 1.0; - return marker; -} - -} // namespace autoware::localization_util diff --git a/localization/autoware_localization_util/src/smart_pose_buffer.cpp b/localization/autoware_localization_util/src/smart_pose_buffer.cpp deleted file mode 100644 index 3b529d68cf6c5..0000000000000 --- a/localization/autoware_localization_util/src/smart_pose_buffer.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2023- Autoware Foundation -// -// 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. - -#include "autoware/localization_util/smart_pose_buffer.hpp" - -namespace autoware::localization_util -{ -SmartPoseBuffer::SmartPoseBuffer( - const rclcpp::Logger & logger, const double & pose_timeout_sec, - const double & pose_distance_tolerance_meters) -: logger_(logger), - pose_timeout_sec_(pose_timeout_sec), - pose_distance_tolerance_meters_(pose_distance_tolerance_meters) -{ -} - -std::optional SmartPoseBuffer::interpolate( - const rclcpp::Time & target_ros_time) -{ - InterpolateResult result; - - { - std::lock_guard lock(mutex_); - - if (pose_buffer_.size() < 2) { - RCLCPP_INFO(logger_, "pose_buffer_.size() < 2"); - return std::nullopt; - } - - const rclcpp::Time time_first = pose_buffer_.front()->header.stamp; - const rclcpp::Time time_last = pose_buffer_.back()->header.stamp; - - if (target_ros_time < time_first) { - RCLCPP_INFO(logger_, "Mismatch between pose timestamp and current timestamp"); - return std::nullopt; - } - - // [time_last < target_ros_time] is acceptable here. - // It is possible that the target_ros_time (often sensor timestamp) is newer than the latest - // timestamp of buffered pose (often EKF). - // However, if the timestamp difference is too large, - // it will later be rejected by validate_time_stamp_difference. - - // get the nearest poses - result.old_pose = *pose_buffer_.front(); - for (const PoseWithCovarianceStamped::ConstSharedPtr & pose_cov_msg_ptr : pose_buffer_) { - result.new_pose = *pose_cov_msg_ptr; - const rclcpp::Time pose_time_stamp = result.new_pose.header.stamp; - if (pose_time_stamp > target_ros_time) { - break; - } - result.old_pose = *pose_cov_msg_ptr; - } - } - - // check the time stamp - const bool is_old_pose_valid = validate_time_stamp_difference( - result.old_pose.header.stamp, target_ros_time, pose_timeout_sec_); - const bool is_new_pose_valid = validate_time_stamp_difference( - result.new_pose.header.stamp, target_ros_time, pose_timeout_sec_); - - // check the position jumping (ex. immediately after the initial pose estimation) - const bool is_pose_diff_valid = validate_position_difference( - result.old_pose.pose.pose.position, result.new_pose.pose.pose.position, - pose_distance_tolerance_meters_); - - // all validations must be true - if (!(is_old_pose_valid && is_new_pose_valid && is_pose_diff_valid)) { - return std::nullopt; - } - - // interpolate the pose - const geometry_msgs::msg::PoseStamped interpolated_pose_msg = - interpolate_pose(result.old_pose, result.new_pose, target_ros_time); - result.interpolated_pose.header = interpolated_pose_msg.header; - result.interpolated_pose.pose.pose = interpolated_pose_msg.pose; - // This does not interpolate the covariance. - // interpolated_pose.pose.covariance is always set to old_pose.covariance - result.interpolated_pose.pose.covariance = result.old_pose.pose.covariance; - return result; -} - -void SmartPoseBuffer::push_back(const PoseWithCovarianceStamped::ConstSharedPtr & pose_msg_ptr) -{ - std::lock_guard lock(mutex_); - if (!pose_buffer_.empty()) { - // Check for non-chronological timestamp order - // This situation can arise when replaying a rosbag multiple times - const rclcpp::Time end_time = pose_buffer_.back()->header.stamp; - const rclcpp::Time msg_time = pose_msg_ptr->header.stamp; - if (msg_time < end_time) { - // Clear the buffer if timestamps are reversed to maintain chronological order - pose_buffer_.clear(); - } - } - pose_buffer_.push_back(pose_msg_ptr); -} - -void SmartPoseBuffer::pop_old(const rclcpp::Time & target_ros_time) -{ - std::lock_guard lock(mutex_); - while (!pose_buffer_.empty()) { - if (rclcpp::Time(pose_buffer_.front()->header.stamp) >= target_ros_time) { - break; - } - pose_buffer_.pop_front(); - } -} - -void SmartPoseBuffer::clear() -{ - std::lock_guard lock(mutex_); - pose_buffer_.clear(); -} - -bool SmartPoseBuffer::validate_time_stamp_difference( - const rclcpp::Time & target_time, const rclcpp::Time & reference_time, - const double time_tolerance_sec) const -{ - const double dt = std::abs((target_time - reference_time).seconds()); - const bool success = dt < time_tolerance_sec; - if (!success) { - RCLCPP_WARN( - logger_, - "Validation error. The reference time is %lf[sec], but the target time is %lf[sec]. The " - "difference is %lf[sec] (the tolerance is %lf[sec]).", - reference_time.seconds(), target_time.seconds(), dt, time_tolerance_sec); - } - return success; -} - -bool SmartPoseBuffer::validate_position_difference( - const geometry_msgs::msg::Point & target_point, const geometry_msgs::msg::Point & reference_point, - const double distance_tolerance_m_) const -{ - const double distance = norm(target_point, reference_point); - const bool success = distance < distance_tolerance_m_; - if (!success) { - RCLCPP_WARN( - logger_, - "Validation error. The distance from reference position to target position is %lf[m] (the " - "tolerance is %lf[m]).", - distance, distance_tolerance_m_); - } - return success; -} -} // namespace autoware::localization_util diff --git a/localization/autoware_localization_util/src/tree_structured_parzen_estimator.cpp b/localization/autoware_localization_util/src/tree_structured_parzen_estimator.cpp deleted file mode 100644 index e9f0318d1e06d..0000000000000 --- a/localization/autoware_localization_util/src/tree_structured_parzen_estimator.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2023 Autoware Foundation -// -// 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. - -#include "autoware/localization_util/tree_structured_parzen_estimator.hpp" - -#include -#include -#include -#include -#include -#include -#include - -namespace autoware::localization_util -{ -// random number generator -std::mt19937_64 TreeStructuredParzenEstimator::engine(0); - -TreeStructuredParzenEstimator::TreeStructuredParzenEstimator( - const Direction direction, const int64_t n_startup_trials, std::vector sample_mean, - std::vector sample_stddev) -: above_num_(0), - direction_(direction), - n_startup_trials_(n_startup_trials), - input_dimension_(INDEX_NUM), - sample_mean_(std::move(sample_mean)), - sample_stddev_(std::move(sample_stddev)) -{ - if (sample_mean_.size() != ANGLE_Z) { - std::cerr << "sample_mean size is invalid" << std::endl; - throw std::runtime_error("sample_mean size is invalid"); - } - if (sample_stddev_.size() != ANGLE_Z) { - std::cerr << "sample_stddev size is invalid" << std::endl; - throw std::runtime_error("sample_stddev size is invalid"); - } - // base_stddev_ is defined as the stable convergence range of ndt_scan_matcher. - base_stddev_.resize(input_dimension_); - base_stddev_[TRANS_X] = 0.25; // [m] - base_stddev_[TRANS_Y] = 0.25; // [m] - base_stddev_[TRANS_Z] = 0.25; // [m] - base_stddev_[ANGLE_X] = 1.0 / 180.0 * M_PI; // [rad] - base_stddev_[ANGLE_Y] = 1.0 / 180.0 * M_PI; // [rad] - base_stddev_[ANGLE_Z] = 2.5 / 180.0 * M_PI; // [rad] -} - -void TreeStructuredParzenEstimator::add_trial(const Trial & trial) -{ - trials_.push_back(trial); - std::sort(trials_.begin(), trials_.end(), [this](const Trial & lhs, const Trial & rhs) { - return (direction_ == Direction::MAXIMIZE ? lhs.score > rhs.score : lhs.score < rhs.score); - }); - above_num_ = std::min( - {static_cast(10), - static_cast(static_cast(trials_.size()) * max_good_rate)}); -} - -TreeStructuredParzenEstimator::Input TreeStructuredParzenEstimator::get_next_input() const -{ - std::normal_distribution dist_normal_trans_x( - sample_mean_[TRANS_X], sample_stddev_[TRANS_X]); - std::normal_distribution dist_normal_trans_y( - sample_mean_[TRANS_Y], sample_stddev_[TRANS_Y]); - std::normal_distribution dist_normal_trans_z( - sample_mean_[TRANS_Z], sample_stddev_[TRANS_Z]); - std::normal_distribution dist_normal_angle_x( - sample_mean_[ANGLE_X], sample_stddev_[ANGLE_X]); - std::normal_distribution dist_normal_angle_y( - sample_mean_[ANGLE_Y], sample_stddev_[ANGLE_Y]); - std::uniform_real_distribution dist_uniform_angle_z(-M_PI, M_PI); - - if (static_cast(trials_.size()) < n_startup_trials_ || above_num_ == 0) { - // Random sampling based on prior until the number of trials reaches `n_startup_trials_`. - Input input(input_dimension_); - input[TRANS_X] = dist_normal_trans_x(engine); - input[TRANS_Y] = dist_normal_trans_y(engine); - input[TRANS_Z] = dist_normal_trans_z(engine); - input[ANGLE_X] = dist_normal_angle_x(engine); - input[ANGLE_Y] = dist_normal_angle_y(engine); - input[ANGLE_Z] = dist_uniform_angle_z(engine); - return input; - } - - Input best_input; - double best_log_likelihood_ratio = std::numeric_limits::lowest(); - for (int64_t i = 0; i < n_ei_candidates; i++) { - Input input(input_dimension_); - input[TRANS_X] = dist_normal_trans_x(engine); - input[TRANS_Y] = dist_normal_trans_y(engine); - input[TRANS_Z] = dist_normal_trans_z(engine); - input[ANGLE_X] = dist_normal_angle_x(engine); - input[ANGLE_Y] = dist_normal_angle_y(engine); - input[ANGLE_Z] = dist_uniform_angle_z(engine); - const double log_likelihood_ratio = compute_log_likelihood_ratio(input); - if (log_likelihood_ratio > best_log_likelihood_ratio) { - best_log_likelihood_ratio = log_likelihood_ratio; - best_input = input; - } - } - return best_input; -} - -double TreeStructuredParzenEstimator::compute_log_likelihood_ratio(const Input & input) const -{ - const auto n = static_cast(trials_.size()); - - // The above KDE and the below KDE are calculated respectively, and the ratio is the criteria to - // select best sample. - std::vector above_logs; - std::vector below_logs; - - for (int64_t i = 0; i < n; i++) { - const double log_p = log_gaussian_pdf(input, trials_[i].input, base_stddev_); - if (i < above_num_) { - const double w = 1.0 / static_cast(above_num_); - const double log_w = std::log(w); - above_logs.push_back(log_p + log_w); - } else { - const double w = 1.0 / static_cast(n - above_num_); - const double log_w = std::log(w); - below_logs.push_back(log_p + log_w); - } - } - - auto log_sum_exp = [](const std::vector & log_vec) { - const double max = *std::max_element(log_vec.begin(), log_vec.end()); - double sum = std::accumulate( - log_vec.begin(), log_vec.end(), 0.0, - [max](double total, double log_v) { return total + std::exp(log_v - max); }); - return max + std::log(sum); - }; - - const double above = log_sum_exp(above_logs); - const double below = log_sum_exp(below_logs); - - // Multiply by a constant so that the score near the "below sample" becomes lower. - // cspell:disable-line TODO(Shintaro Sakoda): It's theoretically incorrect, consider it again - // later. - const double r = above - below * 5.0; - return r; -} - -double TreeStructuredParzenEstimator::log_gaussian_pdf( - const Input & input, const Input & mu, const Input & sigma) -{ - const double log_2pi = std::log(2.0 * M_PI); - auto log_gaussian_pdf_1d = [&](const double diff, const double sigma) { - return -0.5 * log_2pi - std::log(sigma) - (diff * diff) / (2.0 * sigma * sigma); - }; - - const auto n = static_cast(input.size()); - - double result = 0.0; - for (int64_t i = 0; i < n; i++) { - double diff = input[i] - mu[i]; - if (i == ANGLE_Z) { - // Normalize the loop variable to [-pi, pi) - while (diff >= M_PI) { - diff -= 2 * M_PI; - } - while (diff < -M_PI) { - diff += 2 * M_PI; - } - } - // Experimentally, it is better to consider only trans_xy and yaw, so ignore trans_z, angle_x, - // angle_y. - if (i == TRANS_Z || i == ANGLE_X || i == ANGLE_Y) { - continue; - } - result += log_gaussian_pdf_1d(diff, sigma[i]); - } - return result; -} -} // namespace autoware::localization_util diff --git a/localization/autoware_localization_util/src/util_func.cpp b/localization/autoware_localization_util/src/util_func.cpp deleted file mode 100644 index 17187a8d732f0..0000000000000 --- a/localization/autoware_localization_util/src/util_func.cpp +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2015-2019 Autoware Foundation -// -// 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. - -#include "autoware/localization_util/util_func.hpp" - -#include "autoware/localization_util/matrix_type.hpp" - -#include -#include - -namespace autoware::localization_util -{ -// ref by http://takacity.blog.fc2.com/blog-entry-69.html -std_msgs::msg::ColorRGBA exchange_color_crc(double x) -{ - std_msgs::msg::ColorRGBA color; - - x = std::max(x, 0.0); - x = std::min(x, 0.9999); - - if (x <= 0.25) { - color.b = 1.0; - color.g = static_cast(std::sin(x * 2.0 * M_PI)); - color.r = 0; - } else if (x <= 0.5) { - color.b = static_cast(std::sin(x * 2 * M_PI)); - color.g = 1.0; - color.r = 0; - } else if (x <= 0.75) { - color.b = 0; - color.g = 1.0; - color.r = static_cast(-std::sin(x * 2.0 * M_PI)); - } else { - color.b = 0; - color.g = static_cast(-std::sin(x * 2.0 * M_PI)); - color.r = 1.0; - } - color.a = 0.999; - return color; -} - -double calc_diff_for_radian(const double lhs_rad, const double rhs_rad) -{ - double diff_rad = lhs_rad - rhs_rad; - if (diff_rad > M_PI) { - diff_rad = diff_rad - 2 * M_PI; - } else if (diff_rad < -M_PI) { - diff_rad = diff_rad + 2 * M_PI; - } - return diff_rad; -} - -Eigen::Map make_eigen_covariance(const std::array & covariance) -{ - return {covariance.data(), 6, 6}; -} - -// x: roll, y: pitch, z: yaw -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::Pose & pose) -{ - geometry_msgs::msg::Vector3 rpy; - tf2::Quaternion q(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w); - tf2::Matrix3x3(q).getRPY(rpy.x, rpy.y, rpy.z); - return rpy; -} - -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::PoseStamped & pose) -{ - return get_rpy(pose.pose); -} - -geometry_msgs::msg::Vector3 get_rpy(const geometry_msgs::msg::PoseWithCovarianceStamped & pose) -{ - return get_rpy(pose.pose.pose); -} - -geometry_msgs::msg::Quaternion rpy_rad_to_quaternion( - const double r_rad, const double p_rad, const double y_rad) -{ - tf2::Quaternion q; - q.setRPY(r_rad, p_rad, y_rad); - geometry_msgs::msg::Quaternion quaternion_msg; - quaternion_msg.x = q.x(); - quaternion_msg.y = q.y(); - quaternion_msg.z = q.z(); - quaternion_msg.w = q.w(); - return quaternion_msg; -} - -geometry_msgs::msg::Quaternion rpy_deg_to_quaternion( - const double r_deg, const double p_deg, const double y_deg) -{ - const double r_rad = r_deg * M_PI / 180.0; - const double p_rad = p_deg * M_PI / 180.0; - const double y_rad = y_deg * M_PI / 180.0; - return rpy_rad_to_quaternion(r_rad, p_rad, y_rad); -} - -geometry_msgs::msg::Twist calc_twist( - const geometry_msgs::msg::PoseStamped & pose_a, const geometry_msgs::msg::PoseStamped & pose_b) -{ - const rclcpp::Duration dt = rclcpp::Time(pose_b.header.stamp) - rclcpp::Time(pose_a.header.stamp); - const double dt_s = dt.seconds(); - - if (dt_s == 0) { - return geometry_msgs::msg::Twist(); - } - - const auto pose_a_rpy = get_rpy(pose_a); - const auto pose_b_rpy = get_rpy(pose_b); - - geometry_msgs::msg::Vector3 diff_xyz; - geometry_msgs::msg::Vector3 diff_rpy; - - diff_xyz.x = pose_b.pose.position.x - pose_a.pose.position.x; - diff_xyz.y = pose_b.pose.position.y - pose_a.pose.position.y; - diff_xyz.z = pose_b.pose.position.z - pose_a.pose.position.z; - diff_rpy.x = calc_diff_for_radian(pose_b_rpy.x, pose_a_rpy.x); - diff_rpy.y = calc_diff_for_radian(pose_b_rpy.y, pose_a_rpy.y); - diff_rpy.z = calc_diff_for_radian(pose_b_rpy.z, pose_a_rpy.z); - - geometry_msgs::msg::Twist twist; - twist.linear.x = diff_xyz.x / dt_s; - twist.linear.y = diff_xyz.y / dt_s; - twist.linear.z = diff_xyz.z / dt_s; - twist.angular.x = diff_rpy.x / dt_s; - twist.angular.y = diff_rpy.y / dt_s; - twist.angular.z = diff_rpy.z / dt_s; - - return twist; -} - -geometry_msgs::msg::PoseStamped interpolate_pose( - const geometry_msgs::msg::PoseStamped & pose_a, const geometry_msgs::msg::PoseStamped & pose_b, - const rclcpp::Time & time_stamp) -{ - const rclcpp::Time pose_a_time_stamp = pose_a.header.stamp; - const rclcpp::Time pose_b_time_stamp = pose_b.header.stamp; - if ( - (pose_a_time_stamp.seconds() == 0.0) || (pose_b_time_stamp.seconds() == 0.0) || - (time_stamp.seconds() == 0.0)) { - return geometry_msgs::msg::PoseStamped(); - } - - const auto twist = calc_twist(pose_a, pose_b); - const double dt = (time_stamp - pose_a_time_stamp).seconds(); - - const auto pose_a_rpy = get_rpy(pose_a); - - geometry_msgs::msg::Vector3 xyz; - geometry_msgs::msg::Vector3 rpy; - xyz.x = pose_a.pose.position.x + twist.linear.x * dt; - xyz.y = pose_a.pose.position.y + twist.linear.y * dt; - xyz.z = pose_a.pose.position.z + twist.linear.z * dt; - rpy.x = pose_a_rpy.x + twist.angular.x * dt; - rpy.y = pose_a_rpy.y + twist.angular.y * dt; - rpy.z = pose_a_rpy.z + twist.angular.z * dt; - - tf2::Quaternion tf_quaternion; - tf_quaternion.setRPY(rpy.x, rpy.y, rpy.z); - - geometry_msgs::msg::PoseStamped pose; - pose.header = pose_a.header; - pose.header.stamp = time_stamp; - pose.pose.position.x = xyz.x; - pose.pose.position.y = xyz.y; - pose.pose.position.z = xyz.z; - pose.pose.orientation = tf2::toMsg(tf_quaternion); - return pose; -} - -geometry_msgs::msg::PoseStamped interpolate_pose( - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_a, - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_b, const rclcpp::Time & time_stamp) -{ - geometry_msgs::msg::PoseStamped tmp_pose_a; - tmp_pose_a.header = pose_a.header; - tmp_pose_a.pose = pose_a.pose.pose; - - geometry_msgs::msg::PoseStamped tmp_pose_b; - tmp_pose_b.header = pose_b.header; - tmp_pose_b.pose = pose_b.pose.pose; - - return interpolate_pose(tmp_pose_a, tmp_pose_b, time_stamp); -} - -Eigen::Affine3d pose_to_affine3d(const geometry_msgs::msg::Pose & ros_pose) -{ - Eigen::Affine3d eigen_pose; - tf2::fromMsg(ros_pose, eigen_pose); - return eigen_pose; -} - -Eigen::Matrix4f pose_to_matrix4f(const geometry_msgs::msg::Pose & ros_pose) -{ - Eigen::Affine3d eigen_pose_affine = pose_to_affine3d(ros_pose); - Eigen::Matrix4f eigen_pose_matrix = eigen_pose_affine.matrix().cast(); - return eigen_pose_matrix; -} - -Eigen::Vector3d point_to_vector3d(const geometry_msgs::msg::Point & ros_pos) -{ - Eigen::Vector3d eigen_pos; - eigen_pos.x() = ros_pos.x; - eigen_pos.y() = ros_pos.y; - eigen_pos.z() = ros_pos.z; - return eigen_pos; -} - -geometry_msgs::msg::Pose matrix4f_to_pose(const Eigen::Matrix4f & eigen_pose_matrix) -{ - Eigen::Affine3d eigen_pose_affine; - eigen_pose_affine.matrix() = eigen_pose_matrix.cast(); - geometry_msgs::msg::Pose ros_pose = tf2::toMsg(eigen_pose_affine); - return ros_pose; -} - -double norm(const geometry_msgs::msg::Point & p1, const geometry_msgs::msg::Point & p2) -{ - const double dx = p1.x - p2.x; - const double dy = p1.y - p2.y; - const double dz = p1.z - p2.z; - return std::sqrt(dx * dx + dy * dy + dz * dz); -} - -void output_pose_with_cov_to_log( - const rclcpp::Logger & logger, const std::string & prefix, - const geometry_msgs::msg::PoseWithCovarianceStamped & pose_with_cov) -{ - const Eigen::Map covariance = - make_eigen_covariance(pose_with_cov.pose.covariance); - const geometry_msgs::msg::Pose pose = pose_with_cov.pose.pose; - geometry_msgs::msg::Vector3 rpy = get_rpy(pose); - rpy.x = rpy.x * 180.0 / M_PI; - rpy.y = rpy.y * 180.0 / M_PI; - rpy.z = rpy.z * 180.0 / M_PI; - - RCLCPP_DEBUG_STREAM( - logger, std::fixed << prefix << "," << pose.position.x << "," << pose.position.y << "," - << pose.position.z << "," << pose.orientation.x << "," << pose.orientation.y - << "," << pose.orientation.z << "," << pose.orientation.w << "," << rpy.x - << "," << rpy.y << "," << rpy.z << "," << covariance(0, 0) << "," - << covariance(1, 1) << "," << covariance(2, 2) << "," << covariance(3, 3) - << "," << covariance(4, 4) << "," << covariance(5, 5)); -} -} // namespace autoware::localization_util diff --git a/localization/autoware_localization_util/test/test_smart_pose_buffer.cpp b/localization/autoware_localization_util/test/test_smart_pose_buffer.cpp deleted file mode 100644 index d55555682be84..0000000000000 --- a/localization/autoware_localization_util/test/test_smart_pose_buffer.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2023- Autoware Foundation -// -// 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. - -#include "autoware/localization_util/smart_pose_buffer.hpp" -#include "autoware/localization_util/util_func.hpp" - -#include -#include - -#include -#include - -#include -#include -#include - -using PoseWithCovarianceStamped = geometry_msgs::msg::PoseWithCovarianceStamped; -using SmartPoseBuffer = autoware::localization_util::SmartPoseBuffer; - -bool compare_pose( - const PoseWithCovarianceStamped & pose_a, const PoseWithCovarianceStamped & pose_b) -{ - return pose_a.header.stamp == pose_b.header.stamp && - pose_a.header.frame_id == pose_b.header.frame_id && - pose_a.pose.covariance == pose_b.pose.covariance && - pose_a.pose.pose.position.x == pose_b.pose.pose.position.x && - pose_a.pose.pose.position.y == pose_b.pose.pose.position.y && - pose_a.pose.pose.position.z == pose_b.pose.pose.position.z && - pose_a.pose.pose.orientation.x == pose_b.pose.pose.orientation.x && - pose_a.pose.pose.orientation.y == pose_b.pose.pose.orientation.y && - pose_a.pose.pose.orientation.z == pose_b.pose.pose.orientation.z && - pose_a.pose.pose.orientation.w == pose_b.pose.pose.orientation.w; -} - -TEST(TestSmartPoseBuffer, interpolate_pose) // NOLINT -{ - rclcpp::Logger logger = rclcpp::get_logger("test_logger"); - const double pose_timeout_sec = 10.0; - const double pose_distance_tolerance_meters = 100.0; - SmartPoseBuffer smart_pose_buffer(logger, pose_timeout_sec, pose_distance_tolerance_meters); - - // first data - PoseWithCovarianceStamped::SharedPtr old_pose_ptr = std::make_shared(); - old_pose_ptr->header.stamp.sec = 10; - old_pose_ptr->header.stamp.nanosec = 0; - old_pose_ptr->pose.pose.position.x = 10.0; - old_pose_ptr->pose.pose.position.y = 20.0; - old_pose_ptr->pose.pose.position.z = 0.0; - old_pose_ptr->pose.pose.orientation = - autoware::localization_util::rpy_deg_to_quaternion(0.0, 0.0, 0.0); - smart_pose_buffer.push_back(old_pose_ptr); - - // second data - PoseWithCovarianceStamped::SharedPtr new_pose_ptr = std::make_shared(); - new_pose_ptr->header.stamp.sec = 20; - new_pose_ptr->header.stamp.nanosec = 0; - new_pose_ptr->pose.pose.position.x = 20.0; - new_pose_ptr->pose.pose.position.y = 40.0; - new_pose_ptr->pose.pose.position.z = 0.0; - new_pose_ptr->pose.pose.orientation = - autoware::localization_util::rpy_deg_to_quaternion(0.0, 0.0, 90.0); - smart_pose_buffer.push_back(new_pose_ptr); - - // interpolate - builtin_interfaces::msg::Time target_ros_time_msg; - target_ros_time_msg.sec = 15; - target_ros_time_msg.nanosec = 0; - const std::optional & interpolate_result = - smart_pose_buffer.interpolate(target_ros_time_msg); - ASSERT_TRUE(interpolate_result.has_value()); - const SmartPoseBuffer::InterpolateResult result = interpolate_result.value(); - - // check old - EXPECT_TRUE(compare_pose(result.old_pose, *old_pose_ptr)); - - // check new - EXPECT_TRUE(compare_pose(result.new_pose, *new_pose_ptr)); - - // check interpolated - EXPECT_EQ(result.interpolated_pose.header.stamp.sec, 15); - EXPECT_EQ(result.interpolated_pose.header.stamp.nanosec, static_cast(0)); - EXPECT_EQ(result.interpolated_pose.pose.pose.position.x, 15.0); - EXPECT_EQ(result.interpolated_pose.pose.pose.position.y, 30.0); - EXPECT_EQ(result.interpolated_pose.pose.pose.position.z, 0.0); - const auto rpy = autoware::localization_util::get_rpy(result.interpolated_pose.pose.pose); - EXPECT_NEAR(rpy.x * 180 / M_PI, 0.0, 1e-6); - EXPECT_NEAR(rpy.y * 180 / M_PI, 0.0, 1e-6); - EXPECT_NEAR(rpy.z * 180 / M_PI, 45.0, 1e-6); -} - -int main(int argc, char ** argv) -{ - rclcpp::init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - int result = RUN_ALL_TESTS(); - rclcpp::shutdown(); - return result; -} diff --git a/localization/autoware_localization_util/test/test_tpe.cpp b/localization/autoware_localization_util/test/test_tpe.cpp deleted file mode 100644 index 2d71a385246b7..0000000000000 --- a/localization/autoware_localization_util/test/test_tpe.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2023 The Autoware Contributors -// -// 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. - -#include "autoware/localization_util/tree_structured_parzen_estimator.hpp" - -#include - -#include -#include -#include -#include -#include - -using TreeStructuredParzenEstimator = autoware::localization_util::TreeStructuredParzenEstimator; - -TEST(TreeStructuredParzenEstimatorTest, TPE_is_better_than_random_search_on_sphere_function) -{ - auto sphere_function = [](const TreeStructuredParzenEstimator::Input & input) { - double value = 0.0; - const auto n = static_cast(input.size()); - for (int64_t i = 0; i < n; i++) { - const double v = input[i] * 10; - value += v * v; - } - return value; - }; - - constexpr int64_t k_outer_trials_num = 20; - constexpr int64_t k_inner_trials_num = 200; - std::cout << std::fixed; - std::vector mean_scores; - std::vector sample_mean(5, 0.0); - std::vector sample_stddev{1.0, 1.0, 0.1, 0.1, 0.1}; - - for (const int64_t n_startup_trials : {k_inner_trials_num, k_inner_trials_num / 2}) { - const std::string method = ((n_startup_trials == k_inner_trials_num) ? "Random" : "TPE"); - - std::vector scores; - for (int64_t i = 0; i < k_outer_trials_num; i++) { - double best_score = std::numeric_limits::lowest(); - TreeStructuredParzenEstimator estimator( - TreeStructuredParzenEstimator::Direction::MAXIMIZE, n_startup_trials, sample_mean, - sample_stddev); - for (int64_t trial = 0; trial < k_inner_trials_num; trial++) { - const TreeStructuredParzenEstimator::Input input = estimator.get_next_input(); - const double score = -sphere_function(input); - estimator.add_trial({input, score}); - best_score = std::max(best_score, score); - } - scores.push_back(best_score); - } - - const double sum = std::accumulate(scores.begin(), scores.end(), 0.0); - const double mean = sum / static_cast(scores.size()); - mean_scores.push_back(mean); - double sq_sum = std::accumulate( - scores.begin(), scores.end(), 0.0, - [mean](double total, double score) { return total + (score - mean) * (score - mean); }); - const double stddev = std::sqrt(sq_sum / static_cast(scores.size())); - - std::cout << method << ", mean = " << mean << ", stddev = " << stddev << std::endl; - } - ASSERT_LT(mean_scores[0], mean_scores[1]); -} From 557a71e16695083aa40091b60f17c1daa90a257d Mon Sep 17 00:00:00 2001 From: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:52:13 +0900 Subject: [PATCH 088/127] fix(dummy_infrastructure): fix bugprone-reserved-identifier (#9919) Signed-off-by: kobayu858 Co-authored-by: kobayu858 --- .../src/dummy_infrastructure_node/dummy_infrastructure_node.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/dummy_infrastructure/src/dummy_infrastructure_node/dummy_infrastructure_node.cpp b/system/dummy_infrastructure/src/dummy_infrastructure_node/dummy_infrastructure_node.cpp index 485d85c926268..4760c9366da46 100644 --- a/system/dummy_infrastructure/src/dummy_infrastructure_node/dummy_infrastructure_node.cpp +++ b/system/dummy_infrastructure/src/dummy_infrastructure_node/dummy_infrastructure_node.cpp @@ -24,7 +24,6 @@ using namespace std::literals; using std::chrono::duration; using std::chrono::duration_cast; using std::chrono::nanoseconds; -using std::placeholders::_1; namespace dummy_infrastructure { @@ -84,6 +83,7 @@ boost::optional findCommand( DummyInfrastructureNode::DummyInfrastructureNode(const rclcpp::NodeOptions & node_options) : Node("dummy_infrastructure", node_options) { + using std::placeholders::_1; // Parameter Server set_param_res_ = this->add_on_set_parameters_callback(std::bind(&DummyInfrastructureNode::onSetParam, this, _1)); From 6939a3da23a41781a6d973a8267e2ea1cb3a600d Mon Sep 17 00:00:00 2001 From: NorahXiong <103234047+NorahXiong@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:57:09 +0800 Subject: [PATCH 089/127] feat(autoware_qp_interface): porting autoware_qp_interface package to autoware.core (#9824) Signed-off-by: NorahXiong --- common/autoware_qp_interface/CHANGELOG.rst | 81 ---- common/autoware_qp_interface/CMakeLists.txt | 64 --- .../design/qp_interface-design.md | 48 --- .../qp_interface/osqp_csc_matrix_conv.hpp | 46 -- .../autoware/qp_interface/osqp_interface.hpp | 147 ------- .../qp_interface/proxqp_interface.hpp | 57 --- .../autoware/qp_interface/qp_interface.hpp | 61 --- common/autoware_qp_interface/package.xml | 30 -- .../src/osqp_csc_matrix_conv.cpp | 134 ------ .../src/osqp_interface.cpp | 394 ------------------ .../src/proxqp_interface.cpp | 157 ------- .../src/qp_interface.cpp | 70 ---- .../test/test_csc_matrix_conv.cpp | 181 -------- .../test/test_osqp_interface.cpp | 170 -------- .../test/test_proxqp_interface.cpp | 85 ---- 15 files changed, 1725 deletions(-) delete mode 100644 common/autoware_qp_interface/CHANGELOG.rst delete mode 100644 common/autoware_qp_interface/CMakeLists.txt delete mode 100644 common/autoware_qp_interface/design/qp_interface-design.md delete mode 100644 common/autoware_qp_interface/include/autoware/qp_interface/osqp_csc_matrix_conv.hpp delete mode 100644 common/autoware_qp_interface/include/autoware/qp_interface/osqp_interface.hpp delete mode 100644 common/autoware_qp_interface/include/autoware/qp_interface/proxqp_interface.hpp delete mode 100644 common/autoware_qp_interface/include/autoware/qp_interface/qp_interface.hpp delete mode 100644 common/autoware_qp_interface/package.xml delete mode 100644 common/autoware_qp_interface/src/osqp_csc_matrix_conv.cpp delete mode 100644 common/autoware_qp_interface/src/osqp_interface.cpp delete mode 100644 common/autoware_qp_interface/src/proxqp_interface.cpp delete mode 100644 common/autoware_qp_interface/src/qp_interface.cpp delete mode 100644 common/autoware_qp_interface/test/test_csc_matrix_conv.cpp delete mode 100644 common/autoware_qp_interface/test/test_osqp_interface.cpp delete mode 100644 common/autoware_qp_interface/test/test_proxqp_interface.cpp diff --git a/common/autoware_qp_interface/CHANGELOG.rst b/common/autoware_qp_interface/CHANGELOG.rst deleted file mode 100644 index f76dac861e1e6..0000000000000 --- a/common/autoware_qp_interface/CHANGELOG.rst +++ /dev/null @@ -1,81 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_qp_interface -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Merge branch 'main' into release-0.40.0 -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* fix(cpplint): include what you use - common (`#9564 `_) -* fix: fix package names in changelog files (`#9500 `_) -* fix(autoware_osqp_interface): fix clang-tidy errors (`#9440 `_) -* 0.39.0 -* update changelog -* Merge commit '6a1ddbd08bd' into release-0.39.0 -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* refactor(qp_interface): prefix package and namespace with autoware (`#9236 `_) -* Contributors: Esteve Fernandez, Fumiya Watanabe, M. Fatih Cırıt, Ryohsuke Mitsudome, Ryuta Kambe, Yutaka Kondo - -0.39.0 (2024-11-25) -------------------- -* Merge commit '6a1ddbd08bd' into release-0.39.0 -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* refactor(qp_interface): prefix package and namespace with autoware (`#9236 `_) -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* fix(qp_interface): fix unreadVariable (`#8349 `_) - * fix:unreadVariable - * fix:unreadVariable - * fix:unreadVariable - --------- -* perf(velocity_smoother): use ProxQP for faster optimization (`#8028 `_) - * perf(velocity_smoother): use ProxQP for faster optimization - * consider max_iteration - * disable warm start - * fix test - --------- -* refactor(qp_interface): clean up the code (`#8029 `_) - * refactor qp_interface - * variable names: m_XXX -> XXX\_ - * update - * update - --------- -* fix(fake_test_node, osqp_interface, qp_interface): remove unnecessary cppcheck inline suppressions (`#7855 `_) - * fix(fake_test_node, osqp_interface, qp_interface): remove unnecessary cppcheck inline suppressions - * style(pre-commit): autofix - --------- - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> -* Contributors: Ryuta Kambe, Takayuki Murooka, Yutaka Kondo, kobayu858 - -0.26.0 (2024-04-03) -------------------- -* feat(qp_interface): support proxqp (`#3699 `_) - * feat(qp_interface): add proxqp interface - * update - --------- -* feat(qp_interface): add new package which will contain various qp solvers (`#3697 `_) -* Contributors: Takayuki Murooka diff --git a/common/autoware_qp_interface/CMakeLists.txt b/common/autoware_qp_interface/CMakeLists.txt deleted file mode 100644 index 1df75d2d719a0..0000000000000 --- a/common/autoware_qp_interface/CMakeLists.txt +++ /dev/null @@ -1,64 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_qp_interface) - -find_package(autoware_cmake REQUIRED) -autoware_package() - -find_package(Eigen3 REQUIRED) -find_package(proxsuite REQUIRED) - -# after find_package(osqp_vendor) in ament_auto_find_build_dependencies -find_package(osqp REQUIRED) -get_target_property(OSQP_INCLUDE_SUB_DIR osqp::osqp INTERFACE_INCLUDE_DIRECTORIES) -get_filename_component(OSQP_INCLUDE_DIR ${OSQP_INCLUDE_SUB_DIR} PATH) - -set(QP_INTERFACE_LIB_SRC - src/qp_interface.cpp - src/osqp_interface.cpp - src/osqp_csc_matrix_conv.cpp - src/proxqp_interface.cpp -) - -set(QP_INTERFACE_LIB_HEADERS - include/autoware/qp_interface/qp_interface.hpp - include/autoware/qp_interface/osqp_interface.hpp - include/autoware/qp_interface/osqp_csc_matrix_conv.hpp - include/autoware/qp_interface/proxqp_interface.hpp -) - -ament_auto_add_library(${PROJECT_NAME} SHARED - ${QP_INTERFACE_LIB_SRC} - ${QP_INTERFACE_LIB_HEADERS} -) -target_compile_options(${PROJECT_NAME} PRIVATE -Wno-error=old-style-cast) - -target_include_directories(${PROJECT_NAME} - SYSTEM PUBLIC - "${OSQP_INCLUDE_DIR}" - "${EIGEN3_INCLUDE_DIR}" -) - -ament_target_dependencies(${PROJECT_NAME} - Eigen3 - osqp_vendor - proxsuite -) - -# crucial so downstream package builds because osqp_interface exposes osqp.hpp -ament_export_include_directories("${OSQP_INCLUDE_DIR}") -# crucial so the linking order is correct in a downstream package: libosqp_interface.a should come before libosqp.a -ament_export_libraries(osqp::osqp) - -if(BUILD_TESTING) - set(TEST_SOURCES - test/test_osqp_interface.cpp - test/test_csc_matrix_conv.cpp - test/test_proxqp_interface.cpp - ) - set(TEST_OSQP_INTERFACE_EXE test_osqp_interface) - ament_add_ros_isolated_gtest(${TEST_OSQP_INTERFACE_EXE} ${TEST_SOURCES}) - target_link_libraries(${TEST_OSQP_INTERFACE_EXE} ${PROJECT_NAME}) -endif() - -ament_auto_package(INSTALL_TO_SHARE -) diff --git a/common/autoware_qp_interface/design/qp_interface-design.md b/common/autoware_qp_interface/design/qp_interface-design.md deleted file mode 100644 index edc7fa9845206..0000000000000 --- a/common/autoware_qp_interface/design/qp_interface-design.md +++ /dev/null @@ -1,48 +0,0 @@ -# Interface for QP solvers - -This is the design document for the `autoware_qp_interface` package. - -## Purpose / Use cases - -This packages provides a C++ interface for QP solvers. -Currently, supported QP solvers are - -- [OSQP library](https://osqp.org/docs/solver/index.html) - -## Design - -The class `QPInterface` takes a problem formulation as Eigen matrices and vectors, converts these objects into -C-style Compressed-Column-Sparse matrices and dynamic arrays, loads the data into the QP workspace dataholder, and runs the optimizer. - -## Inputs / Outputs / API - -The interface can be used in several ways: - -1. Initialize the interface, and load the problem formulation at the optimization call. - - ```cpp - QPInterface qp_interface; - qp_interface.optimize(P, A, q, l, u); - ``` - -2. WARM START OPTIMIZATION by modifying the problem formulation between optimization runs. - - ```cpp - QPInterface qp_interface(true); - qp_interface.optimize(P, A, q, l, u); - qp_interface.optimize(P_new, A_new, q_new, l_new, u_new); - ``` - - The optimization results are returned as a vector by the optimization function. - - ```cpp - const auto solution = qp_interface.optimize(); - double x_0 = solution[0]; - double x_1 = solution[1]; - ``` - -## References / External links - -- OSQP library: - -## Related issues diff --git a/common/autoware_qp_interface/include/autoware/qp_interface/osqp_csc_matrix_conv.hpp b/common/autoware_qp_interface/include/autoware/qp_interface/osqp_csc_matrix_conv.hpp deleted file mode 100644 index 9575d9d18c69f..0000000000000 --- a/common/autoware_qp_interface/include/autoware/qp_interface/osqp_csc_matrix_conv.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// 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. - -#ifndef AUTOWARE__QP_INTERFACE__OSQP_CSC_MATRIX_CONV_HPP_ -#define AUTOWARE__QP_INTERFACE__OSQP_CSC_MATRIX_CONV_HPP_ - -#include "osqp/glob_opts.h" - -#include - -#include - -namespace autoware::qp_interface -{ -/// \brief Compressed-Column-Sparse Matrix -struct CSC_Matrix -{ - /// Vector of non-zero values. Ex: [4,1,1,2] - std::vector vals_; - /// Vector of row index corresponding to values. Ex: [0, 1, 0, 1] (Eigen: 'inner') - std::vector row_idxs_; - /// Vector of 'val' indices where each column starts. Ex: [0, 2, 4] (Eigen: 'outer') - std::vector col_idxs_; -}; - -/// \brief Calculate CSC matrix from Eigen matrix -CSC_Matrix calCSCMatrix(const Eigen::MatrixXd & mat); -/// \brief Calculate upper trapezoidal CSC matrix from square Eigen matrix -CSC_Matrix calCSCMatrixTrapezoidal(const Eigen::MatrixXd & mat); -/// \brief Print the given CSC matrix to the standard output -void printCSCMatrix(const CSC_Matrix & csc_mat); - -} // namespace autoware::qp_interface - -#endif // AUTOWARE__QP_INTERFACE__OSQP_CSC_MATRIX_CONV_HPP_ diff --git a/common/autoware_qp_interface/include/autoware/qp_interface/osqp_interface.hpp b/common/autoware_qp_interface/include/autoware/qp_interface/osqp_interface.hpp deleted file mode 100644 index a5777dd545e9f..0000000000000 --- a/common/autoware_qp_interface/include/autoware/qp_interface/osqp_interface.hpp +++ /dev/null @@ -1,147 +0,0 @@ -// 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. - -#ifndef AUTOWARE__QP_INTERFACE__OSQP_INTERFACE_HPP_ -#define AUTOWARE__QP_INTERFACE__OSQP_INTERFACE_HPP_ - -#include "autoware/qp_interface/osqp_csc_matrix_conv.hpp" -#include "autoware/qp_interface/qp_interface.hpp" -#include "osqp/osqp.h" - -#include -#include -#include -#include - -namespace autoware::qp_interface -{ -constexpr c_float OSQP_INF = 1e30; - -class OSQPInterface : public QPInterface -{ -public: - /// \brief Constructor without problem formulation - OSQPInterface( - const bool enable_warm_start = false, const int max_iteration = 20000, - const c_float eps_abs = std::numeric_limits::epsilon(), - const c_float eps_rel = std::numeric_limits::epsilon(), const bool polish = true, - const bool verbose = false); - /// \brief Constructor with problem setup - /// \param P: (n,n) matrix defining relations between parameters. - /// \param A: (m,n) matrix defining parameter constraints relative to the lower and upper bound. - /// \param q: (n) vector defining the linear cost of the problem. - /// \param l: (m) vector defining the lower bound problem constraint. - /// \param u: (m) vector defining the upper bound problem constraint. - /// \param eps_abs: Absolute convergence tolerance. - OSQPInterface( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u, - const bool enable_warm_start = false, - const c_float eps_abs = std::numeric_limits::epsilon()); - OSQPInterface( - const CSC_Matrix & P, const CSC_Matrix & A, const std::vector & q, - const std::vector & l, const std::vector & u, - const bool enable_warm_start = false, - const c_float eps_abs = std::numeric_limits::epsilon()); - ~OSQPInterface(); - - static void OSQPWorkspaceDeleter(OSQPWorkspace * ptr) noexcept; - - std::vector optimize( - CSC_Matrix P, CSC_Matrix A, const std::vector & q, const std::vector & l, - const std::vector & u); - - int getIterationNumber() const override; - bool isSolved() const override; - std::string getStatus() const override; - - int getPolishStatus() const; - std::vector getDualSolution() const; - - void updateEpsAbs(const double eps_abs) override; - void updateEpsRel(const double eps_rel) override; - void updateVerbose(const bool verbose) override; - - // Updates problem parameters while keeping solution in memory. - // - // Args: - // P_new: (n,n) matrix defining relations between parameters. - // A_new: (m,n) matrix defining parameter constraints relative to the lower and upper bound. - // q_new: (n) vector defining the linear cost of the problem. - // l_new: (m) vector defining the lower bound problem constraint. - // u_new: (m) vector defining the upper bound problem constraint. - void updateP(const Eigen::MatrixXd & P_new); - void updateCscP(const CSC_Matrix & P_csc); - void updateA(const Eigen::MatrixXd & A_new); - void updateCscA(const CSC_Matrix & A_csc); - void updateQ(const std::vector & q_new); - void updateL(const std::vector & l_new); - void updateU(const std::vector & u_new); - void updateBounds(const std::vector & l_new, const std::vector & u_new); - - void updateMaxIter(const int iter); - void updateRhoInterval(const int rho_interval); - void updateRho(const double rho); - void updateAlpha(const double alpha); - void updateScaling(const int scaling); - void updatePolish(const bool polish); - void updatePolishRefinementIteration(const int polish_refine_iter); - void updateCheckTermination(const int check_termination); - - /// \brief Get the number of iteration taken to solve the problem - inline int64_t getTakenIter() const { return static_cast(latest_work_info_.iter); } - /// \brief Get the status message for the latest problem solved - inline std::string getStatusMessage() const - { - return static_cast(latest_work_info_.status); - } - /// \brief Get the runtime of the latest problem solved - inline double getRunTime() const { return latest_work_info_.run_time; } - /// \brief Get the objective value the latest problem solved - inline double getObjVal() const { return latest_work_info_.obj_val; } - /// \brief Returns flag asserting interface condition (Healthy condition: 0). - inline int64_t getExitFlag() const { return exitflag_; } - - // Setter functions for warm start - bool setWarmStart( - const std::vector & primal_variables, const std::vector & dual_variables); - bool setPrimalVariables(const std::vector & primal_variables); - bool setDualVariables(const std::vector & dual_variables); - -private: - std::unique_ptr> work_; - std::unique_ptr settings_; - std::unique_ptr data_; - // store last work info since work is cleaned up at every execution to prevent memory leak. - OSQPInfo latest_work_info_; - // Number of parameters to optimize - int64_t param_n_; - // Flag to check if the current work exists - bool work__initialized = false; - // Exitflag - int64_t exitflag_; - - void initializeProblemImpl( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) override; - - void initializeCSCProblemImpl( - CSC_Matrix P, CSC_Matrix A, const std::vector & q, const std::vector & l, - const std::vector & u); - - std::vector optimizeImpl() override; -}; -} // namespace autoware::qp_interface - -#endif // AUTOWARE__QP_INTERFACE__OSQP_INTERFACE_HPP_ diff --git a/common/autoware_qp_interface/include/autoware/qp_interface/proxqp_interface.hpp b/common/autoware_qp_interface/include/autoware/qp_interface/proxqp_interface.hpp deleted file mode 100644 index 324da4b18c6fd..0000000000000 --- a/common/autoware_qp_interface/include/autoware/qp_interface/proxqp_interface.hpp +++ /dev/null @@ -1,57 +0,0 @@ -// 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. - -#ifndef AUTOWARE__QP_INTERFACE__PROXQP_INTERFACE_HPP_ -#define AUTOWARE__QP_INTERFACE__PROXQP_INTERFACE_HPP_ - -#include "autoware/qp_interface/qp_interface.hpp" - -#include -#include - -#include -#include -#include -#include - -namespace autoware::qp_interface -{ -class ProxQPInterface : public QPInterface -{ -public: - explicit ProxQPInterface( - const bool enable_warm_start, const int max_iteration, const double eps_abs, - const double eps_rel, const bool verbose = false); - - int getIterationNumber() const override; - bool isSolved() const override; - std::string getStatus() const override; - - void updateEpsAbs(const double eps_abs) override; - void updateEpsRel(const double eps_rel) override; - void updateVerbose(const bool verbose) override; - -private: - proxsuite::proxqp::Settings settings_{}; - std::shared_ptr> qp_ptr_{nullptr}; - - void initializeProblemImpl( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) override; - - std::vector optimizeImpl() override; -}; -} // namespace autoware::qp_interface - -#endif // AUTOWARE__QP_INTERFACE__PROXQP_INTERFACE_HPP_ diff --git a/common/autoware_qp_interface/include/autoware/qp_interface/qp_interface.hpp b/common/autoware_qp_interface/include/autoware/qp_interface/qp_interface.hpp deleted file mode 100644 index be3c598512bf6..0000000000000 --- a/common/autoware_qp_interface/include/autoware/qp_interface/qp_interface.hpp +++ /dev/null @@ -1,61 +0,0 @@ -// 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. - -#ifndef AUTOWARE__QP_INTERFACE__QP_INTERFACE_HPP_ -#define AUTOWARE__QP_INTERFACE__QP_INTERFACE_HPP_ - -#include - -#include -#include -#include - -namespace autoware::qp_interface -{ -class QPInterface -{ -public: - explicit QPInterface(const bool enable_warm_start) : enable_warm_start_(enable_warm_start) {} - - std::vector optimize( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u); - - virtual bool isSolved() const = 0; - virtual int getIterationNumber() const = 0; - virtual std::string getStatus() const = 0; - - virtual void updateEpsAbs([[maybe_unused]] const double eps_abs) = 0; - virtual void updateEpsRel([[maybe_unused]] const double eps_rel) = 0; - virtual void updateVerbose([[maybe_unused]] const bool verbose) {} - -protected: - bool enable_warm_start_{false}; - - void initializeProblem( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u); - - virtual void initializeProblemImpl( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) = 0; - - virtual std::vector optimizeImpl() = 0; - - std::optional variables_num_{std::nullopt}; - std::optional constraints_num_{std::nullopt}; -}; -} // namespace autoware::qp_interface - -#endif // AUTOWARE__QP_INTERFACE__QP_INTERFACE_HPP_ diff --git a/common/autoware_qp_interface/package.xml b/common/autoware_qp_interface/package.xml deleted file mode 100644 index b61d03a36db72..0000000000000 --- a/common/autoware_qp_interface/package.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - autoware_qp_interface - 0.40.0 - Interface for the QP solvers - Takayuki Murooka - Fumiya Watanabe - Maxime CLEMENT - Satoshi Ota - Apache 2.0 - - ament_cmake_auto - autoware_cmake - - eigen - osqp_vendor - proxsuite - rclcpp - rclcpp_components - - ament_cmake_ros - ament_lint_auto - autoware_lint_common - eigen - - - ament_cmake - - diff --git a/common/autoware_qp_interface/src/osqp_csc_matrix_conv.cpp b/common/autoware_qp_interface/src/osqp_csc_matrix_conv.cpp deleted file mode 100644 index 15314a9e4a5fa..0000000000000 --- a/common/autoware_qp_interface/src/osqp_csc_matrix_conv.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// 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. - -#include "autoware/qp_interface/osqp_csc_matrix_conv.hpp" - -#include -#include - -#include -#include -#include - -namespace autoware::qp_interface -{ -CSC_Matrix calCSCMatrix(const Eigen::MatrixXd & mat) -{ - const size_t elem = static_cast(mat.nonZeros()); - const Eigen::Index rows = mat.rows(); - const Eigen::Index cols = mat.cols(); - - std::vector vals; - vals.reserve(elem); - std::vector row_idxs; - row_idxs.reserve(elem); - std::vector col_idxs; - col_idxs.reserve(elem); - - // Construct CSC matrix arrays - c_float val; - c_int elem_count = 0; - - col_idxs.push_back(0); - - for (Eigen::Index j = 0; j < cols; j++) { // col iteration - for (Eigen::Index i = 0; i < rows; i++) { // row iteration - // Get values of nonzero elements - val = mat(i, j); - if (std::fabs(val) < 1e-9) { - continue; - } - elem_count += 1; - - // Store values - vals.push_back(val); - row_idxs.push_back(i); - } - - col_idxs.push_back(elem_count); - } - - CSC_Matrix csc_matrix = {vals, row_idxs, col_idxs}; - - return csc_matrix; -} - -CSC_Matrix calCSCMatrixTrapezoidal(const Eigen::MatrixXd & mat) -{ - const size_t elem = static_cast(mat.nonZeros()); - const Eigen::Index rows = mat.rows(); - const Eigen::Index cols = mat.cols(); - - if (rows != cols) { - throw std::invalid_argument("Matrix must be square (n, n)"); - } - - std::vector vals; - vals.reserve(elem); - std::vector row_idxs; - row_idxs.reserve(elem); - std::vector col_idxs; - col_idxs.reserve(elem); - - // Construct CSC matrix arrays - c_float val; - Eigen::Index trap_last_idx = 0; - c_int elem_count = 0; - - col_idxs.push_back(0); - - for (Eigen::Index j = 0; j < cols; j++) { // col iteration - for (Eigen::Index i = 0; i <= trap_last_idx; i++) { // row iteration - // Get values of nonzero elements - val = mat(i, j); - if (std::fabs(val) < 1e-9) { - continue; - } - elem_count += 1; - - // Store values - vals.push_back(val); - row_idxs.push_back(i); - } - - col_idxs.push_back(elem_count); - trap_last_idx += 1; - } - - CSC_Matrix csc_matrix = {vals, row_idxs, col_idxs}; - - return csc_matrix; -} - -void printCSCMatrix(const CSC_Matrix & csc_mat) -{ - std::cout << "["; - for (const c_float & val : csc_mat.vals_) { - std::cout << val << ", "; - } - std::cout << "]\n"; - - std::cout << "["; - for (const c_int & row : csc_mat.row_idxs_) { - std::cout << row << ", "; - } - std::cout << "]\n"; - - std::cout << "["; - for (const c_int & col : csc_mat.col_idxs_) { - std::cout << col << ", "; - } - std::cout << "]\n"; -} -} // namespace autoware::qp_interface diff --git a/common/autoware_qp_interface/src/osqp_interface.cpp b/common/autoware_qp_interface/src/osqp_interface.cpp deleted file mode 100644 index fbb8e71f4c251..0000000000000 --- a/common/autoware_qp_interface/src/osqp_interface.cpp +++ /dev/null @@ -1,394 +0,0 @@ -// 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. - -#include "autoware/qp_interface/osqp_interface.hpp" - -#include "autoware/qp_interface/osqp_csc_matrix_conv.hpp" - -#include - -#include -#include -#include -#include - -namespace autoware::qp_interface -{ -OSQPInterface::OSQPInterface( - const bool enable_warm_start, const int max_iteration, const c_float eps_abs, - const c_float eps_rel, const bool polish, const bool verbose) -: QPInterface(enable_warm_start), work_{nullptr, OSQPWorkspaceDeleter} -{ - settings_ = std::make_unique(); - data_ = std::make_unique(); - - if (settings_) { - osqp_set_default_settings(settings_.get()); - settings_->alpha = 1.6; // Change alpha parameter - settings_->eps_rel = eps_rel; - settings_->eps_abs = eps_abs; - settings_->eps_prim_inf = 1.0E-4; - settings_->eps_dual_inf = 1.0E-4; - settings_->warm_start = enable_warm_start; - settings_->max_iter = max_iteration; - settings_->verbose = verbose; - settings_->polish = polish; - } - exitflag_ = 0; -} - -OSQPInterface::OSQPInterface( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u, const bool enable_warm_start, - const c_float eps_abs) -: OSQPInterface(enable_warm_start, eps_abs) -{ - initializeProblem(P, A, q, l, u); -} - -OSQPInterface::OSQPInterface( - const CSC_Matrix & P, const CSC_Matrix & A, const std::vector & q, - const std::vector & l, const std::vector & u, const bool enable_warm_start, - const c_float eps_abs) -: OSQPInterface(enable_warm_start, eps_abs) -{ - initializeCSCProblemImpl(P, A, q, l, u); -} - -OSQPInterface::~OSQPInterface() -{ - if (data_->P) free(data_->P); - if (data_->A) free(data_->A); -} - -void OSQPInterface::initializeProblemImpl( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - initializeCSCProblemImpl(P_csc, A_csc, q, l, u); -} - -void OSQPInterface::initializeCSCProblemImpl( - CSC_Matrix P_csc, CSC_Matrix A_csc, const std::vector & q, const std::vector & l, - const std::vector & u) -{ - // Dynamic float arrays - std::vector q_tmp(q.begin(), q.end()); - std::vector l_tmp(l.begin(), l.end()); - std::vector u_tmp(u.begin(), u.end()); - double * q_dyn = q_tmp.data(); - double * l_dyn = l_tmp.data(); - double * u_dyn = u_tmp.data(); - - /********************** - * OBJECTIVE FUNCTION - **********************/ - param_n_ = static_cast(q.size()); - data_->m = static_cast(l.size()); - - /***************** - * POPULATE DATA - *****************/ - data_->n = param_n_; - if (data_->P) free(data_->P); - data_->P = csc_matrix( - data_->n, data_->n, static_cast(P_csc.vals_.size()), P_csc.vals_.data(), - P_csc.row_idxs_.data(), P_csc.col_idxs_.data()); - data_->q = q_dyn; - if (data_->A) free(data_->A); - data_->A = csc_matrix( - data_->m, data_->n, static_cast(A_csc.vals_.size()), A_csc.vals_.data(), - A_csc.row_idxs_.data(), A_csc.col_idxs_.data()); - data_->l = l_dyn; - data_->u = u_dyn; - - // Setup workspace - OSQPWorkspace * workspace; - exitflag_ = osqp_setup(&workspace, data_.get(), settings_.get()); - work_.reset(workspace); - work__initialized = true; -} - -void OSQPInterface::OSQPWorkspaceDeleter(OSQPWorkspace * ptr) noexcept -{ - if (ptr != nullptr) { - osqp_cleanup(ptr); - } -} - -void OSQPInterface::updateEpsAbs(const double eps_abs) -{ - settings_->eps_abs = eps_abs; // for default setting - if (work__initialized) { - osqp_update_eps_abs(work_.get(), eps_abs); // for current work - } -} - -void OSQPInterface::updateEpsRel(const double eps_rel) -{ - settings_->eps_rel = eps_rel; // for default setting - if (work__initialized) { - osqp_update_eps_rel(work_.get(), eps_rel); // for current work - } -} - -void OSQPInterface::updateMaxIter(const int max_iter) -{ - settings_->max_iter = max_iter; // for default setting - if (work__initialized) { - osqp_update_max_iter(work_.get(), max_iter); // for current work - } -} - -void OSQPInterface::updateVerbose(const bool is_verbose) -{ - settings_->verbose = is_verbose; // for default setting - if (work__initialized) { - osqp_update_verbose(work_.get(), is_verbose); // for current work - } -} - -void OSQPInterface::updateRhoInterval(const int rho_interval) -{ - settings_->adaptive_rho_interval = rho_interval; // for default setting -} - -void OSQPInterface::updateRho(const double rho) -{ - settings_->rho = rho; - if (work__initialized) { - osqp_update_rho(work_.get(), rho); - } -} - -void OSQPInterface::updateAlpha(const double alpha) -{ - settings_->alpha = alpha; - if (work__initialized) { - osqp_update_alpha(work_.get(), alpha); - } -} - -void OSQPInterface::updateScaling(const int scaling) -{ - settings_->scaling = scaling; -} - -void OSQPInterface::updatePolish(const bool polish) -{ - settings_->polish = polish; - if (work__initialized) { - osqp_update_polish(work_.get(), polish); - } -} - -void OSQPInterface::updatePolishRefinementIteration(const int polish_refine_iter) -{ - if (polish_refine_iter < 0) { - std::cerr << "Polish refinement iterations must be positive" << std::endl; - return; - } - - settings_->polish_refine_iter = polish_refine_iter; - if (work__initialized) { - osqp_update_polish_refine_iter(work_.get(), polish_refine_iter); - } -} - -void OSQPInterface::updateCheckTermination(const int check_termination) -{ - if (check_termination < 0) { - std::cerr << "Check termination must be positive" << std::endl; - return; - } - - settings_->check_termination = check_termination; - if (work__initialized) { - osqp_update_check_termination(work_.get(), check_termination); - } -} - -bool OSQPInterface::setWarmStart( - const std::vector & primal_variables, const std::vector & dual_variables) -{ - return setPrimalVariables(primal_variables) && setDualVariables(dual_variables); -} - -bool OSQPInterface::setPrimalVariables(const std::vector & primal_variables) -{ - if (!work__initialized) { - return false; - } - - const auto result = osqp_warm_start_x(work_.get(), primal_variables.data()); - if (result != 0) { - std::cerr << "Failed to set primal variables for warm start" << std::endl; - return false; - } - - return true; -} - -bool OSQPInterface::setDualVariables(const std::vector & dual_variables) -{ - if (!work__initialized) { - return false; - } - - const auto result = osqp_warm_start_y(work_.get(), dual_variables.data()); - if (result != 0) { - std::cerr << "Failed to set dual variables for warm start" << std::endl; - return false; - } - - return true; -} - -void OSQPInterface::updateP(const Eigen::MatrixXd & P_new) -{ - /* - // Transform 'P' into an 'upper trapezoidal matrix' - Eigen::MatrixXd P_trap = P_new.triangularView(); - // Transform 'P' into a sparse matrix and extract data as dynamic arrays - Eigen::SparseMatrix P_sparse = P_trap.sparseView(); - double *P_val_ptr = P_sparse.valuePtr(); - // Convert dynamic 'int' arrays to 'c_int' arrays (OSQP input type) - c_int P_elem_N = P_sparse.nonZeros(); - */ - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P_new); - osqp_update_P(work_.get(), P_csc.vals_.data(), OSQP_NULL, static_cast(P_csc.vals_.size())); -} - -void OSQPInterface::updateCscP(const CSC_Matrix & P_csc) -{ - osqp_update_P(work_.get(), P_csc.vals_.data(), OSQP_NULL, static_cast(P_csc.vals_.size())); -} - -void OSQPInterface::updateA(const Eigen::MatrixXd & A_new) -{ - /* - // Transform 'A' into a sparse matrix and extract data as dynamic arrays - Eigen::SparseMatrix A_sparse = A_new.sparseView(); - double *A_val_ptr = A_sparse.valuePtr(); - // Convert dynamic 'int' arrays to 'c_int' arrays (OSQP input type) - c_int A_elem_N = A_sparse.nonZeros(); - */ - CSC_Matrix A_csc = calCSCMatrix(A_new); - osqp_update_A(work_.get(), A_csc.vals_.data(), OSQP_NULL, static_cast(A_csc.vals_.size())); - return; -} - -void OSQPInterface::updateCscA(const CSC_Matrix & A_csc) -{ - osqp_update_A(work_.get(), A_csc.vals_.data(), OSQP_NULL, static_cast(A_csc.vals_.size())); -} - -void OSQPInterface::updateQ(const std::vector & q_new) -{ - std::vector q_tmp(q_new.begin(), q_new.end()); - double * q_dyn = q_tmp.data(); - osqp_update_lin_cost(work_.get(), q_dyn); -} - -void OSQPInterface::updateL(const std::vector & l_new) -{ - std::vector l_tmp(l_new.begin(), l_new.end()); - double * l_dyn = l_tmp.data(); - osqp_update_lower_bound(work_.get(), l_dyn); -} - -void OSQPInterface::updateU(const std::vector & u_new) -{ - std::vector u_tmp(u_new.begin(), u_new.end()); - double * u_dyn = u_tmp.data(); - osqp_update_upper_bound(work_.get(), u_dyn); -} - -void OSQPInterface::updateBounds( - const std::vector & l_new, const std::vector & u_new) -{ - std::vector l_tmp(l_new.begin(), l_new.end()); - std::vector u_tmp(u_new.begin(), u_new.end()); - double * l_dyn = l_tmp.data(); - double * u_dyn = u_tmp.data(); - osqp_update_bounds(work_.get(), l_dyn, u_dyn); -} - -int OSQPInterface::getIterationNumber() const -{ - return work_->info->iter; -} - -std::string OSQPInterface::getStatus() const -{ - return "OSQP_SOLVED"; -} - -bool OSQPInterface::isSolved() const -{ - return latest_work_info_.status_val == 1; -} - -int OSQPInterface::getPolishStatus() const -{ - return static_cast(latest_work_info_.status_polish); -} - -std::vector OSQPInterface::getDualSolution() const -{ - double * sol_y = work_->solution->y; - std::vector dual_solution(sol_y, sol_y + data_->m); - return dual_solution; -} - -std::vector OSQPInterface::optimizeImpl() -{ - osqp_solve(work_.get()); - - double * sol_x = work_->solution->x; - std::vector sol_primal(sol_x, sol_x + param_n_); - - latest_work_info_ = *(work_->info); - - if (!enable_warm_start_) { - work_.reset(); - work__initialized = false; - } - - return sol_primal; -} - -std::vector OSQPInterface::optimize( - CSC_Matrix P, CSC_Matrix A, const std::vector & q, const std::vector & l, - const std::vector & u) -{ - initializeCSCProblemImpl(P, A, q, l, u); - const auto result = optimizeImpl(); - - // show polish status if not successful - const int status_polish = static_cast(latest_work_info_.status_polish); - if (status_polish != 1) { - const auto msg = status_polish == 0 ? "unperformed" - : status_polish == -1 ? "unsuccessful" - : "unknown"; - std::cerr << "osqp polish process failed : " << msg << ". The result may be inaccurate" - << std::endl; - } - - return result; -} - -} // namespace autoware::qp_interface diff --git a/common/autoware_qp_interface/src/proxqp_interface.cpp b/common/autoware_qp_interface/src/proxqp_interface.cpp deleted file mode 100644 index a0ebbf0db0510..0000000000000 --- a/common/autoware_qp_interface/src/proxqp_interface.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// 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. - -#include "autoware/qp_interface/proxqp_interface.hpp" - -#include -#include -#include - -namespace autoware::qp_interface -{ -using proxsuite::proxqp::QPSolverOutput; - -ProxQPInterface::ProxQPInterface( - const bool enable_warm_start, const int max_iteration, const double eps_abs, const double eps_rel, - const bool verbose) -: QPInterface(enable_warm_start) -{ - settings_.max_iter = max_iteration; - settings_.eps_abs = eps_abs; - settings_.eps_rel = eps_rel; - settings_.verbose = verbose; -} - -void ProxQPInterface::initializeProblemImpl( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - const size_t variables_num = q.size(); - const size_t constraints_num = l.size(); - - const bool enable_warm_start = [&]() { - if ( - !enable_warm_start_ // Warm start is designated - || !qp_ptr_ // QP pointer is initialized - // The number of variables is the same as the previous one. - || !variables_num_ || - *variables_num_ != variables_num - // The number of constraints is the same as the previous one - || !constraints_num_ || *constraints_num_ != constraints_num) { - return false; - } - return true; - }(); - - if (!enable_warm_start) { - qp_ptr_ = std::make_shared>( - variables_num, 0, constraints_num); - } - - settings_.initial_guess = - enable_warm_start ? proxsuite::proxqp::InitialGuessStatus::WARM_START_WITH_PREVIOUS_RESULT - : proxsuite::proxqp::InitialGuessStatus::NO_INITIAL_GUESS; - - qp_ptr_->settings = settings_; - - Eigen::SparseMatrix P_sparse(variables_num, constraints_num); - P_sparse = P.sparseView(); - - // NOTE: const std vector cannot be converted to eigen vector - std::vector non_const_q = q; - Eigen::VectorXd eigen_q = - Eigen::Map(non_const_q.data(), non_const_q.size()); - std::vector l_std_vec = l; - Eigen::VectorXd eigen_l = - Eigen::Map(l_std_vec.data(), l_std_vec.size()); - std::vector u_std_vec = u; - Eigen::VectorXd eigen_u = - Eigen::Map(u_std_vec.data(), u_std_vec.size()); - - if (enable_warm_start) { - qp_ptr_->update( - P_sparse, eigen_q, proxsuite::nullopt, proxsuite::nullopt, A.sparseView(), eigen_l, eigen_u); - } else { - qp_ptr_->init( - P_sparse, eigen_q, proxsuite::nullopt, proxsuite::nullopt, A.sparseView(), eigen_l, eigen_u); - } -} - -void ProxQPInterface::updateEpsAbs(const double eps_abs) -{ - settings_.eps_abs = eps_abs; -} - -void ProxQPInterface::updateEpsRel(const double eps_rel) -{ - settings_.eps_rel = eps_rel; -} - -void ProxQPInterface::updateVerbose(const bool is_verbose) -{ - settings_.verbose = is_verbose; -} - -bool ProxQPInterface::isSolved() const -{ - if (qp_ptr_) { - return qp_ptr_->results.info.status == QPSolverOutput::PROXQP_SOLVED; - } - return false; -} - -int ProxQPInterface::getIterationNumber() const -{ - if (qp_ptr_) { - return qp_ptr_->results.info.iter; - } - return 0; -} - -std::string ProxQPInterface::getStatus() const -{ - if (qp_ptr_) { - if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_SOLVED) { - return "PROXQP_SOLVED"; - } - if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_MAX_ITER_REACHED) { - return "PROXQP_MAX_ITER_REACHED"; - } - if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_PRIMAL_INFEASIBLE) { - return "PROXQP_PRIMAL_INFEASIBLE"; - } - // if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE) { - // return "PROXQP_SOLVED_CLOSEST_PRIMAL_FEASIBLE"; - // } - if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_DUAL_INFEASIBLE) { - return "PROXQP_DUAL_INFEASIBLE"; - } - if (qp_ptr_->results.info.status == QPSolverOutput::PROXQP_NOT_RUN) { - return "PROXQP_NOT_RUN"; - } - } - return "None"; -} - -std::vector ProxQPInterface::optimizeImpl() -{ - qp_ptr_->solve(); - - std::vector result; - for (Eigen::Index i = 0; i < qp_ptr_->results.x.size(); ++i) { - result.push_back(qp_ptr_->results.x[i]); - } - return result; -} -} // namespace autoware::qp_interface diff --git a/common/autoware_qp_interface/src/qp_interface.cpp b/common/autoware_qp_interface/src/qp_interface.cpp deleted file mode 100644 index f01e57772dc4f..0000000000000 --- a/common/autoware_qp_interface/src/qp_interface.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// 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. - -#include "autoware/qp_interface/qp_interface.hpp" - -#include -#include -#include - -namespace autoware::qp_interface -{ -void QPInterface::initializeProblem( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - // check if arguments are valid - std::stringstream ss; - if (P.rows() != P.cols()) { - ss << "P.rows() and P.cols() are not the same. P.rows() = " << P.rows() - << ", P.cols() = " << P.cols(); - throw std::invalid_argument(ss.str()); - } - if (P.rows() != static_cast(q.size())) { - ss << "P.rows() and q.size() are not the same. P.rows() = " << P.rows() - << ", q.size() = " << q.size(); - throw std::invalid_argument(ss.str()); - } - if (P.rows() != A.cols()) { - ss << "P.rows() and A.cols() are not the same. P.rows() = " << P.rows() - << ", A.cols() = " << A.cols(); - throw std::invalid_argument(ss.str()); - } - if (A.rows() != static_cast(l.size())) { - ss << "A.rows() and l.size() are not the same. A.rows() = " << A.rows() - << ", l.size() = " << l.size(); - throw std::invalid_argument(ss.str()); - } - if (A.rows() != static_cast(u.size())) { - ss << "A.rows() and u.size() are not the same. A.rows() = " << A.rows() - << ", u.size() = " << u.size(); - throw std::invalid_argument(ss.str()); - } - - initializeProblemImpl(P, A, q, l, u); - - variables_num_ = q.size(); - constraints_num_ = l.size(); -} - -std::vector QPInterface::optimize( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - initializeProblem(P, A, q, l, u); - const auto result = optimizeImpl(); - - return result; -} -} // namespace autoware::qp_interface diff --git a/common/autoware_qp_interface/test/test_csc_matrix_conv.cpp b/common/autoware_qp_interface/test/test_csc_matrix_conv.cpp deleted file mode 100644 index 1f377a1a24535..0000000000000 --- a/common/autoware_qp_interface/test/test_csc_matrix_conv.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// 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. - -#include "autoware/qp_interface/osqp_csc_matrix_conv.hpp" -#include "gtest/gtest.h" - -#include - -#include -#include -#include - -TEST(TestCscMatrixConv, Nominal) -{ - using autoware::qp_interface::calCSCMatrix; - using autoware::qp_interface::CSC_Matrix; - - Eigen::MatrixXd rect1(1, 2); - rect1 << 0.0, 1.0; - - const CSC_Matrix rect_m1 = calCSCMatrix(rect1); - ASSERT_EQ(rect_m1.vals_.size(), size_t(1)); - EXPECT_EQ(rect_m1.vals_[0], 1.0); - ASSERT_EQ(rect_m1.row_idxs_.size(), size_t(1)); - EXPECT_EQ(rect_m1.row_idxs_[0], c_int(0)); - ASSERT_EQ(rect_m1.col_idxs_.size(), size_t(3)); // nb of columns + 1 - EXPECT_EQ(rect_m1.col_idxs_[0], c_int(0)); - EXPECT_EQ(rect_m1.col_idxs_[1], c_int(0)); - EXPECT_EQ(rect_m1.col_idxs_[2], c_int(1)); - - Eigen::MatrixXd rect2(2, 4); - rect2 << 1.0, 0.0, 3.0, 0.0, 0.0, 6.0, 7.0, 0.0; - - const CSC_Matrix rect_m2 = calCSCMatrix(rect2); - ASSERT_EQ(rect_m2.vals_.size(), size_t(4)); - EXPECT_EQ(rect_m2.vals_[0], 1.0); - EXPECT_EQ(rect_m2.vals_[1], 6.0); - EXPECT_EQ(rect_m2.vals_[2], 3.0); - EXPECT_EQ(rect_m2.vals_[3], 7.0); - ASSERT_EQ(rect_m2.row_idxs_.size(), size_t(4)); - EXPECT_EQ(rect_m2.row_idxs_[0], c_int(0)); - EXPECT_EQ(rect_m2.row_idxs_[1], c_int(1)); - EXPECT_EQ(rect_m2.row_idxs_[2], c_int(0)); - EXPECT_EQ(rect_m2.row_idxs_[3], c_int(1)); - ASSERT_EQ(rect_m2.col_idxs_.size(), size_t(5)); // nb of columns + 1 - EXPECT_EQ(rect_m2.col_idxs_[0], c_int(0)); - EXPECT_EQ(rect_m2.col_idxs_[1], c_int(1)); - EXPECT_EQ(rect_m2.col_idxs_[2], c_int(2)); - EXPECT_EQ(rect_m2.col_idxs_[3], c_int(4)); - EXPECT_EQ(rect_m2.col_idxs_[4], c_int(4)); - - // Example from http://netlib.org/linalg/html_templates/node92.html - Eigen::MatrixXd square2(6, 6); - square2 << 10.0, 0.0, 0.0, 0.0, -2.0, 0.0, 3.0, 9.0, 0.0, 0.0, 0.0, 3.0, 0.0, 7.0, 8.0, 7.0, 0.0, - 0.0, 3.0, 0.0, 8.0, 7.0, 5.0, 0.0, 0.0, 8.0, 0.0, 9.0, 9.0, 13.0, 0.0, 4.0, 0.0, 0.0, 2.0, -1.0; - - const CSC_Matrix square_m2 = calCSCMatrix(square2); - ASSERT_EQ(square_m2.vals_.size(), size_t(19)); - EXPECT_EQ(square_m2.vals_[0], 10.0); - EXPECT_EQ(square_m2.vals_[1], 3.0); - EXPECT_EQ(square_m2.vals_[2], 3.0); - EXPECT_EQ(square_m2.vals_[3], 9.0); - EXPECT_EQ(square_m2.vals_[4], 7.0); - EXPECT_EQ(square_m2.vals_[5], 8.0); - EXPECT_EQ(square_m2.vals_[6], 4.0); - EXPECT_EQ(square_m2.vals_[7], 8.0); - EXPECT_EQ(square_m2.vals_[8], 8.0); - EXPECT_EQ(square_m2.vals_[9], 7.0); - EXPECT_EQ(square_m2.vals_[10], 7.0); - EXPECT_EQ(square_m2.vals_[11], 9.0); - EXPECT_EQ(square_m2.vals_[12], -2.0); - EXPECT_EQ(square_m2.vals_[13], 5.0); - EXPECT_EQ(square_m2.vals_[14], 9.0); - EXPECT_EQ(square_m2.vals_[15], 2.0); - EXPECT_EQ(square_m2.vals_[16], 3.0); - EXPECT_EQ(square_m2.vals_[17], 13.0); - EXPECT_EQ(square_m2.vals_[18], -1.0); - ASSERT_EQ(square_m2.row_idxs_.size(), size_t(19)); - EXPECT_EQ(square_m2.row_idxs_[0], c_int(0)); - EXPECT_EQ(square_m2.row_idxs_[1], c_int(1)); - EXPECT_EQ(square_m2.row_idxs_[2], c_int(3)); - EXPECT_EQ(square_m2.row_idxs_[3], c_int(1)); - EXPECT_EQ(square_m2.row_idxs_[4], c_int(2)); - EXPECT_EQ(square_m2.row_idxs_[5], c_int(4)); - EXPECT_EQ(square_m2.row_idxs_[6], c_int(5)); - EXPECT_EQ(square_m2.row_idxs_[7], c_int(2)); - EXPECT_EQ(square_m2.row_idxs_[8], c_int(3)); - EXPECT_EQ(square_m2.row_idxs_[9], c_int(2)); - EXPECT_EQ(square_m2.row_idxs_[10], c_int(3)); - EXPECT_EQ(square_m2.row_idxs_[11], c_int(4)); - EXPECT_EQ(square_m2.row_idxs_[12], c_int(0)); - EXPECT_EQ(square_m2.row_idxs_[13], c_int(3)); - EXPECT_EQ(square_m2.row_idxs_[14], c_int(4)); - EXPECT_EQ(square_m2.row_idxs_[15], c_int(5)); - EXPECT_EQ(square_m2.row_idxs_[16], c_int(1)); - EXPECT_EQ(square_m2.row_idxs_[17], c_int(4)); - EXPECT_EQ(square_m2.row_idxs_[18], c_int(5)); - ASSERT_EQ(square_m2.col_idxs_.size(), size_t(7)); // nb of columns + 1 - EXPECT_EQ(square_m2.col_idxs_[0], c_int(0)); - EXPECT_EQ(square_m2.col_idxs_[1], c_int(3)); - EXPECT_EQ(square_m2.col_idxs_[2], c_int(7)); - EXPECT_EQ(square_m2.col_idxs_[3], c_int(9)); - EXPECT_EQ(square_m2.col_idxs_[4], c_int(12)); - EXPECT_EQ(square_m2.col_idxs_[5], c_int(16)); - EXPECT_EQ(square_m2.col_idxs_[6], c_int(19)); -} -TEST(TestCscMatrixConv, Trapezoidal) -{ - using autoware::qp_interface::calCSCMatrixTrapezoidal; - using autoware::qp_interface::CSC_Matrix; - - Eigen::MatrixXd square1(2, 2); - Eigen::MatrixXd square2(3, 3); - Eigen::MatrixXd rect1(1, 2); - square1 << 1.0, 2.0, 2.0, 4.0; - square2 << 0.0, 2.0, 0.0, 4.0, 5.0, 6.0, 0.0, 0.0, 0.0; - rect1 << 0.0, 1.0; - - const CSC_Matrix square_m1 = calCSCMatrixTrapezoidal(square1); - // Trapezoidal: skip the lower left triangle (2.0 in this example) - ASSERT_EQ(square_m1.vals_.size(), size_t(3)); - EXPECT_EQ(square_m1.vals_[0], 1.0); - EXPECT_EQ(square_m1.vals_[1], 2.0); - EXPECT_EQ(square_m1.vals_[2], 4.0); - ASSERT_EQ(square_m1.row_idxs_.size(), size_t(3)); - EXPECT_EQ(square_m1.row_idxs_[0], c_int(0)); - EXPECT_EQ(square_m1.row_idxs_[1], c_int(0)); - EXPECT_EQ(square_m1.row_idxs_[2], c_int(1)); - ASSERT_EQ(square_m1.col_idxs_.size(), size_t(3)); - EXPECT_EQ(square_m1.col_idxs_[0], c_int(0)); - EXPECT_EQ(square_m1.col_idxs_[1], c_int(1)); - EXPECT_EQ(square_m1.col_idxs_[2], c_int(3)); - - const CSC_Matrix square_m2 = calCSCMatrixTrapezoidal(square2); - ASSERT_EQ(square_m2.vals_.size(), size_t(3)); - EXPECT_EQ(square_m2.vals_[0], 2.0); - EXPECT_EQ(square_m2.vals_[1], 5.0); - EXPECT_EQ(square_m2.vals_[2], 6.0); - ASSERT_EQ(square_m2.row_idxs_.size(), size_t(3)); - EXPECT_EQ(square_m2.row_idxs_[0], c_int(0)); - EXPECT_EQ(square_m2.row_idxs_[1], c_int(1)); - EXPECT_EQ(square_m2.row_idxs_[2], c_int(1)); - ASSERT_EQ(square_m2.col_idxs_.size(), size_t(4)); - EXPECT_EQ(square_m2.col_idxs_[0], c_int(0)); - EXPECT_EQ(square_m2.col_idxs_[1], c_int(0)); - EXPECT_EQ(square_m2.col_idxs_[2], c_int(2)); - EXPECT_EQ(square_m2.col_idxs_[3], c_int(3)); - - try { - const CSC_Matrix rect_m1 = calCSCMatrixTrapezoidal(rect1); - FAIL() << "calCSCMatrixTrapezoidal should fail with non-square inputs"; - } catch (const std::invalid_argument & e) { - EXPECT_EQ(e.what(), std::string("Matrix must be square (n, n)")); - } -} -TEST(TestCscMatrixConv, Print) -{ - using autoware::qp_interface::calCSCMatrix; - using autoware::qp_interface::calCSCMatrixTrapezoidal; - using autoware::qp_interface::CSC_Matrix; - using autoware::qp_interface::printCSCMatrix; - Eigen::MatrixXd square1(2, 2); - Eigen::MatrixXd rect1(1, 2); - square1 << 1.0, 2.0, 2.0, 4.0; - rect1 << 0.0, 1.0; - const CSC_Matrix square_m1 = calCSCMatrixTrapezoidal(square1); - const CSC_Matrix rect_m1 = calCSCMatrix(rect1); - printCSCMatrix(square_m1); - printCSCMatrix(rect_m1); -} diff --git a/common/autoware_qp_interface/test/test_osqp_interface.cpp b/common/autoware_qp_interface/test/test_osqp_interface.cpp deleted file mode 100644 index f97cc2888afa0..0000000000000 --- a/common/autoware_qp_interface/test/test_osqp_interface.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// 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. - -#include "autoware/qp_interface/osqp_interface.hpp" -#include "gtest/gtest.h" - -#include - -#include -#include -#include -#include - -namespace -{ -// Problem taken from https://github.com/osqp/osqp/blob/master/tests/basic_qp/generate_problem.py -// -// min 1/2 * x' * P * x + q' * x -// s.t. lb <= A * x <= ub -// -// P = [4, 1], q = [1], A = [1, 1], lb = [ 1], ub = [1.0] -// [1, 2] [1] [1, 0] [ 0] [0.7] -// [0, 1] [ 0] [0.7] -// [0, 1] [-inf] [inf] -// -// The optimal solution is -// x = [0.3, 0.7]' -// y = [-2.9, 0.0, 0.2, 0.0]` -// obj = 1.88 - -TEST(TestOsqpInterface, BasicQp) -{ - using autoware::qp_interface::calCSCMatrix; - using autoware::qp_interface::calCSCMatrixTrapezoidal; - using autoware::qp_interface::CSC_Matrix; - - auto check_result = - [](const auto & solution, const std::string & status, const int polish_status) { - EXPECT_EQ(status, "OSQP_SOLVED"); - EXPECT_EQ(polish_status, 1); - - static const auto ep = 1.0e-8; - - ASSERT_EQ(solution.size(), size_t(2)); - EXPECT_NEAR(solution[0], 0.3, ep); - EXPECT_NEAR(solution[1], 0.7, ep); - }; - - const Eigen::MatrixXd P = (Eigen::MatrixXd(2, 2) << 4, 1, 1, 2).finished(); - const Eigen::MatrixXd A = (Eigen::MatrixXd(4, 2) << 1, 1, 1, 0, 0, 1, 0, 1).finished(); - const std::vector q = {1.0, 1.0}; - const std::vector l = {1.0, 0.0, 0.0, -autoware::qp_interface::OSQP_INF}; - const std::vector u = {1.0, 0.7, 0.7, autoware::qp_interface::OSQP_INF}; - - { - // Define problem during optimization - autoware::qp_interface::OSQPInterface osqp(false, 4000, 1e-6); - const auto solution = osqp.QPInterface::optimize(P, A, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - } - - { - // Define problem during initialization - autoware::qp_interface::OSQPInterface osqp(false, 4000, 1e-6); - const auto solution = osqp.QPInterface::optimize(P, A, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - } - - { - std::tuple, std::vector, int, int, int> result; - // Dummy initial problem - Eigen::MatrixXd P_ini = Eigen::MatrixXd::Zero(2, 2); - Eigen::MatrixXd A_ini = Eigen::MatrixXd::Zero(4, 2); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::qp_interface::OSQPInterface osqp(false, 4000, 1e-6); - osqp.QPInterface::optimize(P_ini, A_ini, q_ini, l_ini, u_ini); - } - - { - // Define problem during initialization with csc matrix - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - autoware::qp_interface::OSQPInterface osqp(false, 4000, 1e-6); - - const auto solution = osqp.optimize(P_csc, A_csc, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - } - - { - std::tuple, std::vector, int, int, int> result; - // Dummy initial problem with csc matrix - CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2)); - CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2)); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::qp_interface::OSQPInterface osqp(false, 4000, 1e-6); - osqp.optimize(P_ini_csc, A_ini_csc, q_ini, l_ini, u_ini); - - // Redefine problem before optimization - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - - const auto solution = osqp.optimize(P_csc, A_csc, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - } - - // add warm startup - { - // Dummy initial problem with csc matrix - CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2)); - CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2)); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::qp_interface::OSQPInterface osqp(true, 4000, 1e-6); // enable warm start - osqp.optimize(P_ini_csc, A_ini_csc, q_ini, l_ini, u_ini); - - // Redefine problem before optimization - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - { - const auto solution = osqp.optimize(P_csc, A_csc, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - - osqp.updateCheckTermination(1); - const auto primal_val = solution; - const auto dual_val = osqp.getDualSolution(); - for (size_t i = 0; i < primal_val.size(); ++i) { - std::cerr << primal_val.at(i) << std::endl; - } - osqp.setWarmStart(primal_val, dual_val); - } - - { - const auto solution = osqp.optimize(P_csc, A_csc, q, l, u); - const auto status = osqp.getStatus(); - const auto polish_status = osqp.getPolishStatus(); - check_result(solution, status, polish_status); - } - - // NOTE: This should be true, but currently optimize function reset the workspace, which - // disables warm start. - // EXPECT_EQ(osqp.getTakenIter(), 1); - } -} -} // namespace diff --git a/common/autoware_qp_interface/test/test_proxqp_interface.cpp b/common/autoware_qp_interface/test/test_proxqp_interface.cpp deleted file mode 100644 index e47af10c7aabd..0000000000000 --- a/common/autoware_qp_interface/test/test_proxqp_interface.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// 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. - -#include "autoware/qp_interface/proxqp_interface.hpp" -#include "gtest/gtest.h" - -#include - -#include -#include -#include -#include - -namespace -{ -// Problem taken from -// https://github.com/proxqp/proxqp/blob/master/tests/basic_qp/generate_problem.py -// -// min 1/2 * x' * P * x + q' * x -// s.t. lb <= A * x <= ub -// -// P = [4, 1], q = [1], A = [1, 1], lb = [ 1], ub = [1.0] -// [1, 2] [1] [1, 0] [ 0] [0.7] -// [0, 1] [ 0] [0.7] -// [0, 1] [-inf] [inf] -// -// The optimal solution is -// x = [0.3, 0.7]' -// y = [-2.9, 0.0, 0.2, 0.0]` -// obj = 1.88 - -TEST(TestProxqpInterface, BasicQp) -{ - auto check_result = [](const auto & solution, const std::string & status) { - EXPECT_EQ(status, "PROXQP_SOLVED"); - - static const auto ep = 1.0e-8; - ASSERT_EQ(solution.size(), size_t(2)); - EXPECT_NEAR(solution[0], 0.3, ep); - EXPECT_NEAR(solution[1], 0.7, ep); - }; - - const Eigen::MatrixXd P = (Eigen::MatrixXd(2, 2) << 4, 1, 1, 2).finished(); - const Eigen::MatrixXd A = (Eigen::MatrixXd(4, 2) << 1, 1, 1, 0, 0, 1, 0, 1).finished(); - const std::vector q = {1.0, 1.0}; - const std::vector l = {1.0, 0.0, 0.0, -std::numeric_limits::max()}; - const std::vector u = {1.0, 0.7, 0.7, std::numeric_limits::max()}; - - { - // Define problem during optimization - autoware::qp_interface::ProxQPInterface proxqp(false, 4000, 1e-9, 1e-9, false); - const auto solution = proxqp.QPInterface::optimize(P, A, q, l, u); - const auto status = proxqp.getStatus(); - check_result(solution, status); - } - - { - // Define problem during optimization with warm start - autoware::qp_interface::ProxQPInterface proxqp(true, 4000, 1e-9, 1e-9, false); - { - const auto solution = proxqp.QPInterface::optimize(P, A, q, l, u); - const auto status = proxqp.getStatus(); - check_result(solution, status); - EXPECT_NE(proxqp.getIterationNumber(), 1); - } - { - const auto solution = proxqp.QPInterface::optimize(P, A, q, l, u); - const auto status = proxqp.getStatus(); - check_result(solution, status); - EXPECT_EQ(proxqp.getIterationNumber(), 0); - } - } -} -} // namespace From 997146c94c4f5eaa0547206981b1566879c0a266 Mon Sep 17 00:00:00 2001 From: NorahXiong <103234047+NorahXiong@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:11:09 +0800 Subject: [PATCH 090/127] feat(autoware_osqp_interface): porting autoware_osqp_interface package to autoware.core (#9890) Signed-off-by: NorahXiong --- common/autoware_osqp_interface/CHANGELOG.rst | 51 -- common/autoware_osqp_interface/CMakeLists.txt | 58 --- .../design/osqp_interface-design.md | 70 --- .../osqp_interface/csc_matrix_conv.hpp | 47 -- .../osqp_interface/osqp_interface.hpp | 194 -------- .../osqp_interface/visibility_control.hpp | 37 -- common/autoware_osqp_interface/package.xml | 29 -- .../src/csc_matrix_conv.cpp | 135 ------ .../src/osqp_interface.cpp | 435 ------------------ .../test/test_csc_matrix_conv.cpp | 181 -------- .../test/test_osqp_interface.cpp | 164 ------- 11 files changed, 1401 deletions(-) delete mode 100644 common/autoware_osqp_interface/CHANGELOG.rst delete mode 100644 common/autoware_osqp_interface/CMakeLists.txt delete mode 100644 common/autoware_osqp_interface/design/osqp_interface-design.md delete mode 100644 common/autoware_osqp_interface/include/autoware/osqp_interface/csc_matrix_conv.hpp delete mode 100644 common/autoware_osqp_interface/include/autoware/osqp_interface/osqp_interface.hpp delete mode 100644 common/autoware_osqp_interface/include/autoware/osqp_interface/visibility_control.hpp delete mode 100644 common/autoware_osqp_interface/package.xml delete mode 100644 common/autoware_osqp_interface/src/csc_matrix_conv.cpp delete mode 100644 common/autoware_osqp_interface/src/osqp_interface.cpp delete mode 100644 common/autoware_osqp_interface/test/test_csc_matrix_conv.cpp delete mode 100644 common/autoware_osqp_interface/test/test_osqp_interface.cpp diff --git a/common/autoware_osqp_interface/CHANGELOG.rst b/common/autoware_osqp_interface/CHANGELOG.rst deleted file mode 100644 index d400b77f4bf61..0000000000000 --- a/common/autoware_osqp_interface/CHANGELOG.rst +++ /dev/null @@ -1,51 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_osqp_interface -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Merge branch 'main' into release-0.40.0 -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* fix(cpplint): include what you use - common (`#9564 `_) -* fix(autoware_osqp_interface): fix clang-tidy errors (`#9440 `_) -* 0.39.0 -* update changelog -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Fumiya Watanabe, M. Fatih Cırıt, Ryohsuke Mitsudome, Ryuta Kambe, Yutaka Kondo - -0.39.0 (2024-11-25) -------------------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* refactor(osqp_interface): added autoware prefix to osqp_interface (`#8958 `_) -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.26.0 (2024-04-03) -------------------- diff --git a/common/autoware_osqp_interface/CMakeLists.txt b/common/autoware_osqp_interface/CMakeLists.txt deleted file mode 100644 index b770af659e52a..0000000000000 --- a/common/autoware_osqp_interface/CMakeLists.txt +++ /dev/null @@ -1,58 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_osqp_interface) - -find_package(autoware_cmake REQUIRED) -autoware_package() - -find_package(Eigen3 REQUIRED) - -# after find_package(osqp_vendor) in ament_auto_find_build_dependencies -find_package(osqp REQUIRED) -get_target_property(OSQP_INCLUDE_SUB_DIR osqp::osqp INTERFACE_INCLUDE_DIRECTORIES) -get_filename_component(OSQP_INCLUDE_DIR ${OSQP_INCLUDE_SUB_DIR} PATH) - -set(OSQP_INTERFACE_LIB_SRC - src/csc_matrix_conv.cpp - src/osqp_interface.cpp -) - -set(OSQP_INTERFACE_LIB_HEADERS - include/autoware/osqp_interface/csc_matrix_conv.hpp - include/autoware/osqp_interface/osqp_interface.hpp - include/autoware/osqp_interface/visibility_control.hpp -) - -ament_auto_add_library(${PROJECT_NAME} SHARED - ${OSQP_INTERFACE_LIB_SRC} - ${OSQP_INTERFACE_LIB_HEADERS} -) -target_compile_options(${PROJECT_NAME} PRIVATE -Wno-error=old-style-cast) - -target_include_directories(${PROJECT_NAME} - SYSTEM PUBLIC - "${OSQP_INCLUDE_DIR}" - "${EIGEN3_INCLUDE_DIR}" -) - -ament_target_dependencies(${PROJECT_NAME} - Eigen3 - osqp_vendor -) - -# crucial so downstream package builds because autoware_osqp_interface exposes osqp.hpp -ament_export_include_directories("${OSQP_INCLUDE_DIR}") -# crucial so the linking order is correct in a downstream package: libosqp_interface.a should come before libosqp.a -ament_export_libraries(osqp::osqp) - -if(BUILD_TESTING) - set(TEST_SOURCES - test/test_osqp_interface.cpp - test/test_csc_matrix_conv.cpp - ) - set(TEST_OSQP_INTERFACE_EXE test_osqp_interface) - ament_add_ros_isolated_gtest(${TEST_OSQP_INTERFACE_EXE} ${TEST_SOURCES}) - target_link_libraries(${TEST_OSQP_INTERFACE_EXE} ${PROJECT_NAME}) -endif() - -ament_auto_package(INSTALL_TO_SHARE -) diff --git a/common/autoware_osqp_interface/design/osqp_interface-design.md b/common/autoware_osqp_interface/design/osqp_interface-design.md deleted file mode 100644 index 887a4b4d9af3f..0000000000000 --- a/common/autoware_osqp_interface/design/osqp_interface-design.md +++ /dev/null @@ -1,70 +0,0 @@ -# Interface for the OSQP library - -This is the design document for the `autoware_osqp_interface` package. - -## Purpose / Use cases - - - - -This packages provides a C++ interface for the [OSQP library](https://osqp.org/docs/solver/index.html). - -## Design - - - - -The class `OSQPInterface` takes a problem formulation as Eigen matrices and vectors, converts these objects into -C-style Compressed-Column-Sparse matrices and dynamic arrays, loads the data into the OSQP workspace dataholder, and runs the optimizer. - -## Inputs / Outputs / API - - - - -The interface can be used in several ways: - -1. Initialize the interface WITHOUT data. Load the problem formulation at the optimization call. - - ```cpp - osqp_interface = OSQPInterface(); - osqp_interface.optimize(P, A, q, l, u); - ``` - -2. Initialize the interface WITH data. - - ```cpp - osqp_interface = OSQPInterface(P, A, q, l, u); - osqp_interface.optimize(); - ``` - -3. WARM START OPTIMIZATION by modifying the problem formulation between optimization runs. - - ```cpp - osqp_interface = OSQPInterface(P, A, q, l, u); - osqp_interface.optimize(); - osqp.initializeProblem(P_new, A_new, q_new, l_new, u_new); - osqp_interface.optimize(); - ``` - - The optimization results are returned as a vector by the optimization function. - - ```cpp - std::tuple, std::vector> result = osqp_interface.optimize(); - std::vector param = std::get<0>(result); - double x_0 = param[0]; - double x_1 = param[1]; - ``` - -## References / External links - - - -- OSQP library: - -## Related issues - - diff --git a/common/autoware_osqp_interface/include/autoware/osqp_interface/csc_matrix_conv.hpp b/common/autoware_osqp_interface/include/autoware/osqp_interface/csc_matrix_conv.hpp deleted file mode 100644 index 8c21553152d70..0000000000000 --- a/common/autoware_osqp_interface/include/autoware/osqp_interface/csc_matrix_conv.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__OSQP_INTERFACE__CSC_MATRIX_CONV_HPP_ -#define AUTOWARE__OSQP_INTERFACE__CSC_MATRIX_CONV_HPP_ - -#include "autoware/osqp_interface/visibility_control.hpp" -#include "osqp/glob_opts.h" // for 'c_int' type ('long' or 'long long') - -#include - -#include - -namespace autoware::osqp_interface -{ -/// \brief Compressed-Column-Sparse Matrix -struct OSQP_INTERFACE_PUBLIC CSC_Matrix -{ - /// Vector of non-zero values. Ex: [4,1,1,2] - std::vector m_vals; - /// Vector of row index corresponding to values. Ex: [0, 1, 0, 1] (Eigen: 'inner') - std::vector m_row_idxs; - /// Vector of 'val' indices where each column starts. Ex: [0, 2, 4] (Eigen: 'outer') - std::vector m_col_idxs; -}; - -/// \brief Calculate CSC matrix from Eigen matrix -OSQP_INTERFACE_PUBLIC CSC_Matrix calCSCMatrix(const Eigen::MatrixXd & mat); -/// \brief Calculate upper trapezoidal CSC matrix from square Eigen matrix -OSQP_INTERFACE_PUBLIC CSC_Matrix calCSCMatrixTrapezoidal(const Eigen::MatrixXd & mat); -/// \brief Print the given CSC matrix to the standard output -OSQP_INTERFACE_PUBLIC void printCSCMatrix(const CSC_Matrix & csc_mat); - -} // namespace autoware::osqp_interface - -#endif // AUTOWARE__OSQP_INTERFACE__CSC_MATRIX_CONV_HPP_ diff --git a/common/autoware_osqp_interface/include/autoware/osqp_interface/osqp_interface.hpp b/common/autoware_osqp_interface/include/autoware/osqp_interface/osqp_interface.hpp deleted file mode 100644 index ff3013bd61514..0000000000000 --- a/common/autoware_osqp_interface/include/autoware/osqp_interface/osqp_interface.hpp +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__OSQP_INTERFACE__OSQP_INTERFACE_HPP_ -#define AUTOWARE__OSQP_INTERFACE__OSQP_INTERFACE_HPP_ - -#include "autoware/osqp_interface/csc_matrix_conv.hpp" -#include "autoware/osqp_interface/visibility_control.hpp" -#include "osqp/osqp.h" - -#include -#include - -#include -#include -#include -#include -#include - -namespace autoware::osqp_interface -{ -constexpr c_float INF = 1e30; - -/** - * Implementation of a native C++ interface for the OSQP solver. - * - */ -class OSQP_INTERFACE_PUBLIC OSQPInterface -{ -private: - std::unique_ptr> m_work; - std::unique_ptr m_settings; - std::unique_ptr m_data; - // store last work info since work is cleaned up at every execution to prevent memory leak. - OSQPInfo m_latest_work_info; - // Number of parameters to optimize - int64_t m_param_n; - // Flag to check if the current work exists - bool m_work_initialized = false; - // Exitflag - int64_t m_exitflag; - - // Runs the solver on the stored problem. - std::tuple, std::vector, int64_t, int64_t, int64_t> solve(); - - static void OSQPWorkspaceDeleter(OSQPWorkspace * ptr) noexcept; - -public: - /// \brief Constructor without problem formulation - explicit OSQPInterface( - const c_float eps_abs = std::numeric_limits::epsilon(), const bool polish = true); - /// \brief Constructor with problem setup - /// \param P: (n,n) matrix defining relations between parameters. - /// \param A: (m,n) matrix defining parameter constraints relative to the lower and upper bound. - /// \param q: (n) vector defining the linear cost of the problem. - /// \param l: (m) vector defining the lower bound problem constraint. - /// \param u: (m) vector defining the upper bound problem constraint. - /// \param eps_abs: Absolute convergence tolerance. - OSQPInterface( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u, const c_float eps_abs); - OSQPInterface( - const CSC_Matrix & P, const CSC_Matrix & A, const std::vector & q, - const std::vector & l, const std::vector & u, const c_float eps_abs); - ~OSQPInterface(); - - /**************** - * OPTIMIZATION - ****************/ - /// \brief Solves the stored convex quadratic program (QP) problem using the OSQP solver. - // - /// \return The function returns a tuple containing the solution as two float vectors. - /// \return The first element of the tuple contains the 'primal' solution. - /// \return The second element contains the 'lagrange multiplier' solution. - /// \return The third element contains an integer with solver polish status information. - - /// \details How to use: - /// \details 1. Generate the Eigen matrices P, A and vectors q, l, u according to the problem. - /// \details 2. Initialize the interface and set up the problem. - /// \details osqp_interface = OSQPInterface(P, A, q, l, u, 1e-6); - /// \details 3. Call the optimization function. - /// \details std::tuple, std::vector> result; - /// \details result = osqp_interface.optimize(); - /// \details 4. Access the optimized parameters. - /// \details std::vector param = std::get<0>(result); - /// \details double x_0 = param[0]; - /// \details double x_1 = param[1]; - std::tuple, std::vector, int64_t, int64_t, int64_t> optimize(); - - /// \brief Solves convex quadratic programs (QPs) using the OSQP solver. - /// \return The function returns a tuple containing the solution as two float vectors. - /// \return The first element of the tuple contains the 'primal' solution. - /// \return The second element contains the 'lagrange multiplier' solution. - /// \return The third element contains an integer with solver polish status information. - /// \details How to use: - /// \details 1. Generate the Eigen matrices P, A and vectors q, l, u according to the problem. - /// \details 2. Initialize the interface. - /// \details osqp_interface = OSQPInterface(1e-6); - /// \details 3. Call the optimization function with the problem formulation. - /// \details std::tuple, std::vector> result; - /// \details result = osqp_interface.optimize(P, A, q, l, u, 1e-6); - /// \details 4. Access the optimized parameters. - /// \details std::vector param = std::get<0>(result); - /// \details double x_0 = param[0]; - /// \details double x_1 = param[1]; - std::tuple, std::vector, int64_t, int64_t, int64_t> optimize( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u); - - /// \brief Converts the input data and sets up the workspace object. - /// \param P (n,n) matrix defining relations between parameters. - /// \param A (m,n) matrix defining parameter constraints relative to the lower and upper bound. - /// \param q (n) vector defining the linear cost of the problem. - /// \param l (m) vector defining the lower bound problem constraint. - /// \param u (m) vector defining the upper bound problem constraint. - int64_t initializeProblem( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u); - int64_t initializeProblem( - CSC_Matrix P, CSC_Matrix A, const std::vector & q, const std::vector & l, - const std::vector & u); - - // Setter functions for warm start - bool setWarmStart( - const std::vector & primal_variables, const std::vector & dual_variables); - bool setPrimalVariables(const std::vector & primal_variables); - bool setDualVariables(const std::vector & dual_variables); - - // Updates problem parameters while keeping solution in memory. - // - // Args: - // P_new: (n,n) matrix defining relations between parameters. - // A_new: (m,n) matrix defining parameter constraints relative to the lower and upper bound. - // q_new: (n) vector defining the linear cost of the problem. - // l_new: (m) vector defining the lower bound problem constraint. - // u_new: (m) vector defining the upper bound problem constraint. - void updateP(const Eigen::MatrixXd & P_new); - void updateCscP(const CSC_Matrix & P_csc); - void updateA(const Eigen::MatrixXd & A_new); - void updateCscA(const CSC_Matrix & A_csc); - void updateQ(const std::vector & q_new); - void updateL(const std::vector & l_new); - void updateU(const std::vector & u_new); - void updateBounds(const std::vector & l_new, const std::vector & u_new); - void updateEpsAbs(const double eps_abs); - void updateEpsRel(const double eps_rel); - void updateMaxIter(const int iter); - void updateVerbose(const bool verbose); - void updateRhoInterval(const int rho_interval); - void updateRho(const double rho); - void updateAlpha(const double alpha); - void updateScaling(const int scaling); - void updatePolish(const bool polish); - void updatePolishRefinementIteration(const int polish_refine_iter); - void updateCheckTermination(const int check_termination); - - /// \brief Get the number of iteration taken to solve the problem - inline int64_t getTakenIter() const { return static_cast(m_latest_work_info.iter); } - /// \brief Get the status message for the latest problem solved - inline std::string getStatusMessage() const - { - return static_cast(m_latest_work_info.status); - } - /// \brief Get the status value for the latest problem solved - inline int64_t getStatus() const { return static_cast(m_latest_work_info.status_val); } - /// \brief Get the status polish for the latest problem solved - inline int64_t getStatusPolish() const - { - return static_cast(m_latest_work_info.status_polish); - } - /// \brief Get the runtime of the latest problem solved - inline double getRunTime() const { return m_latest_work_info.run_time; } - /// \brief Get the objective value the latest problem solved - inline double getObjVal() const { return m_latest_work_info.obj_val; } - /// \brief Returns flag asserting interface condition (Healthy condition: 0). - inline int64_t getExitFlag() const { return m_exitflag; } - - void logUnsolvedStatus(const std::string & prefix_message = "") const; -}; - -} // namespace autoware::osqp_interface - -#endif // AUTOWARE__OSQP_INTERFACE__OSQP_INTERFACE_HPP_ diff --git a/common/autoware_osqp_interface/include/autoware/osqp_interface/visibility_control.hpp b/common/autoware_osqp_interface/include/autoware/osqp_interface/visibility_control.hpp deleted file mode 100644 index a6cdaa8a0a74e..0000000000000 --- a/common/autoware_osqp_interface/include/autoware/osqp_interface/visibility_control.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__OSQP_INTERFACE__VISIBILITY_CONTROL_HPP_ -#define AUTOWARE__OSQP_INTERFACE__VISIBILITY_CONTROL_HPP_ - -//////////////////////////////////////////////////////////////////////////////// -#if defined(__WIN32) -#if defined(OSQP_INTERFACE_BUILDING_DLL) || defined(OSQP_INTERFACE_EXPORTS) -#define OSQP_INTERFACE_PUBLIC __declspec(dllexport) -#define OSQP_INTERFACE_LOCAL -#else // defined(OSQP_INTERFACE_BUILDING_DLL) || defined(OSQP_INTERFACE_EXPORTS) -#define OSQP_INTERFACE_PUBLIC __declspec(dllimport) -#define OSQP_INTERFACE_LOCAL -#endif // defined(OSQP_INTERFACE_BUILDING_DLL) || defined(OSQP_INTERFACE_EXPORTS) -#elif defined(__linux__) -#define OSQP_INTERFACE_PUBLIC __attribute__((visibility("default"))) -#define OSQP_INTERFACE_LOCAL __attribute__((visibility("hidden"))) -#elif defined(__APPLE__) -#define OSQP_INTERFACE_PUBLIC __attribute__((visibility("default"))) -#define OSQP_INTERFACE_LOCAL __attribute__((visibility("hidden"))) -#else -#error "Unsupported Build Configuration" -#endif - -#endif // AUTOWARE__OSQP_INTERFACE__VISIBILITY_CONTROL_HPP_ diff --git a/common/autoware_osqp_interface/package.xml b/common/autoware_osqp_interface/package.xml deleted file mode 100644 index 92a2afeccc4e0..0000000000000 --- a/common/autoware_osqp_interface/package.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - autoware_osqp_interface - 0.40.0 - Interface for the OSQP solver - Maxime CLEMENT - Takayuki Murooka - Fumiya Watanabe - Satoshi Ota - Apache 2.0 - - ament_cmake_auto - autoware_cmake - - eigen - osqp_vendor - rclcpp - rclcpp_components - - ament_cmake_ros - ament_lint_auto - autoware_lint_common - eigen - - - ament_cmake - - diff --git a/common/autoware_osqp_interface/src/csc_matrix_conv.cpp b/common/autoware_osqp_interface/src/csc_matrix_conv.cpp deleted file mode 100644 index c6e1a0a42d938..0000000000000 --- a/common/autoware_osqp_interface/src/csc_matrix_conv.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#include "autoware/osqp_interface/csc_matrix_conv.hpp" - -#include -#include - -#include -#include -#include - -namespace autoware::osqp_interface -{ -CSC_Matrix calCSCMatrix(const Eigen::MatrixXd & mat) -{ - const size_t elem = static_cast(mat.nonZeros()); - const Eigen::Index rows = mat.rows(); - const Eigen::Index cols = mat.cols(); - - std::vector vals; - vals.reserve(elem); - std::vector row_idxs; - row_idxs.reserve(elem); - std::vector col_idxs; - col_idxs.reserve(elem); - - // Construct CSC matrix arrays - c_float val; - c_int elem_count = 0; - - col_idxs.push_back(0); - - for (Eigen::Index j = 0; j < cols; j++) { // col iteration - for (Eigen::Index i = 0; i < rows; i++) { // row iteration - // Get values of nonzero elements - val = mat(i, j); - if (std::fabs(val) < 1e-9) { - continue; - } - elem_count += 1; - - // Store values - vals.push_back(val); - row_idxs.push_back(i); - } - - col_idxs.push_back(elem_count); - } - - CSC_Matrix csc_matrix = {vals, row_idxs, col_idxs}; - - return csc_matrix; -} - -CSC_Matrix calCSCMatrixTrapezoidal(const Eigen::MatrixXd & mat) -{ - const size_t elem = static_cast(mat.nonZeros()); - const Eigen::Index rows = mat.rows(); - const Eigen::Index cols = mat.cols(); - - if (rows != cols) { - throw std::invalid_argument("Matrix must be square (n, n)"); - } - - std::vector vals; - vals.reserve(elem); - std::vector row_idxs; - row_idxs.reserve(elem); - std::vector col_idxs; - col_idxs.reserve(elem); - - // Construct CSC matrix arrays - c_float val; - Eigen::Index trap_last_idx = 0; - c_int elem_count = 0; - - col_idxs.push_back(0); - - for (Eigen::Index j = 0; j < cols; j++) { // col iteration - for (Eigen::Index i = 0; i <= trap_last_idx; i++) { // row iteration - // Get values of nonzero elements - val = mat(i, j); - if (std::fabs(val) < 1e-9) { - continue; - } - elem_count += 1; - - // Store values - vals.push_back(val); - row_idxs.push_back(i); - } - - col_idxs.push_back(elem_count); - trap_last_idx += 1; - } - - CSC_Matrix csc_matrix = {vals, row_idxs, col_idxs}; - - return csc_matrix; -} - -void printCSCMatrix(const CSC_Matrix & csc_mat) -{ - std::cout << "["; - for (const c_float & val : csc_mat.m_vals) { - std::cout << val << ", "; - } - std::cout << "]\n"; - - std::cout << "["; - for (const c_int & row : csc_mat.m_row_idxs) { - std::cout << row << ", "; - } - std::cout << "]\n"; - - std::cout << "["; - for (const c_int & col : csc_mat.m_col_idxs) { - std::cout << col << ", "; - } - std::cout << "]\n"; -} - -} // namespace autoware::osqp_interface diff --git a/common/autoware_osqp_interface/src/osqp_interface.cpp b/common/autoware_osqp_interface/src/osqp_interface.cpp deleted file mode 100644 index ceeae626222ca..0000000000000 --- a/common/autoware_osqp_interface/src/osqp_interface.cpp +++ /dev/null @@ -1,435 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#include "autoware/osqp_interface/osqp_interface.hpp" - -#include "autoware/osqp_interface/csc_matrix_conv.hpp" -#include "osqp/osqp.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace autoware::osqp_interface -{ -OSQPInterface::OSQPInterface(const c_float eps_abs, const bool polish) -: m_work{nullptr, OSQPWorkspaceDeleter} -{ - m_settings = std::make_unique(); - m_data = std::make_unique(); - - if (m_settings) { - osqp_set_default_settings(m_settings.get()); - m_settings->alpha = 1.6; // Change alpha parameter - m_settings->eps_rel = 1.0E-4; - m_settings->eps_abs = eps_abs; - m_settings->eps_prim_inf = 1.0E-4; - m_settings->eps_dual_inf = 1.0E-4; - m_settings->warm_start = true; - m_settings->max_iter = 4000; - m_settings->verbose = false; - m_settings->polish = polish; - } - m_exitflag = 0; -} - -OSQPInterface::OSQPInterface( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u, const c_float eps_abs) -: OSQPInterface(eps_abs) -{ - initializeProblem(P, A, q, l, u); -} - -OSQPInterface::OSQPInterface( - const CSC_Matrix & P, const CSC_Matrix & A, const std::vector & q, - const std::vector & l, const std::vector & u, const c_float eps_abs) -: OSQPInterface(eps_abs) -{ - initializeProblem(P, A, q, l, u); -} - -OSQPInterface::~OSQPInterface() -{ - if (m_data->P) free(m_data->P); - if (m_data->A) free(m_data->A); -} - -void OSQPInterface::OSQPWorkspaceDeleter(OSQPWorkspace * ptr) noexcept -{ - if (ptr != nullptr) { - osqp_cleanup(ptr); - } -} - -void OSQPInterface::updateP(const Eigen::MatrixXd & P_new) -{ - /* - // Transform 'P' into an 'upper trapezoidal matrix' - Eigen::MatrixXd P_trap = P_new.triangularView(); - // Transform 'P' into a sparse matrix and extract data as dynamic arrays - Eigen::SparseMatrix P_sparse = P_trap.sparseView(); - double *P_val_ptr = P_sparse.valuePtr(); - // Convert dynamic 'int' arrays to 'c_int' arrays (OSQP input type) - c_int P_elem_N = P_sparse.nonZeros(); - */ - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P_new); - osqp_update_P( - m_work.get(), P_csc.m_vals.data(), OSQP_NULL, static_cast(P_csc.m_vals.size())); -} - -void OSQPInterface::updateCscP(const CSC_Matrix & P_csc) -{ - osqp_update_P( - m_work.get(), P_csc.m_vals.data(), OSQP_NULL, static_cast(P_csc.m_vals.size())); -} - -void OSQPInterface::updateA(const Eigen::MatrixXd & A_new) -{ - /* - // Transform 'A' into a sparse matrix and extract data as dynamic arrays - Eigen::SparseMatrix A_sparse = A_new.sparseView(); - double *A_val_ptr = A_sparse.valuePtr(); - // Convert dynamic 'int' arrays to 'c_int' arrays (OSQP input type) - c_int A_elem_N = A_sparse.nonZeros(); - */ - CSC_Matrix A_csc = calCSCMatrix(A_new); - osqp_update_A( - m_work.get(), A_csc.m_vals.data(), OSQP_NULL, static_cast(A_csc.m_vals.size())); - return; -} - -void OSQPInterface::updateCscA(const CSC_Matrix & A_csc) -{ - osqp_update_A( - m_work.get(), A_csc.m_vals.data(), OSQP_NULL, static_cast(A_csc.m_vals.size())); -} - -void OSQPInterface::updateQ(const std::vector & q_new) -{ - std::vector q_tmp(q_new.begin(), q_new.end()); - double * q_dyn = q_tmp.data(); - osqp_update_lin_cost(m_work.get(), q_dyn); -} - -void OSQPInterface::updateL(const std::vector & l_new) -{ - std::vector l_tmp(l_new.begin(), l_new.end()); - double * l_dyn = l_tmp.data(); - osqp_update_lower_bound(m_work.get(), l_dyn); -} - -void OSQPInterface::updateU(const std::vector & u_new) -{ - std::vector u_tmp(u_new.begin(), u_new.end()); - double * u_dyn = u_tmp.data(); - osqp_update_upper_bound(m_work.get(), u_dyn); -} - -void OSQPInterface::updateBounds( - const std::vector & l_new, const std::vector & u_new) -{ - std::vector l_tmp(l_new.begin(), l_new.end()); - std::vector u_tmp(u_new.begin(), u_new.end()); - double * l_dyn = l_tmp.data(); - double * u_dyn = u_tmp.data(); - osqp_update_bounds(m_work.get(), l_dyn, u_dyn); -} - -void OSQPInterface::updateEpsAbs(const double eps_abs) -{ - m_settings->eps_abs = eps_abs; // for default setting - if (m_work_initialized) { - osqp_update_eps_abs(m_work.get(), eps_abs); // for current work - } -} - -void OSQPInterface::updateEpsRel(const double eps_rel) -{ - m_settings->eps_rel = eps_rel; // for default setting - if (m_work_initialized) { - osqp_update_eps_rel(m_work.get(), eps_rel); // for current work - } -} - -void OSQPInterface::updateMaxIter(const int max_iter) -{ - m_settings->max_iter = max_iter; // for default setting - if (m_work_initialized) { - osqp_update_max_iter(m_work.get(), max_iter); // for current work - } -} - -void OSQPInterface::updateVerbose(const bool is_verbose) -{ - m_settings->verbose = is_verbose; // for default setting - if (m_work_initialized) { - osqp_update_verbose(m_work.get(), is_verbose); // for current work - } -} - -void OSQPInterface::updateRhoInterval(const int rho_interval) -{ - m_settings->adaptive_rho_interval = rho_interval; // for default setting -} - -void OSQPInterface::updateRho(const double rho) -{ - m_settings->rho = rho; - if (m_work_initialized) { - osqp_update_rho(m_work.get(), rho); - } -} - -void OSQPInterface::updateAlpha(const double alpha) -{ - m_settings->alpha = alpha; - if (m_work_initialized) { - osqp_update_alpha(m_work.get(), alpha); - } -} - -void OSQPInterface::updateScaling(const int scaling) -{ - m_settings->scaling = scaling; -} - -void OSQPInterface::updatePolish(const bool polish) -{ - m_settings->polish = polish; - if (m_work_initialized) { - osqp_update_polish(m_work.get(), polish); - } -} - -void OSQPInterface::updatePolishRefinementIteration(const int polish_refine_iter) -{ - if (polish_refine_iter < 0) { - std::cerr << "Polish refinement iterations must be positive" << std::endl; - return; - } - - m_settings->polish_refine_iter = polish_refine_iter; - if (m_work_initialized) { - osqp_update_polish_refine_iter(m_work.get(), polish_refine_iter); - } -} - -void OSQPInterface::updateCheckTermination(const int check_termination) -{ - if (check_termination < 0) { - std::cerr << "Check termination must be positive" << std::endl; - return; - } - - m_settings->check_termination = check_termination; - if (m_work_initialized) { - osqp_update_check_termination(m_work.get(), check_termination); - } -} - -bool OSQPInterface::setWarmStart( - const std::vector & primal_variables, const std::vector & dual_variables) -{ - return setPrimalVariables(primal_variables) && setDualVariables(dual_variables); -} - -bool OSQPInterface::setPrimalVariables(const std::vector & primal_variables) -{ - if (!m_work_initialized) { - return false; - } - - const auto result = osqp_warm_start_x(m_work.get(), primal_variables.data()); - if (result != 0) { - std::cerr << "Failed to set primal variables for warm start" << std::endl; - return false; - } - - return true; -} - -bool OSQPInterface::setDualVariables(const std::vector & dual_variables) -{ - if (!m_work_initialized) { - return false; - } - - const auto result = osqp_warm_start_y(m_work.get(), dual_variables.data()); - if (result != 0) { - std::cerr << "Failed to set dual variables for warm start" << std::endl; - return false; - } - - return true; -} - -int64_t OSQPInterface::initializeProblem( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - // check if arguments are valid - std::stringstream ss; - if (P.rows() != P.cols()) { - ss << "P.rows() and P.cols() are not the same. P.rows() = " << P.rows() - << ", P.cols() = " << P.cols(); - throw std::invalid_argument(ss.str()); - } - if (P.rows() != static_cast(q.size())) { - ss << "P.rows() and q.size() are not the same. P.rows() = " << P.rows() - << ", q.size() = " << q.size(); - throw std::invalid_argument(ss.str()); - } - if (P.rows() != A.cols()) { - ss << "P.rows() and A.cols() are not the same. P.rows() = " << P.rows() - << ", A.cols() = " << A.cols(); - throw std::invalid_argument(ss.str()); - } - if (A.rows() != static_cast(l.size())) { - ss << "A.rows() and l.size() are not the same. A.rows() = " << A.rows() - << ", l.size() = " << l.size(); - throw std::invalid_argument(ss.str()); - } - if (A.rows() != static_cast(u.size())) { - ss << "A.rows() and u.size() are not the same. A.rows() = " << A.rows() - << ", u.size() = " << u.size(); - throw std::invalid_argument(ss.str()); - } - - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - return initializeProblem(P_csc, A_csc, q, l, u); -} - -int64_t OSQPInterface::initializeProblem( - CSC_Matrix P_csc, CSC_Matrix A_csc, const std::vector & q, const std::vector & l, - const std::vector & u) -{ - // Dynamic float arrays - std::vector q_tmp(q.begin(), q.end()); - std::vector l_tmp(l.begin(), l.end()); - std::vector u_tmp(u.begin(), u.end()); - double * q_dyn = q_tmp.data(); - double * l_dyn = l_tmp.data(); - double * u_dyn = u_tmp.data(); - - /********************** - * OBJECTIVE FUNCTION - **********************/ - m_param_n = static_cast(q.size()); - m_data->m = static_cast(l.size()); - - /***************** - * POPULATE DATA - *****************/ - m_data->n = m_param_n; - if (m_data->P) free(m_data->P); - m_data->P = csc_matrix( - m_data->n, m_data->n, static_cast(P_csc.m_vals.size()), P_csc.m_vals.data(), - P_csc.m_row_idxs.data(), P_csc.m_col_idxs.data()); - m_data->q = q_dyn; - if (m_data->A) free(m_data->A); - m_data->A = csc_matrix( - m_data->m, m_data->n, static_cast(A_csc.m_vals.size()), A_csc.m_vals.data(), - A_csc.m_row_idxs.data(), A_csc.m_col_idxs.data()); - m_data->l = l_dyn; - m_data->u = u_dyn; - - // Setup workspace - OSQPWorkspace * workspace; - m_exitflag = osqp_setup(&workspace, m_data.get(), m_settings.get()); - m_work.reset(workspace); - m_work_initialized = true; - - return m_exitflag; -} - -std::tuple, std::vector, int64_t, int64_t, int64_t> -OSQPInterface::solve() -{ - // Solve Problem - osqp_solve(m_work.get()); - - /******************** - * EXTRACT SOLUTION - ********************/ - double * sol_x = m_work->solution->x; - double * sol_y = m_work->solution->y; - std::vector sol_primal(sol_x, sol_x + m_param_n); - std::vector sol_lagrange_multiplier(sol_y, sol_y + m_data->m); - - int64_t status_polish = m_work->info->status_polish; - int64_t status_solution = m_work->info->status_val; - int64_t status_iteration = m_work->info->iter; - - // Result tuple - std::tuple, std::vector, int64_t, int64_t, int64_t> result = - std::make_tuple( - sol_primal, sol_lagrange_multiplier, status_polish, status_solution, status_iteration); - - m_latest_work_info = *(m_work->info); - - return result; -} - -std::tuple, std::vector, int64_t, int64_t, int64_t> -OSQPInterface::optimize() -{ - // Run the solver on the stored problem representation. - std::tuple, std::vector, int64_t, int64_t, int64_t> result = solve(); - return result; -} - -std::tuple, std::vector, int64_t, int64_t, int64_t> -OSQPInterface::optimize( - const Eigen::MatrixXd & P, const Eigen::MatrixXd & A, const std::vector & q, - const std::vector & l, const std::vector & u) -{ - // Allocate memory for problem - initializeProblem(P, A, q, l, u); - - // Run the solver on the stored problem representation. - std::tuple, std::vector, int64_t, int64_t, int64_t> result = solve(); - - m_work.reset(); - m_work_initialized = false; - - return result; -} - -void OSQPInterface::logUnsolvedStatus(const std::string & prefix_message) const -{ - const int status = getStatus(); - if (status == 1) { - // No need to log since optimization was solved. - return; - } - - // create message - std::string output_message = ""; - if (prefix_message != "") { - output_message = prefix_message + " "; - } - - const auto status_message = getStatusMessage(); - output_message += "Optimization failed due to " + status_message; - - // log with warning - RCLCPP_WARN(rclcpp::get_logger("osqp_interface"), "%s", output_message.c_str()); -} -} // namespace autoware::osqp_interface diff --git a/common/autoware_osqp_interface/test/test_csc_matrix_conv.cpp b/common/autoware_osqp_interface/test/test_csc_matrix_conv.cpp deleted file mode 100644 index a63f979a966bf..0000000000000 --- a/common/autoware_osqp_interface/test/test_csc_matrix_conv.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#include "autoware/osqp_interface/csc_matrix_conv.hpp" -#include "gtest/gtest.h" - -#include - -#include -#include -#include - -TEST(TestCscMatrixConv, Nominal) -{ - using autoware::osqp_interface::calCSCMatrix; - using autoware::osqp_interface::CSC_Matrix; - - Eigen::MatrixXd rect1(1, 2); - rect1 << 0.0, 1.0; - - const CSC_Matrix rect_m1 = calCSCMatrix(rect1); - ASSERT_EQ(rect_m1.m_vals.size(), size_t(1)); - EXPECT_EQ(rect_m1.m_vals[0], 1.0); - ASSERT_EQ(rect_m1.m_row_idxs.size(), size_t(1)); - EXPECT_EQ(rect_m1.m_row_idxs[0], c_int(0)); - ASSERT_EQ(rect_m1.m_col_idxs.size(), size_t(3)); // nb of columns + 1 - EXPECT_EQ(rect_m1.m_col_idxs[0], c_int(0)); - EXPECT_EQ(rect_m1.m_col_idxs[1], c_int(0)); - EXPECT_EQ(rect_m1.m_col_idxs[2], c_int(1)); - - Eigen::MatrixXd rect2(2, 4); - rect2 << 1.0, 0.0, 3.0, 0.0, 0.0, 6.0, 7.0, 0.0; - - const CSC_Matrix rect_m2 = calCSCMatrix(rect2); - ASSERT_EQ(rect_m2.m_vals.size(), size_t(4)); - EXPECT_EQ(rect_m2.m_vals[0], 1.0); - EXPECT_EQ(rect_m2.m_vals[1], 6.0); - EXPECT_EQ(rect_m2.m_vals[2], 3.0); - EXPECT_EQ(rect_m2.m_vals[3], 7.0); - ASSERT_EQ(rect_m2.m_row_idxs.size(), size_t(4)); - EXPECT_EQ(rect_m2.m_row_idxs[0], c_int(0)); - EXPECT_EQ(rect_m2.m_row_idxs[1], c_int(1)); - EXPECT_EQ(rect_m2.m_row_idxs[2], c_int(0)); - EXPECT_EQ(rect_m2.m_row_idxs[3], c_int(1)); - ASSERT_EQ(rect_m2.m_col_idxs.size(), size_t(5)); // nb of columns + 1 - EXPECT_EQ(rect_m2.m_col_idxs[0], c_int(0)); - EXPECT_EQ(rect_m2.m_col_idxs[1], c_int(1)); - EXPECT_EQ(rect_m2.m_col_idxs[2], c_int(2)); - EXPECT_EQ(rect_m2.m_col_idxs[3], c_int(4)); - EXPECT_EQ(rect_m2.m_col_idxs[4], c_int(4)); - - // Example from http://netlib.org/linalg/html_templates/node92.html - Eigen::MatrixXd square2(6, 6); - square2 << 10.0, 0.0, 0.0, 0.0, -2.0, 0.0, 3.0, 9.0, 0.0, 0.0, 0.0, 3.0, 0.0, 7.0, 8.0, 7.0, 0.0, - 0.0, 3.0, 0.0, 8.0, 7.0, 5.0, 0.0, 0.0, 8.0, 0.0, 9.0, 9.0, 13.0, 0.0, 4.0, 0.0, 0.0, 2.0, -1.0; - - const CSC_Matrix square_m2 = calCSCMatrix(square2); - ASSERT_EQ(square_m2.m_vals.size(), size_t(19)); - EXPECT_EQ(square_m2.m_vals[0], 10.0); - EXPECT_EQ(square_m2.m_vals[1], 3.0); - EXPECT_EQ(square_m2.m_vals[2], 3.0); - EXPECT_EQ(square_m2.m_vals[3], 9.0); - EXPECT_EQ(square_m2.m_vals[4], 7.0); - EXPECT_EQ(square_m2.m_vals[5], 8.0); - EXPECT_EQ(square_m2.m_vals[6], 4.0); - EXPECT_EQ(square_m2.m_vals[7], 8.0); - EXPECT_EQ(square_m2.m_vals[8], 8.0); - EXPECT_EQ(square_m2.m_vals[9], 7.0); - EXPECT_EQ(square_m2.m_vals[10], 7.0); - EXPECT_EQ(square_m2.m_vals[11], 9.0); - EXPECT_EQ(square_m2.m_vals[12], -2.0); - EXPECT_EQ(square_m2.m_vals[13], 5.0); - EXPECT_EQ(square_m2.m_vals[14], 9.0); - EXPECT_EQ(square_m2.m_vals[15], 2.0); - EXPECT_EQ(square_m2.m_vals[16], 3.0); - EXPECT_EQ(square_m2.m_vals[17], 13.0); - EXPECT_EQ(square_m2.m_vals[18], -1.0); - ASSERT_EQ(square_m2.m_row_idxs.size(), size_t(19)); - EXPECT_EQ(square_m2.m_row_idxs[0], c_int(0)); - EXPECT_EQ(square_m2.m_row_idxs[1], c_int(1)); - EXPECT_EQ(square_m2.m_row_idxs[2], c_int(3)); - EXPECT_EQ(square_m2.m_row_idxs[3], c_int(1)); - EXPECT_EQ(square_m2.m_row_idxs[4], c_int(2)); - EXPECT_EQ(square_m2.m_row_idxs[5], c_int(4)); - EXPECT_EQ(square_m2.m_row_idxs[6], c_int(5)); - EXPECT_EQ(square_m2.m_row_idxs[7], c_int(2)); - EXPECT_EQ(square_m2.m_row_idxs[8], c_int(3)); - EXPECT_EQ(square_m2.m_row_idxs[9], c_int(2)); - EXPECT_EQ(square_m2.m_row_idxs[10], c_int(3)); - EXPECT_EQ(square_m2.m_row_idxs[11], c_int(4)); - EXPECT_EQ(square_m2.m_row_idxs[12], c_int(0)); - EXPECT_EQ(square_m2.m_row_idxs[13], c_int(3)); - EXPECT_EQ(square_m2.m_row_idxs[14], c_int(4)); - EXPECT_EQ(square_m2.m_row_idxs[15], c_int(5)); - EXPECT_EQ(square_m2.m_row_idxs[16], c_int(1)); - EXPECT_EQ(square_m2.m_row_idxs[17], c_int(4)); - EXPECT_EQ(square_m2.m_row_idxs[18], c_int(5)); - ASSERT_EQ(square_m2.m_col_idxs.size(), size_t(7)); // nb of columns + 1 - EXPECT_EQ(square_m2.m_col_idxs[0], c_int(0)); - EXPECT_EQ(square_m2.m_col_idxs[1], c_int(3)); - EXPECT_EQ(square_m2.m_col_idxs[2], c_int(7)); - EXPECT_EQ(square_m2.m_col_idxs[3], c_int(9)); - EXPECT_EQ(square_m2.m_col_idxs[4], c_int(12)); - EXPECT_EQ(square_m2.m_col_idxs[5], c_int(16)); - EXPECT_EQ(square_m2.m_col_idxs[6], c_int(19)); -} -TEST(TestCscMatrixConv, Trapezoidal) -{ - using autoware::osqp_interface::calCSCMatrixTrapezoidal; - using autoware::osqp_interface::CSC_Matrix; - - Eigen::MatrixXd square1(2, 2); - Eigen::MatrixXd square2(3, 3); - Eigen::MatrixXd rect1(1, 2); - square1 << 1.0, 2.0, 2.0, 4.0; - square2 << 0.0, 2.0, 0.0, 4.0, 5.0, 6.0, 0.0, 0.0, 0.0; - rect1 << 0.0, 1.0; - - const CSC_Matrix square_m1 = calCSCMatrixTrapezoidal(square1); - // Trapezoidal: skip the lower left triangle (2.0 in this example) - ASSERT_EQ(square_m1.m_vals.size(), size_t(3)); - EXPECT_EQ(square_m1.m_vals[0], 1.0); - EXPECT_EQ(square_m1.m_vals[1], 2.0); - EXPECT_EQ(square_m1.m_vals[2], 4.0); - ASSERT_EQ(square_m1.m_row_idxs.size(), size_t(3)); - EXPECT_EQ(square_m1.m_row_idxs[0], c_int(0)); - EXPECT_EQ(square_m1.m_row_idxs[1], c_int(0)); - EXPECT_EQ(square_m1.m_row_idxs[2], c_int(1)); - ASSERT_EQ(square_m1.m_col_idxs.size(), size_t(3)); - EXPECT_EQ(square_m1.m_col_idxs[0], c_int(0)); - EXPECT_EQ(square_m1.m_col_idxs[1], c_int(1)); - EXPECT_EQ(square_m1.m_col_idxs[2], c_int(3)); - - const CSC_Matrix square_m2 = calCSCMatrixTrapezoidal(square2); - ASSERT_EQ(square_m2.m_vals.size(), size_t(3)); - EXPECT_EQ(square_m2.m_vals[0], 2.0); - EXPECT_EQ(square_m2.m_vals[1], 5.0); - EXPECT_EQ(square_m2.m_vals[2], 6.0); - ASSERT_EQ(square_m2.m_row_idxs.size(), size_t(3)); - EXPECT_EQ(square_m2.m_row_idxs[0], c_int(0)); - EXPECT_EQ(square_m2.m_row_idxs[1], c_int(1)); - EXPECT_EQ(square_m2.m_row_idxs[2], c_int(1)); - ASSERT_EQ(square_m2.m_col_idxs.size(), size_t(4)); - EXPECT_EQ(square_m2.m_col_idxs[0], c_int(0)); - EXPECT_EQ(square_m2.m_col_idxs[1], c_int(0)); - EXPECT_EQ(square_m2.m_col_idxs[2], c_int(2)); - EXPECT_EQ(square_m2.m_col_idxs[3], c_int(3)); - - try { - const CSC_Matrix rect_m1 = calCSCMatrixTrapezoidal(rect1); - FAIL() << "calCSCMatrixTrapezoidal should fail with non-square inputs"; - } catch (const std::invalid_argument & e) { - EXPECT_EQ(e.what(), std::string("Matrix must be square (n, n)")); - } -} -TEST(TestCscMatrixConv, Print) -{ - using autoware::osqp_interface::calCSCMatrix; - using autoware::osqp_interface::calCSCMatrixTrapezoidal; - using autoware::osqp_interface::CSC_Matrix; - using autoware::osqp_interface::printCSCMatrix; - Eigen::MatrixXd square1(2, 2); - Eigen::MatrixXd rect1(1, 2); - square1 << 1.0, 2.0, 2.0, 4.0; - rect1 << 0.0, 1.0; - const CSC_Matrix square_m1 = calCSCMatrixTrapezoidal(square1); - const CSC_Matrix rect_m1 = calCSCMatrix(rect1); - printCSCMatrix(square_m1); - printCSCMatrix(rect_m1); -} diff --git a/common/autoware_osqp_interface/test/test_osqp_interface.cpp b/common/autoware_osqp_interface/test/test_osqp_interface.cpp deleted file mode 100644 index f65b07e6d792d..0000000000000 --- a/common/autoware_osqp_interface/test/test_osqp_interface.cpp +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2021 The Autoware Foundation -// -// 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. - -#include "autoware/osqp_interface/osqp_interface.hpp" -#include "gtest/gtest.h" - -#include - -#include -#include -#include - -namespace -{ -// Problem taken from https://github.com/osqp/osqp/blob/master/tests/basic_qp/generate_problem.py -// -// min 1/2 * x' * P * x + q' * x -// s.t. lb <= A * x <= ub -// -// P = [4, 1], q = [1], A = [1, 1], lb = [ 1], ub = [1.0] -// [1, 2] [1] [1, 0] [ 0] [0.7] -// [0, 1] [ 0] [0.7] -// [0, 1] [-inf] [inf] -// -// The optimal solution is -// x = [0.3, 0.7]' -// y = [-2.9, 0.0, 0.2, 0.0]` -// obj = 1.88 - -TEST(TestOsqpInterface, BasicQp) -{ - using autoware::osqp_interface::calCSCMatrix; - using autoware::osqp_interface::calCSCMatrixTrapezoidal; - using autoware::osqp_interface::CSC_Matrix; - - auto check_result = - [](const std::tuple, std::vector, int, int, int> & result) { - EXPECT_EQ(std::get<2>(result), 1); // polish succeeded - EXPECT_EQ(std::get<3>(result), 1); // solution succeeded - - static const auto ep = 1.0e-8; - - const auto prime_val = std::get<0>(result); - ASSERT_EQ(prime_val.size(), size_t(2)); - EXPECT_NEAR(prime_val[0], 0.3, ep); - EXPECT_NEAR(prime_val[1], 0.7, ep); - - const auto dual_val = std::get<1>(result); - ASSERT_EQ(dual_val.size(), size_t(4)); - EXPECT_NEAR(dual_val[0], -2.9, ep); - EXPECT_NEAR(dual_val[1], 0.0, ep); - EXPECT_NEAR(dual_val[2], 0.2, ep); - EXPECT_NEAR(dual_val[3], 0.0, ep); - }; - - const Eigen::MatrixXd P = (Eigen::MatrixXd(2, 2) << 4, 1, 1, 2).finished(); - const Eigen::MatrixXd A = (Eigen::MatrixXd(4, 2) << 1, 1, 1, 0, 0, 1, 0, 1).finished(); - const std::vector q = {1.0, 1.0}; - const std::vector l = {1.0, 0.0, 0.0, -autoware::osqp_interface::INF}; - const std::vector u = {1.0, 0.7, 0.7, autoware::osqp_interface::INF}; - - { - // Define problem during optimization - autoware::osqp_interface::OSQPInterface osqp; - std::tuple, std::vector, int, int, int> result = - osqp.optimize(P, A, q, l, u); - check_result(result); - } - - { - // Define problem during initialization - autoware::osqp_interface::OSQPInterface osqp(P, A, q, l, u, 1e-6); - std::tuple, std::vector, int, int, int> result = osqp.optimize(); - check_result(result); - } - - { - std::tuple, std::vector, int, int, int> result; - // Dummy initial problem - Eigen::MatrixXd P_ini = Eigen::MatrixXd::Zero(2, 2); - Eigen::MatrixXd A_ini = Eigen::MatrixXd::Zero(4, 2); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::osqp_interface::OSQPInterface osqp(P_ini, A_ini, q_ini, l_ini, u_ini, 1e-6); - osqp.optimize(); - - // Redefine problem before optimization - osqp.initializeProblem(P, A, q, l, u); - result = osqp.optimize(); - check_result(result); - } - - { - // Define problem during initialization with csc matrix - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - autoware::osqp_interface::OSQPInterface osqp(P_csc, A_csc, q, l, u, 1e-6); - std::tuple, std::vector, int, int, int> result = osqp.optimize(); - check_result(result); - } - - { - std::tuple, std::vector, int, int, int> result; - // Dummy initial problem with csc matrix - CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2)); - CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2)); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::osqp_interface::OSQPInterface osqp(P_ini_csc, A_ini_csc, q_ini, l_ini, u_ini, 1e-6); - osqp.optimize(); - - // Redefine problem before optimization - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - osqp.initializeProblem(P_csc, A_csc, q, l, u); - result = osqp.optimize(); - check_result(result); - } - - // add warm startup - { - std::tuple, std::vector, int, int, int> result; - // Dummy initial problem with csc matrix - CSC_Matrix P_ini_csc = calCSCMatrixTrapezoidal(Eigen::MatrixXd::Zero(2, 2)); - CSC_Matrix A_ini_csc = calCSCMatrix(Eigen::MatrixXd::Zero(4, 2)); - std::vector q_ini(2, 0.0); - std::vector l_ini(4, 0.0); - std::vector u_ini(4, 0.0); - autoware::osqp_interface::OSQPInterface osqp(P_ini_csc, A_ini_csc, q_ini, l_ini, u_ini, 1e-6); - osqp.optimize(); - - // Redefine problem before optimization - CSC_Matrix P_csc = calCSCMatrixTrapezoidal(P); - CSC_Matrix A_csc = calCSCMatrix(A); - osqp.initializeProblem(P_csc, A_csc, q, l, u); - result = osqp.optimize(); - check_result(result); - - osqp.updateCheckTermination(1); - const auto primal_val = std::get<0>(result); - const auto dual_val = std::get<1>(result); - for (size_t i = 0; i < primal_val.size(); ++i) { - std::cerr << primal_val.at(i) << std::endl; - } - osqp.setWarmStart(primal_val, dual_val); - result = osqp.optimize(); - check_result(result); - EXPECT_EQ(osqp.getTakenIter(), 1); - } -} -} // namespace From a6b5f3c6992e6978eec4c110d1956df99c0219ca Mon Sep 17 00:00:00 2001 From: cyn-liu <104069308+cyn-liu@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:17:04 +0800 Subject: [PATCH 091/127] feat(autoware_kalman_filter): move autoware_kalman_filter to autowar.core (#9872) feat(autoware_kalman_filter): move autoware_kalman_filter to autoware.core Signed-off-by: liu cui --- common/autoware_kalman_filter/CHANGELOG.rst | 55 ----- common/autoware_kalman_filter/CMakeLists.txt | 29 --- common/autoware_kalman_filter/README.md | 9 - .../autoware/kalman_filter/kalman_filter.hpp | 214 ------------------ .../time_delay_kalman_filter.hpp | 89 -------- common/autoware_kalman_filter/package.xml | 28 --- .../src/kalman_filter.cpp | 161 ------------- .../src/time_delay_kalman_filter.cpp | 109 --------- .../test/test_kalman_filter.cpp | 96 -------- .../test/test_time_delay_kalman_filter.cpp | 123 ---------- 10 files changed, 913 deletions(-) delete mode 100644 common/autoware_kalman_filter/CHANGELOG.rst delete mode 100644 common/autoware_kalman_filter/CMakeLists.txt delete mode 100644 common/autoware_kalman_filter/README.md delete mode 100644 common/autoware_kalman_filter/include/autoware/kalman_filter/kalman_filter.hpp delete mode 100644 common/autoware_kalman_filter/include/autoware/kalman_filter/time_delay_kalman_filter.hpp delete mode 100644 common/autoware_kalman_filter/package.xml delete mode 100644 common/autoware_kalman_filter/src/kalman_filter.cpp delete mode 100644 common/autoware_kalman_filter/src/time_delay_kalman_filter.cpp delete mode 100644 common/autoware_kalman_filter/test/test_kalman_filter.cpp delete mode 100644 common/autoware_kalman_filter/test/test_time_delay_kalman_filter.cpp diff --git a/common/autoware_kalman_filter/CHANGELOG.rst b/common/autoware_kalman_filter/CHANGELOG.rst deleted file mode 100644 index a7e68f8843e74..0000000000000 --- a/common/autoware_kalman_filter/CHANGELOG.rst +++ /dev/null @@ -1,55 +0,0 @@ -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Changelog for package autoware_kalman_filter -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -0.40.0 (2024-12-12) -------------------- -* Merge branch 'main' into release-0.40.0 -* Revert "chore(package.xml): bump version to 0.39.0 (`#9587 `_)" - This reverts commit c9f0f2688c57b0f657f5c1f28f036a970682e7f5. -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* chore(package.xml): bump version to 0.39.0 (`#9587 `_) - * chore(package.xml): bump version to 0.39.0 - * fix: fix ticket links in CHANGELOG.rst - * fix: remove unnecessary diff - --------- - Co-authored-by: Yutaka Kondo -* fix: fix ticket links in CHANGELOG.rst (`#9588 `_) -* fix(cpplint): include what you use - common (`#9564 `_) -* 0.39.0 -* update changelog -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Fumiya Watanabe, M. Fatih Cırıt, Ryohsuke Mitsudome, Yutaka Kondo - -0.39.0 (2024-11-25) -------------------- -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* fix: fix ticket links to point to https://github.com/autowarefoundation/autoware.universe (`#9304 `_) -* chore(package.xml): bump version to 0.38.0 (`#9266 `_) (`#9284 `_) - * unify package.xml version to 0.37.0 - * remove system_monitor/CHANGELOG.rst - * add changelog - * 0.38.0 - --------- -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.38.0 (2024-11-08) -------------------- -* unify package.xml version to 0.37.0 -* refactor(kalman_filter): prefix package and namespace with autoware (`#7787 `_) - * refactor(kalman_filter): prefix package and namespace with autoware - * move headers to include/autoware/ - * style(pre-commit): autofix - --------- - Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> -* Contributors: Esteve Fernandez, Yutaka Kondo - -0.26.0 (2024-04-03) -------------------- diff --git a/common/autoware_kalman_filter/CMakeLists.txt b/common/autoware_kalman_filter/CMakeLists.txt deleted file mode 100644 index 076d2d3cad4e8..0000000000000 --- a/common/autoware_kalman_filter/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(autoware_kalman_filter) - -find_package(autoware_cmake REQUIRED) -autoware_package() - -find_package(eigen3_cmake_module REQUIRED) -find_package(Eigen3 REQUIRED) - -include_directories( - SYSTEM - ${EIGEN3_INCLUDE_DIR} -) - -ament_auto_add_library(${PROJECT_NAME} SHARED - src/kalman_filter.cpp - src/time_delay_kalman_filter.cpp - include/autoware/kalman_filter/kalman_filter.hpp - include/autoware/kalman_filter/time_delay_kalman_filter.hpp -) - -if(BUILD_TESTING) - file(GLOB_RECURSE test_files test/*.cpp) - ament_add_ros_isolated_gtest(test_${PROJECT_NAME} ${test_files}) - - target_link_libraries(test_${PROJECT_NAME} ${PROJECT_NAME}) -endif() - -ament_auto_package() diff --git a/common/autoware_kalman_filter/README.md b/common/autoware_kalman_filter/README.md deleted file mode 100644 index 7c0feb9c2a61a..0000000000000 --- a/common/autoware_kalman_filter/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# kalman_filter - -## Purpose - -This common package contains the kalman filter with time delay and the calculation of the kalman filter. - -## Assumptions / Known limits - -TBD. diff --git a/common/autoware_kalman_filter/include/autoware/kalman_filter/kalman_filter.hpp b/common/autoware_kalman_filter/include/autoware/kalman_filter/kalman_filter.hpp deleted file mode 100644 index 74db04f6e838b..0000000000000 --- a/common/autoware_kalman_filter/include/autoware/kalman_filter/kalman_filter.hpp +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2018-2019 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__KALMAN_FILTER__KALMAN_FILTER_HPP_ -#define AUTOWARE__KALMAN_FILTER__KALMAN_FILTER_HPP_ - -#include -#include - -namespace autoware::kalman_filter -{ - -/** - * @file kalman_filter.h - * @brief kalman filter class - * @author Takamasa Horibe - * @date 2019.05.01 - */ - -class KalmanFilter -{ -public: - /** - * @brief No initialization constructor. - */ - KalmanFilter(); - - /** - * @brief constructor with initialization - * @param x initial state - * @param A coefficient matrix of x for process model - * @param B coefficient matrix of u for process model - * @param C coefficient matrix of x for measurement model - * @param Q covariance matrix for process model - * @param R covariance matrix for measurement model - * @param P initial covariance of estimated state - */ - KalmanFilter( - const Eigen::MatrixXd & x, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & C, const Eigen::MatrixXd & Q, const Eigen::MatrixXd & R, - const Eigen::MatrixXd & P); - - /** - * @brief destructor - */ - ~KalmanFilter(); - - /** - * @brief initialization of kalman filter - * @param x initial state - * @param A coefficient matrix of x for process model - * @param B coefficient matrix of u for process model - * @param C coefficient matrix of x for measurement model - * @param Q covariance matrix for process model - * @param R covariance matrix for measurement model - * @param P initial covariance of estimated state - */ - bool init( - const Eigen::MatrixXd & x, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & C, const Eigen::MatrixXd & Q, const Eigen::MatrixXd & R, - const Eigen::MatrixXd & P); - - /** - * @brief initialization of kalman filter - * @param x initial state - * @param P initial covariance of estimated state - */ - bool init(const Eigen::MatrixXd & x, const Eigen::MatrixXd & P0); - - /** - * @brief set A of process model - * @param A coefficient matrix of x for process model - */ - void setA(const Eigen::MatrixXd & A); - - /** - * @brief set B of process model - * @param B coefficient matrix of u for process model - */ - void setB(const Eigen::MatrixXd & B); - - /** - * @brief set C of measurement model - * @param C coefficient matrix of x for measurement model - */ - void setC(const Eigen::MatrixXd & C); - - /** - * @brief set covariance matrix Q for process model - * @param Q covariance matrix for process model - */ - void setQ(const Eigen::MatrixXd & Q); - - /** - * @brief set covariance matrix R for measurement model - * @param R covariance matrix for measurement model - */ - void setR(const Eigen::MatrixXd & R); - - /** - * @brief get current kalman filter state - * @param x kalman filter state - */ - void getX(Eigen::MatrixXd & x) const; - - /** - * @brief get current kalman filter covariance - * @param P kalman filter covariance - */ - void getP(Eigen::MatrixXd & P) const; - - /** - * @brief get component of current kalman filter state - * @param i index of kalman filter state - * @return value of i's component of the kalman filter state x[i] - */ - double getXelement(unsigned int i) const; - - /** - * @brief calculate kalman filter state and covariance by prediction model with A, B, Q matrix. - * This is mainly for EKF with variable matrix. - * @param u input for model - * @param A coefficient matrix of x for process model - * @param B coefficient matrix of u for process model - * @param Q covariance matrix for process model - * @return bool to check matrix operations are being performed properly - */ - bool predict( - const Eigen::MatrixXd & u, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & Q); - - /** - * @brief calculate kalman filter covariance with prediction model with x, A, Q matrix. This is - * mainly for EKF with variable matrix. - * @param x_next predicted state - * @param A coefficient matrix of x for process model - * @param Q covariance matrix for process model - * @return bool to check matrix operations are being performed properly - */ - bool predict( - const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A, const Eigen::MatrixXd & Q); - - /** - * @brief calculate kalman filter covariance with prediction model with x, A, Q matrix. This is - * mainly for EKF with variable matrix. - * @param x_next predicted state - * @param A coefficient matrix of x for process model - * @return bool to check matrix operations are being performed properly - */ - bool predict(const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A); - - /** - * @brief calculate kalman filter state by prediction model with A, B and Q being class member - * variables. - * @param u input for the model - * @return bool to check matrix operations are being performed properly - */ - bool predict(const Eigen::MatrixXd & u); - - /** - * @brief calculate kalman filter state by measurement model with y_pred, C and R matrix. This is - * mainly for EKF with variable matrix. - * @param y measured values - * @param y output values expected from measurement model - * @param C coefficient matrix of x for measurement model - * @param R covariance matrix for measurement model - * @return bool to check matrix operations are being performed properly - */ - bool update( - const Eigen::MatrixXd & y, const Eigen::MatrixXd & y_pred, const Eigen::MatrixXd & C, - const Eigen::MatrixXd & R); - - /** - * @brief calculate kalman filter state by measurement model with C and R matrix. This is mainly - * for EKF with variable matrix. - * @param y measured values - * @param C coefficient matrix of x for measurement model - * @param R covariance matrix for measurement model - * @return bool to check matrix operations are being performed properly - */ - bool update(const Eigen::MatrixXd & y, const Eigen::MatrixXd & C, const Eigen::MatrixXd & R); - - /** - * @brief calculate kalman filter state by measurement model with C and R being class member - * variables. - * @param y measured values - * @return bool to check matrix operations are being performed properly - */ - bool update(const Eigen::MatrixXd & y); - -protected: - Eigen::MatrixXd x_; //!< @brief current estimated state - Eigen::MatrixXd - A_; //!< @brief coefficient matrix of x for process model x[k+1] = A*x[k] + B*u[k] - Eigen::MatrixXd - B_; //!< @brief coefficient matrix of u for process model x[k+1] = A*x[k] + B*u[k] - Eigen::MatrixXd C_; //!< @brief coefficient matrix of x for measurement model y[k] = C * x[k] - Eigen::MatrixXd Q_; //!< @brief covariance matrix for process model x[k+1] = A*x[k] + B*u[k] - Eigen::MatrixXd R_; //!< @brief covariance matrix for measurement model y[k] = C * x[k] - Eigen::MatrixXd P_; //!< @brief covariance of estimated state -}; -} // namespace autoware::kalman_filter -#endif // AUTOWARE__KALMAN_FILTER__KALMAN_FILTER_HPP_ diff --git a/common/autoware_kalman_filter/include/autoware/kalman_filter/time_delay_kalman_filter.hpp b/common/autoware_kalman_filter/include/autoware/kalman_filter/time_delay_kalman_filter.hpp deleted file mode 100644 index 80375b7579e62..0000000000000 --- a/common/autoware_kalman_filter/include/autoware/kalman_filter/time_delay_kalman_filter.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2018-2019 Autoware Foundation -// -// 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. - -#ifndef AUTOWARE__KALMAN_FILTER__TIME_DELAY_KALMAN_FILTER_HPP_ -#define AUTOWARE__KALMAN_FILTER__TIME_DELAY_KALMAN_FILTER_HPP_ - -#include "autoware/kalman_filter/kalman_filter.hpp" - -#include -#include - -#include - -namespace autoware::kalman_filter -{ -/** - * @file time_delay_kalman_filter.h - * @brief kalman filter with delayed measurement class - * @author Takamasa Horibe - * @date 2019.05.01 - */ - -class TimeDelayKalmanFilter : public KalmanFilter -{ -public: - /** - * @brief No initialization constructor. - */ - TimeDelayKalmanFilter(); - - /** - * @brief initialization of kalman filter - * @param x initial state - * @param P0 initial covariance of estimated state - * @param max_delay_step Maximum number of delay steps, which determines the dimension of the - * extended kalman filter - */ - void init(const Eigen::MatrixXd & x, const Eigen::MatrixXd & P, const int max_delay_step); - - /** - * @brief get latest time estimated state - */ - Eigen::MatrixXd getLatestX() const; - - /** - * @brief get latest time estimation covariance - */ - Eigen::MatrixXd getLatestP() const; - - /** - * @brief calculate kalman filter covariance by precision model with time delay. This is mainly - * for EKF of nonlinear process model. - * @param x_next predicted state by prediction model - * @param A coefficient matrix of x for process model - * @param Q covariance matrix for process model - */ - bool predictWithDelay( - const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A, const Eigen::MatrixXd & Q); - - /** - * @brief calculate kalman filter covariance by measurement model with time delay. This is mainly - * for EKF of nonlinear process model. - * @param y measured values - * @param C coefficient matrix of x for measurement model - * @param R covariance matrix for measurement model - * @param delay_step measurement delay - */ - bool updateWithDelay( - const Eigen::MatrixXd & y, const Eigen::MatrixXd & C, const Eigen::MatrixXd & R, - const int delay_step); - -private: - int max_delay_step_; //!< @brief maximum number of delay steps - int dim_x_; //!< @brief dimension of latest state - int dim_x_ex_; //!< @brief dimension of extended state with dime delay -}; -} // namespace autoware::kalman_filter -#endif // AUTOWARE__KALMAN_FILTER__TIME_DELAY_KALMAN_FILTER_HPP_ diff --git a/common/autoware_kalman_filter/package.xml b/common/autoware_kalman_filter/package.xml deleted file mode 100644 index e51bb06e9de43..0000000000000 --- a/common/autoware_kalman_filter/package.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - autoware_kalman_filter - 0.40.0 - The kalman filter package - Yukihiro Saito - Takeshi Ishita - Koji Minoda - Apache License 2.0 - - Takamasa Horibe - - ament_cmake_auto - autoware_cmake - - eigen - eigen3_cmake_module - - ament_cmake_cppcheck - ament_cmake_ros - ament_lint_auto - autoware_lint_common - - - ament_cmake - - diff --git a/common/autoware_kalman_filter/src/kalman_filter.cpp b/common/autoware_kalman_filter/src/kalman_filter.cpp deleted file mode 100644 index bbd963675f9e2..0000000000000 --- a/common/autoware_kalman_filter/src/kalman_filter.cpp +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2018-2019 Autoware Foundation -// -// 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. - -#include "autoware/kalman_filter/kalman_filter.hpp" - -namespace autoware::kalman_filter -{ -KalmanFilter::KalmanFilter() -{ -} -KalmanFilter::KalmanFilter( - const Eigen::MatrixXd & x, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & C, const Eigen::MatrixXd & Q, const Eigen::MatrixXd & R, - const Eigen::MatrixXd & P) -{ - init(x, A, B, C, Q, R, P); -} -KalmanFilter::~KalmanFilter() -{ -} -bool KalmanFilter::init( - const Eigen::MatrixXd & x, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & C, const Eigen::MatrixXd & Q, const Eigen::MatrixXd & R, - const Eigen::MatrixXd & P) -{ - if ( - x.cols() == 0 || x.rows() == 0 || A.cols() == 0 || A.rows() == 0 || B.cols() == 0 || - B.rows() == 0 || C.cols() == 0 || C.rows() == 0 || Q.cols() == 0 || Q.rows() == 0 || - R.cols() == 0 || R.rows() == 0 || P.cols() == 0 || P.rows() == 0) { - return false; - } - x_ = x; - A_ = A; - B_ = B; - C_ = C; - Q_ = Q; - R_ = R; - P_ = P; - return true; -} -bool KalmanFilter::init(const Eigen::MatrixXd & x, const Eigen::MatrixXd & P0) -{ - if (x.cols() == 0 || x.rows() == 0 || P0.cols() == 0 || P0.rows() == 0) { - return false; - } - x_ = x; - P_ = P0; - return true; -} - -void KalmanFilter::setA(const Eigen::MatrixXd & A) -{ - A_ = A; -} -void KalmanFilter::setB(const Eigen::MatrixXd & B) -{ - B_ = B; -} -void KalmanFilter::setC(const Eigen::MatrixXd & C) -{ - C_ = C; -} -void KalmanFilter::setQ(const Eigen::MatrixXd & Q) -{ - Q_ = Q; -} -void KalmanFilter::setR(const Eigen::MatrixXd & R) -{ - R_ = R; -} -void KalmanFilter::getX(Eigen::MatrixXd & x) const -{ - x = x_; -} -void KalmanFilter::getP(Eigen::MatrixXd & P) const -{ - P = P_; -} -double KalmanFilter::getXelement(unsigned int i) const -{ - return x_(i); -} - -bool KalmanFilter::predict( - const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A, const Eigen::MatrixXd & Q) -{ - if ( - x_.rows() != x_next.rows() || A.cols() != P_.rows() || Q.cols() != Q.rows() || - A.rows() != Q.cols()) { - return false; - } - x_ = x_next; - P_ = A * P_ * A.transpose() + Q; - return true; -} -bool KalmanFilter::predict(const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A) -{ - return predict(x_next, A, Q_); -} - -bool KalmanFilter::predict( - const Eigen::MatrixXd & u, const Eigen::MatrixXd & A, const Eigen::MatrixXd & B, - const Eigen::MatrixXd & Q) -{ - if (A.cols() != x_.rows() || B.cols() != u.rows()) { - return false; - } - const Eigen::MatrixXd x_next = A * x_ + B * u; - return predict(x_next, A, Q); -} -bool KalmanFilter::predict(const Eigen::MatrixXd & u) -{ - return predict(u, A_, B_, Q_); -} - -bool KalmanFilter::update( - const Eigen::MatrixXd & y, const Eigen::MatrixXd & y_pred, const Eigen::MatrixXd & C, - const Eigen::MatrixXd & R) -{ - if ( - P_.cols() != C.cols() || R.rows() != R.cols() || R.rows() != C.rows() || - y.rows() != y_pred.rows() || y.rows() != C.rows()) { - return false; - } - const Eigen::MatrixXd PCT = P_ * C.transpose(); - const Eigen::MatrixXd K = PCT * ((R + C * PCT).inverse()); - - if (isnan(K.array()).any() || isinf(K.array()).any()) { - return false; - } - - x_ = x_ + K * (y - y_pred); - P_ = P_ - K * (C * P_); - return true; -} - -bool KalmanFilter::update( - const Eigen::MatrixXd & y, const Eigen::MatrixXd & C, const Eigen::MatrixXd & R) -{ - if (C.cols() != x_.rows()) { - return false; - } - const Eigen::MatrixXd y_pred = C * x_; - return update(y, y_pred, C, R); -} -bool KalmanFilter::update(const Eigen::MatrixXd & y) -{ - return update(y, C_, R_); -} -} // namespace autoware::kalman_filter diff --git a/common/autoware_kalman_filter/src/time_delay_kalman_filter.cpp b/common/autoware_kalman_filter/src/time_delay_kalman_filter.cpp deleted file mode 100644 index 4d1dd8f33b7a6..0000000000000 --- a/common/autoware_kalman_filter/src/time_delay_kalman_filter.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2018-2019 Autoware Foundation -// -// 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. - -#include "autoware/kalman_filter/time_delay_kalman_filter.hpp" - -#include - -namespace autoware::kalman_filter -{ -TimeDelayKalmanFilter::TimeDelayKalmanFilter() -{ -} - -void TimeDelayKalmanFilter::init( - const Eigen::MatrixXd & x, const Eigen::MatrixXd & P0, const int max_delay_step) -{ - max_delay_step_ = max_delay_step; - dim_x_ = x.rows(); - dim_x_ex_ = dim_x_ * max_delay_step; - - x_ = Eigen::MatrixXd::Zero(dim_x_ex_, 1); - P_ = Eigen::MatrixXd::Zero(dim_x_ex_, dim_x_ex_); - - for (int i = 0; i < max_delay_step_; ++i) { - x_.block(i * dim_x_, 0, dim_x_, 1) = x; - P_.block(i * dim_x_, i * dim_x_, dim_x_, dim_x_) = P0; - } -} - -Eigen::MatrixXd TimeDelayKalmanFilter::getLatestX() const -{ - return x_.block(0, 0, dim_x_, 1); -} - -Eigen::MatrixXd TimeDelayKalmanFilter::getLatestP() const -{ - return P_.block(0, 0, dim_x_, dim_x_); -} - -bool TimeDelayKalmanFilter::predictWithDelay( - const Eigen::MatrixXd & x_next, const Eigen::MatrixXd & A, const Eigen::MatrixXd & Q) -{ - /* - * time delay model: - * - * [A 0 0] [P11 P12 P13] [Q 0 0] - * A = [I 0 0], P = [P21 P22 P23], Q = [0 0 0] - * [0 I 0] [P31 P32 P33] [0 0 0] - * - * covariance calculation in prediction : P = A * P * A' + Q - * - * [A*P11*A'*+Q A*P11 A*P12] - * P = [ P11*A' P11 P12] - * [ P21*A' P21 P22] - */ - - const int d_dim_x = dim_x_ex_ - dim_x_; - - /* slide states in the time direction */ - Eigen::MatrixXd x_tmp = Eigen::MatrixXd::Zero(dim_x_ex_, 1); - x_tmp.block(0, 0, dim_x_, 1) = x_next; - x_tmp.block(dim_x_, 0, d_dim_x, 1) = x_.block(0, 0, d_dim_x, 1); - x_ = x_tmp; - - /* update P with delayed measurement A matrix structure */ - Eigen::MatrixXd P_tmp = Eigen::MatrixXd::Zero(dim_x_ex_, dim_x_ex_); - P_tmp.block(0, 0, dim_x_, dim_x_) = A * P_.block(0, 0, dim_x_, dim_x_) * A.transpose() + Q; - P_tmp.block(0, dim_x_, dim_x_, d_dim_x) = A * P_.block(0, 0, dim_x_, d_dim_x); - P_tmp.block(dim_x_, 0, d_dim_x, dim_x_) = P_.block(0, 0, d_dim_x, dim_x_) * A.transpose(); - P_tmp.block(dim_x_, dim_x_, d_dim_x, d_dim_x) = P_.block(0, 0, d_dim_x, d_dim_x); - P_ = P_tmp; - - return true; -} - -bool TimeDelayKalmanFilter::updateWithDelay( - const Eigen::MatrixXd & y, const Eigen::MatrixXd & C, const Eigen::MatrixXd & R, - const int delay_step) -{ - if (delay_step >= max_delay_step_) { - std::cerr << "delay step is larger than max_delay_step. ignore update." << std::endl; - return false; - } - - const int dim_y = y.rows(); - - /* set measurement matrix */ - Eigen::MatrixXd C_ex = Eigen::MatrixXd::Zero(dim_y, dim_x_ex_); - C_ex.block(0, dim_x_ * delay_step, dim_y, dim_x_) = C; - - /* update */ - if (!update(y, C_ex, R)) { - return false; - } - - return true; -} -} // namespace autoware::kalman_filter diff --git a/common/autoware_kalman_filter/test/test_kalman_filter.cpp b/common/autoware_kalman_filter/test/test_kalman_filter.cpp deleted file mode 100644 index 34e23ef9d06e2..0000000000000 --- a/common/autoware_kalman_filter/test/test_kalman_filter.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2023 The Autoware Foundation -// -// 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. - -#include "autoware/kalman_filter/kalman_filter.hpp" - -#include - -using autoware::kalman_filter::KalmanFilter; - -TEST(kalman_filter, kf) -{ - KalmanFilter kf_; - - Eigen::MatrixXd x_t(2, 1); - x_t << 1, 2; - - Eigen::MatrixXd P_t(2, 2); - P_t << 1, 0, 0, 1; - - Eigen::MatrixXd Q_t(2, 2); - Q_t << 0.01, 0, 0, 0.01; - - Eigen::MatrixXd R_t(2, 2); - R_t << 0.09, 0, 0, 0.09; - - Eigen::MatrixXd C_t(2, 2); - C_t << 1, 0, 0, 1; - - Eigen::MatrixXd A_t(2, 2); - A_t << 1, 0, 0, 1; - - Eigen::MatrixXd B_t(2, 2); - B_t << 1, 0, 0, 1; - - // Initialize the filter and check if initialization was successful - EXPECT_TRUE(kf_.init(x_t, A_t, B_t, C_t, Q_t, R_t, P_t)); - - // Perform prediction - Eigen::MatrixXd u_t(2, 1); - u_t << 0.1, 0.1; - EXPECT_TRUE(kf_.predict(u_t)); - - // Check the updated state and covariance matrix - Eigen::MatrixXd x_predict_expected = A_t * x_t + B_t * u_t; - Eigen::MatrixXd P_predict_expected = A_t * P_t * A_t.transpose() + Q_t; - - Eigen::MatrixXd x_predict; - kf_.getX(x_predict); - Eigen::MatrixXd P_predict; - kf_.getP(P_predict); - - EXPECT_NEAR(x_predict(0, 0), x_predict_expected(0, 0), 1e-5); - EXPECT_NEAR(x_predict(1, 0), x_predict_expected(1, 0), 1e-5); - EXPECT_NEAR(P_predict(0, 0), P_predict_expected(0, 0), 1e-5); - EXPECT_NEAR(P_predict(1, 1), P_predict_expected(1, 1), 1e-5); - - // Perform update - Eigen::MatrixXd y_t(2, 1); - y_t << 1.05, 2.05; - EXPECT_TRUE(kf_.update(y_t)); - - // Check the updated state and covariance matrix - const Eigen::MatrixXd PCT_t = P_predict_expected * C_t.transpose(); - const Eigen::MatrixXd K_t = PCT_t * ((R_t + C_t * PCT_t).inverse()); - const Eigen::MatrixXd y_pred = C_t * x_predict_expected; - Eigen::MatrixXd x_update_expected = x_predict_expected + K_t * (y_t - y_pred); - Eigen::MatrixXd P_update_expected = P_predict_expected - K_t * (C_t * P_predict_expected); - - Eigen::MatrixXd x_update; - kf_.getX(x_update); - Eigen::MatrixXd P_update; - kf_.getP(P_update); - - EXPECT_NEAR(x_update(0, 0), x_update_expected(0, 0), 1e-5); - EXPECT_NEAR(x_update(1, 0), x_update_expected(1, 0), 1e-5); - EXPECT_NEAR(P_update(0, 0), P_update_expected(0, 0), 1e-5); - EXPECT_NEAR(P_update(1, 1), P_update_expected(1, 1), 1e-5); -} - -int main(int argc, char * argv[]) -{ - testing::InitGoogleTest(&argc, argv); - bool result = RUN_ALL_TESTS(); - return result; -} diff --git a/common/autoware_kalman_filter/test/test_time_delay_kalman_filter.cpp b/common/autoware_kalman_filter/test/test_time_delay_kalman_filter.cpp deleted file mode 100644 index 50c22fae123bc..0000000000000 --- a/common/autoware_kalman_filter/test/test_time_delay_kalman_filter.cpp +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2023 The Autoware Foundation -// -// 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. - -#include "autoware/kalman_filter/time_delay_kalman_filter.hpp" - -#include - -using autoware::kalman_filter::TimeDelayKalmanFilter; - -TEST(time_delay_kalman_filter, td_kf) -{ - TimeDelayKalmanFilter td_kf_; - - Eigen::MatrixXd x_t(3, 1); - x_t << 1.0, 2.0, 3.0; - Eigen::MatrixXd P_t(3, 3); - P_t << 0.1, 0.0, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.3; - const int max_delay_step = 5; - const int dim_x = x_t.rows(); - const int dim_x_ex = dim_x * max_delay_step; - // Initialize the filter - td_kf_.init(x_t, P_t, max_delay_step); - - // Check if initialization was successful - Eigen::MatrixXd x_init = td_kf_.getLatestX(); - Eigen::MatrixXd P_init = td_kf_.getLatestP(); - Eigen::MatrixXd x_ex_t = Eigen::MatrixXd::Zero(dim_x_ex, 1); - Eigen::MatrixXd P_ex_t = Eigen::MatrixXd::Zero(dim_x_ex, dim_x_ex); - for (int i = 0; i < max_delay_step; ++i) { - x_ex_t.block(i * dim_x, 0, dim_x, 1) = x_t; - P_ex_t.block(i * dim_x, i * dim_x, dim_x, dim_x) = P_t; - } - - EXPECT_EQ(x_init.rows(), 3); - EXPECT_EQ(x_init.cols(), 1); - EXPECT_EQ(P_init.rows(), 3); - EXPECT_EQ(P_init.cols(), 3); - EXPECT_NEAR(x_init(0, 0), x_t(0, 0), 1e-5); - EXPECT_NEAR(x_init(1, 0), x_t(1, 0), 1e-5); - EXPECT_NEAR(x_init(2, 0), x_t(2, 0), 1e-5); - EXPECT_NEAR(P_init(0, 0), P_t(0, 0), 1e-5); - EXPECT_NEAR(P_init(1, 1), P_t(1, 1), 1e-5); - EXPECT_NEAR(P_init(2, 2), P_t(2, 2), 1e-5); - - // Define prediction parameters - Eigen::MatrixXd A_t(3, 3); - A_t << 2.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 2.0; - Eigen::MatrixXd Q_t(3, 3); - Q_t << 0.01, 0.0, 0.0, 0.0, 0.02, 0.0, 0.0, 0.0, 0.03; - Eigen::MatrixXd x_next(3, 1); - x_next << 2.0, 4.0, 6.0; - - // Perform prediction - EXPECT_TRUE(td_kf_.predictWithDelay(x_next, A_t, Q_t)); - - // Check the prediction state and covariance matrix - Eigen::MatrixXd x_predict = td_kf_.getLatestX(); - Eigen::MatrixXd P_predict = td_kf_.getLatestP(); - Eigen::MatrixXd x_tmp = Eigen::MatrixXd::Zero(dim_x_ex, 1); - x_tmp.block(0, 0, dim_x, 1) = A_t * x_t; - x_tmp.block(dim_x, 0, dim_x_ex - dim_x, 1) = x_ex_t.block(0, 0, dim_x_ex - dim_x, 1); - x_ex_t = x_tmp; - Eigen::MatrixXd x_predict_expected = x_ex_t.block(0, 0, dim_x, 1); - Eigen::MatrixXd P_tmp = Eigen::MatrixXd::Zero(dim_x_ex, dim_x_ex); - P_tmp.block(0, 0, dim_x, dim_x) = A_t * P_ex_t.block(0, 0, dim_x, dim_x) * A_t.transpose() + Q_t; - P_tmp.block(0, dim_x, dim_x, dim_x_ex - dim_x) = - A_t * P_ex_t.block(0, 0, dim_x, dim_x_ex - dim_x); - P_tmp.block(dim_x, 0, dim_x_ex - dim_x, dim_x) = - P_ex_t.block(0, 0, dim_x_ex - dim_x, dim_x) * A_t.transpose(); - P_tmp.block(dim_x, dim_x, dim_x_ex - dim_x, dim_x_ex - dim_x) = - P_ex_t.block(0, 0, dim_x_ex - dim_x, dim_x_ex - dim_x); - P_ex_t = P_tmp; - Eigen::MatrixXd P_predict_expected = P_ex_t.block(0, 0, dim_x, dim_x); - EXPECT_NEAR(x_predict(0, 0), x_predict_expected(0, 0), 1e-5); - EXPECT_NEAR(x_predict(1, 0), x_predict_expected(1, 0), 1e-5); - EXPECT_NEAR(x_predict(2, 0), x_predict_expected(2, 0), 1e-5); - EXPECT_NEAR(P_predict(0, 0), P_predict_expected(0, 0), 1e-5); - EXPECT_NEAR(P_predict(1, 1), P_predict_expected(1, 1), 1e-5); - EXPECT_NEAR(P_predict(2, 2), P_predict_expected(2, 2), 1e-5); - - // Define update parameters - Eigen::MatrixXd C_t(3, 3); - C_t << 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5; - Eigen::MatrixXd R_t(3, 3); - R_t << 0.001, 0.0, 0.0, 0.0, 0.002, 0.0, 0.0, 0.0, 0.003; - Eigen::MatrixXd y_t(3, 1); - y_t << 1.05, 2.05, 3.05; - const int delay_step = 2; // Choose an appropriate delay step - const int dim_y = y_t.rows(); - - // Perform update - EXPECT_TRUE(td_kf_.updateWithDelay(y_t, C_t, R_t, delay_step)); - - // Check the updated state and covariance matrix - Eigen::MatrixXd x_update = td_kf_.getLatestX(); - Eigen::MatrixXd P_update = td_kf_.getLatestP(); - - Eigen::MatrixXd C_ex_t = Eigen::MatrixXd::Zero(dim_y, dim_x_ex); - const Eigen::MatrixXd PCT_t = P_ex_t * C_ex_t.transpose(); - const Eigen::MatrixXd K_t = PCT_t * ((R_t + C_ex_t * PCT_t).inverse()); - const Eigen::MatrixXd y_pred = C_ex_t * x_ex_t; - x_ex_t = x_ex_t + K_t * (y_t - y_pred); - P_ex_t = P_ex_t - K_t * (C_ex_t * P_ex_t); - Eigen::MatrixXd x_update_expected = x_ex_t.block(0, 0, dim_x, 1); - Eigen::MatrixXd P_update_expected = P_ex_t.block(0, 0, dim_x, dim_x); - EXPECT_NEAR(x_update(0, 0), x_update_expected(0, 0), 1e-5); - EXPECT_NEAR(x_update(1, 0), x_update_expected(1, 0), 1e-5); - EXPECT_NEAR(x_update(2, 0), x_update_expected(2, 0), 1e-5); - EXPECT_NEAR(P_update(0, 0), P_update_expected(0, 0), 1e-5); - EXPECT_NEAR(P_update(1, 1), P_update_expected(1, 1), 1e-5); - EXPECT_NEAR(P_update(2, 2), P_update_expected(2, 2), 1e-5); -} From 7f496888b6ef10eb5ee9e9897505220d92415164 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:18:06 +0900 Subject: [PATCH 092/127] feat(autoware_costmap_generator): tier4_debug_msgs changed to autoware_internal-debug_msgs in autoware_costmap_generator (#9901) feat: tier4_debug_msgs changed to autoware_internal-debug_msgs in files planning/autoware_costmap_generator Signed-off-by: vish0012 --- .../autoware/costmap_generator/costmap_generator.hpp | 5 +++-- .../autoware_costmap_generator/src/costmap_generator.cpp | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/planning/autoware_costmap_generator/include/autoware/costmap_generator/costmap_generator.hpp b/planning/autoware_costmap_generator/include/autoware/costmap_generator/costmap_generator.hpp index 4fed5bcb6cff3..b6749117a6177 100644 --- a/planning/autoware_costmap_generator/include/autoware/costmap_generator/costmap_generator.hpp +++ b/planning/autoware_costmap_generator/include/autoware/costmap_generator/costmap_generator.hpp @@ -58,10 +58,10 @@ #include #include +#include #include #include #include -#include #include #include @@ -99,7 +99,8 @@ class CostmapGenerator : public rclcpp::Node rclcpp::Publisher::SharedPtr pub_costmap_; rclcpp::Publisher::SharedPtr pub_occupancy_grid_; rclcpp::Publisher::SharedPtr pub_processing_time_; - rclcpp::Publisher::SharedPtr pub_processing_time_ms_; + rclcpp::Publisher::SharedPtr + pub_processing_time_ms_; rclcpp::Subscription::SharedPtr sub_lanelet_bin_map_; autoware::universe_utils::InterProcessPollingSubscriber diff --git a/planning/autoware_costmap_generator/src/costmap_generator.cpp b/planning/autoware_costmap_generator/src/costmap_generator.cpp index 081a6ead91cda..70b8051bcdc12 100644 --- a/planning/autoware_costmap_generator/src/costmap_generator.cpp +++ b/planning/autoware_costmap_generator/src/costmap_generator.cpp @@ -176,7 +176,8 @@ CostmapGenerator::CostmapGenerator(const rclcpp::NodeOptions & node_options) create_publisher("processing_time", 1); time_keeper_ = std::make_shared(pub_processing_time_); pub_processing_time_ms_ = - this->create_publisher("~/debug/processing_time_ms", 1); + this->create_publisher( + "~/debug/processing_time_ms", 1); // Timer const auto period_ns = rclcpp::Rate(param_->update_rate).period(); @@ -269,7 +270,7 @@ void CostmapGenerator::onTimer() if (!isActive()) { // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); pub_processing_time_ms_->publish(processing_time_msg); @@ -485,7 +486,7 @@ void CostmapGenerator::publishCostmap( pub_costmap_->publish(*out_gridmap_msg); // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); pub_processing_time_ms_->publish(processing_time_msg); From 9a2ebcc9f1f55f3aa28ad46a6d0b825f52e45cea Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:21:18 +0900 Subject: [PATCH 093/127] feat(autoware_surround_obstacle_checker): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_surround_obstacle_checker (#9915) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files planning/autoware_surround_obstacle_checker Signed-off-by: vish0012 --- planning/autoware_surround_obstacle_checker/src/node.cpp | 6 +++--- planning/autoware_surround_obstacle_checker/src/node.hpp | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/planning/autoware_surround_obstacle_checker/src/node.cpp b/planning/autoware_surround_obstacle_checker/src/node.cpp index 0adca312ca733..b3881a8f4fbd9 100644 --- a/planning/autoware_surround_obstacle_checker/src/node.cpp +++ b/planning/autoware_surround_obstacle_checker/src/node.cpp @@ -81,8 +81,8 @@ SurroundObstacleCheckerNode::SurroundObstacleCheckerNode(const rclcpp::NodeOptio "~/output/velocity_limit_clear_command", rclcpp::QoS{1}.transient_local()); pub_velocity_limit_ = this->create_publisher( "~/output/max_velocity", rclcpp::QoS{1}.transient_local()); - pub_processing_time_ = - this->create_publisher("~/debug/processing_time_ms", 1); + pub_processing_time_ = this->create_publisher( + "~/debug/processing_time_ms", 1); using std::chrono_literals::operator""ms; timer_ = rclcpp::create_timer( @@ -231,7 +231,7 @@ void SurroundObstacleCheckerNode::onTimer() debug_ptr_->pushPose(odometry_ptr_->pose.pose, PoseType::NoStart); } - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); pub_processing_time_->publish(processing_time_msg); diff --git a/planning/autoware_surround_obstacle_checker/src/node.hpp b/planning/autoware_surround_obstacle_checker/src/node.hpp index f84ad3a8f5987..b6d6bffefed1a 100644 --- a/planning/autoware_surround_obstacle_checker/src/node.hpp +++ b/planning/autoware_surround_obstacle_checker/src/node.hpp @@ -24,12 +24,12 @@ #include #include +#include #include #include #include #include #include -#include #include #include #include @@ -106,7 +106,8 @@ class SurroundObstacleCheckerNode : public rclcpp::Node this, "~/input/objects"}; rclcpp::Publisher::SharedPtr pub_clear_velocity_limit_; rclcpp::Publisher::SharedPtr pub_velocity_limit_; - rclcpp::Publisher::SharedPtr pub_processing_time_; + rclcpp::Publisher::SharedPtr + pub_processing_time_; // parameter callback result OnSetParametersCallbackHandle::SharedPtr set_param_res_; From 2028af955d261cc3dfd4836f7501b60a5e030a59 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:23:07 +0900 Subject: [PATCH 094/127] feat(autoware_freespace_planner): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_freespace_planner (#9903) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in flies planning/autoware_freespace_planner Signed-off-by: vish0012 --- .../autoware/freespace_planner/freespace_planner_node.hpp | 5 +++-- .../autoware_freespace_planner/freespace_planner_node.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/planning/autoware_freespace_planner/include/autoware/freespace_planner/freespace_planner_node.hpp b/planning/autoware_freespace_planner/include/autoware/freespace_planner/freespace_planner_node.hpp index 1f5a52ca040a0..bd431372b70dc 100644 --- a/planning/autoware_freespace_planner/include/autoware/freespace_planner/freespace_planner_node.hpp +++ b/planning/autoware_freespace_planner/include/autoware/freespace_planner/freespace_planner_node.hpp @@ -39,13 +39,13 @@ #include #include +#include #include #include #include #include #include #include -#include #include #ifdef ROS_DISTRO_GALACTIC @@ -112,7 +112,8 @@ class FreespacePlannerNode : public rclcpp::Node rclcpp::Publisher::SharedPtr debug_pose_array_pub_; rclcpp::Publisher::SharedPtr debug_partial_pose_array_pub_; rclcpp::Publisher::SharedPtr parking_state_pub_; - rclcpp::Publisher::SharedPtr processing_time_pub_; + rclcpp::Publisher::SharedPtr + processing_time_pub_; rclcpp::Subscription::SharedPtr route_sub_; diff --git a/planning/autoware_freespace_planner/src/autoware_freespace_planner/freespace_planner_node.cpp b/planning/autoware_freespace_planner/src/autoware_freespace_planner/freespace_planner_node.cpp index a937114e653c6..2749408bedb7b 100644 --- a/planning/autoware_freespace_planner/src/autoware_freespace_planner/freespace_planner_node.cpp +++ b/planning/autoware_freespace_planner/src/autoware_freespace_planner/freespace_planner_node.cpp @@ -95,8 +95,8 @@ FreespacePlannerNode::FreespacePlannerNode(const rclcpp::NodeOptions & node_opti debug_pose_array_pub_ = create_publisher("~/debug/pose_array", qos); debug_partial_pose_array_pub_ = create_publisher("~/debug/partial_pose_array", qos); parking_state_pub_ = create_publisher("is_completed", qos); - processing_time_pub_ = - create_publisher("~/debug/processing_time_ms", 1); + processing_time_pub_ = create_publisher( + "~/debug/processing_time_ms", 1); } // TF @@ -362,7 +362,7 @@ void FreespacePlannerNode::onTimer() is_new_parking_cycle_ = false; // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); processing_time_pub_->publish(processing_time_msg); From e96b361fc3d6f49bc4b097ca402ffbd3b590bb89 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:24:36 +0900 Subject: [PATCH 095/127] feat(autoware_scenario_selector): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_scenario_selector (#9914) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files planning/autoware_scenario_selector Signed-off-by: vish0012 --- .../include/autoware/scenario_selector/node.hpp | 5 +++-- planning/autoware_scenario_selector/src/node.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/planning/autoware_scenario_selector/include/autoware/scenario_selector/node.hpp b/planning/autoware_scenario_selector/include/autoware/scenario_selector/node.hpp index 244876ee2cb22..7e215fcfef8dd 100644 --- a/planning/autoware_scenario_selector/include/autoware/scenario_selector/node.hpp +++ b/planning/autoware_scenario_selector/include/autoware/scenario_selector/node.hpp @@ -19,13 +19,13 @@ #include #include +#include #include #include #include #include #include #include -#include #include #include @@ -97,7 +97,8 @@ class ScenarioSelectorNode : public rclcpp::Node rclcpp::Subscription::SharedPtr sub_parking_trajectory_; rclcpp::Publisher::SharedPtr pub_trajectory_; rclcpp::Publisher::SharedPtr pub_scenario_; - rclcpp::Publisher::SharedPtr pub_processing_time_; + rclcpp::Publisher::SharedPtr + pub_processing_time_; // polling subscribers universe_utils::InterProcessPollingSubscriber< diff --git a/planning/autoware_scenario_selector/src/node.cpp b/planning/autoware_scenario_selector/src/node.cpp index defbde4f6aabc..91e86bfea6dba 100644 --- a/planning/autoware_scenario_selector/src/node.cpp +++ b/planning/autoware_scenario_selector/src/node.cpp @@ -390,7 +390,7 @@ void ScenarioSelectorNode::onTimer() pub_scenario_->publish(scenario); // Publish ProcessingTime - tier4_debug_msgs::msg::Float64Stamped processing_time_msg; + autoware_internal_debug_msgs::msg::Float64Stamped processing_time_msg; processing_time_msg.stamp = get_clock()->now(); processing_time_msg.data = stop_watch.toc(); pub_processing_time_->publish(processing_time_msg); @@ -490,8 +490,8 @@ ScenarioSelectorNode::ScenarioSelectorNode(const rclcpp::NodeOptions & node_opti this, get_clock(), period_ns, std::bind(&ScenarioSelectorNode::onTimer, this)); published_time_publisher_ = std::make_unique(this); - pub_processing_time_ = - this->create_publisher("~/debug/processing_time_ms", 1); + pub_processing_time_ = this->create_publisher( + "~/debug/processing_time_ms", 1); } } // namespace autoware::scenario_selector From 9b8b3fc3280a678ea0205009339c587b5febf096 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:44:22 +0900 Subject: [PATCH 096/127] =?UTF-8?q?feat(autoware=5Foccupancy=5Fgrid=5Fmap?= =?UTF-8?q?=5Foutlier=5Ffilter):=20tier4=5Fdebug=5Fmsgs=20changed=20to=20a?= =?UTF-8?q?utoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6=20(#9894)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_occupancy_grid_map_outlier_filter Signed-off-by: vish0012 Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> --- .../src/occupancy_grid_map_outlier_filter_node.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perception/autoware_occupancy_grid_map_outlier_filter/src/occupancy_grid_map_outlier_filter_node.cpp b/perception/autoware_occupancy_grid_map_outlier_filter/src/occupancy_grid_map_outlier_filter_node.cpp index eb52b903b90ca..094825056e62c 100644 --- a/perception/autoware_occupancy_grid_map_outlier_filter/src/occupancy_grid_map_outlier_filter_node.cpp +++ b/perception/autoware_occupancy_grid_map_outlier_filter/src/occupancy_grid_map_outlier_filter_node.cpp @@ -420,9 +420,9 @@ void OccupancyGridMapOutlierFilterComponent::onOccupancyGridMapAndPointCloud2( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } From b7ce209a911eac03593240b8b42676b688991626 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:47:29 +0900 Subject: [PATCH 097/127] =?UTF-8?q?feat(autoware=5Flidar=5Fapollo=5Finstan?= =?UTF-8?q?ce=5Fsegmentation):=20tier4=5Fdebug=5Fmsgs=20to=20autoware=5Fin?= =?UTF-8?q?ternal=5Fdebug=5Fmsgs=20in=20files=20perce=E2=80=A6=20(#9876)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs to autoware_internal_debug_msgs in files perception/autoware_lidar_apollo_instance_segmentation Signed-off-by: vish0012 Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> --- .../CMakeLists.txt | 4 ++-- .../autoware_lidar_apollo_instance_segmentation/package.xml | 2 +- .../autoware_lidar_apollo_instance_segmentation/src/node.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/perception/autoware_lidar_apollo_instance_segmentation/CMakeLists.txt b/perception/autoware_lidar_apollo_instance_segmentation/CMakeLists.txt index 16ab7ecccae60..0555cedc235d9 100644 --- a/perception/autoware_lidar_apollo_instance_segmentation/CMakeLists.txt +++ b/perception/autoware_lidar_apollo_instance_segmentation/CMakeLists.txt @@ -9,7 +9,7 @@ find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(tf2_eigen REQUIRED) find_package(autoware_universe_utils REQUIRED) -find_package(tier4_debug_msgs REQUIRED) +find_package(autoware_internal_debug_msgs REQUIRED) find_package(tier4_perception_msgs REQUIRED) find_package(autoware_tensorrt_common) @@ -50,7 +50,7 @@ target_link_libraries(${PROJECT_NAME} rclcpp_components::component tf2_eigen::tf2_eigen ${autoware_tensorrt_common_TARGETS} - ${tier4_debug_msgs_TARGETS} + ${autoware_internal_debug_msgs_TARGETS} ${tier4_perception_msgs_TARGETS} ) diff --git a/perception/autoware_lidar_apollo_instance_segmentation/package.xml b/perception/autoware_lidar_apollo_instance_segmentation/package.xml index 8a3d5a7ea6f76..8ff7ce77d943d 100755 --- a/perception/autoware_lidar_apollo_instance_segmentation/package.xml +++ b/perception/autoware_lidar_apollo_instance_segmentation/package.xml @@ -14,6 +14,7 @@ ament_cmake autoware_cuda_utils + autoware_internal_debug_msgs autoware_perception_msgs autoware_tensorrt_common autoware_universe_utils @@ -22,7 +23,6 @@ rclcpp rclcpp_components tf2_eigen - tier4_debug_msgs tier4_perception_msgs ament_lint_auto diff --git a/perception/autoware_lidar_apollo_instance_segmentation/src/node.cpp b/perception/autoware_lidar_apollo_instance_segmentation/src/node.cpp index 9a3e13b81120f..c535fc6762e1f 100644 --- a/perception/autoware_lidar_apollo_instance_segmentation/src/node.cpp +++ b/perception/autoware_lidar_apollo_instance_segmentation/src/node.cpp @@ -62,9 +62,9 @@ void LidarInstanceSegmentationNode::pointCloudCallback( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } From acaa40c95a109e21687fe7f2e7f4b37f2ebb1d6b Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:50:03 +0900 Subject: [PATCH 098/127] =?UTF-8?q?feat(autoware=5Fground=5Fsegmentation):?= =?UTF-8?q?=20tier4=5Fdebug=5Fmsgs=20changed=20to=20autoware=5Finternal=5F?= =?UTF-8?q?debug=5Fmsgs=20in=20fil=E2=80=A6=20(#9878)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_ground_segmentation Signed-off-by: vish0012 --- .../src/scan_ground_filter/node.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perception/autoware_ground_segmentation/src/scan_ground_filter/node.cpp b/perception/autoware_ground_segmentation/src/scan_ground_filter/node.cpp index 74b4edbe595ea..8fda0c1395caf 100644 --- a/perception/autoware_ground_segmentation/src/scan_ground_filter/node.cpp +++ b/perception/autoware_ground_segmentation/src/scan_ground_filter/node.cpp @@ -369,9 +369,9 @@ void ScanGroundFilterComponent::faster_filter( if (debug_publisher_ptr_ && stop_watch_ptr_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/processing_time_ms", processing_time_ms); } } From b65e042ebd1df00a09d6a47648dfb07df3e0f68a Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:50:22 +0900 Subject: [PATCH 099/127] feat(autoware_image_diagnostics): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_image_diagnostics (#9918) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files sensing/autoware_image_diagnostics Signed-off-by: vish0012 --- sensing/autoware_image_diagnostics/README.md | 14 +++++++------- sensing/autoware_image_diagnostics/package.xml | 2 +- .../src/image_diagnostics_node.cpp | 4 ++-- .../src/image_diagnostics_node.hpp | 11 ++++++----- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/sensing/autoware_image_diagnostics/README.md b/sensing/autoware_image_diagnostics/README.md index 03858088564b3..42fcbdc8dc612 100644 --- a/sensing/autoware_image_diagnostics/README.md +++ b/sensing/autoware_image_diagnostics/README.md @@ -28,13 +28,13 @@ After all image's blocks state are evaluated, the whole image status is summariz ### Output -| Name | Type | Description | -| ----------------------------------- | --------------------------------------- | ------------------------------------- | -| `image_diag/debug/gray_image` | `sensor_msgs::msg::Image` | gray image | -| `image_diag/debug/dft_image` | `sensor_msgs::msg::Image` | discrete Fourier transformation image | -| `image_diag/debug/diag_block_image` | `sensor_msgs::msg::Image` | each block state colorization | -| `image_diag/image_state_diag` | `tier4_debug_msgs::msg::Int32Stamped` | image diagnostics status value | -| `/diagnostics` | `diagnostic_msgs::msg::DiagnosticArray` | diagnostics | +| Name | Type | Description | +| ----------------------------------- | ------------------------------------------------- | ------------------------------------- | +| `image_diag/debug/gray_image` | `sensor_msgs::msg::Image` | gray image | +| `image_diag/debug/dft_image` | `sensor_msgs::msg::Image` | discrete Fourier transformation image | +| `image_diag/debug/diag_block_image` | `sensor_msgs::msg::Image` | each block state colorization | +| `image_diag/image_state_diag` | `autoware_internal_debug_msgs::msg::Int32Stamped` | image diagnostics status value | +| `/diagnostics` | `diagnostic_msgs::msg::DiagnosticArray` | diagnostics | ## Parameters diff --git a/sensing/autoware_image_diagnostics/package.xml b/sensing/autoware_image_diagnostics/package.xml index 2e4556de2b92b..3140b87e1f1b9 100644 --- a/sensing/autoware_image_diagnostics/package.xml +++ b/sensing/autoware_image_diagnostics/package.xml @@ -12,6 +12,7 @@ ament_cmake_auto + autoware_internal_debug_msgs autoware_universe_utils cv_bridge diagnostic_updater @@ -19,7 +20,6 @@ rclcpp rclcpp_components sensor_msgs - tier4_debug_msgs ament_lint_auto autoware_lint_common diff --git a/sensing/autoware_image_diagnostics/src/image_diagnostics_node.cpp b/sensing/autoware_image_diagnostics/src/image_diagnostics_node.cpp index 1625cba5b72aa..57e53aee46328 100644 --- a/sensing/autoware_image_diagnostics/src/image_diagnostics_node.cpp +++ b/sensing/autoware_image_diagnostics/src/image_diagnostics_node.cpp @@ -33,7 +33,7 @@ ImageDiagNode::ImageDiagNode(const rclcpp::NodeOptions & node_options) dft_image_pub_ = image_transport::create_publisher(this, "image_diag/debug/dft_image"); gray_image_pub_ = image_transport::create_publisher(this, "image_diag/debug/gray_image"); - image_state_pub_ = create_publisher( + image_state_pub_ = create_publisher( "image_diag/image_state_diag", rclcpp::SensorDataQoS()); updater_.setHardwareID("Image_Diagnostics"); @@ -225,7 +225,7 @@ void ImageDiagNode::ImageChecker(const sensor_msgs::msg::Image::ConstSharedPtr i } else { params_.diagnostic_status = 0; } - tier4_debug_msgs::msg::Int32Stamped image_state_out; + autoware_internal_debug_msgs::msg::Int32Stamped image_state_out; image_state_out.data = params_.diagnostic_status; image_state_pub_->publish(image_state_out); diff --git a/sensing/autoware_image_diagnostics/src/image_diagnostics_node.hpp b/sensing/autoware_image_diagnostics/src/image_diagnostics_node.hpp index 325624062b90b..9383da33160f9 100644 --- a/sensing/autoware_image_diagnostics/src/image_diagnostics_node.hpp +++ b/sensing/autoware_image_diagnostics/src/image_diagnostics_node.hpp @@ -21,10 +21,10 @@ #include #include +#include +#include +#include #include -#include -#include -#include #if __has_include() #include @@ -95,8 +95,9 @@ class ImageDiagNode : public rclcpp::Node image_transport::Publisher block_diag_image_pub_; image_transport::Publisher dft_image_pub_; image_transport::Publisher gray_image_pub_; - rclcpp::Publisher::SharedPtr average_pub_; - rclcpp::Publisher::SharedPtr image_state_pub_; + rclcpp::Publisher::SharedPtr + average_pub_; + rclcpp::Publisher::SharedPtr image_state_pub_; }; } // namespace autoware::image_diagnostics From 221a7bc0eb333f27638d5bdc5a9d7ecc4fd79be0 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:50:56 +0900 Subject: [PATCH 100/127] =?UTF-8?q?feat(autoware=5Fcompare=5Fmap=5Fsegment?= =?UTF-8?q?ation):=20tier4=5Fdebug=5Fmsgs=20changed=20to=20autoware=5Finte?= =?UTF-8?q?rnal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6=20(#9869)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_compare_map_segmentation Signed-off-by: vish0012 Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> --- .../src/distance_based_compare_map_filter/node.cpp | 4 ++-- .../src/voxel_based_approximate_compare_map_filter/node.cpp | 4 ++-- .../src/voxel_based_compare_map_filter/node.cpp | 4 ++-- .../src/voxel_distance_based_compare_map_filter/node.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/perception/autoware_compare_map_segmentation/src/distance_based_compare_map_filter/node.cpp b/perception/autoware_compare_map_segmentation/src/distance_based_compare_map_filter/node.cpp index ae07d54ad53d6..ac759504de557 100644 --- a/perception/autoware_compare_map_segmentation/src/distance_based_compare_map_filter/node.cpp +++ b/perception/autoware_compare_map_segmentation/src/distance_based_compare_map_filter/node.cpp @@ -173,9 +173,9 @@ void DistanceBasedCompareMapFilterComponent::filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } diff --git a/perception/autoware_compare_map_segmentation/src/voxel_based_approximate_compare_map_filter/node.cpp b/perception/autoware_compare_map_segmentation/src/voxel_based_approximate_compare_map_filter/node.cpp index 9f325b36676be..5794cfe37a45b 100644 --- a/perception/autoware_compare_map_segmentation/src/voxel_based_approximate_compare_map_filter/node.cpp +++ b/perception/autoware_compare_map_segmentation/src/voxel_based_approximate_compare_map_filter/node.cpp @@ -141,9 +141,9 @@ void VoxelBasedApproximateCompareMapFilterComponent::filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } diff --git a/perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.cpp b/perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.cpp index a31d5ec5dd6d6..db5e46a0eff5a 100644 --- a/perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.cpp +++ b/perception/autoware_compare_map_segmentation/src/voxel_based_compare_map_filter/node.cpp @@ -100,9 +100,9 @@ void VoxelBasedCompareMapFilterComponent::filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } diff --git a/perception/autoware_compare_map_segmentation/src/voxel_distance_based_compare_map_filter/node.cpp b/perception/autoware_compare_map_segmentation/src/voxel_distance_based_compare_map_filter/node.cpp index d0bcf381cd62f..775a931ac4c4c 100644 --- a/perception/autoware_compare_map_segmentation/src/voxel_distance_based_compare_map_filter/node.cpp +++ b/perception/autoware_compare_map_segmentation/src/voxel_distance_based_compare_map_filter/node.cpp @@ -173,9 +173,9 @@ void VoxelDistanceBasedCompareMapFilterComponent::filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } From cee6ef912154312c3a4e6eff3ee04013cb9d7175 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:54:14 +0900 Subject: [PATCH 101/127] feat(autoware_probabilistic_occupancy_grid_map): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_probabilistic_occupancy_grid_map (#9895) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_probabilistic_occupancy_grid_map Signed-off-by: vish0012 Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> --- .../src/fusion/synchronized_grid_map_fusion_node.cpp | 6 +++--- .../pointcloud_based_occupancy_grid_map_node.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/perception/autoware_probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp b/perception/autoware_probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp index 880dfda03c495..7cde04ca9614b 100644 --- a/perception/autoware_probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp +++ b/perception/autoware_probabilistic_occupancy_grid_map/src/fusion/synchronized_grid_map_fusion_node.cpp @@ -332,11 +332,11 @@ void GridMapFusionNode::publish() std::chrono::duration( std::chrono::nanoseconds((this->get_clock()->now() - latest_stamp).nanoseconds())) .count(); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/processing_time_ms", processing_time_ms); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } } diff --git a/perception/autoware_probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.cpp b/perception/autoware_probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.cpp index 4d442ad2c33db..ff836a1ddf760 100644 --- a/perception/autoware_probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.cpp +++ b/perception/autoware_probabilistic_occupancy_grid_map/src/pointcloud_based_occupancy_grid_map/pointcloud_based_occupancy_grid_map_node.cpp @@ -261,11 +261,11 @@ void PointcloudBasedOccupancyGridMapNode::onPointcloudWithObstacleAndRaw( std::chrono::nanoseconds( (this->get_clock()->now() - input_raw_msg->header.stamp).nanoseconds())) .count(); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/processing_time_ms", processing_time_ms); - debug_publisher_ptr_->publish( + debug_publisher_ptr_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } } From 95e7939e7e3b6164913ce5b5119247de94a89ac8 Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:06:17 +0900 Subject: [PATCH 102/127] feat(autoware_pointcloud_preprocessor): tier4_debug_msgs changed to autoware_internal_debug_msgs in autoware_pointcloud_preprocessor (#9920) feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files sensing/autoware_pointcloud_preprocessor Signed-off-by: vish0012 --- .../docs/blockage-diag.md | 20 +++++++++---------- .../docs/dual-return-outlier-filter.md | 10 +++++----- .../blockage_diag/blockage_diag_node.hpp | 13 +++++++----- .../concatenate_and_time_sync_nodelet.hpp | 4 ++-- .../concatenate_pointclouds.hpp | 4 ++-- .../dual_return_outlier_filter_node.hpp | 4 ++-- .../ring_outlier_filter_node.hpp | 2 +- .../time_synchronizer_node.hpp | 4 ++-- .../package.xml | 2 +- .../src/blockage_diag/blockage_diag_node.cpp | 12 +++++------ .../concatenate_and_time_sync_nodelet.cpp | 6 +++--- .../concatenate_pointclouds.cpp | 6 +++--- .../crop_box_filter/crop_box_filter_node.cpp | 6 +++--- .../distortion_corrector_node.cpp | 6 +++--- ...ased_voxel_grid_downsample_filter_node.cpp | 6 +++--- .../dual_return_outlier_filter_node.cpp | 4 ++-- .../ring_outlier_filter_node.cpp | 10 +++++----- .../time_synchronizer_node.cpp | 6 +++--- 18 files changed, 64 insertions(+), 61 deletions(-) diff --git a/sensing/autoware_pointcloud_preprocessor/docs/blockage-diag.md b/sensing/autoware_pointcloud_preprocessor/docs/blockage-diag.md index 911cda3823021..a9dcb8437ec67 100644 --- a/sensing/autoware_pointcloud_preprocessor/docs/blockage-diag.md +++ b/sensing/autoware_pointcloud_preprocessor/docs/blockage-diag.md @@ -38,16 +38,16 @@ This implementation inherits `autoware::pointcloud_preprocessor::Filter` class, ### Output -| Name | Type | Description | -| :-------------------------------------------------------- | :-------------------------------------- | ------------------------------------------------------------------------------------------------ | -| `~/output/blockage_diag/debug/blockage_mask_image` | `sensor_msgs::msg::Image` | The mask image of detected blockage | -| `~/output/blockage_diag/debug/ground_blockage_ratio` | `tier4_debug_msgs::msg::Float32Stamped` | The area ratio of blockage region in ground region | -| `~/output/blockage_diag/debug/sky_blockage_ratio` | `tier4_debug_msgs::msg::Float32Stamped` | The area ratio of blockage region in sky region | -| `~/output/blockage_diag/debug/lidar_depth_map` | `sensor_msgs::msg::Image` | The depth map image of input point cloud | -| `~/output/blockage_diag/debug/single_frame_dust_mask` | `sensor_msgs::msg::Image` | The mask image of detected dusty area in latest single frame | -| `~/output/blockage_diag/debug/multi_frame_dust_mask` | `sensor_msgs::msg::Image` | The mask image of continuous detected dusty area | -| `~/output/blockage_diag/debug/blockage_dust_merged_image` | `sensor_msgs::msg::Image` | The merged image of blockage detection(red) and multi frame dusty area detection(yellow) results | -| `~/output/blockage_diag/debug/ground_dust_ratio` | `tier4_debug_msgs::msg::Float32Stamped` | The ratio of dusty area divided by area where ray usually returns from the ground. | +| Name | Type | Description | +| :-------------------------------------------------------- | :-------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| `~/output/blockage_diag/debug/blockage_mask_image` | `sensor_msgs::msg::Image` | The mask image of detected blockage | +| `~/output/blockage_diag/debug/ground_blockage_ratio` | `autoware_internal_debug_msgs::msg::Float32Stamped` | The area ratio of blockage region in ground region | +| `~/output/blockage_diag/debug/sky_blockage_ratio` | `autoware_internal_debug_msgs::msg::Float32Stamped` | The area ratio of blockage region in sky region | +| `~/output/blockage_diag/debug/lidar_depth_map` | `sensor_msgs::msg::Image` | The depth map image of input point cloud | +| `~/output/blockage_diag/debug/single_frame_dust_mask` | `sensor_msgs::msg::Image` | The mask image of detected dusty area in latest single frame | +| `~/output/blockage_diag/debug/multi_frame_dust_mask` | `sensor_msgs::msg::Image` | The mask image of continuous detected dusty area | +| `~/output/blockage_diag/debug/blockage_dust_merged_image` | `sensor_msgs::msg::Image` | The merged image of blockage detection(red) and multi frame dusty area detection(yellow) results | +| `~/output/blockage_diag/debug/ground_dust_ratio` | `autoware_internal_debug_msgs::msg::Float32Stamped` | The ratio of dusty area divided by area where ray usually returns from the ground. | ## Parameters diff --git a/sensing/autoware_pointcloud_preprocessor/docs/dual-return-outlier-filter.md b/sensing/autoware_pointcloud_preprocessor/docs/dual-return-outlier-filter.md index 8f4da273861a3..0d0423d40ab83 100644 --- a/sensing/autoware_pointcloud_preprocessor/docs/dual-return-outlier-filter.md +++ b/sensing/autoware_pointcloud_preprocessor/docs/dual-return-outlier-filter.md @@ -36,11 +36,11 @@ This implementation inherits `autoware::pointcloud_preprocessor::Filter` class, ### Output -| Name | Type | Description | -| ---------------------------------------------- | --------------------------------------- | ------------------------------------------------------- | -| `/dual_return_outlier_filter/frequency_image` | `sensor_msgs::msg::Image` | The histogram image that represent visibility | -| `/dual_return_outlier_filter/visibility` | `tier4_debug_msgs::msg::Float32Stamped` | A representation of visibility with a value from 0 to 1 | -| `/dual_return_outlier_filter/pointcloud_noise` | `sensor_msgs::msg::Pointcloud2` | The pointcloud removed as noise | +| Name | Type | Description | +| ---------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------- | +| `/dual_return_outlier_filter/frequency_image` | `sensor_msgs::msg::Image` | The histogram image that represent visibility | +| `/dual_return_outlier_filter/visibility` | `autoware_internal_debug_msgs::msg::Float32Stamped` | A representation of visibility with a value from 0 to 1 | +| `/dual_return_outlier_filter/pointcloud_noise` | `sensor_msgs::msg::Pointcloud2` | The pointcloud removed as noise | ## Parameters diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/blockage_diag/blockage_diag_node.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/blockage_diag/blockage_diag_node.hpp index 3601b492c4fe3..2dbda770f6cec 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/blockage_diag/blockage_diag_node.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/blockage_diag/blockage_diag_node.hpp @@ -22,10 +22,10 @@ #include #include +#include #include #include #include -#include #if __has_include() #include @@ -58,10 +58,13 @@ class BlockageDiagComponent : public autoware::pointcloud_preprocessor::Filter image_transport::Publisher single_frame_dust_mask_pub; image_transport::Publisher multi_frame_dust_mask_pub; image_transport::Publisher blockage_dust_merged_pub; - rclcpp::Publisher::SharedPtr ground_blockage_ratio_pub_; - rclcpp::Publisher::SharedPtr sky_blockage_ratio_pub_; - rclcpp::Publisher::SharedPtr ground_dust_ratio_pub_; - rclcpp::Publisher::SharedPtr blockage_type_pub_; + rclcpp::Publisher::SharedPtr + ground_blockage_ratio_pub_; + rclcpp::Publisher::SharedPtr + sky_blockage_ratio_pub_; + rclcpp::Publisher::SharedPtr + ground_dust_ratio_pub_; + rclcpp::Publisher::SharedPtr blockage_type_pub_; private: void onBlockageChecker(DiagnosticStatusWrapper & stat); diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_and_time_sync_nodelet.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_and_time_sync_nodelet.hpp index 40adad3521f8d..6164e85c35717 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_and_time_sync_nodelet.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_and_time_sync_nodelet.hpp @@ -69,14 +69,14 @@ #include #include +#include +#include #include #include #include #include #include #include -#include -#include #include #include diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_pointclouds.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_pointclouds.hpp index 0e959eedae1b6..d57e44431a8d2 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_pointclouds.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/concatenate_data/concatenate_pointclouds.hpp @@ -68,13 +68,13 @@ #include #include +#include +#include #include #include #include #include #include -#include -#include #include #include diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/dual_return_outlier_filter_node.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/dual_return_outlier_filter_node.hpp index ef33e88ef5c98..fa55222fb6530 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/dual_return_outlier_filter_node.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/dual_return_outlier_filter_node.hpp @@ -22,9 +22,9 @@ #include #include +#include #include #include -#include #if __has_include() #include @@ -54,7 +54,7 @@ class DualReturnOutlierFilterComponent : public autoware::pointcloud_preprocesso /** \brief Parameter service callback */ rcl_interfaces::msg::SetParametersResult paramCallback(const std::vector & p); image_transport::Publisher image_pub_; - rclcpp::Publisher::SharedPtr visibility_pub_; + rclcpp::Publisher::SharedPtr visibility_pub_; rclcpp::Publisher::SharedPtr noise_cloud_pub_; private: diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/ring_outlier_filter_node.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/ring_outlier_filter_node.hpp index c898cbacf33ea..96bd2fb2411a0 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/ring_outlier_filter_node.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/outlier_filter/ring_outlier_filter_node.hpp @@ -53,7 +53,7 @@ class RingOutlierFilterComponent : public autoware::pointcloud_preprocessor::Fil const PointCloud2ConstPtr & input, const IndicesPtr & indices, PointCloud2 & output, const TransformInfo & transform_info) override; - rclcpp::Publisher::SharedPtr visibility_pub_; + rclcpp::Publisher::SharedPtr visibility_pub_; private: /** \brief publisher of excluded pointcloud for debug reason. **/ diff --git a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/time_synchronizer/time_synchronizer_node.hpp b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/time_synchronizer/time_synchronizer_node.hpp index d36fcb36a7be1..f4921be66a7e2 100644 --- a/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/time_synchronizer/time_synchronizer_node.hpp +++ b/sensing/autoware_pointcloud_preprocessor/include/autoware/pointcloud_preprocessor/time_synchronizer/time_synchronizer_node.hpp @@ -68,14 +68,14 @@ #include #include +#include +#include #include #include #include #include #include #include -#include -#include #include #include diff --git a/sensing/autoware_pointcloud_preprocessor/package.xml b/sensing/autoware_pointcloud_preprocessor/package.xml index 4511c5497a3a0..525b1f3eb0699 100644 --- a/sensing/autoware_pointcloud_preprocessor/package.xml +++ b/sensing/autoware_pointcloud_preprocessor/package.xml @@ -26,6 +26,7 @@ ament_cmake_auto autoware_cmake + autoware_internal_debug_msgs autoware_lanelet2_extension autoware_pcl_extensions autoware_point_types @@ -51,7 +52,6 @@ tf2_eigen tf2_geometry_msgs tf2_ros - tier4_debug_msgs ament_lint_auto autoware_lint_common diff --git a/sensing/autoware_pointcloud_preprocessor/src/blockage_diag/blockage_diag_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/blockage_diag/blockage_diag_node.cpp index 5021a3551c939..e05d5f789f680 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/blockage_diag/blockage_diag_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/blockage_diag/blockage_diag_node.cpp @@ -68,7 +68,7 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options std::string(this->get_namespace()) + ": dust_validation", this, &BlockageDiagComponent::dustChecker); - ground_dust_ratio_pub_ = create_publisher( + ground_dust_ratio_pub_ = create_publisher( "blockage_diag/debug/ground_dust_ratio", rclcpp::SensorDataQoS()); if (publish_debug_image_) { single_frame_dust_mask_pub = @@ -86,9 +86,9 @@ BlockageDiagComponent::BlockageDiagComponent(const rclcpp::NodeOptions & options blockage_mask_pub_ = image_transport::create_publisher(this, "blockage_diag/debug/blockage_mask_image"); } - ground_blockage_ratio_pub_ = create_publisher( + ground_blockage_ratio_pub_ = create_publisher( "blockage_diag/debug/ground_blockage_ratio", rclcpp::SensorDataQoS()); - sky_blockage_ratio_pub_ = create_publisher( + sky_blockage_ratio_pub_ = create_publisher( "blockage_diag/debug/sky_blockage_ratio", rclcpp::SensorDataQoS()); using std::placeholders::_1; set_param_res_ = this->add_on_set_parameters_callback( @@ -315,7 +315,7 @@ void BlockageDiagComponent::filter( cv::Mat ground_mask(cv::Size(ideal_horizontal_bins, horizontal_ring_id_), CV_8UC1); cv::vconcat(sky_blank, single_dust_ground_img, single_dust_img); - tier4_debug_msgs::msg::Float32Stamped ground_dust_ratio_msg; + autoware_internal_debug_msgs::msg::Float32Stamped ground_dust_ratio_msg; ground_dust_ratio_ = static_cast(cv::countNonZero(single_dust_ground_img)) / (single_dust_ground_img.cols * single_dust_ground_img.rows); ground_dust_ratio_msg.data = ground_dust_ratio_; @@ -386,12 +386,12 @@ void BlockageDiagComponent::filter( } } - tier4_debug_msgs::msg::Float32Stamped ground_blockage_ratio_msg; + autoware_internal_debug_msgs::msg::Float32Stamped ground_blockage_ratio_msg; ground_blockage_ratio_msg.data = ground_blockage_ratio_; ground_blockage_ratio_msg.stamp = now(); ground_blockage_ratio_pub_->publish(ground_blockage_ratio_msg); - tier4_debug_msgs::msg::Float32Stamped sky_blockage_ratio_msg; + autoware_internal_debug_msgs::msg::Float32Stamped sky_blockage_ratio_msg; sky_blockage_ratio_msg.data = sky_blockage_ratio_; sky_blockage_ratio_msg.stamp = now(); sky_blockage_ratio_pub_->publish(sky_blockage_ratio_msg); diff --git a/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_and_time_sync_nodelet.cpp b/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_and_time_sync_nodelet.cpp index f8baae3405873..b49e21b8f30be 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_and_time_sync_nodelet.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_and_time_sync_nodelet.cpp @@ -455,9 +455,9 @@ void PointCloudConcatenateDataSynchronizerComponent::publish() if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } for (const auto & e : cloud_stdmap_) { @@ -468,7 +468,7 @@ void PointCloudConcatenateDataSynchronizerComponent::publish() std::chrono::nanoseconds( (this->get_clock()->now() - e.second->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug" + e.first + "/pipeline_latency_ms", pipeline_latency_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_pointclouds.cpp b/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_pointclouds.cpp index ba29389b88bf7..ba5e2eb51997a 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_pointclouds.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/concatenate_data/concatenate_pointclouds.cpp @@ -271,7 +271,7 @@ void PointCloudConcatenationComponent::publish() std::chrono::nanoseconds( (this->get_clock()->now() - e.second->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug" + e.first + "/pipeline_latency_ms", pipeline_latency_ms); } } @@ -297,9 +297,9 @@ void PointCloudConcatenationComponent::publish() if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/crop_box_filter/crop_box_filter_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/crop_box_filter/crop_box_filter_node.cpp index ecbc5b8fd13ef..54c940d414db8 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/crop_box_filter/crop_box_filter_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/crop_box_filter/crop_box_filter_node.cpp @@ -194,9 +194,9 @@ void CropBoxFilterComponent::faster_filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); auto pipeline_latency_ms = @@ -204,7 +204,7 @@ void CropBoxFilterComponent::faster_filter( std::chrono::nanoseconds((this->get_clock()->now() - input->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/distortion_corrector/distortion_corrector_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/distortion_corrector/distortion_corrector_node.cpp index 9eaafeae9dbc7..cc05a6cc2765c 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/distortion_corrector/distortion_corrector_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/distortion_corrector/distortion_corrector_node.cpp @@ -123,7 +123,7 @@ void DistortionCorrectorComponent::pointcloud_callback(PointCloud2::UniquePtr po std::chrono::nanoseconds( (this->get_clock()->now() - pointcloud_msg->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } @@ -133,9 +133,9 @@ void DistortionCorrectorComponent::pointcloud_callback(PointCloud2::UniquePtr po if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/downsample_filter/pickup_based_voxel_grid_downsample_filter_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/downsample_filter/pickup_based_voxel_grid_downsample_filter_node.cpp index 3d2bc0a206c94..0c467234d6591 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/downsample_filter/pickup_based_voxel_grid_downsample_filter_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/downsample_filter/pickup_based_voxel_grid_downsample_filter_node.cpp @@ -142,9 +142,9 @@ void PickupBasedVoxelGridDownsampleFilterComponent::filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); auto pipeline_latency_ms = @@ -152,7 +152,7 @@ void PickupBasedVoxelGridDownsampleFilterComponent::filter( std::chrono::nanoseconds((this->get_clock()->now() - input->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/dual_return_outlier_filter_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/dual_return_outlier_filter_node.cpp index a8024e02de2c1..bac3a59e09528 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/dual_return_outlier_filter_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/dual_return_outlier_filter_node.cpp @@ -65,7 +65,7 @@ DualReturnOutlierFilterComponent::DualReturnOutlierFilterComponent( image_pub_ = image_transport::create_publisher(this, "dual_return_outlier_filter/debug/frequency_image"); - visibility_pub_ = create_publisher( + visibility_pub_ = create_publisher( "dual_return_outlier_filter/debug/visibility", rclcpp::SensorDataQoS()); { rclcpp::PublisherOptions pub_options; @@ -322,7 +322,7 @@ void DualReturnOutlierFilterComponent::filter( frequency_image_msg->header = input->header; // Publish histogram image image_pub_.publish(frequency_image_msg); - tier4_debug_msgs::msg::Float32Stamped visibility_msg; + autoware_internal_debug_msgs::msg::Float32Stamped visibility_msg; visibility_msg.data = (1.0f - filled); visibility_msg.stamp = now(); visibility_pub_->publish(visibility_msg); diff --git a/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/ring_outlier_filter_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/ring_outlier_filter_node.cpp index fae9043143ba4..fcea299ba5aff 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/ring_outlier_filter_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/outlier_filter/ring_outlier_filter_node.cpp @@ -41,7 +41,7 @@ RingOutlierFilterComponent::RingOutlierFilterComponent(const rclcpp::NodeOptions outlier_pointcloud_publisher_ = this->create_publisher("debug/ring_outlier_filter", 1, pub_options); } - visibility_pub_ = create_publisher( + visibility_pub_ = create_publisher( "ring_outlier_filter/debug/visibility", rclcpp::SensorDataQoS()); stop_watch_ptr_->tic("cyclic_time"); stop_watch_ptr_->tic("processing_time"); @@ -262,7 +262,7 @@ void RingOutlierFilterComponent::faster_filter( outlier.header = input->header; outlier_pointcloud_publisher_->publish(outlier); - tier4_debug_msgs::msg::Float32Stamped visibility_msg; + autoware_internal_debug_msgs::msg::Float32Stamped visibility_msg; visibility_msg.data = calculateVisibilityScore(outlier); visibility_msg.stamp = input->header.stamp; visibility_pub_->publish(visibility_msg); @@ -272,9 +272,9 @@ void RingOutlierFilterComponent::faster_filter( if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); auto pipeline_latency_ms = @@ -282,7 +282,7 @@ void RingOutlierFilterComponent::faster_filter( std::chrono::nanoseconds((this->get_clock()->now() - input->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency_ms); } } diff --git a/sensing/autoware_pointcloud_preprocessor/src/time_synchronizer/time_synchronizer_node.cpp b/sensing/autoware_pointcloud_preprocessor/src/time_synchronizer/time_synchronizer_node.cpp index 42170fd88ee36..e5bd4a955590f 100644 --- a/sensing/autoware_pointcloud_preprocessor/src/time_synchronizer/time_synchronizer_node.cpp +++ b/sensing/autoware_pointcloud_preprocessor/src/time_synchronizer/time_synchronizer_node.cpp @@ -378,7 +378,7 @@ void PointCloudDataSynchronizerComponent::publish() std::chrono::nanoseconds( (this->get_clock()->now() - e.second->header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug" + e.first + "/pipeline_latency_ms", pipeline_latency_ms); } auto output = std::make_unique(*e.second); @@ -400,9 +400,9 @@ void PointCloudDataSynchronizerComponent::publish() if (debug_publisher_) { const double cyclic_time_ms = stop_watch_ptr_->toc("cyclic_time", true); const double processing_time_ms = stop_watch_ptr_->toc("processing_time", true); - debug_publisher_->publish( + debug_publisher_->publish( "debug/cyclic_time_ms", cyclic_time_ms); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", processing_time_ms); } } From b20d7f05df2da1dd1580e824c82316ed77f49059 Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Wed, 15 Jan 2025 16:20:10 +0900 Subject: [PATCH 103/127] chore(autoware_test_utils): move rviz config to autoware_launch (#9925) Signed-off-by: Mamoru Sobue --- common/autoware_test_utils/CMakeLists.txt | 1 - .../launch/psim_intersection.launch.xml | 2 +- .../launch/psim_road_shoulder.launch.xml | 2 +- .../rviz/psim_test_map.rviz | 4569 ----------------- 4 files changed, 2 insertions(+), 4572 deletions(-) delete mode 100644 common/autoware_test_utils/rviz/psim_test_map.rviz diff --git a/common/autoware_test_utils/CMakeLists.txt b/common/autoware_test_utils/CMakeLists.txt index 8bfa44f7bf0ba..20b8f964f879f 100644 --- a/common/autoware_test_utils/CMakeLists.txt +++ b/common/autoware_test_utils/CMakeLists.txt @@ -25,5 +25,4 @@ ament_auto_package(INSTALL_TO_SHARE test_map test_data launch - rviz ) diff --git a/common/autoware_test_utils/launch/psim_intersection.launch.xml b/common/autoware_test_utils/launch/psim_intersection.launch.xml index 723dd7352219d..dc3e75cca1d96 100644 --- a/common/autoware_test_utils/launch/psim_intersection.launch.xml +++ b/common/autoware_test_utils/launch/psim_intersection.launch.xml @@ -3,7 +3,7 @@ - + diff --git a/common/autoware_test_utils/launch/psim_road_shoulder.launch.xml b/common/autoware_test_utils/launch/psim_road_shoulder.launch.xml index 7dd888a036f9d..58b71524e72b8 100644 --- a/common/autoware_test_utils/launch/psim_road_shoulder.launch.xml +++ b/common/autoware_test_utils/launch/psim_road_shoulder.launch.xml @@ -3,7 +3,7 @@ - + diff --git a/common/autoware_test_utils/rviz/psim_test_map.rviz b/common/autoware_test_utils/rviz/psim_test_map.rviz deleted file mode 100644 index 8475c94b86bb4..0000000000000 --- a/common/autoware_test_utils/rviz/psim_test_map.rviz +++ /dev/null @@ -1,4569 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 0 - Name: Displays - Property Tree Widget: - Expanded: - - /Sensing1/LiDAR1/ConcatenatePointCloud1/Autocompute Value Bounds1 - Splitter Ratio: 0.557669460773468 - Tree Height: 225 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: ~ - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: AutowareDateTimePanel - Name: AutowareDateTimePanel - - Class: rviz_plugins::AutowareStatePanel - Name: AutowareStatePanel - - Class: rviz_plugins::SimulatedClockPanel - Name: SimulatedClockPanel - - Class: rviz_plugins::TrafficLightPublishPanel - Name: TrafficLightPublishPanel -Visualization Manager: - Class: "" - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/TF - Enabled: false - Frame Timeout: 15 - Frames: - All Enabled: true - Marker Scale: 1 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: true - Tree: - {} - Update Interval: 0 - Value: false - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: false - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: false - - Class: rviz_common/Group - Displays: - - Alpha: 0.30000001192092896 - Class: rviz_default_plugins/RobotModel - Collision Enabled: false - Description File: "" - Description Source: Topic - Description Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /robot_description - Enabled: true - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - ars408_front_center: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera0/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera0/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera1/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera1/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera2/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera2/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera3/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera3/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera4/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera4/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera5/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera5/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera6/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera6/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera7/camera_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - camera7/camera_optical_link: - Alpha: 1 - Show Axes: false - Show Trail: false - gnss_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - livox_front_left: - Alpha: 1 - Show Axes: false - Show Trail: false - livox_front_left_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - livox_front_right: - Alpha: 1 - Show Axes: false - Show Trail: false - livox_front_right_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - sensor_kit_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - tamagawa/imu_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_left: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_left_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_rear: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_rear_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_right: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_right_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_top: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - velodyne_top_base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - Mass Properties: - Inertia: false - Mass: false - Name: VehicleModel - TF Prefix: "" - Update Interval: 0 - Value: true - Visual Enabled: true - - Class: rviz_plugins/PolarGridDisplay - Color: 255; 255; 255 - Delta Range: 10 - Enabled: true - Max Alpha: 0.5 - Max Range: 100 - Max Wave Alpha: 0.5 - Min Alpha: 0.009999999776482582 - Min Wave Alpha: 0.009999999776482582 - Name: PolarGridDisplay - Reference Frame: base_link - Value: true - Wave Color: 255; 255; 255 - Wave Velocity: 40 - - Background Alpha: 0.5 - Background Color: 23; 28; 31 - Class: autoware_overlay_rviz_plugin/SignalDisplay - Dark Traffic Color: 255; 51; 51 - Enabled: true - Gear Topic Test: /vehicle/status/gear_status - Handle Angle Scale: 17 - Hazard Lights Topic: /vehicle/status/hazard_lights_status - Height: 100 - Left: 0 - Light Traffic Color: 255; 153; 153 - Name: SignalDisplay - Primary Color: 174; 174; 174 - Signal Color: 0; 230; 120 - Speed Limit Topic: /planning/scenario_planning/current_max_velocity - Speed Topic: /vehicle/status/velocity_status - Steering Topic: /vehicle/status/steering_status - Top: 10 - Traffic Topic: /planning/scenario_planning/lane_driving/behavior_planning/debug/traffic_signal - Turn Signals Topic: /vehicle/status/turn_indicators_status - Value: true - Width: 550 - Enabled: true - Name: Vehicle - - Class: rviz_plugins/MrmSummaryOverlayDisplay - Enabled: false - Font Size: 10 - Left: 512 - Max Letter Num: 100 - Name: MRM Summary - Text Color: 25; 255; 240 - Top: 64 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /system/emergency/hazard_status - Value: false - Value height offset: 0 - Enabled: true - Name: System - - Class: rviz_common/Group - Displays: - - Alpha: 0.20000000298023224 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 28.71826171875 - Min Value: -7.4224700927734375 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 255; 255; 255 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: false - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 237 - Min Color: 211; 215; 207 - Min Intensity: 0 - Name: PointCloudMap - Position Transformer: XYZ - Selectable: false - Size (Pixels): 1 - Size (m): 0.019999999552965164 - Style: Points - Topic: - Depth: 5 - Durability Policy: Transient Local - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map/pointcloud_map - Use Fixed Frame: true - Use rainbow: false - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Lanelet2VectorMap - Namespaces: - bus_stop_area: true - center_lane_line: false - center_line_arrows: false - curbstone: true - lane_start_bound: false - lanelet direction: true - lanelet_id: false - left_lane_bound: true - no_parking_area: true - parking_lots: true - parking_space: true - partitions: true - right_lane_bound: true - road_lanelets: false - shoulder_center_lane_line: false - shoulder_center_line_arrows: true - shoulder_lane_start_bound: true - shoulder_left_lane_bound: true - shoulder_right_lane_bound: true - shoulder_road_lanelets: false - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /map/vector_map_marker - Value: true - Enabled: true - Name: Map - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Alpha: 0.4000000059604645 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 5 - Min Value: -1 - Value: false - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 255; 255; 255 - Color Transformer: AxisColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: ConcatenatePointCloud - Position Transformer: XYZ - Selectable: false - Size (Pixels): 1 - Size (m): 0.019999999552965164 - Style: Points - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /sensing/lidar/concatenated/pointcloud - Use Fixed Frame: false - Use rainbow: true - Value: true - - Alpha: 0.9990000128746033 - Class: rviz_default_plugins/Polygon - Color: 25; 255; 0 - Enabled: false - Name: MeasurementRange - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /sensing/lidar/crop_box_filter/crop_box_polygon - Value: false - Enabled: true - Name: LiDAR - - Class: rviz_common/Group - Displays: - - Alpha: 0.9990000128746033 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Class: rviz_default_plugins/PoseWithCovariance - Color: 233; 185; 110 - Covariance: - Orientation: - Alpha: 0.5 - Color: 255; 255; 127 - Color Style: Unique - Frame: Local - Offset: 1 - Scale: 1 - Value: false - Position: - Alpha: 0.20000000298023224 - Color: 204; 51; 204 - Scale: 1 - Value: true - Value: true - Enabled: true - Head Length: 0.699999988079071 - Head Radius: 1.2000000476837158 - Name: PoseWithCovariance - Shaft Length: 1 - Shaft Radius: 0.5 - Shape: Arrow - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /sensing/gnss/pose_with_covariance - Value: true - Enabled: false - Name: GNSS - Enabled: true - Name: Sensing - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Alpha: 0.9990000128746033 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Class: rviz_default_plugins/PoseWithCovariance - Color: 0; 170; 255 - Covariance: - Orientation: - Alpha: 0.5 - Color: 255; 255; 127 - Color Style: Unique - Frame: Local - Offset: 1 - Scale: 1 - Value: true - Position: - Alpha: 0.30000001192092896 - Color: 204; 51; 204 - Scale: 1 - Value: true - Value: true - Enabled: false - Head Length: 0.4000000059604645 - Head Radius: 0.6000000238418579 - Name: PoseWithCovInitial - Shaft Length: 0.6000000238418579 - Shaft Radius: 0.30000001192092896 - Shape: Arrow - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/initial_pose_with_covariance - Value: false - - Alpha: 0.9990000128746033 - Axes Length: 1 - Axes Radius: 0.10000000149011612 - Class: rviz_default_plugins/PoseWithCovariance - Color: 0; 255; 0 - Covariance: - Orientation: - Alpha: 0.5 - Color: 255; 255; 127 - Color Style: Unique - Frame: Local - Offset: 1 - Scale: 1 - Value: true - Position: - Alpha: 0.30000001192092896 - Color: 204; 51; 204 - Scale: 1 - Value: true - Value: true - Enabled: false - Head Length: 0.4000000059604645 - Head Radius: 0.6000000238418579 - Name: PoseWithCovAligned - Shaft Length: 0.6000000238418579 - Shaft Radius: 0.30000001192092896 - Shape: Arrow - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/pose_with_covariance - Value: false - - Buffer Size: 200 - Class: rviz_plugins::PoseHistory - Enabled: false - Line: - Alpha: 0.9990000128746033 - Color: 170; 255; 127 - Value: true - Width: 0.10000000149011612 - Name: PoseHistory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/pose - Value: false - - Alpha: 0.9990000128746033 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 0; 255; 255 - Color Transformer: "" - Decay Time: 0 - Enabled: false - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: Initial - Position Transformer: XYZ - Selectable: false - Size (Pixels): 10 - Size (m): 0.5 - Style: Squares - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /localization/util/downsample/pointcloud - Use Fixed Frame: true - Use rainbow: true - Value: false - - Alpha: 0.9990000128746033 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 85; 255; 0 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: false - Invert Rainbow: false - Max Color: 85; 255; 127 - Max Intensity: 0 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: Aligned - Position Transformer: XYZ - Selectable: false - Size (Pixels): 10 - Size (m): 0.5 - Style: Squares - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/points_aligned - Use Fixed Frame: true - Use rainbow: true - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: MonteCarloInitialPose - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/monte_carlo_initial_pose_marker - Value: true - Enabled: true - Name: NDT - - Class: rviz_common/Group - Displays: - - Buffer Size: 1000 - Class: rviz_plugins::PoseHistory - Enabled: true - Line: - Alpha: 0.9990000128746033 - Color: 0; 255; 255 - Value: true - Width: 0.10000000149011612 - Name: PoseHistory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_twist_fusion_filter/pose - Value: true - Enabled: true - Name: EKF - Enabled: true - Name: Localization - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Alpha: 0.9990000128746033 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 15 - Min Value: -2 - Value: false - Axis: Z - Channel Name: z - Class: rviz_default_plugins/PointCloud2 - Color: 200; 200; 200 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 15 - Min Color: 0; 0; 0 - Min Intensity: -5 - Name: NoGroundPointCloud - Position Transformer: XYZ - Selectable: false - Size (Pixels): 3 - Size (m): 0.019999999552965164 - Style: Points - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/obstacle_segmentation/pointcloud - Use Fixed Frame: true - Use rainbow: true - Value: true - Enabled: true - Name: Segmentation - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - BUS: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CAR: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.029999999329447746 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Name: DetectedObjects - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 192; 203 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - TRUCK: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Value: true - Visualization Type: Normal - Enabled: false - Name: Detection - - Class: rviz_common/Group - Displays: - - BUS: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CAR: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Class: autoware_perception_rviz_plugin/TrackedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Dynamic Status: All - Enabled: true - Line Width: 0.029999999329447746 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Name: TrackedObjects - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 192; 203 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - TRUCK: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/tracking/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Value: true - Visualization Type: Normal - Enabled: false - Name: Tracking - - Class: rviz_common/Group - Displays: - - BUS: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CAR: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Class: autoware_perception_rviz_plugin/PredictedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.029999999329447746 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 119; 11; 32 - Name: PredictedObjects - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 192; 203 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - TRUCK: - Alpha: 0.9990000128746033 - Color: 30; 144; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Value: true - Visualization Type: Normal - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Maneuver - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/prediction/maneuver - Value: false - Enabled: true - Name: Prediction - Enabled: true - Name: ObjectRecognition - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/Image - Enabled: false - Max Value: 1 - Median window: 5 - Min Value: 0 - Name: RecognitionResultOnImage - Normalize Range: true - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/traffic_light_recognition/traffic_light/debug/rois - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: MapBasedDetectionResult - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/traffic_light_recognition/traffic_light_map_based_detector/debug/markers - Value: true - Enabled: true - Name: TrafficLight - - Class: rviz_common/Group - Displays: - - Alpha: 0.5 - Class: rviz_default_plugins/Map - Color Scheme: map - Draw Behind: false - Enabled: true - Name: Map - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/occupancy_grid_map/map - Update Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/occupancy_grid_map/map_updates - Use Timestamp: false - Value: true - Enabled: false - Name: OccupancyGrid - Enabled: true - Name: Perception - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: RouteArea - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Transient Local - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/mission_planning/route_marker - Value: true - - Alpha: 0.9990000128746033 - Axes Length: 1 - Axes Radius: 0.30000001192092896 - Class: rviz_default_plugins/Pose - Color: 255; 25; 0 - Enabled: true - Head Length: 0.30000001192092896 - Head Radius: 0.5 - Name: GoalPose - Shaft Length: 3 - Shaft Radius: 0.20000000298023224 - Shape: Axes - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/mission_planning/echo_back_goal_pose - Value: true - - Background Alpha: 0.5 - Background Color: 23; 28; 31 - Class: autoware_mission_details_overlay_rviz_plugin/MissionDetailsDisplay - Enabled: true - Height: 100 - Name: MissionDetailsDisplay - Remaining Distance and Time Topic: /planning/mission_remaining_distance_time - Right: 10 - Text Color: 194; 194; 194 - Top: 10 - Value: true - Width: 170 - Enabled: true - Name: MissionPlanning - - Class: rviz_common/Group - Displays: - - Class: rviz_plugins/Trajectory - Color Border Vel Max: 3 - Enabled: true - Name: ScenarioTrajectory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/trajectory - Value: true - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.9990000128746033 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.9990000128746033 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: true - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: Path - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/path - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.4000000059604645 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.4000000059604645 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: true - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_AvoidanceByLC - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/avoidance_by_lane_change - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_Avoidance - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/static_obstacle_avoidance - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_LaneChangeRight - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/lane_change_right - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_LaneChangeLeft - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/lane_change_left - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_GoalPlanner - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/goal_planner - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: false - Name: PathReference_StartPlanner - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_reference/start_planner - Value: false - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_AvoidanceByLC - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/avoidance_by_lane_change - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: (old)PathChangeCandidate_LaneChange - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/lane_change - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_LaneChangeRight - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/lane_change_right - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_LaneChangeLeft - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/lane_change_left - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_ExternalRequestLaneChangeRight - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/external_request_lane_change_right - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_ExternalRequestLaneChangeLeft - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/external_request_lane_change_left - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_Avoidance - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/static_obstacle_avoidance - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_StartPlanner - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/start_planner - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Path - Color Border Vel Max: 3 - Enabled: true - Name: PathChangeCandidate_GoalPlanner - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/path_candidate/goal_planner - Value: true - View Drivable Area: - Alpha: 0.9990000128746033 - Color: 0; 148; 205 - Value: true - Width: 0.30000001192092896 - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.30000001192092896 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.30000001192092896 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Bound - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/bound - Value: false - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (StaticObstacleAvoidance) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/static_obstacle_avoidance - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (AvoidanceByLC) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/avoidance_by_lane_change - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (LaneChangeRight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/lane_change_right - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (LaneChangeLeft) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/lane_change_left - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ExtLaneChangeRight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/external_request_lane_change_right - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ExtLaneChangeLeft) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/external_request_lane_change_left - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (GoalPlanner) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/goal_planner - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (StartPlanner) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/virtual_wall/start_planner - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (BlindSpot) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/blind_spot - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (Crosswalk) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/crosswalk - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (Walkway) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/walkway - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (DetectionArea) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/detection_area - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (Intersection) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/intersection - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (MergeFromPrivateArea) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/merge_from_private - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (NoStoppingArea) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/no_stopping_area - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (OcclusionSpot) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/occlusion_spot - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (StopLine) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/stop_line - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (TrafficLight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/traffic_light - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (VirtualTrafficLight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/virtual_traffic_light - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (RunOut) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/run_out - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (SpeedBump) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/speed_bump - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (NoDrivableLane) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/virtual_wall/no_drivable_lane - Value: true - Enabled: true - Name: VirtualWall - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Arrow - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/path - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Crosswalk - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/crosswalk - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Intersection - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/intersection - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Blind Spot - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/blind_spot - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: TrafficLight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/traffic_light - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: VirtualTrafficLight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/virtual_traffic_light - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: StopLine - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/stop_line - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: DetectionArea - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/detection_area - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: OcclusionSpot - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/occlusion_spot - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: NoStoppingArea - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/no_stopping_area - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: RunOut - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/run_out - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: StaticObstacleAvoidance - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/static_obstacle_avoidance - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: LeftLaneChange - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/lane_change_left - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: RightLaneChange - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/lane_change_right - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: LaneFollowing - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/lane_following - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: GoalPlanner - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/goal_planner - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: StartPlanner - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/start_planner - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: SideShift - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/side_shift - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: SpeedBump - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/speed_bump - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: DynamicObstacleAvoidance - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/debug/dynamic_obstacle_avoidance - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: NoDrivableLane - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner/debug/no_drivable_lane - Value: false - Enabled: false - Name: DebugMarker - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (StaticObstacleAvoidance) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/static_obstacle_avoidance - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (AvoidanceByLC) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/avoidance_by_lane_change - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (LaneChangeLeft) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/lane_change_left - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (LaneChangeRight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/lane_change_right - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (ExtLaneChangeLeft) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/external_request_lane_change_left - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (ExtLaneChangeRight) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/external_request_lane_change_right - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (GoalPlanner) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/goal_planner - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (StartPlanner) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/start_planner - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Info (DynamicObstacleAvoidance) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner/info/dynamic_obstacle_avoidance - Value: false - Enabled: false - Name: InfoMarker - Enabled: true - Name: BehaviorPlanning - - Class: rviz_common/Group - Displays: - - Class: rviz_plugins/Trajectory - Color Border Vel Max: 3 - Enabled: false - Name: Trajectory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/trajectory - Value: false - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 0.9990000128746033 - Constant Width: false - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 2 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 0.9990000128746033 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: true - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ObstacleStop) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_stop_planner/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (SurroundObstacle) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/surround_obstacle_checker/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ObstacleAvoidance) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_avoidance_planner/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ObstacleCruise) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_cruise_planner/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (MotionVelocitySmoother) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/velocity_smoother/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (OutOfLane) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/out_of_lane/virtual_walls - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (ObstacleVelocityLimiter) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/obstacle_velocity_limiter/virtual_walls - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (DynamicObstacleStop) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/dynamic_obstacle_stop/virtual_walls - Value: true - Enabled: true - Name: VirtualWall - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: SurroundObstacleCheck - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/surround_obstacle_checker/debug/marker - Value: true - - Alpha: 1 - Class: rviz_default_plugins/Polygon - Color: 25; 255; 0 - Enabled: false - Name: Footprint - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/surround_obstacle_checker/debug/footprint - Value: false - - Alpha: 1 - Class: rviz_default_plugins/Polygon - Color: 239; 41; 41 - Enabled: false - Name: FootprintOffset - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/surround_obstacle_checker/debug/footprint_offset - Value: false - - Alpha: 1 - Class: rviz_default_plugins/Polygon - Color: 10; 21; 255 - Enabled: false - Name: FootprintRecoverOffset - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/surround_obstacle_checker/debug/footprint_recover_offset - Value: false - Enabled: false - Name: SurroundObstacleChecker - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: ObstacleStop - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_stop_planner/debug/marker - Value: false - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: CruiseVirtualWall - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_cruise_planner/debug/cruise/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: SlowDownVirtualWall - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_cruise_planner/debug/slow_down/virtual_wall - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: DebugMarker - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_cruise_planner/debug/marker - Value: true - Enabled: false - Name: ObstacleCruise - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: ObstacleAvoidance - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/obstacle_avoidance_planner/debug/marker - Value: false - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: OutOfLane - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/out_of_lane/debug_markers - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: ObstacleVelocityLimiter - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/obstacle_velocity_limiter/debug_markers - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: DynamicObstacleStop - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/lane_driving/motion_planning/motion_velocity_planner/dynamic_obstacle_stop/debug_markers - Value: true - Enabled: false - Name: MotionVelocityPlanner - Enabled: false - Name: DebugMarker - Enabled: true - Name: MotionPlanning - Enabled: true - Name: LaneDriving - - Class: rviz_common/Group - Displays: - - Alpha: 0.699999988079071 - Class: rviz_default_plugins/Map - Color Scheme: map - Draw Behind: false - Enabled: false - Name: Costmap - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/parking/costmap_generator/occupancy_grid - Update Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/parking/costmap_generator/occupancy_grid_updates - Use Timestamp: false - Value: false - - Alpha: 0.9990000128746033 - Arrow Length: 0.30000001192092896 - Axes Length: 0.30000001192092896 - Axes Radius: 0.009999999776482582 - Class: rviz_default_plugins/PoseArray - Color: 255; 25; 0 - Enabled: true - Head Length: 0.10000000149011612 - Head Radius: 0.20000000298023224 - Name: PartialPoseArray - Shaft Length: 0.20000000298023224 - Shaft Radius: 0.05000000074505806 - Shape: Arrow (3D) - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/parking/freespace_planner/debug/partial_pose_array - Value: true - - Alpha: 0.9990000128746033 - Arrow Length: 0.5 - Axes Length: 0.30000001192092896 - Axes Radius: 0.009999999776482582 - Class: rviz_default_plugins/PoseArray - Color: 0; 0; 255 - Enabled: true - Head Length: 0.10000000149011612 - Head Radius: 0.20000000298023224 - Name: PoseArray - Shaft Length: 0.20000000298023224 - Shaft Radius: 0.05000000074505806 - Shape: Arrow (Flat) - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/parking/freespace_planner/debug/pose_array - Value: true - Enabled: true - Name: Parking - - Class: rviz_plugins/PoseWithUuidStamped - Enabled: true - Length: 1.5 - Name: ModifiedGoal - Radius: 0.5 - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/scenario_planning/modified_goal - UUID: - Scale: 0.30000001192092896 - Value: false - Value: true - Enabled: true - Name: ScenarioPlanning - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: PlanningErrorMarker - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /planning/planning_diagnostics/planning_error_monitor/debug/marker - Value: true - Enabled: false - Name: Diagnostic - Enabled: true - Name: Planning - - Class: rviz_common/Group - Displays: - - Class: rviz_plugins/Trajectory - Color Border Vel Max: 3 - Enabled: true - Name: Predicted Trajectory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/trajectory_follower/controller_node_exe/debug/predicted_trajectory_in_frenet_coordinate - Value: true - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 1 - Constant Width: true - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: true - Width: 0.05000000074505806 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: false - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_plugins/Trajectory - Color Border Vel Max: 3 - Enabled: false - Name: Resampled Reference Trajectory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/trajectory_follower/controller_node_exe/debug/resampled_reference_trajectory - Value: false - View Footprint: - Alpha: 1 - Color: 230; 230; 50 - Offset from BaseLink: 0 - Rear Overhang: 1.0299999713897705 - Value: false - Vehicle Length: 4.769999980926514 - Vehicle Width: 1.8300000429153442 - View Path: - Alpha: 1 - Constant Width: true - Fade Out Distance: 0 - Max Velocity Color: 0; 230; 120 - Mid Velocity Color: 32; 138; 174 - Min Velocity Color: 63; 46; 227 - Value: false - Width: 0.20000000298023224 - View Point: - Alpha: 1 - Color: 0; 60; 255 - Offset: 0 - Radius: 0.10000000149011612 - Value: true - View Text Slope: - Scale: 0.30000001192092896 - Value: false - View Text Velocity: - Scale: 0.30000001192092896 - Value: false - View Velocity: - Alpha: 1 - Color: 0; 0; 0 - Constant Color: false - Scale: 0.30000001192092896 - Value: false - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: VirtualWall (AEB) - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/autonomous_emergency_braking/virtual_wall - Value: true - Enabled: true - Name: VirtualWall - - Class: rviz_default_plugins/Marker - Enabled: false - Name: Stop Reason - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/trajectory_follower/longitudinal/stop_reason - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Debug/MPC - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/trajectory_follower/mpc_follower/debug/markers - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Debug/PurePursuit - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/trajectory_follower/controller_node_exe/debug/markers - Value: false - - Class: rviz_default_plugins/MarkerArray - Enabled: false - Name: Debug/AEB - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /control/autonomous_emergency_braking/debug/markers - Value: false - Enabled: true - Name: Control - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: ~ - Enabled: true - Name: Map - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/Camera - Enabled: true - Far Plane Distance: 100 - Image Rendering: background and overlay - Name: PointcloudOnCamera - Overlay Alpha: 0.5 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /sensing/camera/camera6/image_raw - Value: true - Visibility: - Control: - Debug/AEB: true - Debug/MPC: true - Debug/PurePursuit: true - Predicted Trajectory: true - Resampled Reference Trajectory: true - Stop Reason: true - Value: false - VirtualWall: - Value: true - VirtualWall (AEB): true - Debug: - Control: true - Localization: - "": true - Value: true - Map: true - Perception: - "": true - Value: true - Planning: - "": - "": true - Value: true - Value: true - Sensing: - ConcatenatePointCloud: true - RadarRawObjects(white): true - Value: true - Value: true - Localization: - EKF: - PoseHistory: true - Value: true - NDT: - Aligned: true - Initial: true - MonteCarloInitialPose: true - PoseHistory: true - PoseWithCovAligned: true - PoseWithCovInitial: true - Value: true - Value: false - Map: - Lanelet2VectorMap: true - PointCloudMap: true - Value: false - Perception: - ObjectRecognition: - Detection: - DetectedObjects: true - Value: true - Prediction: - Maneuver: true - PredictedObjects: true - Value: true - Tracking: - TrackedObjects: true - Value: true - Value: true - OccupancyGrid: - Map: true - Value: true - Segmentation: - NoGroundPointCloud: true - Value: true - TrafficLight: - MapBasedDetectionResult: true - RecognitionResultOnImage: true - Value: true - Value: false - Planning: - Diagnostic: - PlanningErrorMarker: true - Value: true - MissionPlanning: - GoalPose: true - MissionDetailsDisplay: true - RouteArea: true - Value: true - ScenarioPlanning: - LaneDriving: - BehaviorPlanning: - (old)PathChangeCandidate_LaneChange: true - Bound: true - DebugMarker: - Arrow: true - Blind Spot: true - Crosswalk: true - DetectionArea: true - DynamicObstacleAvoidance: true - GoalPlanner: true - Intersection: true - LaneFollowing: true - LeftLaneChange: true - NoDrivableLane: true - NoStoppingArea: true - OcclusionSpot: true - RightLaneChange: true - RunOut: true - SideShift: true - SpeedBump: true - StartPlanner: true - StaticObstacleAvoidance: true - StopLine: true - TrafficLight: true - Value: true - VirtualTrafficLight: true - InfoMarker: - Info (AvoidanceByLC): true - Info (DynamicObstacleAvoidance): true - Info (ExtLaneChangeLeft): true - Info (ExtLaneChangeRight): true - Info (GoalPlanner): true - Info (LaneChangeLeft): true - Info (LaneChangeRight): true - Info (StartPlanner): true - Info (StaticObstacleAvoidance): true - Value: true - Path: true - PathChangeCandidate_Avoidance: true - PathChangeCandidate_AvoidanceByLC: true - PathChangeCandidate_ExternalRequestLaneChangeLeft: true - PathChangeCandidate_ExternalRequestLaneChangeRight: true - PathChangeCandidate_GoalPlanner: true - PathChangeCandidate_LaneChangeLeft: true - PathChangeCandidate_LaneChangeRight: true - PathChangeCandidate_StartPlanner: true - PathReference_Avoidance: true - PathReference_AvoidanceByLC: true - PathReference_GoalPlanner: true - PathReference_LaneChangeLeft: true - PathReference_LaneChangeRight: true - PathReference_StartPlanner: true - Value: true - VirtualWall: - Value: true - VirtualWall (AvoidanceByLC): true - VirtualWall (BlindSpot): true - VirtualWall (Crosswalk): true - VirtualWall (DetectionArea): true - VirtualWall (ExtLaneChangeLeft): true - VirtualWall (ExtLaneChangeRight): true - VirtualWall (GoalPlanner): true - VirtualWall (Intersection): true - VirtualWall (LaneChangeLeft): true - VirtualWall (LaneChangeRight): true - VirtualWall (MergeFromPrivateArea): true - VirtualWall (NoDrivableLane): true - VirtualWall (NoStoppingArea): true - VirtualWall (OcclusionSpot): true - VirtualWall (RunOut): true - VirtualWall (SpeedBump): true - VirtualWall (StartPlanner): true - VirtualWall (StaticObstacleAvoidance): true - VirtualWall (StopLine): true - VirtualWall (TrafficLight): true - VirtualWall (VirtualTrafficLight): true - VirtualWall (Walkway): true - MotionPlanning: - DebugMarker: - MotionVelocityPlanner: - DynamicObstacleStop: true - ObstacleVelocityLimiter: true - OutOfLane: true - Value: true - ObstacleAvoidance: true - ObstacleCruise: - CruiseVirtualWall: true - DebugMarker: true - SlowDownVirtualWall: true - Value: true - ObstacleStop: true - SurroundObstacleChecker: - Footprint: true - FootprintOffset: true - FootprintRecoverOffset: true - SurroundObstacleCheck: true - Value: true - Value: true - Trajectory: true - Value: true - VirtualWall: - Value: true - VirtualWall (DynamicObstacleStop): true - VirtualWall (MotionVelocitySmoother): true - VirtualWall (ObstacleAvoidance): true - VirtualWall (ObstacleCruise): true - VirtualWall (ObstacleStop): true - VirtualWall (ObstacleVelocityLimiter): true - VirtualWall (OutOfLane): true - VirtualWall (SurroundObstacle): true - Value: true - ModifiedGoal: true - Parking: - Costmap: true - PartialPoseArray: true - PoseArray: true - Value: true - ScenarioTrajectory: true - Value: true - Value: false - Sensing: - GNSS: - PoseWithCovariance: true - Value: true - LiDAR: - ConcatenatePointCloud: true - MeasurementRange: true - Value: true - Value: true - System: - Grid: true - MRM Summary: true - TF: true - Value: false - Vehicle: - PolarGridDisplay: true - SignalDisplay: true - Value: true - VehicleModel: true - Value: true - Zoom Factor: 1 - - Alpha: 1 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 5 - Min Value: -1 - Value: false - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 255; 255; 255 - Color Transformer: AxisColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: ConcatenatePointCloud - Position Transformer: XYZ - Selectable: false - Size (Pixels): 3 - Size (m): 0.019999999552965164 - Style: Points - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /sensing/lidar/concatenated/pointcloud - Use Fixed Frame: false - Use rainbow: true - Value: true - - BUS: - Alpha: 0.5 - Color: 255; 255; 255 - CAR: - Alpha: 0.5 - Color: 255; 255; 255 - CYCLIST: - Alpha: 0.5 - Color: 255; 255; 255 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.029999999329447746 - MOTORCYCLE: - Alpha: 0.5 - Color: 255; 255; 255 - Name: RadarRawObjects(white) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.5 - Color: 255; 255; 255 - Polygon Type: 3d - TRAILER: - Alpha: 0.5 - Color: 255; 255; 255 - TRUCK: - Alpha: 0.5 - Color: 255; 255; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /sensing/radar/detected_objects - UNKNOWN: - Alpha: 0.5 - Color: 255; 255; 255 - Value: true - Visualization Type: Normal - Enabled: false - Name: Sensing - - Class: rviz_common/Group - Displays: - - Alpha: 0.9990000128746033 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 85; 255; 0 - Color Transformer: FlatColor - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 85; 255; 127 - Max Intensity: 0 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: NDT pointclouds - Position Transformer: XYZ - Selectable: false - Size (Pixels): 10 - Size (m): 0.5 - Style: Squares - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/points_aligned - Use Fixed Frame: true - Use rainbow: true - Value: true - - Alpha: 1 - Autocompute Intensity Bounds: true - Autocompute Value Bounds: - Max Value: 10 - Min Value: -10 - Value: true - Axis: Z - Channel Name: intensity - Class: rviz_default_plugins/PointCloud2 - Color: 255; 255; 255 - Color Transformer: "" - Decay Time: 0 - Enabled: true - Invert Rainbow: false - Max Color: 255; 255; 255 - Max Intensity: 4096 - Min Color: 0; 0; 0 - Min Intensity: 0 - Name: NDTLoadedPCDMap - Position Transformer: "" - Selectable: true - Size (Pixels): 3 - Size (m): 0.10000000149011612 - Style: Flat Squares - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/debug/loaded_pointcloud_map - Use Fixed Frame: true - Use rainbow: true - Value: true - - Buffer Size: 200 - Class: rviz_plugins::PoseHistory - Enabled: true - Line: - Alpha: 0.9990000128746033 - Color: 170; 255; 127 - Value: true - Width: 0.10000000149011612 - Name: NDTPoseHistory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_estimator/pose - Value: true - - Buffer Size: 1000 - Class: rviz_plugins::PoseHistory - Enabled: true - Line: - Alpha: 0.9990000128746033 - Color: 0; 255; 255 - Value: true - Width: 0.10000000149011612 - Name: EKFPoseHistory - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /localization/pose_twist_fusion_filter/pose - Value: true - Enabled: true - Name: Localization - - Class: rviz_common/Group - Displays: - - BUS: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - CAR: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - Name: Centerpoint(red1) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - TRUCK: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/centerpoint/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 138; 128 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - CAR: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - Name: CenterpointROIFusion(red2) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - TRUCK: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/centerpoint/roi_fusion/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 82; 82 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - CAR: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - Name: CenterpointValidator(red3) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - TRUCK: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/centerpoint/validation/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 213; 0; 0 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - CAR: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - Name: PointPainting(light_green1) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - TRUCK: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/pointpainting/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 178; 255; 89 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - CAR: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - Name: PointPaintingROIFusion(light_green2) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - TRUCK: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/pointpainting/roi_fusion/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 118; 255; 3 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - CAR: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - Name: PointPaintingValidator(light_green3) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - TRUCK: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/pointpainting/validation/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 100; 221; 23 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - CAR: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - Name: DetectionByTracker(orange) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - TRUCK: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/detection_by_tracker/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 145; 0 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - CAR: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - Name: CameraLidarFusion(purple) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - TRUCK: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/clustering/camera_lidar_fusion/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 213; 0; 249 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - CAR: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Name: RadarFarObjects(white) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - TRUCK: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/radar/far_objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 255; 255 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - CAR: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - Class: autoware_perception_rviz_plugin/DetectedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - Name: Detection(yellow) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - TRUCK: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/detection/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 255; 234; 0 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - CAR: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - Class: autoware_perception_rviz_plugin/TrackedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Dynamic Status: All - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - Name: Tracking(green) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - TRUCK: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/tracking/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 0; 230; 118 - Value: true - Visualization Type: Normal - - BUS: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - CAR: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - CYCLIST: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - Class: autoware_perception_rviz_plugin/PredictedObjects - Confidence Interval: 95% - Display Acceleration: true - Display Existence Probability: false - Display Label: true - Display Pose Covariance: true - Display Predicted Path Confidence: true - Display Predicted Paths: true - Display Twist: true - Display Twist Covariance: false - Display UUID: true - Display Velocity: true - Display Yaw Covariance: false - Display Yaw Rate: false - Display Yaw Rate Covariance: false - Enabled: true - Line Width: 0.10000000149011612 - MOTORCYCLE: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - Name: Prediction(light_blue) - Namespaces: - {} - Object Fill Type: skeleton - PEDESTRIAN: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - Polygon Type: 3d - TRAILER: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - TRUCK: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Best Effort - Value: /perception/object_recognition/objects - UNKNOWN: - Alpha: 0.9990000128746033 - Color: 0; 176; 255 - Value: true - Visualization Type: Normal - Enabled: true - Name: Perception - - Class: rviz_common/Group - Displays: - - Class: rviz_common/Group - Displays: - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: LaneChangeLeft - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/lane_change_left - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: LaneChangeRight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/lane_change_right - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: AvoidanceLeft - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/static_obstacle_avoidance_left - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: AvoidanceRight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/static_obstacle_avoidance_right - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: AvoidanceByLCLeft - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/avoidance_by_lc_left - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: AvoidanceByLCRight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/avoidance_by_lc_right - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: StartPlanner - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/start_planner - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: GoalPlanner - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/goal_planner - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Crosswalk - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/crosswalk - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: Intersection - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/intersection - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: BlindSpot - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/blind_spot - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: TrafficLight - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/traffic_light - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: DetectionArea - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/detection_area - Value: true - - Class: rviz_default_plugins/MarkerArray - Enabled: true - Name: NoStoppingArea - Namespaces: - {} - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/debug/objects_of_interest/no_stopping_area - Value: true - Enabled: true - Name: Objects Of Interest - Enabled: true - Name: Planning - - Class: rviz_common/Group - Displays: ~ - Enabled: true - Name: Control - Enabled: false - Name: Debug - Enabled: true - Global Options: - Background Color: 15; 20; 23 - Fixed Frame: map - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /planning/mission_planning/goal - - Class: tier4_adapi_rviz_plugins::RouteTool - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /rviz/routing/rough_goal - - Acceleration: 0 - Class: rviz_plugins/PedestrianInitialPoseTool - Interactive: false - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 0 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 1 - Z std deviation: 0.029999999329447746 - - Acceleration: 0 - Class: rviz_plugins/CarInitialPoseTool - H vehicle height: 2 - Interactive: false - L vehicle length: 4 - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 3 - W vehicle width: 1.7999999523162842 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 0 - Z std deviation: 0.029999999329447746 - - Acceleration: 0 - Class: rviz_plugins/BusInitialPoseTool - H vehicle height: 3.5 - Interactive: false - L vehicle length: 10.5 - Max velocity: 33.29999923706055 - Min velocity: -33.29999923706055 - Pose Topic: /simulation/dummy_perception_publisher/object_info - Target Frame: - Theta std deviation: 0.0872664600610733 - Velocity: 0 - W vehicle width: 2.5 - X std deviation: 0.029999999329447746 - Y std deviation: 0.029999999329447746 - Z position: 0 - Z std deviation: 0.029999999329447746 - - Class: rviz_plugins/MissionCheckpointTool - Pose Topic: /planning/mission_planning/checkpoint - Theta std deviation: 0.2617993950843811 - X std deviation: 0.5 - Y std deviation: 0.5 - Z position: 0 - - Class: rviz_plugins/DeleteAllObjectsTool - Pose Topic: /simulation/dummy_perception_publisher/object_info - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Angle: 0 - Class: rviz_default_plugins/TopDownOrtho - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Scale: 10 - Target Frame: viewer - Value: TopDownOrtho (rviz_default_plugins) - X: 0 - Y: 0 - Saved: - - Class: rviz_default_plugins/ThirdPersonFollower - Distance: 18 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0 - Y: 0 - Z: 0 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: ThirdPersonFollower - Near Clip Distance: 0.009999999776482582 - Pitch: 0.20000000298023224 - Target Frame: base_link - Value: ThirdPersonFollower (rviz) - Yaw: 3.141592025756836 - - Angle: 0 - Class: rviz_default_plugins/TopDownOrtho - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Invert Z Axis: false - Name: TopDownOrtho - Near Clip Distance: 0.009999999776482582 - Scale: 10 - Target Frame: viewer - Value: TopDownOrtho (rviz) - X: 0 - Y: 0 -Window Geometry: - AutowareDateTimePanel: - collapsed: false - AutowareStatePanel: - collapsed: false - Displays: - collapsed: false - Height: 939 - Hide Left Dock: false - Hide Right Dock: false - PointcloudOnCamera: - collapsed: false - QMainWindow State: 000000ff00000000fd0000000400000000000001ef00000349fc020000000ffb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006b00fffffffb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb00000024004100750074006f00770061007200650053007400610074006500500061006e0065006c01000000440000029b0000008100fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000c00430061006d0065007200610100000682000000eb0000000000000000fb0000000a0049006d0061006700650100000505000002680000000000000000fb0000002c0049006e0069007400690061006c0050006f007300650042007500740074006f006e00500061006e0065006c000000068f000000de0000000000000000fb0000002c0049006e0069007400690061006c0050006f007300650042007500740074006f006e00500061006e0065006c000000068f000000de0000000000000000fb00000030005200650063006f0067006e006900740069006f006e0052006500730075006c0074004f006e0049006d0061006700650000000246000000c10000002c00fffffffb0000002a004100750074006f0077006100720065004400610074006500540069006d006500500061006e0065006c0000000332000000720000004600fffffffb000000240050006f0069006e00740063006c006f00750064004f006e00430061006d006500720061000000039d000000560000002c00fffffffb0000002600530069006d0075006c00610074006500640043006c006f0063006b00500061006e0065006c01000002e6000000a70000007f00ffffff00000001000001ab00000349fc0200000004fb000000100044006900730070006c006100790073010000004400000122000000eb00fffffffc0000016d00000220000000da01000020fa000000000100000002fb0000000a0056006900650077007301000005d5000001ab0000010200fffffffb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000000ffffffff000000a400fffffffb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000e7a0000005afc0100000001fb0000000a00560069006500770073030000004e00000080000002e1000001970000000300000e7a0000005afc0100000002fb0000000800540069006d0065010000000000000e7a0000000000000000fb0000000800540069006d00650100000000000004500000000000000000000003d80000034900000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - RecognitionResultOnImage: - collapsed: false - Selection: - collapsed: false - SimulatedClockPanel: - collapsed: false - Tool Properties: - collapsed: false - TrafficLightPublishPanel: - collapsed: false - Views: - collapsed: false - Width: 1920 - X: 0 - Y: 34 From 87537bd02e6479e0bb5f95d874822c8e81181c13 Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:04:13 +0900 Subject: [PATCH 104/127] chore(autoware_traffic_light_occlusion_predictor): modify docs (#9820) * fix docs Signed-off-by: MasatoSaeki * fix docs Signed-off-by: MasatoSaeki --------- Signed-off-by: MasatoSaeki --- .../README.md | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/perception/autoware_traffic_light_occlusion_predictor/README.md b/perception/autoware_traffic_light_occlusion_predictor/README.md index bc57dbea76c97..5d2e320dfc72a 100644 --- a/perception/autoware_traffic_light_occlusion_predictor/README.md +++ b/perception/autoware_traffic_light_occlusion_predictor/README.md @@ -1,8 +1,10 @@ -# The `autoware_traffic_light_occlusion_predictor` Package +# autoware_traffic_light_occlusion_predictor ## Overview `autoware_traffic_light_occlusion_predictor` receives the detected traffic lights rois and calculates the occlusion ratios of each roi with point cloud. +If that rois is judged as occlusion, color, shape, and confidence of `~/output/traffic_signals` become `UNKNOWN`, `UNKNOWN`, and `0.0`. +This node publishes when each car and pedestrian `traffic_signals` is arrived and processed. For each traffic light roi, hundreds of pixels would be selected and projected into the 3D space. Then from the camera point of view, the number of projected pixels that are occluded by the point cloud is counted and used for calculating the occlusion ratio for the roi. As shown in follow image, the red pixels are occluded and the occlusion ratio is the number of red pixels divided by the total pixel numbers. @@ -12,18 +14,20 @@ If no point cloud is received or all point clouds have very large stamp differen ## Input topics -| Name | Type | Description | -| -------------------- | ---------------------------------------------- | ------------------------ | -| `~input/vector_map` | autoware_map_msgs::msg::LaneletMapBin | vector map | -| `~/input/rois` | autoware_perception_msgs::TrafficLightRoiArray | traffic light detections | -| `~input/camera_info` | sensor_msgs::CameraInfo | target camera parameter | -| `~/input/cloud` | sensor_msgs::PointCloud2 | LiDAR point cloud | +| Name | Type | Description | +| ------------------------------------ | ------------------------------------------------ | -------------------------------- | +| `~/input/vector_map` | autoware_map_msgs::msg::LaneletMapBin | vector map | +| `~/input/car/traffic_signals` | tier4_perception_msgs::msg::TrafficLightArray | vehicular traffic light signals | +| `~/input/pedestrian/traffic_signals` | tier4_perception_msgs::msg::TrafficLightArray | pedestrian traffic light signals | +| `~/input/rois` | tier4_perception_msgs::msg::TrafficLightRoiArray | traffic light detections | +| `~/input/camera_info` | sensor_msgs::msg::CameraInfo | target camera parameter | +| `~/input/cloud` | sensor_msgs::msg::PointCloud2 | LiDAR point cloud | ## Output topics -| Name | Type | Description | -| -------------------- | ---------------------------------------------------- | ---------------------------- | -| `~/output/occlusion` | autoware_perception_msgs::TrafficLightOcclusionArray | occlusion ratios of each roi | +| Name | Type | Description | +| -------------------------- | --------------------------------------------- | -------------------------------------------------------------- | +| `~/output/traffic_signals` | tier4_perception_msgs::msg::TrafficLightArray | traffic light signals which occluded image results overwritten | ## Node parameters @@ -34,3 +38,4 @@ If no point cloud is received or all point clouds have very large stamp differen | `max_valid_pt_dist` | double | The points within this distance would be used for calculation | | `max_image_cloud_delay` | double | The maximum delay between LiDAR point cloud and camera image | | `max_wait_t` | double | The maximum time waiting for the LiDAR point cloud | +| `max_occlusion_ratio` | int | The maximum occlusion ratio for setting signal as unknown | From ab6c3b5bd159a723f7ed6836671d370a30929226 Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:04:27 +0900 Subject: [PATCH 105/127] chore(autoware_traffic_light_multi_camera_fusion): modify docs (#9821) * fix docs Signed-off-by: MasatoSaeki * add condition Signed-off-by: MasatoSaeki --------- Signed-off-by: MasatoSaeki --- .../README.md | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/perception/autoware_traffic_light_multi_camera_fusion/README.md b/perception/autoware_traffic_light_multi_camera_fusion/README.md index f7ee294cda147..b54c623f5d750 100644 --- a/perception/autoware_traffic_light_multi_camera_fusion/README.md +++ b/perception/autoware_traffic_light_multi_camera_fusion/README.md @@ -1,29 +1,36 @@ -# The `traffic_light_multi_camera_fusion` Package +# autoware_traffic_light_multi_camera_fusion ## Overview -`traffic_light_multi_camera_fusion` performs traffic light signal fusion which can be summarized as the following two tasks: +`autoware_traffic_light_multi_camera_fusion` performs traffic light signal fusion which can be summarized as the following two tasks: -1. Multi-Camera-Fusion: performed on single traffic light signal detected by different cameras. -2. Group-Fusion: performed on traffic light signals within the same group, which means traffic lights sharing the same regulatory element id defined in lanelet2 map. +1. Multi-Camera-Fusion: fusion each traffic light signal detected by different cameras. +2. Group-Fusion: Fusion each traffic light signal within the same group, which means traffic lights share the same regulatory element ID defined in lanelet2 map. + +The fusion method is below. + +1. Use the results of the new timestamp if the results are from the same sensor +2. Use the results that are not `elements.size() == 1 && color == UNKNOWN && shape == UNKNOWN` +3. Use the results that each vertex of ROI is not at the edge of the image +4. Use the results of high confidence ## Input topics For every camera, the following three topics are subscribed: -| Name | Type | Description | -| -------------------------------------- | ---------------------------------------------- | --------------------------------------------------- | -| `~//camera_info` | sensor_msgs::CameraInfo | camera info from traffic_light_map_based_detector | -| `~//rois` | tier4_perception_msgs::TrafficLightRoiArray | detection roi from traffic_light_fine_detector | -| `~//traffic_signals` | tier4_perception_msgs::TrafficLightSignalArray | classification result from traffic_light_classifier | +| Name | Type | Description | +| ----------------------------------------------------- | ------------------------------------------------ | ------------------------------------- | +| `~//camera_info` | sensor_msgs::msg::CameraInfo | camera info from map_based_detector | +| `~//detection/rois` | tier4_perception_msgs::msg::TrafficLightRoiArray | detection roi from fine_detector | +| `~//classification/traffic_signals` | tier4_perception_msgs::msg::TrafficLightArray | classification result from classifier | You don't need to configure these topics manually. Just provide the `camera_namespaces` parameter and the node will automatically extract the `` and create the subscribers. ## Output topics -| Name | Type | Description | -| -------------------------- | ------------------------------------------------- | ---------------------------------- | -| `~/output/traffic_signals` | autoware_perception_msgs::TrafficLightSignalArray | traffic light signal fusion result | +| Name | Type | Description | +| -------------------------- | ----------------------------------------------------- | ---------------------------------- | +| `~/output/traffic_signals` | autoware_perception_msgs::msg::TrafficLightGroupArray | traffic light signal fusion result | ## Node parameters From 65f6417db4bf4bda100eb961a841f6d31c94c05b Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:04:41 +0900 Subject: [PATCH 106/127] chore(autoware_traffic_light_classifier): modify docs (#9819) * modify docs Signed-off-by: MasatoSaeki * style(pre-commit): autofix * fix docs Signed-off-by: MasatoSaeki --------- Signed-off-by: MasatoSaeki Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../README.md | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/perception/autoware_traffic_light_classifier/README.md b/perception/autoware_traffic_light_classifier/README.md index 6e720aabc7593..7dcd4a73380bb 100644 --- a/perception/autoware_traffic_light_classifier/README.md +++ b/perception/autoware_traffic_light_classifier/README.md @@ -1,22 +1,33 @@ -# traffic_light_classifier +# autoware_traffic_light_classifier ## Purpose -traffic_light_classifier is a package for classifying traffic light labels using cropped image around a traffic light. This package has two classifier models: `cnn_classifier` and `hsv_classifier`. +`autoware_traffic_light_classifier` is a package for classifying traffic light labels using cropped image around a traffic light. This package has two classifier models: `cnn_classifier` and `hsv_classifier`. ## Inner-workings / Algorithms +If height and width of `~/input/rois` is `0`, color, shape, and confidence of `~/output/traffic_signals` become `UNKNOWN`, `CIRCLE`, and `0.0`. +If `~/input/rois` is judged as backlight, color, shape, and confidence of `~/output/traffic_signals` become `UNKNOWN`, `UNKNOWN`, and `0.0`. + ### cnn_classifier -Traffic light labels are classified by EfficientNet-b1 or MobileNet-v2. -Totally 83400 (58600 for training, 14800 for evaluation and 10000 for test) TIER IV internal images of Japanese traffic lights were used for fine-tuning. -The information of the models is listed here: +Traffic light labels are classified by EfficientNet-b1 or MobileNet-v2. +We trained classifiers for vehicular signals and pedestrian signals separately. +For vehicular signals, a total of 83400 (58600 for training, 14800 for evaluation and 10000 for test) TIER IV internal images of Japanese traffic lights were used for fine-tuning. | Name | Input Size | Test Accuracy | | --------------- | ---------- | ------------- | | EfficientNet-b1 | 128 x 128 | 99.76% | | MobileNet-v2 | 224 x 224 | 99.81% | +For pedestrian signals, a total of 21199 (17860 for training, 2114 for evaluation and 1225 for test) TIER IV internal images of Japanese traffic lights were used for fine-tuning. +The information of the models is listed here: + +| Name | Input Size | Test Accuracy | +| --------------- | ---------- | ------------- | +| EfficientNet-b1 | 128 x 128 | 97.89% | +| MobileNet-v2 | 224 x 224 | 99.10% | + ### hsv_classifier Traffic light colors (green, yellow and red) are classified in HSV model. @@ -52,11 +63,12 @@ These colors and shapes are assigned to the message as follows: ### Node Parameters -| Name | Type | Description | -| --------------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `classifier_type` | int | if the value is `1`, cnn_classifier is used | -| `data_path` | str | packages data and artifacts directory path | -| `backlight_threshold` | float | If the intensity get grater than this overwrite with UNKNOWN in corresponding RoI. Note that, if the value is much higher, the node only overwrites in the harsher backlight situations. Therefore, If you wouldn't like to use this feature set this value to `1.0`. The value can be `[0.0, 1.0]`. The confidence of overwritten signal is set to `0.0`. | +| Name | Type | Description | +| ----------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `classifier_type` | int | If the value is `1`, cnn_classifier is used | +| `data_path` | str | Packages data and artifacts directory path | +| `backlight_threshold` | double | If the intensity of light is grater than this threshold, the color and shape of the corresponding ROI will be overwritten with UNKNOWN, and the confidence of the overwritten signal will be set to `0.0`. The value should be set in the range of `[0.0, 1.0]`. If you wouldn't like to use this feature, please set it to `1.0`. | +| `classify_traffic_light_type` | int | If the value is `0`, vehicular signals are classified. If the value is `1`, pedestrian signals are classified. | ### Core Parameters From b69241f6659c042a05bc9362c3d254e25fbaa290 Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:04:56 +0900 Subject: [PATCH 107/127] chore(autoware_crosswalk_traffic_light_estimator): fix docs (#9822) * fix docs Signed-off-by: MasatoSaeki * fix docs Signed-off-by: MasatoSaeki * add tlr output image Signed-off-by: MasatoSaeki * modify sentense Signed-off-by: MasatoSaeki * modify sentense Signed-off-by: MasatoSaeki * refactor readme Signed-off-by: MasatoSaeki * fix docs Signed-off-by: MasatoSaeki * fix Signed-off-by: MasatoSaeki * style(pre-commit): autofix --------- Signed-off-by: MasatoSaeki Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../README.md | 81 ++++++++++++++---- .../images/flashing_state.png | Bin 0 -> 24574 bytes .../images/traffic_light.png | Bin 0 -> 54297 bytes 3 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 perception/autoware_crosswalk_traffic_light_estimator/images/flashing_state.png create mode 100644 perception/autoware_crosswalk_traffic_light_estimator/images/traffic_light.png diff --git a/perception/autoware_crosswalk_traffic_light_estimator/README.md b/perception/autoware_crosswalk_traffic_light_estimator/README.md index b14fefbd43beb..1b24b115f5812 100644 --- a/perception/autoware_crosswalk_traffic_light_estimator/README.md +++ b/perception/autoware_crosswalk_traffic_light_estimator/README.md @@ -1,40 +1,85 @@ -# crosswalk_traffic_light_estimator +# autoware_crosswalk_traffic_light_estimator ## Purpose -`crosswalk_traffic_light_estimator` is a module that estimates pedestrian traffic signals from HDMap and detected vehicle traffic signals. +`autoware_crosswalk_traffic_light_estimator` estimates pedestrian traffic signals which can be summarized as the following two tasks: + +- Estimate pedestrian traffic signals that are not subject to be detected by perception pipeline. +- Estimate whether pedestrian traffic signals are flashing and modify the result. + +This module works without `~/input/route`, but its behavior is outputting the subscribed results as is. ## Inputs / Outputs ### Input -| Name | Type | Description | -| ------------------------------------ | ------------------------------------------------ | ------------------ | -| `~/input/vector_map` | `autoware_map_msgs::msg::LaneletMapBin` | vector map | -| `~/input/route` | `autoware_planning_msgs::msg::LaneletRoute` | route | -| `~/input/classified/traffic_signals` | `tier4_perception_msgs::msg::TrafficSignalArray` | classified signals | +| Name | Type | Description | +| ------------------------------------ | ----------------------------------------------------- | ------------------ | +| `~/input/vector_map` | autoware_map_msgs::msg::LaneletMapBin | vector map | +| `~/input/route` | autoware_planning_msgs::msg::LaneletRoute | optional: route | +| `~/input/classified/traffic_signals` | autoware_perception_msgs::msg::TrafficLightGroupArray | classified signals | ### Output -| Name | Type | Description | -| -------------------------- | ------------------------------------------------------- | --------------------------------------------------------- | -| `~/output/traffic_signals` | `autoware_perception_msgs::msg::TrafficLightGroupArray` | output that contains estimated pedestrian traffic signals | +| Name | Type | Description | +| -------------------------- | ----------------------------------------------------- | --------------------------------------------------------- | +| `~/output/traffic_signals` | autoware_perception_msgs::msg::TrafficLightGroupArray | output that contains estimated pedestrian traffic signals | ## Parameters -| Name | Type | Description | Default value | -| :---------------------------- | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------ | -| `use_last_detect_color` | `bool` | If this parameter is `true`, this module estimates pedestrian's traffic signal as RED not only when vehicle's traffic signal is detected as GREEN/AMBER but also when detection results change GREEN/AMBER to UNKNOWN. (If detection results change RED or AMBER to UNKNOWN, this module estimates pedestrian's traffic signal as UNKNOWN.) If this parameter is `false`, this module use only latest detection results for estimation. (Only when the detection result is GREEN/AMBER, this module estimates pedestrian's traffic signal as RED.) | `true` | -| `last_detect_color_hold_time` | `double` | The time threshold to hold for last detect color. | `2.0` | +| Name | Type | Description | Default value | +| :---------------------------- | :----- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------ | +| `use_last_detect_color` | bool | If this parameter is `true`, this module estimates pedestrian's traffic signal as RED not only when vehicle's traffic signal is detected as GREEN/AMBER but also when detection results change GREEN/AMBER to UNKNOWN. (If detection results change RED or AMBER to UNKNOWN, this module estimates pedestrian's traffic signal as UNKNOWN.) If this parameter is `false`, this module use only latest detection results for estimation. (Only when the detection result is GREEN/AMBER, this module estimates pedestrian's traffic signal as RED.) | true | +| `last_detect_color_hold_time` | double | The time threshold to hold for last detect color. The unit is second. | 2.0 | +| `last_colors_hold_time` | double | The time threshold to hold for history detected pedestrian traffic light color. The unit is second. | 1.0 | ## Inner-workings / Algorithms +When the pedestrian traffic signals **are detected** by perception pipeline + +- If estimates the pedestrian traffic signals are flashing, overwrite the results +- Prefer the output from perception pipeline, but overwrite it if the pedestrian traffic signals are invalid(`no detection`, `backlight`, or `occlusion`) + +When the pedestrian traffic signals **are NOT detected** by perception pipeline + +- Estimate the color of pedestrian traffic signals based on detected vehicle traffic signals, HDMap, and route + +### Estimate whether pedestrian traffic signals are flashing + +```plantumul +start +if (the pedestrian traffic light classification result exists)then + : update the flashing flag according to the classification result(in_signal) and last_signals + if (the traffic light is flashing?)then(yes) + : update the traffic light state + else(no) + : the traffic light state is the same with the classification result +if (the classification result not exists) + : the traffic light state is the same with the estimation + : output the current traffic light state +end +``` + +#### Update flashing flag + +

+ +
+ +#### Update traffic light status + +
+ +
+ +### Estimate the color of pedestrian traffic signals + ```plantuml start -:subscribe detected traffic signals & HDMap; +:subscribe detected traffic signals, HDMap, and route; :extract crosswalk lanelets from HDMap; -:extract road lanelets that conflicts crosswalk; +:extract road lanelets that conflicts crosswalk from route; :initialize non_red_lanelets(lanelet::ConstLanelets); if (Latest detection result is **GREEN** or **AMBER**?) then (yes) :push back non_red_lanelets; @@ -58,7 +103,7 @@ end If traffic between pedestrians and vehicles is controlled by traffic signals, the crosswalk traffic signal maybe **RED** in order to prevent pedestrian from crossing when the following conditions are satisfied. -### Situation1 +#### Situation1 - crosswalk conflicts **STRAIGHT** lanelet - the lanelet refers **GREEN** or **AMBER** traffic signal (The following pictures show only **GREEN** case) @@ -70,7 +115,7 @@ If traffic between pedestrians and vehicles is controlled by traffic signals, th -### Situation2 +#### Situation2 - crosswalk conflicts different turn direction lanelets (STRAIGHT and LEFT, LEFT and RIGHT, RIGHT and STRAIGHT) - the lanelets refer **GREEN** or **AMBER** traffic signal (The following pictures show only **GREEN** case) diff --git a/perception/autoware_crosswalk_traffic_light_estimator/images/flashing_state.png b/perception/autoware_crosswalk_traffic_light_estimator/images/flashing_state.png new file mode 100644 index 0000000000000000000000000000000000000000..7686f3842e75c92cfd27f9de08ef1ecf6eb3651f GIT binary patch literal 24574 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⁣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�qx~ik1hIyx34MrGbm-3 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 literal 0 HcmV?d00001 From a2755a4926c41618c2fbd4da41324f46cca0b7f8 Mon Sep 17 00:00:00 2001 From: Ryuta Kambe Date: Thu, 16 Jan 2025 10:01:43 +0900 Subject: [PATCH 108/127] fix(mrm_handler): simplify hazard command choice (#9929) Signed-off-by: Ryuta Kambe --- system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp b/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp index 4022bdaadebef..b5f4bbaeefc46 100644 --- a/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp +++ b/system/mrm_handler/src/mrm_handler/mrm_handler_core.cpp @@ -115,12 +115,7 @@ void MrmHandler::publishHazardCmd() HazardLightsCommand msg; msg.stamp = this->now(); - if (is_emergency_holding_) { - // turn hazard on during emergency holding - msg.command = HazardLightsCommand::ENABLE; - } else if (isEmergency() && param_.turning_hazard_on.emergency) { - // turn hazard on if vehicle is in emergency state and - // turning hazard on if emergency flag is true + if (param_.turning_hazard_on.emergency && isEmergency()) { msg.command = HazardLightsCommand::ENABLE; } else { msg.command = HazardLightsCommand::NO_COMMAND; From 347a2e48109452c70447ce219a207b5fd75591f1 Mon Sep 17 00:00:00 2001 From: Kosuke Takeuchi Date: Thu, 16 Jan 2025 13:34:45 +0900 Subject: [PATCH 109/127] fix(goal_planner): fix geometric pull over (#9932) Signed-off-by: kosuke55 --- .../src/pull_over_planner/geometric_pull_over.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp index bf2ce86b49bab..44dca13ccfd66 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp @@ -28,6 +28,7 @@ namespace autoware::behavior_path_planner GeometricPullOver::GeometricPullOver( rclcpp::Node & node, const GoalPlannerParameters & parameters, const bool is_forward) : PullOverPlannerBase{node, parameters}, + parallel_parking_parameters_{parameters.parallel_parking_parameters}, lane_departure_checker_{ lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_}, is_forward_{is_forward}, From e09193784833044b8597c4d3dd7dda9bf169de74 Mon Sep 17 00:00:00 2001 From: mkquda <168697710+mkquda@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:51:37 +0900 Subject: [PATCH 110/127] feat(lane_change): ensure path generation doesn't exceed time limit (#9908) * add time limit for lane change candidate path generation Signed-off-by: mohammad alqudah * apply time limit for frenet method as well Signed-off-by: mohammad alqudah * ensure param update value is valid Signed-off-by: mohammad alqudah * fix param update initial value Signed-off-by: mohammad alqudah * fix spelling Signed-off-by: mohammad alqudah * fix param update initial values Signed-off-by: mohammad alqudah --------- Signed-off-by: mohammad alqudah --- .../README.md | 1 + .../config/lane_change.param.yaml | 1 + .../structs/parameters.hpp | 1 + .../src/manager.cpp | 52 +++++++++++++------ .../src/scene.cpp | 18 +++++-- 5 files changed, 52 insertions(+), 21 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index ee371f8592833..20fd564049133 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -1039,6 +1039,7 @@ The following parameters are configurable in [lane_change.param.yaml](https://gi | Name | Unit | Type | Description | Default value | | :------------------------------------------- | ------ | ------ | ---------------------------------------------------------------------------------------------------------------------- | ------------------ | +| `time_limit` | [ms] | double | Time limit for lane change candidate path generation | 50.0 | | `backward_lane_length` | [m] | double | The backward length to check incoming objects in lane change target lane. | 200.0 | | `backward_length_buffer_for_end_of_lane` | [m] | double | The end of lane buffer to ensure ego vehicle has enough distance to start lane change | 3.0 | | `backward_length_buffer_for_blocking_object` | [m] | double | The end of lane buffer to ensure ego vehicle has enough distance to start lane change when there is an object in front | 3.0 | diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml index df9491576a4ee..15eb23daecf95 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml @@ -1,6 +1,7 @@ /**: ros__parameters: lane_change: + time_limit: 50.0 # [ms] backward_lane_length: 200.0 backward_length_buffer_for_end_of_lane: 3.0 # [m] backward_length_buffer_for_blocking_object: 3.0 # [m] diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp index f0adcb1d69b42..60386f535fc64 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp @@ -162,6 +162,7 @@ struct Parameters FrenetPlannerParameters frenet{}; // lane change parameters + double time_limit{50.0}; double backward_lane_length{200.0}; double backward_length_buffer_for_end_of_lane{0.0}; double backward_length_buffer_for_blocking_object{0.0}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index 07b05ab0ea131..f26cf79e8b120 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -190,6 +190,7 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s } // lane change parameters + p.time_limit = getOrDeclareParameter(*node, parameter("time_limit")); p.backward_lane_length = getOrDeclareParameter(*node, parameter("backward_lane_length")); p.backward_length_buffer_for_end_of_lane = getOrDeclareParameter(*node, parameter("backward_length_buffer_for_end_of_lane")); @@ -313,6 +314,17 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortime_limit; + updateParam(parameters, ns + "time_limit", time_limit); + if (time_limit >= 10.0) { + p->time_limit = time_limit; + } else { + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "WARNING! Parameter 'time_limit' is not updated because the value (%.3f ms) is not valid, " + "keep current value (%.3f ms)", + time_limit, p->time_limit); + } updateParam(parameters, ns + "backward_lane_length", p->backward_lane_length); updateParam( parameters, ns + "backward_length_buffer_for_end_of_lane", @@ -349,25 +361,27 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortrajectory.lane_changing_decel_factor); updateParam( parameters, ns + "th_prepare_curvature", p->trajectory.th_prepare_curvature); - int longitudinal_acc_sampling_num = 0; + int longitudinal_acc_sampling_num = p->trajectory.lon_acc_sampling_num; updateParam(parameters, ns + "lon_acc_sampling_num", longitudinal_acc_sampling_num); if (longitudinal_acc_sampling_num > 0) { p->trajectory.lon_acc_sampling_num = longitudinal_acc_sampling_num; } else { - RCLCPP_WARN_ONCE( - node_->get_logger(), - "Parameter 'lon_acc_sampling_num' is not updated because the value (%d) is not positive", + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "WARNING! Parameter 'lon_acc_sampling_num' is not updated because the value (%d) is not " + "positive", longitudinal_acc_sampling_num); } - int lateral_acc_sampling_num = 0; + int lateral_acc_sampling_num = p->trajectory.lat_acc_sampling_num; updateParam(parameters, ns + "lat_acc_sampling_num", lateral_acc_sampling_num); if (lateral_acc_sampling_num > 0) { p->trajectory.lat_acc_sampling_num = lateral_acc_sampling_num; } else { - RCLCPP_WARN_ONCE( - node_->get_logger(), - "Parameter 'lat_acc_sampling_num' is not updated because the value (%d) is not positive", + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "WARNING! Parameter 'lat_acc_sampling_num' is not updated because the value (%d) is not " + "positive", lateral_acc_sampling_num); } @@ -409,8 +423,8 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectortrajectory.lat_acc_map = lat_acc_map; } else { - RCLCPP_WARN_ONCE( - node_->get_logger(), + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, "Mismatched size for lateral acceleration. Expected size: %lu, but velocity: %lu, " "min_values: %lu, max_values: %lu", std::max(2ul, velocity.size()), velocity.size(), min_values.size(), max_values.size()); @@ -515,28 +529,32 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectorcancel.enable_on_prepare_phase; updateParam(parameters, ns + "enable_on_prepare_phase", enable_on_prepare_phase); if (!enable_on_prepare_phase) { - RCLCPP_WARN_ONCE(node_->get_logger(), "WARNING! Lane Change cancel function is disabled."); + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "WARNING! Lane Change cancel function is disabled."); p->cancel.enable_on_prepare_phase = enable_on_prepare_phase; } - bool enable_on_lane_changing_phase = true; + bool enable_on_lane_changing_phase = p->cancel.enable_on_lane_changing_phase; updateParam( parameters, ns + "enable_on_lane_changing_phase", enable_on_lane_changing_phase); if (!enable_on_lane_changing_phase) { - RCLCPP_WARN_ONCE(node_->get_logger(), "WARNING! Lane Change abort function is disabled."); + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "WARNING! Lane Change abort function is disabled."); p->cancel.enable_on_lane_changing_phase = enable_on_lane_changing_phase; } - int deceleration_sampling_num = 0; + int deceleration_sampling_num = p->cancel.deceleration_sampling_num; updateParam(parameters, ns + "deceleration_sampling_num", deceleration_sampling_num); if (deceleration_sampling_num > 0) { p->cancel.deceleration_sampling_num = deceleration_sampling_num; } else { - RCLCPP_WARN_ONCE( - node_->get_logger(), + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, "Parameter 'deceleration_sampling_num' is not updated because the value (%d) is not " "positive", deceleration_sampling_num); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 7748795851865..45fcd6fa99086 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -1154,18 +1154,22 @@ bool NormalLaneChange::get_path_using_frenet( const std::vector> & sorted_lane_ids, LaneChangePaths & candidate_paths) const { - stop_watch_.tic("frenet_candidates"); + stop_watch_.tic(__func__); constexpr auto found_safe_path = true; const auto frenet_candidates = utils::lane_change::generate_frenet_candidates( common_data_ptr_, prev_module_output_.path, prepare_metrics); RCLCPP_DEBUG( logger_, "Generated %lu candidate paths in %2.2f[us]", frenet_candidates.size(), - stop_watch_.toc("frenet_candidates")); + stop_watch_.toc(__func__)); candidate_paths.reserve(frenet_candidates.size()); lane_change_debug_.frenet_states.clear(); lane_change_debug_.frenet_states.reserve(frenet_candidates.size()); for (const auto & frenet_candidate : frenet_candidates) { + if (stop_watch_.toc(__func__) >= lane_change_parameters_->time_limit) { + break; + } + lane_change_debug_.frenet_states.emplace_back( frenet_candidate.prepare_metric, frenet_candidate.lane_changing.sampling_parameter, frenet_candidate.max_lane_changing_length); @@ -1186,7 +1190,7 @@ bool NormalLaneChange::get_path_using_frenet( if (check_candidate_path_safety(*candidate_path_opt, target_objects)) { RCLCPP_DEBUG( logger_, "Found safe path after %lu candidate(s). Total time: %2.2f[us]", - frenet_candidates.size(), stop_watch_.toc("frenet_candidates")); + frenet_candidates.size(), stop_watch_.toc("__func__")); utils::lane_change::append_target_ref_to_candidate( *candidate_path_opt, common_data_ptr_->lc_param_ptr->frenet.th_curvature_smoothing); candidate_paths.push_back(*candidate_path_opt); @@ -1204,7 +1208,7 @@ bool NormalLaneChange::get_path_using_frenet( RCLCPP_DEBUG( logger_, "No safe path after %lu candidate(s). Total time: %2.2f[us]", frenet_candidates.size(), - stop_watch_.toc("frenet_candidates")); + stop_watch_.toc(__func__)); return !found_safe_path; } @@ -1214,6 +1218,7 @@ bool NormalLaneChange::get_path_using_path_shifter( const std::vector> & sorted_lane_ids, LaneChangePaths & candidate_paths) const { + stop_watch_.tic(__func__); const auto & target_lanes = get_target_lanes(); candidate_paths.reserve( prepare_metrics.size() * lane_change_parameters_->trajectory.lat_acc_sampling_num); @@ -1279,6 +1284,11 @@ bool NormalLaneChange::get_path_using_path_shifter( prepare_segment, common_data_ptr_->get_ego_speed(), prep_metric.velocity); for (const auto & lc_metric : lane_changing_metrics) { + if (stop_watch_.toc(__func__) >= lane_change_parameters_->time_limit) { + RCLCPP_DEBUG(logger_, "Time limit reached and no safe path was found."); + return false; + } + debug_metrics.lc_metrics.emplace_back(lc_metric, -1); const auto debug_print_lat = [&](const std::string & s) { From 099591a740cec19de99c4590f7b468ab9e1d5572 Mon Sep 17 00:00:00 2001 From: Fumiya Watanabe Date: Thu, 16 Jan 2025 14:01:58 +0900 Subject: [PATCH 111/127] chore(simple_planning_simulator): add maintainer (#9934) --- .github/CODEOWNERS | 2 +- simulator/simple_planning_simulator/package.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5bbc4d1c6177b..4fea7c85e1926 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -204,7 +204,7 @@ simulator/autoware_carla_interface/** maxime.clement@tier4.jp mradityagio@gmail. simulator/dummy_perception_publisher/** yukihiro.saito@tier4.jp simulator/fault_injection/** keisuke.shima@tier4.jp simulator/learning_based_vehicle_model/** maxime.clement@tier4.jp nagy.tomas@tier4.jp -simulator/simple_planning_simulator/** mamoru.sobue@tier4.jp maxime.clement@tier4.jp takamasa.horibe@tier4.jp temkei.kem@tier4.jp tomoya.kimura@tier4.jp zulfaqar.azmi@tier4.jp +simulator/simple_planning_simulator/** mamoru.sobue@tier4.jp maxime.clement@tier4.jp takamasa.horibe@tier4.jp temkei.kem@tier4.jp tomoya.kimura@tier4.jp zulfaqar.azmi@tier4.jp kotaro.yoshimoto@tier4.jp simulator/tier4_dummy_object_rviz_plugin/** yukihiro.saito@tier4.jp simulator/vehicle_door_simulator/** isamu.takagi@tier4.jp system/autoware_component_monitor/** baris@leodrive.ai memin@leodrive.ai yavuz@leodrive.ai diff --git a/simulator/simple_planning_simulator/package.xml b/simulator/simple_planning_simulator/package.xml index fdc782182f9a5..5bd7a2f74eacc 100644 --- a/simulator/simple_planning_simulator/package.xml +++ b/simulator/simple_planning_simulator/package.xml @@ -10,6 +10,7 @@ Mamoru Sobue Zulfaqar Azmi Temkei Kem + Kotaro Yoshimoto Apache License 2.0 ament_cmake_auto From 01a764782c86e614a27808b973d073c12da2217e Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Thu, 16 Jan 2025 14:23:18 +0900 Subject: [PATCH 112/127] feat(autoware_shape_estimation): tier4_debug_msgs chnaged to autoware_internal_debug_msgs in autoware_shape_estimation (#9897) feat: tier4_debug_msgs chnaged to autoware_internal_debug_msgs in files perception/autoware_shape_estimation Signed-off-by: vish0012 --- .../autoware_shape_estimation/src/shape_estimation_node.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/perception/autoware_shape_estimation/src/shape_estimation_node.cpp b/perception/autoware_shape_estimation/src/shape_estimation_node.cpp index c5450dc14adb0..28b2a6e398e91 100644 --- a/perception/autoware_shape_estimation/src/shape_estimation_node.cpp +++ b/perception/autoware_shape_estimation/src/shape_estimation_node.cpp @@ -179,9 +179,9 @@ void ShapeEstimationNode::callback(const DetectedObjectsWithFeature::ConstShared // Publish pub_->publish(output_msg); published_time_publisher_->publish_if_subscribed(pub_, output_msg.header.stamp); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/cyclic_time_ms", stop_watch_ptr_->toc("cyclic_time", true)); - processing_time_publisher_->publish( + processing_time_publisher_->publish( "debug/processing_time_ms", stop_watch_ptr_->toc("processing_time", true)); } } // namespace autoware::shape_estimation From 415e1ec0bc0e1a7f446c664f4161a1219f48ca36 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 16 Jan 2025 17:27:22 +0900 Subject: [PATCH 113/127] fix: remove unnecessary parameters (#9935) Signed-off-by: Takayuki Murooka --- .../autoware_pid_longitudinal_controller/README.md | 2 -- .../param/lateral/mpc.param.yaml | 2 -- .../param/longitudinal/pid.param.yaml | 2 -- .../config/crosswalk.param.yaml | 2 -- .../README.md | 13 ++++++------- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/control/autoware_pid_longitudinal_controller/README.md b/control/autoware_pid_longitudinal_controller/README.md index aba0f36f04d65..957379866b62a 100644 --- a/control/autoware_pid_longitudinal_controller/README.md +++ b/control/autoware_pid_longitudinal_controller/README.md @@ -195,8 +195,6 @@ AutonomouStuff Lexus RX 450h for under 40 km/h driving. | stopped_state_entry_vel | double | threshold of the ego velocity in transition to the STOPPED state [m/s] | 0.01 | | stopped_state_entry_acc | double | threshold of the ego acceleration in transition to the STOPPED state [m/s^2] | 0.1 | | emergency_state_overshoot_stop_dist | double | If `enable_overshoot_emergency` is true and the ego is `emergency_state_overshoot_stop_dist`-meter ahead of the stop point, the state will transit to EMERGENCY. [m] | 1.5 | -| emergency_state_traj_trans_dev | double | If the ego's position is `emergency_state_traj_tran_dev` meter away from the nearest trajectory point, the state will transit to EMERGENCY. [m] | 3.0 | -| emergency_state_traj_rot_dev | double | If the ego's orientation is `emergency_state_traj_rot_dev` rad away from the nearest trajectory point orientation, the state will transit to EMERGENCY. [rad] | 0.784 | ### DRIVE Parameter diff --git a/control/autoware_trajectory_follower_node/param/lateral/mpc.param.yaml b/control/autoware_trajectory_follower_node/param/lateral/mpc.param.yaml index b358e95f86f99..1d30a28d05cb8 100644 --- a/control/autoware_trajectory_follower_node/param/lateral/mpc.param.yaml +++ b/control/autoware_trajectory_follower_node/param/lateral/mpc.param.yaml @@ -3,8 +3,6 @@ # -- system -- traj_resample_dist: 0.1 # path resampling interval [m] use_steer_prediction: false # flag for using steer prediction (do not use steer measurement) - admissible_position_error: 5.0 # stop mpc calculation when error is larger than the following value - admissible_yaw_error_rad: 1.57 # stop mpc calculation when error is larger than the following value use_delayed_initial_state: true # flag to use x0_delayed as initial state for predicted trajectory # -- path smoothing -- diff --git a/control/autoware_trajectory_follower_node/param/longitudinal/pid.param.yaml b/control/autoware_trajectory_follower_node/param/longitudinal/pid.param.yaml index 5c5d65a13b2d5..f3139308db37c 100644 --- a/control/autoware_trajectory_follower_node/param/longitudinal/pid.param.yaml +++ b/control/autoware_trajectory_follower_node/param/longitudinal/pid.param.yaml @@ -16,8 +16,6 @@ stopped_state_entry_vel: 0.01 stopped_state_entry_acc: 0.1 emergency_state_overshoot_stop_dist: 1.5 - emergency_state_traj_trans_dev: 3.0 - emergency_state_traj_rot_dev: 0.7854 # drive state kp: 1.0 diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/config/crosswalk.param.yaml b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/config/crosswalk.param.yaml index bc0d4f613f10b..97e00ade8256c 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/config/crosswalk.param.yaml +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/config/crosswalk.param.yaml @@ -13,8 +13,6 @@ # For the Lanelet2 map with no explicit stop lines stop_distance_from_crosswalk: 3.5 # [m] make stop line away from crosswalk - # For the case where the crosswalk width is very wide - far_object_threshold: 10.0 # [m] If objects cross X meters behind the stop line, the stop position is determined according to the object position (stop_distance_from_object meters before the object). # For the case where the stop position is determined according to the object position. stop_distance_from_object_preferred: 3.0 # [m] stop_distance_from_object_limit: 3.0 # [m] diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md index efe4a9a353ecc..963d75e5a8492 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/README.md @@ -12,13 +12,12 @@ This module is activated when there is a stop line in a target lane. ## Module Parameters -| Parameter | Type | Description | -| -------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `stop_margin` | double | Margin that the vehicle tries to stop in before stop_line | -| `stop_duration_sec` | double | [s] Time parameter for the ego vehicle to stop before stop line | -| `hold_stop_margin_distance` | double | [m] Parameter for restart prevention (See Algorithm section). Also, when the ego vehicle is within this distance from a stop line, the ego state becomes STOPPED from APPROACHING | -| `use_initialization_stop_state` | bool | Flag to determine whether to return to the approaching state when the vehicle moves away from a stop line. | -| `show_stop_line_collision_check` | bool | Flag to determine whether to show the debug information of collision check with a stop line | +| Parameter | Type | Description | +| ------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `stop_margin` | double | Margin that the vehicle tries to stop in before stop_line | +| `stop_duration_sec` | double | [s] Time parameter for the ego vehicle to stop before stop line | +| `hold_stop_margin_distance` | double | [m] Parameter for restart prevention (See Algorithm section). Also, when the ego vehicle is within this distance from a stop line, the ego state becomes STOPPED from APPROACHING | +| `use_initialization_stop_state` | bool | Flag to determine whether to return to the approaching state when the vehicle moves away from a stop line. | ## Inner-workings / Algorithms From cb33b74ccd35b9b29bc11daf83209d9db72c6ab4 Mon Sep 17 00:00:00 2001 From: Takayuki Murooka Date: Thu, 16 Jan 2025 17:27:46 +0900 Subject: [PATCH 114/127] feat(velocity_smoother): introduce diagnostics (#9933) * feat(velocity_smoother): introduce diagnostics Signed-off-by: Takayuki Murooka * fix Signed-off-by: Takayuki Murooka --------- Signed-off-by: Takayuki Murooka --- .../include/autoware/velocity_smoother/node.hpp | 11 ++++++----- .../autoware_velocity_smoother/src/node.cpp | 17 +++++++++-------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/planning/autoware_velocity_smoother/include/autoware/velocity_smoother/node.hpp b/planning/autoware_velocity_smoother/include/autoware/velocity_smoother/node.hpp index fc0066b1a84f3..d519356c7aa18 100644 --- a/planning/autoware_velocity_smoother/include/autoware/velocity_smoother/node.hpp +++ b/planning/autoware_velocity_smoother/include/autoware/velocity_smoother/node.hpp @@ -20,6 +20,7 @@ #include "autoware/osqp_interface/osqp_interface.hpp" #include "autoware/universe_utils/geometry/geometry.hpp" #include "autoware/universe_utils/math/unit_conversion.hpp" +#include "autoware/universe_utils/ros/diagnostics_interface.hpp" #include "autoware/universe_utils/ros/logger_level_configure.hpp" #include "autoware/universe_utils/ros/polling_subscriber.hpp" #include "autoware/universe_utils/ros/self_pose_listener.hpp" @@ -45,8 +46,7 @@ #include "autoware_planning_msgs/msg/trajectory_point.hpp" #include "geometry_msgs/msg/accel_with_covariance_stamped.hpp" #include "nav_msgs/msg/odometry.hpp" -#include "tier4_planning_msgs/msg/stop_speed_exceeded.hpp" // temporary -#include "tier4_planning_msgs/msg/velocity_limit.hpp" // temporary +#include "tier4_planning_msgs/msg/velocity_limit.hpp" // temporary #include "visualization_msgs/msg/marker_array.hpp" #include @@ -61,6 +61,7 @@ namespace autoware::velocity_smoother using autoware_planning_msgs::msg::Trajectory; using autoware_planning_msgs::msg::TrajectoryPoint; using TrajectoryPoints = std::vector; +using autoware::universe_utils::DiagnosticsInterface; using autoware_adapi_v1_msgs::msg::OperationModeState; using autoware_internal_debug_msgs::msg::Float32Stamped; using autoware_internal_debug_msgs::msg::Float64Stamped; @@ -68,8 +69,7 @@ using geometry_msgs::msg::AccelWithCovarianceStamped; using geometry_msgs::msg::Pose; using geometry_msgs::msg::PoseStamped; using nav_msgs::msg::Odometry; -using tier4_planning_msgs::msg::StopSpeedExceeded; // temporary -using tier4_planning_msgs::msg::VelocityLimit; // temporary +using tier4_planning_msgs::msg::VelocityLimit; // temporary using visualization_msgs::msg::MarkerArray; struct Motion @@ -89,7 +89,6 @@ class VelocitySmootherNode : public rclcpp::Node private: rclcpp::Publisher::SharedPtr pub_trajectory_; rclcpp::Publisher::SharedPtr pub_virtual_wall_; - rclcpp::Publisher::SharedPtr pub_over_stop_velocity_; rclcpp::Subscription::SharedPtr sub_current_trajectory_; autoware::universe_utils::InterProcessPollingSubscriber sub_current_odometry_{ this, "/localization/kinematic_state"}; @@ -290,6 +289,8 @@ class VelocitySmootherNode : public rclcpp::Node std::unique_ptr published_time_publisher_; mutable std::shared_ptr time_keeper_{nullptr}; + + std::unique_ptr diagnostics_interface_{nullptr}; }; } // namespace autoware::velocity_smoother diff --git a/planning/autoware_velocity_smoother/src/node.cpp b/planning/autoware_velocity_smoother/src/node.cpp index 1e0f6119ac21e..1f2b1cad6e42a 100644 --- a/planning/autoware_velocity_smoother/src/node.cpp +++ b/planning/autoware_velocity_smoother/src/node.cpp @@ -36,7 +36,8 @@ namespace autoware::velocity_smoother { VelocitySmootherNode::VelocitySmootherNode(const rclcpp::NodeOptions & node_options) -: Node("velocity_smoother", node_options) +: Node("velocity_smoother", node_options), + diagnostics_interface_(std::make_unique(this, "velocity_smoother")) { using std::placeholders::_1; @@ -63,7 +64,6 @@ VelocitySmootherNode::VelocitySmootherNode(const rclcpp::NodeOptions & node_opti pub_velocity_limit_ = create_publisher( "~/output/current_velocity_limit_mps", rclcpp::QoS{1}.transient_local()); pub_dist_to_stopline_ = create_publisher("~/distance_to_stopline", 1); - pub_over_stop_velocity_ = create_publisher("~/stop_speed_exceeded", 1); sub_current_trajectory_ = create_subscription( "~/input/trajectory", 1, std::bind(&VelocitySmootherNode::onCurrentTrajectory, this, _1)); @@ -444,6 +444,7 @@ void VelocitySmootherNode::onCurrentTrajectory(const Trajectory::ConstSharedPtr RCLCPP_DEBUG(get_logger(), "========================= run start ========================="); stop_watch_.tic(); + diagnostics_interface_->clear(); base_traj_raw_ptr_ = msg; // receive data @@ -524,6 +525,10 @@ void VelocitySmootherNode::onCurrentTrajectory(const Trajectory::ConstSharedPtr // Publish Calculation Time publishStopWatchTime(); + + // Publish diagnostics + diagnostics_interface_->publish(now()); + RCLCPP_DEBUG(get_logger(), "========================== run() end ==========================\n\n"); } @@ -906,12 +911,8 @@ void VelocitySmootherNode::overwriteStopPoint( input_stop_vel, output_stop_vel, over_stop_velocity_warn_thr_); } - { - StopSpeedExceeded msg{}; - msg.stamp = this->now(); - msg.stop_speed_exceeded = is_stop_velocity_exceeded; - pub_over_stop_velocity_->publish(msg); - } + diagnostics_interface_->add_key_value( + "The velocity on the stop point is larger than 0.", is_stop_velocity_exceeded); } void VelocitySmootherNode::applyExternalVelocityLimit(TrajectoryPoints & traj) const From ed1f844ce77f496cc44894d23492646354a12217 Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Thu, 16 Jan 2025 17:36:00 +0900 Subject: [PATCH 115/127] test(start_planner): disable GenerateValidFreespacePullOutPath test (#9937) Signed-off-by: kyoichi-sugahara --- .../test/test_freespace_pull_out.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp index 79c58c37f0dcf..5078c463d7c36 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/test/test_freespace_pull_out.cpp @@ -78,7 +78,7 @@ class TestFreespacePullOut : public ::testing::Test } }; -TEST_F(TestFreespacePullOut, GenerateValidFreespacePullOutPath) +TEST_F(TestFreespacePullOut, DISABLED_GenerateValidFreespacePullOutPath) { const auto start_pose = geometry_msgs::build() From cde1c78dd8d971514650793448f177a688667321 Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Thu, 16 Jan 2025 18:30:31 +0900 Subject: [PATCH 116/127] feat(planning_factor)!: remove velocity_factor, steering_factor and introduce planning_factor (#9927) Signed-off-by: satoshi-ota Signed-off-by: Mamoru Sobue Co-authored-by: Satoshi OTA <44889564+satoshi-ota@users.noreply.github.com> Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> Co-authored-by: satoshi-ota --- .../planner_interface.hpp | 11 +- .../obstacle_cruise_planner/type_alias.hpp | 5 - .../obstacle_cruise_planner/utils.hpp | 3 - .../package.xml | 1 - .../src/node.cpp | 1 + .../pid_based_planner/pid_based_planner.cpp | 7 +- .../src/planner_interface.cpp | 18 +- .../src/utils.cpp | 21 -- .../package.xml | 1 - .../src/debug_marker.cpp | 33 +-- .../src/debug_marker.hpp | 14 +- .../src/interface.cpp | 4 +- .../src/interface.hpp | 3 +- .../src/manager.cpp | 2 +- .../manager.hpp | 2 +- .../scene.hpp | 3 +- .../src/scene.cpp | 5 +- .../src/manager.cpp | 4 +- .../goal_planner_module.hpp | 5 +- .../src/goal_planner_module.cpp | 26 +-- .../src/manager.cpp | 2 +- .../interface.hpp | 1 + .../src/interface.cpp | 48 ++-- .../src/manager.cpp | 2 +- .../behavior_path_planner_node.hpp | 7 +- .../src/behavior_path_planner_node.cpp | 39 ++-- .../src/planner_manager.cpp | 3 +- .../interface/scene_module_interface.hpp | 44 ++-- .../scene_module_manager_interface.hpp | 50 +--- .../scene_module_manager_interface.cpp | 9 +- .../manager.hpp | 2 +- .../sampling_planner_module.hpp | 3 +- .../src/sampling_planner_module.cpp | 5 +- .../manager.hpp | 2 +- .../behavior_path_side_shift_module/scene.hpp | 3 +- .../src/scene.cpp | 5 +- .../manager.hpp | 2 +- .../start_planner_module.hpp | 11 +- .../src/start_planner_module.cpp | 39 ++-- .../manager.hpp | 2 +- .../scene.hpp | 15 +- .../src/scene.cpp | 20 +- .../scene.hpp | 4 +- .../src/decisions.cpp | 14 +- .../src/manager.cpp | 2 +- .../src/scene.cpp | 7 +- .../src/manager.cpp | 4 +- .../src/scene_crosswalk.cpp | 23 +- .../src/scene_crosswalk.hpp | 4 +- .../src/manager.cpp | 3 +- .../src/scene.cpp | 6 +- .../src/scene.hpp | 4 +- .../src/manager.cpp | 9 +- .../src/scene_intersection.cpp | 167 ++++++++----- .../src/scene_intersection.hpp | 4 +- .../src/scene_merge_from_private_road.cpp | 13 +- .../src/scene_merge_from_private_road.hpp | 4 +- .../src/manager.cpp | 3 +- .../src/scene.cpp | 8 +- .../src/scene.hpp | 4 +- .../src/manager.cpp | 2 +- .../src/scene_no_stopping_area.cpp | 7 +- .../src/scene_no_stopping_area.hpp | 4 +- .../src/manager.cpp | 4 +- .../src/scene_occlusion_spot.cpp | 7 +- .../src/scene_occlusion_spot.hpp | 4 +- .../scene_module_interface.hpp | 22 +- .../src/scene_module_interface.cpp | 7 +- .../scene_module_interface_with_rtc.hpp | 4 +- .../src/scene_module_interface_with_rtc.cpp | 6 +- .../src/manager.cpp | 3 +- .../src/scene.cpp | 22 +- .../src/scene.hpp | 4 +- .../src/manager.cpp | 2 +- .../src/scene.cpp | 7 +- .../src/scene.hpp | 5 +- .../src/manager.cpp | 2 +- .../src/scene.cpp | 7 +- .../src/scene.hpp | 5 +- .../test/test_scene.cpp | 5 +- .../src/manager.cpp | 5 +- .../src/scene.cpp | 7 +- .../src/scene.hpp | 6 +- .../src/manager.cpp | 3 +- .../src/scene.cpp | 6 +- .../src/scene.hpp | 4 +- .../src/manager.cpp | 3 +- .../src/scene.cpp | 7 +- .../src/scene.hpp | 5 +- .../src/manager.cpp | 3 +- .../src/scene_walkway.cpp | 16 +- .../src/scene_walkway.hpp | 4 +- .../src/dynamic_obstacle_stop_module.cpp | 16 +- .../src/dynamic_obstacle_stop_module.hpp | 1 + .../src/obstacle_velocity_limiter_module.cpp | 1 - .../src/out_of_lane_module.cpp | 16 +- .../src/out_of_lane_module.hpp | 1 + .../plugin_module_interface.hpp | 10 +- .../velocity_planning_result.hpp | 2 - .../README.md | 8 +- .../src/node.cpp | 10 - .../src/node.hpp | 2 - .../src/planner_manager.cpp | 2 + system/autoware_default_adapi/package.xml | 1 + .../autoware_default_adapi/src/planning.cpp | 221 ++++++++++++++---- .../autoware_default_adapi/src/planning.hpp | 20 +- 106 files changed, 731 insertions(+), 544 deletions(-) diff --git a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/planner_interface.hpp b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/planner_interface.hpp index ef6ae1662dcee..823771e173c48 100644 --- a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/planner_interface.hpp +++ b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/planner_interface.hpp @@ -15,6 +15,7 @@ #ifndef AUTOWARE__OBSTACLE_CRUISE_PLANNER__PLANNER_INTERFACE_HPP_ #define AUTOWARE__OBSTACLE_CRUISE_PLANNER__PLANNER_INTERFACE_HPP_ +#include "autoware/motion_utils/factor/planning_factor_interface.hpp" #include "autoware/motion_utils/trajectory/trajectory.hpp" #include "autoware/obstacle_cruise_planner/common_structs.hpp" #include "autoware/obstacle_cruise_planner/stop_planning_debug_info.hpp" @@ -47,15 +48,15 @@ class PlannerInterface rclcpp::Node & node, const LongitudinalInfo & longitudinal_info, const autoware::vehicle_info_utils::VehicleInfo & vehicle_info, const EgoNearestParam & ego_nearest_param, const std::shared_ptr debug_data_ptr) - : longitudinal_info_(longitudinal_info), + : planning_factor_interface_{std::make_unique( + &node, "obstacle_cruise_planner")}, + longitudinal_info_(longitudinal_info), vehicle_info_(vehicle_info), ego_nearest_param_(ego_nearest_param), debug_data_ptr_(debug_data_ptr), slow_down_param_(SlowDownParam(node)), stop_param_(StopParam(node, longitudinal_info)) { - velocity_factors_pub_ = - node.create_publisher("/planning/velocity_factors/obstacle_cruise", 1); stop_speed_exceeded_pub_ = node.create_publisher("~/output/stop_speed_exceeded", 1); metrics_pub_ = node.create_publisher("~/metrics", 10); @@ -101,6 +102,7 @@ class PlannerInterface const std::optional & stop_pose = std::nullopt, const std::optional & stop_obstacle = std::nullopt); void publishMetrics(const rclcpp::Time & current_time); + void publishPlanningFactors() { planning_factor_interface_->publish(); } void clearMetrics(); void onParam(const std::vector & parameters) @@ -128,6 +130,8 @@ class PlannerInterface double getSafeDistanceMargin() const { return longitudinal_info_.safe_distance_margin; } protected: + std::unique_ptr planning_factor_interface_; + // Parameters bool enable_debug_info_{false}; bool enable_calculation_time_info_{false}; @@ -145,7 +149,6 @@ class PlannerInterface stop_watch_; // Publishers - rclcpp::Publisher::SharedPtr velocity_factors_pub_; rclcpp::Publisher::SharedPtr stop_speed_exceeded_pub_; rclcpp::Publisher::SharedPtr metrics_pub_; diff --git a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/type_alias.hpp b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/type_alias.hpp index 04badd2a956ef..31344903b6809 100644 --- a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/type_alias.hpp +++ b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/type_alias.hpp @@ -17,8 +17,6 @@ #include "autoware_vehicle_info_utils/vehicle_info_utils.hpp" -#include "autoware_adapi_v1_msgs/msg/planning_behavior.hpp" -#include "autoware_adapi_v1_msgs/msg/velocity_factor_array.hpp" #include "autoware_perception_msgs/msg/predicted_object.hpp" #include "autoware_perception_msgs/msg/predicted_objects.hpp" #include "autoware_planning_msgs/msg/trajectory.hpp" @@ -39,9 +37,6 @@ #include using autoware::vehicle_info_utils::VehicleInfo; -using autoware_adapi_v1_msgs::msg::PlanningBehavior; -using autoware_adapi_v1_msgs::msg::VelocityFactor; -using autoware_adapi_v1_msgs::msg::VelocityFactorArray; using autoware_perception_msgs::msg::ObjectClassification; using autoware_perception_msgs::msg::PredictedObject; using autoware_perception_msgs::msg::PredictedObjects; diff --git a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/utils.hpp b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/utils.hpp index d929647d9bcd0..ebabd96a54608 100644 --- a/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/utils.hpp +++ b/planning/autoware_obstacle_cruise_planner/include/autoware/obstacle_cruise_planner/utils.hpp @@ -94,9 +94,6 @@ size_t getIndexWithLongitudinalOffset( return 0; } -VelocityFactorArray makeVelocityFactorArray( - const rclcpp::Time & time, const std::string & behavior = PlanningBehavior::ROUTE_OBSTACLE, - const std::optional pose = std::nullopt); } // namespace obstacle_cruise_utils #endif // AUTOWARE__OBSTACLE_CRUISE_PLANNER__UTILS_HPP_ diff --git a/planning/autoware_obstacle_cruise_planner/package.xml b/planning/autoware_obstacle_cruise_planner/package.xml index 8583d0639e5ce..7c6d0b286c9b0 100644 --- a/planning/autoware_obstacle_cruise_planner/package.xml +++ b/planning/autoware_obstacle_cruise_planner/package.xml @@ -18,7 +18,6 @@ ament_cmake_auto autoware_cmake - autoware_adapi_v1_msgs autoware_interpolation autoware_lanelet2_extension autoware_motion_utils diff --git a/planning/autoware_obstacle_cruise_planner/src/node.cpp b/planning/autoware_obstacle_cruise_planner/src/node.cpp index 6931ff58e8457..4242f0d559946 100644 --- a/planning/autoware_obstacle_cruise_planner/src/node.cpp +++ b/planning/autoware_obstacle_cruise_planner/src/node.cpp @@ -726,6 +726,7 @@ void ObstacleCruisePlannerNode::onTrajectory(const Trajectory::ConstSharedPtr ms // 8. Publish debug data published_time_publisher_->publish_if_subscribed(trajectory_pub_, output_traj.header.stamp); planner_ptr_->publishMetrics(now()); + planner_ptr_->publishPlanningFactors(); publishDebugMarker(); publishDebugInfo(); objects_of_interest_marker_interface_.publishMarkerArray(); diff --git a/planning/autoware_obstacle_cruise_planner/src/pid_based_planner/pid_based_planner.cpp b/planning/autoware_obstacle_cruise_planner/src/pid_based_planner/pid_based_planner.cpp index 544597f05ff75..20b564addf149 100644 --- a/planning/autoware_obstacle_cruise_planner/src/pid_based_planner/pid_based_planner.cpp +++ b/planning/autoware_obstacle_cruise_planner/src/pid_based_planner/pid_based_planner.cpp @@ -335,9 +335,10 @@ std::vector PIDBasedPlanner::planCruise( debug_data_ptr_->obstacles_to_cruise.push_back(cruise_obstacle_info->obstacle); debug_data_ptr_->cruise_metrics = makeMetrics("PIDBasedPlanner", "cruise", planner_data); - velocity_factors_pub_->publish(obstacle_cruise_utils::makeVelocityFactorArray( - planner_data.current_time, PlanningBehavior::ADAPTIVE_CRUISE, - stop_traj_points.at(wall_idx).pose)); + planning_factor_interface_->add( + stop_traj_points, planner_data.ego_pose, stop_traj_points.at(wall_idx).pose, + tier4_planning_msgs::msg::PlanningFactor::NONE, + tier4_planning_msgs::msg::SafetyFactorArray{}); } // do cruise planning diff --git a/planning/autoware_obstacle_cruise_planner/src/planner_interface.cpp b/planning/autoware_obstacle_cruise_planner/src/planner_interface.cpp index b08bb10ef69cf..b32d7f3a1bcbb 100644 --- a/planning/autoware_obstacle_cruise_planner/src/planner_interface.cpp +++ b/planning/autoware_obstacle_cruise_planner/src/planner_interface.cpp @@ -182,8 +182,6 @@ std::vector PlannerInterface::generateStopTrajectory( : std::abs(vehicle_info_.min_longitudinal_offset_m); if (stop_obstacles.empty()) { - velocity_factors_pub_->publish( - obstacle_cruise_utils::makeVelocityFactorArray(planner_data.current_time)); // delete marker const auto markers = autoware::motion_utils::createDeletedStopVirtualWallMarker(planner_data.current_time, 0); @@ -336,8 +334,10 @@ std::vector PlannerInterface::generateStopTrajectory( // Publish Stop Reason const auto stop_pose = output_traj_points.at(*zero_vel_idx).pose; - velocity_factors_pub_->publish(obstacle_cruise_utils::makeVelocityFactorArray( - planner_data.current_time, PlanningBehavior::ROUTE_OBSTACLE, stop_pose)); + planning_factor_interface_->add( + output_traj_points, planner_data.ego_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}); // Store stop reason debug data debug_data_ptr_->stop_metrics = makeMetrics("PlannerInterface", "stop", planner_data, stop_pose, *determined_stop_obstacle); @@ -590,10 +590,14 @@ std::vector PlannerInterface::generateSlowDownTrajectory( const auto markers = autoware::motion_utils::createSlowDownVirtualWallMarker( slow_down_traj_points.at(slow_down_wall_idx).pose, "obstacle slow down", planner_data.current_time, i, abs_ego_offset, "", planner_data.is_driving_forward); - velocity_factors_pub_->publish(obstacle_cruise_utils::makeVelocityFactorArray( - planner_data.current_time, PlanningBehavior::ROUTE_OBSTACLE, - slow_down_traj_points.at(slow_down_wall_idx).pose)); autoware::universe_utils::appendMarkerArray(markers, &debug_data_ptr_->slow_down_wall_marker); + planning_factor_interface_->add( + slow_down_traj_points, planner_data.ego_pose, + slow_down_traj_points.at(*slow_down_start_idx).pose, + slow_down_traj_points.at(*slow_down_end_idx).pose, + tier4_planning_msgs::msg::PlanningFactor::SLOW_DOWN, + tier4_planning_msgs::msg::SafetyFactorArray{}, planner_data.is_driving_forward, + stable_slow_down_vel); } // add debug virtual wall diff --git a/planning/autoware_obstacle_cruise_planner/src/utils.cpp b/planning/autoware_obstacle_cruise_planner/src/utils.cpp index 82f4e6978181f..b27def0bfcbe5 100644 --- a/planning/autoware_obstacle_cruise_planner/src/utils.cpp +++ b/planning/autoware_obstacle_cruise_planner/src/utils.cpp @@ -118,25 +118,4 @@ std::vector getClosestStopObstacles(const std::vector pose) -{ - VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = time; - - if (pose) { - using distance_type = VelocityFactor::_distance_type; - VelocityFactor velocity_factor; - velocity_factor.behavior = behavior; - velocity_factor.pose = pose.value(); - velocity_factor.distance = std::numeric_limits::quiet_NaN(); - velocity_factor.status = VelocityFactor::UNKNOWN; - velocity_factor.detail = std::string(); - velocity_factor_array.factors.push_back(velocity_factor); - } - return velocity_factor_array; -} - } // namespace obstacle_cruise_utils diff --git a/planning/autoware_surround_obstacle_checker/package.xml b/planning/autoware_surround_obstacle_checker/package.xml index 4a6f946b8eb90..8bbc0b6bf4e02 100644 --- a/planning/autoware_surround_obstacle_checker/package.xml +++ b/planning/autoware_surround_obstacle_checker/package.xml @@ -14,7 +14,6 @@ autoware_cmake eigen3_cmake_module - autoware_adapi_v1_msgs autoware_motion_utils autoware_perception_msgs autoware_planning_msgs diff --git a/planning/autoware_surround_obstacle_checker/src/debug_marker.cpp b/planning/autoware_surround_obstacle_checker/src/debug_marker.cpp index bbd1cac04ed89..2acf6ba1c92f5 100644 --- a/planning/autoware_surround_obstacle_checker/src/debug_marker.cpp +++ b/planning/autoware_surround_obstacle_checker/src/debug_marker.cpp @@ -67,7 +67,9 @@ SurroundObstacleCheckerDebugNode::SurroundObstacleCheckerDebugNode( const double & surround_check_back_distance, const double & surround_check_hysteresis_distance, const geometry_msgs::msg::Pose & self_pose, const rclcpp::Clock::SharedPtr clock, rclcpp::Node & node) -: vehicle_info_(vehicle_info), +: planning_factor_interface_{std::make_unique( + &node, "surround_obstacle_checker")}, + vehicle_info_(vehicle_info), object_label_(object_label), surround_check_front_distance_(surround_check_front_distance), surround_check_side_distance_(surround_check_side_distance), @@ -77,8 +79,6 @@ SurroundObstacleCheckerDebugNode::SurroundObstacleCheckerDebugNode( clock_(clock) { debug_viz_pub_ = node.create_publisher("~/debug/marker", 1); - velocity_factor_pub_ = - node.create_publisher("/planning/velocity_factors/surround_obstacle", 1); vehicle_footprint_pub_ = node.create_publisher("~/debug/footprint", 1); vehicle_footprint_offset_pub_ = node.create_publisher("~/debug/footprint_offset", 1); @@ -143,8 +143,12 @@ void SurroundObstacleCheckerDebugNode::publish() debug_viz_pub_->publish(visualization_msg); /* publish stop reason for autoware api */ - const auto velocity_factor_msg = makeVelocityFactorArray(); - velocity_factor_pub_->publish(velocity_factor_msg); + if (stop_pose_ptr_ != nullptr) { + planning_factor_interface_->add( + 0.0, *stop_pose_ptr_, tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}); + } + planning_factor_interface_->publish(); /* reset variables */ stop_pose_ptr_ = nullptr; @@ -170,25 +174,6 @@ MarkerArray SurroundObstacleCheckerDebugNode::makeVisualizationMarker() return msg; } -VelocityFactorArray SurroundObstacleCheckerDebugNode::makeVelocityFactorArray() -{ - VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = clock_->now(); - - if (stop_pose_ptr_) { - using distance_type = VelocityFactor::_distance_type; - VelocityFactor velocity_factor; - velocity_factor.behavior = PlanningBehavior::SURROUNDING_OBSTACLE; - velocity_factor.pose = *stop_pose_ptr_; - velocity_factor.distance = std::numeric_limits::quiet_NaN(); - velocity_factor.status = VelocityFactor::UNKNOWN; - velocity_factor.detail = std::string(); - velocity_factor_array.factors.push_back(velocity_factor); - } - return velocity_factor_array; -} - PolygonStamped SurroundObstacleCheckerDebugNode::boostPolygonToPolygonStamped( const Polygon2d & boost_polygon, const double & z) { diff --git a/planning/autoware_surround_obstacle_checker/src/debug_marker.hpp b/planning/autoware_surround_obstacle_checker/src/debug_marker.hpp index b2c350c1b4698..c49e277f2dc6c 100644 --- a/planning/autoware_surround_obstacle_checker/src/debug_marker.hpp +++ b/planning/autoware_surround_obstacle_checker/src/debug_marker.hpp @@ -15,13 +15,13 @@ #ifndef DEBUG_MARKER_HPP_ #define DEBUG_MARKER_HPP_ +#include #include #include -#include -#include #include #include +#include #include #include @@ -34,10 +34,10 @@ namespace autoware::surround_obstacle_checker { using autoware::vehicle_info_utils::VehicleInfo; -using autoware_adapi_v1_msgs::msg::PlanningBehavior; -using autoware_adapi_v1_msgs::msg::VelocityFactor; -using autoware_adapi_v1_msgs::msg::VelocityFactorArray; using geometry_msgs::msg::PolygonStamped; +using tier4_planning_msgs::msg::ControlPoint; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::PlanningFactorArray; using visualization_msgs::msg::Marker; using visualization_msgs::msg::MarkerArray; @@ -65,12 +65,13 @@ class SurroundObstacleCheckerDebugNode private: rclcpp::Publisher::SharedPtr debug_viz_pub_; - rclcpp::Publisher::SharedPtr velocity_factor_pub_; rclcpp::Publisher::SharedPtr vehicle_footprint_pub_; rclcpp::Publisher::SharedPtr vehicle_footprint_offset_pub_; rclcpp::Publisher::SharedPtr vehicle_footprint_recover_offset_pub_; + std::unique_ptr planning_factor_interface_; + autoware::vehicle_info_utils::VehicleInfo vehicle_info_; std::string object_label_; double surround_check_front_distance_; @@ -80,7 +81,6 @@ class SurroundObstacleCheckerDebugNode geometry_msgs::msg::Pose self_pose_; MarkerArray makeVisualizationMarker(); - VelocityFactorArray makeVelocityFactorArray(); PolygonStamped boostPolygonToPolygonStamped(const Polygon2d & boost_polygon, const double & z); diff --git a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.cpp b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.cpp index 3080ba1045b41..37bee1a178f90 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.cpp @@ -32,13 +32,15 @@ AvoidanceByLaneChangeInterface::AvoidanceByLaneChangeInterface( const std::shared_ptr & avoidance_by_lane_change_parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface) : LaneChangeInterface{ name, node, parameters, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, + planning_factor_interface, std::make_unique(parameters, avoidance_by_lane_change_parameters)} { } diff --git a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.hpp index c7fbba34b1adb..6e524f3c91341 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/interface.hpp @@ -40,7 +40,8 @@ class AvoidanceByLaneChangeInterface : public LaneChangeInterface const std::shared_ptr & avoidance_by_lane_change_parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface); bool isExecutionRequested() const override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/manager.cpp index c54774a575332..2bf8a60676d72 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_avoidance_by_lane_change_module/src/manager.cpp @@ -190,7 +190,7 @@ SMIPtr AvoidanceByLaneChangeModuleManager::createNewSceneModuleInstance() { return std::make_unique( name_, *node_, parameters_, avoidance_parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } } // namespace autoware::behavior_path_planner diff --git a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/manager.hpp b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/manager.hpp index f09196b2cc8e1..ea8f09c4f9336 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/manager.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/manager.hpp @@ -42,7 +42,7 @@ class DynamicObstacleAvoidanceModuleManager : public SceneModuleManagerInterface { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } void updateModuleParams(const std::vector & parameters) override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/scene.hpp index 44b56f4ea0990..8987e7c0446ee 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/include/autoware/behavior_path_dynamic_obstacle_avoidance_module/scene.hpp @@ -351,7 +351,8 @@ class DynamicObstacleAvoidanceModule : public SceneModuleInterface std::shared_ptr parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface); void updateModuleParams(const std::any & parameters) override { diff --git a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/src/scene.cpp index dc7efebe88fba..145e0df2675b4 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_dynamic_obstacle_avoidance_module/src/scene.cpp @@ -331,8 +331,9 @@ DynamicObstacleAvoidanceModule::DynamicObstacleAvoidanceModule( std::shared_ptr parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT parameters_{std::move(parameters)}, target_objects_manager_{TargetObjectsManager( parameters_->successive_num_to_entry_dynamic_avoidance_condition, diff --git a/planning/behavior_path_planner/autoware_behavior_path_external_request_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_external_request_lane_change_module/src/manager.cpp index 45c997f364633..0b438d1a1758e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_external_request_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_external_request_lane_change_module/src/manager.cpp @@ -28,7 +28,7 @@ ExternalRequestLaneChangeRightModuleManager::createNewSceneModuleInstance() { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_, + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_, std::make_unique(parameters_, direction_)); } @@ -37,7 +37,7 @@ ExternalRequestLaneChangeLeftModuleManager::createNewSceneModuleInstance() { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_, + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_, std::make_unique(parameters_, direction_)); } diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp index 41524b1b8193c..84367fdd91b80 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/goal_planner_module.hpp @@ -240,7 +240,8 @@ class GoalPlannerModule : public SceneModuleInterface const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface); ~GoalPlannerModule() { @@ -455,7 +456,7 @@ class GoalPlannerModule : public SceneModuleInterface // steering factor void updateSteeringFactor( const PullOverContextData & context_data, const std::array & pose, - const std::array distance, const uint16_t type); + const std::array distance); // rtc std::pair calcDistanceToPathChange( diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp index 0a6185127fcf0..c7e32a47a59f9 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/goal_planner_module.cpp @@ -66,8 +66,9 @@ GoalPlannerModule::GoalPlannerModule( const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT parameters_{parameters}, vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()}, is_lane_parking_cb_running_{false}, @@ -120,9 +121,6 @@ GoalPlannerModule::GoalPlannerModule( initializeSafetyCheckParameters(); } - steering_factor_interface_.init(PlanningBehavior::GOAL_PLANNER); - velocity_factor_interface_.init(PlanningBehavior::GOAL_PLANNER); - /** * NOTE: Add `universe_utils::ScopedTimeTrack st(__func__, *time_keeper_);` to functions called * from the main thread only. @@ -1344,19 +1342,20 @@ void GoalPlannerModule::setTurnSignalInfo( void GoalPlannerModule::updateSteeringFactor( const PullOverContextData & context_data, const std::array & pose, - const std::array distance, const uint16_t type) + const std::array distance) { - const uint16_t steering_factor_direction = std::invoke([&]() { + const uint16_t planning_factor_direction = std::invoke([&]() { const auto turn_signal = calcTurnSignalInfo(context_data); if (turn_signal.turn_signal.command == TurnIndicatorsCommand::ENABLE_LEFT) { - return SteeringFactor::LEFT; + return PlanningFactor::SHIFT_LEFT; } else if (turn_signal.turn_signal.command == TurnIndicatorsCommand::ENABLE_RIGHT) { - return SteeringFactor::RIGHT; + return PlanningFactor::SHIFT_RIGHT; } - return SteeringFactor::STRAIGHT; + return PlanningFactor::NONE; }); - steering_factor_interface_.set(pose, distance, steering_factor_direction, type, ""); + planning_factor_interface_->add( + distance[0], distance[1], pose[0], pose[1], planning_factor_direction, SafetyFactorArray{}); } void GoalPlannerModule::decideVelocity(PullOverPath & pull_over_path) @@ -1568,10 +1567,9 @@ void GoalPlannerModule::postProcess() updateSteeringFactor( context_data, {pull_over_path.start_pose(), pull_over_path.modified_goal_pose()}, - {distance_to_path_change.first, distance_to_path_change.second}, - has_decided_path ? SteeringFactor::TURNING : SteeringFactor::APPROACHING); + {distance_to_path_change.first, distance_to_path_change.second}); - setVelocityFactor(pull_over_path.full_path()); + set_longitudinal_planning_factor(pull_over_path.full_path()); } BehaviorModuleOutput GoalPlannerModule::planWaitingApproval() diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/manager.cpp index 6bbc34a495080..a99252c923328 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/manager.cpp @@ -31,7 +31,7 @@ std::unique_ptr GoalPlannerModuleManager::createNewSceneMo { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } GoalPlannerParameters GoalPlannerModuleManager::initGoalPlannerParameters( diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp index 4b97fb0d069a0..82b042d1135d2 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/interface.hpp @@ -53,6 +53,7 @@ class LaneChangeInterface : public SceneModuleInterface const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface, std::unique_ptr && module_type); LaneChangeInterface(const LaneChangeInterface &) = delete; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp index ebcd4eb4809fc..4519b20d4644d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/interface.cpp @@ -40,15 +40,14 @@ LaneChangeInterface::LaneChangeInterface( const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface, std::unique_ptr && module_type) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT parameters_{std::move(parameters)}, module_type_{std::move(module_type)} { module_type_->setTimeKeeper(getTimeKeeper()); logger_ = utils::lane_change::getLogger(module_type_->getModuleTypeStr()); - steering_factor_interface_.init(PlanningBehavior::LANE_CHANGE); - velocity_factor_interface_.init(PlanningBehavior::LANE_CHANGE); } void LaneChangeInterface::processOnExit() @@ -145,7 +144,7 @@ BehaviorModuleOutput LaneChangeInterface::plan() } } - setVelocityFactor(output.path); + set_longitudinal_planning_factor(output.path); return output; } @@ -179,7 +178,7 @@ BehaviorModuleOutput LaneChangeInterface::planWaitingApproval() isExecutionReady(), State::WAITING_FOR_EXECUTION); is_abort_path_approved_ = false; - setVelocityFactor(out.path); + set_longitudinal_planning_factor(out.path); return out; } @@ -384,15 +383,6 @@ MarkerArray LaneChangeInterface::getModuleVirtualWall() void LaneChangeInterface::updateSteeringFactorPtr(const BehaviorModuleOutput & output) { universe_utils::ScopedTimeTrack st(__func__, *getTimeKeeper()); - const auto steering_factor_direction = std::invoke([&]() { - if (module_type_->getDirection() == Direction::LEFT) { - return SteeringFactor::LEFT; - } - if (module_type_->getDirection() == Direction::RIGHT) { - return SteeringFactor::RIGHT; - } - return SteeringFactor::UNKNOWN; - }); const auto current_position = module_type_->getEgoPosition(); const auto status = module_type_->getLaneChangeStatus(); @@ -401,24 +391,34 @@ void LaneChangeInterface::updateSteeringFactorPtr(const BehaviorModuleOutput & o const auto finish_distance = autoware::motion_utils::calcSignedArcLength( output.path.points, current_position, status.lane_change_path.info.shift_line.end.position); - steering_factor_interface_.set( - {status.lane_change_path.info.shift_line.start, status.lane_change_path.info.shift_line.end}, - {start_distance, finish_distance}, steering_factor_direction, SteeringFactor::TURNING, ""); + const auto planning_factor_direction = std::invoke([&]() { + if (module_type_->getDirection() == Direction::LEFT) { + return PlanningFactor::SHIFT_LEFT; + } + if (module_type_->getDirection() == Direction::RIGHT) { + return PlanningFactor::SHIFT_RIGHT; + } + return PlanningFactor::UNKNOWN; + }); + + planning_factor_interface_->add( + start_distance, finish_distance, status.lane_change_path.info.shift_line.start, + status.lane_change_path.info.shift_line.end, planning_factor_direction, SafetyFactorArray{}); } void LaneChangeInterface::updateSteeringFactorPtr( const CandidateOutput & output, const LaneChangePath & selected_path) const { - const uint16_t steering_factor_direction = std::invoke([&output]() { + const uint16_t planning_factor_direction = std::invoke([&output]() { if (output.lateral_shift > 0.0) { - return SteeringFactor::LEFT; + return PlanningFactor::SHIFT_LEFT; } - return SteeringFactor::RIGHT; + return PlanningFactor::SHIFT_RIGHT; }); - steering_factor_interface_.set( - {selected_path.info.shift_line.start, selected_path.info.shift_line.end}, - {output.start_distance_to_path_change, output.finish_distance_to_path_change}, - steering_factor_direction, SteeringFactor::APPROACHING, ""); + planning_factor_interface_->add( + output.start_distance_to_path_change, output.finish_distance_to_path_change, + selected_path.info.shift_line.start, selected_path.info.shift_line.end, + planning_factor_direction, SafetyFactorArray{}); } } // namespace autoware::behavior_path_planner diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index f26cf79e8b120..450497fb2ca29 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -302,7 +302,7 @@ std::unique_ptr LaneChangeModuleManager::createNewSceneMod { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_, + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_, std::make_unique(parameters_, LaneChangeModuleType::NORMAL, direction_)); } diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/include/autoware/behavior_path_planner/behavior_path_planner_node.hpp b/planning/behavior_path_planner/autoware_behavior_path_planner/include/autoware/behavior_path_planner/behavior_path_planner_node.hpp index ebe7c47e6fab2..7f7ecd7326b08 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/include/autoware/behavior_path_planner/behavior_path_planner_node.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/include/autoware/behavior_path_planner/behavior_path_planner_node.hpp @@ -20,7 +20,7 @@ #include "autoware/universe_utils/ros/logger_level_configure.hpp" #include "planner_manager.hpp" -#include +#include #include #include @@ -51,7 +51,7 @@ namespace autoware::behavior_path_planner { -using autoware::motion_utils::SteeringFactorInterface; +using autoware::motion_utils::PlanningFactorInterface; using autoware_adapi_v1_msgs::msg::OperationModeState; using autoware_map_msgs::msg::LaneletMapBin; using autoware_perception_msgs::msg::PredictedObject; @@ -121,7 +121,6 @@ class BehaviorPathPlannerNode : public rclcpp::Node rclcpp::Publisher::SharedPtr bound_publisher_; rclcpp::Publisher::SharedPtr modified_goal_publisher_; rclcpp::Publisher::SharedPtr reroute_availability_publisher_; - rclcpp::Publisher::SharedPtr pub_steering_factors_; rclcpp::TimerBase::SharedPtr timer_; std::map::SharedPtr> path_candidate_publishers_; @@ -136,7 +135,7 @@ class BehaviorPathPlannerNode : public rclcpp::Node std::shared_ptr planner_manager_; - SteeringFactorInterface steering_factor_interface_; + std::unique_ptr planning_factor_interface_; std::mutex mutex_pd_; // mutex for planner_data_ std::mutex mutex_manager_; // mutex for bt_manager_ or planner_manager_ diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/src/behavior_path_planner_node.cpp b/planning/behavior_path_planner/autoware_behavior_path_planner/src/behavior_path_planner_node.cpp index 7758ab530e88c..568d432e1faa3 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/src/behavior_path_planner_node.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/src/behavior_path_planner_node.cpp @@ -32,7 +32,9 @@ using autoware::vehicle_info_utils::VehicleInfoUtils; using tier4_planning_msgs::msg::PathChangeModuleId; BehaviorPathPlannerNode::BehaviorPathPlannerNode(const rclcpp::NodeOptions & node_options) -: Node("behavior_path_planner", node_options) +: Node("behavior_path_planner", node_options), + planning_factor_interface_{ + std::make_unique(this, "behavior_path_planner")} { using std::placeholders::_1; using std::chrono_literals::operator""ms; @@ -51,8 +53,6 @@ BehaviorPathPlannerNode::BehaviorPathPlannerNode(const rclcpp::NodeOptions & nod const auto durable_qos = rclcpp::QoS(1).transient_local(); modified_goal_publisher_ = create_publisher("~/output/modified_goal", durable_qos); - pub_steering_factors_ = - create_publisher("/planning/steering_factor/intersection", 1); reroute_availability_publisher_ = create_publisher("~/output/is_reroute_available", 1); debug_avoidance_msg_array_publisher_ = @@ -115,8 +115,6 @@ BehaviorPathPlannerNode::BehaviorPathPlannerNode(const rclcpp::NodeOptions & nod turn_signal_search_time, turn_signal_intersection_angle_threshold_deg); } - steering_factor_interface_.init(PlanningBehavior::INTERSECTION); - // Start timer { const auto planning_hz = declare_parameter("planning_hz"); @@ -463,33 +461,22 @@ void BehaviorPathPlannerNode::publish_steering_factor( const auto [intersection_flag, approaching_intersection_flag] = planner_data->turn_signal_decider.getIntersectionTurnSignalFlag(); if (intersection_flag || approaching_intersection_flag) { - const uint16_t steering_factor_direction = std::invoke([&turn_signal]() { - if (turn_signal.command == TurnIndicatorsCommand::ENABLE_LEFT) { - return SteeringFactor::LEFT; - } - return SteeringFactor::RIGHT; - }); - const auto [intersection_pose, intersection_distance] = planner_data->turn_signal_decider.getIntersectionPoseAndDistance(); - steering_factor_interface_.set( - {intersection_pose, intersection_pose}, {intersection_distance, intersection_distance}, - steering_factor_direction, SteeringFactor::TURNING, ""); - } else { - steering_factor_interface_.reset(); - } - - autoware_adapi_v1_msgs::msg::SteeringFactorArray steering_factor_array; - steering_factor_array.header.frame_id = "map"; - steering_factor_array.header.stamp = this->now(); + const uint16_t planning_factor_direction = std::invoke([&turn_signal]() { + if (turn_signal.command == TurnIndicatorsCommand::ENABLE_LEFT) { + return PlanningFactor::TURN_LEFT; + } + return PlanningFactor::TURN_RIGHT; + }); - const auto steering_factor = steering_factor_interface_.get(); - if (steering_factor.behavior != PlanningBehavior::UNKNOWN) { - steering_factor_array.factors.emplace_back(steering_factor); + planning_factor_interface_->add( + intersection_distance, intersection_distance, intersection_pose, intersection_pose, + planning_factor_direction, SafetyFactorArray{}); } - pub_steering_factors_->publish(steering_factor_array); + planning_factor_interface_->publish(); } void BehaviorPathPlannerNode::publish_reroute_availability() const diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner/src/planner_manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_planner/src/planner_manager.cpp index 041b7ad20a107..322209d46732b 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner/src/planner_manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner/src/planner_manager.cpp @@ -182,8 +182,7 @@ BehaviorModuleOutput PlannerManager::run(const std::shared_ptr & da std::for_each(manager_ptrs_.begin(), manager_ptrs_.end(), [](const auto & m) { m->updateObserver(); m->publishRTCStatus(); - m->publishSteeringFactor(); - m->publishVelocityFactor(); + m->publish_planning_factors(); }); generateCombinedDrivableArea(result_output.valid_output, data); diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_interface.hpp index 391ac92411220..c96bc601b6403 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_interface.hpp @@ -21,8 +21,7 @@ #include "autoware/behavior_path_planner_common/utils/utils.hpp" #include -#include -#include +#include #include #include #include @@ -36,7 +35,6 @@ #include #include -#include #include #include #include @@ -54,18 +52,16 @@ namespace autoware::behavior_path_planner { -using autoware::motion_utils::SteeringFactorInterface; -using autoware::motion_utils::VelocityFactorInterface; +using autoware::motion_utils::PlanningFactorInterface; using autoware::objects_of_interest_marker_interface::ColorName; using autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface; using autoware::rtc_interface::RTCInterface; using autoware::universe_utils::calcOffsetPose; using autoware::universe_utils::generateUUID; -using autoware_adapi_v1_msgs::msg::PlanningBehavior; -using autoware_adapi_v1_msgs::msg::SteeringFactor; -using autoware_adapi_v1_msgs::msg::VelocityFactor; using tier4_planning_msgs::msg::AvoidanceDebugMsgArray; using tier4_planning_msgs::msg::PathWithLaneId; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::SafetyFactorArray; using tier4_rtc_msgs::msg::State; using unique_identifier_msgs::msg::UUID; using visualization_msgs::msg::MarkerArray; @@ -86,13 +82,15 @@ class SceneModuleInterface const std::string & name, rclcpp::Node & node, std::unordered_map> rtc_interface_ptr_map, std::unordered_map> - objects_of_interest_marker_interface_ptr_map) + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) : name_{name}, logger_{node.get_logger().get_child(name)}, clock_{node.get_clock()}, rtc_interface_ptr_map_(std::move(rtc_interface_ptr_map)), objects_of_interest_marker_interface_ptr_map_( std::move(objects_of_interest_marker_interface_ptr_map)), + planning_factor_interface_{planning_factor_interface}, time_keeper_(std::make_shared()) { for (const auto & [module_name, ptr] : rtc_interface_ptr_map_) { @@ -184,8 +182,6 @@ class SceneModuleInterface unlockNewModuleLaunch(); unlockOutputPath(); - reset_factor(); - processOnExit(); } @@ -258,16 +254,6 @@ class SceneModuleInterface ModuleStatus getCurrentStatus() const { return current_state_; } - void reset_factor() - { - steering_factor_interface_.reset(); - velocity_factor_interface_.reset(); - } - - auto get_steering_factor() const -> SteeringFactor { return steering_factor_interface_.get(); } - - auto get_velocity_factor() const -> VelocityFactor { return velocity_factor_interface_.get(); } - std::string name() const { return name_; } PoseWithDetailOpt getStopPose() const @@ -558,11 +544,12 @@ class SceneModuleInterface } } - void setVelocityFactor(const PathWithLaneId & path) + void set_longitudinal_planning_factor(const PathWithLaneId & path) { if (stop_pose_.has_value()) { - velocity_factor_interface_.set( - path.points, getEgoPose(), stop_pose_.value().pose, VelocityFactor::APPROACHING, "stop"); + planning_factor_interface_->add( + path.points, getEgoPose(), stop_pose_.value().pose, PlanningFactor::STOP, + SafetyFactorArray{}); return; } @@ -570,8 +557,9 @@ class SceneModuleInterface return; } - velocity_factor_interface_.set( - path.points, getEgoPose(), slow_pose_.value().pose, VelocityFactor::APPROACHING, "slow down"); + planning_factor_interface_->add( + path.points, getEgoPose(), slow_pose_.value().pose, PlanningFactor::SLOW_DOWN, + SafetyFactorArray{}); } void setDrivableLanes(const std::vector & drivable_lanes); @@ -627,9 +615,7 @@ class SceneModuleInterface std::unordered_map> objects_of_interest_marker_interface_ptr_map_; - mutable SteeringFactorInterface steering_factor_interface_; - - mutable VelocityFactorInterface velocity_factor_interface_; + mutable std::shared_ptr planning_factor_interface_; mutable PoseWithDetailOpt stop_pose_{std::nullopt}; diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_manager_interface.hpp b/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_manager_interface.hpp index 73b133952935b..446829d1d0f9d 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_manager_interface.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner_common/include/autoware/behavior_path_planner_common/interface/scene_module_manager_interface.hpp @@ -24,8 +24,6 @@ #include #include -#include -#include #include #include @@ -42,8 +40,6 @@ using autoware::motion_utils::createDeadLineVirtualWallMarker; using autoware::motion_utils::createSlowDownVirtualWallMarker; using autoware::motion_utils::createStopVirtualWallMarker; using autoware::universe_utils::toHexString; -using autoware_adapi_v1_msgs::msg::SteeringFactorArray; -using autoware_adapi_v1_msgs::msg::VelocityFactorArray; using unique_identifier_msgs::msg::UUID; using SceneModulePtr = std::shared_ptr; using SceneModuleObserver = std::weak_ptr; @@ -106,45 +102,7 @@ class SceneModuleManagerInterface } } - void publishSteeringFactor() - { - SteeringFactorArray steering_factor_array; - steering_factor_array.header.frame_id = "map"; - steering_factor_array.header.stamp = node_->now(); - - for (const auto & m : observers_) { - if (m.expired()) { - continue; - } - - const auto steering_factor = m.lock()->get_steering_factor(); - if (steering_factor.behavior != PlanningBehavior::UNKNOWN) { - steering_factor_array.factors.emplace_back(steering_factor); - } - } - - pub_steering_factors_->publish(steering_factor_array); - } - - void publishVelocityFactor() - { - VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = node_->now(); - - for (const auto & m : observers_) { - if (m.expired()) { - continue; - } - - const auto velocity_factor = m.lock()->get_velocity_factor(); - if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { - velocity_factor_array.factors.emplace_back(velocity_factor); - } - } - - pub_velocity_factors_->publish(velocity_factor_array); - } + void publish_planning_factors() { planning_factor_interface_->publish(); } void publishVirtualWall() const { @@ -304,10 +262,6 @@ class SceneModuleManagerInterface rclcpp::Publisher::SharedPtr pub_drivable_lanes_; - rclcpp::Publisher::SharedPtr pub_steering_factors_; - - rclcpp::Publisher::SharedPtr pub_velocity_factors_; - rclcpp::Publisher::SharedPtr pub_processing_time_; std::string name_; @@ -318,6 +272,8 @@ class SceneModuleManagerInterface std::unique_ptr idle_module_ptr_; + std::shared_ptr planning_factor_interface_; + std::unordered_map> rtc_interface_ptr_map_; std::unordered_map> diff --git a/planning/behavior_path_planner/autoware_behavior_path_planner_common/src/interface/scene_module_manager_interface.cpp b/planning/behavior_path_planner/autoware_behavior_path_planner_common/src/interface/scene_module_manager_interface.cpp index b91db3a740cfe..11be3b28a7f94 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_planner_common/src/interface/scene_module_manager_interface.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_planner_common/src/interface/scene_module_manager_interface.cpp @@ -61,10 +61,11 @@ void SceneModuleManagerInterface::initInterface( pub_drivable_lanes_ = node->create_publisher("~/drivable_lanes/" + name_, 20); pub_processing_time_ = node->create_publisher( "~/processing_time/" + name_, 20); - pub_steering_factors_ = - node->create_publisher("/planning/steering_factor/" + name_, 1); - pub_velocity_factors_ = - node->create_publisher("/planning/velocity_factors/" + name_, 1); + } + + // planning factor + { + planning_factor_interface_ = std::make_shared(node, name_); } // misc diff --git a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/manager.hpp b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/manager.hpp index 28c310ae20ec2..f25c073e879da 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/manager.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/manager.hpp @@ -38,7 +38,7 @@ class SamplingPlannerModuleManager : public SceneModuleManagerInterface { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } void updateModuleParams( diff --git a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/sampling_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/sampling_planner_module.hpp index c9b75f7fa96de..f84fe45d08ca4 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/sampling_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/include/autoware/behavior_path_sampling_planner_module/sampling_planner_module.hpp @@ -86,7 +86,8 @@ class SamplingPlannerModule : public SceneModuleInterface const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface); bool isExecutionRequested() const override; bool isExecutionReady() const override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/src/sampling_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/src/sampling_planner_module.cpp index fac3cc92de1d6..5bb57f17ce813 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/src/sampling_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_sampling_planner_module/src/sampling_planner_module.cpp @@ -42,8 +42,9 @@ SamplingPlannerModule::SamplingPlannerModule( const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()} { internal_params_ = std::make_shared(); diff --git a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/manager.hpp b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/manager.hpp index b495e6619a1c7..2b4a20ddc8cca 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/manager.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/manager.hpp @@ -39,7 +39,7 @@ class SideShiftModuleManager : public SceneModuleManagerInterface { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } void updateModuleParams(const std::vector & parameters) override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/scene.hpp index 15d81ff45abcf..c8a5e47287477 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/include/autoware/behavior_path_side_shift_module/scene.hpp @@ -45,7 +45,8 @@ class SideShiftModule : public SceneModuleInterface const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface); bool isExecutionRequested() const override; bool isExecutionReady() const override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/src/scene.cpp index 22ee7ab77e077..9536c1ba17336 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_side_shift_module/src/scene.cpp @@ -42,8 +42,9 @@ SideShiftModule::SideShiftModule( const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT parameters_{parameters} { } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/manager.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/manager.hpp index 5d3d224673124..68b1e67e484c3 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/manager.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/manager.hpp @@ -38,7 +38,7 @@ class StartPlannerModuleManager : public SceneModuleManagerInterface { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } void updateModuleParams(const std::vector & parameters) override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp index cf9227c2387f8..9b1186cb5fc66 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/include/autoware/behavior_path_start_planner_module/start_planner_module.hpp @@ -86,7 +86,8 @@ class StartPlannerModule : public SceneModuleInterface const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface); ~StartPlannerModule() override { @@ -198,18 +199,18 @@ class StartPlannerModule : public SceneModuleInterface bool requiresDynamicObjectsCollisionDetection() const; - uint16_t getSteeringFactorDirection( + uint16_t getPlanningFactorDirection( const autoware::behavior_path_planner::BehaviorModuleOutput & output) const { switch (output.turn_signal_info.turn_signal.command) { case TurnIndicatorsCommand::ENABLE_LEFT: - return SteeringFactor::LEFT; + return PlanningFactor::SHIFT_LEFT; case TurnIndicatorsCommand::ENABLE_RIGHT: - return SteeringFactor::RIGHT; + return PlanningFactor::SHIFT_RIGHT; default: - return SteeringFactor::STRAIGHT; + return PlanningFactor::NONE; } }; diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp index 0bac50a37fdbf..ae05bcf4c084e 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/start_planner_module.cpp @@ -62,8 +62,9 @@ StartPlannerModule::StartPlannerModule( const std::shared_ptr & parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT parameters_{parameters}, vehicle_info_{autoware::vehicle_info_utils::VehicleInfoUtils(node).getVehicleInfo()}, is_freespace_planner_cb_running_{false} @@ -89,9 +90,6 @@ StartPlannerModule::StartPlannerModule( std::bind(&StartPlannerModule::onFreespacePlannerTimer, this), freespace_planner_timer_cb_group_); } - - steering_factor_interface_.init(PlanningBehavior::START_PLANNER); - velocity_factor_interface_.init(PlanningBehavior::START_PLANNER); } void StartPlannerModule::onFreespacePlannerTimer() @@ -732,9 +730,9 @@ BehaviorModuleOutput StartPlannerModule::plan() setDrivableAreaInfo(output); - setVelocityFactor(output.path); + set_longitudinal_planning_factor(output.path); - const auto steering_factor_direction = getSteeringFactorDirection(output); + const auto planning_factor_direction = getPlanningFactorDirection(output); if (status_.driving_forward) { const double start_distance = autoware::motion_utils::calcSignedArcLength( @@ -744,9 +742,9 @@ BehaviorModuleOutput StartPlannerModule::plan() path.points, planner_data_->self_odometry->pose.pose.position, status_.pull_out_path.end_pose.position); updateRTCStatus(start_distance, finish_distance); - steering_factor_interface_.set( - {status_.pull_out_path.start_pose, status_.pull_out_path.end_pose}, - {start_distance, finish_distance}, steering_factor_direction, SteeringFactor::TURNING, ""); + planning_factor_interface_->add( + start_distance, finish_distance, status_.pull_out_path.start_pose, + status_.pull_out_path.end_pose, planning_factor_direction, SafetyFactorArray{}); setDebugData(); return output; } @@ -754,9 +752,9 @@ BehaviorModuleOutput StartPlannerModule::plan() path.points, planner_data_->self_odometry->pose.pose.position, status_.pull_out_path.start_pose.position); updateRTCStatus(0.0, distance); - steering_factor_interface_.set( - {status_.pull_out_path.start_pose, status_.pull_out_path.end_pose}, {0.0, distance}, - steering_factor_direction, SteeringFactor::TURNING, ""); + planning_factor_interface_->add( + 0.0, distance, status_.pull_out_path.start_pose, status_.pull_out_path.end_pose, + planning_factor_direction, SafetyFactorArray{}); setDebugData(); @@ -839,7 +837,7 @@ BehaviorModuleOutput StartPlannerModule::planWaitingApproval() setDrivableAreaInfo(output); - const auto steering_factor_direction = getSteeringFactorDirection(output); + const auto planning_factor_direction = getPlanningFactorDirection(output); if (status_.driving_forward) { const double start_distance = autoware::motion_utils::calcSignedArcLength( @@ -849,10 +847,9 @@ BehaviorModuleOutput StartPlannerModule::planWaitingApproval() stop_path.points, planner_data_->self_odometry->pose.pose.position, status_.pull_out_path.end_pose.position); updateRTCStatus(start_distance, finish_distance); - steering_factor_interface_.set( - {status_.pull_out_path.start_pose, status_.pull_out_path.end_pose}, - {start_distance, finish_distance}, steering_factor_direction, SteeringFactor::APPROACHING, - ""); + planning_factor_interface_->add( + start_distance, finish_distance, status_.pull_out_path.start_pose, + status_.pull_out_path.end_pose, planning_factor_direction, SafetyFactorArray{}); setDebugData(); return output; @@ -861,9 +858,9 @@ BehaviorModuleOutput StartPlannerModule::planWaitingApproval() stop_path.points, planner_data_->self_odometry->pose.pose.position, status_.pull_out_path.start_pose.position); updateRTCStatus(0.0, distance); - steering_factor_interface_.set( - {status_.pull_out_path.start_pose, status_.pull_out_path.end_pose}, {0.0, distance}, - steering_factor_direction, SteeringFactor::APPROACHING, ""); + planning_factor_interface_->add( + 0.0, distance, status_.pull_out_path.start_pose, status_.pull_out_path.end_pose, + planning_factor_direction, SafetyFactorArray{}); setDebugData(); diff --git a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/manager.hpp b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/manager.hpp index 895390f91cc16..6296acd8e71f7 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/manager.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/manager.hpp @@ -41,7 +41,7 @@ class StaticObstacleAvoidanceModuleManager : public SceneModuleManagerInterface { return std::make_unique( name_, *node_, parameters_, rtc_interface_ptr_map_, - objects_of_interest_marker_interface_ptr_map_); + objects_of_interest_marker_interface_ptr_map_, planning_factor_interface_); } void updateModuleParams(const std::vector & parameters) override; diff --git a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/scene.hpp b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/scene.hpp index 5848cc75f148e..247e22e1aedad 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/scene.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/include/autoware/behavior_path_static_obstacle_avoidance_module/scene.hpp @@ -46,7 +46,8 @@ class StaticObstacleAvoidanceModule : public SceneModuleInterface const std::string & name, rclcpp::Node & node, std::shared_ptr parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map); + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface); CandidateOutput planCandidate() const override; BehaviorModuleOutput plan() override; @@ -131,9 +132,9 @@ class StaticObstacleAvoidanceModule : public SceneModuleInterface } if (finish_distance > -1.0e-03) { - steering_factor_interface_.set( - {left_shift.start_pose, left_shift.finish_pose}, {start_distance, finish_distance}, - SteeringFactor::LEFT, SteeringFactor::TURNING, ""); + planning_factor_interface_->add( + start_distance, finish_distance, left_shift.start_pose, left_shift.finish_pose, + PlanningFactor::SHIFT_LEFT, SafetyFactorArray{}); } } @@ -151,9 +152,9 @@ class StaticObstacleAvoidanceModule : public SceneModuleInterface } if (finish_distance > -1.0e-03) { - steering_factor_interface_.set( - {right_shift.start_pose, right_shift.finish_pose}, {start_distance, finish_distance}, - SteeringFactor::RIGHT, SteeringFactor::TURNING, ""); + planning_factor_interface_->add( + start_distance, finish_distance, right_shift.start_pose, right_shift.finish_pose, + PlanningFactor::SHIFT_RIGHT, SafetyFactorArray{}); } } } diff --git a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/scene.cpp index 48729c9c4fa0c..739b5b21f59dc 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_static_obstacle_avoidance_module/src/scene.cpp @@ -79,14 +79,13 @@ StaticObstacleAvoidanceModule::StaticObstacleAvoidanceModule( const std::string & name, rclcpp::Node & node, std::shared_ptr parameters, const std::unordered_map> & rtc_interface_ptr_map, std::unordered_map> & - objects_of_interest_marker_interface_ptr_map) -: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map}, // NOLINT + objects_of_interest_marker_interface_ptr_map, + const std::shared_ptr & planning_factor_interface) +: SceneModuleInterface{name, node, rtc_interface_ptr_map, objects_of_interest_marker_interface_ptr_map, planning_factor_interface}, // NOLINT helper_{std::make_shared(parameters)}, parameters_{parameters}, generator_{parameters} { - steering_factor_interface_.init(PlanningBehavior::AVOIDANCE); - velocity_factor_interface_.init(PlanningBehavior::AVOIDANCE); } bool StaticObstacleAvoidanceModule::isExecutionRequested() const @@ -776,7 +775,7 @@ void StaticObstacleAvoidanceModule::updateEgoBehavior( insertReturnDeadLine(isBestEffort(parameters_->policy_deceleration), path); - setVelocityFactor(path.path); + set_longitudinal_planning_factor(path.path); } bool StaticObstacleAvoidanceModule::isSafePath( @@ -1209,13 +1208,12 @@ CandidateOutput StaticObstacleAvoidanceModule::planCandidate() const output.start_distance_to_path_change = sl_front.start_longitudinal; output.finish_distance_to_path_change = sl_back.end_longitudinal; - const uint16_t steering_factor_direction = std::invoke([&output]() { - return output.lateral_shift > 0.0 ? SteeringFactor::LEFT : SteeringFactor::RIGHT; + const uint16_t planning_factor_direction = std::invoke([&output]() { + return output.lateral_shift > 0.0 ? PlanningFactor::SHIFT_LEFT : PlanningFactor::SHIFT_RIGHT; }); - steering_factor_interface_.set( - {sl_front.start, sl_back.end}, - {output.start_distance_to_path_change, output.finish_distance_to_path_change}, - steering_factor_direction, SteeringFactor::APPROACHING, ""); + planning_factor_interface_->add( + output.start_distance_to_path_change, output.finish_distance_to_path_change, sl_front.start, + sl_back.end, planning_factor_direction, SafetyFactorArray{}, true, 0.0, output.lateral_shift); output.path_candidate = shifted_path.path; return output; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp index 5e8ef9fc8a063..91eff0b01346a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/include/autoware/behavior_velocity_blind_spot_module/scene.hpp @@ -74,7 +74,9 @@ class BlindSpotModule : public SceneModuleInterfaceWithRTC BlindSpotModule( const int64_t module_id, const int64_t lane_id, const TurnDirection turn_direction, const std::shared_ptr planner_data, const PlannerParam & planner_param, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); /** * @brief plan go-stop velocity at traffic crossing with collision check between reference path diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/decisions.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/decisions.cpp index 64e1435167a89..a978c074e0018 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/decisions.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/decisions.cpp @@ -101,8 +101,11 @@ void BlindSpotModule::reactRTCApprovalByDecision( decision.stop_line_idx, planner_data_->vehicle_info_.max_longitudinal_offset_m, *path); const auto stop_pose = path->points.at(decision.stop_line_idx).point.pose; - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, + "blind_spot(module is judging as UNSAFE)"); } return; } @@ -132,8 +135,11 @@ void BlindSpotModule::reactRTCApprovalByDecision( decision.stop_line_idx, planner_data_->vehicle_info_.max_longitudinal_offset_m, *path); const auto stop_pose = path->points.at(decision.stop_line_idx).point.pose; - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, + "blind_spot(module is judging as SAFE and RTC is not approved)"); } return; } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp index d6cae9004600a..ee6516f025709 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/manager.cpp @@ -59,7 +59,7 @@ void BlindSpotModuleManager::launchNewModules(const tier4_planning_msgs::msg::Pa registerModule(std::make_shared( module_id, lane_id, turn_direction, planner_data_, planner_param_, - logger_.get_child("blind_spot_module"), clock_)); + logger_.get_child("blind_spot_module"), clock_, time_keeper_, planning_factor_interface_)); generateUUID(module_id); updateRTCStatus( getUUID(module_id), true, State::WAITING_FOR_EXECUTION, std::numeric_limits::lowest(), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp index 8a9401646aaea..4fca5f821f934 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_blind_spot_module/src/scene.cpp @@ -40,14 +40,15 @@ namespace bg = boost::geometry; BlindSpotModule::BlindSpotModule( const int64_t module_id, const int64_t lane_id, const TurnDirection turn_direction, const std::shared_ptr planner_data, const PlannerParam & planner_param, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(module_id, logger, clock), + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterfaceWithRTC(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), planner_param_{planner_param}, turn_direction_(turn_direction), is_over_pass_judge_line_(false) { - velocity_factor_.init(PlanningBehavior::REAR_CHECK); sibling_straight_lanelet_ = getSiblingStraightLanelet( planner_data->route_handler_->getLaneletMapPtr()->laneletLayer.get(lane_id_), planner_data->route_handler_->getRoutingGraphPtr()); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp index cdaff7225a7d2..5bfd31b75976a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/manager.cpp @@ -192,8 +192,8 @@ void CrosswalkModuleManager::launchNewModules(const PathWithLaneId & path) // NOTE: module_id is always a lane id so that isModuleRegistered works correctly in the case // where both regulatory element and non-regulatory element crosswalks exist. registerModule(std::make_shared( - node_, road_lanelet_id, crosswalk_lanelet_id, reg_elem_id, lanelet_map_ptr, p, logger, - clock_)); + node_, road_lanelet_id, crosswalk_lanelet_id, reg_elem_id, lanelet_map_ptr, p, logger, clock_, + time_keeper_, planning_factor_interface_)); generateUUID(crosswalk_lanelet_id); updateRTCStatus( getUUID(crosswalk_lanelet_id), true, State::WAITING_FOR_EXECUTION, diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp index 64f7e9e14dcd1..844647e33f8c0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp @@ -34,12 +34,12 @@ #include #include #include +#include #include #include #include #include #include - namespace autoware::behavior_velocity_planner { namespace bg = boost::geometry; @@ -175,13 +175,14 @@ CrosswalkModule::CrosswalkModule( rclcpp::Node & node, const int64_t lane_id, const int64_t module_id, const std::optional & reg_elem_id, const lanelet::LaneletMapPtr & lanelet_map_ptr, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(module_id, logger, clock), + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterfaceWithRTC(module_id, logger, clock, time_keeper, planning_factor_interface), module_id_(module_id), planner_param_(planner_param), use_regulatory_element_(reg_elem_id) { - velocity_factor_.init(PlanningBehavior::CROSSWALK); passed_safety_slow_point_ = false; if (use_regulatory_element_) { @@ -898,9 +899,11 @@ void CrosswalkModule::applySlowDown( } } if (slowdown_pose) - velocity_factor_.set( - output.points, planner_data_->current_odometry->pose, *slowdown_pose, - VelocityFactor::APPROACHING); + planning_factor_interface_->add( + output.points, planner_data_->current_odometry->pose, *slowdown_pose, *slowdown_pose, + tier4_planning_msgs::msg::PlanningFactor::SLOW_DOWN, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, + safety_slow_down_speed, 0.0 /*shift distance*/, "crosswalk_safety_slowdown_for_approaching"); } void CrosswalkModule::applySlowDownByLanelet2Map( @@ -1377,9 +1380,11 @@ void CrosswalkModule::planStop( // Plan stop insertDecelPointWithDebugInfo(stop_factor->stop_pose.position, 0.0, ego_path); - velocity_factor_.set( + planning_factor_interface_->add( ego_path.points, planner_data_->current_odometry->pose, stop_factor->stop_pose, - VelocityFactor::UNKNOWN); + stop_factor->stop_pose, tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0 /*velocity*/, + 0.0 /*shift distance*/, "crosswalk_stop"); } bool CrosswalkModule::checkRestartSuppression( diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp index d5a9e463c730b..f32ee96623822 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_crosswalk_module/src/scene_crosswalk.hpp @@ -334,7 +334,9 @@ class CrosswalkModule : public SceneModuleInterfaceWithRTC rclcpp::Node & node, const int64_t lane_id, const int64_t module_id, const std::optional & reg_elem_id, const lanelet::LaneletMapPtr & lanelet_map_ptr, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp index fb2c17d9e3745..f231d7adc3326 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/manager.cpp @@ -64,7 +64,8 @@ void DetectionAreaModuleManager::launchNewModules( if (!isModuleRegistered(module_id)) { registerModule(std::make_shared( module_id, lane_id, *detection_area_with_lane_id.first, planner_param_, - logger_.get_child("detection_area_module"), clock_)); + logger_.get_child("detection_area_module"), clock_, time_keeper_, + planning_factor_interface_)); } } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp index 031c45753022e..59f6f20937f41 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp @@ -36,8 +36,10 @@ DetectionAreaModule::DetectionAreaModule( const int64_t module_id, const int64_t lane_id, const lanelet::autoware::DetectionArea & detection_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), detection_area_reg_elem_(detection_area_reg_elem), state_(State::GO), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp index 9224cf4624687..1d3e5f3540ff3 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.hpp @@ -68,7 +68,9 @@ class DetectionAreaModule : public SceneModuleInterface const int64_t module_id, const int64_t lane_id, const lanelet::autoware::DetectionArea & detection_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp index 41bdbe3e43c8b..d6f7dfbac92d4 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/manager.cpp @@ -338,7 +338,8 @@ void IntersectionModuleManager::launchNewModules( } const auto new_module = std::make_shared( module_id, lane_id, planner_data_, intersection_param_, associative_ids, turn_direction, - has_traffic_light, node_, logger_.get_child("intersection_module"), clock_); + has_traffic_light, node_, logger_.get_child("intersection_module"), clock_, time_keeper_, + planning_factor_interface_); generateUUID(module_id); /* set RTC status as non_occluded status initially */ const UUID uuid = getUUID(new_module->getModuleId()); @@ -526,7 +527,8 @@ void MergeFromPrivateModuleManager::launchNewModules( planning_utils::getAssociativeIntersectionLanelets(ll, lanelet_map, routing_graph); registerModule(std::make_shared( module_id, lane_id, planner_data_, merge_from_private_area_param_, associative_ids, - logger_.get_child("merge_from_private_road_module"), clock_)); + logger_.get_child("merge_from_private_road_module"), clock_, time_keeper_, + planning_factor_interface_)); continue; } } else { @@ -540,7 +542,8 @@ void MergeFromPrivateModuleManager::launchNewModules( planning_utils::getAssociativeIntersectionLanelets(ll, lanelet_map, routing_graph); registerModule(std::make_shared( module_id, lane_id, planner_data_, merge_from_private_area_param_, associative_ids, - logger_.get_child("merge_from_private_road_module"), clock_)); + logger_.get_child("merge_from_private_road_module"), clock_, time_keeper_, + planning_factor_interface_)); continue; } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp index 93a13a4d62737..2d5da0f070ed9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp @@ -18,7 +18,6 @@ #include // for toGeomPoly #include -#include #include #include // for toPolygon2d #include @@ -52,8 +51,10 @@ IntersectionModule::IntersectionModule( [[maybe_unused]] std::shared_ptr planner_data, const PlannerParam & planner_param, const std::set & associative_ids, const std::string & turn_direction, const bool has_traffic_light, rclcpp::Node & node, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(module_id, logger, clock), + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterfaceWithRTC(module_id, logger, clock, time_keeper, planning_factor_interface), planner_param_(planner_param), lane_id_(lane_id), associative_ids_(associative_ids), @@ -61,8 +62,6 @@ IntersectionModule::IntersectionModule( has_traffic_light_(has_traffic_light), occlusion_uuid_(autoware::universe_utils::generateUUID()) { - velocity_factor_.init(PlanningBehavior::INTERSECTION); - { collision_state_machine_.setMarginTime( planner_param_.collision_detection.collision_detection_hold_time); @@ -705,7 +704,7 @@ void reactRTCApprovalByDecisionResult( [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, [[maybe_unused]] const double baselink2front, [[maybe_unused]] tier4_planning_msgs::msg::PathWithLaneId * path, - [[maybe_unused]] VelocityFactorInterface * velocity_factor, + [[maybe_unused]] motion_utils::PlanningFactorInterface * planning_factor_interface, [[maybe_unused]] IntersectionModule::DebugData * debug_data) { static_assert("Unsupported type passed to reactRTCByDecisionResult"); @@ -720,7 +719,7 @@ void reactRTCApprovalByDecisionResult( [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, [[maybe_unused]] const double baselink2front, [[maybe_unused]] tier4_planning_msgs::msg::PathWithLaneId * path, - [[maybe_unused]] VelocityFactorInterface * velocity_factor, + [[maybe_unused]] motion_utils::PlanningFactorInterface * planning_factor_interface, [[maybe_unused]] IntersectionModule::DebugData * debug_data) { return; @@ -734,7 +733,7 @@ void reactRTCApprovalByDecisionResult( [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, [[maybe_unused]] const double baselink2front, [[maybe_unused]] tier4_planning_msgs::msg::PathWithLaneId * path, - [[maybe_unused]] VelocityFactorInterface * velocity_factor, + [[maybe_unused]] motion_utils::PlanningFactorInterface * planning_factor_interface, [[maybe_unused]] IntersectionModule::DebugData * debug_data) { return; @@ -746,7 +745,8 @@ void reactRTCApprovalByDecisionResult( const StuckStop & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -760,9 +760,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(pure StuckStop)"); } } if (!rtc_occlusion_approved && decision_result.occlusion_stopline_idx) { @@ -771,9 +774,13 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(occlusion_stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(closest_idx).point.pose, - path->points.at(occlusion_stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(occlusion_stopline_idx).point.pose, + path->points.at(occlusion_stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(StuckStop with occlusion)"); } } return; @@ -785,7 +792,8 @@ void reactRTCApprovalByDecisionResult( const YieldStuckStop & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -799,9 +807,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(Yield Stuck)"); } } return; @@ -813,7 +824,8 @@ void reactRTCApprovalByDecisionResult( const NonOccludedCollisionStop & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -825,9 +837,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(CollisionStop)"); } } if (!rtc_occlusion_approved) { @@ -836,9 +851,12 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(CollisionStop with occlusion)"); } } return; @@ -849,7 +867,8 @@ void reactRTCApprovalByDecisionResult( const bool rtc_default_approved, const bool rtc_occlusion_approved, const FirstWaitBeforeOcclusion & decision_result, const IntersectionModule::PlannerParam & planner_param, const double baselink2front, - tier4_planning_msgs::msg::PathWithLaneId * path, VelocityFactorInterface * velocity_factor, + tier4_planning_msgs::msg::PathWithLaneId * path, + motion_utils::PlanningFactorInterface * planning_factor_interface, IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( @@ -862,9 +881,12 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_first_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(FirstWaitBeforeOcclusion with collision)"); } } if (!rtc_occlusion_approved) { @@ -881,9 +903,12 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(FirstWaitBeforeOcclusion with occlusion)"); } } return; @@ -894,7 +919,8 @@ void reactRTCApprovalByDecisionResult( const bool rtc_default_approved, const bool rtc_occlusion_approved, const PeekingTowardOcclusion & decision_result, const IntersectionModule::PlannerParam & planner_param, const double baselink2front, - tier4_planning_msgs::msg::PathWithLaneId * path, VelocityFactorInterface * velocity_factor, + tier4_planning_msgs::msg::PathWithLaneId * path, + motion_utils::PlanningFactorInterface * planning_factor_interface, IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( @@ -920,9 +946,13 @@ void reactRTCApprovalByDecisionResult( debug_data->static_occlusion_with_traffic_light_timeout = decision_result.static_occlusion_timeout; { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(occlusion_peeking_stopline).point.pose, VelocityFactor::UNKNOWN); + path->points.at(occlusion_peeking_stopline).point.pose, + path->points.at(occlusion_peeking_stopline).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(PeekingToOcclusion)"); } } if (!rtc_default_approved) { @@ -931,9 +961,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(PeekingToOcclusion while stopping for collision)"); } } return; @@ -945,7 +978,8 @@ void reactRTCApprovalByDecisionResult( const OccludedCollisionStop & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -957,9 +991,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(CollisionStop with occlusion)"); } } if (!rtc_occlusion_approved) { @@ -972,9 +1009,12 @@ void reactRTCApprovalByDecisionResult( debug_data->static_occlusion_with_traffic_light_timeout = decision_result.static_occlusion_timeout; { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(CollisionStop with occlusion)"); } } return; @@ -986,7 +1026,8 @@ void reactRTCApprovalByDecisionResult( const OccludedAbsenceTrafficLight & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -998,9 +1039,13 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, + "intersection(Occlusion without traffic light, collision detected)"); } } if (!rtc_occlusion_approved && decision_result.temporal_stop_before_attention_required) { @@ -1009,9 +1054,12 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(Occlusion without traffic light)"); } } if (!rtc_occlusion_approved && !decision_result.temporal_stop_before_attention_required) { @@ -1032,7 +1080,8 @@ void reactRTCApprovalByDecisionResult( const bool rtc_default_approved, const bool rtc_occlusion_approved, const Safe & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -1043,9 +1092,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(Safe, but RTC interrupted for collision)"); } } if (!rtc_occlusion_approved) { @@ -1054,9 +1106,12 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(Safe, but RTC interrupted for occlusion)"); } } return; @@ -1068,7 +1123,8 @@ void reactRTCApprovalByDecisionResult( const FullyPrioritized & decision_result, [[maybe_unused]] const IntersectionModule::PlannerParam & planner_param, const double baselink2front, tier4_planning_msgs::msg::PathWithLaneId * path, - VelocityFactorInterface * velocity_factor, IntersectionModule::DebugData * debug_data) + motion_utils::PlanningFactorInterface * planning_factor_interface, + IntersectionModule::DebugData * debug_data) { RCLCPP_DEBUG( rclcpp::get_logger("reactRTCApprovalByDecisionResult"), @@ -1080,9 +1136,12 @@ void reactRTCApprovalByDecisionResult( debug_data->collision_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, "intersection(FullyPrioritized, collision detected)"); } } if (!rtc_occlusion_approved) { @@ -1091,9 +1150,13 @@ void reactRTCApprovalByDecisionResult( debug_data->occlusion_stop_wall_pose = planning_utils::getAheadPose(stopline_idx, baselink2front, *path); { - velocity_factor->set( + planning_factor_interface->add( path->points, path->points.at(decision_result.closest_idx).point.pose, - path->points.at(stopline_idx).point.pose, VelocityFactor::UNKNOWN); + path->points.at(stopline_idx).point.pose, path->points.at(stopline_idx).point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, + "intersection(FullyPrioritized, RTC for occlusion is interrupting)"); } } return; @@ -1107,7 +1170,7 @@ void IntersectionModule::reactRTCApproval( VisitorSwitch{[&](const auto & decision) { reactRTCApprovalByDecisionResult( activated_, occlusion_activated_, decision, planner_param_, baselink2front, path, - &velocity_factor_, &debug_data_); + planning_factor_interface_.get(), &debug_data_); }}, decision_result); return; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp index 6c31be2ce83b9..db0cfbe98d53c 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.hpp @@ -304,7 +304,9 @@ class IntersectionModule : public SceneModuleInterfaceWithRTC const int64_t module_id, const int64_t lane_id, std::shared_ptr planner_data, const PlannerParam & planner_param, const std::set & associative_ids, const std::string & turn_direction, const bool has_traffic_light, rclcpp::Node & node, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); /** *********************************************************** diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.cpp index 3dfdcc36c0cff..fc442337198af 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.cpp @@ -41,12 +41,13 @@ MergeFromPrivateRoadModule::MergeFromPrivateRoadModule( const int64_t module_id, const int64_t lane_id, [[maybe_unused]] std::shared_ptr planner_data, const PlannerParam & planner_param, const std::set & associative_ids, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), associative_ids_(associative_ids) { - velocity_factor_.init(PlanningBehavior::MERGE); planner_param_ = planner_param; state_machine_.setState(StateMachine::State::STOP); } @@ -153,8 +154,10 @@ bool MergeFromPrivateRoadModule::modifyPathVelocity(PathWithLaneId * path) /* get stop point and stop factor */ const auto & stop_pose = path->points.at(stopline_idx).point.pose; - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, "merge_from_private"); const double signed_arc_dist_to_stop_point = autoware::motion_utils::calcSignedArcLength( path->points, current_pose.position, path->points.at(stopline_idx).point.pose.position); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.hpp index dc8bf1a96a7a2..fe446d304d9e0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_merge_from_private_road.hpp @@ -61,7 +61,9 @@ class MergeFromPrivateRoadModule : public SceneModuleInterface MergeFromPrivateRoadModule( const int64_t module_id, const int64_t lane_id, std::shared_ptr planner_data, const PlannerParam & planner_param, const std::set & associative_ids, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); /** * @brief plan go-stop velocity at traffic crossing with collision check between reference path diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.cpp index 9cb1153a8edd2..517568c93bd35 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/manager.cpp @@ -51,7 +51,8 @@ void NoDrivableLaneModuleManager::launchNewModules( } registerModule(std::make_shared( - module_id, lane_id, planner_param_, logger_.get_child("no_drivable_lane_module"), clock_)); + module_id, lane_id, planner_param_, logger_.get_child("no_drivable_lane_module"), clock_, + time_keeper_, planning_factor_interface_)); } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp index 8365251904b18..f32210bc502bf 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp @@ -21,14 +21,18 @@ #include #include +#include + namespace autoware::behavior_velocity_planner { using autoware::universe_utils::createPoint; NoDrivableLaneModule::NoDrivableLaneModule( const int64_t module_id, const int64_t lane_id, const PlannerParam & planner_param, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), planner_param_(planner_param), debug_data_(), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.hpp index d8c5e3e0425d1..835e946443e90 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.hpp @@ -55,7 +55,9 @@ class NoDrivableLaneModule : public SceneModuleInterface NoDrivableLaneModule( const int64_t module_id, const int64_t lane_id, const PlannerParam & planner_param, - const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp index dca2dde33b693..55b6c0dffd1a4 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/manager.cpp @@ -60,7 +60,7 @@ void NoStoppingAreaModuleManager::launchNewModules( // assign 1 no stopping area for each module registerModule(std::make_shared( module_id, lane_id, *m.first, planner_param_, logger_.get_child("no_stopping_area_module"), - clock_)); + clock_, time_keeper_, planning_factor_interface_)); generateUUID(module_id); updateRTCStatus( getUUID(module_id), true, State::WAITING_FOR_EXECUTION, diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp index 5c79ec69a9d98..bcb8b365f6205 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp @@ -30,6 +30,7 @@ #include #include +#include #include namespace autoware::behavior_velocity_planner @@ -40,8 +41,10 @@ NoStoppingAreaModule::NoStoppingAreaModule( const int64_t module_id, const int64_t lane_id, const lanelet::autoware::NoStoppingArea & no_stopping_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(module_id, logger, clock), + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterfaceWithRTC(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), no_stopping_area_reg_elem_(no_stopping_area_reg_elem), planner_param_(planner_param), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp index 1eafcf157623d..0d53441924805 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.hpp @@ -57,7 +57,9 @@ class NoStoppingAreaModule : public SceneModuleInterfaceWithRTC const int64_t module_id, const int64_t lane_id, const lanelet::autoware::NoStoppingArea & no_stopping_area_reg_elem, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.cpp index c4dace9d49244..d28cff55a7a8d 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/manager.cpp @@ -123,8 +123,8 @@ void OcclusionSpotModuleManager::launchNewModules( // general if (!isModuleRegistered(module_id_)) { registerModule(std::make_shared( - module_id_, planner_data_, planner_param_, logger_.get_child("occlusion_spot_module"), - clock_)); + module_id_, planner_data_, planner_param_, logger_.get_child("occlusion_spot_module"), clock_, + time_keeper_, planning_factor_interface_)); } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp index c5d1cf61614b2..1163b00e08ccb 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp @@ -64,8 +64,11 @@ namespace utils = occlusion_spot_utils; OcclusionSpotModule::OcclusionSpotModule( const int64_t module_id, const std::shared_ptr & planner_data, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), param_(planner_param) + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), + param_(planner_param) { velocity_factor_.init(PlanningBehavior::UNKNOWN); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.hpp index 35c409a9c459b..22b2a91be66b0 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.hpp @@ -48,7 +48,9 @@ class OcclusionSpotModule : public SceneModuleInterface OcclusionSpotModule( const int64_t module_id, const std::shared_ptr & planner_data, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); /** * @brief plan occlusion spot velocity at unknown area in occupancy grid diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp index a891b011dbab8..ad1ae1d47664a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -79,7 +80,9 @@ class SceneModuleInterface { public: explicit SceneModuleInterface( - const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock); + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); virtual ~SceneModuleInterface() = default; virtual bool modifyPathVelocity(PathWithLaneId * path) = 0; @@ -94,13 +97,6 @@ class SceneModuleInterface planner_data_ = planner_data; } - void setTimeKeeper(const std::shared_ptr & time_keeper) - { - time_keeper_ = time_keeper; - } - - std::shared_ptr getTimeKeeper() { return time_keeper_; } - void resetVelocityFactor() { velocity_factor_.reset(); } VelocityFactor getVelocityFactor() const { return velocity_factor_.get(); } std::vector getObjectsOfInterestData() const { return objects_of_interest_; } @@ -111,9 +107,10 @@ class SceneModuleInterface rclcpp::Logger logger_; rclcpp::Clock::SharedPtr clock_; std::shared_ptr planner_data_; - autoware::motion_utils::VelocityFactorInterface velocity_factor_; + autoware::motion_utils::VelocityFactorInterface velocity_factor_; // TODO(soblin): remove this std::vector objects_of_interest_; mutable std::shared_ptr time_keeper_; + std::shared_ptr planning_factor_interface_; void setObjectsOfInterestData( const geometry_msgs::msg::Pose & pose, const autoware_perception_msgs::msg::Shape & shape, @@ -148,6 +145,8 @@ class SceneModuleManagerInterface std::string("~/virtual_wall/") + module_name, 5); pub_velocity_factor_ = node.create_publisher( std::string("/planning/velocity_factors/") + module_name, 1); + planning_factor_interface_ = + std::make_shared(&node, module_name); processing_time_publisher_ = std::make_shared(&node, "~/debug"); @@ -191,6 +190,7 @@ class SceneModuleManagerInterface scene_module->modifyPathVelocity(path); // The velocity factor must be called after modifyPathVelocity. + // TODO(soblin): remove this const auto velocity_factor = scene_module->getVelocityFactor(); if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { velocity_factor_array.factors.emplace_back(velocity_factor); @@ -204,6 +204,7 @@ class SceneModuleManagerInterface } pub_velocity_factor_->publish(velocity_factor_array); + planning_factor_interface_->publish(); pub_debug_->publish(debug_marker_array); if (is_publish_debug_path_) { tier4_planning_msgs::msg::PathWithLaneId debug_path; @@ -247,7 +248,6 @@ class SceneModuleManagerInterface logger_, "register task: module = %s, id = %lu", getModuleName(), scene_module->getModuleId()); registered_module_id_set_.emplace(scene_module->getModuleId()); - scene_module->setTimeKeeper(time_keeper_); scene_modules_.insert(scene_module); } @@ -282,6 +282,8 @@ class SceneModuleManagerInterface rclcpp::Publisher::SharedPtr pub_processing_time_detail_; std::shared_ptr time_keeper_; + + std::shared_ptr planning_factor_interface_; }; extern template SceneModuleManagerInterface::SceneModuleManagerInterface( rclcpp::Node & node, [[maybe_unused]] const char * module_name); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp index ffd454012d13e..db2a274272f9f 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/src/scene_module_interface.cpp @@ -25,11 +25,14 @@ namespace autoware::behavior_velocity_planner { SceneModuleInterface::SceneModuleInterface( - const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock) + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) : module_id_(module_id), logger_(logger), clock_(clock), - time_keeper_(std::shared_ptr()) + time_keeper_(time_keeper), + planning_factor_interface_(planning_factor_interface) { } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp index 4e30ab019aa4e..a955538f4f9fe 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/include/autoware/behavior_velocity_rtc_interface/scene_module_interface_with_rtc.hpp @@ -52,7 +52,9 @@ class SceneModuleInterfaceWithRTC : public SceneModuleInterface { public: explicit SceneModuleInterfaceWithRTC( - const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock); + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); virtual ~SceneModuleInterfaceWithRTC() = default; void setActivation(const bool activated) { activated_ = activated; } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp index abac509fd2b2b..2e73b35e20ed9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_rtc_interface/src/scene_module_interface_with_rtc.cpp @@ -27,8 +27,10 @@ namespace autoware::behavior_velocity_planner { SceneModuleInterfaceWithRTC::SceneModuleInterfaceWithRTC( - const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const int64_t module_id, rclcpp::Logger logger, rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), activated_(false), safe_(false), distance_(std::numeric_limits::lowest()) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.cpp index 4a16f263d0a54..4af7882461643 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/manager.cpp @@ -156,7 +156,8 @@ void RunOutModuleManager::launchNewModules(const tier4_planning_msgs::msg::PathW if (!isModuleRegistered(module_id)) { registerModule(std::make_shared( module_id, planner_data_, planner_param_, logger_.get_child("run_out_module"), - std::move(dynamic_obstacle_creator_), debug_ptr_, clock_)); + std::move(dynamic_obstacle_creator_), debug_ptr_, clock_, time_keeper_, + planning_factor_interface_)); } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.cpp index efc2d458ae2a7..193ba5eab0553 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.cpp @@ -45,15 +45,15 @@ RunOutModule::RunOutModule( const int64_t module_id, const std::shared_ptr & planner_data, const PlannerParam & planner_param, const rclcpp::Logger logger, std::unique_ptr dynamic_obstacle_creator, - const std::shared_ptr & debug_ptr, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const std::shared_ptr & debug_ptr, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), planner_param_(planner_param), dynamic_obstacle_creator_(std::move(dynamic_obstacle_creator)), debug_ptr_(debug_ptr), state_machine_(std::make_unique(planner_param.approaching.state)) { - velocity_factor_.init(PlanningBehavior::RUN_OUT); - if (planner_param.run_out.use_partition_lanelet) { const lanelet::LaneletMapConstPtr & ll = planner_data->route_handler_->getLaneletMapPtr(); planning_utils::getAllPartitionLanelets(ll, partition_lanelets_); @@ -770,9 +770,10 @@ bool RunOutModule::insertStopPoint( stop_point_with_lane_id.point.pose = *stop_point; planning_utils::insertVelocity(path, stop_point_with_lane_id, 0.0, insert_idx); - velocity_factor_.set( - path.points, planner_data_->current_odometry->pose, stop_point.value(), VelocityFactor::UNKNOWN, - "run_out"); + planning_factor_interface_->add( + path.points, planner_data_->current_odometry->pose, stop_point.value(), stop_point.value(), + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0 /*velocity*/, 0.0 /*shift_distance*/, "run_out_stop"); return true; } @@ -876,8 +877,11 @@ void RunOutModule::insertApproachingVelocity( return; } - velocity_factor_.set( - output_path.points, current_pose, stop_point.value(), VelocityFactor::UNKNOWN, "run_out"); + planning_factor_interface_->add( + output_path.points, planner_data_->current_odometry->pose, stop_point.value(), + stop_point.value(), tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0 /*velocity*/, + 0.0 /*shift_distance*/, "run_out_approaching_velocity"); // debug debug_ptr_->pushStopPose(autoware::universe_utils::calcOffsetPose( diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.hpp index 83123c71f461e..49de16753a869 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_run_out_module/src/scene.hpp @@ -47,7 +47,9 @@ class RunOutModule : public SceneModuleInterface const int64_t module_id, const std::shared_ptr & planner_data, const PlannerParam & planner_param, const rclcpp::Logger logger, std::unique_ptr dynamic_obstacle_creator, - const std::shared_ptr & debug_ptr, const rclcpp::Clock::SharedPtr clock); + const std::shared_ptr & debug_ptr, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.cpp index 4677d49b78f4b..a69e33e9e0391 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/manager.cpp @@ -63,7 +63,7 @@ void SpeedBumpModuleManager::launchNewModules(const tier4_planning_msgs::msg::Pa if (!isModuleRegistered(module_id)) { registerModule(std::make_shared( module_id, lane_id, *speed_bump_with_lane_id.first, planner_param_, - logger_.get_child("speed_bump_module"), clock_)); + logger_.get_child("speed_bump_module"), clock_, time_keeper_, planning_factor_interface_)); } } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.cpp index 54ea807f3268b..4af7801e50ba3 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.cpp @@ -21,6 +21,7 @@ #include #include +#include #include namespace autoware::behavior_velocity_planner @@ -33,8 +34,10 @@ using geometry_msgs::msg::Point32; SpeedBumpModule::SpeedBumpModule( const int64_t module_id, const int64_t lane_id, const lanelet::autoware::SpeedBump & speed_bump_reg_elem, const PlannerParam & planner_param, - const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), module_id_(module_id), lane_id_(lane_id), speed_bump_reg_elem_(std::move(speed_bump_reg_elem)), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.hpp index 176a01d5112c5..e3ee2c0566381 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_speed_bump_module/src/scene.hpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -54,7 +55,9 @@ class SpeedBumpModule : public SceneModuleInterface SpeedBumpModule( const int64_t module_id, const int64_t lane_id, const lanelet::autoware::SpeedBump & speed_bump_reg_elem, const PlannerParam & planner_param, - const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.cpp index b305a1d2aa404..e289779df34b6 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/manager.cpp @@ -81,7 +81,7 @@ void StopLineModuleManager::launchNewModules(const tier4_planning_msgs::msg::Pat if (!isModuleRegistered(module_id)) { registerModule(std::make_shared( module_id, stop_line_with_lane_id.first, planner_param_, - logger_.get_child("stop_line_module"), clock_)); + logger_.get_child("stop_line_module"), clock_, time_keeper_, planning_factor_interface_)); } } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp index 2a9c5dab1ebd9..71a5ea3b9e807 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp @@ -20,6 +20,7 @@ #include +#include #include #include @@ -28,8 +29,10 @@ namespace autoware::behavior_velocity_planner StopLineModule::StopLineModule( const int64_t module_id, lanelet::ConstLineString3d stop_line, const PlannerParam & planner_param, - const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), stop_line_(std::move(stop_line)), planner_param_(planner_param), state_(State::APPROACH), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp index 9ac1463da8618..aac830b0e9f24 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp @@ -30,6 +30,7 @@ #include +#include #include #include @@ -68,7 +69,9 @@ class StopLineModule : public SceneModuleInterface StopLineModule( const int64_t module_id, lanelet::ConstLineString3d stop_line, const PlannerParam & planner_param, const rclcpp::Logger & logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_scene.cpp index 1eafb71eb403c..e304b479a005d 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/test/test_scene.cpp @@ -74,7 +74,10 @@ class StopLineModuleTest : public ::testing::Test clock_ = std::make_shared(); module_ = std::make_shared( - 1, stop_line_, planner_param_, rclcpp::get_logger("test_logger"), clock_); + 1, stop_line_, planner_param_, rclcpp::get_logger("test_logger"), clock_, + std::make_shared(), + std::make_shared( + node_.get(), "test_stopline")); module_->setPlannerData(planner_data_); } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.cpp index 4325cc1d5aaf9..a004f5b823138 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/manager.cpp @@ -42,8 +42,9 @@ void TemplateModuleManager::launchNewModules( { int64_t module_id = 0; if (!isModuleRegistered(module_id)) { - registerModule( - std::make_shared(module_id, logger_.get_child(getModuleName()), clock_)); + registerModule(std::make_shared( + module_id, logger_.get_child(getModuleName()), clock_, time_keeper_, + planning_factor_interface_)); } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.cpp index 3ce8502baaf63..d8eea337e7186 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.cpp @@ -19,14 +19,17 @@ #include +#include #include namespace autoware::behavior_velocity_planner { TemplateModule::TemplateModule( - const int64_t module_id, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock) + const int64_t module_id, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface) { } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.hpp index 70cd5cb1235e7..ba078f3fd6421 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_template_module/src/scene.hpp @@ -18,9 +18,9 @@ #include #include +#include #include #include - namespace autoware::behavior_velocity_planner { using tier4_planning_msgs::msg::PathWithLaneId; @@ -29,7 +29,9 @@ class TemplateModule : public SceneModuleInterface { public: TemplateModule( - const int64_t module_id, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock); + const int64_t module_id, const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); /** * @brief Modify the velocity of path points. diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp index 1b66824d04623..9a402f31af0e4 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp @@ -114,7 +114,8 @@ void TrafficLightModuleManager::launchNewModules( if (!isModuleRegisteredFromExistingAssociatedModule(lane_id)) { registerModule(std::make_shared( lane_id, *(traffic_light_reg_elem.first), traffic_light_reg_elem.second, planner_param_, - logger_.get_child("traffic_light_module"), clock_)); + logger_.get_child("traffic_light_module"), clock_, time_keeper_, + planning_factor_interface_)); generateUUID(lane_id); updateRTCStatus( getUUID(lane_id), true, State::WAITING_FOR_EXECUTION, std::numeric_limits::lowest(), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp index 458d8e1588a5b..b051d5ff7eb76 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp @@ -43,8 +43,10 @@ namespace autoware::behavior_velocity_planner TrafficLightModule::TrafficLightModule( const int64_t lane_id, const lanelet::TrafficLight & traffic_light_reg_elem, lanelet::ConstLanelet lane, const PlannerParam & planner_param, const rclcpp::Logger logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterfaceWithRTC(lane_id, logger, clock), + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterfaceWithRTC(lane_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), traffic_light_reg_elem_(traffic_light_reg_elem), lane_(lane), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp index 3af13bc1927ce..c30cbbdfc1477 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.hpp @@ -69,7 +69,9 @@ class TrafficLightModule : public SceneModuleInterfaceWithRTC TrafficLightModule( const int64_t lane_id, const lanelet::TrafficLight & traffic_light_reg_elem, lanelet::ConstLanelet lane, const PlannerParam & planner_param, const rclcpp::Logger logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp index 3815c83d3b6ab..dade98dfc1133 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/manager.cpp @@ -94,7 +94,8 @@ void VirtualTrafficLightModuleManager::launchNewModules( ego_path_linestring, lanelet::utils::to2D(stop_line_opt.value()).basicLineString())) { registerModule(std::make_shared( module_id, lane_id, *m.first, m.second, planner_param_, - logger_.get_child("virtual_traffic_light_module"), clock_)); + logger_.get_child("virtual_traffic_light_module"), clock_, time_keeper_, + planning_factor_interface_)); } } } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp index 86239816ed6f2..9ba7b0bccf1b9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -38,8 +39,10 @@ VirtualTrafficLightModule::VirtualTrafficLightModule( const int64_t module_id, const int64_t lane_id, const lanelet::autoware::VirtualTrafficLight & reg_elem, lanelet::ConstLanelet lane, const PlannerParam & planner_param, const rclcpp::Logger logger, - const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), lane_id_(lane_id), reg_elem_(reg_elem), lane_(lane), diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp index 7f37e7078a431..9e7a1192d9869 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -81,7 +82,9 @@ class VirtualTrafficLightModule : public SceneModuleInterface const int64_t module_id, const int64_t lane_id, const lanelet::autoware::VirtualTrafficLight & reg_elem, lanelet::ConstLanelet lane, const PlannerParam & planner_param, const rclcpp::Logger logger, - const rclcpp::Clock::SharedPtr clock); + const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.cpp index 0f1a7509043b5..bfa8a96531090 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/manager.cpp @@ -61,7 +61,8 @@ void WalkwayModuleManager::launchNewModules(const PathWithLaneId & path) const auto lanelet_map_ptr = planner_data_->route_handler_->getLaneletMapPtr(); registerModule(std::make_shared( - lanelet.id(), lanelet_map_ptr, p, use_regulatory_element, logger, clock_)); + lanelet.id(), lanelet_map_ptr, p, use_regulatory_element, logger, clock_, time_keeper_, + planning_factor_interface_)); }; const auto crosswalk_leg_elem_map = planning_utils::getRegElemMapOnPath( diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.cpp index 6a7505930a334..94421ae27e077 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.cpp @@ -18,6 +18,7 @@ #include #include +#include #include namespace autoware::behavior_velocity_planner @@ -32,15 +33,15 @@ using autoware::universe_utils::getPose; WalkwayModule::WalkwayModule( const int64_t module_id, const lanelet::LaneletMapPtr & lanelet_map_ptr, const PlannerParam & planner_param, const bool use_regulatory_element, - const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock) -: SceneModuleInterface(module_id, logger, clock), + const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface) +: SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), module_id_(module_id), state_(State::APPROACH), planner_param_(planner_param), use_regulatory_element_(use_regulatory_element) { - velocity_factor_.init(PlanningBehavior::SIDEWALK); - if (use_regulatory_element_) { const auto reg_elem_ptr = std::dynamic_pointer_cast( lanelet_map_ptr->regulatoryElementLayer.get(module_id)); @@ -119,9 +120,10 @@ bool WalkwayModule::modifyPathVelocity(PathWithLaneId * path) } /* get stop point and stop factor */ - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose.value(), - VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose.value(), stop_pose.value(), + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0 /*velocity*/, 0.0 /*shift distance*/, "walkway_stop"); // use arc length to identify if ego vehicle is in front of walkway stop or not. const double signed_arc_dist_to_stop_point = diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.hpp index df54eafd11cc2..1bd5003498d34 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_walkway_module/src/scene_walkway.hpp @@ -44,7 +44,9 @@ class WalkwayModule : public SceneModuleInterface WalkwayModule( const int64_t module_id, const lanelet::LaneletMapPtr & lanelet_map_ptr, const PlannerParam & planner_param, const bool use_regulatory_element, - const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock); + const rclcpp::Logger & logger, const rclcpp::Clock::SharedPtr clock, + const std::shared_ptr time_keeper, + const std::shared_ptr planning_factor_interface); bool modifyPathVelocity(PathWithLaneId * path) override; diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp index 7fd5834ba2cfa..2000615b51e2c 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.cpp @@ -43,7 +43,9 @@ void DynamicObstacleStopModule::init(rclcpp::Node & node, const std::string & mo module_name_ = module_name; logger_ = node.get_logger().get_child(ns_); clock_ = node.get_clock(); - velocity_factor_interface_.init(autoware::motion_utils::PlanningBehavior::ROUTE_OBSTACLE); + + planning_factor_interface_ = std::make_unique( + &node, "dynamic_obstacle_stop"); debug_publisher_ = node.create_publisher("~/" + ns_ + "/debug_markers", 1); @@ -160,15 +162,9 @@ VelocityPlanningResult DynamicObstacleStopModule::plan( debug_data_.stop_pose = stop_pose; if (stop_pose) { result.stop_points.push_back(stop_pose->position); - const auto stop_pose_reached = - planner_data->current_odometry.twist.twist.linear.x < 1e-3 && - autoware::universe_utils::calcDistance2d(ego_data.pose, *stop_pose) < 1e-3; - velocity_factor_interface_.set( - ego_trajectory_points, ego_data.pose, *stop_pose, - stop_pose_reached ? autoware::motion_utils::VelocityFactor::STOPPED - : autoware::motion_utils::VelocityFactor::APPROACHING, - "dynamic_obstacle_stop"); - result.velocity_factor = velocity_factor_interface_.get(); + planning_factor_interface_->add( + ego_trajectory_points, ego_data.pose, *stop_pose, PlanningFactor::STOP, + SafetyFactorArray{}); create_virtual_walls(); } } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp index 1843d26a22a29..82a6d790bebe7 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_dynamic_obstacle_stop_module/src/dynamic_obstacle_stop_module.hpp @@ -33,6 +33,7 @@ class DynamicObstacleStopModule : public PluginModuleInterface { public: void init(rclcpp::Node & node, const std::string & module_name) override; + void publish_planning_factor() override { planning_factor_interface_->publish(); }; void update_parameters(const std::vector & parameters) override; VelocityPlanningResult plan( const std::vector & ego_trajectory_points, diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp index 1923f023552e3..eb89c027a3b48 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_obstacle_velocity_limiter_module/src/obstacle_velocity_limiter_module.cpp @@ -48,7 +48,6 @@ void ObstacleVelocityLimiterModule::init(rclcpp::Node & node, const std::string projection_params_ = obstacle_velocity_limiter::ProjectionParameters(node); obstacle_params_ = obstacle_velocity_limiter::ObstacleParameters(node); velocity_params_ = obstacle_velocity_limiter::VelocityParameters(node); - velocity_factor_interface_.init(autoware::motion_utils::PlanningBehavior::ROUTE_OBSTACLE); debug_publisher_ = node.create_publisher("~/" + ns_ + "/debug_markers", 1); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp index bd85546cb6c56..532cc1e8c7d51 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp @@ -58,7 +58,9 @@ void OutOfLaneModule::init(rclcpp::Node & node, const std::string & module_name) logger_ = node.get_logger(); clock_ = node.get_clock(); init_parameters(node); - velocity_factor_interface_.init(motion_utils::PlanningBehavior::ROUTE_OBSTACLE); + + planning_factor_interface_ = + std::make_unique(&node, "out_of_lane"); debug_publisher_ = node.create_publisher("~/" + ns_ + "/debug_markers", 1); @@ -310,15 +312,9 @@ VelocityPlanningResult OutOfLaneModule::plan( slowdown_pose->position, slowdown_pose->position, slowdown_velocity); } - const auto is_approaching = - motion_utils::calcSignedArcLength( - ego_trajectory_points, ego_data.pose.position, slowdown_pose->position) > 0.1 && - planner_data->current_odometry.twist.twist.linear.x > 0.1; - const auto status = is_approaching ? motion_utils::VelocityFactor::APPROACHING - : motion_utils::VelocityFactor::STOPPED; - velocity_factor_interface_.set( - ego_trajectory_points, ego_data.pose, *slowdown_pose, status, "out_of_lane"); - result.velocity_factor = velocity_factor_interface_.get(); + planning_factor_interface_->add( + ego_trajectory_points, ego_data.pose, *slowdown_pose, PlanningFactor::SLOW_DOWN, + SafetyFactorArray{}); virtual_wall_marker_creator.add_virtual_walls( out_of_lane::debug::create_virtual_walls(*slowdown_pose, slowdown_velocity == 0.0, params_)); virtual_wall_publisher_->publish(virtual_wall_marker_creator.create_markers(clock_->now())); diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp index 72f20f1c63d96..0e73994dd73a7 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.hpp @@ -38,6 +38,7 @@ class OutOfLaneModule : public PluginModuleInterface { public: void init(rclcpp::Node & node, const std::string & module_name) override; + void publish_planning_factor() override { planning_factor_interface_->publish(); }; void update_parameters(const std::vector & parameters) override; VelocityPlanningResult plan( const std::vector & ego_trajectory_points, diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/plugin_module_interface.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/plugin_module_interface.hpp index 53860c390b4db..6d683acff667f 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/plugin_module_interface.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/plugin_module_interface.hpp @@ -18,7 +18,7 @@ #include "planner_data.hpp" #include "velocity_planning_result.hpp" -#include +#include #include #include @@ -32,6 +32,9 @@ namespace autoware::motion_velocity_planner { +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::SafetyFactorArray; + class PluginModuleInterface { public: @@ -42,7 +45,7 @@ class PluginModuleInterface const std::vector & ego_trajectory_points, const std::shared_ptr planner_data) = 0; virtual std::string get_module_name() const = 0; - autoware::motion_utils::VelocityFactorInterface velocity_factor_interface_; + virtual void publish_planning_factor() {} rclcpp::Logger logger_ = rclcpp::get_logger(""); rclcpp::Publisher::SharedPtr debug_publisher_; rclcpp::Publisher::SharedPtr virtual_wall_publisher_; @@ -50,6 +53,9 @@ class PluginModuleInterface rclcpp::Publisher::SharedPtr processing_time_publisher_; autoware::motion_utils::VirtualWallMarkerCreator virtual_wall_marker_creator{}; + +protected: + std::unique_ptr planning_factor_interface_; }; } // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/velocity_planning_result.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/velocity_planning_result.hpp index 1288884a37979..7b41bf0ee9e3e 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/velocity_planning_result.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware/motion_velocity_planner_common/velocity_planning_result.hpp @@ -17,7 +17,6 @@ #include -#include #include #include @@ -43,7 +42,6 @@ struct VelocityPlanningResult { std::vector stop_points{}; std::vector slowdown_intervals{}; - std::optional velocity_factor{}; }; } // namespace autoware::motion_velocity_planner diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/README.md b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/README.md index 01062f81e77a2..c65593497b8d5 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/README.md +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/README.md @@ -30,10 +30,10 @@ This means that to stop before a wall, a stop point is inserted in the trajector ## Output topics -| Name | Type | Description | -| --------------------------- | ------------------------------------------------- | -------------------------------------------------- | -| `~/output/trajectory` | autoware_planning_msgs::msg::Trajectory | Ego trajectory with updated velocity profile | -| `~/output/velocity_factors` | autoware_adapi_v1_msgs::msg::VelocityFactorsArray | factors causing change in the ego velocity profile | +| Name | Type | Description | +| ----------------------------------------- | ---------------------------------------------- | -------------------------------------------------- | +| `~/output/trajectory` | autoware_planning_msgs::msg::Trajectory | Ego trajectory with updated velocity profile | +| `~/output/planning_factors/` | tier4_planning_msgs::msg::PlanningFactorsArray | factors causing change in the ego velocity profile | ## Services diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp index a78ab1489e080..8f5aa761573b7 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp @@ -82,9 +82,6 @@ MotionVelocityPlannerNode::MotionVelocityPlannerNode(const rclcpp::NodeOptions & // Publishers trajectory_pub_ = this->create_publisher("~/output/trajectory", 1); - velocity_factor_publisher_ = - this->create_publisher( - "~/output/velocity_factors", 1); processing_time_publisher_ = this->create_publisher( "~/debug/processing_time_ms", 1); @@ -422,20 +419,13 @@ autoware_planning_msgs::msg::Trajectory MotionVelocityPlannerNode::generate_traj resampled_trajectory, std::make_shared(planner_data_)); processing_times["plan_velocities"] = stop_watch.toc("plan_velocities"); - autoware_adapi_v1_msgs::msg::VelocityFactorArray velocity_factors; - velocity_factors.header.frame_id = "map"; - velocity_factors.header.stamp = get_clock()->now(); - for (const auto & planning_result : planning_results) { for (const auto & stop_point : planning_result.stop_points) insert_stop(output_trajectory_msg, stop_point); for (const auto & slowdown_interval : planning_result.slowdown_intervals) insert_slowdown(output_trajectory_msg, slowdown_interval); - if (planning_result.velocity_factor) - velocity_factors.factors.push_back(*planning_result.velocity_factor); } - velocity_factor_publisher_->publish(velocity_factors); return output_trajectory_msg; } diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.hpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.hpp index 18d41f5d7fe5d..4235971e76fca 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.hpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.hpp @@ -93,8 +93,6 @@ class MotionVelocityPlannerNode : public rclcpp::Node // publishers rclcpp::Publisher::SharedPtr trajectory_pub_; rclcpp::Publisher::SharedPtr debug_viz_pub_; - rclcpp::Publisher::SharedPtr - velocity_factor_publisher_; autoware::universe_utils::ProcessingTimePublisher processing_diag_publisher_{ this, "~/debug/processing_time_ms_diag"}; rclcpp::Publisher::SharedPtr diff --git a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/planner_manager.cpp b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/planner_manager.cpp index b08798cbef772..5bdf386479283 100644 --- a/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/planner_manager.cpp +++ b/planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/planner_manager.cpp @@ -102,6 +102,8 @@ std::vector MotionVelocityPlannerManager::plan_velocitie VelocityPlanningResult res = plugin->plan(ego_trajectory_points, planner_data); results.push_back(res); + plugin->publish_planning_factor(); + if (res.stop_points.size() > 0) { const auto stop_decision_metric = make_decision_metric(plugin->get_module_name(), "stop"); metrics_.push_back(stop_decision_metric); diff --git a/system/autoware_default_adapi/package.xml b/system/autoware_default_adapi/package.xml index a24d0c8a30b62..e0d3fc0f9e21b 100644 --- a/system/autoware_default_adapi/package.xml +++ b/system/autoware_default_adapi/package.xml @@ -32,6 +32,7 @@ std_srvs tier4_api_msgs tier4_control_msgs + tier4_planning_msgs tier4_system_msgs python3-flask diff --git a/system/autoware_default_adapi/src/planning.cpp b/system/autoware_default_adapi/src/planning.cpp index d89ef6c221666..e11b01115caad 100644 --- a/system/autoware_default_adapi/src/planning.cpp +++ b/system/autoware_default_adapi/src/planning.cpp @@ -18,6 +18,7 @@ #include +#include #include #include #include @@ -25,6 +26,34 @@ namespace autoware::default_adapi { +const std::map direction_map = { + {PlanningFactor::SHIFT_RIGHT, SteeringFactor::RIGHT}, + {PlanningFactor::SHIFT_LEFT, SteeringFactor::LEFT}, + {PlanningFactor::TURN_RIGHT, SteeringFactor::RIGHT}, + {PlanningFactor::TURN_LEFT, SteeringFactor::LEFT}}; + +const std::map conversion_map = { + {"behavior_path_planner", PlanningBehavior::INTERSECTION}, + {"static_obstacle_avoidance", PlanningBehavior::AVOIDANCE}, + {"crosswalk", PlanningBehavior::CROSSWALK}, + {"goal_planner", PlanningBehavior::GOAL_PLANNER}, + {"intersection", PlanningBehavior::INTERSECTION}, + {"lane_change_left", PlanningBehavior::LANE_CHANGE}, + {"lane_change_right", PlanningBehavior::LANE_CHANGE}, + {"merge_from_private", PlanningBehavior::MERGE}, + {"no_stopping_area", PlanningBehavior::NO_STOPPING_AREA}, + {"blind_spot", PlanningBehavior::REAR_CHECK}, + {"obstacle_cruise_planner", PlanningBehavior::ROUTE_OBSTACLE}, + {"motion_velocity_planner", PlanningBehavior::ROUTE_OBSTACLE}, + {"walkway", PlanningBehavior::SIDEWALK}, + {"start_planner", PlanningBehavior::START_PLANNER}, + {"stop_line", PlanningBehavior::STOP_SIGN}, + {"surround_obstacle_checker", PlanningBehavior::SURROUNDING_OBSTACLE}, + {"traffic_light", PlanningBehavior::TRAFFIC_SIGNAL}, + {"detection_area", PlanningBehavior::USER_DEFINED_DETECTION_AREA}, + {"virtual_traffic_light", PlanningBehavior::VIRTUAL_TRAFFIC_LIGHT}, + {"run_out", PlanningBehavior::RUN_OUT}}; + template void concat(std::vector & v1, const std::vector & v2) { @@ -49,16 +78,122 @@ std::vector::SharedPtr> init_factors( } template -T merge_factors(const rclcpp::Time stamp, const std::vector & factors) +std::vector convert([[maybe_unused]] const std::vector & factors) +{ + static_assert(sizeof(T) == 0, "Only specializations of convert can be used."); + throw std::logic_error("Only specializations of convert can be used."); +} + +template <> +std::vector convert(const std::vector & factors) +{ + std::vector velocity_factors; + + for (const auto & factor : factors) { + if (factor.behavior != PlanningFactor::SLOW_DOWN && factor.behavior != PlanningFactor::STOP) { + continue; + } + + if (factor.control_points.empty()) { + continue; + } + + if (conversion_map.count(factor.module) == 0) { + continue; + } + + VelocityFactor velocity_factor; + velocity_factor.behavior = conversion_map.at(factor.module); + velocity_factor.pose = factor.control_points.front().pose; + velocity_factor.distance = factor.control_points.front().distance; + + velocity_factors.push_back(velocity_factor); + } + + return velocity_factors; +} + +template <> +std::vector convert(const std::vector & factors) { - T message; + std::vector steering_factors; + + for (const auto & factor : factors) { + if ( + factor.behavior != PlanningFactor::SHIFT_RIGHT && + factor.behavior != PlanningFactor::SHIFT_LEFT && + factor.behavior != PlanningFactor::TURN_RIGHT && + factor.behavior != PlanningFactor::TURN_LEFT) { + continue; + } + + if (factor.control_points.size() < 2) { + continue; + } + + if (conversion_map.count(factor.module) == 0) { + continue; + } + + if (direction_map.count(factor.behavior) == 0) { + continue; + } + + SteeringFactor steering_factor; + steering_factor.behavior = conversion_map.at(factor.module); + steering_factor.direction = direction_map.at(factor.behavior); + steering_factor.pose = std::array{ + factor.control_points.front().pose, factor.control_points.back().pose}; + steering_factor.distance = std::array{ + factor.control_points.front().distance, factor.control_points.back().distance}; + + steering_factors.push_back(steering_factor); + } + + return steering_factors; +} + +template +T merge_factors( + [[maybe_unused]] const rclcpp::Time stamp, + [[maybe_unused]] const std::vector & factors) +{ + static_assert(sizeof(T) == 0, "Only specializations of merge_factors can be used."); + throw std::logic_error("Only specializations of merge_factors can be used."); +} + +template <> +VelocityFactorArray merge_factors( + const rclcpp::Time stamp, const std::vector & factors) +{ + VelocityFactorArray message; message.header.stamp = stamp; message.header.frame_id = "map"; for (const auto & factor : factors) { - if (factor) { - concat(message.factors, factor->factors); + if (!factor) { + continue; } + + concat(message.factors, convert(factor->factors)); + } + return message; +} + +template <> +SteeringFactorArray merge_factors( + const rclcpp::Time stamp, const std::vector & factors) +{ + SteeringFactorArray message; + message.header.stamp = stamp; + message.header.frame_id = "map"; + + for (const auto & factor : factors) { + if (!factor) { + continue; + } + + concat(message.factors, convert(factor->factors)); } return message; } @@ -70,46 +205,33 @@ PlanningNode::PlanningNode(const rclcpp::NodeOptions & options) : Node("planning stop_duration_ = declare_parameter("stop_duration", 1.0); stop_checker_ = std::make_unique(this, stop_duration_ + 1.0); - std::vector velocity_factor_topics = { - "/planning/velocity_factors/blind_spot", - "/planning/velocity_factors/crosswalk", - "/planning/velocity_factors/detection_area", - "/planning/velocity_factors/dynamic_obstacle_stop", - "/planning/velocity_factors/intersection", - "/planning/velocity_factors/merge_from_private", - "/planning/velocity_factors/no_stopping_area", - "/planning/velocity_factors/obstacle_stop", - "/planning/velocity_factors/obstacle_cruise", - "/planning/velocity_factors/occlusion_spot", - "/planning/velocity_factors/run_out", - "/planning/velocity_factors/stop_line", - "/planning/velocity_factors/surround_obstacle", - "/planning/velocity_factors/traffic_light", - "/planning/velocity_factors/virtual_traffic_light", - "/planning/velocity_factors/walkway", - "/planning/velocity_factors/motion_velocity_planner", - "/planning/velocity_factors/static_obstacle_avoidance", - "/planning/velocity_factors/dynamic_obstacle_avoidance", - "/planning/velocity_factors/avoidance_by_lane_change", - "/planning/velocity_factors/lane_change_left", - "/planning/velocity_factors/lane_change_right", - "/planning/velocity_factors/start_planner", - "/planning/velocity_factors/goal_planner"}; - - std::vector steering_factor_topics = { - "/planning/steering_factor/static_obstacle_avoidance", - "/planning/steering_factor/dynamic_obstacle_avoidance", - "/planning/steering_factor/avoidance_by_lane_change", - "/planning/steering_factor/intersection", - "/planning/steering_factor/lane_change_left", - "/planning/steering_factor/lane_change_right", - "/planning/steering_factor/start_planner", - "/planning/steering_factor/goal_planner"}; - - sub_velocity_factors_ = - init_factors(this, velocity_factors_, velocity_factor_topics); - sub_steering_factors_ = - init_factors(this, steering_factors_, steering_factor_topics); + std::vector factor_topics = { + "/planning/planning_factors/behavior_path_planner", + "/planning/planning_factors/blind_spot", + "/planning/planning_factors/crosswalk", + "/planning/planning_factors/detection_area", + "/planning/planning_factors/dynamic_obstacle_stop", + "/planning/planning_factors/intersection", + "/planning/planning_factors/merge_from_private", + "/planning/planning_factors/no_stopping_area", + "/planning/planning_factors/obstacle_cruise_planner", + "/planning/planning_factors/occlusion_spot", + "/planning/planning_factors/run_out", + "/planning/planning_factors/stop_line", + "/planning/planning_factors/surround_obstacle_checker", + "/planning/planning_factors/traffic_light", + "/planning/planning_factors/virtual_traffic_light", + "/planning/planning_factors/walkway", + "/planning/planning_factors/motion_velocity_planner", + "/planning/planning_factors/static_obstacle_avoidance", + "/planning/planning_factors/dynamic_obstacle_avoidance", + "/planning/planning_factors/avoidance_by_lane_change", + "/planning/planning_factors/lane_change_left", + "/planning/planning_factors/lane_change_right", + "/planning/planning_factors/start_planner", + "/planning/planning_factors/goal_planner"}; + + sub_factors_ = init_factors(this, factors_, factor_topics); const auto adaptor = autoware::component_interface_utils::NodeAdaptor(this); adaptor.init_pub(pub_velocity_factors_); @@ -139,8 +261,8 @@ void PlanningNode::on_kinematic_state(const KinematicState::ConstSharedPtr msg) void PlanningNode::on_timer() { using autoware_adapi_v1_msgs::msg::VelocityFactor; - auto velocity = merge_factors(now(), velocity_factors_); - auto steering = merge_factors(now(), steering_factors_); + auto velocity = merge_factors(now(), factors_); + auto steering = merge_factors(now(), factors_); // Set the distance if it is nan. if (trajectory_ && kinematic_state_) { @@ -164,6 +286,13 @@ void PlanningNode::on_timer() } } + for (auto & factor : steering.factors) { + if ((factor.status == SteeringFactor::UNKNOWN) && (!std::isnan(factor.distance.front()))) { + const auto is_turning = factor.distance.front() < 0.0; + factor.status = is_turning ? SteeringFactor::TURNING : SteeringFactor::APPROACHING; + } + } + pub_velocity_factors_->publish(velocity); pub_steering_factors_->publish(steering); } diff --git a/system/autoware_default_adapi/src/planning.hpp b/system/autoware_default_adapi/src/planning.hpp index 3a9b99e33a997..49584475734f6 100644 --- a/system/autoware_default_adapi/src/planning.hpp +++ b/system/autoware_default_adapi/src/planning.hpp @@ -21,7 +21,11 @@ #include #include +#include +#include + #include +#include #include // This file should be included after messages. @@ -30,22 +34,26 @@ namespace autoware::default_adapi { +using autoware_adapi_v1_msgs::msg::PlanningBehavior; +using autoware_adapi_v1_msgs::msg::SteeringFactor; +using autoware_adapi_v1_msgs::msg::SteeringFactorArray; +using autoware_adapi_v1_msgs::msg::VelocityFactor; +using autoware_adapi_v1_msgs::msg::VelocityFactorArray; +using tier4_planning_msgs::msg::PlanningFactor; +using tier4_planning_msgs::msg::PlanningFactorArray; + class PlanningNode : public rclcpp::Node { public: explicit PlanningNode(const rclcpp::NodeOptions & options); private: - using VelocityFactorArray = autoware_adapi_v1_msgs::msg::VelocityFactorArray; - using SteeringFactorArray = autoware_adapi_v1_msgs::msg::SteeringFactorArray; Pub pub_velocity_factors_; Pub pub_steering_factors_; Sub sub_trajectory_; Sub sub_kinematic_state_; - std::vector::SharedPtr> sub_velocity_factors_; - std::vector::SharedPtr> sub_steering_factors_; - std::vector velocity_factors_; - std::vector steering_factors_; + std::vector::SharedPtr> sub_factors_; + std::vector factors_; rclcpp::TimerBase::SharedPtr timer_; using VehicleStopChecker = autoware::motion_utils::VehicleStopCheckerBase; From dd632fc2a2bec57796ea1c0bfbfa9b7dafc93749 Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Thu, 16 Jan 2025 22:45:07 +0900 Subject: [PATCH 117/127] feat(motion_utils): add detail and pass type to VirtualWall (#9940) Signed-off-by: Mamoru Sobue --- .../motion_utils/marker/marker_helper.hpp | 5 ++ .../marker/virtual_wall_marker_creator.hpp | 3 +- .../src/marker/marker_helper.cpp | 49 ++++++++++++++++++- .../marker/virtual_wall_marker_creator.cpp | 10 +++- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/common/autoware_motion_utils/include/autoware/motion_utils/marker/marker_helper.hpp b/common/autoware_motion_utils/include/autoware/motion_utils/marker/marker_helper.hpp index ee642c93a378f..2b89fc19d1878 100644 --- a/common/autoware_motion_utils/include/autoware/motion_utils/marker/marker_helper.hpp +++ b/common/autoware_motion_utils/include/autoware/motion_utils/marker/marker_helper.hpp @@ -40,6 +40,11 @@ visualization_msgs::msg::MarkerArray createDeadLineVirtualWallMarker( const double longitudinal_offset = 0.0, const std::string & ns_prefix = "", const bool is_driving_forward = true); +visualization_msgs::msg::MarkerArray createIntendedPassVirtualMarker( + const geometry_msgs::msg::Pose & pose, const std::string & module_name, const rclcpp::Time & now, + const int32_t id, const double longitudinal_offset, const std::string & ns_prefix, + const bool is_driving_forward); + visualization_msgs::msg::MarkerArray createDeletedStopVirtualWallMarker( const rclcpp::Time & now, const int32_t id); diff --git a/common/autoware_motion_utils/include/autoware/motion_utils/marker/virtual_wall_marker_creator.hpp b/common/autoware_motion_utils/include/autoware/motion_utils/marker/virtual_wall_marker_creator.hpp index 07fcbd9840c88..fd86c54d65be9 100644 --- a/common/autoware_motion_utils/include/autoware/motion_utils/marker/virtual_wall_marker_creator.hpp +++ b/common/autoware_motion_utils/include/autoware/motion_utils/marker/virtual_wall_marker_creator.hpp @@ -29,12 +29,13 @@ namespace autoware::motion_utils { /// @brief type of virtual wall associated with different marker styles and namespace -enum VirtualWallType { stop, slowdown, deadline }; +enum VirtualWallType { stop, slowdown, deadline, pass }; /// @brief virtual wall to be visualized in rviz struct VirtualWall { geometry_msgs::msg::Pose pose{}; std::string text{}; + std::string detail{}; std::string ns{}; VirtualWallType style = stop; double longitudinal_offset{}; diff --git a/common/autoware_motion_utils/src/marker/marker_helper.cpp b/common/autoware_motion_utils/src/marker/marker_helper.cpp index 91ad1c41eecc3..44b621a53c5f1 100644 --- a/common/autoware_motion_utils/src/marker/marker_helper.cpp +++ b/common/autoware_motion_utils/src/marker/marker_helper.cpp @@ -54,7 +54,7 @@ inline visualization_msgs::msg::MarkerArray createVirtualWallMarkerArray( { auto marker = createDefaultMarker( "map", now, ns_prefix + "factor_text", id, visualization_msgs::msg::Marker::TEXT_VIEW_FACING, - createMarkerScale(0.0, 0.0, 1.0), createMarkerColor(1.0, 1.0, 1.0, 1.0)); + createMarkerScale(0.0, 0.0, 1.0 /*font size*/), createMarkerColor(1.0, 1.0, 1.0, 1.0)); marker.pose = vehicle_front_pose; marker.pose.position.z += 2.0; @@ -85,6 +85,41 @@ inline visualization_msgs::msg::MarkerArray createDeletedVirtualWallMarkerArray( return marker_array; } + +inline visualization_msgs::msg::MarkerArray createIntendedPassArrowMarkerArray( + const geometry_msgs::msg::Pose & vehicle_front_pose, const std::string & module_name, + const std::string & ns_prefix, const rclcpp::Time & now, const int32_t id, + const std_msgs::msg::ColorRGBA & color) +{ + visualization_msgs::msg::MarkerArray marker_array; + + // Arrow + { + auto marker = createDefaultMarker( + "map", now, ns_prefix + "direction", id, visualization_msgs::msg::Marker::ARROW, + createMarkerScale(2.5 /*length*/, 0.15 /*width*/, 1.0 /*height*/), color); + + marker.pose = vehicle_front_pose; + + marker_array.markers.push_back(marker); + } + + // Factor Text + { + auto marker = createDefaultMarker( + "map", now, ns_prefix + "factor_text", id, visualization_msgs::msg::Marker::TEXT_VIEW_FACING, + createMarkerScale(0.0, 0.0, 0.4 /*font size*/), createMarkerColor(1.0, 1.0, 1.0, 1.0)); + + marker.pose = vehicle_front_pose; + marker.pose.position.z += 2.0; + marker.text = module_name; + + marker_array.markers.push_back(marker); + } + + return marker_array; +} + } // namespace namespace autoware::motion_utils @@ -125,6 +160,18 @@ visualization_msgs::msg::MarkerArray createDeadLineVirtualWallMarker( createMarkerColor(0.0, 1.0, 0.0, 0.5)); } +visualization_msgs::msg::MarkerArray createIntendedPassVirtualMarker( + const geometry_msgs::msg::Pose & pose, const std::string & module_name, const rclcpp::Time & now, + const int32_t id, const double longitudinal_offset, const std::string & ns_prefix, + const bool is_driving_forward) +{ + const auto pose_with_offset = autoware::universe_utils::calcOffsetPose( + pose, longitudinal_offset * (is_driving_forward ? 1.0 : -1.0), 0.0, 0.0); + return createIntendedPassArrowMarkerArray( + pose_with_offset, module_name, ns_prefix + "intended_pass_", now, id, + createMarkerColor(0.77, 0.77, 0.77, 0.5)); +} + visualization_msgs::msg::MarkerArray createDeletedStopVirtualWallMarker( const rclcpp::Time & now, const int32_t id) { diff --git a/common/autoware_motion_utils/src/marker/virtual_wall_marker_creator.cpp b/common/autoware_motion_utils/src/marker/virtual_wall_marker_creator.cpp index 4fecaea1bb838..fb8708b5b7baa 100644 --- a/common/autoware_motion_utils/src/marker/virtual_wall_marker_creator.cpp +++ b/common/autoware_motion_utils/src/marker/virtual_wall_marker_creator.cpp @@ -63,10 +63,16 @@ visualization_msgs::msg::MarkerArray VirtualWallMarkerCreator::create_markers( case deadline: create_fn = autoware::motion_utils::createDeadLineVirtualWallMarker; break; + case pass: + create_fn = autoware::motion_utils::createIntendedPassVirtualMarker; + break; } + const auto wall_text = virtual_wall.detail.empty() + ? virtual_wall.text + : virtual_wall.text + "(" + virtual_wall.detail + ")"; auto markers = create_fn( - virtual_wall.pose, virtual_wall.text, now, 0, virtual_wall.longitudinal_offset, - virtual_wall.ns, virtual_wall.is_driving_forward); + virtual_wall.pose, wall_text, now, 0, virtual_wall.longitudinal_offset, virtual_wall.ns, + virtual_wall.is_driving_forward); for (auto & marker : markers.markers) { marker.id = static_cast(marker_count_per_namespace_[marker.ns].current++); marker_array.markers.push_back(marker); From 62e07a18c6c54f3a0213bceae320bb9e56e8af2a Mon Sep 17 00:00:00 2001 From: Kyoichi Sugahara <32741405+kyoichi-sugahara@users.noreply.github.com> Date: Thu, 16 Jan 2025 23:12:30 +0900 Subject: [PATCH 118/127] fix(start_planner, goal_planner): refactor lane departure checker initialization (#9944) --- .../src/pull_over_planner/geometric_pull_over.cpp | 8 ++++++-- .../src/pull_over_planner/shift_pull_over.cpp | 8 ++++++-- .../src/geometric_pull_out.cpp | 6 ++++-- .../src/shift_pull_out.cpp | 6 ++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp index 44dca13ccfd66..b7b4ad83de362 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp @@ -29,8 +29,12 @@ GeometricPullOver::GeometricPullOver( rclcpp::Node & node, const GoalPlannerParameters & parameters, const bool is_forward) : PullOverPlannerBase{node, parameters}, parallel_parking_parameters_{parameters.parallel_parking_parameters}, - lane_departure_checker_{ - lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_}, + lane_departure_checker_{[&]() { + auto lane_departure_checker_params = lane_departure_checker::Param{}; + lane_departure_checker_params.footprint_extra_margin = + parameters.lane_departure_check_expansion_margin; + return LaneDepartureChecker{lane_departure_checker_params, vehicle_info_}; + }()}, is_forward_{is_forward}, left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE} { diff --git a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp index 8350252369cc6..c8e0788e39b6f 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp @@ -32,8 +32,12 @@ namespace autoware::behavior_path_planner { ShiftPullOver::ShiftPullOver(rclcpp::Node & node, const GoalPlannerParameters & parameters) : PullOverPlannerBase{node, parameters}, - lane_departure_checker_{ - lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, vehicle_info_}, + lane_departure_checker_{[&]() { + auto lane_departure_checker_params = lane_departure_checker::Param{}; + lane_departure_checker_params.footprint_extra_margin = + parameters.lane_departure_check_expansion_margin; + return LaneDepartureChecker{lane_departure_checker_params, vehicle_info_}; + }()}, left_side_parking_{parameters.parking_policy == ParkingPolicy::LEFT_SIDE} { } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp index 69c5c41405932..ed09e0c0a33d6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/geometric_pull_out.cpp @@ -40,10 +40,12 @@ GeometricPullOut::GeometricPullOut( : PullOutPlannerBase{node, parameters, time_keeper}, parallel_parking_parameters_{parameters.parallel_parking_parameters} { + auto lane_departure_checker_params = autoware::lane_departure_checker::Param{}; + lane_departure_checker_params.footprint_extra_margin = + parameters.lane_departure_check_expansion_margin; lane_departure_checker_ = std::make_shared( - autoware::lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, - vehicle_info_, time_keeper_); + lane_departure_checker_params, vehicle_info_); planner_.setParameters(parallel_parking_parameters_); } diff --git a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp index 8f4de1d3636de..16a3d4ffd842a 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_start_planner_module/src/shift_pull_out.cpp @@ -44,10 +44,12 @@ ShiftPullOut::ShiftPullOut( std::shared_ptr time_keeper) : PullOutPlannerBase{node, parameters, time_keeper} { + autoware::lane_departure_checker::Param lane_departure_checker_params; + lane_departure_checker_params.footprint_extra_margin = + parameters.lane_departure_check_expansion_margin; lane_departure_checker_ = std::make_shared( - autoware::lane_departure_checker::Param{parameters.lane_departure_check_expansion_margin}, - vehicle_info_, time_keeper_); + lane_departure_checker_params, vehicle_info_, time_keeper_); } std::optional ShiftPullOut::plan( From 0bf689c2dc5a39dbe8749f270d5c21ec4733e56a Mon Sep 17 00:00:00 2001 From: Zulfaqar Azmi <93502286+zulfaqar-azmi-t4@users.noreply.github.com> Date: Thu, 16 Jan 2025 23:39:33 +0900 Subject: [PATCH 119/127] refactor(lane_change): add missing safety check parameter (#9928) * refactor(lane_change): parameterize incoming object yaw threshold Signed-off-by: Zulfaqar Azmi * Readme Signed-off-by: Zulfaqar Azmi * Update planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp Co-authored-by: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> * Add missing parameters Signed-off-by: Zulfaqar Azmi * missing dot Signed-off-by: Zulfaqar Azmi * Update planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md Co-authored-by: mkquda <168697710+mkquda@users.noreply.github.com> * update readme Signed-off-by: Zulfaqar Azmi --------- Signed-off-by: Zulfaqar Azmi Co-authored-by: Maxime CLEMENT <78338830+maxime-clem@users.noreply.github.com> Co-authored-by: mkquda <168697710+mkquda@users.noreply.github.com> --- .../README.md | 7 +++- .../config/lane_change.param.yaml | 7 +++- .../structs/parameters.hpp | 1 + .../src/manager.cpp | 32 ++++++++++++++++++- .../src/scene.cpp | 8 +++-- 5 files changed, 49 insertions(+), 6 deletions(-) diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md index 20fd564049133..601fb893f82c6 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/README.md @@ -1149,7 +1149,8 @@ The following parameters are used to configure terminal lane change path feature | `collision_check.check_other_lanes` | [-] | boolean | If true, the lane change module includes objects in other lanes when performing collision assessment. | false | | `collision_check.use_all_predicted_paths` | [-] | boolean | If false, use only the predicted path that has the maximum confidence. | true | | `collision_check.prediction_time_resolution` | [s] | double | Time resolution for object's path interpolation and collision check. | 0.5 | -| `collision_check.yaw_diff_threshold` | [rad] | double | Maximum yaw difference between ego and object when executing rss-based collision checking | 3.1416 | +| `collision_check.yaw_diff_threshold` | [rad] | double | Maximum yaw difference between predicted ego pose and predicted object pose when executing rss-based collision checking | 3.1416 | +| `collision_check.th_incoming_object_yaw` | [rad] | double | Maximum yaw difference between current ego pose and current object pose. Objects with a yaw difference exceeding this value are excluded from the safety check. | 2.3562 | #### safety constraints during lane change path is computed @@ -1162,6 +1163,7 @@ The following parameters are used to configure terminal lane change path feature | `safety_check.execution.lateral_distance_max_threshold` | [m] | double | The lateral distance threshold that is used to determine whether lateral distance between two object is enough and whether lane change is safe. | 2.0 | | `safety_check.execution.longitudinal_distance_min_threshold` | [m] | double | The longitudinal distance threshold that is used to determine whether longitudinal distance between two object is enough and whether lane change is safe. | 3.0 | | `safety_check.execution.longitudinal_velocity_delta_time` | [m] | double | The time multiplier that is used to compute the actual gap between vehicle at each predicted points (not RSS distance) | 0.8 | +| `safety_check.execution.extended_polygon_policy` | [-] | string | Policy used to determine the polygon shape for the safety check. Available options are: `rectangle` or `along-path`. | `rectangle` | #### safety constraints specifically for stopped or parked vehicles @@ -1174,6 +1176,7 @@ The following parameters are used to configure terminal lane change path feature | `safety_check.parked.lateral_distance_max_threshold` | [m] | double | The lateral distance threshold that is used to determine whether lateral distance between two object is enough and whether lane change is safe. | 1.0 | | `safety_check.parked.longitudinal_distance_min_threshold` | [m] | double | The longitudinal distance threshold that is used to determine whether longitudinal distance between two object is enough and whether lane change is safe. | 3.0 | | `safety_check.parked.longitudinal_velocity_delta_time` | [m] | double | The time multiplier that is used to compute the actual gap between vehicle at each predicted points (not RSS distance) | 0.8 | +| `safety_check.parked.extended_polygon_policy` | [-] | string | Policy used to determine the polygon shape for the safety check. Available options are: `rectangle` or `along-path`. | `rectangle` | ##### safety constraints to cancel lane change path @@ -1186,6 +1189,7 @@ The following parameters are used to configure terminal lane change path feature | `safety_check.cancel.lateral_distance_max_threshold` | [m] | double | The lateral distance threshold that is used to determine whether lateral distance between two object is enough and whether lane change is safe. | 1.0 | | `safety_check.cancel.longitudinal_distance_min_threshold` | [m] | double | The longitudinal distance threshold that is used to determine whether longitudinal distance between two object is enough and whether lane change is safe. | 2.5 | | `safety_check.cancel.longitudinal_velocity_delta_time` | [m] | double | The time multiplier that is used to compute the actual gap between vehicle at each predicted points (not RSS distance) | 0.6 | +| `safety_check.cancel.extended_polygon_policy` | [-] | string | Policy used to determine the polygon shape for the safety check. Available options are: `rectangle` or `along-path`. | `rectangle` | ##### safety constraints used during lane change path is computed when ego is stuck @@ -1198,6 +1202,7 @@ The following parameters are used to configure terminal lane change path feature | `safety_check.stuck.lateral_distance_max_threshold` | [m] | double | The lateral distance threshold that is used to determine whether lateral distance between two object is enough and whether lane change is safe. | 2.0 | | `safety_check.stuck.longitudinal_distance_min_threshold` | [m] | double | The longitudinal distance threshold that is used to determine whether longitudinal distance between two object is enough and whether lane change is safe. | 3.0 | | `safety_check.stuck.longitudinal_velocity_delta_time` | [m] | double | The time multiplier that is used to compute the actual gap between vehicle at each predicted points (not RSS distance) | 0.8 | +| `safety_check.stuck.extended_polygon_policy` | [-] | string | Policy used to determine the polygon shape for the safety check. Available options are: `rectangle` or `along-path`. | `rectangle` | (\*1) the value must be negative. diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml index 15eb23daecf95..71fac1246598f 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/config/lane_change.param.yaml @@ -58,6 +58,7 @@ lateral_distance_max_threshold: 2.0 longitudinal_distance_min_threshold: 3.0 longitudinal_velocity_delta_time: 0.0 + extended_polygon_policy: "rectangle" parked: expected_front_deceleration: -1.0 expected_rear_deceleration: -2.0 @@ -66,6 +67,7 @@ lateral_distance_max_threshold: 1.0 longitudinal_distance_min_threshold: 3.0 longitudinal_velocity_delta_time: 0.0 + extended_polygon_policy: "rectangle" cancel: expected_front_deceleration: -1.0 expected_rear_deceleration: -2.0 @@ -74,6 +76,7 @@ lateral_distance_max_threshold: 1.0 longitudinal_distance_min_threshold: 2.5 longitudinal_velocity_delta_time: 0.0 + extended_polygon_policy: "rectangle" stuck: expected_front_deceleration: -1.0 expected_rear_deceleration: -1.0 @@ -82,6 +85,7 @@ lateral_distance_max_threshold: 2.0 longitudinal_distance_min_threshold: 3.0 longitudinal_velocity_delta_time: 0.0 + extended_polygon_policy: "rectangle" # lane expansion for object filtering lane_expansion: @@ -123,7 +127,8 @@ intersection: true turns: true prediction_time_resolution: 0.5 - yaw_diff_threshold: 3.1416 + th_incoming_object_yaw: 2.3562 # [rad] + yaw_diff_threshold: 3.1416 # [rad] check_current_lanes: false check_other_lanes: false use_all_predicted_paths: false diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp index 60386f535fc64..358f60f3193d5 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/structs/parameters.hpp @@ -94,6 +94,7 @@ struct CollisionCheckParameters bool check_current_lane{true}; bool check_other_lanes{true}; bool use_all_predicted_paths{false}; + double th_incoming_object_yaw{2.3562}; double th_yaw_diff{3.1416}; double prediction_time_resolution{0.5}; }; diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp index 450497fb2ca29..589338d7b3ace 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/manager.cpp @@ -152,6 +152,8 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s getOrDeclareParameter(*node, parameter("collision_check.prediction_time_resolution")); p.safety.collision_check.th_yaw_diff = getOrDeclareParameter(*node, parameter("collision_check.yaw_diff_threshold")); + p.safety.collision_check.th_incoming_object_yaw = + getOrDeclareParameter(*node, parameter("collision_check.th_incoming_object_yaw")); // rss check auto set_rss_params = [&](auto & params, const std::string & prefix) { @@ -169,6 +171,8 @@ LCParamPtr LaneChangeModuleManager::set_params(rclcpp::Node * node, const std::s *node, parameter(prefix + ".rear_vehicle_safety_time_margin")); params.lateral_distance_max_threshold = getOrDeclareParameter(*node, parameter(prefix + ".lateral_distance_max_threshold")); + params.extended_polygon_policy = + getOrDeclareParameter(*node, parameter(prefix + ".extended_polygon_policy")); }; set_rss_params(p.safety.rss_params, "safety_check.execution"); set_rss_params(p.safety.rss_params_for_parked, "safety_check.parked"); @@ -454,6 +458,19 @@ void LaneChangeModuleManager::updateModuleParams(const std::vectorsafety.collision_check.prediction_time_resolution); updateParam( parameters, ns + "yaw_diff_threshold", p->safety.collision_check.th_yaw_diff); + + auto th_incoming_object_yaw = p->safety.collision_check.th_incoming_object_yaw; + updateParam(parameters, ns + "th_incoming_object_yaw", th_incoming_object_yaw); + if (th_incoming_object_yaw >= M_PI_2) { + p->safety.collision_check.th_incoming_object_yaw = th_incoming_object_yaw; + } else { + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 5000, + "The value of th_incoming_object_yaw (%.3f rad) is less than the minimum possible value " + "(%.3f " + "rad).", + th_incoming_object_yaw, M_PI_2); + } } { @@ -483,7 +500,7 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector(parameters, ns + "stop_time", p->th_stop_time); } - auto update_rss_params = [¶meters](const std::string & prefix, auto & params) { + auto update_rss_params = [¶meters, this](const std::string & prefix, auto & params) { using autoware::universe_utils::updateParam; updateParam( parameters, prefix + "longitudinal_distance_min_threshold", @@ -502,6 +519,19 @@ void LaneChangeModuleManager::updateModuleParams(const std::vector( parameters, prefix + "lateral_distance_max_threshold", params.lateral_distance_max_threshold); + + auto extended_polygon_policy = params.extended_polygon_policy; + updateParam( + parameters, prefix + "extended_polygon_policy", extended_polygon_policy); + if (extended_polygon_policy == "rectangle" || extended_polygon_policy == "along_path") { + params.extended_polygon_policy = extended_polygon_policy; + } else { + RCLCPP_WARN_THROTTLE( + node_->get_logger(), *node_->get_clock(), 1000, + "Policy %s not supported or there's typo. Make sure you choose either 'rectangle' or " + "'along_path'", + extended_polygon_policy.c_str()); + } }; update_rss_params("lane_change.safety_check.execution.", p->safety.rss_params); diff --git a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp index 45fcd6fa99086..611a0b60a4366 100644 --- a/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp +++ b/planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp @@ -1051,7 +1051,9 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const const auto is_same_direction = [&](const PredictedObject & object) { const auto & object_pose = object.kinematics.initial_pose_with_covariance.pose; - return !utils::path_safety_checker::isTargetObjectOncoming(current_pose, object_pose); + return !utils::path_safety_checker::isTargetObjectOncoming( + current_pose, object_pose, + common_data_ptr_->lc_param_ptr->safety.collision_check.th_incoming_object_yaw); }; // Perception noise could make stationary objects seem opposite the ego vehicle; check the @@ -1792,7 +1794,6 @@ bool NormalLaneChange::is_colliding( constexpr auto is_safe{true}; auto current_debug_data = utils::path_safety_checker::createObjectDebug(obj); - constexpr auto collision_check_yaw_diff_threshold{M_PI}; constexpr auto hysteresis_factor{1.0}; const auto obj_predicted_paths = utils::path_safety_checker::getPredictedPathFromObj( obj, lane_change_parameters_->safety.collision_check.use_all_predicted_paths); @@ -1817,7 +1818,8 @@ bool NormalLaneChange::is_colliding( const auto collided_polygons = utils::path_safety_checker::get_collided_polygons( lane_change_path.path, ego_predicted_path, obj, predicted_obj_path, bpp_param.vehicle_info, selected_rss_param, hysteresis_factor, safety_check_max_vel, - collision_check_yaw_diff_threshold, current_debug_data.second); + common_data_ptr_->lc_param_ptr->safety.collision_check.th_yaw_diff, + current_debug_data.second); if (collided_polygons.empty()) { utils::path_safety_checker::updateCollisionCheckDebugMap( From 67ab350f6e1af0c14bee74d6913c99165c2e9262 Mon Sep 17 00:00:00 2001 From: Mamoru Sobue Date: Fri, 17 Jan 2025 00:05:32 +0900 Subject: [PATCH 120/127] feat(behavior_velocity_planner)!: remove velocity_factor completely (#9943) * feat(behavior_velocity_planner)!: remove velocity_factor completely Signed-off-by: Mamoru Sobue * minimize diff Signed-off-by: Mamoru Sobue --------- Signed-off-by: Mamoru Sobue --- .../src/scene.cpp | 8 +++--- .../src/scene_intersection.cpp | 2 -- .../src/scene.cpp | 19 +++++++++----- .../src/scene_no_stopping_area.cpp | 9 ++++--- .../src/scene_occlusion_spot.cpp | 2 -- .../scene_module_interface.hpp | 22 ---------------- .../src/scene.cpp | 26 +++++-------------- .../src/scene.hpp | 5 ---- .../src/manager.cpp | 12 --------- .../src/scene.cpp | 7 ++--- .../src/scene.cpp | 15 ++++++----- .../src/scene.hpp | 4 --- 12 files changed, 39 insertions(+), 92 deletions(-) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp index 59f6f20937f41..7e6a320f3ddad 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_detection_area_module/src/scene.cpp @@ -46,7 +46,6 @@ DetectionAreaModule::DetectionAreaModule( planner_param_(planner_param), debug_data_() { - velocity_factor_.init(PlanningBehavior::USER_DEFINED_DETECTION_AREA); } bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) @@ -180,9 +179,10 @@ bool DetectionAreaModule::modifyPathVelocity(PathWithLaneId * path) // Create StopReason { - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_point->second, - VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); } return true; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp index 2d5da0f070ed9..5b8aca1c8ec9d 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_intersection_module/src/scene_intersection.cpp @@ -44,8 +44,6 @@ namespace autoware::behavior_velocity_planner { namespace bg = boost::geometry; -using autoware::motion_utils::VelocityFactorInterface; - IntersectionModule::IntersectionModule( const int64_t module_id, const int64_t lane_id, [[maybe_unused]] std::shared_ptr planner_data, diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp index f32210bc502bf..0e646e92035cf 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_drivable_lane_module/src/scene.cpp @@ -38,7 +38,6 @@ NoDrivableLaneModule::NoDrivableLaneModule( debug_data_(), state_(State::INIT) { - velocity_factor_.init(PlanningBehavior::NO_DRIVABLE_LANE); } bool NoDrivableLaneModule::modifyPathVelocity(PathWithLaneId * path) @@ -166,8 +165,10 @@ void NoDrivableLaneModule::handle_approaching_state(PathWithLaneId * path) // Get stop point and stop factor { const auto & stop_pose = op_stop_pose.value(); - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::APPROACHING); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); const auto virtual_wall_pose = autoware::motion_utils::calcLongitudinalOffsetPose( path->points, stop_pose.position, debug_data_.base_link2front); @@ -214,8 +215,10 @@ void NoDrivableLaneModule::handle_inside_no_drivable_lane_state(PathWithLaneId * // Get stop point and stop factor { const auto & stop_pose = autoware::universe_utils::getPose(path->points.at(0)); - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::APPROACHING); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); const auto & virtual_wall_pose = autoware::motion_utils::calcLongitudinalOffsetPose( path->points, stop_pose.position, debug_data_.base_link2front); @@ -252,8 +255,10 @@ void NoDrivableLaneModule::handle_stopped_state(PathWithLaneId * path) // Get stop point and stop factor { const auto & stop_pose = ego_pos_on_path.pose; - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::STOPPED); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); const auto virtual_wall_pose = autoware::motion_utils::calcLongitudinalOffsetPose( path->points, stop_pose.position, debug_data_.base_link2front); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp index bcb8b365f6205..c788a54073ed6 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_no_stopping_area_module/src/scene_no_stopping_area.cpp @@ -50,7 +50,6 @@ NoStoppingAreaModule::NoStoppingAreaModule( planner_param_(planner_param), debug_data_() { - velocity_factor_.init(PlanningBehavior::NO_STOPPING_AREA); state_machine_.setState(StateMachine::State::GO); state_machine_.setMarginTime(planner_param_.state_clear_time); } @@ -144,9 +143,11 @@ bool NoStoppingAreaModule::modifyPathVelocity(PathWithLaneId * path) // Create StopReason { - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_point->second, - VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_point->second, stop_point->second, + tier4_planning_msgs::msg::PlanningFactor::STOP, + tier4_planning_msgs::msg::SafetyFactorArray{}, true /*is_driving_forward*/, 0.0, + 0.0 /*shift distance*/, ""); } } else if (state_machine_.getState() == StateMachine::State::GO) { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp index 1163b00e08ccb..fa259b2bea9aa 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_occlusion_spot_module/src/scene_occlusion_spot.cpp @@ -70,8 +70,6 @@ OcclusionSpotModule::OcclusionSpotModule( : SceneModuleInterface(module_id, logger, clock, time_keeper, planning_factor_interface), param_(planner_param) { - velocity_factor_.init(PlanningBehavior::UNKNOWN); - if (param_.detection_method == utils::DETECTION_METHOD::OCCUPANCY_GRID) { debug_data_.detection_type = "occupancy"; //! occupancy grid limitation( 100 * 100 ) diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp index ad1ae1d47664a..5bff3ca343e72 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_planner_common/include/autoware/behavior_velocity_planner_common/scene_module_interface.hpp @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -28,8 +27,6 @@ #include #include -#include -#include #include #include #include @@ -51,8 +48,6 @@ namespace autoware::behavior_velocity_planner { -using autoware::motion_utils::PlanningBehavior; -using autoware::motion_utils::VelocityFactor; using autoware::objects_of_interest_marker_interface::ColorName; using autoware::objects_of_interest_marker_interface::ObjectsOfInterestMarkerInterface; using autoware::universe_utils::DebugPublisher; @@ -97,8 +92,6 @@ class SceneModuleInterface planner_data_ = planner_data; } - void resetVelocityFactor() { velocity_factor_.reset(); } - VelocityFactor getVelocityFactor() const { return velocity_factor_.get(); } std::vector getObjectsOfInterestData() const { return objects_of_interest_; } void clearObjectsOfInterestData() { objects_of_interest_.clear(); } @@ -107,7 +100,6 @@ class SceneModuleInterface rclcpp::Logger logger_; rclcpp::Clock::SharedPtr clock_; std::shared_ptr planner_data_; - autoware::motion_utils::VelocityFactorInterface velocity_factor_; // TODO(soblin): remove this std::vector objects_of_interest_; mutable std::shared_ptr time_keeper_; std::shared_ptr planning_factor_interface_; @@ -143,8 +135,6 @@ class SceneModuleManagerInterface } pub_virtual_wall_ = node.create_publisher( std::string("~/virtual_wall/") + module_name, 5); - pub_velocity_factor_ = node.create_publisher( - std::string("/planning/velocity_factors/") + module_name, 1); planning_factor_interface_ = std::make_shared(&node, module_name); @@ -180,21 +170,12 @@ class SceneModuleManagerInterface StopWatch stop_watch; stop_watch.tic("Total"); visualization_msgs::msg::MarkerArray debug_marker_array; - autoware_adapi_v1_msgs::msg::VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = clock_->now(); for (const auto & scene_module : scene_modules_) { - scene_module->resetVelocityFactor(); scene_module->setPlannerData(planner_data_); scene_module->modifyPathVelocity(path); // The velocity factor must be called after modifyPathVelocity. - // TODO(soblin): remove this - const auto velocity_factor = scene_module->getVelocityFactor(); - if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { - velocity_factor_array.factors.emplace_back(velocity_factor); - } for (const auto & marker : scene_module->createDebugMarkerArray().markers) { debug_marker_array.markers.push_back(marker); @@ -203,7 +184,6 @@ class SceneModuleManagerInterface virtual_wall_marker_creator_.add_virtual_walls(scene_module->createVirtualWalls()); } - pub_velocity_factor_->publish(velocity_factor_array); planning_factor_interface_->publish(); pub_debug_->publish(debug_marker_array); if (is_publish_debug_path_) { @@ -274,8 +254,6 @@ class SceneModuleManagerInterface rclcpp::Publisher::SharedPtr pub_virtual_wall_; rclcpp::Publisher::SharedPtr pub_debug_; rclcpp::Publisher::SharedPtr pub_debug_path_; - rclcpp::Publisher::SharedPtr - pub_velocity_factor_; std::shared_ptr processing_time_publisher_; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp index 71a5ea3b9e807..e2ddbc75c7b57 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.cpp @@ -38,7 +38,6 @@ StopLineModule::StopLineModule( state_(State::APPROACH), debug_data_() { - velocity_factor_.init(PlanningBehavior::STOP_SIGN); } bool StopLineModule::modifyPathVelocity(PathWithLaneId * path) @@ -62,7 +61,12 @@ bool StopLineModule::modifyPathVelocity(PathWithLaneId * path) path->points = trajectory->restore(); - updateVelocityFactor(&velocity_factor_, state_, *stop_point - ego_s); + // TODO(soblin): PlanningFactorInterface use trajectory class + planning_factor_interface_->add( + path->points, trajectory->compute(*stop_point).point.pose, + planner_data_->current_odometry->pose, planner_data_->current_odometry->pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, "stopline"); updateStateAndStoppedTime( &state_, &stopped_time_, clock_->now(), *stop_point - ego_s, planner_data_->isVehicleStopped()); @@ -152,24 +156,6 @@ void StopLineModule::updateStateAndStoppedTime( } } -void StopLineModule::updateVelocityFactor( - autoware::motion_utils::VelocityFactorInterface * velocity_factor, const State & state, - const double & distance_to_stop_point) -{ - switch (state) { - case State::APPROACH: { - velocity_factor->set(distance_to_stop_point, VelocityFactor::APPROACHING); - break; - } - case State::STOPPED: { - velocity_factor->set(distance_to_stop_point, VelocityFactor::STOPPED); - break; - } - case State::START: - break; - } -} - void StopLineModule::updateDebugData( DebugData * debug_data, const geometry_msgs::msg::Pose & stop_pose, const State & state) const { diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp index aac830b0e9f24..7d430463c18b9 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_stop_line_module/src/scene.hpp @@ -18,7 +18,6 @@ #include "autoware/behavior_velocity_planner_common/scene_module_interface.hpp" #include "autoware/behavior_velocity_planner_common/utilization/util.hpp" -#include "autoware/motion_utils/factor/velocity_factor_interface.hpp" #include "autoware/trajectory/path_point_with_lane_id.hpp" #include @@ -98,10 +97,6 @@ class StopLineModule : public SceneModuleInterface State * state, std::optional * stopped_time, const rclcpp::Time & now, const double & distance_to_stop_point, const bool & is_vehicle_stopped) const; - static void updateVelocityFactor( - autoware::motion_utils::VelocityFactorInterface * velocity_factor, const State & state, - const double & distance_to_stop_point); - void updateDebugData( DebugData * debug_data, const geometry_msgs::msg::Pose & stop_pose, const State & state) const; diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp index 9a402f31af0e4..1d1ee7fc996b2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/manager.cpp @@ -53,24 +53,13 @@ void TrafficLightModuleManager::modifyPathVelocity(tier4_planning_msgs::msg::Pat autoware_perception_msgs::msg::TrafficLightGroup tl_state; - autoware_adapi_v1_msgs::msg::VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = clock_->now(); - nearest_ref_stop_path_point_index_ = static_cast(path->points.size() - 1); for (const auto & scene_module : scene_modules_) { std::shared_ptr traffic_light_scene_module( std::dynamic_pointer_cast(scene_module)); - traffic_light_scene_module->resetVelocityFactor(); traffic_light_scene_module->setPlannerData(planner_data_); traffic_light_scene_module->modifyPathVelocity(path); - // The velocity factor must be called after modifyPathVelocity. - const auto velocity_factor = traffic_light_scene_module->getVelocityFactor(); - if (velocity_factor.behavior != PlanningBehavior::UNKNOWN) { - velocity_factor_array.factors.emplace_back(velocity_factor); - } - if ( traffic_light_scene_module->getFirstRefStopPathPointIndex() < nearest_ref_stop_path_point_index_) { @@ -88,7 +77,6 @@ void TrafficLightModuleManager::modifyPathVelocity(tier4_planning_msgs::msg::Pat virtual_wall_marker_creator_.add_virtual_walls( traffic_light_scene_module->createVirtualWalls()); } - pub_velocity_factor_->publish(velocity_factor_array); pub_debug_->publish(debug_marker_array); pub_virtual_wall_->publish(virtual_wall_marker_creator_.create_markers(clock_->now())); pub_tl_state_->publish(tl_state); diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp index b051d5ff7eb76..becbaf5ee05f2 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_traffic_light_module/src/scene.cpp @@ -54,7 +54,6 @@ TrafficLightModule::TrafficLightModule( debug_data_(), is_prev_state_stop_(false) { - velocity_factor_.init(PlanningBehavior::TRAFFIC_SIGNAL); planner_param_ = planner_param; } @@ -293,9 +292,11 @@ tier4_planning_msgs::msg::PathWithLaneId TrafficLightModule::insertStopPose( size_t insert_index = insert_target_point_idx; planning_utils::insertVelocity(modified_path, target_point_with_lane_id, 0.0, insert_index); - velocity_factor_.set( + planning_factor_interface_->add( modified_path.points, planner_data_->current_odometry->pose, - target_point_with_lane_id.point.pose, VelocityFactor::UNKNOWN); + target_point_with_lane_id.point.pose, target_point_with_lane_id.point.pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); return modified_path; } diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp index 9ba7b0bccf1b9..a5779cfc0712a 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.cpp @@ -48,8 +48,6 @@ VirtualTrafficLightModule::VirtualTrafficLightModule( lane_(lane), planner_param_(planner_param) { - velocity_factor_.init(PlanningBehavior::VIRTUAL_TRAFFIC_LIGHT); - // Get map data const auto instrument = reg_elem_.getVirtualTrafficLight(); const auto instrument_bottom_line = toAutowarePoints(instrument); @@ -420,9 +418,10 @@ void VirtualTrafficLightModule::insertStopVelocityAtStopLine( } // Set StopReason - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::UNKNOWN, - command_.type); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); // Set data for visualization module_data_.stop_head_pose_at_stop_line = @@ -453,8 +452,10 @@ void VirtualTrafficLightModule::insertStopVelocityAtEndLine( } // Set StopReason - velocity_factor_.set( - path->points, planner_data_->current_odometry->pose, stop_pose, VelocityFactor::UNKNOWN); + planning_factor_interface_->add( + path->points, planner_data_->current_odometry->pose, stop_pose, stop_pose, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); // Set data for visualization module_data_.stop_head_pose_at_end_line = diff --git a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp index 9e7a1192d9869..0661267b3d361 100644 --- a/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp +++ b/planning/behavior_velocity_planner/autoware_behavior_velocity_virtual_traffic_light_module/src/scene.hpp @@ -113,10 +113,6 @@ class VirtualTrafficLightModule : public SceneModuleInterface void updateInfrastructureCommand(); - void setVelocityFactor( - const geometry_msgs::msg::Pose & stop_pose, - autoware_adapi_v1_msgs::msg::VelocityFactor * velocity_factor); - std::optional getPathIndexOfFirstEndLine(); bool isBeforeStartLine(const size_t end_line_idx); From 08dd641f5ab051eba69d68329cc6c1c6d752de98 Mon Sep 17 00:00:00 2001 From: Satoshi OTA <44889564+satoshi-ota@users.noreply.github.com> Date: Fri, 17 Jan 2025 09:15:18 +0900 Subject: [PATCH 121/127] fix(obstacle_stop_planner): migrate planning factor (#9939) * fix(obstacle_stop_planner): migrate planning factor Signed-off-by: satoshi-ota * fix(autoware_default_adapi): add coversion map Signed-off-by: satoshi-ota --------- Signed-off-by: satoshi-ota --- .../src/debug_marker.cpp | 35 ++++++------------- .../src/debug_marker.hpp | 10 ++---- .../autoware_default_adapi/src/planning.cpp | 2 ++ 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/planning/autoware_obstacle_stop_planner/src/debug_marker.cpp b/planning/autoware_obstacle_stop_planner/src/debug_marker.cpp index 93526518306af..62b9ae124f555 100644 --- a/planning/autoware_obstacle_stop_planner/src/debug_marker.cpp +++ b/planning/autoware_obstacle_stop_planner/src/debug_marker.cpp @@ -45,12 +45,13 @@ namespace autoware::motion_planning { ObstacleStopPlannerDebugNode::ObstacleStopPlannerDebugNode( rclcpp::Node * node, const double base_link2front) -: node_(node), base_link2front_(base_link2front) +: node_(node), + base_link2front_(base_link2front), + planning_factor_interface_{std::make_unique( + node, "obstacle_stop_planner")} { virtual_wall_pub_ = node_->create_publisher("~/virtual_wall", 1); debug_viz_pub_ = node_->create_publisher("~/debug/marker", 1); - velocity_factor_pub_ = - node_->create_publisher("/planning/velocity_factors/obstacle_stop", 1); pub_debug_values_ = node_->create_publisher("~/obstacle_stop/debug_values", 1); } @@ -189,8 +190,13 @@ void ObstacleStopPlannerDebugNode::publish() debug_viz_pub_->publish(visualization_msg); /* publish stop reason for autoware api */ - const auto velocity_factor_msg = makeVelocityFactorArray(); - velocity_factor_pub_->publish(velocity_factor_msg); + if (stop_pose_ptr_) { + planning_factor_interface_->add( + std::numeric_limits::quiet_NaN(), *stop_pose_ptr_, + tier4_planning_msgs::msg::PlanningFactor::STOP, tier4_planning_msgs::msg::SafetyFactorArray{}, + true /*is_driving_forward*/, 0.0, 0.0 /*shift distance*/, ""); + } + planning_factor_interface_->publish(); // publish debug values Float32MultiArrayStamped debug_msg{}; @@ -492,23 +498,4 @@ MarkerArray ObstacleStopPlannerDebugNode::makeVisualizationMarker() return msg; } -VelocityFactorArray ObstacleStopPlannerDebugNode::makeVelocityFactorArray() -{ - VelocityFactorArray velocity_factor_array; - velocity_factor_array.header.frame_id = "map"; - velocity_factor_array.header.stamp = node_->now(); - - if (stop_pose_ptr_) { - using distance_type = VelocityFactor::_distance_type; - VelocityFactor velocity_factor; - velocity_factor.behavior = PlanningBehavior::ROUTE_OBSTACLE; - velocity_factor.pose = *stop_pose_ptr_; - velocity_factor.distance = std::numeric_limits::quiet_NaN(); - velocity_factor.status = VelocityFactor::UNKNOWN; - velocity_factor.detail = std::string(); - velocity_factor_array.factors.push_back(velocity_factor); - } - return velocity_factor_array; -} - } // namespace autoware::motion_planning diff --git a/planning/autoware_obstacle_stop_planner/src/debug_marker.hpp b/planning/autoware_obstacle_stop_planner/src/debug_marker.hpp index d13e775e3d683..dd9e5e3af1b3d 100644 --- a/planning/autoware_obstacle_stop_planner/src/debug_marker.hpp +++ b/planning/autoware_obstacle_stop_planner/src/debug_marker.hpp @@ -14,10 +14,9 @@ #ifndef DEBUG_MARKER_HPP_ #define DEBUG_MARKER_HPP_ +#include #include -#include -#include #include #include #include @@ -42,9 +41,6 @@ using std_msgs::msg::Header; using visualization_msgs::msg::Marker; using visualization_msgs::msg::MarkerArray; -using autoware_adapi_v1_msgs::msg::PlanningBehavior; -using autoware_adapi_v1_msgs::msg::VelocityFactor; -using autoware_adapi_v1_msgs::msg::VelocityFactorArray; using tier4_debug_msgs::msg::Float32MultiArrayStamped; enum class PolygonType : int8_t { Vehicle = 0, Collision, SlowDownRange, SlowDown, Obstacle }; @@ -109,7 +105,6 @@ class ObstacleStopPlannerDebugNode bool pushObstaclePoint(const pcl::PointXYZ & obstacle_point, const PointType & type); MarkerArray makeVirtualWallMarker(); MarkerArray makeVisualizationMarker(); - VelocityFactorArray makeVelocityFactorArray(); void setDebugValues(const DebugValues::TYPE type, const double val) { @@ -120,11 +115,12 @@ class ObstacleStopPlannerDebugNode private: rclcpp::Publisher::SharedPtr virtual_wall_pub_; rclcpp::Publisher::SharedPtr debug_viz_pub_; - rclcpp::Publisher::SharedPtr velocity_factor_pub_; rclcpp::Publisher::SharedPtr pub_debug_values_; rclcpp::Node * node_; double base_link2front_; + std::unique_ptr planning_factor_interface_; + std::shared_ptr stop_pose_ptr_; std::shared_ptr target_stop_pose_ptr_; std::shared_ptr slow_down_start_pose_ptr_; diff --git a/system/autoware_default_adapi/src/planning.cpp b/system/autoware_default_adapi/src/planning.cpp index e11b01115caad..98f1c846d202e 100644 --- a/system/autoware_default_adapi/src/planning.cpp +++ b/system/autoware_default_adapi/src/planning.cpp @@ -44,6 +44,7 @@ const std::map conversion_map = { {"no_stopping_area", PlanningBehavior::NO_STOPPING_AREA}, {"blind_spot", PlanningBehavior::REAR_CHECK}, {"obstacle_cruise_planner", PlanningBehavior::ROUTE_OBSTACLE}, + {"obstacle_stop_planner", PlanningBehavior::ROUTE_OBSTACLE}, {"motion_velocity_planner", PlanningBehavior::ROUTE_OBSTACLE}, {"walkway", PlanningBehavior::SIDEWALK}, {"start_planner", PlanningBehavior::START_PLANNER}, @@ -215,6 +216,7 @@ PlanningNode::PlanningNode(const rclcpp::NodeOptions & options) : Node("planning "/planning/planning_factors/merge_from_private", "/planning/planning_factors/no_stopping_area", "/planning/planning_factors/obstacle_cruise_planner", + "/planning/planning_factors/obstacle_stop_planner", "/planning/planning_factors/occlusion_spot", "/planning/planning_factors/run_out", "/planning/planning_factors/stop_line", From 7bc6a4e109cfaafc44ec3cae2cf5ab44ed7190a4 Mon Sep 17 00:00:00 2001 From: Masaki Baba Date: Fri, 17 Jan 2025 13:53:12 +0900 Subject: [PATCH 122/127] fix(map_based_prediction): fix unintentional accumulation of lanelets (#9950) add clear before insert Signed-off-by: a-maumau --- perception/autoware_map_based_prediction/src/predictor_vru.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/perception/autoware_map_based_prediction/src/predictor_vru.cpp b/perception/autoware_map_based_prediction/src/predictor_vru.cpp index 0eea665cbd8a2..ffbdbd97b50a2 100644 --- a/perception/autoware_map_based_prediction/src/predictor_vru.cpp +++ b/perception/autoware_map_based_prediction/src/predictor_vru.cpp @@ -269,6 +269,7 @@ void PredictorVru::setLaneletMap(std::shared_ptr lanelet_ma const auto all_lanelets = lanelet::utils::query::laneletLayer(lanelet_map_ptr_); const auto crosswalks = lanelet::utils::query::crosswalkLanelets(all_lanelets); const auto walkways = lanelet::utils::query::walkwayLanelets(all_lanelets); + crosswalks_.clear(); crosswalks_.insert(crosswalks_.end(), crosswalks.begin(), crosswalks.end()); crosswalks_.insert(crosswalks_.end(), walkways.begin(), walkways.end()); From 74f677936177bc49c6af13032e00ee8e1b49eef5 Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Fri, 17 Jan 2025 15:55:15 +0900 Subject: [PATCH 123/127] chore(autoware_traffic_light_map_based_detector): modify docs (#9817) * modify docs Signed-off-by: MasatoSaeki * fix title Signed-off-by: MasatoSaeki * fix docs Signed-off-by: MasatoSaeki * fix word Signed-off-by: MasatoSaeki * add comment about debug markers Signed-off-by: MasatoSaeki * fix docs Signed-off-by: MasatoSaeki --------- Signed-off-by: MasatoSaeki --- .../README.md | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/perception/autoware_traffic_light_map_based_detector/README.md b/perception/autoware_traffic_light_map_based_detector/README.md index 8a59db19ae64d..6ef54d448b415 100644 --- a/perception/autoware_traffic_light_map_based_detector/README.md +++ b/perception/autoware_traffic_light_map_based_detector/README.md @@ -1,4 +1,4 @@ -# The `autoware_traffic_light_map_based_detector` Package +# autoware_traffic_light_map_based_detector ## Overview @@ -9,34 +9,36 @@ Calibration and vibration errors can be entered as parameters, and the size of t ![traffic_light_map_based_detector_result](./docs/traffic_light_map_based_detector_result.svg) If the node receives route information, it only looks at traffic lights on that route. -If the node receives no route information, it looks at a radius of 200 meters and the angle between the traffic light and the camera is less than 40 degrees. +If the node receives no route information, it looks at them within a radius of `max_detection_range` and the angle between the traffic light and the camera is less than `car_traffic_light_max_angle_range` or `pedestrian_traffic_light_max_angle_range`. ## Input topics -| Name | Type | Description | -| -------------------- | ------------------------------------- | ----------------------- | -| `~input/vector_map` | autoware_map_msgs::msg::LaneletMapBin | vector map | -| `~input/camera_info` | sensor_msgs::CameraInfo | target camera parameter | -| `~input/route` | autoware_planning_msgs::LaneletRoute | optional: route | +| Name | Type | Description | +| --------------------- | ----------------------------------------- | ----------------------- | +| `~/input/vector_map` | autoware_map_msgs::msg::LaneletMapBin | vector map | +| `~/input/camera_info` | sensor_msgs::msg::CameraInfo | target camera parameter | +| `~/input/route` | autoware_planning_msgs::msg::LaneletRoute | optional: route | ## Output topics -| Name | Type | Description | -| ---------------- | ------------------------------------------- | -------------------------------------------------------------------- | -| `~output/rois` | tier4_perception_msgs::TrafficLightRoiArray | location of traffic lights in image corresponding to the camera info | -| `~expect/rois` | tier4_perception_msgs::TrafficLightRoiArray | location of traffic lights in image without any offset | -| `~debug/markers` | visualization_msgs::MarkerArray | visualization to debug | +| Name | Type | Description | +| ----------------- | ------------------------------------------------ | ------------------------------------------------------------------------- | +| `~/output/rois` | tier4_perception_msgs::msg::TrafficLightRoiArray | location of traffic lights in image corresponding to the camera info | +| `~/expect/rois` | tier4_perception_msgs::msg::TrafficLightRoiArray | location of traffic lights in image without any offset | +| `~/debug/markers` | visualization_msgs::msg::MarkerArray | markers which show a line that combines from camera to each traffic light | ## Node parameters -| Parameter | Type | Description | -| ---------------------- | ------ | --------------------------------------------------------------------- | -| `max_vibration_pitch` | double | Maximum error in pitch direction. If -5~+5, it will be 10. | -| `max_vibration_yaw` | double | Maximum error in yaw direction. If -5~+5, it will be 10. | -| `max_vibration_height` | double | Maximum error in height direction. If -5~+5, it will be 10. | -| `max_vibration_width` | double | Maximum error in width direction. If -5~+5, it will be 10. | -| `max_vibration_depth` | double | Maximum error in depth direction. If -5~+5, it will be 10. | -| `max_detection_range` | double | Maximum detection range in meters. Must be positive | -| `min_timestamp_offset` | double | Minimum timestamp offset when searching for corresponding tf | -| `max_timestamp_offset` | double | Maximum timestamp offset when searching for corresponding tf | -| `timestamp_sample_len` | double | sampling length between min_timestamp_offset and max_timestamp_offset | +| Parameter | Type | Description | +| ------------------------------------------ | ------ | ----------------------------------------------------------------------------------------------- | +| `max_vibration_pitch` | double | Maximum error in pitch direction. If -5~+5, it will be 10. | +| `max_vibration_yaw` | double | Maximum error in yaw direction. If -5~+5, it will be 10. | +| `max_vibration_height` | double | Maximum error in height direction. If -5~+5, it will be 10. | +| `max_vibration_width` | double | Maximum error in width direction. If -5~+5, it will be 10. | +| `max_vibration_depth` | double | Maximum error in depth direction. If -5~+5, it will be 10. | +| `max_detection_range` | double | Maximum detection range in meters. Must be positive. | +| `min_timestamp_offset` | double | Minimum timestamp offset when searching for corresponding tf. | +| `max_timestamp_offset` | double | Maximum timestamp offset when searching for corresponding tf. | +| `timestamp_sample_len` | double | Sampling length between min_timestamp_offset and max_timestamp_offset. | +| `car_traffic_light_max_angle_range` | double | Maximum angle between the vehicular traffic light and the camera in degrees. Must be positive. | +| `pedestrian_traffic_light_max_angle_range` | double | Maximum angle between the pedestrian traffic light and the camera in degrees. Must be positive. | From 849892ec367b052b07550413269c38667204510b Mon Sep 17 00:00:00 2001 From: Masato Saeki <78376491+MasatoSaeki@users.noreply.github.com> Date: Fri, 17 Jan 2025 15:55:32 +0900 Subject: [PATCH 124/127] chore(autoware_traffic_light_fine_detector): modify docs and related params (#9818) * modify readme and related params Signed-off-by: MasatoSaeki * fix typo Signed-off-by: MasatoSaeki * fix Signed-off-by: MasatoSaeki --------- Signed-off-by: MasatoSaeki --- .../README.md | 19 ++++++++++--------- .../traffic_light_fine_detector.param.yaml | 1 + .../src/traffic_light_fine_detector_node.cpp | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/perception/autoware_traffic_light_fine_detector/README.md b/perception/autoware_traffic_light_fine_detector/README.md index 35b55c84aa087..df9f297422fce 100644 --- a/perception/autoware_traffic_light_fine_detector/README.md +++ b/perception/autoware_traffic_light_fine_detector/README.md @@ -1,8 +1,8 @@ -# traffic_light_fine_detector +# autoware_traffic_light_fine_detector ## Purpose -It is a package for traffic light detection using YoloX-s. +It is a package for traffic light detection using YOLOX-s. ## Training Information @@ -21,17 +21,18 @@ Please visit [autoware-documentation](https://github.com/autowarefoundation/auto ## Inner-workings / Algorithms -Based on the camera image and the global ROI array detected by `map_based_detection` node, a CNN-based detection method enables highly accurate traffic light detection. +Based on the camera image and the global ROI array detected by `map_based_detector` node, a CNN-based detection method enables highly accurate traffic light detection. If can not detect traffic light, x_offset, y_offset, height and width of output ROI become `0`. +ROIs detected from YOLOX will be selected by a combination of `expect/rois`. At this time, evaluate the whole as ROIs, not just the ROI alone. ## Inputs / Outputs ### Input -| Name | Type | Description | -| --------------- | -------------------------------------------------- | ------------------------------------------------------------------- | -| `~/input/image` | `sensor_msgs/Image` | The full size camera image | -| `~/input/rois` | `tier4_perception_msgs::msg::TrafficLightRoiArray` | The array of ROIs detected by map_based_detector | -| `~/expect/rois` | `tier4_perception_msgs::msg::TrafficLightRoiArray` | The array of ROIs detected by map_based_detector without any offset | +| Name | Type | Description | +| --------------- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `~/input/image` | `sensor_msgs::msg::Image` | The full size camera image | +| `~/input/rois` | `tier4_perception_msgs::msg::TrafficLightRoiArray` | The array of ROIs detected by map_based_detector | +| `~/expect/rois` | `tier4_perception_msgs::msg::TrafficLightRoiArray` | The array of ROIs detected by map_based_detector without any offset, used to select the best detection results | ### Output @@ -56,7 +57,7 @@ Based on the camera image and the global ROI array detected by `map_based_detect | `data_path` | string | "$(env HOME)/autoware_data" | packages data and artifacts directory path | | `fine_detector_model_path` | string | "" | The onnx file name for yolo model | | `fine_detector_label_path` | string | "" | The label file with label names for detected objects written on it | -| `fine_detector_precision` | string | "fp32" | The inference mode: "fp32", "fp16" | +| `fine_detector_precision` | string | "fp16" | The inference mode: "fp32", "fp16" | | `approximate_sync` | bool | false | Flag for whether to ues approximate sync policy | | `gpu_id` | integer | 0 | ID for the selecting CUDA GPU device | diff --git a/perception/autoware_traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml b/perception/autoware_traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml index 36d4413472a0b..b647729a27de5 100644 --- a/perception/autoware_traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml +++ b/perception/autoware_traffic_light_fine_detector/config/traffic_light_fine_detector.param.yaml @@ -5,4 +5,5 @@ fine_detector_precision: fp16 fine_detector_score_thresh: 0.3 fine_detector_nms_thresh: 0.65 + approximate_sync: false gpu_id: 0 diff --git a/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp b/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp index d9e0471a43d62..bc3d29ce456a8 100644 --- a/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp +++ b/perception/autoware_traffic_light_fine_detector/src/traffic_light_fine_detector_node.cpp @@ -61,7 +61,7 @@ TrafficLightFineDetectorNode::TrafficLightFineDetectorNode(const rclcpp::NodeOpt std::string model_path = declare_parameter("fine_detector_model_path", ""); std::string label_path = declare_parameter("fine_detector_label_path", ""); - std::string precision = declare_parameter("fine_detector_precision", "fp32"); + std::string precision = declare_parameter("fine_detector_precision", "fp16"); const uint8_t gpu_id = declare_parameter("gpu_id", 0); // Objects with a score lower than this value will be ignored. // This threshold will be ignored if specified model contains EfficientNMS_TRT module in it From bce4c44a7416f076071fa62bde37b1d21cc8e42d Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:33:32 +0900 Subject: [PATCH 125/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9853)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files control/autoware_trajectory_follower_node Signed-off-by: vish0012 --- control/autoware_trajectory_follower_node/README.md | 2 +- .../autoware/trajectory_follower_node/controller_node.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/control/autoware_trajectory_follower_node/README.md b/control/autoware_trajectory_follower_node/README.md index ac05dd67f18e6..c56154f909d1a 100644 --- a/control/autoware_trajectory_follower_node/README.md +++ b/control/autoware_trajectory_follower_node/README.md @@ -151,7 +151,7 @@ Giving the longitudinal controller information about steer convergence allows it ## Debugging -Debug information are published by the lateral and longitudinal controller using `tier4_debug_msgs/Float32MultiArrayStamped` messages. +Debug information are published by the lateral and longitudinal controller using `autoware_internal_debug_msgs/Float32MultiArrayStamped` messages. A configuration file for [PlotJuggler](https://github.com/facontidavide/PlotJuggler) is provided in the `config` folder which, when loaded, allow to automatically subscribe and visualize information useful for debugging. diff --git a/control/autoware_trajectory_follower_node/include/autoware/trajectory_follower_node/controller_node.hpp b/control/autoware_trajectory_follower_node/include/autoware/trajectory_follower_node/controller_node.hpp index 1733b4bcbbb7d..c84355cc202fa 100644 --- a/control/autoware_trajectory_follower_node/include/autoware/trajectory_follower_node/controller_node.hpp +++ b/control/autoware_trajectory_follower_node/include/autoware/trajectory_follower_node/controller_node.hpp @@ -44,7 +44,7 @@ #include "tf2_msgs/msg/tf_message.hpp" #include "visualization_msgs/msg/marker_array.hpp" #include -#include +#include #include #include @@ -63,7 +63,7 @@ namespace trajectory_follower_node using autoware::universe_utils::StopWatch; using autoware_adapi_v1_msgs::msg::OperationModeState; using autoware_control_msgs::msg::ControlHorizon; -using tier4_debug_msgs::msg::Float64Stamped; +using autoware_internal_debug_msgs::msg::Float64Stamped; namespace trajectory_follower = ::autoware::motion::control::trajectory_follower; From dc75c7ff53ce2e5e1aaafd289a19e8d1e11c559b Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:36:27 +0900 Subject: [PATCH 126/127] =?UTF-8?q?feat:=20tier4=5Fdebug=5Fmsgs=20changed?= =?UTF-8?q?=20to=20autoware=5Finternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6?= =?UTF-8?q?=20(#9851)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../training_and_data_check/rosbag2.bash | 32 +++++++++---------- .../scripts/pympc_trajectory_follower.py | 6 ++-- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/control/autoware_smart_mpc_trajectory_follower/autoware_smart_mpc_trajectory_follower/training_and_data_check/rosbag2.bash b/control/autoware_smart_mpc_trajectory_follower/autoware_smart_mpc_trajectory_follower/training_and_data_check/rosbag2.bash index d2687b352a17d..7a50a7e118298 100644 --- a/control/autoware_smart_mpc_trajectory_follower/autoware_smart_mpc_trajectory_follower/training_and_data_check/rosbag2.bash +++ b/control/autoware_smart_mpc_trajectory_follower/autoware_smart_mpc_trajectory_follower/training_and_data_check/rosbag2.bash @@ -7,27 +7,27 @@ gnome-terminal -- bash -c 'ros2 topic echo /vehicle/status/steering_status autow gnome-terminal -- bash -c 'ros2 topic echo /control/command/control_cmd autoware_control_msgs/msg/Control --csv --qos-history keep_all --qos-reliability reliable > control_cmd.csv' gnome-terminal -- bash -c 'ros2 topic echo /control/trajectory_follower/control_cmd autoware_control_msgs/msg/Control --csv --qos-history keep_all --qos-reliability reliable > control_cmd_orig.csv' -gnome-terminal -- bash -c 'ros2 topic echo /control/trajectory_follower/lane_departure_checker_node/debug/deviation/lateral tier4_debug_msgs/msg/Float64Stamped --csv --qos-history keep_all --qos-reliability reliable > lateral_error.csv' -gnome-terminal -- bash -c 'ros2 topic echo /control/trajectory_follower/lane_departure_checker_node/debug/deviation/yaw tier4_debug_msgs/msg/Float64Stamped --csv --qos-history keep_all --qos-reliability reliable > yaw_error.csv' +gnome-terminal -- bash -c 'ros2 topic echo /control/trajectory_follower/lane_departure_checker_node/debug/deviation/lateral autoware_internal_debug_msgs/msg/Float64Stamped --csv --qos-history keep_all --qos-reliability reliable > lateral_error.csv' +gnome-terminal -- bash -c 'ros2 topic echo /control/trajectory_follower/lane_departure_checker_node/debug/deviation/yaw autoware_internal_debug_msgs/msg/Float64Stamped --csv --qos-history keep_all --qos-reliability reliable > yaw_error.csv' gnome-terminal -- bash -c 'ros2 topic echo /system/operation_mode/state autoware_adapi_v1_msgs/msg/OperationModeState --csv --qos-history keep_all --qos-reliability reliable > system_operation_mode_state.csv' gnome-terminal -- bash -c 'ros2 topic echo /vehicle/status/control_mode autoware_vehicle_msgs/msg/ControlModeReport --csv --qos-history keep_all --qos-reliability reliable > vehicle_status_control_mode.csv' gnome-terminal -- bash -c 'ros2 topic echo /sensing/imu/imu_data sensor_msgs/msg/Imu --csv --qos-history keep_all --qos-reliability reliable > imu.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_x_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_x_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_y_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_y_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_v_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_v_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_yaw_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_yaw_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_acc_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_acc_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_steer_des tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_steer_des.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_X_des_converted tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_X_des_converted.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_x_current tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_x_current.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_error_prediction tier4_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_error_prediction.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_max_trajectory_err tier4_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_max_trajectory_err.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_emergency_stop_mode tier4_debug_msgs/msg/BoolStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_emergency_stop_mode.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_goal_stop_mode tier4_debug_msgs/msg/BoolStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_goal_stop_mode.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_total_ctrl_time tier4_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_total_ctrl_time.csv' -gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_calc_u_opt_time tier4_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_calc_u_opt_time.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_x_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_x_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_y_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_y_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_v_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_v_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_yaw_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_yaw_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_acc_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_acc_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_steer_des autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_steer_des.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_X_des_converted autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_X_des_converted.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_x_current autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_x_current.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_error_prediction autoware_internal_debug_msgs/msg/Float32MultiArrayStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_error_prediction.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_max_trajectory_err autoware_internal_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_max_trajectory_err.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_emergency_stop_mode autoware_internal_debug_msgs/msg/BoolStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_emergency_stop_mode.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_goal_stop_mode autoware_internal_debug_msgs/msg/BoolStamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_goal_stop_mode.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_total_ctrl_time autoware_internal_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_total_ctrl_time.csv' +gnome-terminal -- bash -c 'ros2 topic echo /debug_mpc_calc_u_opt_time autoware_internal_debug_msgs/msg/Float32Stamped --csv --qos-history keep_all --qos-reliability reliable > debug_mpc_calc_u_opt_time.csv' # wait a moment to open new terminals converting rosbag2 to csv sleep 8 diff --git a/control/autoware_smart_mpc_trajectory_follower/scripts/pympc_trajectory_follower.py b/control/autoware_smart_mpc_trajectory_follower/scripts/pympc_trajectory_follower.py index f767dad223f0d..104261866cf98 100755 --- a/control/autoware_smart_mpc_trajectory_follower/scripts/pympc_trajectory_follower.py +++ b/control/autoware_smart_mpc_trajectory_follower/scripts/pympc_trajectory_follower.py @@ -21,6 +21,9 @@ from autoware_adapi_v1_msgs.msg import OperationModeState from autoware_control_msgs.msg import Control +from autoware_internal_debug_msgs.msg import BoolStamped +from autoware_internal_debug_msgs.msg import Float32MultiArrayStamped +from autoware_internal_debug_msgs.msg import Float32Stamped from autoware_planning_msgs.msg import Trajectory from autoware_planning_msgs.msg import TrajectoryPoint from autoware_smart_mpc_trajectory_follower.scripts import drive_controller @@ -43,9 +46,6 @@ from scipy.spatial.transform import Rotation as R from scipy.spatial.transform import Slerp from std_msgs.msg import String -from tier4_debug_msgs.msg import BoolStamped -from tier4_debug_msgs.msg import Float32MultiArrayStamped -from tier4_debug_msgs.msg import Float32Stamped from visualization_msgs.msg import Marker from visualization_msgs.msg import MarkerArray From 2a6663b27472695357628bdc106494ae3ad85a4f Mon Sep 17 00:00:00 2001 From: Vishal Chauhan <40782713+vish0012@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:36:46 +0900 Subject: [PATCH 127/127] =?UTF-8?q?feat(autoware=5Fdetected=5Fobject=5Fval?= =?UTF-8?q?idation):=20tier4=5Fdebug=5Fmsgs=20changed=20to=20autoware=5Fin?= =?UTF-8?q?ternal=5Fdebug=5Fmsgs=20in=20fil=E2=80=A6=20(#9871)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: tier4_debug_msgs changed to autoware_internal_debug_msgs in files perception/autoware_detected_object_validation Signed-off-by: vish0012 Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> --- .../src/lanelet_filter/lanelet_filter.cpp | 4 ++-- .../src/obstacle_pointcloud/obstacle_pointcloud_validator.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/perception/autoware_detected_object_validation/src/lanelet_filter/lanelet_filter.cpp b/perception/autoware_detected_object_validation/src/lanelet_filter/lanelet_filter.cpp index f91c4e2036227..f1c25e8573e85 100644 --- a/perception/autoware_detected_object_validation/src/lanelet_filter/lanelet_filter.cpp +++ b/perception/autoware_detected_object_validation/src/lanelet_filter/lanelet_filter.cpp @@ -180,9 +180,9 @@ void ObjectLaneletFilterNode::objectCallback( std::chrono::nanoseconds( (this->get_clock()->now() - output_object_msg.header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency); - debug_publisher_->publish( + debug_publisher_->publish( "debug/processing_time_ms", stop_watch_ptr_->toc("processing_time", true)); } diff --git a/perception/autoware_detected_object_validation/src/obstacle_pointcloud/obstacle_pointcloud_validator.cpp b/perception/autoware_detected_object_validation/src/obstacle_pointcloud/obstacle_pointcloud_validator.cpp index 979cdd3909f14..0c69b45291281 100644 --- a/perception/autoware_detected_object_validation/src/obstacle_pointcloud/obstacle_pointcloud_validator.cpp +++ b/perception/autoware_detected_object_validation/src/obstacle_pointcloud/obstacle_pointcloud_validator.cpp @@ -386,7 +386,7 @@ void ObstaclePointCloudBasedValidator::onObjectsAndObstaclePointCloud( std::chrono::duration( std::chrono::nanoseconds((this->get_clock()->now() - output.header.stamp).nanoseconds())) .count(); - debug_publisher_->publish( + debug_publisher_->publish( "debug/pipeline_latency_ms", pipeline_latency); }