Initial import of FaRui Campus ADS v3.2

This commit is contained in:
li-shihao-code
2026-06-05 14:20:30 +08:00
commit 2839d34fdb
6548 changed files with 1335203 additions and 0 deletions
@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.14)
project(autoware_ad_api_specs)
find_package(autoware_cmake REQUIRED)
autoware_package()
ament_auto_package()
@@ -0,0 +1,3 @@
# autoware_adapi_specs
This package is a specification of Autoware AD API.
@@ -0,0 +1,36 @@
// 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 AUTOWARE_AD_API_SPECS__FAIL_SAFE_HPP_
#define AUTOWARE_AD_API_SPECS__FAIL_SAFE_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/mrm_state.hpp>
namespace autoware_ad_api::fail_safe
{
struct MrmState
{
using Message = autoware_adapi_v1_msgs::msg::MrmState;
static constexpr char name[] = "/api/fail_safe/mrm_state";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::fail_safe
#endif // AUTOWARE_AD_API_SPECS__FAIL_SAFE_HPP_
@@ -0,0 +1,31 @@
// 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 AUTOWARE_AD_API_SPECS__INTERFACE_HPP_
#define AUTOWARE_AD_API_SPECS__INTERFACE_HPP_
#include <autoware_adapi_version_msgs/srv/interface_version.hpp>
namespace autoware_ad_api::interface
{
struct Version
{
using Service = autoware_adapi_version_msgs::srv::InterfaceVersion;
static constexpr char name[] = "/api/interface/version";
};
} // namespace autoware_ad_api::interface
#endif // AUTOWARE_AD_API_SPECS__INTERFACE_HPP_
@@ -0,0 +1,43 @@
// 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 AUTOWARE_AD_API_SPECS__LOCALIZATION_HPP_
#define AUTOWARE_AD_API_SPECS__LOCALIZATION_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/localization_initialization_state.hpp>
#include <autoware_adapi_v1_msgs/srv/initialize_localization.hpp>
namespace autoware_ad_api::localization
{
struct Initialize
{
using Service = autoware_adapi_v1_msgs::srv::InitializeLocalization;
static constexpr char name[] = "/api/localization/initialize";
};
struct InitializationState
{
using Message = autoware_adapi_v1_msgs::msg::LocalizationInitializationState;
static constexpr char name[] = "/api/localization/initialization_state";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::localization
#endif // AUTOWARE_AD_API_SPECS__LOCALIZATION_HPP_
@@ -0,0 +1,43 @@
// 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 AUTOWARE_AD_API_SPECS__MOTION_HPP_
#define AUTOWARE_AD_API_SPECS__MOTION_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/motion_state.hpp>
#include <autoware_adapi_v1_msgs/srv/accept_start.hpp>
namespace autoware_ad_api::motion
{
struct AcceptStart
{
using Service = autoware_adapi_v1_msgs::srv::AcceptStart;
static constexpr char name[] = "/api/motion/accept_start";
};
struct State
{
using Message = autoware_adapi_v1_msgs::msg::MotionState;
static constexpr char name[] = "/api/motion/state";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::motion
#endif // AUTOWARE_AD_API_SPECS__MOTION_HPP_
@@ -0,0 +1,73 @@
// 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 AUTOWARE_AD_API_SPECS__OPERATION_MODE_HPP_
#define AUTOWARE_AD_API_SPECS__OPERATION_MODE_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/operation_mode_state.hpp>
#include <autoware_adapi_v1_msgs/srv/change_operation_mode.hpp>
namespace autoware_ad_api::operation_mode
{
struct ChangeToStop
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/change_to_stop";
};
struct ChangeToAutonomous
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/change_to_autonomous";
};
struct ChangeToLocal
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/change_to_local";
};
struct ChangeToRemote
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/change_to_remote";
};
struct EnableAutowareControl
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/enable_autoware_control";
};
struct DisableAutowareControl
{
using Service = autoware_adapi_v1_msgs::srv::ChangeOperationMode;
static constexpr char name[] = "/api/operation_mode/disable_autoware_control";
};
struct OperationModeState
{
using Message = autoware_adapi_v1_msgs::msg::OperationModeState;
static constexpr char name[] = "/api/operation_mode/state";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::operation_mode
#endif // AUTOWARE_AD_API_SPECS__OPERATION_MODE_HPP_
@@ -0,0 +1,36 @@
// 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 AUTOWARE_AD_API_SPECS__PERCEPTION_HPP_
#define AUTOWARE_AD_API_SPECS__PERCEPTION_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/dynamic_object_array.hpp>
namespace autoware_ad_api::perception
{
struct DynamicObjectArray
{
using Message = autoware_adapi_v1_msgs::msg::DynamicObjectArray;
static constexpr char name[] = "/api/perception/objects";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
} // namespace autoware_ad_api::perception
#endif // AUTOWARE_AD_API_SPECS__PERCEPTION_HPP_
@@ -0,0 +1,46 @@
// 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 AUTOWARE_AD_API_SPECS__PLANNING_HPP_
#define AUTOWARE_AD_API_SPECS__PLANNING_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/steering_factor_array.hpp>
#include <autoware_adapi_v1_msgs/msg/velocity_factor_array.hpp>
namespace autoware_ad_api::planning
{
struct VelocityFactors
{
using Message = autoware_adapi_v1_msgs::msg::VelocityFactorArray;
static constexpr char name[] = "/api/planning/velocity_factors";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
struct SteeringFactors
{
using Message = autoware_adapi_v1_msgs::msg::SteeringFactorArray;
static constexpr char name[] = "/api/planning/steering_factors";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
} // namespace autoware_ad_api::planning
#endif // AUTOWARE_AD_API_SPECS__PLANNING_HPP_
@@ -0,0 +1,79 @@
// 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 AUTOWARE_AD_API_SPECS__ROUTING_HPP_
#define AUTOWARE_AD_API_SPECS__ROUTING_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/route.hpp>
#include <autoware_adapi_v1_msgs/msg/route_state.hpp>
#include <autoware_adapi_v1_msgs/srv/clear_route.hpp>
#include <autoware_adapi_v1_msgs/srv/set_route.hpp>
#include <autoware_adapi_v1_msgs/srv/set_route_points.hpp>
namespace autoware_ad_api::routing
{
struct SetRoutePoints
{
using Service = autoware_adapi_v1_msgs::srv::SetRoutePoints;
static constexpr char name[] = "/api/routing/set_route_points";
};
struct SetRoute
{
using Service = autoware_adapi_v1_msgs::srv::SetRoute;
static constexpr char name[] = "/api/routing/set_route";
};
struct ChangeRoutePoints
{
using Service = autoware_adapi_v1_msgs::srv::SetRoutePoints;
static constexpr char name[] = "/api/routing/change_route_points";
};
struct ChangeRoute
{
using Service = autoware_adapi_v1_msgs::srv::SetRoute;
static constexpr char name[] = "/api/routing/change_route";
};
struct ClearRoute
{
using Service = autoware_adapi_v1_msgs::srv::ClearRoute;
static constexpr char name[] = "/api/routing/clear_route";
};
struct RouteState
{
using Message = autoware_adapi_v1_msgs::msg::RouteState;
static constexpr char name[] = "/api/routing/state";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
struct Route
{
using Message = autoware_adapi_v1_msgs::msg::Route;
static constexpr char name[] = "/api/routing/route";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::routing
#endif // AUTOWARE_AD_API_SPECS__ROUTING_HPP_
@@ -0,0 +1,36 @@
// Copyright 2024 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.
#ifndef AUTOWARE_AD_API_SPECS__SYSTEM_HPP_
#define AUTOWARE_AD_API_SPECS__SYSTEM_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/heartbeat.hpp>
namespace autoware_ad_api::system
{
struct Heartbeat
{
using Message = autoware_adapi_v1_msgs::msg::Heartbeat;
static constexpr char name[] = "/api/system/heartbeat";
static constexpr size_t depth = 10;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
} // namespace autoware_ad_api::system
#endif // AUTOWARE_AD_API_SPECS__SYSTEM_HPP_
@@ -0,0 +1,77 @@
// 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_AD_API_SPECS__VEHICLE_HPP_
#define AUTOWARE_AD_API_SPECS__VEHICLE_HPP_
#include <rclcpp/qos.hpp>
#include <autoware_adapi_v1_msgs/msg/door_status_array.hpp>
#include <autoware_adapi_v1_msgs/msg/vehicle_kinematics.hpp>
#include <autoware_adapi_v1_msgs/msg/vehicle_status.hpp>
#include <autoware_adapi_v1_msgs/srv/get_door_layout.hpp>
#include <autoware_adapi_v1_msgs/srv/get_vehicle_dimensions.hpp>
#include <autoware_adapi_v1_msgs/srv/set_door_command.hpp>
namespace autoware_ad_api::vehicle
{
struct VehicleKinematics
{
using Message = autoware_adapi_v1_msgs::msg::VehicleKinematics;
static constexpr char name[] = "/api/vehicle/kinematics";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
struct VehicleStatus
{
using Message = autoware_adapi_v1_msgs::msg::VehicleStatus;
static constexpr char name[] = "/api/vehicle/status";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
};
struct Dimensions
{
using Service = autoware_adapi_v1_msgs::srv::GetVehicleDimensions;
static constexpr char name[] = "/api/vehicle/dimensions";
};
struct DoorCommand
{
using Service = autoware_adapi_v1_msgs::srv::SetDoorCommand;
static constexpr char name[] = "/api/vehicle/doors/command";
};
struct DoorLayout
{
using Service = autoware_adapi_v1_msgs::srv::GetDoorLayout;
static constexpr char name[] = "/api/vehicle/doors/layout";
};
struct DoorStatus
{
using Message = autoware_adapi_v1_msgs::msg::DoorStatusArray;
static constexpr char name[] = "/api/vehicle/doors/status";
static constexpr size_t depth = 1;
static constexpr auto reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
static constexpr auto durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
};
} // namespace autoware_ad_api::vehicle
#endif // AUTOWARE_AD_API_SPECS__VEHICLE_HPP_
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>autoware_ad_api_specs</name>
<version>0.0.0</version>
<description>The autoware_ad_api_specs package</description>
<maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
<maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake_auto</buildtool_depend>
<buildtool_depend>autoware_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>autoware_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
@@ -0,0 +1,52 @@
cmake_minimum_required(VERSION 3.14)
project(autoware_default_adapi)
find_package(autoware_cmake REQUIRED)
autoware_package()
ament_auto_add_library(${PROJECT_NAME} SHARED
src/diagnostics.cpp
src/fail_safe.cpp
src/heartbeat.cpp
src/interface.cpp
src/localization.cpp
src/motion.cpp
src/operation_mode.cpp
src/perception.cpp
src/planning.cpp
src/routing.cpp
src/vehicle.cpp
src/vehicle_info.cpp
src/vehicle_door.cpp
src/utils/localization_conversion.cpp
src/utils/route_conversion.cpp
src/compatibility/autoware_state.cpp
)
rclcpp_components_register_nodes(${PROJECT_NAME}
"autoware::default_adapi::AutowareStateNode"
"autoware::default_adapi::DiagnosticsNode"
"autoware::default_adapi::FailSafeNode"
"autoware::default_adapi::HeartbeatNode"
"autoware::default_adapi::InterfaceNode"
"autoware::default_adapi::LocalizationNode"
"autoware::default_adapi::MotionNode"
"autoware::default_adapi::OperationModeNode"
"autoware::default_adapi::PerceptionNode"
"autoware::default_adapi::PlanningNode"
"autoware::default_adapi::RoutingNode"
"autoware::default_adapi::VehicleNode"
"autoware::default_adapi::VehicleInfoNode"
"autoware::default_adapi::VehicleDoorNode"
)
if(BUILD_TESTING)
add_launch_test(test/main.test.py)
endif()
install(
PROGRAMS script/web_server.py script/guide.py
DESTINATION lib/${PROJECT_NAME}
)
ament_auto_package(INSTALL_TO_SHARE config launch test)
@@ -0,0 +1,36 @@
# autoware_default_adapi
## Notes
Components that relay services must be executed by the Multi-Threaded Executor.
## Features
This package is a default implementation AD API.
- [autoware state (backward compatibility)](document/autoware-state.md)
- [fail-safe](document/fail-safe.md)
- [interface](document/interface.md)
- [localization](document/localization.md)
- [motion](document/motion.md)
- [operation mode](document/operation-mode.md)
- [routing](document/routing.md)
## Web server script
This is a sample to call API using HTTP.
## Guide message script
This is a debug script to check the conditions for transition to autonomous mode.
```bash
$ ros2 run autoware_default_adapi guide.py
The vehicle pose is not estimated. Please set an initial pose or check GNSS.
The route is not set. Please set a goal pose.
The topic rate error is detected. Please check [control,planning] components.
The vehicle is ready. Please change the operation mode to autonomous.
The vehicle is driving autonomously.
The vehicle has reached the goal of the route. Please reset a route.
```
@@ -0,0 +1,8 @@
/adapi/node/autoware_state:
ros__parameters:
update_rate: 10.0
/adapi/node/motion:
ros__parameters:
require_accept_start: false
stop_check_duration: 1.0
@@ -0,0 +1,16 @@
# Autoware state compatibility
## Overview
Since `/autoware/state` was so widely used, this packages creates it from the states of AD API for backwards compatibility.
The diagnostic checks that ad_service_state_monitor used to perform have been replaced by component_state_monitor.
The service `/autoware/shutdown` to change autoware state to finalizing is also supported for compatibility.
![autoware-state-architecture](images/autoware-state-architecture.drawio.svg)
## Conversion
This is the correspondence between AD API states and autoware states.
The launch state is the data that this node holds internally.
![autoware-state-table](images/autoware-state-table.drawio.svg)
@@ -0,0 +1,5 @@
# Fail-safe API
## Overview
The fail-safe API simply relays the MRM state. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/fail-safe/) for AD API specifications.
@@ -0,0 +1,332 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="761px"
height="381px"
viewBox="-0.5 -0.5 761 381"
content="&lt;mxfile&gt;&lt;diagram id=&quot;X9Q9Zxk0nsySa-CThXZE&quot; name=&quot;Page-1&quot;&gt;5VvNkps4EH4aV20uKSN+bB8TZ5K9bFWq5rCbk0sDMqgCiBJibOfpVzKSEQiPTbCBcTwHS62WLLr7a3U3mpm9TvbfKMyif0iA4hmYB/uZ/WUGgOU6Lv8SlENJ8Sy7JIQUB5KpIjzjX0gS55Ja4ADlNUZGSMxwVif6JE2Rz2o0SCnZ1dm2JK7/agZDZBCefRib1H9xwCJJtbxVNfA3wmEkf3oJFuVAAhWzfJI8ggHZaST7aWavKSGsbCX7NYqF8JRcynlfz4yeNkZRyq6aIDeWs4N6OBTwZ5VdQllEQpLC+Kmifo5YEvNBizcpKdIAicXmvGf+utxQTgrqN5TIIA2RYnNKmvhtbaLc8zdEEsTogTNQFEOGX+t6gFKd4YlPTv1EKTxoDBnBKcu1lb8LAmeQluku5d6kXYJVQ3rd+Hmj3IHqaY9SkY4aOaOd5W9op64STVe/rx13EtpZON20c4G/v3bk8q8wLuQj+yTJSIqOu8gZZEhgnqSYEWposq6nXYQZes7gUQ877jbrutviOF6TmC8j5tpbV/wJOkmZRi8/nJ4zSn4ibcQ7ft6ygldEGdq/qV9l9qAuWHsu+7vKGQIFjUjzg0ohbSahqeVNqdsjeCx1xmiYAN4kMGHN66qwlm9j4gJ/f0woY6owMQNezIRJZjDl7VC0Y8IPU/yLC4akapwvrbMo8gttUnQuzLGFtaUU6s4s2TScOOYhA3pn8Gu6NWCizwL3Qt8IJxKYLPqA1w19F/j7ow8Y6OOyZzgNK2Q8BATAfEQMOJYpxXtjwB4CA9cKQO1GMzOSIapccMLzvQexM9sb09euhrczZ7K+1si1rI65mXVjX+sYIGAkwz4n+RHyf0qPW+RmILMV2YAYpazIHgQpzZxgWI88N6V4b6S4k0VKM++1OubJ1q3zZLcnUmDBSEoSUuQPAhav6ZuGBIs1wrHimWBRserw4Qu4qbfgz00P/wn6R1d1f+hjX/ZyUtk7zLpUHtoEZ0/CyzhNh3/By1zg7+1lwAhReZt2rElop1nnuaSdC/z9zwDPOAOEV99xAW8CtIVFzDYwgBk2z4C/6sWitZCdSmpFp5l6fDDs4P1WWhsnc1uh1XHudE4Ae3BAgZZSj6qyTyyoUpnhtUFVg7+/uzNLPQGGYUpyhv1HjZPs5YBxEnCHt/+29Hu8OOl8hvsHvdsa1ORuWl1He8zKwHRhqf4PFYvydhWYis5B63xHFPPNI9olVgUt0ZC69zCC8fYIOBSjMvQHjigsxzTvhXcv816c1YmphUd6XdF0Kt6APsUevjYGVi2eYKK1Madjbcy5cRi36gKJqGAB2aWGQvMIZqIZoT3kuuSsmebBJfXk1ME16Nkjde9ucmhqRoWDogkMjia77fbJze/LXS0A84LHMSjMxQ4jyKHjwURYU/qSiy8YbHJEX7GPNkePvjmFjPMdFJOOJeBjMl+f+IK2hD7KAdBMBluCyrvl8bb5trZnPMMlqHwDuIt8WoKSU+lDF497C/GYWU7a9gL7/YZ8bl24rinctrt69i1ka775kc7gDz/CxtSJmRjJrP4hPK01mGR5t7qnX4Z+1X872E//Aw==&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<path d="M 540 260 L 540 250 L 540 226.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 540 221.12 L 543.5 228.12 L 540 226.37 L 536.5 228.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 700 260 L 700 250 L 700 226.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 221.12 L 703.5 228.12 L 700 226.37 L 696.5 228.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="480" y="260" width="280" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 280px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
component state monitor
</div>
</div>
</div>
</foreignObject>
<text x="620" y="284" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">component state monitor</text>
</switch>
</g>
<path d="M 60 180 L 60 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 141.12 L 63.5 148.12 L 60 146.37 L 56.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="60" cy="200" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span>localization</span>
<br/>
<span>initialization state</span>
</div>
</div>
</div>
</foreignObject>
<text x="60" y="204" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">localization...</text>
</switch>
</g>
<path d="M 220 180 L 220 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 141.12 L 223.5 148.12 L 220 146.37 L 216.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="200" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 161px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
routing state
</div>
</div>
</div>
</foreignObject>
<text x="220" y="204" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">routing state</text>
</switch>
</g>
<path d="M 380 180 L 380 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 380 141.12 L 383.5 148.12 L 380 146.37 L 376.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="380" cy="200" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 321px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
operation mode
</div>
</div>
</div>
</foreignObject>
<text x="380" y="204" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">operation mode</text>
</switch>
</g>
<path d="M 540 180 L 540 170 L 540 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 540 141.12 L 543.5 148.12 L 540 146.37 L 536.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="540" cy="200" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic check status
<br/>
for startup
</div>
</div>
</div>
</foreignObject>
<text x="540" y="204" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic check status...</text>
</switch>
</g>
<path d="M 700 180 L 700 150 L 700 146.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 141.12 L 703.5 148.12 L 700 146.37 L 696.5 148.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="700" cy="200" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 200px; margin-left: 641px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic check status
<br/>
for autonomous
</div>
</div>
</div>
</foreignObject>
<text x="700" y="204" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic check status...</text>
</switch>
</g>
<path d="M 220 260 L 220 226.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 221.12 L 223.5 228.12 L 220 226.37 L 216.5 228.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 380 260 L 380 250 L 380 226.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 380 221.12 L 383.5 228.12 L 380 226.37 L 376.5 228.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 60 260 L 60 250 L 60 226.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 221.12 L 63.5 228.12 L 60 226.37 L 56.5 228.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="260" width="440" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 438px; height: 1px; padding-top: 280px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autoware_default_adapi
<br/>
(localization, routing, operation mode)
</div>
</div>
</div>
</foreignObject>
<text x="220" y="284" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">autoware_default_adapi...</text>
</switch>
</g>
<path d="M 700 340 L 700 320 L 700 306.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 301.12 L 703.5 308.12 L 700 306.37 L 696.5 308.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="700" cy="360" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 360px; margin-left: 641px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
diagnostics
</div>
</div>
</div>
</foreignObject>
<text x="700" y="364" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">diagnostics</text>
</switch>
</g>
<path d="M 600 360 L 633.63 360" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 638.88 360 L 631.88 363.5 L 633.63 360 L 631.88 356.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="480" y="340" width="120" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 360px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic state monitor
</div>
</div>
</div>
</foreignObject>
<text x="540" y="364" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic state monitor</text>
</switch>
</g>
<path d="M 540.36 100 L 540.4 80 L 540.13 66.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 540.02 61.12 L 543.66 68.05 L 540.13 66.37 L 536.66 68.19 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="100" width="760" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 758px; height: 1px; padding-top: 120px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autoware_default_adapi
<br/>
(autoware state)
</div>
</div>
</div>
</foreignObject>
<text x="380" y="124" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">autoware_default_adapi...</text>
</switch>
</g>
<ellipse cx="540" cy="40" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 40px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autoware
<br/>
state
</div>
</div>
</div>
</foreignObject>
<text x="540" y="44" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">autoware...</text>
</switch>
</g>
<path d="M 700 60 L 700 93.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 98.88 L 696.5 91.88 L 700 93.63 L 703.5 91.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 660 20 L 740 20 L 760 40 L 740 60 L 660 60 L 640 40 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 40px; margin-left: 641px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autoware
<br/>
shutdown
</div>
</div>
</div>
</foreignObject>
<text x="700" y="44" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">autoware...</text>
</switch>
</g>
<path d="M 440 360 L 473.63 360" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 478.88 360 L 471.88 363.5 L 473.63 360 L 471.88 356.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="360" rx="220" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 438px; height: 1px; padding-top: 360px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topics that ad_service_state_monitor was checking before
</div>
</div>
</div>
</foreignObject>
<text x="220" y="364" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topics that ad_service_state_monitor was checking before</text>
</switch>
</g>
<rect x="0" y="0" width="300" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<rect x="10" y="10" width="80" height="30" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 11px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
node
</div>
</div>
</div>
</foreignObject>
<text x="50" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">node</text>
</switch>
</g>
<path d="M 230 10 L 270 10 L 290 25 L 270 40 L 230 40 L 210 25 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 211px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
service
</div>
</div>
</div>
</foreignObject>
<text x="250" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">service</text>
</switch>
</g>
<ellipse cx="150" cy="25" rx="40" ry="15" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 111px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic
</div>
</div>
</div>
</foreignObject>
<text x="150" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

@@ -0,0 +1,459 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="921px"
height="201px"
viewBox="-0.5 -0.5 921 201"
content="&lt;mxfile&gt;&lt;diagram id=&quot;DGwK_OstZrDMA8GPxkck&quot; name=&quot;Page-1&quot;&gt;3ZpNc5swEIZ/Sw/cAdnEObbOR3voTKc55JhRjWw0FZJHFraTX18JhI1ZMmESVWFkz9iw4ksPi3bfRRFalsd7ibfFT5ETFqVxfozQTZSmyXw+13/G8txYsuukMWwkze1GZ8MDfSHWGFtrRXOyu9hQCcEU3V4aV4JzslIXNiylOFxuthbs8qxbvCHA8LDCDFofaa4Ka02y63PDd0I3hT31Ir1qGkrcbmx7sitwLg4dE7qN0FIKoZql8rgkzMBruTT73b3SerowSbgas0Nqr3iPWWU7Zy9MPbe9laLiOTE7xBH6diioIg9bvDKtB31/ta1QJdNriV5cU8aWgglZ74vWc/M1dsFVx958tH2npPhLOi1Z/dEtsCu2d3siFTl2TLZr90SURMlnvYltXcws5tbP7Oqhc9PaO1F07te1tWHrJ5vTkc8o9YKl+QpZAPYRU0X55k7I36JSJCDOPcwnpm9xTh1wRoAzE/pJpS9YUcFrwjgo2OnikvbMI+wZgK05GqcOkPMs/jzOc8BZbIlsPbrUATUg0PP0TdDof4HOAGhcKXFiHOM9pgz/YSHx7kdFn459BXhTrqOiGa/rUeQjkB2gSbL3JQwu0Czg2FpxPkUqi5FUkpkDLDBBrfjJZzSEz4bTD8dj4bhwmVYPTfVx6rNJYp9wktfhTNBvRifNJ4gfggPlScV3REXpstHIdD8BRv0UzKuwSKCyqAFNjcnY8J25YAIT06n6Sup1rIF5zZryqQzD/fiden2MYF5D2O6D+bQDKH3VMfQcITQAxUVSk8LAvcZToNLXBqNHFxeuksKIrWQ1QSg+ZUEKI/UPZznepHTpO4u1LuLaUBURV3xVROHVtfrRwOsTDguIvxh2oHInRfhTx1CYoZ3fO9zyjXmzFS5prwMzrB3e6FQ4bFf2Wd0YKBZ+bcTGvcAsXMhelctA2fHOkXKZNGOvryhhth8QWZAdjx0jXCRuCEqGgND2axo+U2IEdUdAZPvqf4Ds4DvHhQuyUGwETHYomg2idVFXQVBfBIQWlDi9BjEoLAJC238b4xctVBIBo/Wp0RCUEHZix5d6TRMW28icKcOlgdj8gtXYzAo5aApPK41QCvZEuJkVkpt99YHqY7mqVQK0AzdgfFl7IBtzNZtGr55nqtZtnfm+6PYf&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<rect x="800" y="20" width="120" height="90" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="0" y="80" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
WaitingForRoute
</div>
</div>
</div>
</foreignObject>
<text x="60" y="94" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">WaitingForRoute</text>
</switch>
</g>
<rect x="240" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 241px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
localization state
</div>
</div>
</div>
</foreignObject>
<text x="300" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">localization state</text>
</switch>
</g>
<rect x="360" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 361px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
routing state
</div>
</div>
</div>
</foreignObject>
<text x="420" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">routing state</text>
</switch>
</g>
<rect x="480" y="0" width="320" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 10px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
operation mode
</div>
</div>
</div>
</foreignObject>
<text x="640" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">operation mode</text>
</switch>
</g>
<rect x="800" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 801px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
auto mode available
</div>
</div>
</div>
</foreignObject>
<text x="860" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">auto mode available</text>
</switch>
</g>
<rect x="120" y="20" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
initializing
</div>
</div>
</div>
</foreignObject>
<text x="180" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initializing</text>
</switch>
</g>
<rect x="120" y="40" width="120" height="140" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
running
</div>
</div>
</div>
</foreignObject>
<text x="180" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">running</text>
</switch>
</g>
<rect x="240" y="40" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 50px; margin-left: 241px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
uninitialized
</div>
</div>
</div>
</foreignObject>
<text x="300" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">uninitialized</text>
</switch>
</g>
<rect x="240" y="60" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 70px; margin-left: 241px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
initializing
</div>
</div>
</div>
</foreignObject>
<text x="300" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initializing</text>
</switch>
</g>
<rect x="240" y="80" width="120" height="100" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 130px; margin-left: 241px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
initialized
</div>
</div>
</div>
</foreignObject>
<text x="300" y="134" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initialized</text>
</switch>
</g>
<rect x="360" y="80" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
unset, arrived
</div>
</div>
</div>
</foreignObject>
<text x="420" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">unset, arrived</text>
</switch>
</g>
<rect x="360" y="100" width="120" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 130px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set
</div>
</div>
</div>
</foreignObject>
<text x="420" y="134" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">set</text>
</switch>
</g>
<rect x="360" y="160" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 170px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
arrived
</div>
</div>
</div>
</foreignObject>
<text x="420" y="174" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">arrived</text>
</switch>
</g>
<rect x="120" y="180" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 190px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
finalizing
</div>
</div>
</div>
</foreignObject>
<text x="180" y="194" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">finalizing</text>
</switch>
</g>
<rect x="480" y="100" width="330" height="40" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 328px; height: 1px; padding-top: 120px; margin-left: 481px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
else
</div>
</div>
</div>
</foreignObject>
<text x="645" y="124" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">else</text>
</switch>
</g>
<rect x="800" y="100" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 801px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
false
</div>
</div>
</div>
</foreignObject>
<text x="860" y="114" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">false</text>
</switch>
</g>
<rect x="800" y="120" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 130px; margin-left: 801px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
true
</div>
</div>
</div>
</foreignObject>
<text x="860" y="134" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">true</text>
</switch>
</g>
<rect x="0" y="20" width="120" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 50px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Initializing
</div>
</div>
</div>
</foreignObject>
<text x="60" y="54" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Initializing</text>
</switch>
</g>
<rect x="120" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 121px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
launch state
</div>
</div>
</div>
</foreignObject>
<text x="180" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">launch state</text>
</switch>
</g>
<rect x="0" y="100" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Planning
</div>
</div>
</div>
</foreignObject>
<text x="60" y="114" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Planning</text>
</switch>
</g>
<rect x="0" y="120" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 130px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
WaitingForEngage
</div>
</div>
</div>
</foreignObject>
<text x="60" y="134" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">WaitingForEngage</text>
</switch>
</g>
<rect x="0" y="140" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 150px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Driving
</div>
</div>
</div>
</foreignObject>
<text x="60" y="154" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Driving</text>
</switch>
</g>
<rect x="0" y="160" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 170px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
ArrivedGoal
</div>
</div>
</div>
</foreignObject>
<text x="60" y="174" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">ArrivedGoal</text>
</switch>
</g>
<rect x="0" y="180" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 190px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Finalizing
</div>
</div>
</div>
</foreignObject>
<text x="60" y="194" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Finalizing</text>
</switch>
</g>
<rect x="800" y="140" width="120" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="360" y="20" width="120" height="60" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="480" y="20" width="320" height="80" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="480" y="160" width="320" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="360" y="180" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="240" y="180" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="240" y="20" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="480" y="140" width="320" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 318px; height: 1px; padding-top: 150px; margin-left: 481px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
mode != stop &amp;&amp; autoware_control_enabled == true
</div>
</div>
</div>
</foreignObject>
<text x="640" y="154" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">
mode != stop &amp;&amp; autoware_control_enabled == true
</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

@@ -0,0 +1,651 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="1042px"
height="681px"
viewBox="-0.5 -0.5 1042 681"
content="&lt;mxfile&gt;&lt;diagram id=&quot;6E-LtnesXNhnNIPTZu3a&quot; name=&quot;Page-1&quot;&gt;7R3bcqM29Gs8k31Ihrvtx2w23nba3ck0nWn75CEg2+piREFO7Hx9JZBskGSDbW52NjuThYMA6dxvIgPzYbn+GrvR4hvyQTAwNH89ML8MDMOwHYf8RyGbDDIeaxlgHkM/A+k7wDN8BwzIh62gD5LCQIxQgGFUBHooDIGHCzA3jtFbcdgMBcW3Ru4cSIBnzw1k6F/QxwsG1Z3x7sIvAM4X7NUjY5hdWLp8MFtJsnB99JYDmY8D8yFGCGdHy/UDCCjyOF6y+yZ7rm4nFoMQV7nBNtk88IYvDvhkrewUxXiB5ih0g8cd9HOMVqEP6BM0crbAy4Ac6uRwhkLMqKUb9BwGwQMKUJw+2ZzNZobnEXiCY/QD5K74zotjO+SKPH+2pAStYo/NkCMPu/EcsGE2G0dnn7uRrforQEuA4w0ZEIPAxfC1SEmXMcR8O47deh/H7iY3IEIwxEnuyU8UQAYw3h45bG6Msy1TwP9x48lBNgN+llvKDpTSVE1fjqpXN1ixJUsEL5LzbQExeI7cFNlvRH4FEh9NUjeA85DAPEJSQC5+fgUxhkSY7tmFJfT9lK8S8lYYzv9ggmMf4gf6ELA+SGl29XYkoNhi52850dU4cJETW51jT8UeORIdpkDdBBBkrAYMWQKCZPw4YwV67Bqwc7762Y35HaGIIelfgPGGYcldYXQuD1dSS5aslZxGlJKkRRytSEF9JJAmmxO7a0edY7WbYwjvcQ5rt5LxZ2s3S5Kt+ygKiG7BEIVkHdrN5NvzwHigJMDe3ae2VV8DsmqLKDVkaTU0hbRaNUirfUXS6sjSOuqFCyEKjTE8TsiE8WcLmaMwYBM3guR3gIgZh++puJFTGEIMKQBIfEL83IgeLsDaJeQnRIpADMksqEfAoU8cZFQRxjXgkUFvhNMQXI2tIOZN6agh4RxekXCOZOHUjV5Kp1ni4JeMP1s6R7IJJL+0+6dfB4YTENx9fonJ0Zwe3fhg5q4COju4jAKwJCRIZfcaDeNWFnOyZ6m8/Dpkb9wD2fNdMJop0e54I/Ayqyp7ui0Ln9FMdF0aDjsicbKJSo7sCYKj6z2gWV36kivHAs20XipMLoNVFaYw/myFyVFV9Gd+ejKHtanptBhm6KZEIg8tIxSS9UwTYrLAdIkIhQgirs9uOQq71RymrWtSggrDxVmpPiVYGbW2xMRMq0QoAaYvIz4IYJSAS2VbRajTHNuOOmFbAYtEE8X4npaTCMQL3CSBHgdPYLDPTbPByLdU5BoZL6ZzkNsL5t1q2bzvtdi6kD+2G3TaunG0DxE+JGZJoLrWbumLa5qeOXr2+DhHTxh/fumL67SdAk7SsHcaBW4YwnA+JecrgpKa/YgKgVgDCnkohk5t+hGG7FR///JnvVg9Q2+eXAprF4ndFMM6t2oF/aYoonHmat+HUxSYQh9P04r2NIlfJXo1Hxwe7rBoR0hG5a7ftixVu5DIbjWJDZc0am83FKwBj7ZgAGU0qmoFZh1YlIs6ETGGbZvBGnCod4jEoYTEIEXiJAZucIHGr0uGlOsYIfLl7NtZQm3Tf0yJ5uDZj5JR0596kGt2iNyxhNwExK/Q60F2k9NkP+73UasOBdwdTfgzcjTBKCKuluQCnpoW6hSzVoeYlWMRGal9THISbMebv+kb73RryAH/sCmkJ1/WhbNN/uwpJ6haVX/bbKNprTLlLjgAOoa+eoG2d3YJdU8mpNWPhiZDyEyUdQ2K402t3sSQKUd1vFeC8kKBAZ3/VohfuE1SLrknA3QjWu8u8v4Klt+f0gT/1PXdKM0sSV0YE0ju1d4pTVECs4qjRrjS0GaQvn3pRp/4bWQt2Zyye+v1h3rRI9VqA6PZhw7GunIlqnqX2VLHsSnmACrm/I/VHZaY1TRq1gVyIPz426RWMWspdhMJ0mbm0uxFWeZ4vIM1xMzh2p5v/S1yvDPI9GSTOxGdrZ3v1oBt59vKemjbdWHngSXuNxPG34rdPUeOP+gLVJ5dmZaSp6Eb47vxULeMkZ39NosPdoQH79lwcYKGYt3c+2SLlR9zYpELI+zBEUHEqWpL4MDybTKKEmbG4S2EGJYcds/DJMl8MTkdUj347kNeXihetdqzZfUhyK7Ls7JMBYv2Qt+KDbKGdlh/low/fweW3KrHQ5ckcsNKsZSmiqUorZcEkV4WTe0aMuNcaJS9godGu0Dr1JfWM/WbBzfFEV4QhZJ14mtvC5A90cUUCKnGWYW7Vfmf9i7r4lxRsROh1QjP6qajsT8dQpYqKqy9V6wyOeRy7Um5llS61OmWzHBrN7MYLekSXuF75fTJZfVcWl3KVTfby9rKzVYTLcW2NGvcmWjJJVN6C+FcY0KmNyWLYdlI4hF4AVr50/SiQMWPsZ9BEB3V5rDmREcuv9amA4vEnQbI9Qse0pUlj0Uyttl0bp8S4dT6cZwivSqpLP5ZnP5tcxcjE7NkX1jJ+LMjGY6pavvCUsCUufMX7VSI3nqrWQP7/I0ctSZhVH77qfm0vbQpZBWa2aRZWq+xNIF6VTOh0oMqZj7L95WcIrNydJGAMIHhnKL5DSb4DOHsQ0ZPrOq0K5yqL3+UJEjIuvAt++IXdVzidEoKt6ViTkegHn18kUxF9DORzdOKgap/hUzFF0WV08R2OvEbXAoHlfdN1E9o2UFdIn8V7G8PTDCIhEiBgnJVsbr6Ak/t1ZRQryDQXmo44o629rrX+Kcxr6bc46isnnmmkauMTdmpS8v7GiaKaU71TlcMXhnfZzGyKe6x0xVqpamtGlxd5a0zRhGBeAvg/fhouLcUWqQ53B9O112gGlGU5LLmnTbUiFzlYgpkqtylcDHbwGpl8Fb3gTmyz/L1+/Oz3G55Uk1PlWo7tm/zoCN7ZbpODArbVHVD2cane4+1zOX/WJhv1cAPD9daL8/IDA3ZyAzb8lX5yyU+/iC+qvid7nZZ+XDYVZrcz3G2cQxnK3fuCNmGtphf4WEZRlvM/9PDqiASTXpYdNvy9s9OZLnY3R/vMB//Bw==&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<path d="M 940 400 L 940 390 L 940 366.37" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 940 361.12 L 943.5 368.12 L 940 366.37 L 936.5 368.12 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="400" width="1040" height="120" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<rect x="120" y="0" width="690" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<path d="M 700 120 L 700 153.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 158.88 L 696.5 151.88 L 700 153.63 L 703.5 151.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="600" y="80" width="200" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 100px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Applications (FMS, etc.)
</div>
</div>
</div>
</foreignObject>
<text x="700" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Applications (FMS, etc.)</text>
</switch>
</g>
<path d="M 700 200 L 700 230 L 700 233.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 238.88 L 696.5 231.88 L 700 233.63 L 703.5 231.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 380 160 L 1020 160 L 1040 180 L 1020 200 L 380 200 L 360 180 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 678px; height: 1px; padding-top: 180px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
/api/localization/initialize
</div>
</div>
</div>
</foreignObject>
<text x="700" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/api/localization/initialize</text>
</switch>
</g>
<path d="M 700 280 L 700 290 L 700 313.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 318.88 L 696.5 311.88 L 700 313.63 L 703.5 311.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="600" y="240" width="440" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 438px; height: 1px; padding-top: 260px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
AD API
<br/>
(default implementation)
</div>
</div>
</div>
</foreignObject>
<text x="820" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">AD API...</text>
</switch>
</g>
<path d="M 800 580 L 940 580 L 940 633.63" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 940 638.88 L 936.5 631.88 L 940 633.63 L 943.5 631.88 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 700 360 L 700 393.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 398.88 L 696.5 391.88 L 700 393.63 L 703.5 391.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 620 320 L 780 320 L 800 340 L 780 360 L 620 360 L 600 340 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 340px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
/localization/initialize
</div>
</div>
</div>
</foreignObject>
<text x="700" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/localization/initialize</text>
</switch>
</g>
<rect x="600" y="640" width="200" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 660px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
component_state_monitor
</div>
</div>
</div>
</foreignObject>
<text x="700" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">component_state_monitor</text>
</switch>
</g>
<path d="M 700 600 L 700 633.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 638.88 L 696.5 631.88 L 700 633.63 L 703.5 631.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="700" cy="580" rx="100" ry="20" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 580px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
initialpose3d
</div>
</div>
</div>
</foreignObject>
<text x="700" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initialpose3d</text>
</switch>
</g>
<path d="M 220 506.37 L 220 553.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 501.12 L 223.5 508.12 L 220 506.37 L 216.5 508.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 220 558.88 L 216.5 551.88 L 220 553.63 L 223.5 551.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 700 520 L 700 550 L 700 553.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 700 558.88 L 696.5 551.88 L 700 553.63 L 703.5 551.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="840" y="640" width="200" height="40" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 660px; margin-left: 841px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
simple_planning_simulator
</div>
</div>
</div>
</foreignObject>
<text x="940" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">simple_planning_simulator</text>
</switch>
</g>
<rect x="120" y="640" width="200" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 660px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
NDT
</div>
</div>
</div>
</foreignObject>
<text x="220" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NDT</text>
</switch>
</g>
<path d="M 220 606.37 L 220 633.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 601.12 L 223.5 608.12 L 220 606.37 L 216.5 608.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 220 638.88 L 216.5 631.88 L 220 633.63 L 223.5 631.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 180 560 L 260 560 L 280 580 L 260 600 L 180 600 L 160 580 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 580px; margin-left: 161px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
ndt_align_srv
</div>
</div>
</div>
</foreignObject>
<text x="220" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ndt_align_srv</text>
</switch>
</g>
<rect x="130" y="10" width="80" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 131px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
common
</div>
</div>
</div>
</foreignObject>
<text x="170" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">common</text>
</switch>
</g>
<rect x="230" y="10" width="80" height="30" fill="#dae8fc" stroke="#6c8ebf" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 231px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
psim
</div>
</div>
</div>
</foreignObject>
<text x="270" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">psim</text>
</switch>
</g>
<rect x="330" y="10" width="80" height="30" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 331px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
lsim/real
</div>
</div>
</div>
</foreignObject>
<text x="370" y="29" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">lsim/real</text>
</switch>
</g>
<rect x="430" y="10" width="80" height="30" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 431px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
node
</div>
</div>
</div>
</foreignObject>
<text x="470" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">node</text>
</switch>
</g>
<path d="M 650 10 L 690 10 L 710 25 L 690 40 L 650 40 L 630 25 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 631px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
service
</div>
</div>
</div>
</foreignObject>
<text x="670" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">service</text>
</switch>
</g>
<ellipse cx="570" cy="25" rx="40" ry="15" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 531px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic
</div>
</div>
</div>
</foreignObject>
<text x="570" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic</text>
</switch>
</g>
<path d="M 459.96 120 L 459.96 153.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 459.96 158.88 L 456.46 151.88 L 459.96 153.63 L 463.46 151.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 353.63 120 L 340 120 L 340 260 L 326.37 260" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 120 L 351.88 123.5 L 353.63 120 L 351.88 116.5 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 321.12 260 L 328.12 256.5 L 326.37 260 L 328.12 263.5 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="360" y="80" width="200" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 100px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font style="font-size: 12px">
initial_pose_adaptor
<br/>
(Fix z position to fit map)
</font>
</div>
</div>
</div>
</foreignObject>
<text x="460" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initial_pose_adaptor...</text>
</switch>
</g>
<path d="M 600 580 L 540 580 L 540 633.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 540 638.88 L 536.5 631.88 L 540 633.63 L 543.5 631.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="360" y="640" width="200" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 660px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
EKF
</div>
</div>
</div>
</foreignObject>
<text x="460" y="664" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">EKF</text>
</switch>
</g>
<path d="M 179.92 410 L 179.93 380 L 60 380 L 60 260 L 113.63 260" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 118.88 260 L 111.88 263.5 L 113.63 260 L 111.88 256.5 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 220 360 L 220 403.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 408.88 L 216.5 401.88 L 220 403.63 L 223.5 401.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="340" rx="100" ry="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 340px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
gnss pose
</div>
</div>
</div>
</foreignObject>
<text x="220" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">gnss pose</text>
</switch>
</g>
<path d="M 940 120 L 940 153.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 940 158.88 L 936.5 151.88 L 940 153.63 L 943.5 151.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="840" y="80" width="200" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 100px; margin-left: 841px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span style="font-size: 10px">automatic_pose_initializer</span>
<br style="font-size: 10px"/>
<span style="font-size: 10px">(Call the API when state is uninitialized)</span>
</div>
</div>
</div>
</foreignObject>
<text x="940" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">automatic_pose_initializer...</text>
</switch>
</g>
<path d="M 320 100 L 353.63 100" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 100 L 351.88 103.5 L 353.63 100 L 351.88 96.5 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="100" rx="100" ry="20" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 100px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font style="font-size: 12px;">initialpose (from rviz)</font>
</div>
</div>
</div>
</foreignObject>
<text x="220" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">initialpose (from rviz)</text>
</switch>
</g>
<path d="M 220 233.63 L 220 206.37" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 238.88 L 216.5 231.88 L 220 233.63 L 223.5 231.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 220 201.12 L 223.5 208.12 L 220 206.37 L 216.5 208.12 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 140 240 L 300 240 L 320 260 L 300 280 L 140 280 L 120 260 Z" fill="#fff2cc" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 260px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
/map/get_partial_pointcloud_map
</div>
</div>
</div>
</foreignObject>
<text x="220" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/map/get_partial_pointcloud_map</text>
</switch>
</g>
<rect x="120" y="160" width="200" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 180px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font style="font-size: 12px;">pointcloud_map_loader</font>
</div>
</div>
</div>
</foreignObject>
<text x="220" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">pointcloud_map_loader</text>
</switch>
</g>
<path d="M 940 320 L 940 300 L 940 286.37" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 940 281.12 L 943.5 288.12 L 940 286.37 L 936.5 288.12 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="940" cy="340" rx="100" ry="20" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 340px; margin-left: 841px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
/localization/initialization_state
</div>
</div>
</div>
</foreignObject>
<text x="940" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">/localization/initialization_state</text>
</switch>
</g>
<path d="M 460 360 L 460 403.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 460 408.88 L 456.5 401.88 L 460 403.63 L 463.5 401.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="460" cy="340" rx="100" ry="20" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 340px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
sensing twist
</div>
</div>
</div>
</foreignObject>
<text x="460" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">sensing twist</text>
</switch>
</g>
<rect x="620" y="440" width="160" height="40" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 460px; margin-left: 621px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span style="text-align: right">pose_initializer</span>
</div>
</div>
</div>
</foreignObject>
<text x="700" y="464" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">pose_initializer</text>
</switch>
</g>
<path d="M 720 10 L 780 10 L 800 25 L 780 40 L 720 40 L 740 25 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 721px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
module
</div>
</div>
</div>
</foreignObject>
<text x="760" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">module</text>
</switch>
</g>
<path d="M 460 510 L 460 553.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 460 558.88 L 456.5 551.88 L 460 553.63 L 463.5 551.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 400 470 L 500 470 L 520 490 L 500 510 L 400 510 L 420 490 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 490px; margin-left: 401px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
EKF trigger
</div>
</div>
</div>
</foreignObject>
<text x="460" y="494" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">EKF trigger</text>
</switch>
</g>
<path d="M 400 410 L 500 410 L 520 430 L 500 450 L 400 450 L 420 430 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 430px; margin-left: 401px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop check
</div>
</div>
</div>
</foreignObject>
<text x="460" y="434" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stop check</text>
</switch>
</g>
<path d="M 460 600 L 460 633.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 460 638.88 L 456.5 631.88 L 460 633.63 L 463.5 631.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 420 560 L 500 560 L 520 580 L 500 600 L 420 600 L 400 580 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 580px; margin-left: 401px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
trigger_node
</div>
</div>
</div>
</foreignObject>
<text x="460" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">trigger_node</text>
</switch>
</g>
<path d="M 160 410 L 260 410 L 280 430 L 260 450 L 160 450 L 180 430 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 430px; margin-left: 161px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
GNSS
<br/>
<span style="font-size: 10px;">(Fix z position to fit map)</span>
</div>
</div>
</div>
</foreignObject>
<text x="220" y="434" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">GNSS...</text>
</switch>
</g>
<path d="M 160 470 L 260 470 L 280 490 L 260 510 L 160 510 L 180 490 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 490px; margin-left: 161px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
NDT align
</div>
</div>
</div>
</foreignObject>
<text x="220" y="494" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NDT align</text>
</switch>
</g>
<path d="M 60 510 L 60 553.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 558.88 L 56.5 551.88 L 60 553.63 L 63.5 551.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 0 470 L 100 470 L 120 490 L 100 510 L 0 510 L 20 490 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 490px; margin-left: 1px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
NDT trigger
</div>
</div>
</div>
</foreignObject>
<text x="60" y="494" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NDT trigger</text>
</switch>
</g>
<path d="M 60 600 L 60 620 L 160 620 L 160 633.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 160 638.88 L 156.5 631.88 L 160 633.63 L 163.5 631.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 20 560 L 100 560 L 120 580 L 100 600 L 20 600 L 0 580 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 580px; margin-left: 1px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
trigger_node
</div>
</div>
</div>
</foreignObject>
<text x="60" y="584" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">trigger_node</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 50 KiB

@@ -0,0 +1,255 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="721px"
height="361px"
viewBox="-0.5 -0.5 721 361"
content="&lt;mxfile&gt;&lt;diagram id=&quot;NeQHiIWb25snwK_hvTzY&quot; name=&quot;Page-1&quot;&gt;7VrbjpswEP2avAdzSx632+1FaqWV9qGPkQWzwV0HU+Pc9utrgh0uJiErcoM2kSI4jMGew5nx2BnZj4vNV46T6CcLgY7QONyM7M8jhHzflb8ZsM0Bx/dyYM5JmENWAbyQd1DgWKFLEkJaMRSMUUGSKhiwOIZAVDDMOVtXzV4ZrT41wXMwgJcAUxP9RUIRKdTypsWFb0DmkXr0BPn5hQXWxmokaYRDti5B9tPIfuSMifxosXkEmvlO+yVv9+XA1X3HOMTilAZIdUNs9dgglENVp4yLiM1ZjOlTgX7ibBmHkN1gLM8Kmx+MJRK0JPgbhNgq3vBSMAlFYkHV1fyZ2YMO9lpBKVvyQFk5imjM56Ct/L3L5KsGbAGCb6UNB4oFWVVvjxXp872davrAOd6WDBJGYpGW7vycAdJgo99CRZ56e5Fb8/HH7OVB3gN9VhpKAe14a+bQ7jWHefevzSHyqpxY0+Mctth35lA5ZoXpUo34Qf6MH56/G+RWqVtHRMBLgnceXstoW6XplVD6yCjju7b2q5t9M5zFooTnH4mngrM3KF3xdp894SvgAjbHKTe5VA2cmg60LtZFDPV1YIxK4VO3a2K/xMBRB7v9EYnXIJIDjr1uoGvRyHHzzhLxTIkkCSWBdACL0+HKxDFVgiYXUonfH5VMG6YDd5FK7JbpQIt9Z51M+s2hewsOHedjHLbYd+ZwasS6FUQkoDALFuFsjgUMN97ZnhnwnEsFPF1R9kEtli51S3JxbqEWrxbBdEQ7pJYW+85q0Y4pyUU2oUwW7OR9Nz2Qp28kBll+k2CWiib9yFuSJIWeacetu3bSMFsYX0o8PVo9sOw7EU89/betHrTYdxePbYiHpLMEL1NJ0jBEguoLMA0isS5VeFpOj0Ti3olI6vOrNpG02HcXidskEplIuJhx+LOEVAxGLfYJKcXyLqUWr0dq8U21TG+hlvrCS1v10mLfXS2+oZYURJ5TDHrTCCfZYQQbLFmTbCTAiXwa8AJ91hA6RUwb0HtGdyeuepy6aibq0cqA1bQ00HUR9GRHmeV3tZgYTOldLx+aau+LlQ/7PdAevI/oXmrveuxu27hqse8c65FZe+MggETks6P/4b7ifHTFcI96VJ2jhurcu4W86tX2B7eFzy0uszZfsCwFDWoNq16eX1cl5s57x/wuXajDETpTFKm9ZQ07gnZTknbP4Z+J4Z+YhYPafvCr3nVN7zbtPtjncK450UyBr0jwr5dJ3u040fcocSJYQoKBBFv3ap6Vp8X/GPPkV/wZ1H76Cw==&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<path d="M 60 200 L 60 210 L 60 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 238.88 L 56.5 231.88 L 60 233.63 L 63.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 220 160 L 220 150 L 220 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 121.12 L 223.5 128.12 L 220 126.37 L 216.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="160" width="720" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 718px; height: 1px; padding-top: 180px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
AD API
</div>
</div>
</div>
</foreignObject>
<text x="360" y="184" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">AD API</text>
</switch>
</g>
<path d="M 60 40 L 60 50 L 60 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 78.88 L 56.5 71.88 L 60 73.63 L 63.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="0" width="280" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 278px; height: 1px; padding-top: 20px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Applications
</div>
</div>
</div>
</foreignObject>
<text x="140" y="24" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">Applications</text>
</switch>
</g>
<path d="M 220 320 L 220 310 L 220 286.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 281.12 L 223.5 288.12 L 220 286.37 L 216.5 288.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 400 320 L 400 310 L 400 286.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 400 281.12 L 403.5 288.12 L 400 286.37 L 396.5 288.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="320" width="480" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 478px; height: 1px; padding-top: 340px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
vehicle_cmd_gate
</div>
</div>
</div>
</foreignObject>
<text x="240" y="344" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">vehicle_cmd_gate</text>
</switch>
</g>
<path d="M 620 240 L 620 220 L 620 206.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 620 201.12 L 623.5 208.12 L 620 206.37 L 616.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="620" cy="260" rx="100" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 260px; margin-left: 521px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
/localization/kinematic_state
</div>
</div>
</div>
</foreignObject>
<text x="620" y="264" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">/localization/kinematic_state</text>
</switch>
</g>
<path d="M 220 240 L 220 210 L 220 206.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 201.12 L 223.5 208.12 L 220 206.37 L 216.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="260" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 260px; margin-left: 161px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
is_paused
</div>
</div>
</div>
</foreignObject>
<text x="220" y="264" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">is_paused</text>
</switch>
</g>
<path d="M 400 240 L 400 210 L 400 206.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 400 201.12 L 403.5 208.12 L 400 206.37 L 396.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="400" cy="260" rx="80" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 260px; margin-left: 321px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
is_start_requested
</div>
</div>
</div>
</foreignObject>
<text x="400" y="264" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">is_start_requested</text>
</switch>
</g>
<path d="M 60 280 L 60 310 L 60 313.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 318.88 L 56.5 311.88 L 60 313.63 L 63.5 311.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 20 240 L 100 240 L 120 260 L 100 280 L 20 280 L 0 260 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 260px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set_pause
</div>
</div>
</div>
</foreignObject>
<text x="60" y="264" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">set_pause</text>
</switch>
</g>
<path d="M 620 320 L 620 286.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 620 281.12 L 623.5 288.12 L 620 286.37 L 616.5 288.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="520" y="320" width="200" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 340px; margin-left: 521px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
localization
</div>
</div>
</div>
</foreignObject>
<text x="620" y="344" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">localization</text>
</switch>
</g>
<path d="M 60 120 L 60 150 L 60 153.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 60 158.88 L 56.5 151.88 L 60 153.63 L 63.5 151.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 20 80 L 100 80 L 120 100 L 100 120 L 20 120 L 0 100 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 100px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
accept_start
</div>
</div>
</div>
</foreignObject>
<text x="60" y="104" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">accept_start</text>
</switch>
</g>
<path d="M 220 80 L 220 50 L 220 46.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 220 41.12 L 223.5 48.12 L 220 46.37 L 216.5 48.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="220" cy="100" rx="60" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 100px; margin-left: 161px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
motion_state
</div>
</div>
</div>
</foreignObject>
<text x="220" y="104" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">motion_state</text>
</switch>
</g>
<rect x="420" y="0" width="300" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<rect x="430" y="10" width="80" height="30" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 431px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
node
</div>
</div>
</div>
</foreignObject>
<text x="470" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">node</text>
</switch>
</g>
<path d="M 650 10 L 690 10 L 710 25 L 690 40 L 650 40 L 630 25 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 631px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
service
</div>
</div>
</div>
</foreignObject>
<text x="670" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">service</text>
</switch>
</g>
<ellipse cx="570" cy="25" rx="40" ry="15" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 531px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic
</div>
</div>
</div>
</foreignObject>
<text x="570" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 20 KiB

@@ -0,0 +1,344 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="521px"
height="282px"
viewBox="-0.5 -0.5 521 282"
content="&lt;mxfile&gt;&lt;diagram id=&quot;Cz8Q8T6vesO4MC4sh1-d&quot; name=&quot;Page-1&quot;&gt;5Vpdc6IwFP01vnaAQMRHa223D906a2f3OUIEZoE4IWq7v36DhM+gxRq0rT44cEkgOffck5sLAzCJXh8oWvlPxMXhwNDc1wG4GxjGSDf4f2p4ywwW1DKDRwM3M+mlYR78w8KYN1sHLk5qDRkhIQtWdaND4hg7rGZDlJJtvdmShPWnrpCHJcPcQaFs/RO4zBdWHY7KCz9w4Pni0bYxzC5EKG8sZpL4yCXbiglMB2BCCWHZUfQ6wWGKXY5L1u9+z9ViYBTHrEsHU4x4g8K1mNycIYbTJjH/G9+lf7NHMVr2lkNAyTp2cXoXbQBut37A8HyFnPTqlvuc23wWhfxM54dLEjPhRe56cLvBlAUcznEYeDE3MpJ2ECPh1/Dr3unoBUicXJhEmNE33kR0ME2BqyCWLU63FS/l0PsVBxmaMCLBDK+4dQkePxD4tWMJdAkl7HLeiFNCmU88EqNwWlpv6zhWMEsYomyckpUbnBAlSeDk5vsgzJvtQYiPgqypI4Yhwo139bBoBTJTOsCDwFIcIhZs6sQ/CSXrK6FkqoZp15UPGL1VGqxIELOkcudZaihprdt1Wo8aQX1Uc36QPb90VzGRTh40JMmYoXXCvbNfI/QOGsG9NSEhobu+YGk72MlcSclfXLmysC3T0g45VZKQvXqhN/SiEIeKYNgtemEqkAvDPhgIMYnxAa6Ly1WiH8SkSnQgE105zzvLgUSmXzhZR0HsKaWTa2HbNdvoZBsLAKEaOgHtgnQafUBXj2RXXYY7cc2UuQY/haaCRugb8LCovtP+ZFUFoLd18RStaPGfdSmtMNu1QvHKcxmpKDLQc0gFvNTKY8lsMi7FJktiU5rGqF54LpPHnJNNQJMA+wwLDzyDcClJ5o3hcdl8o/3JCw+U4uCJbL5m/iWFQcv+v+C86jgYSjjKcRG7DaK7KPELSCvw7QXjXfJWpmq1zDS3HcdxiZRNoK3RDbRG5W9Yv2EWmOIeh5KsJtdhwzFZOEs3+gDtbcldSVqG4hl7eqIxys1N/3EasqZ4VeksnFrlvjAhUekK8ZK1FMCiwHV3utgWVR3Fr3uYNJ1ndlssDAVBIpcba6gvUZhcDezwfLDnhfOrFCd9yMUJqhGkYjFWL0i6LvloldbVrlGS9HPGhvEO7tckSnpLxtQX8ODwNvRSFQ/QUvJQ/rZESclK144rWTXan16ykgsy8xRx5Xvo5dJo30O7cAGtnjYPLVlRb3sHIOdFyHHwivUgOw6HCNOLC4/R/pKqCjfsSXhM+aWDrETfNRsajW6s4ek7tcI5DW3pITEyZZlxIndHtrBYpOUi1DddoDtW9pTEiVwi3QEPUZRONV4kqx08Oy/kVo/t5n01DjljwmReVYmpqTBSLegzSpVcVZq/jH+9PP58kDx1lozotK+prAZww5bPqbSeUqL82dW69PNv1UB2rksrBbJ4Z3IWIOW6wvzleTab3qmlZNcXXWopqfeHJD8tP8TMxKD8mhVM/wM=&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<rect x="400" y="40" width="120" height="200" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 47px; margin-left: 401px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
State in AD API
</div>
</div>
</div>
</foreignObject>
<text x="460" y="59" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">State in AD API</text>
</switch>
</g>
<path d="M 186.37 100 L 253.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 181.12 100 L 188.12 96.5 L 186.37 100 L 188.12 103.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 258.88 100 L 251.88 103.5 L 253.63 100 L 251.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 140 73.63 L 140 50 L 140 46.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 140 78.88 L 136.5 71.88 L 140 73.63 L 143.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 140 41.12 L 143.5 48.12 L 140 46.37 L 136.5 48.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="100" y="80" width="80" height="40" rx="6" ry="6" fill="#f8cecc" stroke="#b85450" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 100px; margin-left: 101px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Paused
</div>
</div>
</div>
</foreignObject>
<text x="140" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Paused</text>
</switch>
</g>
<path d="M 300 120 L 300 153.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 300 158.88 L 296.5 151.88 L 300 153.63 L 303.5 151.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="260" y="80" width="80" height="40" rx="6" ry="6" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 100px; margin-left: 261px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Resuming
</div>
</div>
</div>
</foreignObject>
<text x="300" y="104" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Resuming</text>
</switch>
</g>
<path d="M 300 200 L 300 220 L 300 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 300 238.88 L 296.5 231.88 L 300 233.63 L 303.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 260 180 L 186.37 180" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 181.12 180 L 188.12 176.5 L 186.37 180 L 188.12 183.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="260" y="160" width="80" height="40" rx="6" ry="6" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 180px; margin-left: 261px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Resumed
</div>
</div>
</div>
</foreignObject>
<text x="300" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Resumed</text>
</switch>
</g>
<path d="M 140 160 L 140 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 140 121.12 L 143.5 128.12 L 140 126.37 L 136.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="100" y="160" width="80" height="40" rx="6" ry="6" fill="#f8cecc" stroke="#b85450" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 180px; margin-left: 101px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Pausing
</div>
</div>
</div>
</foreignObject>
<text x="140" y="184" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Pausing</text>
</switch>
</g>
<path d="M 140 240 L 140 230 L 140 206.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 140 201.12 L 143.5 208.12 L 140 206.37 L 136.5 208.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="100" y="240" width="240" height="40" rx="6" ry="6" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 260px; margin-left: 101px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Moving
</div>
</div>
</div>
</foreignObject>
<text x="220" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Moving</text>
</switch>
</g>
<path d="M 0 219.66 L 340 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<rect x="0" y="200" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 210px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop = true
</div>
</div>
</div>
</foreignObject>
<text x="2" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">stop = true</text>
</switch>
</g>
<rect x="0" y="220" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 230px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop = false
</div>
</div>
</div>
</foreignObject>
<text x="2" y="234" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">stop = false</text>
</switch>
</g>
<path d="M 0 139.66 L 340 140" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<rect x="0" y="120" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 130px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
pause = true
</div>
</div>
</div>
</foreignObject>
<text x="2" y="134" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">pause = true</text>
</switch>
</g>
<rect x="0" y="140" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 150px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
pause = false
</div>
</div>
</div>
</foreignObject>
<text x="2" y="154" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">pause = false</text>
</switch>
</g>
<path d="M 300 40 L 300 60 L 300 73.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 300 78.88 L 296.5 71.88 L 300 73.63 L 303.5 71.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="100" y="0" width="240" height="40" rx="6" ry="6" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 20px; margin-left: 101px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
Starting
</div>
</div>
</div>
</foreignObject>
<text x="220" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Starting</text>
</switch>
</g>
<rect x="240" y="50" width="60" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 60px; margin-left: 241px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
accept
</div>
</div>
</div>
</foreignObject>
<text x="270" y="64" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">accept</text>
</switch>
</g>
<path d="M 0 59.58 L 220 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<rect x="0" y="60" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 70px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
cmd vel = 0
</div>
</div>
</div>
</foreignObject>
<text x="2" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">cmd vel = 0</text>
</switch>
</g>
<rect x="0" y="40" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 50px; margin-left: 2px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
cmd vel &gt; 0
</div>
</div>
</div>
</foreignObject>
<text x="2" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">
cmd vel &gt; 0
</text>
</switch>
</g>
<path d="M 220 220 L 220 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/>
<rect x="410" y="130" width="100" height="40" rx="6" ry="6" fill="#fff2cc" stroke="#d6b656" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 150px; margin-left: 411px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
STARTING
</div>
</div>
</div>
</foreignObject>
<text x="460" y="154" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">STARTING</text>
</switch>
</g>
<rect x="410" y="190" width="100" height="40" rx="6" ry="6" fill="#d5e8d4" stroke="#82b366" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 210px; margin-left: 411px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
MOVING
</div>
</div>
</div>
</foreignObject>
<text x="460" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">MOVING</text>
</switch>
</g>
<rect x="410" y="70" width="100" height="40" rx="6" ry="6" fill="#f8cecc" stroke="#b85450" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 90px; margin-left: 411px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
STOPPED
</div>
</div>
</div>
</foreignObject>
<text x="460" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">STOPPED</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 25 KiB

@@ -0,0 +1,323 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="841px"
height="442px"
viewBox="-0.5 -0.5 841 442"
content="&lt;mxfile&gt;&lt;diagram id=&quot;mvvE6A7THf0XtyBilGqc&quot; name=&quot;Page-1&quot;&gt;7Vpbj6M2FP41kXZfKi6BZB6z05m2UiuNNA99HHnBA941NjXOrb++NtgJ2CQkSxiSbDPSJByOAZ/vfD4XPPEfs81vDOTpXzSGeOI58Wbi/zrxvAfXE/+lYFsJgtCpBAlDcSVy94JX9C9UQq22RDEsGoqcUsxR3hRGlBAY8YYMMEbXTbV3ipt3zUECLcFrBLAt/RvFPFVSN3zYn/gdoiRVt557s+pEBrSymkmRgpiuayL/aeI/Mkp59SvbPEIsbaftUo17PnB292AMEn7KAAVEwbd6bjAWU1WHlPGUJpQA/LSXfmF0SWIoL+CIo73On5TmQugK4TfI+VbhBpacClHKM6zOvlPCHymmrLyj//zsiI+QV88iH+DgbJSooEsWKS1fOQBgCVRawc6SwgMhzSBnW6HCIAYcrZpXB8oXkp2eGrpgDGxrCjlFhBe1K79IgVBQXj3VmCqn9n3D9Ofpix/VE+ij2lT2ohLOdmiVXVYALzW0Gw6ZAOotyuK3AmJBDYGB6QBNeNcp4vA1B6W114LNBpQI4xqU74H8syGuPkJecEa/w9qZsPzswF9BxuHmOPw2sGqAN21a1Jur4/WepL5eatIaP/W4Nl+o4XHU3NPbZ1JgM+lhDCb5BjOmHUzq0O/NpMBi0gqmKMKwJFICOLwjEhkc2vGlxqFgKA6FY3DodK7UieFfAzG88DxiGPpNYnSPNiGu1g41ykD5PIbN/gf+KPDBmcB36HcAb40eDvj5bUbN0ZNN10weneMO0aHf4RDm6AEd4uFgrBXXhuxdxtC7DbbT6QcGW11MX+uiW89M3emV8G5m8mh+nHcd+r1TU9e9bRBHiabh/LzFs0O/P4ijdGEuB+IoReLMN9bOjpSoQ78/iP5tg+jOe6J4ctyZWiF+4oWYqxg8kW1bHWzDf5ayEyqm6Tvlpy4KE/lNc8jEA1IiBmY0hvpaX5nW4AyQAmkVQEACmdYSD1vdtFLtmVqcnUIcSkYukFrMQiNnc+zcYpfX1XOLXdesF8h2zwSSRLbVPTHWkT2Ttwotw+Biwrxp1ab1CCXQMJwSAYwSIg4jKBNFIZDmQxHAC3UiQ3Fcsq4NxibQF7B/6BhBo6WR4rbldt4lzB9a5o+EczKKfzKrt2XUw1l9Zlldd9l/MrO3dd6HM/v8YEApckAaJtfRQ4WYhQxwyddPTrUs6a/PVXwxIs1CjHcWL3/UYkd1/buPHbs40RU7LlKX2i0AtXaVqUEmInhsB/lP3+i2EAz4LtMhHv3y2c7GMEZ5cYgSV9shMN9ptYXxoVoEGuIzoWAwoxzeCwLWW8UPRcD9IQRkoUBoRpfFvaAwKgg3VJ+3bYf4sNKuZc9Bn9JO+Hcu0h3C3wpeFQwElTsWTH+//2rO9P+2iDzY1oZx9jb8oP+3bGLo3WU82VB21RsjkBAqM5PiPlfi1txwME+069r+JFce6HqD2KelANX944Z5gkuYxy5ASVvdebsvzIKmcQPbuPMW2/qXsK1dZRaQrVDL+8giBbn8mcINEGuemHkOGRJ3lJW6lr5okXcKBBuot8FeHSRjYmKXipzmKLqTldb9MMuKw/2e4+rlx37jtv/0Hw==&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<path d="M 380 280 L 380 290 L 380 313.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 380 318.88 L 376.5 311.88 L 380 313.63 L 383.5 311.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="200" y="240" width="360" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 358px; height: 1px; padding-top: 260px; margin-left: 201px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
external_cmd_selector
</div>
</div>
</div>
</foreignObject>
<text x="380" y="264" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">external_cmd_selector</text>
</switch>
</g>
<path d="M 280 360 L 280 390 L 280 393.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 280 398.88 L 276.5 391.88 L 280 393.63 L 283.5 391.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="320" width="560" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 558px; height: 1px; padding-top: 340px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
vehicle_cmd_gate
</div>
</div>
</div>
</foreignObject>
<text x="280" y="344" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">vehicle_cmd_gate</text>
</switch>
</g>
<path d="M 280 200 L 280 220 L 280 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 280 238.88 L 276.5 231.88 L 280 233.63 L 283.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 480 200 L 480 220 L 480 233.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 480 238.88 L 476.5 231.88 L 480 233.63 L 483.5 231.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 80 200 L 80 260 L 80 313.63" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 80 318.88 L 76.5 311.88 L 80 313.63 L 83.5 311.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="400" width="560" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 558px; height: 1px; padding-top: 420px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
vehicle_interface
</div>
</div>
</div>
</foreignObject>
<text x="280" y="424" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">vehicle_interface</text>
</switch>
</g>
<path d="M 720 340 L 680 340 L 566.37 340" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 561.12 340 L 568.12 336.5 L 566.37 340 L 568.12 343.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 720 260 L 640 260 L 566.37 260" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 561.12 260 L 568.12 256.5 L 566.37 260 L 568.12 263.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 720 420 L 690 420 L 566.37 420" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 561.12 420 L 568.12 416.5 L 566.37 420 L 568.12 423.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 780 160 L 780 126.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 780 121.12 L 783.5 128.12 L 780 126.37 L 776.5 128.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="720" y="160" width="120" height="280" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 300px; margin-left: 721px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font color="#000000">
operation mode
<br/>
transition manager
</font>
</div>
</div>
</div>
</foreignObject>
<text x="780" y="304" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">operation mode...</text>
</switch>
</g>
<rect x="560" y="320" width="160" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 330px; margin-left: 561px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
engage, gate_mode
</div>
</div>
</div>
</foreignObject>
<text x="640" y="334" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">engage, gate_mode</text>
</switch>
</g>
<rect x="560" y="400" width="160" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 410px; margin-left: 561px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
control_mode
</div>
</div>
</div>
</foreignObject>
<text x="640" y="414" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">control_mode</text>
</switch>
</g>
<rect x="560" y="240" width="160" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 250px; margin-left: 561px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
selector_mode
</div>
</div>
</div>
</foreignObject>
<text x="640" y="254" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">selector_mode</text>
</switch>
</g>
<rect x="720" y="80" width="120" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 100px; margin-left: 721px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span style="color: rgb(0 , 0 , 0)">AD API</span>
</div>
</div>
</div>
</foreignObject>
<text x="780" y="104" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">AD API</text>
</switch>
</g>
<ellipse cx="480" cy="180" rx="80" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 180px; margin-left: 401px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
control command
<br/>
(joystick etc.)
</div>
</div>
</div>
</foreignObject>
<text x="480" y="184" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">control command...</text>
</switch>
</g>
<ellipse cx="280" cy="180" rx="80" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 180px; margin-left: 201px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
control command
<br/>
(remote)
</div>
</div>
</div>
</foreignObject>
<text x="280" y="184" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">control command...</text>
</switch>
</g>
<ellipse cx="80" cy="180" rx="80" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 180px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
control command
<br/>
(autonomous)
</div>
</div>
</div>
</foreignObject>
<text x="80" y="184" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">control command...</text>
</switch>
</g>
<path d="M 560 100 L 713.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 718.88 100 L 711.88 103.5 L 713.63 100 L 711.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="200" y="80" width="360" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 358px; height: 1px; padding-top: 100px; margin-left: 201px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<font color="#000000">
component_state_monitor
<br/>
</font>
</div>
</div>
</div>
</foreignObject>
<text x="380" y="104" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">component_state_monitor</text>
</switch>
</g>
<path d="M 160 100 L 193.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 198.88 100 L 191.88 103.5 L 193.63 100 L 191.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<ellipse cx="80" cy="100" rx="80" ry="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 100px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
diagnostics
</div>
</div>
</div>
</foreignObject>
<text x="80" y="104" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">diagnostics</text>
</switch>
</g>
<rect x="0" y="0" width="300" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<rect x="10" y="10" width="80" height="30" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 11px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
node
</div>
</div>
</div>
</foreignObject>
<text x="50" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">node</text>
</switch>
</g>
<path d="M 230 10 L 270 10 L 290 25 L 270 40 L 230 40 L 210 25 Z" fill="#f5f5f5" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 211px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
service
</div>
</div>
</div>
</foreignObject>
<text x="250" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">service</text>
</switch>
</g>
<ellipse cx="150" cy="25" rx="40" ry="15" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 25px; margin-left: 111px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
topic
</div>
</div>
</div>
</foreignObject>
<text x="150" y="29" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">topic</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB

@@ -0,0 +1,418 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="928px"
height="441px"
viewBox="-0.5 -0.5 928 441"
content="&lt;mxfile&gt;&lt;diagram id=&quot;-9nZo-msseQFPmowi21l&quot; name=&quot;Page-1&quot;&gt;5Vzfc+I2EP5rmGlfOrblX3m8pLnrQzvTmXvos7AF+GosxhYh9K+vjGXAKwdBLMzC5WYuZlkUe7/9dqXVigl5Wb5/K+lq8RdPWT7xnPR9Qn6feF4UBfL/WrBtBH4UNoJ5maWNyD0Ivmf/MSV0lHSdpazqKArOc5GtusKEFwVLREdGy5Jvumoznnf/6orOmSb4ntBcl/6TpWKhpG74dHjjD5bNF+pPx17UvLGkrbJ6kmpBU745EpHXCXkpORfN1fL9heW17Vq7NJ/7+sG7+xsrWSHO+UBAmk+80XytHk7dmNi2T1vydZGy+gPOhDxvFplg31c0qd/dSHilbCGWuXzlyssZL4QCzJVP86zfkLrHN1YK9n4kUjf4jfElE+VWqqh3fWWrbffl5mD5MFKyxZHRQyWjCuz5fuCDPeSFMkm/eXRjsFR6gnrJS7Hgc17Q/PUgfe6a66DzJ+crZaQfTIitshJdC941YSVoKb7UbioFSU6rKkta8dcs31taXr7wnJe7GyNpwOLU3+mV/F929E7sTUkYnsKi4usyUQ/oKz7Rcs6UlnLe+tFP4lWynIrsrUuSPvPvPiqfkG6PFFY8K0R1NPLfteDgBm7Y9QOXANcG+r5zUl9eNHdwcIT9o5zlG+QWvgFBpyyeJX2gh0nMprMBoLdqN0bdAyh6wWnUDfqDUfe1eFkJiZ0X5tJuz9NSXs3rq19q7DbS6lJAl3WQLKZV/UvmJInVbsiqzj00r9ivJ2Kua465FmJsDLgS6kF2LzsOsr6FIBs8EJEinUgujvDpgzTaQvdh+DytP5hIIQbULeXMHtSJhwP100lQ0w/96ybNSAufO5DuPXwS74bxM0bApFmcsKQ3fk7jwA+cc5nUrvDwTT9hivRDw0QEptTYLpOeEKBuK372oY40bRID7Ab9wbC3prokgjr7oNmNpbsIKso1wgDq96zyrxZAXVd7/juOoETnko+DSpcFUDgTsRw/3ZvUdq4VQHtAR7qAJxcu4InlBbyrVzyNK/g7CKBwdjJq/PQRUGk2m3n98TMNp2FwPpX6lvAOCirBxZyJSgb94VTCULmZBfW/3srN7mcI7jimoAQUvk2VG4P+cNgxlG6uCTsSukMcTUsPg/5w3M8u3mTFLi/SospExovbZ0e4vNiny1HSI4oCjaX0uN9vP+YLQcEXuEFo4otBfzhfblOikVPVI3Sd3c/14mefP+BYbrqQ84a0adAf7A77lo9HSJuYwwDAkUSX4Q70h+PeZivjghNd2oxvmDU9TzObzp8i1ftkjkzQZY/FgpvRxY8sFPQYqJVdxgR9t66LT/D0Wxg8HX6i7ngNf9UQpwjhXDRsEwK0YT/DFL00k2YVneZ1CaavGgPcQXq1mIBWqmNoC14w4AdKRPNsXsiXOZvVI9QMyRKaf1HiZZamu3DcR7muk1lgnesC+/ewrs+pPBus0/tb7LJuSKMFEtbBsGiJdnCNMh7tAg1zVvx0rCPkhqwLr826AfsMSFgXOP41WBf4Fw1rkXV6NSVZ0GJeU42vWEnrKaC8XvKUPSrnggAYv4dzJLwS5+Irc25IxQUJ58D8MupyIw4+Rzk4vzQMa5FyTxrkDbucPfMSvlzlTEhMH5RycHIZjZjm2gz7EFvubYNnp+kTR+XL0MSp6cewVc32SQkM/TW2Orx7cY9x4A7rNYaKp0F/OO56CadkSy7Y3ff7BvAs0pj9vuSRTh61IbOzf+ChoNMT3BAwhFGD/nA66bWZnMuJxN2zKYaHFEZlE4omFku7s20i6rApQMEmOCkxNS8Z9Iez6TZdLOPuzvb5A5KTSeGFBzsN+sP9IcIQB66IO5Y4AJsSDV0aBv3huOt1oA8nqeg2aOE8dNQdWoLhCJKtzNnOOTuMwbGsg8tzU+Y06A9mTOs7D505+/wBSXknhiezTf5wWn+4P2Ao71wTdyxxAM6IDY1NBv3huOvlnY/Wo+gSJ1xyjpo4fQwFHFvnDdtpJcIlRgAPlRqmmlDf9pHDdqv5IfY/enHHEShhXdu4xDitPxx3vcHmjDr4HRw6hMuPUU8d+iiOIdmKon2FGhzTzQiCbGAT1LceRTEUaqxF0b5CDY7sCbczTMtOg/5w3PVCjXn7wwE7HjjiJpx9jhs39S4YnVCHxifVxPITdRpq30AAv0n03EYnjRFwIHutTe2jn2htmtEsf9y+Jti+O2ZfU6Cf8DnFqHNaCa9f7MJCNjD3ttRjCJvpR+sxDPSiiMXo+gCAw+N2+y+puBRiWN7SBvo0qPLl4Ru4G/XD15iT1/8B&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<rect x="7" y="0" width="670" height="60" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<path d="M 127 113.63 L 127 90 L 367 90 L 367 113.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 127 118.88 L 123.5 111.88 L 127 113.63 L 130.5 111.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 367 118.88 L 363.5 111.88 L 367 113.63 L 370.5 111.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 167 160 L 167 210 L 167 233.63" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 167 238.88 L 163.5 231.88 L 167 233.63 L 170.5 231.88 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<rect x="47" y="120" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 140px; margin-left: 48px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop
<br/>
(autoware control is false)
</div>
</div>
</div>
</foreignObject>
<text x="127" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stop...</text>
</switch>
</g>
<path d="M 407 160 L 407 200 L 407 233.63" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 407 238.88 L 403.5 231.88 L 407 233.63 L 410.5 231.88 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 367 120 L 367 90 L 607 90 L 607 113.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 607 118.88 L 603.5 111.88 L 607 113.63 L 610.5 111.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="287" y="120" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 140px; margin-left: 288px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
auto
<br/>
(autoware control is false)
</div>
</div>
</div>
</foreignObject>
<text x="367" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">auto...</text>
</switch>
</g>
<path d="M 287 420 L 247 420 L 247 140 L 280.63 140" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 285.88 140 L 278.88 143.5 L 280.63 140 L 278.88 136.5 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 407 400 L 407 320 L 407 286.37" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 407 281.12 L 410.5 288.12 L 407 286.37 L 403.5 288.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="287" y="400" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 420px; margin-left: 288px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
auto
<br/>
(autoware control is true)
</div>
</div>
</div>
</foreignObject>
<text x="367" y="424" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">auto...</text>
</switch>
</g>
<path d="M 47 420 L 7 420 L 7 140 L 40.63 140" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 45.88 140 L 38.88 143.5 L 40.63 140 L 38.88 136.5 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 167 400 L 167 310 L 167 286.37" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 167 281.12 L 170.5 288.12 L 167 286.37 L 163.5 288.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="47" y="400" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 420px; margin-left: 48px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop
<br/>
(autoware control is true)
</div>
</div>
</div>
</foreignObject>
<text x="127" y="424" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stop...</text>
</switch>
</g>
<path d="M 367 280 L 367 310 L 367 393.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 367 398.88 L 363.5 391.88 L 367 393.63 L 370.5 391.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 327 240 L 327 200 L 327 166.37" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 327 161.12 L 330.5 168.12 L 327 166.37 L 323.5 168.12 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 327 280 L 327 320 L 327 393.63" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 327 398.88 L 323.5 391.88 L 327 393.63 L 330.5 391.88 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<rect x="287" y="240" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 260px; margin-left: 288px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
auto
<br/>
(in transition)
</div>
</div>
</div>
</foreignObject>
<text x="367" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">auto...</text>
</switch>
</g>
<path d="M 127 280 L 127 320 L 127 393.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 127 398.88 L 123.5 391.88 L 127 393.63 L 130.5 391.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 87 240 L 87 200 L 87 166.37" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 87 161.12 L 90.5 168.12 L 87 166.37 L 83.5 168.12 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 87 280 L 87 330 L 87 393.63" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 87 398.88 L 83.5 391.88 L 87 393.63 L 90.5 391.88 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<rect x="47" y="240" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 260px; margin-left: 48px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop
<br/>
(in transition)
</div>
</div>
</div>
</foreignObject>
<text x="127" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">stop...</text>
</switch>
</g>
<path d="M 27 19.66 L 60.63 19.66" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 65.88 19.66 L 58.88 23.16 L 60.63 19.66 L 58.88 16.16 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/>
<rect x="77" y="10" width="150" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 20px; margin-left: 79px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
disable autoware control
</div>
</div>
</div>
</foreignObject>
<text x="79" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">disable autoware control</text>
</switch>
</g>
<path d="M 247 19.66 L 280.63 19.66" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 285.88 19.66 L 278.88 23.16 L 280.63 19.66 L 278.88 16.16 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<rect x="297" y="10" width="150" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 20px; margin-left: 299px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
enable autoware control
</div>
</div>
</div>
</foreignObject>
<text x="299" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">enable autoware control</text>
</switch>
</g>
<path d="M 471 19.66 L 504.63 19.66" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 509.88 19.66 L 502.88 23.16 L 504.63 19.66 L 502.88 16.16 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="521" y="10" width="136" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 134px; height: 1px; padding-top: 20px; margin-left: 523px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
change operation mode
</div>
</div>
</div>
</foreignObject>
<text x="523" y="24" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">change operation mode</text>
</switch>
</g>
<path d="M 27 39.66 L 60.63 39.66" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 65.88 39.66 L 58.88 43.16 L 60.63 39.66 L 58.88 36.16 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<rect x="77" y="30" width="150" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 40px; margin-left: 79px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
mode change completed
</div>
</div>
</div>
</foreignObject>
<text x="79" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">mode change completed</text>
</switch>
</g>
<path d="M 607 120 L 607 90 L 847 90 L 847 113.63" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 847 118.88 L 843.5 111.88 L 847 113.63 L 850.5 111.88 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 647 160 L 647 200 L 647 233.63" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 647 238.88 L 643.5 231.88 L 647 233.63 L 650.5 231.88 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<rect x="527" y="120" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 140px; margin-left: 528px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
remote
<br/>
(autoware control is false)
</div>
</div>
</div>
</foreignObject>
<text x="607" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">remote...</text>
</switch>
</g>
<path d="M 887 160 L 887 190 L 887 233.63" fill="none" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 887 238.88 L 883.5 231.88 L 887 233.63 L 890.5 231.88 Z" fill="#6c8ebf" stroke="#6c8ebf" stroke-miterlimit="10" pointer-events="all"/>
<rect x="767" y="120" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 140px; margin-left: 768px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
local
<br/>
(autoware control is false)
</div>
</div>
</div>
</foreignObject>
<text x="847" y="144" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">local...</text>
</switch>
</g>
<path d="M 607 280 L 607 310 L 607 393.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 607 398.88 L 603.5 391.88 L 607 393.63 L 610.5 391.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 567 240 L 567 210 L 567 166.37" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 567 161.12 L 570.5 168.12 L 567 166.37 L 563.5 168.12 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 567 280 L 567 320 L 567 393.63" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 567 398.88 L 563.5 391.88 L 567 393.63 L 570.5 391.88 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<rect x="527" y="240" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 260px; margin-left: 528px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
remote
<br/>
(in transition)
</div>
</div>
</div>
</foreignObject>
<text x="607" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">remote...</text>
</switch>
</g>
<path d="M 847 280 L 847 310 L 847 393.63" fill="none" stroke="#d6b656" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 847 398.88 L 843.5 391.88 L 847 393.63 L 850.5 391.88 Z" fill="#d6b656" stroke="#d6b656" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 807 240 L 807 210 L 807 166.37" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 807 161.12 L 810.5 168.12 L 807 166.37 L 803.5 168.12 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 807 280 L 807 330 L 807 393.63" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 807 398.88 L 803.5 391.88 L 807 393.63 L 810.5 391.88 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<rect x="767" y="240" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 260px; margin-left: 768px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
local
<br/>
(in transition)
</div>
</div>
</div>
</foreignObject>
<text x="847" y="264" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">local...</text>
</switch>
</g>
<path d="M 527 420 L 487 420 L 487 140 L 520.63 140" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 525.88 140 L 518.88 143.5 L 520.63 140 L 518.88 136.5 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 647 400 L 647 320 L 647 286.37" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 647 281.12 L 650.5 288.12 L 647 286.37 L 643.5 288.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="527" y="400" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 420px; margin-left: 528px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
remote
<br/>
(autoware control is true)
</div>
</div>
</div>
</foreignObject>
<text x="607" y="424" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">remote...</text>
</switch>
</g>
<path d="M 767 420 L 727 420 L 727 140 L 760.63 140" fill="none" stroke="#b85450" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 765.88 140 L 758.88 143.5 L 760.63 140 L 758.88 136.5 Z" fill="#b85450" stroke="#b85450" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 887 400 L 887 310 L 887 286.37" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 887 281.12 L 890.5 288.12 L 887 286.37 L 883.5 288.12 Z" fill="#82b366" stroke="#82b366" stroke-miterlimit="10" pointer-events="all"/>
<rect x="767" y="400" width="160" height="40" rx="6" ry="6" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 158px; height: 1px; padding-top: 420px; margin-left: 768px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
local
<br/>
(autoware control is true)
</div>
</div>
</div>
</foreignObject>
<text x="847" y="424" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">local...</text>
</switch>
</g>
<path d="M 167 320 L 887 320" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="stroke"/>
<rect x="297" y="30" width="150" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 148px; height: 1px; padding-top: 40px; margin-left: 299px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
mode change failed
</div>
</div>
</div>
</foreignObject>
<text x="299" y="44" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">mode change failed</text>
</switch>
</g>
<path d="M 247 39.66 L 280.63 39.66" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 285.88 39.66 L 278.88 43.16 L 280.63 39.66 L 278.88 36.16 Z" fill="#666666" stroke="#666666" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 87 360 L 807 360" fill="none" stroke="#666666" stroke-miterlimit="10" pointer-events="stroke"/>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 32 KiB

@@ -0,0 +1,317 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="721px"
height="101px"
viewBox="-0.5 -0.5 721 101"
content="&lt;mxfile&gt;&lt;diagram id=&quot;qn1FoCmzmF8PwLU9Dzqv&quot; name=&quot;Page-1&quot;&gt;3ZlNj5swEIZ/DXe+Atlr0+320lMOPVYWTADVMMiYJemvrwkmAYaVKi0flRMpgnfswDwe41fG8k759U2wMv2BMXDLteOr5X21XDcMD+q3FW6d4IdBJyQiizvJeQrn7A9o0dZqncVQjRpKRC6zcixGWBQQyZHGhMBm3OyCfHzVkiVAhHPEOFV/ZrFMteoEL8/Ad8iSVF/66IZdIGd9Y51JlbIYm4HkvVreSSDK7ii/noC37HouXb9vH0QfNyagkP/SwfW6Hu+M1zq5WGTvIPTtyVufs8C6iKHtZlvelybNJJxLFrXRRg2y0lKZc3XmqMNLxvkJOYp7X+9yaL+tjoUc6N1H6ZUU+BsGkeD+URGakM5R3aOE60DSCb4B5iDFTTXpo4GG3VebPm0GQ9ePRzoYtV5julqSxz8/gaoDzfQDvj7hy2qJBeZYVwYx9u0dGR8I40piaRBd97gj3YDQFZCjBIP4Bv6OfEPCl6NaagzCe3B3xHskeJUrUNnyX7myJQZRntRwsCXkFwI5Z0X92SJeYe3fkopnr7b2r7CmzJDxj2uRcQiZhEkwfEY69pbF5xLEBpGdTus5tA/8i6Od9/S7z+ipB9+23qgJh6sEUfwHi8DUf2xbLdQ/Q5G0GwzmTMfJg+64Zd1R+2wQ2OlzblOy1DlfGK8+WbcLQJk6l02hUKcrRb0/k+mzf4aJF6zEpJ/9w/0X4BBJFKY7OnfD0vOpaTaILHF0M2jXq2BqlhfYg1mACnEumxYcfTewxM7fAlim+3VrYlGnz9cx99jgnZb3+hc=&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<rect x="120" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 121px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
driver
</div>
</div>
</div>
</foreignObject>
<text x="180" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">driver</text>
</switch>
</g>
<rect x="360" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 361px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autonomous
</div>
</div>
</div>
</foreignObject>
<text x="420" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">autonomous</text>
</switch>
</g>
<rect x="240" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 241px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
stop
</div>
</div>
</div>
</foreignObject>
<text x="300" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">stop</text>
</switch>
</g>
<rect x="600" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 601px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
remote
</div>
</div>
</div>
</foreignObject>
<text x="660" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">remote</text>
</switch>
</g>
<rect x="480" y="0" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 10px; margin-left: 481px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
local
</div>
</div>
</div>
</foreignObject>
<text x="540" y="14" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">local</text>
</switch>
</g>
<rect x="0" y="20" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
control_mode
</div>
</div>
</div>
</foreignObject>
<text x="60" y="34" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">control_mode</text>
</switch>
</g>
<rect x="120" y="20" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 121px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
manual
</div>
</div>
</div>
</foreignObject>
<text x="180" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">manual</text>
</switch>
</g>
<rect x="240" y="20" width="480" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 478px; height: 1px; padding-top: 30px; margin-left: 241px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
autonomous
</div>
</div>
</div>
</foreignObject>
<text x="480" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">autonomous</text>
</switch>
</g>
<rect x="0" y="60" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 70px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
gate_mode
</div>
</div>
</div>
</foreignObject>
<text x="60" y="74" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">gate_mode</text>
</switch>
</g>
<rect x="120" y="60" width="240" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="360" y="60" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 70px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
auto
</div>
</div>
</div>
</foreignObject>
<text x="420" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">auto</text>
</switch>
</g>
<rect x="480" y="60" width="240" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 238px; height: 1px; padding-top: 70px; margin-left: 481px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
external
</div>
</div>
</div>
</foreignObject>
<text x="600" y="74" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">external</text>
</switch>
</g>
<rect x="0" y="40" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 50px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
engage
</div>
</div>
</div>
</foreignObject>
<text x="60" y="54" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">engage</text>
</switch>
</g>
<rect x="120" y="40" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="240" y="40" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 50px; margin-left: 241px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
false
</div>
</div>
</div>
</foreignObject>
<text x="300" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">false</text>
</switch>
</g>
<rect x="360" y="40" width="360" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 358px; height: 1px; padding-top: 50px; margin-left: 361px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
true
</div>
</div>
</div>
</foreignObject>
<text x="540" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">true</text>
</switch>
</g>
<rect x="0" y="80" width="120" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
selector_mode
</div>
</div>
</div>
</foreignObject>
<text x="60" y="94" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">selector_mode</text>
</switch>
</g>
<rect x="120" y="80" width="360" height="20" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<rect x="480" y="80" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 481px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
local
</div>
</div>
</div>
</foreignObject>
<text x="540" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">local</text>
</switch>
</g>
<rect x="600" y="80" width="120" height="20" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 90px; margin-left: 601px;"
>
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
remote
</div>
</div>
</div>
</foreignObject>
<text x="660" y="94" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">remote</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

@@ -0,0 +1,398 @@
<svg
host="65bd71144e"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="961px"
height="242px"
viewBox="-0.5 -0.5 961 242"
content="&lt;mxfile&gt;&lt;diagram id=&quot;vlU9K5DmlQzOJ9JTXKwZ&quot; name=&quot;Page-1&quot;&gt;7Vtbb+MoFP41kXYfuvI1TR7T2+xKs9JoK+3laURj4rCDjReTJplfv2BwjA251U7GbZJWLT4cMP6+cwFMBv59svpEQTb/nUQQDzwnWg38h4HnjYdj/lcI1lIQjkMpiCmKpMitBM/oO1RCR0kXKIJ5TZERghnK6sIpSVM4ZTUZoJQs62ozgut3zUAMDcHzFGBT+heK2FxJ3fK5RMWvEMVzdeuRdysrElAqqyfJ5yAiS03kPw78e0oIk6VkdQ+xwK7ERbZ72lK7GRiFKTukgT+SLV4BXqiHS1CeI5J+zTDg6FE1TrYuH56SRRpB0d4Z+HfLOWLwOQNTUbvkbHPZnCWYX7m8CDCKU17GcMbHc/cKKUMcx4kSMyL0c94cpfHnQuch5JIZwvieYEKLW/qzUPwIOUmZJpcf0QOj5BvUaobFh9eYgCiMxFDgShMpgD5BkkBG11xF1YZDRZay1kBdLivqg1I211h3y3ZAmVu86bpihBcUKXaCQtcgAEbcGNUloWxOYpIC/FhJ7+oUaXRsRSMnCzpV/StfZIDGUGl5QykTt94JGYUYMPRa9xPb8xdNJ5SCtaaQEZSyXOv5ixBUTNw2mHCDhnUfp88LcgQVE5tHOYwcw3k2TuNkeBGjtJ339MoNRkEdzJHpBq5ncYNRB14wbO0Elc5nIoJOge+/kLG1Si9gwciBzqJ7xugkjmFY8qiOfTOySPdVbRqwHmfSt71CWg9LI0tYCnoRlnzXys62qLRbvR6UzMbD3ZYg4enCEsyZAeeZ8Tz9FUQgY6TlzKBXsc3dn+KtsS3oILaNDZxzKAgXaEMDY/5ArA5kHZiUpLCBrhKVU7Eph4lnKHMylqAoKvzZxlyd2wZJTvE5DRXuoXnG64CL0jO3keFUoeCyWPHG9rCjk+KcihTXICUjOSwWfRma9pSMDkDfkvQ1zEengtwzIRczWx79xSqWRAsMTS94v/F/5NShtiUAz2bfXSQA11xGcKwhvuQsEHoNQs5p/MNrEjgsNR86TeqElf6uTFw1hevh0sRz7ZRtW5vs0W+9Y+KOfgSLR/vEe2HXt8+Vt7K7W7/9flj4BnY1njgNdP234rm4+Edc/HIbltcPK732Ya2uDpx6vRNam3HW2MQ/Tr+905pL1EmWGVS/3+lfY2dzk8P0Hf5TbfCX99LA/eNP9P3jomt7fXKimfXG7/s3ZyhDTQ/fsoRNd3B2h589+q3Dj+ddWTyexWB83Mxvj35rFoP2M78u2ClzWd9S/J53Bnv02/tYYKZ4/meIxYr2hfJSLEqTL799qMT0pszUTWp6y1S564XQ09MxC6EysPVwxjy8Pa17BG9JQRrub1if2NAut2U/OtrB+VNFj207bKCtzmx1tmh3eoF22AuwjRNDe+a+e/Tb52VzLzoB4liRegnzgbLxsJGNz3m+yHLYQW75X/yLmCC0LwvO8ubXcjainJPmGUhrVAz/W4hDs3dTicNEUBa//MRHwX/5nRyt9LMoCngcgdzNDCQIr2Ub3hFIsqLS9wNBLcSvUBBj1NQ7yYs5l+jC9bJVo06OUlSmhCYA16uXCjZRH8hxFpXc8Lhp3Kjjsdb2wv5ulCmJamVNtWrELSVV3Tva0IpKRkGaz3inZfcp3CgsCY3qd9ebv4Dpt7iww5sG5sVaT2HN15VVOdSQj1CeYaBQRylG2o1nmACmD6gkt1yHKGe8r/ySWwIQ/6V1cMOSBiLVL89tt60Xz/KqLvC3RNNLf4FqBFPnjME0MI8Z7A2m7cLjFq+9uuruow6Wtw+nOuoQXBPsNcHaEuwUQ0CriH11VXtWtbjqybJq6P3o+K1OXQK5pr7ahNwB2P+1mFNF79DctL/49WqTDtt6tSM++GX1RU25t1N929V//B8=&lt;/diagram&gt;&lt;/mxfile&gt;"
>
<defs/>
<g>
<rect x="520" y="0" width="440" height="160" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 433px; height: 1px; padding-top: 7px; margin-left: 527px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: left;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
mission_planner
</div>
</div>
</div>
</foreignObject>
<text x="527" y="19" fill="#333333" font-family="Helvetica" font-size="12px">mission_planner</text>
</switch>
</g>
<path d="M 800 100 L 720 100 L 686.37 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 681.12 100 L 688.12 96.5 L 686.37 100 L 688.12 103.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="800" y="40" width="120" height="80" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 801px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
planner plugin
</div>
</div>
</div>
</foreignObject>
<text x="860" y="84" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">planner plugin</text>
</switch>
</g>
<path d="M 40 20 L 113.63 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 118.88 20 L 111.88 23.5 L 113.63 20 L 111.88 16.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 240 20 L 270 20 L 353.63 20" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 20 L 351.88 23.5 L 353.63 20 L 351.88 16.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="120" y="0" width="120" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 20px; margin-left: 121px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
routing_adaptor
</div>
</div>
</div>
</foreignObject>
<text x="180" y="24" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">routing_adaptor</text>
</switch>
</g>
<rect x="120" y="140" width="120" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 150px; margin-left: 121px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set route
</div>
</div>
</div>
</foreignObject>
<text x="180" y="154" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">set route</text>
</switch>
</g>
<rect x="250" y="20" width="100" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 30px; margin-left: 251px;">
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set route points
</div>
</div>
</div>
</foreignObject>
<text x="300" y="34" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">set route points</text>
</switch>
</g>
<rect x="40" y="20" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 30px; margin-left: 41px;">
<div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
pose topic
</div>
</div>
</div>
</foreignObject>
<text x="80" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">pose topic</text>
</switch>
</g>
<rect x="760" y="200" width="200" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 220px; margin-left: 761px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
planning modules
</div>
</div>
</div>
</foreignObject>
<text x="860" y="224" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">planning modules</text>
</switch>
</g>
<rect x="480" y="220" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 230px; margin-left: 481px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
lanelet route
</div>
</div>
</div>
</foreignObject>
<text x="520" y="234" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">lanelet route</text>
</switch>
</g>
<rect x="120" y="100" width="120" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 110px; margin-left: 121px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set route points
</div>
</div>
</div>
</foreignObject>
<text x="180" y="114" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">set route points</text>
</switch>
</g>
<path d="M 40 100 L 170 100 L 353.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 100 L 351.88 103.5 L 353.63 100 L 351.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 40 140 L 190 140 L 353.63 140" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 140 L 351.88 143.5 L 353.63 140 L 351.88 136.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 40 180 L 120 180 L 353.63 180" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 358.88 180 L 351.88 183.5 L 353.63 180 L 351.88 176.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="0" y="80" width="40" height="160" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 160px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
App
</div>
</div>
</div>
</foreignObject>
<text x="20" y="164" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">App</text>
</switch>
</g>
<rect x="0" y="0" width="40" height="40" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 20px; margin-left: 1px;">
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
RViz
</div>
</div>
</div>
</foreignObject>
<text x="20" y="24" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">RViz</text>
</switch>
</g>
<path d="M 400 60 L 500 60 L 553.63 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 558.88 60 L 551.88 63.5 L 553.63 60 L 551.88 56.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 400 100 L 450 100 L 553.63 100" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 558.88 100 L 551.88 103.5 L 553.63 100 L 551.88 96.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 360 220 L 120 220 L 46.37 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 41.12 220 L 48.12 216.5 L 46.37 220 L 48.12 223.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="360" y="0" width="40" height="240" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 120px; margin-left: 361px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
AD
<br/>
API
</div>
</div>
</div>
</foreignObject>
<text x="380" y="124" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">AD...</text>
</switch>
</g>
<path d="M 630 120 L 630 220 L 406.37 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 401.12 220 L 408.12 216.5 L 406.37 220 L 408.12 223.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 630 120 L 630 220 L 753.63 220" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 758.88 220 L 751.88 223.5 L 753.63 220 L 751.88 216.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 610 120 L 610 198 L 406.37 198" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 401.12 198 L 408.12 194.5 L 406.37 198 L 408.12 201.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<path d="M 680 60 L 720 60 L 793.63 60" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/>
<path d="M 798.88 60 L 791.88 63.5 L 793.63 60 L 791.88 56.5 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/>
<rect x="560" y="40" width="120" height="80" fill="#f5f5f5" stroke="#666666" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 80px; margin-left: 561px;"
>
<div data-drawio-colors="color: #333333; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(51, 51, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
main module
</div>
</div>
</div>
</foreignObject>
<text x="620" y="84" fill="#333333" font-family="Helvetica" font-size="12px" text-anchor="middle">main module</text>
</switch>
</g>
<rect x="410" y="100" width="100" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 110px; margin-left: 411px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set lanelet route
</div>
</div>
</div>
</foreignObject>
<text x="460" y="114" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">set lanelet route</text>
</switch>
</g>
<rect x="120" y="220" width="120" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 230px; margin-left: 121px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span
style="color: rgb(0 , 0 , 0) ; font-family: &quot;helvetica&quot; ; font-size: 12px ; font-style: normal ; font-weight: 400 ; letter-spacing: normal ; text-align: center ; text-indent: 0px ; text-transform: none ; word-spacing: 0px ; background-color: rgb(248 , 249 , 250) ; display: inline ; float: none"
>
route, route state
</span>
</div>
</div>
</div>
</foreignObject>
<text x="180" y="234" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">route, route state</text>
</switch>
</g>
<rect x="410" y="60" width="100" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 70px; margin-left: 411px;">
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
set route points
</div>
</div>
</div>
</foreignObject>
<text x="460" y="74" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">set route points</text>
</switch>
</g>
<rect x="480" y="180" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 190px; margin-left: 481px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span style="font-family: &quot;helvetica&quot;">route state</span>
</div>
</div>
</div>
</foreignObject>
<text x="520" y="194" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">route state</text>
</switch>
</g>
<rect x="120" y="180" width="120" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 190px; margin-left: 121px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span
style="color: rgb(0 , 0 , 0) ; font-family: &quot;helvetica&quot; ; font-size: 12px ; font-style: normal ; font-weight: 400 ; letter-spacing: normal ; text-align: center ; text-indent: 0px ; text-transform: none ; word-spacing: 0px ; background-color: rgb(248 , 249 , 250) ; display: inline ; float: none"
>
clear route
</span>
</div>
</div>
</div>
</foreignObject>
<text x="180" y="194" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">clear route</text>
</switch>
</g>
<rect x="700" y="40" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 50px; margin-left: 701px;">
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
<span style="font-family: &quot;helvetica&quot;">pose array</span>
</div>
</div>
</div>
</foreignObject>
<text x="740" y="54" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">pose array</text>
</switch>
</g>
<rect x="700" y="100" width="80" height="20" fill="none" stroke="none" pointer-events="all"/>
<g transform="translate(-0.5 -0.5)">
<switch>
<foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;">
<div
xmlns="http://www.w3.org/1999/xhtml"
style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 110px; margin-left: 701px;"
>
<div data-drawio-colors="color: #000000; " style="box-sizing: border-box; font-size: 0px; text-align: center;">
<div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">
lanelet route
</div>
</div>
</div>
</foreignObject>
<text x="740" y="114" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">lanelet route</text>
</switch>
</g>
</g>
<switch>
<g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/>
<a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank">
<text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text>
</a>
</switch>
</svg>

After

Width:  |  Height:  |  Size: 30 KiB

@@ -0,0 +1,5 @@
# Interface API
## Overview
The interface API simply returns a version number. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/interface/) for AD API specifications.
@@ -0,0 +1,7 @@
# Localization API
## Overview
Unify the location initialization method to the service. The topic `/initialpose` from rviz is now only subscribed to by adapter node and converted to API call. This API call is forwarded to the pose initializer node so it can centralize the state of pose initialization. For other nodes that require initialpose, pose initializer node publishes as `/initialpose3d`. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/localization/) for AD API specifications.
![localization-architecture](images/localization.drawio.svg)
@@ -0,0 +1,13 @@
# Motion API
## Overview
Provides a hook for when the vehicle starts. It is typically used for announcements that call attention to the surroundings. Add a pause function to the vehicle_cmd_gate, and API will control it based on vehicle stopped and start requested. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/motion/) for AD API specifications.
![motion-architecture](images/motion-architecture.drawio.svg)
## States
The implementation has more detailed state transitions to manage pause state synchronization. The correspondence with the AD API state is as follows.
![motion-state](images/motion-state.drawio.svg)
@@ -0,0 +1,24 @@
# Operation mode API
## Overview
Introduce operation mode. It handles autoware engage, gate_mode, external_cmd_selector and control_mode abstractly. When the mode is changed, it will be in-transition state, and if the transition completion condition to that mode is not satisfied, it will be returned to the previous mode. Also, currently, the condition for mode change is only `WaitingForEngage` in `/autoware/state`, and the engage state is shared between modes. After introducing the operation mode, each mode will have a transition available flag. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/operation_mode/) for AD API specifications.
![operation-mode-architecture](images/operation-mode-architecture.drawio.svg)
## States
The operation mode has the following state transitions. Disabling autoware control and changing operation mode when autoware control is disabled can be done immediately.
Otherwise, enabling autoware control and changing operation mode when autoware control is enabled causes the state will be transition state.
If the mode change completion condition is not satisfied within the timeout in the transition state, it will return to the previous mode.
![operation-mode-state](images/operation-mode-state.drawio.svg)
## Compatibility
Ideally, vehicle_cmd_gate and external_cmd_selector should be merged so that the operation mode can be handled directly.
However, currently the operation mode transition manager performs the following conversions to match the implementation.
The transition manager monitors each topic in the previous interface and synchronizes the operation mode when it changes.
When the operation mode is changed with the new interface, the transition manager disables synchronization and changes the operation mode using the previous interface.
![operation-mode-table](images/operation-mode-table.drawio.svg)
@@ -0,0 +1,7 @@
# Routing API
## Overview
Unify the route setting method to the service. This API supports two waypoint formats, poses and lanelet segments. The goal and checkpoint topics from rviz is only subscribed to by adapter node and converted to API call. This API call is forwarded to the mission planner node so it can centralize the state of routing. For other nodes that require route, mission planner node publishes as `/planning/mission_planning/route`. See the [autoware-documentation](https://autowarefoundation.github.io/autoware-documentation/main/design/autoware-interfaces/ad-api/features/routing/) for AD API specifications.
![routing-architecture](images/routing.drawio.svg)
@@ -0,0 +1,74 @@
# 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 launch
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch.substitutions import PathJoinSubstitution
from launch_ros.actions import ComposableNodeContainer
from launch_ros.actions import Node
from launch_ros.descriptions import ComposableNode
from launch_ros.parameter_descriptions import ParameterFile
from launch_ros.substitutions import FindPackageShare
def create_api_node(node_name, class_name, **kwargs):
return ComposableNode(
namespace="adapi/node",
name=node_name,
package="autoware_default_adapi",
plugin="autoware::default_adapi::" + class_name,
parameters=[ParameterFile(LaunchConfiguration("config"))],
)
def get_default_config():
path = FindPackageShare("autoware_default_adapi")
path = PathJoinSubstitution([path, "config/default_adapi.param.yaml"])
return path
def generate_launch_description():
components = [
create_api_node("autoware_state", "AutowareStateNode"),
create_api_node("diagnostics", "DiagnosticsNode"),
create_api_node("fail_safe", "FailSafeNode"),
create_api_node("heartbeat", "HeartbeatNode"),
create_api_node("interface", "InterfaceNode"),
create_api_node("localization", "LocalizationNode"),
create_api_node("motion", "MotionNode"),
create_api_node("operation_mode", "OperationModeNode"),
create_api_node("perception", "PerceptionNode"),
create_api_node("planning", "PlanningNode"),
create_api_node("routing", "RoutingNode"),
create_api_node("vehicle", "VehicleNode"),
create_api_node("vehicle_info", "VehicleInfoNode"),
create_api_node("vehicle_door", "VehicleDoorNode"),
]
container = ComposableNodeContainer(
namespace="adapi",
name="container",
package="rclcpp_components",
executable="component_container_mt",
ros_arguments=["--log-level", "adapi.container:=WARN"],
composable_node_descriptions=components,
)
web_server = Node(
namespace="adapi",
package="autoware_default_adapi",
name="web_server",
executable="web_server.py",
)
argument = DeclareLaunchArgument("config", default_value=get_default_config())
return launch.LaunchDescription([argument, container, web_server])
@@ -0,0 +1,47 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>autoware_default_adapi</name>
<version>0.1.0</version>
<description>The autoware_default_adapi package</description>
<maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
<maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
<maintainer email="yukihiro.saito@tier4.jp">Yukihiro Saito</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake_auto</buildtool_depend>
<buildtool_depend>autoware_cmake</buildtool_depend>
<depend>autoware_ad_api_specs</depend>
<depend>autoware_adapi_v1_msgs</depend>
<depend>autoware_adapi_version_msgs</depend>
<depend>autoware_component_interface_specs</depend>
<depend>autoware_geography_utils</depend>
<depend>autoware_motion_utils</depend>
<depend>autoware_planning_msgs</depend>
<depend>autoware_system_msgs</depend>
<depend>autoware_vehicle_info_utils</depend>
<depend>autoware_vehicle_msgs</depend>
<depend>component_interface_utils</depend>
<depend>diagnostic_graph_utils</depend>
<depend>geographic_msgs</depend>
<depend>nav_msgs</depend>
<depend>rclcpp</depend>
<depend>rclcpp_components</depend>
<depend>shape_msgs</depend>
<depend>std_srvs</depend>
<depend>tier4_api_msgs</depend>
<depend>tier4_control_msgs</depend>
<depend>tier4_system_msgs</depend>
<exec_depend>python3-flask</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>autoware_lint_common</test_depend>
<test_depend>launch_testing</test_depend>
<test_depend>launch_testing_ament_cmake</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
+125
View File
@@ -0,0 +1,125 @@
#!/usr/bin/env python3
# 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.
from autoware_adapi_v1_msgs.msg import LocalizationInitializationState
from autoware_adapi_v1_msgs.msg import OperationModeState
from autoware_adapi_v1_msgs.msg import RouteState
import rclpy
from rclpy.node import Node
from rclpy.qos import QoSDurabilityPolicy
from rclpy.qos import QoSProfile
from rclpy.qos import QoSReliabilityPolicy
from tier4_system_msgs.msg import ModeChangeAvailable
modules = [
"control",
"localization",
"map",
"perception",
"planning",
"sensing",
"system",
"vehicle",
]
class Sub(object):
def __init__(self, node, topic_type, topic_name, durable):
qos = self.durable_qos(1) if durable else self.default_qos(1)
self.sub = node.create_subscription(topic_type, topic_name, self.callback, qos)
self.msg = None
def callback(self, msg):
self.msg = msg
@staticmethod
def durable_qos(depth):
r = QoSReliabilityPolicy.RELIABLE
d = QoSDurabilityPolicy.TRANSIENT_LOCAL
return QoSProfile(depth=depth, reliability=r, durability=d)
@staticmethod
def default_qos(depth):
r = QoSReliabilityPolicy.RELIABLE
d = QoSDurabilityPolicy.VOLATILE
return QoSProfile(depth=depth, reliability=r, durability=d)
class GuideNode(Node):
def __init__(self):
# fmt: off
super().__init__("guide")
self.localization = Sub(self, LocalizationInitializationState, "/api/localization/initialization_state", True)
self.routing = Sub(self, RouteState, "/api/routing/state", True)
self.operation_mode = Sub(self, OperationModeState, "/api/operation_mode/state", True)
self.launch_states = [Sub(self, ModeChangeAvailable, f"/system/component_state_monitor/component/launch/{module}", True) for module in modules]
self.auto_states = [Sub(self, ModeChangeAvailable, f"/system/component_state_monitor/component/autonomous/{module}", True) for module in modules]
self.timer = self.create_timer(1.0, self.check_callback)
self.previous_message = None
# fmt: on
def check_callback(self):
message = self.check_localization()
if self.previous_message != message:
print(message)
self.previous_message = message
def check_localization(self):
if self.localization.msg is None:
return "The localization state is not received. Please check ADAPI and localization component works correctly."
elif self.localization.msg.state == LocalizationInitializationState.INITIALIZED:
return self.check_routing()
else:
return "The vehicle pose is not estimated. Please set an initial pose or check GNSS."
def check_routing(self):
if self.routing.msg is None:
return "The routing state is not received. Please check ADAPI and planning component works correctly."
elif self.routing.msg.state == RouteState.UNSET:
return "The route is not set. Please set a goal pose."
elif self.routing.msg.state == RouteState.SET:
return self.check_operation_mode()
elif self.routing.msg.state == RouteState.ARRIVED:
return "The vehicle has reached the goal of the route. Please reset a route."
def check_operation_mode(self):
if self.operation_mode.msg is None:
return "The operation mode state is not received. Please check ADAPI and control component works correctly."
elif self.operation_mode.msg.mode == OperationModeState.AUTONOMOUS:
return "The vehicle is driving autonomously."
elif self.operation_mode.msg.mode == OperationModeState.LOCAL:
return "The vehicle is driving by a local operator."
elif self.operation_mode.msg.mode == OperationModeState.REMOTE:
return "The vehicle is driving by a remote operator."
elif self.operation_mode.msg.is_autonomous_mode_available:
return "The vehicle is ready. Please change the operation mode to autonomous."
else:
return self.check_autonomous_condition()
def check_autonomous_condition(self):
states = [state.msg.available if state.msg else False for state in self.auto_states]
if all(states):
return "Unable to safely switch to automatic mode. Please stop or satisfy the driving mode change condition."
else:
components = ",".join([module for module, state in zip(modules, states) if not state])
return f"The topic rate error is detected. Please check [{components}] components."
if __name__ == "__main__":
rclpy.init()
rclpy.spin(GuideNode())
rclpy.shutdown()
+63
View File
@@ -0,0 +1,63 @@
#!/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 sys
from threading import Thread
from autoware_adapi_version_msgs.srv import InterfaceVersion
import flask
import rclpy
from rclpy.node import Node
app = flask.Flask(__name__)
cli = None
@app.route("/interface/version")
def interface_version():
req = InterfaceVersion.Request()
res = cli.call(req)
return flask.jsonify(convert_dict(res))
def create_service(node, service_type, service_name):
cli = node.create_client(service_type, service_name)
while not cli.wait_for_service(timeout_sec=1.0):
node.get_logger().info(f"service not available, waiting again... ({service_name}")
return cli
def convert_dict(msg):
fields = getattr(msg, "get_fields_and_field_types", None)
if not fields:
return msg
return {field: convert_dict(getattr(msg, field)) for field in fields()}
def spin_ros_node():
global cli
node = Node("ad_api_default_web_server")
cli = create_service(node, InterfaceVersion, "/api/interface/version")
rclpy.spin(node)
if __name__ == "__main__":
rclpy.init(args=sys.argv, signal_handler_options=rclpy.signals.SignalHandlerOptions.NO)
thread = Thread(target=spin_ros_node)
thread.start()
app.run(host="localhost", port=8888, debug=False)
rclpy.shutdown()
thread.join()
@@ -0,0 +1,146 @@
// 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 "autoware_state.hpp"
#include <string>
#include <vector>
namespace autoware::default_adapi
{
AutowareStateNode::AutowareStateNode(const rclcpp::NodeOptions & options)
: Node("autoware_state", options)
{
const std::vector<std::string> module_names = {
"sensing", "perception", "map", "localization", "planning", "control", "vehicle", "system",
};
for (size_t i = 0; i < module_names.size(); ++i) {
const auto name = "/system/component_state_monitor/component/launch/" + module_names[i];
const auto qos = rclcpp::QoS(1).transient_local();
const auto callback = [this, i](const ModeChangeAvailable::ConstSharedPtr msg) {
component_states_[i] = msg->available;
};
sub_component_states_.push_back(create_subscription<ModeChangeAvailable>(name, qos, callback));
}
pub_autoware_state_ = create_publisher<AutowareState>("/autoware/state", 1);
srv_autoware_shutdown_ = create_service<std_srvs::srv::Trigger>(
"/autoware/shutdown",
std::bind(&AutowareStateNode::on_shutdown, this, std::placeholders::_1, std::placeholders::_2));
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_sub(sub_localization_, this, &AutowareStateNode::on_localization);
adaptor.init_sub(sub_routing_, this, &AutowareStateNode::on_routing);
adaptor.init_sub(sub_operation_mode_, this, &AutowareStateNode::on_operation_mode);
const auto rate = rclcpp::Rate(declare_parameter<double>("update_rate"));
timer_ = rclcpp::create_timer(this, get_clock(), rate.period(), [this]() { on_timer(); });
component_states_.resize(module_names.size());
launch_state_ = LaunchState::Initializing;
localization_state_.state = LocalizationState::UNKNOWN;
routing_state_.state = RoutingState::UNKNOWN;
operation_mode_state_.mode = OperationModeState::UNKNOWN;
}
void AutowareStateNode::on_localization(const LocalizationState::ConstSharedPtr msg)
{
localization_state_ = *msg;
}
void AutowareStateNode::on_routing(const RoutingState::ConstSharedPtr msg)
{
routing_state_ = *msg;
}
void AutowareStateNode::on_operation_mode(const OperationModeState::ConstSharedPtr msg)
{
operation_mode_state_ = *msg;
}
void AutowareStateNode::on_shutdown(
const Trigger::Request::SharedPtr, const Trigger::Response::SharedPtr res)
{
launch_state_ = LaunchState::Finalizing;
res->success = true;
res->message = "Shutdown Autoware.";
}
void AutowareStateNode::on_timer()
{
const auto convert_state = [this]() {
if (launch_state_ == LaunchState::Finalizing) {
return AutowareState::FINALIZING;
}
if (launch_state_ == LaunchState::Initializing) {
return AutowareState::INITIALIZING;
}
if (localization_state_.state == LocalizationState::UNKNOWN) {
return AutowareState::INITIALIZING;
}
if (routing_state_.state == RoutingState::UNKNOWN) {
return AutowareState::INITIALIZING;
}
if (operation_mode_state_.mode == OperationModeState::UNKNOWN) {
return AutowareState::INITIALIZING;
}
if (localization_state_.state != LocalizationState::INITIALIZED) {
return AutowareState::INITIALIZING;
}
if (routing_state_.state == RoutingState::UNSET) {
return AutowareState::WAITING_FOR_ROUTE;
}
if (routing_state_.state == RoutingState::ARRIVED) {
return AutowareState::ARRIVED_GOAL;
}
if (operation_mode_state_.mode != OperationModeState::STOP) {
if (operation_mode_state_.is_autoware_control_enabled) {
return AutowareState::DRIVING;
}
}
if (operation_mode_state_.is_autonomous_mode_available) {
return AutowareState::WAITING_FOR_ENGAGE;
}
return AutowareState::PLANNING;
};
// Update launch state.
if (launch_state_ == LaunchState::Initializing) {
bool is_initialized = true;
for (const auto & state : component_states_) {
is_initialized &= state;
}
if (is_initialized) {
launch_state_ = LaunchState::Running;
}
}
// Update routing state to reproduce old logic.
if (routing_state_.state == RoutingState::ARRIVED) {
const auto duration = now() - rclcpp::Time(routing_state_.stamp);
if (2.0 < duration.seconds()) {
routing_state_.state = RoutingState::UNSET;
}
}
AutowareState msg;
msg.stamp = now();
msg.state = convert_state();
pub_autoware_state_->publish(msg);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::AutowareStateNode)
@@ -0,0 +1,72 @@
// 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 COMPATIBILITY__AUTOWARE_STATE_HPP_
#define COMPATIBILITY__AUTOWARE_STATE_HPP_
#include <autoware_ad_api_specs/localization.hpp>
#include <autoware_ad_api_specs/operation_mode.hpp>
#include <autoware_ad_api_specs/routing.hpp>
#include <autoware_system_msgs/msg/autoware_state.hpp>
#include <std_srvs/srv/trigger.hpp>
#include <tier4_system_msgs/msg/mode_change_available.hpp>
#include <vector>
// This file should be included after messages.
#include "../utils/types.hpp"
namespace autoware::default_adapi
{
class AutowareStateNode : public rclcpp::Node
{
public:
explicit AutowareStateNode(const rclcpp::NodeOptions & options);
private:
using ModeChangeAvailable = tier4_system_msgs::msg::ModeChangeAvailable;
rclcpp::TimerBase::SharedPtr timer_;
// emergency
Sub<autoware_ad_api::localization::InitializationState> sub_localization_;
Sub<autoware_ad_api::routing::RouteState> sub_routing_;
Sub<autoware_ad_api::operation_mode::OperationModeState> sub_operation_mode_;
using AutowareState = autoware_system_msgs::msg::AutowareState;
using LocalizationState = autoware_ad_api::localization::InitializationState::Message;
using RoutingState = autoware_ad_api::routing::RouteState::Message;
using OperationModeState = autoware_ad_api::operation_mode::OperationModeState::Message;
using Trigger = std_srvs::srv::Trigger;
std::vector<bool> component_states_;
std::vector<rclcpp::Subscription<ModeChangeAvailable>::SharedPtr> sub_component_states_;
rclcpp::Publisher<AutowareState>::SharedPtr pub_autoware_state_;
rclcpp::Service<Trigger>::SharedPtr srv_autoware_shutdown_;
enum class LaunchState { Initializing, Running, Finalizing };
LaunchState launch_state_;
LocalizationState localization_state_;
RoutingState routing_state_;
OperationModeState operation_mode_state_;
void on_timer();
void on_localization(const LocalizationState::ConstSharedPtr msg);
void on_routing(const RoutingState::ConstSharedPtr msg);
void on_operation_mode(const OperationModeState::ConstSharedPtr msg);
void on_shutdown(const Trigger::Request::SharedPtr, const Trigger::Response::SharedPtr);
};
} // namespace autoware::default_adapi
#endif // COMPATIBILITY__AUTOWARE_STATE_HPP_
@@ -0,0 +1,81 @@
// Copyright 2024 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 "diagnostics.hpp"
#include <memory>
#include <unordered_map>
namespace autoware::default_adapi
{
DiagnosticsNode::DiagnosticsNode(const rclcpp::NodeOptions & options) : Node("diagnostics", options)
{
using std::placeholders::_1;
pub_struct_ = create_publisher<autoware_adapi_v1_msgs::msg::DiagGraphStruct>(
"/api/system/diagnostics/struct", rclcpp::QoS(1).transient_local());
pub_status_ = create_publisher<autoware_adapi_v1_msgs::msg::DiagGraphStatus>(
"/api/system/diagnostics/status", rclcpp::QoS(1).best_effort());
sub_graph_.register_create_callback(std::bind(&DiagnosticsNode::on_create, this, _1));
sub_graph_.register_update_callback(std::bind(&DiagnosticsNode::on_update, this, _1));
sub_graph_.subscribe(*this, 10);
}
void DiagnosticsNode::on_create(DiagGraph::ConstSharedPtr graph)
{
const auto & units = graph->units();
const auto & links = graph->links();
std::unordered_map<DiagUnit *, size_t> unit_indices_;
for (size_t i = 0; i < units.size(); ++i) {
unit_indices_[units[i]] = i;
}
autoware_adapi_v1_msgs::msg::DiagGraphStruct msg;
msg.stamp = graph->created_stamp();
msg.id = graph->id();
msg.nodes.reserve(units.size());
msg.links.reserve(links.size());
for (const auto & unit : units) {
msg.nodes.emplace_back();
msg.nodes.back().path = unit->path();
}
for (const auto & link : links) {
msg.links.emplace_back();
msg.links.back().parent = unit_indices_.at(link->parent());
msg.links.back().child = unit_indices_.at(link->child());
}
pub_struct_->publish(msg);
}
void DiagnosticsNode::on_update(DiagGraph::ConstSharedPtr graph)
{
const auto & units = graph->units();
autoware_adapi_v1_msgs::msg::DiagGraphStatus msg;
msg.stamp = graph->updated_stamp();
msg.id = graph->id();
msg.nodes.reserve(units.size());
for (const auto & unit : units) {
msg.nodes.emplace_back();
msg.nodes.back().level = unit->level();
}
pub_status_->publish(msg);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::DiagnosticsNode)
@@ -0,0 +1,46 @@
// Copyright 2024 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.
#ifndef DIAGNOSTICS_HPP_
#define DIAGNOSTICS_HPP_
#include "diagnostic_graph_utils/subscription.hpp"
#include <rclcpp/rclcpp.hpp>
#include <autoware_adapi_v1_msgs/msg/diag_graph_status.hpp>
#include <autoware_adapi_v1_msgs/msg/diag_graph_struct.hpp>
namespace autoware::default_adapi
{
class DiagnosticsNode : public rclcpp::Node
{
public:
explicit DiagnosticsNode(const rclcpp::NodeOptions & options);
private:
using DiagGraph = diagnostic_graph_utils::DiagGraph;
using DiagUnit = diagnostic_graph_utils::DiagUnit;
using DiagLink = diagnostic_graph_utils::DiagLink;
void on_create(DiagGraph::ConstSharedPtr graph);
void on_update(DiagGraph::ConstSharedPtr graph);
rclcpp::Publisher<autoware_adapi_v1_msgs::msg::DiagGraphStruct>::SharedPtr pub_struct_;
rclcpp::Publisher<autoware_adapi_v1_msgs::msg::DiagGraphStatus>::SharedPtr pub_status_;
diagnostic_graph_utils::DiagGraphSubscription sub_graph_;
};
} // namespace autoware::default_adapi
#endif // DIAGNOSTICS_HPP_
@@ -0,0 +1,41 @@
// 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 "fail_safe.hpp"
namespace autoware::default_adapi
{
FailSafeNode::FailSafeNode(const rclcpp::NodeOptions & options) : Node("fail_safe", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_pub(pub_mrm_state_);
adaptor.init_sub(sub_mrm_state_, this, &FailSafeNode::on_state);
prev_state_.state = MrmState::UNKNOWN;
}
void FailSafeNode::on_state(const MrmState::ConstSharedPtr msg)
{
prev_state_.stamp = msg->stamp;
if (prev_state_ != *msg) {
prev_state_ = *msg;
pub_mrm_state_->publish(*msg);
}
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::FailSafeNode)
@@ -0,0 +1,44 @@
// 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 FAIL_SAFE_HPP_
#define FAIL_SAFE_HPP_
#include <autoware/component_interface_specs/system.hpp>
#include <autoware_ad_api_specs/fail_safe.hpp>
#include <component_interface_utils/rclcpp.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class FailSafeNode : public rclcpp::Node
{
public:
explicit FailSafeNode(const rclcpp::NodeOptions & options);
private:
using MrmState = autoware_ad_api::fail_safe::MrmState::Message;
Pub<autoware_ad_api::fail_safe::MrmState> pub_mrm_state_;
Sub<autoware::component_interface_specs::system::MrmState> sub_mrm_state_;
MrmState prev_state_;
void on_state(const MrmState::ConstSharedPtr msg);
};
} // namespace autoware::default_adapi
#endif // FAIL_SAFE_HPP_
@@ -0,0 +1,42 @@
// Copyright 2024 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 "heartbeat.hpp"
#include <utility>
namespace autoware::default_adapi
{
HeartbeatNode::HeartbeatNode(const rclcpp::NodeOptions & options) : Node("heartbeat", options)
{
// Move this function so that the timer no longer holds it as a reference.
const auto on_timer = [this]() {
autoware_ad_api::system::Heartbeat::Message heartbeat;
heartbeat.stamp = now();
heartbeat.seq = ++sequence_; // Wraps at 65535.
pub_->publish(heartbeat);
};
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_pub(pub_);
const auto period = rclcpp::Rate(10.0).period();
timer_ = rclcpp::create_timer(this, get_clock(), period, std::move(on_timer));
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::HeartbeatNode)
@@ -0,0 +1,40 @@
// Copyright 2024 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.
#ifndef HEARTBEAT_HPP_
#define HEARTBEAT_HPP_
#include <autoware_ad_api_specs/system.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class HeartbeatNode : public rclcpp::Node
{
public:
explicit HeartbeatNode(const rclcpp::NodeOptions & options);
private:
rclcpp::TimerBase::SharedPtr timer_;
Pub<autoware_ad_api::system::Heartbeat> pub_;
uint16_t sequence_ = 0;
};
} // namespace autoware::default_adapi
#endif // HEARTBEAT_HPP_
@@ -0,0 +1,35 @@
// 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 "interface.hpp"
namespace autoware::default_adapi
{
InterfaceNode::InterfaceNode(const rclcpp::NodeOptions & options) : Node("interface", options)
{
const auto on_interface_version = [](auto, auto res) {
res->major = 1;
res->minor = 5;
res->patch = 0;
};
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_srv(srv_, on_interface_version);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::InterfaceNode)
@@ -0,0 +1,38 @@
// 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 INTERFACE_HPP_
#define INTERFACE_HPP_
#include <autoware_ad_api_specs/interface.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class InterfaceNode : public rclcpp::Node
{
public:
explicit InterfaceNode(const rclcpp::NodeOptions & options);
private:
Srv<autoware_ad_api::interface::Version> srv_;
};
} // namespace autoware::default_adapi
#endif // INTERFACE_HPP_
@@ -0,0 +1,42 @@
// 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 "localization.hpp"
#include "utils/localization_conversion.hpp"
namespace autoware::default_adapi
{
LocalizationNode::LocalizationNode(const rclcpp::NodeOptions & options)
: Node("localization", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.relay_message(pub_state_, sub_state_);
adaptor.init_cli(cli_initialize_);
adaptor.init_srv(srv_initialize_, this, &LocalizationNode::on_initialize, group_cli_);
}
void LocalizationNode::on_initialize(
const autoware_ad_api::localization::Initialize::Service::Request::SharedPtr req,
const autoware_ad_api::localization::Initialize::Service::Response::SharedPtr res)
{
res->status = localization_conversion::convert_call(cli_initialize_, req);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::LocalizationNode)
@@ -0,0 +1,47 @@
// 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 LOCALIZATION_HPP_
#define LOCALIZATION_HPP_
#include <autoware/component_interface_specs/localization.hpp>
#include <autoware_ad_api_specs/localization.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class LocalizationNode : public rclcpp::Node
{
public:
explicit LocalizationNode(const rclcpp::NodeOptions & options);
private:
rclcpp::CallbackGroup::SharedPtr group_cli_;
Srv<autoware_ad_api::localization::Initialize> srv_initialize_;
Pub<autoware_ad_api::localization::InitializationState> pub_state_;
Cli<autoware::component_interface_specs::localization::Initialize> cli_initialize_;
Sub<autoware::component_interface_specs::localization::InitializationState> sub_state_;
void on_initialize(
const autoware_ad_api::localization::Initialize::Service::Request::SharedPtr req,
const autoware_ad_api::localization::Initialize::Service::Response::SharedPtr res);
};
} // namespace autoware::default_adapi
#endif // LOCALIZATION_HPP_
@@ -0,0 +1,167 @@
// 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 "motion.hpp"
#include <memory>
#include <unordered_map>
namespace autoware::default_adapi
{
MotionNode::MotionNode(const rclcpp::NodeOptions & options)
: Node("motion", options), vehicle_stop_checker_(this)
{
stop_check_duration_ = declare_parameter<double>("stop_check_duration");
require_accept_start_ = declare_parameter<bool>("require_accept_start");
is_calling_set_pause_ = false;
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.init_srv(srv_accept_, this, &MotionNode::on_accept);
adaptor.init_pub(pub_state_);
adaptor.init_cli(cli_set_pause_, group_cli_);
adaptor.init_sub(sub_is_paused_, this, &MotionNode::on_is_paused);
adaptor.init_sub(sub_is_start_requested_, this, &MotionNode::on_is_start_requested);
rclcpp::Rate rate(10);
timer_ = rclcpp::create_timer(this, get_clock(), rate.period(), [this]() { on_timer(); });
state_ = State::Unknown;
}
void MotionNode::update_state()
{
if (!is_paused_ || !is_start_requested_) {
return;
}
const auto get_next_state = [this]() {
if (is_paused_.value()) {
if (!is_start_requested_.value()) {
return State::Paused;
} else {
return require_accept_start_ ? State::Starting : State::Resuming;
}
} else {
if (!vehicle_stop_checker_.isVehicleStopped(stop_check_duration_)) {
return State::Moving;
} else {
return is_start_requested_.value() ? State::Resumed : State::Pausing;
}
}
};
const auto next_state = get_next_state();
// Once the state becomes pausing, it must become a state where is_paused is true
if (state_ == State::Pausing) {
switch (next_state) {
case State::Paused:
case State::Starting:
case State::Resuming:
break;
case State::Moving:
case State::Pausing:
case State::Resumed:
case State::Unknown:
return;
}
}
// Prevents transition from starting to resuming
if (state_ == State::Resuming && next_state == State::Starting) {
return;
}
change_state(next_state);
}
void MotionNode::change_state(const State state)
{
using MotionState = autoware_ad_api::motion::State::Message;
static const auto mapping = std::unordered_map<State, MotionState::_state_type>(
{{State::Unknown, MotionState::UNKNOWN},
{State::Pausing, MotionState::STOPPED},
{State::Paused, MotionState::STOPPED},
{State::Starting, MotionState::STARTING},
{State::Resuming, MotionState::MOVING},
{State::Resumed, MotionState::MOVING},
{State::Moving, MotionState::MOVING}});
if (mapping.at(state_) != mapping.at(state)) {
MotionState msg;
msg.stamp = now();
msg.state = mapping.at(state);
pub_state_->publish(msg);
}
state_ = state;
update_pause(state);
}
void MotionNode::update_pause(const State state)
{
if (state == State::Pausing) {
return change_pause(true);
}
if (state == State::Resuming) {
return change_pause(false);
}
}
void MotionNode::change_pause(bool pause)
{
if (!is_calling_set_pause_ && cli_set_pause_->service_is_ready()) {
const auto req =
std::make_shared<autoware::component_interface_specs::control::SetPause::Service::Request>();
req->pause = pause;
is_calling_set_pause_ = true;
cli_set_pause_->async_send_request(req, [this](auto) { is_calling_set_pause_ = false; });
}
}
void MotionNode::on_timer()
{
update_state();
}
void MotionNode::on_is_paused(
const autoware::component_interface_specs::control::IsPaused::Message::ConstSharedPtr msg)
{
is_paused_ = msg->data;
update_state();
}
void MotionNode::on_is_start_requested(
const autoware::component_interface_specs::control::IsStartRequested::Message::ConstSharedPtr msg)
{
is_start_requested_ = msg->data;
update_state();
}
void MotionNode::on_accept(
const autoware_ad_api::motion::AcceptStart::Service::Request::SharedPtr,
const autoware_ad_api::motion::AcceptStart::Service::Response::SharedPtr res)
{
if (state_ != State::Starting) {
using AcceptStartResponse = autoware_ad_api::motion::AcceptStart::Service::Response;
throw component_interface_utils::ServiceException(
AcceptStartResponse::ERROR_NOT_STARTING, "The motion state is not starting");
}
change_state(State::Resuming);
res->status.success = true;
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::MotionNode)
@@ -0,0 +1,72 @@
// 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 MOTION_HPP_
#define MOTION_HPP_
#include <autoware/component_interface_specs/control.hpp>
#include <autoware/motion_utils/vehicle/vehicle_state_checker.hpp>
#include <autoware_ad_api_specs/motion.hpp>
#include <component_interface_utils/rclcpp.hpp>
#include <component_interface_utils/status.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class MotionNode : public rclcpp::Node
{
public:
explicit MotionNode(const rclcpp::NodeOptions & options);
private:
autoware::motion_utils::VehicleStopChecker vehicle_stop_checker_;
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::CallbackGroup::SharedPtr group_cli_;
Srv<autoware_ad_api::motion::AcceptStart> srv_accept_;
Pub<autoware_ad_api::motion::State> pub_state_;
Cli<autoware::component_interface_specs::control::SetPause> cli_set_pause_;
Sub<autoware::component_interface_specs::control::IsPaused> sub_is_paused_;
Sub<autoware::component_interface_specs::control::IsStartRequested> sub_is_start_requested_;
enum class State { Unknown, Pausing, Paused, Starting, Resuming, Resumed, Moving };
State state_;
std::optional<bool> is_paused_;
std::optional<bool> is_start_requested_;
double stop_check_duration_;
bool require_accept_start_;
bool is_calling_set_pause_;
void update_state();
void change_state(const State state);
void update_pause(const State state);
void change_pause(bool pause);
void on_timer();
void on_is_paused(
const autoware::component_interface_specs::control::IsPaused::Message::ConstSharedPtr msg);
void on_is_start_requested(
const autoware::component_interface_specs::control::IsStartRequested::Message::ConstSharedPtr
msg);
void on_accept(
const autoware_ad_api::motion::AcceptStart::Service::Request::SharedPtr req,
const autoware_ad_api::motion::AcceptStart::Service::Response::SharedPtr res);
};
} // namespace autoware::default_adapi
#endif // MOTION_HPP_
@@ -0,0 +1,163 @@
// 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 "operation_mode.hpp"
#include <memory>
#include <string>
#include <vector>
namespace autoware::default_adapi
{
using ServiceResponse = autoware_adapi_v1_msgs::srv::ChangeOperationMode::Response;
OperationModeNode::OperationModeNode(const rclcpp::NodeOptions & options)
: Node("operation_mode", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.init_sub(sub_state_, this, &OperationModeNode::on_state);
adaptor.init_pub(pub_state_);
adaptor.init_srv(srv_stop_mode_, this, &OperationModeNode::on_change_to_stop);
adaptor.init_srv(srv_autonomous_mode_, this, &OperationModeNode::on_change_to_autonomous);
adaptor.init_srv(srv_local_mode_, this, &OperationModeNode::on_change_to_local);
adaptor.init_srv(srv_remote_mode_, this, &OperationModeNode::on_change_to_remote);
adaptor.init_srv(srv_enable_control_, this, &OperationModeNode::on_enable_autoware_control);
adaptor.init_srv(srv_disable_control_, this, &OperationModeNode::on_disable_autoware_control);
adaptor.init_cli(cli_mode_, group_cli_);
adaptor.init_cli(cli_control_, group_cli_);
const auto name = "/system/operation_mode/availability";
const auto qos = rclcpp::QoS(1);
const auto callback = [this](const OperationModeAvailability::ConstSharedPtr msg) {
mode_available_[OperationModeState::Message::STOP] = msg->stop;
mode_available_[OperationModeState::Message::AUTONOMOUS] = msg->autonomous;
mode_available_[OperationModeState::Message::LOCAL] = msg->local;
mode_available_[OperationModeState::Message::REMOTE] = msg->remote;
};
sub_availability_ = create_subscription<OperationModeAvailability>(name, qos, callback);
timer_ = rclcpp::create_timer(
this, get_clock(), rclcpp::Rate(5.0).period(), std::bind(&OperationModeNode::on_timer, this));
curr_state_.mode = OperationModeState::Message::UNKNOWN;
prev_state_.mode = OperationModeState::Message::UNKNOWN;
mode_available_[OperationModeState::Message::UNKNOWN] = false;
mode_available_[OperationModeState::Message::STOP] = true;
mode_available_[OperationModeState::Message::AUTONOMOUS] = false;
mode_available_[OperationModeState::Message::LOCAL] = false;
mode_available_[OperationModeState::Message::REMOTE] = false;
}
template <class ResponseT>
void OperationModeNode::change_mode(
const ResponseT res, const OperationModeRequest::_mode_type mode)
{
if (!mode_available_[mode]) {
RCLCPP_WARN(
get_logger(),
"The target mode is not available. Please check the cause with "
"rqt_diagnostics_graph_monitor");
throw component_interface_utils::ServiceException(
ServiceResponse::ERROR_NOT_AVAILABLE,
"The target mode is not available. Please check the diagnostics.");
}
const auto req = std::make_shared<OperationModeRequest>();
req->mode = mode;
component_interface_utils::status::copy(cli_mode_->call(req), res); // NOLINT
}
void OperationModeNode::on_change_to_stop(
const ChangeToStop::Service::Request::SharedPtr,
const ChangeToStop::Service::Response::SharedPtr res)
{
change_mode(res, OperationModeRequest::STOP);
}
void OperationModeNode::on_change_to_autonomous(
const ChangeToAutonomous::Service::Request::SharedPtr,
const ChangeToAutonomous::Service::Response::SharedPtr res)
{
change_mode(res, OperationModeRequest::AUTONOMOUS);
}
void OperationModeNode::on_change_to_local(
const ChangeToLocal::Service::Request::SharedPtr,
const ChangeToLocal::Service::Response::SharedPtr res)
{
change_mode(res, OperationModeRequest::LOCAL);
}
void OperationModeNode::on_change_to_remote(
const ChangeToRemote::Service::Request::SharedPtr,
const ChangeToRemote::Service::Response::SharedPtr res)
{
change_mode(res, OperationModeRequest::REMOTE);
}
void OperationModeNode::on_enable_autoware_control(
const EnableAutowareControl::Service::Request::SharedPtr,
const EnableAutowareControl::Service::Response::SharedPtr res)
{
if (!mode_available_[curr_state_.mode]) {
throw component_interface_utils::ServiceException(
ServiceResponse::ERROR_NOT_AVAILABLE, "The mode change is blocked by the system.");
}
const auto req = std::make_shared<AutowareControlRequest>();
req->autoware_control = true;
component_interface_utils::status::copy(cli_control_->call(req), res); // NOLINT
}
void OperationModeNode::on_disable_autoware_control(
const DisableAutowareControl::Service::Request::SharedPtr,
const DisableAutowareControl::Service::Response::SharedPtr res)
{
const auto req = std::make_shared<AutowareControlRequest>();
req->autoware_control = false;
component_interface_utils::status::copy(cli_control_->call(req), res); // NOLINT
}
void OperationModeNode::on_state(const OperationModeState::Message::ConstSharedPtr msg)
{
curr_state_ = *msg;
update_state();
}
void OperationModeNode::on_timer()
{
update_state();
}
void OperationModeNode::update_state()
{
// Clear stamp to compare other fields.
OperationModeState::Message state = curr_state_;
state.stamp = builtin_interfaces::msg::Time();
state.is_stop_mode_available &= mode_available_[OperationModeState::Message::STOP];
state.is_autonomous_mode_available &= mode_available_[OperationModeState::Message::AUTONOMOUS];
state.is_local_mode_available &= mode_available_[OperationModeState::Message::LOCAL];
state.is_remote_mode_available &= mode_available_[OperationModeState::Message::REMOTE];
if (prev_state_ != state) {
prev_state_ = state;
state.stamp = now();
pub_state_->publish(state);
}
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::OperationModeNode)
@@ -0,0 +1,101 @@
// 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 OPERATION_MODE_HPP_
#define OPERATION_MODE_HPP_
#include <autoware/component_interface_specs/system.hpp>
#include <autoware_ad_api_specs/operation_mode.hpp>
#include <component_interface_utils/status.hpp>
#include <rclcpp/rclcpp.hpp>
#include <string>
#include <unordered_map>
#include <vector>
// TODO(Takagi, Isamu): define interface
#include <tier4_system_msgs/msg/operation_mode_availability.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class OperationModeNode : public rclcpp::Node
{
public:
explicit OperationModeNode(const rclcpp::NodeOptions & options);
private:
using OperationModeState = autoware_ad_api::operation_mode::OperationModeState;
using EnableAutowareControl = autoware_ad_api::operation_mode::EnableAutowareControl;
using DisableAutowareControl = autoware_ad_api::operation_mode::DisableAutowareControl;
using ChangeToStop = autoware_ad_api::operation_mode::ChangeToStop;
using ChangeToAutonomous = autoware_ad_api::operation_mode::ChangeToAutonomous;
using ChangeToLocal = autoware_ad_api::operation_mode::ChangeToLocal;
using ChangeToRemote = autoware_ad_api::operation_mode::ChangeToRemote;
using OperationModeRequest =
autoware::component_interface_specs::system::ChangeOperationMode::Service::Request;
using AutowareControlRequest =
autoware::component_interface_specs::system::ChangeAutowareControl::Service::Request;
using OperationModeAvailability = tier4_system_msgs::msg::OperationModeAvailability;
OperationModeState::Message curr_state_;
OperationModeState::Message prev_state_;
std::unordered_map<OperationModeState::Message::_mode_type, bool> mode_available_;
rclcpp::CallbackGroup::SharedPtr group_cli_;
rclcpp::TimerBase::SharedPtr timer_;
Pub<autoware_ad_api::operation_mode::OperationModeState> pub_state_;
Srv<autoware_ad_api::operation_mode::ChangeToStop> srv_stop_mode_;
Srv<autoware_ad_api::operation_mode::ChangeToAutonomous> srv_autonomous_mode_;
Srv<autoware_ad_api::operation_mode::ChangeToLocal> srv_local_mode_;
Srv<autoware_ad_api::operation_mode::ChangeToRemote> srv_remote_mode_;
Srv<autoware_ad_api::operation_mode::EnableAutowareControl> srv_enable_control_;
Srv<autoware_ad_api::operation_mode::DisableAutowareControl> srv_disable_control_;
Sub<autoware::component_interface_specs::system::OperationModeState> sub_state_;
Cli<autoware::component_interface_specs::system::ChangeOperationMode> cli_mode_;
Cli<autoware::component_interface_specs::system::ChangeAutowareControl> cli_control_;
rclcpp::Subscription<OperationModeAvailability>::SharedPtr sub_availability_;
void on_change_to_stop(
const ChangeToStop::Service::Request::SharedPtr req,
const ChangeToStop::Service::Response::SharedPtr res);
void on_change_to_autonomous(
const ChangeToAutonomous::Service::Request::SharedPtr req,
const ChangeToAutonomous::Service::Response::SharedPtr res);
void on_change_to_local(
const ChangeToLocal::Service::Request::SharedPtr req,
const ChangeToLocal::Service::Response::SharedPtr res);
void on_change_to_remote(
const ChangeToRemote::Service::Request::SharedPtr req,
const ChangeToRemote::Service::Response::SharedPtr res);
void on_enable_autoware_control(
const EnableAutowareControl::Service::Request::SharedPtr req,
const EnableAutowareControl::Service::Response::SharedPtr res);
void on_disable_autoware_control(
const DisableAutowareControl::Service::Request::SharedPtr req,
const DisableAutowareControl::Service::Response::SharedPtr res);
void on_state(const OperationModeState::Message::ConstSharedPtr msg);
void on_timer();
void update_state();
template <class ResponseT>
void change_mode(const ResponseT res, const OperationModeRequest::_mode_type mode);
};
} // namespace autoware::default_adapi
#endif // OPERATION_MODE_HPP_
@@ -0,0 +1,94 @@
// 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 "perception.hpp"
#include <vector>
namespace autoware::default_adapi
{
using DynamicObjectArray = autoware_ad_api::perception::DynamicObjectArray;
using ObjectClassification = autoware_adapi_v1_msgs::msg::ObjectClassification;
using DynamicObject = autoware_adapi_v1_msgs::msg::DynamicObject;
using DynamicObjectPath = autoware_adapi_v1_msgs::msg::DynamicObjectPath;
using API_Shape = shape_msgs::msg::SolidPrimitive;
using Shape = autoware_perception_msgs::msg::Shape;
std::unordered_map<uint8_t, uint8_t> shape_type_ = {
{Shape::BOUNDING_BOX, API_Shape::BOX},
{Shape::CYLINDER, API_Shape::CYLINDER},
{Shape::POLYGON, API_Shape::PRISM},
};
PerceptionNode::PerceptionNode(const rclcpp::NodeOptions & options) : Node("perception", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_pub(pub_object_recognized_);
adaptor.init_sub(sub_object_recognized_, this, &PerceptionNode::object_recognize);
}
uint8_t PerceptionNode::mapping(
std::unordered_map<uint8_t, uint8_t> hash_map, uint8_t input, uint8_t default_value)
{
if (hash_map.find(input) == hash_map.end()) {
return default_value;
} else {
return hash_map[input];
}
}
void PerceptionNode::object_recognize(
const autoware::component_interface_specs::perception::ObjectRecognition::Message::ConstSharedPtr
msg)
{
DynamicObjectArray::Message objects;
objects.header = msg->header;
for (const auto & msg_object : msg->objects) {
DynamicObject object;
object.id = msg_object.object_id;
object.existence_probability = msg_object.existence_probability;
for (const auto & msg_classification : msg_object.classification) {
ObjectClassification classification;
classification.label = msg_classification.label;
classification.probability = msg_classification.probability;
object.classification.insert(object.classification.begin(), classification);
}
object.kinematics.pose = msg_object.kinematics.initial_pose_with_covariance.pose;
object.kinematics.twist = msg_object.kinematics.initial_twist_with_covariance.twist;
object.kinematics.accel = msg_object.kinematics.initial_acceleration_with_covariance.accel;
for (const auto & msg_predicted_path : msg_object.kinematics.predicted_paths) {
DynamicObjectPath predicted_path;
for (const auto & msg_path : msg_predicted_path.path) {
predicted_path.path.insert(predicted_path.path.begin(), msg_path);
}
predicted_path.time_step = msg_predicted_path.time_step;
predicted_path.confidence = msg_predicted_path.confidence;
object.kinematics.predicted_paths.insert(
object.kinematics.predicted_paths.begin(), predicted_path);
}
object.shape.type = mapping(shape_type_, msg_object.shape.type, API_Shape::PRISM);
object.shape.dimensions = {
msg_object.shape.dimensions.x, msg_object.shape.dimensions.y, msg_object.shape.dimensions.z};
object.shape.polygon = msg_object.shape.footprint;
objects.objects.insert(objects.objects.begin(), object);
}
pub_object_recognized_->publish(objects);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::PerceptionNode)
@@ -0,0 +1,53 @@
// 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 PERCEPTION_HPP_
#define PERCEPTION_HPP_
#include <autoware/component_interface_specs/perception.hpp>
#include <autoware_ad_api_specs/perception.hpp>
#include <rclcpp/rclcpp.hpp>
#include <autoware_adapi_v1_msgs/msg/dynamic_object.hpp>
#include <autoware_adapi_v1_msgs/msg/dynamic_object_path.hpp>
#include <autoware_adapi_v1_msgs/msg/object_classification.hpp>
#include <autoware_perception_msgs/msg/shape.hpp>
#include <shape_msgs/msg/solid_primitive.hpp>
#include <unordered_map>
#include <vector>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class PerceptionNode : public rclcpp::Node
{
public:
explicit PerceptionNode(const rclcpp::NodeOptions & options);
private:
Pub<autoware_ad_api::perception::DynamicObjectArray> pub_object_recognized_;
Sub<autoware::component_interface_specs::perception::ObjectRecognition> sub_object_recognized_;
void object_recognize(const autoware::component_interface_specs::perception::ObjectRecognition::
Message::ConstSharedPtr msg);
uint8_t mapping(
std::unordered_map<uint8_t, uint8_t> hash_map, uint8_t input, uint8_t default_value);
};
} // namespace autoware::default_adapi
#endif // PERCEPTION_HPP_
@@ -0,0 +1,161 @@
// 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 "planning.hpp"
#include <autoware/motion_utils/trajectory/trajectory.hpp>
#include <autoware_adapi_v1_msgs/msg/planning_behavior.hpp>
#include <memory>
#include <string>
#include <vector>
namespace autoware::default_adapi
{
template <class T>
void concat(std::vector<T> & v1, const std::vector<T> & v2)
{
v1.insert(v1.end(), v2.begin(), v2.end());
}
template <class T>
std::vector<typename rclcpp::Subscription<T>::SharedPtr> init_factors(
rclcpp::Node * node, std::vector<typename T::ConstSharedPtr> & factors,
const std::vector<std::string> & topics)
{
const auto callback = [&factors](const int index) {
return [&factors, index](const typename T::ConstSharedPtr msg) { factors[index] = msg; };
};
std::vector<typename rclcpp::Subscription<T>::SharedPtr> subs;
for (size_t index = 0; index < topics.size(); ++index) {
subs.push_back(node->create_subscription<T>(topics[index], rclcpp::QoS(1), callback(index)));
}
factors.resize(topics.size());
return subs;
}
template <class T>
T merge_factors(const rclcpp::Time stamp, const std::vector<typename T::ConstSharedPtr> & factors)
{
T message;
message.header.stamp = stamp;
message.header.frame_id = "map";
for (const auto & factor : factors) {
if (factor) {
concat(message.factors, factor->factors);
}
}
return message;
}
PlanningNode::PlanningNode(const rclcpp::NodeOptions & options) : Node("planning", options)
{
// TODO(Takagi, Isamu): remove default value
stop_distance_ = declare_parameter<double>("stop_distance", 1.0);
stop_duration_ = declare_parameter<double>("stop_duration", 1.0);
stop_checker_ = std::make_unique<VehicleStopChecker>(this, stop_duration_ + 1.0);
std::vector<std::string> 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/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"};
std::vector<std::string> steering_factor_topics = {
"/planning/steering_factor/avoidance", "/planning/steering_factor/intersection",
"/planning/steering_factor/lane_change", "/planning/steering_factor/start_planner",
"/planning/steering_factor/goal_planner"};
sub_velocity_factors_ =
init_factors<VelocityFactorArray>(this, velocity_factors_, velocity_factor_topics);
sub_steering_factors_ =
init_factors<SteeringFactorArray>(this, steering_factors_, steering_factor_topics);
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_pub(pub_velocity_factors_);
adaptor.init_pub(pub_steering_factors_);
adaptor.init_sub(sub_kinematic_state_, this, &PlanningNode::on_kinematic_state);
adaptor.init_sub(sub_trajectory_, this, &PlanningNode::on_trajectory);
const auto rate = rclcpp::Rate(5);
timer_ = rclcpp::create_timer(this, get_clock(), rate.period(), [this]() { on_timer(); });
}
void PlanningNode::on_trajectory(const Trajectory::ConstSharedPtr msg)
{
trajectory_ = msg;
}
void PlanningNode::on_kinematic_state(const KinematicState::ConstSharedPtr msg)
{
kinematic_state_ = msg;
geometry_msgs::msg::TwistStamped twist;
twist.header = msg->header;
twist.twist = msg->twist.twist;
stop_checker_->addTwist(twist);
}
void PlanningNode::on_timer()
{
using autoware_adapi_v1_msgs::msg::VelocityFactor;
auto velocity = merge_factors<VelocityFactorArray>(now(), velocity_factors_);
auto steering = merge_factors<SteeringFactorArray>(now(), steering_factors_);
// Set the distance if it is nan.
if (trajectory_ && kinematic_state_) {
for (auto & factor : velocity.factors) {
if (std::isnan(factor.distance)) {
const auto & curr_point = kinematic_state_->pose.pose.position;
const auto & stop_point = factor.pose.position;
const auto & points = trajectory_->points;
factor.distance =
autoware::motion_utils::calcSignedArcLength(points, curr_point, stop_point);
}
}
}
// Set the status if it is unknown.
const auto is_vehicle_stopped = stop_checker_->isVehicleStopped(stop_duration_);
for (auto & factor : velocity.factors) {
if ((factor.status == VelocityFactor::UNKNOWN) && (!std::isnan(factor.distance))) {
const auto is_stopped = is_vehicle_stopped && (factor.distance < stop_distance_);
factor.status = is_stopped ? VelocityFactor::STOPPED : VelocityFactor::APPROACHING;
}
}
pub_velocity_factors_->publish(velocity);
pub_steering_factors_->publish(steering);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::PlanningNode)
@@ -0,0 +1,67 @@
// 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 PLANNING_HPP_
#define PLANNING_HPP_
#include <autoware/component_interface_specs/localization.hpp>
#include <autoware/component_interface_specs/planning.hpp>
#include <autoware/motion_utils/vehicle/vehicle_state_checker.hpp>
#include <autoware_ad_api_specs/planning.hpp>
#include <rclcpp/rclcpp.hpp>
#include <memory>
#include <vector>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
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<autoware_ad_api::planning::VelocityFactors> pub_velocity_factors_;
Pub<autoware_ad_api::planning::SteeringFactors> pub_steering_factors_;
Sub<autoware::component_interface_specs::planning::Trajectory> sub_trajectory_;
Sub<autoware::component_interface_specs::localization::KinematicState> sub_kinematic_state_;
std::vector<rclcpp::Subscription<VelocityFactorArray>::SharedPtr> sub_velocity_factors_;
std::vector<rclcpp::Subscription<SteeringFactorArray>::SharedPtr> sub_steering_factors_;
std::vector<VelocityFactorArray::ConstSharedPtr> velocity_factors_;
std::vector<SteeringFactorArray::ConstSharedPtr> steering_factors_;
rclcpp::TimerBase::SharedPtr timer_;
using VehicleStopChecker = autoware::motion_utils::VehicleStopCheckerBase;
using Trajectory = autoware::component_interface_specs::planning::Trajectory::Message;
using KinematicState = autoware::component_interface_specs::localization::KinematicState::Message;
void on_trajectory(const Trajectory::ConstSharedPtr msg);
void on_kinematic_state(const KinematicState::ConstSharedPtr msg);
void on_timer();
double stop_distance_;
double stop_duration_;
std::unique_ptr<VehicleStopChecker> stop_checker_;
Trajectory::ConstSharedPtr trajectory_;
KinematicState::ConstSharedPtr kinematic_state_;
};
} // namespace autoware::default_adapi
#endif // PLANNING_HPP_
@@ -0,0 +1,173 @@
// 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 "routing.hpp"
#include "utils/route_conversion.hpp"
#include <memory>
namespace
{
using autoware_adapi_v1_msgs::msg::ResponseStatus;
template <class InterfaceT>
ResponseStatus route_already_set()
{
ResponseStatus status;
status.success = false;
status.code = InterfaceT::Service::Response::ERROR_INVALID_STATE;
status.message = "The route is already set.";
return status;
}
template <class InterfaceT>
ResponseStatus route_is_not_set()
{
ResponseStatus status;
status.success = false;
status.code = InterfaceT::Service::Response::ERROR_INVALID_STATE;
status.message = "The route is not set yet.";
return status;
}
} // namespace
namespace autoware::default_adapi
{
RoutingNode::RoutingNode(const rclcpp::NodeOptions & options) : Node("routing", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.init_pub(pub_state_);
adaptor.init_pub(pub_route_);
adaptor.init_sub(sub_state_, this, &RoutingNode::on_state);
adaptor.init_sub(sub_route_, this, &RoutingNode::on_route);
adaptor.init_cli(cli_clear_route_, group_cli_);
adaptor.init_cli(cli_set_waypoint_route_, group_cli_);
adaptor.init_cli(cli_set_lanelet_route_, group_cli_);
adaptor.init_srv(srv_clear_route_, this, &RoutingNode::on_clear_route);
adaptor.init_srv(srv_set_route_, this, &RoutingNode::on_set_route);
adaptor.init_srv(srv_set_route_points_, this, &RoutingNode::on_set_route_points);
adaptor.init_srv(srv_change_route_, this, &RoutingNode::on_change_route);
adaptor.init_srv(srv_change_route_points_, this, &RoutingNode::on_change_route_points);
adaptor.init_cli(cli_operation_mode_, group_cli_);
adaptor.init_sub(sub_operation_mode_, this, &RoutingNode::on_operation_mode);
is_auto_mode_ = false;
state_.state = State::Message::UNKNOWN;
}
void RoutingNode::change_stop_mode()
{
using OperationModeRequest =
autoware::component_interface_specs::system::ChangeOperationMode::Service::Request;
if (is_auto_mode_) {
const auto req = std::make_shared<OperationModeRequest>();
req->mode = OperationModeRequest::STOP;
cli_operation_mode_->async_send_request(req);
}
}
void RoutingNode::on_operation_mode(const OperationModeState::Message::ConstSharedPtr msg)
{
is_auto_mode_ = msg->mode == OperationModeState::Message::AUTONOMOUS;
}
void RoutingNode::on_state(const State::Message::ConstSharedPtr msg)
{
// TODO(Takagi, Isamu): Add adapi initializing state.
// Represent initializing state by not publishing the topic for now.
if (msg->state == State::Message::INITIALIZING) {
return;
}
state_ = *msg;
pub_state_->publish(conversion::convert_state(*msg));
// Change operation mode to stop when the vehicle arrives.
if (msg->state == State::Message::ARRIVED) {
change_stop_mode();
}
// TODO(Takagi, Isamu): Remove when the mission planner supports an empty route.
if (msg->state == State::Message::UNSET) {
pub_route_->publish(conversion::create_empty_route(msg->stamp));
}
}
void RoutingNode::on_route(const Route::Message::ConstSharedPtr msg)
{
pub_route_->publish(conversion::convert_route(*msg));
}
void RoutingNode::on_clear_route(
const autoware_ad_api::routing::ClearRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::ClearRoute::Service::Response::SharedPtr res)
{
change_stop_mode();
res->status = conversion::convert_call(cli_clear_route_, req);
}
void RoutingNode::on_set_route_points(
const autoware_ad_api::routing::SetRoutePoints::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoutePoints::Service::Response::SharedPtr res)
{
if (state_.state != State::Message::UNSET) {
res->status = route_already_set<autoware_ad_api::routing::SetRoutePoints>();
return;
}
res->status = conversion::convert_call(cli_set_waypoint_route_, req);
}
void RoutingNode::on_set_route(
const autoware_ad_api::routing::SetRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoute::Service::Response::SharedPtr res)
{
if (state_.state != State::Message::UNSET) {
res->status = route_already_set<autoware_ad_api::routing::SetRoute>();
return;
}
res->status = conversion::convert_call(cli_set_lanelet_route_, req);
}
void RoutingNode::on_change_route_points(
const autoware_ad_api::routing::SetRoutePoints::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoutePoints::Service::Response::SharedPtr res)
{
if (state_.state != State::Message::SET) {
res->status = route_is_not_set<autoware_ad_api::routing::SetRoutePoints>();
return;
}
res->status = conversion::convert_call(cli_set_waypoint_route_, req);
}
void RoutingNode::on_change_route(
const autoware_ad_api::routing::SetRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoute::Service::Response::SharedPtr res)
{
if (state_.state != State::Message::SET) {
res->status = route_is_not_set<autoware_ad_api::routing::SetRoute>();
return;
}
res->status = conversion::convert_call(cli_set_lanelet_route_, req);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::RoutingNode)
@@ -0,0 +1,81 @@
// 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 ROUTING_HPP_
#define ROUTING_HPP_
#include <autoware/component_interface_specs/planning.hpp>
#include <autoware/component_interface_specs/system.hpp>
#include <autoware_ad_api_specs/routing.hpp>
#include <component_interface_utils/status.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class RoutingNode : public rclcpp::Node
{
public:
explicit RoutingNode(const rclcpp::NodeOptions & options);
private:
using OperationModeState = autoware::component_interface_specs::system::OperationModeState;
using State = autoware::component_interface_specs::planning::RouteState;
using Route = autoware::component_interface_specs::planning::LaneletRoute;
rclcpp::CallbackGroup::SharedPtr group_cli_;
Pub<autoware_ad_api::routing::RouteState> pub_state_;
Pub<autoware_ad_api::routing::Route> pub_route_;
Srv<autoware_ad_api::routing::SetRoutePoints> srv_set_route_points_;
Srv<autoware_ad_api::routing::SetRoute> srv_set_route_;
Srv<autoware_ad_api::routing::ChangeRoutePoints> srv_change_route_points_;
Srv<autoware_ad_api::routing::ChangeRoute> srv_change_route_;
Srv<autoware_ad_api::routing::ClearRoute> srv_clear_route_;
Sub<autoware::component_interface_specs::planning::RouteState> sub_state_;
Sub<autoware::component_interface_specs::planning::LaneletRoute> sub_route_;
Cli<autoware::component_interface_specs::planning::SetWaypointRoute> cli_set_waypoint_route_;
Cli<autoware::component_interface_specs::planning::SetLaneletRoute> cli_set_lanelet_route_;
Cli<autoware::component_interface_specs::planning::ClearRoute> cli_clear_route_;
Cli<autoware::component_interface_specs::system::ChangeOperationMode> cli_operation_mode_;
Sub<autoware::component_interface_specs::system::OperationModeState> sub_operation_mode_;
bool is_auto_mode_;
State::Message state_;
void change_stop_mode();
void on_operation_mode(const OperationModeState::Message::ConstSharedPtr msg);
void on_state(const State::Message::ConstSharedPtr msg);
void on_route(const Route::Message::ConstSharedPtr msg);
void on_clear_route(
const autoware_ad_api::routing::ClearRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::ClearRoute::Service::Response::SharedPtr res);
void on_set_route_points(
const autoware_ad_api::routing::SetRoutePoints::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoutePoints::Service::Response::SharedPtr res);
void on_set_route(
const autoware_ad_api::routing::SetRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoute::Service::Response::SharedPtr res);
void on_change_route_points(
const autoware_ad_api::routing::SetRoutePoints::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoutePoints::Service::Response::SharedPtr res);
void on_change_route(
const autoware_ad_api::routing::SetRoute::Service::Request::SharedPtr req,
const autoware_ad_api::routing::SetRoute::Service::Response::SharedPtr res);
};
} // namespace autoware::default_adapi
#endif // ROUTING_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.
#include "localization_conversion.hpp"
#include <memory>
namespace autoware::default_adapi::localization_conversion
{
InternalInitializeRequest convert_request(const ExternalInitializeRequest & external)
{
auto internal = std::make_shared<InternalInitializeRequest::element_type>();
internal->pose_with_covariance = external->pose;
internal->method = tier4_localization_msgs::srv::InitializeLocalization::Request::AUTO;
return internal;
}
ExternalResponse convert_response(const InternalResponse & internal)
{
// TODO(Takagi, Isamu): check error code correspondence
ExternalResponse external;
external.success = internal.success;
external.code = internal.code;
external.message = internal.message;
return external;
}
} // namespace autoware::default_adapi::localization_conversion
@@ -0,0 +1,44 @@
// 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 UTILS__LOCALIZATION_CONVERSION_HPP_
#define UTILS__LOCALIZATION_CONVERSION_HPP_
#include <rclcpp/rclcpp.hpp>
#include <autoware_adapi_v1_msgs/srv/initialize_localization.hpp>
#include <tier4_localization_msgs/srv/initialize_localization.hpp>
namespace autoware::default_adapi::localization_conversion
{
using ExternalInitializeRequest =
autoware_adapi_v1_msgs::srv::InitializeLocalization::Request::SharedPtr;
using InternalInitializeRequest =
tier4_localization_msgs::srv::InitializeLocalization::Request::SharedPtr;
InternalInitializeRequest convert_request(const ExternalInitializeRequest & external);
using ExternalResponse = autoware_adapi_v1_msgs::msg::ResponseStatus;
using InternalResponse = autoware_common_msgs::msg::ResponseStatus;
ExternalResponse convert_response(const InternalResponse & internal);
template <class ClientT, class RequestT>
ExternalResponse convert_call(ClientT & client, RequestT & req)
{
return convert_response(client->call(convert_request(req))->status);
}
} // namespace autoware::default_adapi::localization_conversion
#endif // UTILS__LOCALIZATION_CONVERSION_HPP_
@@ -0,0 +1,173 @@
// 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 "route_conversion.hpp"
#include <memory>
#include <vector>
namespace
{
using autoware_adapi_v1_msgs::msg::RoutePrimitive;
using autoware_adapi_v1_msgs::msg::RouteSegment;
using autoware_planning_msgs::msg::LaneletPrimitive;
using autoware_planning_msgs::msg::LaneletSegment;
template <class RetT, class ArgT>
RetT convert(const ArgT & arg);
template <class RetT, class ArgT>
std::vector<RetT> convert_vector(const std::vector<ArgT> & args)
{
std::vector<RetT> result;
result.reserve(args.size());
for (const auto & arg : args) {
result.push_back(convert<RetT, ArgT>(arg));
}
return result;
}
template <>
RoutePrimitive convert(const LaneletPrimitive & in)
{
RoutePrimitive api;
api.id = in.id;
api.type = in.primitive_type;
return api;
}
template <>
LaneletPrimitive convert(const RoutePrimitive & in)
{
LaneletPrimitive out;
out.id = in.id;
out.primitive_type = in.type;
return out;
}
template <>
RouteSegment convert(const LaneletSegment & in)
{
RouteSegment api;
api.alternatives = convert_vector<RoutePrimitive>(in.primitives);
for (auto iter = api.alternatives.begin(); iter != api.alternatives.end(); ++iter) {
if (iter->id == in.preferred_primitive.id) {
api.preferred = *iter;
api.alternatives.erase(iter);
break;
}
}
return api;
}
template <>
LaneletSegment convert(const RouteSegment & in)
{
LaneletSegment out;
out.preferred_primitive = convert<LaneletPrimitive>(in.preferred);
out.primitives.push_back(out.preferred_primitive);
for (const auto & primitive : in.alternatives) {
out.primitives.push_back(convert<LaneletPrimitive>(primitive));
}
return out;
}
} // namespace
namespace autoware::default_adapi::conversion
{
ExternalRoute create_empty_route(const rclcpp::Time & stamp)
{
ExternalRoute external;
external.header.stamp = stamp;
return external;
}
ExternalRoute convert_route(const InternalRoute & internal)
{
autoware_adapi_v1_msgs::msg::RouteData data;
data.start = internal.start_pose;
data.goal = internal.goal_pose;
data.segments = convert_vector<RouteSegment>(internal.segments);
ExternalRoute external;
external.header = internal.header;
external.data.push_back(data);
return external;
}
ExternalState convert_state(const InternalState & internal)
{
// clang-format off
const auto convert = [](InternalState::_state_type state) {
switch(state) {
// TODO(Takagi, Isamu): Add adapi state.
case InternalState::INITIALIZING: return ExternalState::UNSET;
case InternalState::UNSET: return ExternalState::UNSET;
case InternalState::ROUTING: return ExternalState::UNSET;
case InternalState::SET: return ExternalState::SET;
case InternalState::REROUTING: return ExternalState::CHANGING;
case InternalState::ARRIVED: return ExternalState::ARRIVED;
case InternalState::ABORTED: return ExternalState::SET;
case InternalState::INTERRUPTED: return ExternalState::SET;
default: return ExternalState::UNKNOWN;
}
};
// clang-format on
ExternalState external;
external.stamp = internal.stamp;
external.state = convert(internal.state);
return external;
}
InternalClearRequest convert_request(const ExternalClearRequest &)
{
auto internal = std::make_shared<InternalClearRequest::element_type>();
return internal;
}
InternalLaneletRequest convert_request(const ExternalLaneletRequest & external)
{
auto internal = std::make_shared<InternalLaneletRequest::element_type>();
internal->header = external->header;
internal->goal_pose = external->goal;
internal->segments = convert_vector<LaneletSegment>(external->segments);
internal->allow_modification = external->option.allow_goal_modification;
return internal;
}
InternalWaypointRequest convert_request(const ExternalWaypointRequest & external)
{
auto internal = std::make_shared<InternalWaypointRequest::element_type>();
internal->header = external->header;
internal->goal_pose = external->goal;
internal->waypoints = external->waypoints;
internal->allow_modification = external->option.allow_goal_modification;
return internal;
}
ExternalResponse convert_response(const InternalResponse & internal)
{
// TODO(Takagi, Isamu): check error code correspondence
ExternalResponse external;
external.success = internal.success;
external.code = internal.code;
external.message = internal.message;
return external;
}
} // namespace autoware::default_adapi::conversion
@@ -0,0 +1,67 @@
// 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__ROUTE_CONVERSION_HPP_
#define UTILS__ROUTE_CONVERSION_HPP_
#include <rclcpp/rclcpp.hpp>
#include <autoware_adapi_v1_msgs/msg/route.hpp>
#include <autoware_adapi_v1_msgs/msg/route_state.hpp>
#include <autoware_adapi_v1_msgs/srv/clear_route.hpp>
#include <autoware_adapi_v1_msgs/srv/set_route.hpp>
#include <autoware_adapi_v1_msgs/srv/set_route_points.hpp>
#include <autoware_planning_msgs/msg/lanelet_route.hpp>
#include <tier4_planning_msgs/msg/route_state.hpp>
#include <tier4_planning_msgs/srv/clear_route.hpp>
#include <tier4_planning_msgs/srv/set_lanelet_route.hpp>
#include <tier4_planning_msgs/srv/set_waypoint_route.hpp>
namespace autoware::default_adapi::conversion
{
using ExternalRoute = autoware_adapi_v1_msgs::msg::Route;
using InternalRoute = autoware_planning_msgs::msg::LaneletRoute;
ExternalRoute create_empty_route(const rclcpp::Time & stamp);
ExternalRoute convert_route(const InternalRoute & internal);
using ExternalState = autoware_adapi_v1_msgs::msg::RouteState;
using InternalState = tier4_planning_msgs::msg::RouteState;
ExternalState convert_state(const InternalState & internal);
using ExternalClearRequest = autoware_adapi_v1_msgs::srv::ClearRoute::Request::SharedPtr;
using InternalClearRequest = tier4_planning_msgs::srv::ClearRoute::Request::SharedPtr;
InternalClearRequest convert_request(const ExternalClearRequest & external);
using ExternalLaneletRequest = autoware_adapi_v1_msgs::srv::SetRoute::Request::SharedPtr;
using InternalLaneletRequest = tier4_planning_msgs::srv::SetLaneletRoute::Request::SharedPtr;
InternalLaneletRequest convert_request(const ExternalLaneletRequest & external);
using ExternalWaypointRequest = autoware_adapi_v1_msgs::srv::SetRoutePoints::Request::SharedPtr;
using InternalWaypointRequest = tier4_planning_msgs::srv::SetWaypointRoute::Request::SharedPtr;
InternalWaypointRequest convert_request(const ExternalWaypointRequest & external);
using ExternalResponse = autoware_adapi_v1_msgs::msg::ResponseStatus;
using InternalResponse = autoware_common_msgs::msg::ResponseStatus;
ExternalResponse convert_response(const InternalResponse & internal);
template <class ClientT, class RequestT>
ExternalResponse convert_call(ClientT & client, RequestT & req)
{
return convert_response(client->call(convert_request(req))->status);
}
} // namespace autoware::default_adapi::conversion
#endif // UTILS__ROUTE_CONVERSION_HPP_
@@ -0,0 +1,46 @@
// Copyright 2024 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.
#ifndef UTILS__TOPICS_HPP_
#define UTILS__TOPICS_HPP_
#include <component_interface_utils/rclcpp.hpp>
#include <rclcpp/time.hpp>
#include <optional>
namespace autoware::default_adapi::utils
{
// cppcheck-suppress-begin unusedFunction
template <class MsgT>
MsgT ignore_stamp(MsgT msg)
{
msg.stamp = rclcpp::Time(0, 0);
return msg;
};
// cppcheck-suppress-end unusedFunction
template <class PubT, class MsgT, class FuncT>
void notify(PubT & pub, std::optional<MsgT> & prev, const MsgT & curr, FuncT && ignore)
{
if (!prev || ignore(*prev) != ignore(curr)) {
prev = curr;
pub->publish(curr);
}
}
} // namespace autoware::default_adapi::utils
#endif // UTILS__TOPICS_HPP_
@@ -0,0 +1,34 @@
// 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__TYPES_HPP_
#define UTILS__TYPES_HPP_
#include <component_interface_utils/rclcpp.hpp>
namespace autoware::default_adapi
{
template <class T>
using Pub = typename component_interface_utils::Publisher<T>::SharedPtr;
template <class T>
using Sub = typename component_interface_utils::Subscription<T>::SharedPtr;
template <class T>
using Cli = typename component_interface_utils::Client<T>::SharedPtr;
template <class T>
using Srv = typename component_interface_utils::Service<T>::SharedPtr;
} // namespace autoware::default_adapi
#endif // UTILS__TYPES_HPP_
@@ -0,0 +1,199 @@
// 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 "vehicle.hpp"
#include <autoware/geography_utils/height.hpp>
#include <autoware/geography_utils/projection.hpp>
#include <geographic_msgs/msg/geo_point.hpp>
#include <limits>
namespace autoware::default_adapi
{
using GearReport = autoware::component_interface_specs::vehicle::GearStatus::Message;
using ApiGear = autoware_adapi_v1_msgs::msg::Gear;
using TurnIndicatorsReport =
autoware::component_interface_specs::vehicle::TurnIndicatorStatus::Message;
using ApiTurnIndicator = autoware_adapi_v1_msgs::msg::TurnIndicators;
using HazardLightsReport = autoware::component_interface_specs::vehicle::HazardLightStatus::Message;
using ApiHazardLight = autoware_adapi_v1_msgs::msg::HazardLights;
using MapProjectorInfo = autoware::component_interface_specs::map::MapProjectorInfo::Message;
std::unordered_map<uint8_t, uint8_t> gear_type_ = {
{GearReport::NONE, ApiGear::UNKNOWN}, {GearReport::NEUTRAL, ApiGear::NEUTRAL},
{GearReport::DRIVE, ApiGear::DRIVE}, {GearReport::DRIVE_2, ApiGear::DRIVE},
{GearReport::DRIVE_3, ApiGear::DRIVE}, {GearReport::DRIVE_4, ApiGear::DRIVE},
{GearReport::DRIVE_5, ApiGear::DRIVE}, {GearReport::DRIVE_6, ApiGear::DRIVE},
{GearReport::DRIVE_7, ApiGear::DRIVE}, {GearReport::DRIVE_8, ApiGear::DRIVE},
{GearReport::DRIVE_9, ApiGear::DRIVE}, {GearReport::DRIVE_10, ApiGear::DRIVE},
{GearReport::DRIVE_11, ApiGear::DRIVE}, {GearReport::DRIVE_12, ApiGear::DRIVE},
{GearReport::DRIVE_13, ApiGear::DRIVE}, {GearReport::DRIVE_14, ApiGear::DRIVE},
{GearReport::DRIVE_15, ApiGear::DRIVE}, {GearReport::DRIVE_16, ApiGear::DRIVE},
{GearReport::DRIVE_17, ApiGear::DRIVE}, {GearReport::DRIVE_18, ApiGear::DRIVE},
{GearReport::REVERSE, ApiGear::REVERSE}, {GearReport::REVERSE_2, ApiGear::REVERSE},
{GearReport::PARK, ApiGear::PARK}, {GearReport::LOW, ApiGear::LOW},
{GearReport::LOW_2, ApiGear::LOW},
};
std::unordered_map<uint8_t, uint8_t> turn_indicator_type_ = {
{TurnIndicatorsReport::DISABLE, ApiTurnIndicator::DISABLE},
{TurnIndicatorsReport::ENABLE_LEFT, ApiTurnIndicator::LEFT},
{TurnIndicatorsReport::ENABLE_RIGHT, ApiTurnIndicator::RIGHT},
};
std::unordered_map<uint8_t, uint8_t> hazard_light_type_ = {
{HazardLightsReport::DISABLE, ApiHazardLight::DISABLE},
{HazardLightsReport::ENABLE, ApiHazardLight::ENABLE},
};
VehicleNode::VehicleNode(const rclcpp::NodeOptions & options) : Node("vehicle", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.init_pub(pub_kinematics_);
adaptor.init_pub(pub_status_);
adaptor.init_sub(sub_kinematic_state_, this, &VehicleNode::kinematic_state);
adaptor.init_sub(sub_acceleration_, this, &VehicleNode::acceleration_status);
adaptor.init_sub(sub_steering_, this, &VehicleNode::steering_status);
adaptor.init_sub(sub_gear_state_, this, &VehicleNode::gear_status);
adaptor.init_sub(sub_turn_indicator_, this, &VehicleNode::turn_indicator_status);
adaptor.init_sub(sub_map_projector_info_, this, &VehicleNode::map_projector_info);
adaptor.init_sub(sub_hazard_light_, this, &VehicleNode::hazard_light_status);
adaptor.init_sub(sub_energy_level_, this, &VehicleNode::energy_status);
const auto rate = rclcpp::Rate(10);
timer_ = rclcpp::create_timer(this, get_clock(), rate.period(), [this]() { on_timer(); });
}
uint8_t VehicleNode::mapping(
std::unordered_map<uint8_t, uint8_t> hash_map, uint8_t input, uint8_t default_value)
{
if (hash_map.find(input) == hash_map.end()) {
return default_value;
} else {
return hash_map[input];
}
}
void VehicleNode::kinematic_state(
const autoware::component_interface_specs::localization::KinematicState::Message::ConstSharedPtr
msg_ptr)
{
kinematic_state_msgs_ = msg_ptr;
}
void VehicleNode::acceleration_status(
const autoware::component_interface_specs::localization::Acceleration::Message::ConstSharedPtr
msg_ptr)
{
acceleration_msgs_ = msg_ptr;
}
void VehicleNode::steering_status(
const autoware::component_interface_specs::vehicle::SteeringStatus::Message::ConstSharedPtr
msg_ptr)
{
steering_status_msgs_ = msg_ptr;
}
void VehicleNode::gear_status(const GearReport::ConstSharedPtr msg_ptr)
{
gear_status_msgs_ = msg_ptr;
}
void VehicleNode::turn_indicator_status(const TurnIndicatorsReport::ConstSharedPtr msg_ptr)
{
turn_indicator_status_msgs_ = msg_ptr;
}
void VehicleNode::hazard_light_status(const HazardLightsReport::ConstSharedPtr msg_ptr)
{
hazard_light_status_msgs_ = msg_ptr;
}
void VehicleNode::energy_status(
const autoware::component_interface_specs::vehicle::EnergyStatus::Message::ConstSharedPtr msg_ptr)
{
energy_status_msgs_ = msg_ptr;
}
void VehicleNode::map_projector_info(const MapProjectorInfo::ConstSharedPtr msg_ptr)
{
map_projector_info_ = msg_ptr;
}
void VehicleNode::publish_kinematics()
{
if (!kinematic_state_msgs_ || !acceleration_msgs_ || !map_projector_info_) return;
autoware_ad_api::vehicle::VehicleKinematics::Message vehicle_kinematics;
vehicle_kinematics.pose.header = kinematic_state_msgs_->header;
vehicle_kinematics.pose.pose = kinematic_state_msgs_->pose;
vehicle_kinematics.twist.header = kinematic_state_msgs_->header;
vehicle_kinematics.twist.header.frame_id = kinematic_state_msgs_->child_frame_id;
vehicle_kinematics.twist.twist = kinematic_state_msgs_->twist;
if (map_projector_info_->projector_type != MapProjectorInfo::LOCAL) {
const geographic_msgs::msg::GeoPoint projected_gps_point =
autoware::geography_utils::project_reverse(
kinematic_state_msgs_->pose.pose.position, *map_projector_info_);
vehicle_kinematics.geographic_pose.header = kinematic_state_msgs_->header;
vehicle_kinematics.geographic_pose.header.frame_id = "global";
vehicle_kinematics.geographic_pose.position.latitude = projected_gps_point.latitude;
vehicle_kinematics.geographic_pose.position.longitude = projected_gps_point.longitude;
vehicle_kinematics.geographic_pose.position.altitude =
autoware::geography_utils::convert_height(
projected_gps_point.altitude, projected_gps_point.latitude, projected_gps_point.longitude,
map_projector_info_->vertical_datum, MapProjectorInfo::WGS84);
} else {
vehicle_kinematics.geographic_pose.position.latitude = std::numeric_limits<double>::quiet_NaN();
vehicle_kinematics.geographic_pose.position.longitude =
std::numeric_limits<double>::quiet_NaN();
vehicle_kinematics.geographic_pose.position.altitude = std::numeric_limits<double>::quiet_NaN();
}
vehicle_kinematics.accel.header = acceleration_msgs_->header;
vehicle_kinematics.accel.accel = acceleration_msgs_->accel;
pub_kinematics_->publish(vehicle_kinematics);
}
void VehicleNode::publish_status()
{
if (
!steering_status_msgs_ || !gear_status_msgs_ || !turn_indicator_status_msgs_ ||
!hazard_light_status_msgs_)
return;
autoware_ad_api::vehicle::VehicleStatus::Message vehicle_status;
vehicle_status.stamp = now();
vehicle_status.steering_tire_angle = steering_status_msgs_->steering_tire_angle;
vehicle_status.gear.status = mapping(gear_type_, gear_status_msgs_->report, ApiGear::UNKNOWN);
vehicle_status.turn_indicators.status =
mapping(turn_indicator_type_, turn_indicator_status_msgs_->report, ApiTurnIndicator::UNKNOWN);
vehicle_status.hazard_lights.status =
mapping(hazard_light_type_, hazard_light_status_msgs_->report, ApiHazardLight::UNKNOWN);
pub_status_->publish(vehicle_status);
}
void VehicleNode::on_timer()
{
publish_kinematics();
publish_status();
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::VehicleNode)
@@ -0,0 +1,105 @@
// 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 VEHICLE_HPP_
#define VEHICLE_HPP_
#include <autoware/component_interface_specs/localization.hpp>
#include <autoware/component_interface_specs/map.hpp>
#include <autoware/component_interface_specs/vehicle.hpp>
#include <autoware_ad_api_specs/vehicle.hpp>
#include <rclcpp/rclcpp.hpp>
#include <autoware_adapi_v1_msgs/msg/gear.hpp>
#include <autoware_adapi_v1_msgs/msg/hazard_lights.hpp>
#include <autoware_adapi_v1_msgs/msg/turn_indicators.hpp>
#include <unordered_map>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class VehicleNode : public rclcpp::Node
{
public:
explicit VehicleNode(const rclcpp::NodeOptions & options);
private:
rclcpp::CallbackGroup::SharedPtr group_cli_;
Pub<autoware_ad_api::vehicle::VehicleKinematics> pub_kinematics_;
Pub<autoware_ad_api::vehicle::VehicleStatus> pub_status_;
Sub<autoware::component_interface_specs::localization::KinematicState> sub_kinematic_state_;
Sub<autoware::component_interface_specs::localization::Acceleration> sub_acceleration_;
Sub<autoware::component_interface_specs::vehicle::SteeringStatus> sub_steering_;
Sub<autoware::component_interface_specs::vehicle::GearStatus> sub_gear_state_;
Sub<autoware::component_interface_specs::vehicle::TurnIndicatorStatus> sub_turn_indicator_;
Sub<autoware::component_interface_specs::vehicle::HazardLightStatus> sub_hazard_light_;
Sub<autoware::component_interface_specs::vehicle::EnergyStatus> sub_energy_level_;
Sub<autoware::component_interface_specs::map::MapProjectorInfo> sub_map_projector_info_;
rclcpp::TimerBase::SharedPtr timer_;
autoware::component_interface_specs::localization::KinematicState::Message::ConstSharedPtr
kinematic_state_msgs_;
autoware::component_interface_specs::localization::Acceleration::Message::ConstSharedPtr
acceleration_msgs_;
autoware::component_interface_specs::vehicle::SteeringStatus::Message::ConstSharedPtr
steering_status_msgs_;
autoware::component_interface_specs::vehicle::GearStatus::Message::ConstSharedPtr
gear_status_msgs_;
autoware::component_interface_specs::vehicle::TurnIndicatorStatus::Message::ConstSharedPtr
turn_indicator_status_msgs_;
autoware::component_interface_specs::vehicle::HazardLightStatus::Message::ConstSharedPtr
hazard_light_status_msgs_;
autoware::component_interface_specs::vehicle::EnergyStatus::Message::ConstSharedPtr
energy_status_msgs_;
autoware::component_interface_specs::map::MapProjectorInfo::Message::ConstSharedPtr
map_projector_info_;
void kinematic_state(
const autoware::component_interface_specs::localization::KinematicState::Message::ConstSharedPtr
msg_ptr);
void acceleration_status(
const autoware::component_interface_specs::localization::Acceleration::Message::ConstSharedPtr
msg_ptr);
void steering_status(
const autoware::component_interface_specs::vehicle::SteeringStatus::Message::ConstSharedPtr
msg_ptr);
void gear_status(
const autoware::component_interface_specs::vehicle::GearStatus::Message::ConstSharedPtr
msg_ptr);
void turn_indicator_status(
const autoware::component_interface_specs::vehicle::TurnIndicatorStatus::Message::ConstSharedPtr
msg_ptr);
void map_projector_info(
const autoware::component_interface_specs::map::MapProjectorInfo::Message::ConstSharedPtr
msg_ptr);
void hazard_light_status(
const autoware::component_interface_specs::vehicle::HazardLightStatus::Message::ConstSharedPtr
msg_ptr);
void energy_status(
const autoware::component_interface_specs::vehicle::EnergyStatus::Message::ConstSharedPtr
msg_ptr);
uint8_t mapping(
std::unordered_map<uint8_t, uint8_t> hash_map, uint8_t input, uint8_t default_value);
void publish_kinematics();
void publish_status();
void on_timer();
};
} // namespace autoware::default_adapi
#endif // VEHICLE_HPP_
@@ -0,0 +1,44 @@
// 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 "vehicle_door.hpp"
#include "utils/topics.hpp"
namespace autoware::default_adapi
{
VehicleDoorNode::VehicleDoorNode(const rclcpp::NodeOptions & options)
: Node("vehicle_door", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.relay_service(cli_command_, srv_command_, group_cli_, 3.0);
adaptor.relay_service(cli_layout_, srv_layout_, group_cli_, 3.0);
adaptor.init_pub(pub_status_);
adaptor.init_sub(sub_status_, this, &VehicleDoorNode::on_status);
}
void VehicleDoorNode::on_status(
autoware::component_interface_specs::vehicle::DoorStatus::Message::ConstSharedPtr msg)
{
utils::notify(
pub_status_, status_, *msg,
utils::ignore_stamp<autoware::component_interface_specs::vehicle::DoorStatus::Message>);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::VehicleDoorNode)
@@ -0,0 +1,50 @@
// 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 VEHICLE_DOOR_HPP_
#define VEHICLE_DOOR_HPP_
#include <autoware/component_interface_specs/vehicle.hpp>
#include <autoware_ad_api_specs/vehicle.hpp>
#include <rclcpp/rclcpp.hpp>
#include <optional>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class VehicleDoorNode : public rclcpp::Node
{
public:
explicit VehicleDoorNode(const rclcpp::NodeOptions & options);
private:
void on_status(
autoware::component_interface_specs::vehicle::DoorStatus::Message::ConstSharedPtr msg);
rclcpp::CallbackGroup::SharedPtr group_cli_;
Srv<autoware_ad_api::vehicle::DoorCommand> srv_command_;
Srv<autoware_ad_api::vehicle::DoorLayout> srv_layout_;
Pub<autoware_ad_api::vehicle::DoorStatus> pub_status_;
Cli<autoware::component_interface_specs::vehicle::DoorCommand> cli_command_;
Cli<autoware::component_interface_specs::vehicle::DoorLayout> cli_layout_;
Sub<autoware::component_interface_specs::vehicle::DoorStatus> sub_status_;
std::optional<autoware::component_interface_specs::vehicle::DoorStatus::Message> status_;
};
} // namespace autoware::default_adapi
#endif // VEHICLE_DOOR_HPP_
@@ -0,0 +1,71 @@
// 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 "vehicle_info.hpp"
#include <autoware_vehicle_info_utils/vehicle_info_utils.hpp>
namespace
{
auto create_point(double x, double y)
{
geometry_msgs::msg::Point32 point;
point.x = x;
point.y = y;
point.z = 0.0;
return point;
}
} // namespace
namespace autoware::default_adapi
{
VehicleInfoNode::VehicleInfoNode(const rclcpp::NodeOptions & options)
: Node("vehicle_info", options)
{
const auto on_vehicle_dimensions = [this](auto, auto res) {
res->status.success = true;
res->dimensions = dimensions_;
};
const auto vehicle = autoware::vehicle_info_utils::VehicleInfoUtils(*this).getVehicleInfo();
dimensions_.wheel_radius = vehicle.wheel_radius_m;
dimensions_.wheel_width = vehicle.wheel_width_m;
dimensions_.wheel_base = vehicle.wheel_base_m;
dimensions_.wheel_tread = vehicle.wheel_tread_m;
dimensions_.front_overhang = vehicle.front_overhang_m;
dimensions_.rear_overhang = vehicle.rear_overhang_m;
dimensions_.left_overhang = vehicle.left_overhang_m;
dimensions_.right_overhang = vehicle.right_overhang_m;
dimensions_.height = vehicle.vehicle_height_m;
const auto l = (vehicle.wheel_tread_m / 2.0) + vehicle.left_overhang_m;
const auto r = (vehicle.wheel_tread_m / 2.0) + vehicle.right_overhang_m;
const auto b = vehicle.rear_overhang_m;
const auto f = vehicle.front_overhang_m + vehicle.wheel_base_m;
dimensions_.footprint.points.push_back(create_point(+f, +r));
dimensions_.footprint.points.push_back(create_point(+f, -l));
dimensions_.footprint.points.push_back(create_point(-b, -l));
dimensions_.footprint.points.push_back(create_point(-b, +r));
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_srv(srv_dimensions_, on_vehicle_dimensions);
}
} // namespace autoware::default_adapi
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(autoware::default_adapi::VehicleInfoNode)
@@ -0,0 +1,39 @@
// 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 VEHICLE_INFO_HPP_
#define VEHICLE_INFO_HPP_
#include <autoware_ad_api_specs/vehicle.hpp>
#include <rclcpp/rclcpp.hpp>
// This file should be included after messages.
#include "utils/types.hpp"
namespace autoware::default_adapi
{
class VehicleInfoNode : public rclcpp::Node
{
public:
explicit VehicleInfoNode(const rclcpp::NodeOptions & options);
private:
Srv<autoware_ad_api::vehicle::Dimensions> srv_dimensions_;
autoware_adapi_v1_msgs::msg::VehicleDimensions dimensions_;
};
} // namespace autoware::default_adapi
#endif // VEHICLE_INFO_HPP_
@@ -0,0 +1,49 @@
# 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 importlib.util
import unittest
from ament_index_python.packages import get_package_share_directory
import launch
import launch_testing.actions
import launch_testing.markers
import launch_testing.tools
import pytest
@pytest.mark.launch_test
@launch_testing.markers.keep_alive
def generate_test_description():
path = get_package_share_directory("autoware_default_adapi") + "/launch/default_adapi.launch.py"
specification = importlib.util.spec_from_file_location("launch_script", path)
launch_script = importlib.util.module_from_spec(specification)
specification.loader.exec_module(launch_script)
return launch.LaunchDescription(
[
*launch_script.generate_launch_description().describe_sub_entities(),
launch_testing.actions.ReadyToTest(),
]
)
class TestMain(unittest.TestCase):
def test_interface_version(self, launch_service, proc_info, proc_output):
prefix = get_package_share_directory("autoware_default_adapi")
target = prefix + "/test/node/interface_version.py"
action = launch.actions.ExecuteProcess(cmd=["python3", target])
with launch_testing.tools.launch_process(launch_service, action, proc_info, proc_output):
proc_info.assertWaitForStartup(process=action, timeout=1)
proc_info.assertWaitForShutdown(process=action, timeout=3)
launch_testing.asserts.assertExitCodes(proc_info, process=action)
@@ -0,0 +1,38 @@
# 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.
from autoware_adapi_version_msgs.srv import InterfaceVersion
import rclpy
import rclpy.node
rclpy.init()
node = rclpy.node.Node("test_client")
client = node.create_client(InterfaceVersion, "/api/interface/version")
if not client.wait_for_service(timeout_sec=3.0):
exit(1)
request = InterfaceVersion.Request()
future = client.call_async(request)
rclpy.spin_until_future_complete(node, future)
response = future.result()
if response.major != 1:
exit(1)
if response.minor != 5:
exit(1)
if response.patch != 0:
exit(1)
rclpy.shutdown()
@@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.14)
project(ad_api_adaptors)
find_package(autoware_cmake REQUIRED)
autoware_package()
ament_auto_add_library(${PROJECT_NAME} SHARED
src/initial_pose_adaptor.cpp
src/routing_adaptor.cpp
)
rclcpp_components_register_node(${PROJECT_NAME}
PLUGIN "ad_api_adaptors::InitialPoseAdaptor"
EXECUTABLE initial_pose_adaptor_node
EXECUTOR MultiThreadedExecutor
)
rclcpp_components_register_node(${PROJECT_NAME}
PLUGIN "ad_api_adaptors::RoutingAdaptor"
EXECUTABLE routing_adaptor_node
EXECUTOR SingleThreadedExecutor
)
ament_auto_package(INSTALL_TO_SHARE config launch)
@@ -0,0 +1,35 @@
# ad_api_adaptors
## initial_pose_adaptor
This node makes it easy to use the localization AD API from RViz.
When a initial pose topic is received, call the localization initialize API.
This node depends on the map height fitter library.
[See here for more details.](../../../map/autoware_map_height_fitter/README.md)
| Interface | Local Name | Global Name | Description |
| ------------ | ----------- | ---------------------------- | ----------------------------------------- |
| Subscription | initialpose | /initialpose | The pose for localization initialization. |
| Client | - | /api/localization/initialize | The localization initialize API. |
## routing_adaptor
This node makes it easy to use the routing AD API from RViz.
When a goal pose topic is received, reset the waypoints and call the API.
When a waypoint pose topic is received, append it to the end of the waypoints to call the API.
The clear API is called automatically before setting the route.
| Interface | Local Name | Global Name | Description |
| ------------ | ------------------ | ------------------------------------- | -------------------------------------------------- |
| Subscription | - | /api/routing/state | The state of the routing API. |
| Subscription | ~/input/fixed_goal | /planning/mission_planning/goal | The goal pose of route. Disable goal modification. |
| Subscription | ~/input/rough_goal | /rviz/routing/rough_goal | The goal pose of route. Enable goal modification. |
| Subscription | ~/input/reroute | /rviz/routing/reroute | The goal pose of reroute. |
| Subscription | ~/input/waypoint | /planning/mission_planning/checkpoint | The waypoint pose of route. |
| Client | - | /api/routing/clear_route | The route clear API. |
| Client | - | /api/routing/set_route_points | The route points set API. |
| Client | - | /api/routing/change_route_points | The route points change API. |
## parameters
{{ json_to_markdown("/system/default_ad_api_helpers/ad_api_adaptors/schema/ad_api_adaptors.schema.json") }}
@@ -0,0 +1,13 @@
/**:
ros__parameters:
# from initialpose (Rviz's 2DPoseEstimate)
initial_pose_particle_covariance:
[
4.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 4.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.01, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.01, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.01, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
]
@@ -0,0 +1,22 @@
<launch>
<arg name="rviz_initial_pose_auto_fix_target" default="pointcloud_map"/>
<group>
<push-ros-namespace namespace="default_ad_api/helpers"/>
<node pkg="ad_api_adaptors" exec="initial_pose_adaptor_node">
<param from="$(find-pkg-share ad_api_adaptors)/config/initial_pose.param.yaml"/>
<param name="map_height_fitter.map_loader_name" value="/map/pointcloud_map_loader"/>
<param name="map_height_fitter.target" value="$(var rviz_initial_pose_auto_fix_target)"/>
<remap from="~/initialpose" to="/initialpose"/>
<remap from="~/pointcloud_map" to="/map/pointcloud_map"/>
<remap from="~/partial_map_load" to="/map/get_partial_pointcloud_map"/>
<remap from="~/vector_map" to="/map/vector_map"/>
</node>
<node pkg="ad_api_adaptors" exec="routing_adaptor_node">
<remap from="~/input/fixed_goal" to="/planning/mission_planning/goal"/>
<remap from="~/input/rough_goal" to="/rviz/routing/rough_goal"/>
<remap from="~/input/reroute" to="/rviz/routing/reroute"/>
<remap from="~/input/waypoint" to="/planning/mission_planning/checkpoint"/>
</node>
</group>
</launch>
@@ -0,0 +1,28 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ad_api_adaptors</name>
<version>0.1.0</version>
<description>The ad_api_adaptors package</description>
<maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
<maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
<maintainer email="yukihiro.saito@tier4.jp">Yukihiro Saito</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake_auto</buildtool_depend>
<buildtool_depend>autoware_cmake</buildtool_depend>
<depend>autoware_ad_api_specs</depend>
<depend>autoware_adapi_v1_msgs</depend>
<depend>autoware_map_height_fitter</depend>
<depend>component_interface_utils</depend>
<depend>rclcpp</depend>
<depend>rclcpp_components</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>autoware_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
@@ -0,0 +1,37 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "ad_api_adaptors parameter",
"type": "object",
"definitions": {
"ad_api_adaptors": {
"type": "object",
"properties": {
"initial_pose_particle_covariance": {
"type": "array",
"description": "initial_pose_particle_covariance",
"default": [
4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.01, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 1.0
]
}
},
"required": ["initial_pose_particle_covariance"],
"additionalProperties": false
}
},
"properties": {
"/**": {
"type": "object",
"properties": {
"ros__parameters": {
"$ref": "#/definitions/initial_pose_particle_covariance"
}
},
"required": ["ros__parameters"],
"additionalProperties": false
}
},
"required": ["/**"],
"additionalProperties": false
}
@@ -0,0 +1,66 @@
// 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 "initial_pose_adaptor.hpp"
#include <memory>
#include <string>
#include <vector>
namespace ad_api_adaptors
{
template <class ServiceT>
using Future = typename rclcpp::Client<ServiceT>::SharedFuture;
std::array<double, 36> get_covariance_parameter(rclcpp::Node * node, const std::string & name)
{
const auto vector = node->declare_parameter<std::vector<double>>(name);
if (vector.size() != 36) {
throw std::invalid_argument("The covariance parameter size is not 36.");
}
std::array<double, 36> array;
std::copy_n(vector.begin(), array.size(), array.begin());
return array;
}
InitialPoseAdaptor::InitialPoseAdaptor(const rclcpp::NodeOptions & options)
: Node("initial_pose_adaptor", options), fitter_(this)
{
rviz_particle_covariance_ = get_covariance_parameter(this, "initial_pose_particle_covariance");
sub_initial_pose_ = create_subscription<PoseWithCovarianceStamped>(
"~/initialpose", rclcpp::QoS(1),
std::bind(&InitialPoseAdaptor::on_initial_pose, this, std::placeholders::_1));
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_cli(cli_initialize_);
}
void InitialPoseAdaptor::on_initial_pose(const PoseWithCovarianceStamped::ConstSharedPtr msg)
{
PoseWithCovarianceStamped pose = *msg;
const auto fitted = fitter_.fit(pose.pose.pose.position, pose.header.frame_id);
if (fitted) {
pose.pose.pose.position = fitted.value();
}
pose.pose.covariance = rviz_particle_covariance_;
const auto req = std::make_shared<Initialize::Service::Request>();
req->pose.push_back(pose);
cli_initialize_->async_send_request(req);
}
} // namespace ad_api_adaptors
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(ad_api_adaptors::InitialPoseAdaptor)
@@ -0,0 +1,46 @@
// 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 INITIAL_POSE_ADAPTOR_HPP_
#define INITIAL_POSE_ADAPTOR_HPP_
#include <autoware/map_height_fitter/map_height_fitter.hpp>
#include <autoware_ad_api_specs/localization.hpp>
#include <component_interface_utils/rclcpp.hpp>
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp>
namespace ad_api_adaptors
{
class InitialPoseAdaptor : public rclcpp::Node
{
public:
explicit InitialPoseAdaptor(const rclcpp::NodeOptions & options);
private:
using PoseWithCovarianceStamped = geometry_msgs::msg::PoseWithCovarianceStamped;
using Initialize = autoware_ad_api::localization::Initialize;
rclcpp::Subscription<PoseWithCovarianceStamped>::SharedPtr sub_initial_pose_;
component_interface_utils::Client<Initialize>::SharedPtr cli_initialize_;
std::array<double, 36> rviz_particle_covariance_;
autoware::map_height_fitter::MapHeightFitter fitter_;
void on_initial_pose(const PoseWithCovarianceStamped::ConstSharedPtr msg);
};
} // namespace ad_api_adaptors
#endif // INITIAL_POSE_ADAPTOR_HPP_
@@ -0,0 +1,115 @@
// 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 "routing_adaptor.hpp"
#include <memory>
namespace ad_api_adaptors
{
RoutingAdaptor::RoutingAdaptor(const rclcpp::NodeOptions & options)
: Node("routing_adaptor", options)
{
using std::placeholders::_1;
sub_fixed_goal_ = create_subscription<PoseStamped>(
"~/input/fixed_goal", 3, std::bind(&RoutingAdaptor::on_fixed_goal, this, _1));
sub_rough_goal_ = create_subscription<PoseStamped>(
"~/input/rough_goal", 3, std::bind(&RoutingAdaptor::on_rough_goal, this, _1));
sub_reroute_ = create_subscription<PoseStamped>(
"~/input/reroute", 3, std::bind(&RoutingAdaptor::on_reroute, this, _1));
sub_waypoint_ = create_subscription<PoseStamped>(
"~/input/waypoint", 10, std::bind(&RoutingAdaptor::on_waypoint, this, _1));
const auto adaptor = component_interface_utils::NodeAdaptor(this);
adaptor.init_cli(cli_reroute_);
adaptor.init_cli(cli_route_);
adaptor.init_cli(cli_clear_);
adaptor.init_sub(
sub_state_, [this](const RouteState::Message::ConstSharedPtr msg) { state_ = msg->state; });
const auto rate = rclcpp::Rate(5.0);
timer_ = rclcpp::create_timer(
this, get_clock(), rate.period(), std::bind(&RoutingAdaptor::on_timer, this));
state_ = RouteState::Message::UNKNOWN;
route_ = std::make_shared<SetRoutePoints::Service::Request>();
}
void RoutingAdaptor::on_timer()
{
// Wait a moment to combine consecutive goals and checkpoints into a single request.
// This value is rate dependent and set the wait time for merging.
constexpr int delay_count = 3; // 0.4 seconds (rate * (value - 1))
if (0 < request_timing_control_ && request_timing_control_ < delay_count) {
++request_timing_control_;
}
if (request_timing_control_ != delay_count) {
return;
}
if (!calling_service_) {
if (state_ != RouteState::Message::UNSET) {
const auto request = std::make_shared<ClearRoute::Service::Request>();
calling_service_ = true;
cli_clear_->async_send_request(request, [this](auto) { calling_service_ = false; });
} else {
request_timing_control_ = 0;
calling_service_ = true;
cli_route_->async_send_request(route_, [this](auto) { calling_service_ = false; });
}
}
}
void RoutingAdaptor::on_fixed_goal(const PoseStamped::ConstSharedPtr pose)
{
request_timing_control_ = 1;
route_->header = pose->header;
route_->goal = pose->pose;
route_->waypoints.clear();
route_->option.allow_goal_modification = false;
}
void RoutingAdaptor::on_rough_goal(const PoseStamped::ConstSharedPtr pose)
{
request_timing_control_ = 1;
route_->header = pose->header;
route_->goal = pose->pose;
route_->waypoints.clear();
route_->option.allow_goal_modification = true;
}
void RoutingAdaptor::on_waypoint(const PoseStamped::ConstSharedPtr pose)
{
if (route_->header.frame_id != pose->header.frame_id) {
RCLCPP_ERROR_STREAM(get_logger(), "The waypoint frame does not match the goal.");
return;
}
request_timing_control_ = 1;
route_->waypoints.push_back(pose->pose);
}
void RoutingAdaptor::on_reroute(const PoseStamped::ConstSharedPtr pose)
{
const auto route = std::make_shared<SetRoutePoints::Service::Request>();
route->header = pose->header;
route->goal = pose->pose;
cli_reroute_->async_send_request(route);
}
} // namespace ad_api_adaptors
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(ad_api_adaptors::RoutingAdaptor)
@@ -0,0 +1,64 @@
// 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 ROUTING_ADAPTOR_HPP_
#define ROUTING_ADAPTOR_HPP_
#include <autoware_ad_api_specs/routing.hpp>
#include <component_interface_utils/rclcpp.hpp>
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/pose_stamped.hpp>
#include <string>
namespace ad_api_adaptors
{
class RoutingAdaptor : public rclcpp::Node
{
public:
explicit RoutingAdaptor(const rclcpp::NodeOptions & options);
private:
using PoseStamped = geometry_msgs::msg::PoseStamped;
using SetRoutePoints = autoware_ad_api::routing::SetRoutePoints;
using ChangeRoutePoints = autoware_ad_api::routing::ChangeRoutePoints;
using ClearRoute = autoware_ad_api::routing::ClearRoute;
using RouteState = autoware_ad_api::routing::RouteState;
component_interface_utils::Client<ChangeRoutePoints>::SharedPtr cli_reroute_;
component_interface_utils::Client<SetRoutePoints>::SharedPtr cli_route_;
component_interface_utils::Client<ClearRoute>::SharedPtr cli_clear_;
component_interface_utils::Subscription<RouteState>::SharedPtr sub_state_;
rclcpp::Subscription<PoseStamped>::SharedPtr sub_fixed_goal_;
rclcpp::Subscription<PoseStamped>::SharedPtr sub_rough_goal_;
rclcpp::Subscription<PoseStamped>::SharedPtr sub_waypoint_;
rclcpp::Subscription<PoseStamped>::SharedPtr sub_reroute_;
rclcpp::TimerBase::SharedPtr timer_;
bool calling_service_ = false;
int request_timing_control_ = 0;
SetRoutePoints::Service::Request::SharedPtr route_;
RouteState::Message::_state_type state_;
void on_timer();
void on_fixed_goal(const PoseStamped::ConstSharedPtr pose);
void on_rough_goal(const PoseStamped::ConstSharedPtr pose);
void on_waypoint(const PoseStamped::ConstSharedPtr pose);
void on_reroute(const PoseStamped::ConstSharedPtr pose);
};
} // namespace ad_api_adaptors
#endif // ROUTING_ADAPTOR_HPP_
@@ -0,0 +1,159 @@
#!/usr/bin/env python3
from autoware_adapi_v1_msgs.msg import SteeringFactor
from autoware_adapi_v1_msgs.msg import SteeringFactorArray
from autoware_adapi_v1_msgs.msg import VelocityFactor
from autoware_adapi_v1_msgs.msg import VelocityFactorArray
from geometry_msgs.msg import Pose
import numpy
import rclpy
import rclpy.duration
import rclpy.node
import tf_transformations
from visualization_msgs.msg import Marker
from visualization_msgs.msg import MarkerArray
velocity_type_text = {
VelocityFactor.UNKNOWN: "unknown",
VelocityFactor.SURROUNDING_OBSTACLE: "surrounding obstacle",
VelocityFactor.ROUTE_OBSTACLE: "route obstacle",
VelocityFactor.INTERSECTION: "intersection",
VelocityFactor.CROSSWALK: "crosswalk",
VelocityFactor.REAR_CHECK: "rear check",
VelocityFactor.USER_DEFINED_DETECTION_AREA: "detection area",
VelocityFactor.NO_STOPPING_AREA: "no stopping area",
VelocityFactor.STOP_SIGN: "stop sign",
VelocityFactor.TRAFFIC_SIGNAL: "traffic signal",
VelocityFactor.V2I_GATE_CONTROL_ENTER: "v2i enter",
VelocityFactor.V2I_GATE_CONTROL_LEAVE: "v2i leave",
VelocityFactor.MERGE: "merge",
VelocityFactor.SIDEWALK: "sidewalk",
VelocityFactor.LANE_CHANGE: "lane change",
VelocityFactor.AVOIDANCE: "avoidance",
VelocityFactor.EMERGENCY_STOP_OPERATION: "emergency stop operation",
}
steering_type_text = {
SteeringFactor.INTERSECTION: "intersection",
SteeringFactor.LANE_CHANGE: "lane change",
SteeringFactor.AVOIDANCE_PATH_CHANGE: "avoidance change",
SteeringFactor.AVOIDANCE_PATH_RETURN: "avoidance return",
SteeringFactor.STATION: "station",
SteeringFactor.START_PLANNER: "start planner",
SteeringFactor.GOAL_PLANNER: "goal planner",
SteeringFactor.EMERGENCY_OPERATION: "emergency operation",
}
velocity_status_color = {
VelocityFactor.UNKNOWN: (1.0, 1.0, 1.0),
VelocityFactor.APPROACHING: (1.0, 0.0, 0.0),
VelocityFactor.STOPPED: (1.0, 1.0, 0.0),
}
steering_status_color = {
SteeringFactor.UNKNOWN: (1.0, 1.0, 1.0),
SteeringFactor.APPROACHING: (1.0, 0.0, 0.0),
SteeringFactor.TRYING: (1.0, 1.0, 0.0),
SteeringFactor.TURNING: (1.0, 1.0, 1.0),
}
class PlanningFactorVisualizer(rclpy.node.Node):
def __init__(self):
super().__init__("planning_factor_visualizer")
self.front_offset = self.declare_parameter("front_offset", 0.0).value
self.pub_velocity = self.create_publisher(MarkerArray, "/visualizer/velocity_factors", 1)
self.pub_steering = self.create_publisher(MarkerArray, "/visualizer/steering_factors", 1)
self.sub_velocity = self.create_subscription(VelocityFactorArray, "/api/planning/velocity_factors", self.on_velocity_factor, 1) # fmt: skip
self.sub_steering = self.create_subscription(SteeringFactorArray, "/api/planning/steering_factors", self.on_steering_factor, 1) # fmt: skip
def on_velocity_factor(self, msg):
markers = MarkerArray()
for index, factor in enumerate(msg.factors):
color = velocity_status_color[factor.status]
text = velocity_type_text[factor.type]
markers.markers.append(self.create_wall(index, msg.header, factor.pose, color))
markers.markers.append(self.create_text(index, msg.header, factor.pose, text))
self.pub_velocity.publish(markers)
def on_steering_factor(self, msg):
markers = MarkerArray()
for index, factor in enumerate(msg.factors):
index1 = index * 2 + 0
index2 = index * 2 + 1
color = steering_status_color[factor.status]
text = steering_type_text[factor.type]
markers.markers.append(self.create_wall(index1, msg.header, factor.pose[0], color))
markers.markers.append(self.create_wall(index2, msg.header, factor.pose[1], color))
markers.markers.append(self.create_text(index1, msg.header, factor.pose[0], text))
markers.markers.append(self.create_text(index2, msg.header, factor.pose[1], text))
self.pub_steering.publish(markers)
def offset_pose(self, pose):
q = pose.orientation
q = numpy.array([q.x, q.y, q.z, q.w])
p = numpy.array([self.front_offset, 0, 0, 1])
r = tf_transformations.quaternion_matrix(q)
x = numpy.dot(r, p)
result = Pose()
result.position.x = pose.position.x + x[0]
result.position.y = pose.position.y + x[1]
result.position.z = pose.position.z + x[2]
result.orientation = pose.orientation
return result
def create_wall(self, index, header, pose, color):
pose = self.offset_pose(pose)
marker = Marker()
marker.ns = "wall"
marker.id = index
marker.lifetime = rclpy.duration.Duration(nanoseconds=0.3 * 1e9).to_msg()
marker.header = header
marker.action = Marker.ADD
marker.type = Marker.CUBE
marker.pose.position.x = pose.position.x
marker.pose.position.y = pose.position.y
marker.pose.position.z = pose.position.z + 1.0
marker.pose.orientation = pose.orientation
marker.scale.x = 0.1
marker.scale.y = 5.0
marker.scale.z = 2.0
marker.color.a = 0.7
marker.color.r = color[0]
marker.color.g = color[1]
marker.color.b = color[2]
return marker
def create_text(self, index, header, pose, text):
pose = self.offset_pose(pose)
marker = Marker()
marker.ns = "type"
marker.id = index
marker.lifetime = rclpy.duration.Duration(nanoseconds=0.3 * 1e9).to_msg()
marker.header = header
marker.action = Marker.ADD
marker.type = Marker.TEXT_VIEW_FACING
marker.text = text
marker.pose.position.x = pose.position.x
marker.pose.position.y = pose.position.y
marker.pose.position.z = pose.position.z + 2.0
marker.pose.orientation = pose.orientation
marker.scale.z = 1.0
marker.color.a = 1.0
marker.color.r = 1.0
marker.color.g = 1.0
marker.color.b = 1.0
return marker
def main(args=None):
try:
rclpy.init(args=args)
rclpy.spin(PlanningFactorVisualizer())
rclpy.shutdown()
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()
@@ -0,0 +1,5 @@
<launch>
<node pkg="ad_api_visualizers" name="planning_factors" exec="planning_factors">
<param name="front_offset" value="0.0"/>
</node>
</launch>
@@ -0,0 +1,25 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ad_api_visualizers</name>
<version>0.1.0</version>
<description>The ad_api_visualizers package</description>
<maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
<maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
<maintainer email="yukihiro.saito@tier4.jp">Yukihiro Saito</maintainer>
<license>Apache License 2.0</license>
<exec_depend>autoware_adapi_v1_msgs</exec_depend>
<exec_depend>geometry_msgs</exec_depend>
<exec_depend>rclpy</exec_depend>
<exec_depend>tf_transformations</exec_depend>
<exec_depend>visualization_msgs</exec_depend>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>
@@ -0,0 +1,4 @@
[develop]
script_dir=$base/lib/ad_api_visualizers
[install]
install_scripts=$base/lib/ad_api_visualizers
@@ -0,0 +1,31 @@
from warnings import simplefilter
from pkg_resources import PkgResourcesDeprecationWarning
from setuptools import SetuptoolsDeprecationWarning
from setuptools import setup
simplefilter("ignore", category=SetuptoolsDeprecationWarning)
simplefilter("ignore", category=PkgResourcesDeprecationWarning)
package_name = "ad_api_visualizers"
setup(
name=package_name,
version="0.0.0",
packages=[package_name],
data_files=[
("share/ament_index/resource_index/packages", [f"resource/{package_name}"]),
(f"share/{package_name}", ["package.xml"]),
(f"share/{package_name}/launch", [f"launch/{package_name}.launch.xml"]),
],
install_requires=["setuptools"],
zip_safe=True,
maintainer="Takagi, Isamu",
maintainer_email="isamu.takagi@tier4.jp",
description="The ad_api_visualizers package",
license="Apache License 2.0",
tests_require=["pytest"],
entry_points={
"console_scripts": ["planning_factors = ad_api_visualizers.planning_factors:main"],
},
)
@@ -0,0 +1,25 @@
# Copyright 2015 Open Source Robotics Foundation, 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.
from ament_copyright.main import main
import pytest
# Remove the `skip` decorator once the source file(s) have a copyright header
@pytest.mark.skip(reason="No copyright header has been placed in the generated source file.")
@pytest.mark.copyright
@pytest.mark.linter
def test_copyright():
rc = main(argv=[".", "test"])
assert rc == 0, "Found errors"
@@ -0,0 +1,23 @@
# Copyright 2015 Open Source Robotics Foundation, 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.
from ament_pep257.main import main
import pytest
@pytest.mark.linter
@pytest.mark.pep257
def test_pep257():
rc = main(argv=[".", "test"])
assert rc == 0, "Found code style errors / warnings"
@@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.14)
project(automatic_pose_initializer)
find_package(autoware_cmake REQUIRED)
autoware_package()
ament_auto_add_library(${PROJECT_NAME} SHARED
src/automatic_pose_initializer.cpp
)
rclcpp_components_register_node(${PROJECT_NAME}
PLUGIN "automatic_pose_initializer::AutomaticPoseInitializer"
EXECUTABLE ${PROJECT_NAME}_node
EXECUTOR MultiThreadedExecutor
)
ament_auto_package(INSTALL_TO_SHARE launch)
@@ -0,0 +1,11 @@
# automatic_pose_initializer
## automatic_pose_initializer
This node calls localization initialize API when the localization initialization state is uninitialized.
Since the API uses GNSS pose when no pose is specified, initialization using GNSS can be performed automatically.
| Interface | Local Name | Global Name | Description |
| ------------ | ---------- | -------------------------------------- | ------------------------------------------ |
| Subscription | - | /api/localization/initialization_state | The localization initialization state API. |
| Client | - | /api/localization/initialize | The localization initialize API. |
@@ -0,0 +1,6 @@
<launch>
<group>
<push-ros-namespace namespace="default_ad_api/helpers"/>
<node pkg="automatic_pose_initializer" exec="automatic_pose_initializer_node"/>
</group>
</launch>
@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>automatic_pose_initializer</name>
<version>0.1.0</version>
<description>The automatic_pose_initializer package</description>
<maintainer email="isamu.takagi@tier4.jp">Takagi, Isamu</maintainer>
<maintainer email="ryohsuke.mitsudome@tier4.jp">Ryohsuke Mitsudome</maintainer>
<maintainer email="yukihiro.saito@tier4.jp">Yukihiro Saito</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake_auto</buildtool_depend>
<buildtool_depend>autoware_cmake</buildtool_depend>
<depend>autoware_ad_api_specs</depend>
<depend>autoware_adapi_v1_msgs</depend>
<depend>component_interface_utils</depend>
<depend>rclcpp</depend>
<depend>rclcpp_components</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>autoware_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
@@ -0,0 +1,53 @@
// 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 "automatic_pose_initializer.hpp"
#include <memory>
namespace automatic_pose_initializer
{
AutomaticPoseInitializer::AutomaticPoseInitializer(const rclcpp::NodeOptions & options)
: Node("automatic_pose_initializer", options)
{
const auto adaptor = component_interface_utils::NodeAdaptor(this);
group_cli_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
adaptor.init_cli(cli_initialize_, group_cli_);
adaptor.init_sub(sub_state_, [this](const State::Message::ConstSharedPtr msg) { state_ = *msg; });
const auto period = rclcpp::Rate(1.0).period();
timer_ = rclcpp::create_timer(this, get_clock(), period, [this]() { on_timer(); });
state_.stamp = now();
state_.state = State::Message::UNKNOWN;
}
void AutomaticPoseInitializer::on_timer()
{
timer_->cancel();
if (state_.state == State::Message::UNINITIALIZED) {
try {
const auto req = std::make_shared<Initialize::Service::Request>();
cli_initialize_->call(req);
} catch (const component_interface_utils::ServiceException & error) {
}
}
timer_->reset();
}
} // namespace automatic_pose_initializer
#include <rclcpp_components/register_node_macro.hpp>
RCLCPP_COMPONENTS_REGISTER_NODE(automatic_pose_initializer::AutomaticPoseInitializer)
@@ -0,0 +1,43 @@
// 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 AUTOMATIC_POSE_INITIALIZER_HPP_
#define AUTOMATIC_POSE_INITIALIZER_HPP_
#include <autoware_ad_api_specs/localization.hpp>
#include <component_interface_utils/rclcpp.hpp>
#include <rclcpp/rclcpp.hpp>
namespace automatic_pose_initializer
{
class AutomaticPoseInitializer : public rclcpp::Node
{
public:
explicit AutomaticPoseInitializer(const rclcpp::NodeOptions & options);
private:
void on_timer();
using Initialize = autoware_ad_api::localization::Initialize;
using State = autoware_ad_api::localization::InitializationState;
rclcpp::CallbackGroup::SharedPtr group_cli_;
rclcpp::TimerBase::SharedPtr timer_;
component_interface_utils::Client<Initialize>::SharedPtr cli_initialize_;
component_interface_utils::Subscription<State>::SharedPtr sub_state_;
State::Message state_;
};
} // namespace automatic_pose_initializer
#endif // AUTOMATIC_POSE_INITIALIZER_HPP_
@@ -0,0 +1,47 @@
# Modified from https://github.com/ament/ament_lint/blob/master/ament_clang_format/ament_clang_format/configuration/.clang-format
Language: Cpp
BasedOnStyle: Google
AccessModifierOffset: -2
AlignAfterOpenBracket: AlwaysBreak
AllowShortFunctionsOnASingleLine: InlineOnly
BraceWrapping:
AfterClass: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
BreakBeforeBraces: Custom
ColumnLimit: 100
ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 2
DerivePointerAlignment: false
PointerAlignment: Middle
ReflowComments: true
IncludeCategories:
# C++ system headers
- Regex: <[a-z_]*>
Priority: 6
CaseSensitive: true
# C system headers
- Regex: <.*\.h>
Priority: 5
CaseSensitive: true
# Boost headers
- Regex: boost/.*
Priority: 4
CaseSensitive: true
# Message headers
- Regex: .*_msgs/.*
Priority: 3
CaseSensitive: true
- Regex: .*_srvs/.*
Priority: 3
CaseSensitive: true
# Other Package headers
- Regex: <.*>
Priority: 2
CaseSensitive: true
# Local package headers
- Regex: '".*"'
Priority: 1
CaseSensitive: true
@@ -0,0 +1,56 @@
## PR Type
<!-- Select one and remove others. If an appropriate one is not listed, please write by yourself. -->
- New Feature
- Improvement
- Bug Fix
## Related Links
<!-- Please write related links to GitHub/Jira/Slack/etc. -->
## Description
<!-- Describe what this PR changes. -->
## Review Procedure
<!-- Explain how to review this PR. -->
## Remarks
<!-- Write remarks as you like if you need them. -->
## Pre-Review Checklist for the PR Author
**PR Author should check the checkboxes below when creating the PR.**
- [ ] Code follows [coding guidelines][coding-guidelines]
- [ ] Assign PR to reviewer
## Checklist for the PR Reviewer
**Reviewers should check the checkboxes below before approval.**
- [ ] Commits are properly organized and messages are according to the guideline
- [ ] Code follows [coding guidelines][coding-guidelines]
- [ ] (Optional) Unit tests have been written for new behavior
- [ ] PR title describes the changes
## Post-Review Checklist for the PR Author
**PR Author should check the checkboxes below before merging.**
- [ ] All open points are addressed and tracked via issues or tickets
- [ ] Write [release notes][release-notes]
## CI Checks
- **Build and test for PR / build-and-test-pr**: Required to pass before the merge.
- **Build and test for PR / clang-tidy-pr**: NOT required to pass before the merge. It is up to the reviewer(s).
- **Check spelling**: NOT required to pass before the merge. It is up to the reviewer(s). See [here][spell-check-dict] if you want to add some words to the spell check dictionary.
[coding-guidelines]: https://tier4.atlassian.net/wiki/spaces/AIP/pages/1194394777/T4
[release-notes]: https://tier4.atlassian.net/wiki/spaces/AIP/pages/563774416
[spell-check-dict]: https://github.com/tier4/autoware-spell-check-dict#how-to-contribute
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: daily
open-pull-requests-limit: 1
labels:
- tag:bot
- type:github-actions

Some files were not shown because too many files have changed in this diff Show More