Initial import of FaRui Campus ADS v3.2
@@ -0,0 +1,39 @@
|
||||
* text=auto
|
||||
|
||||
# Large binary assets and ROS data should be stored with Git LFS.
|
||||
*.pcd filter=lfs diff=lfs merge=lfs -text
|
||||
*.db3 filter=lfs diff=lfs merge=lfs -text
|
||||
*.bag filter=lfs diff=lfs merge=lfs -text
|
||||
*.mcap filter=lfs diff=lfs merge=lfs -text
|
||||
*.onnx filter=lfs diff=lfs merge=lfs -text
|
||||
*.engine filter=lfs diff=lfs merge=lfs -text
|
||||
*.pt filter=lfs diff=lfs merge=lfs -text
|
||||
*.pth filter=lfs diff=lfs merge=lfs -text
|
||||
*.a filter=lfs diff=lfs merge=lfs -text
|
||||
*.so filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.gif filter=lfs diff=lfs merge=lfs -text
|
||||
# Common binary media.
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.dae binary
|
||||
*.stl binary
|
||||
*.pcd !text !filter !merge !diff
|
||||
*.db3 !text !filter !merge !diff
|
||||
*.bag !text !filter !merge !diff
|
||||
*.mcap !text !filter !merge !diff
|
||||
*.onnx !text !filter !merge !diff
|
||||
*.engine !text !filter !merge !diff
|
||||
*.pt !text !filter !merge !diff
|
||||
*.pth !text !filter !merge !diff
|
||||
*.a !text !filter !merge !diff
|
||||
*.so !text !filter !merge !diff
|
||||
*.zip !text !filter !merge !diff
|
||||
*.tar !text !filter !merge !diff
|
||||
*.tar.gz !text !filter !merge !diff
|
||||
*.tgz !text !filter !merge !diff
|
||||
*.gif !text !filter !merge !diff
|
||||
@@ -0,0 +1,51 @@
|
||||
# ROS 2 / colcon build outputs
|
||||
build/
|
||||
install/
|
||||
log/
|
||||
|
||||
# Python cache and virtual environments
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*.pyo
|
||||
*.pyd
|
||||
.venv/
|
||||
venv/
|
||||
env/
|
||||
|
||||
# CMake and native build outputs
|
||||
CMakeFiles/
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
compile_commands.json
|
||||
cmake-build-*/
|
||||
|
||||
# Runtime logs and local generated files
|
||||
*.log
|
||||
*.log.old
|
||||
*.old
|
||||
*.tmp
|
||||
*.bak
|
||||
core
|
||||
|
||||
# ROS bags and local recording outputs
|
||||
*.bag
|
||||
*.mcap.active
|
||||
|
||||
# IDE and assistant-local state
|
||||
.vscode/
|
||||
.idea/
|
||||
.claude
|
||||
.claude/
|
||||
.agents
|
||||
.agents/
|
||||
.codex
|
||||
.codex/
|
||||
|
||||
# VS Code C/C++ database files, kept explicit for safety if .vscode is unignored later.
|
||||
.vscode/browse.vc.db*
|
||||
.vscode/*.db
|
||||
.vscode/*.db-*
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
@@ -0,0 +1,253 @@
|
||||
# FaRui Autoware Dual-Orin Stack
|
||||
|
||||
`FaRui Autoware Dual-Orin Stack` 是一个面向实车部署的 ROS 2 /
|
||||
Autoware 工作空间。当前代码按双 Orin 主从域控架构组织:主控板负责上层
|
||||
Autoware 算法和任务工具,从控板负责车辆接口、CAN、控制和安全反馈。
|
||||
|
||||
## 项目标识
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| 正式名称 | FaRui Autoware Dual-Orin Stack |
|
||||
| 简称 | FaRui Stack |
|
||||
| 工作空间 ID | `farui_autoware_dual_orin` |
|
||||
| 主 launch 包 | `farui_launch` |
|
||||
| 车辆入口前缀 | `ecar_*` |
|
||||
| 默认车型 | `ecar_vehicle` |
|
||||
|
||||
工作空间名称用于文档、交付和仓库识别;ROS 包名仍保持现状。除非计划做完整
|
||||
迁移,不建议直接重命名 `farui_launch`、`ecar_vehicle_description`、
|
||||
`ecar_can_driver` 等包。
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统分为 `master/` 和 `slave/` 两个可独立编译、独立启动的 ROS 2 工作空间。
|
||||
两端通过 ROS 2 DDS 通信,主从板通常使用 CycloneDDS 和固定 `ROS_DOMAIN_ID`
|
||||
进行发现。
|
||||
|
||||
| 模块 | Master Orin | Slave Orin |
|
||||
| --- | --- | --- |
|
||||
| 地图、感知、定位、规划 | 是 | 否 |
|
||||
| 传感器驱动、点云容器 | 是 | 否 |
|
||||
| Autoware API、RViz、任务路线工具 | 是 | 否 |
|
||||
| Control 控制模块 | 否 | 是 |
|
||||
| SocketCAN、ECAR CAN 驱动 | 否 | 是 |
|
||||
| 车辆状态、速度转换、system 反馈 | 否 | 是 |
|
||||
| 心跳监控、MRM 相关安全反馈 | 否 | 是 |
|
||||
|
||||
主要跨板话题包括:
|
||||
|
||||
| 话题 | 方向 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `/planning/scenario_planning/trajectory` | Master -> Slave | 规划轨迹输入控制 |
|
||||
| `/localization/kinematic_state` | Master -> Slave | 定位状态同步 |
|
||||
| `/sensing/vehicle_velocity_converter/twist_with_covariance` | Slave -> Master | 车速反馈给定位链路 |
|
||||
| `/system/operation_mode/state` | Slave -> Master | 运行模式状态反馈 |
|
||||
| `/vehicle/status/*` | Slave -> Master | 车辆底盘状态反馈 |
|
||||
| `/control/command/control_cmd` | Slave 内部 | 控制模块到车辆接口 |
|
||||
|
||||
## 目录结构
|
||||
|
||||
```text
|
||||
.
|
||||
├── master/ # 主控板工作空间
|
||||
│ ├── src/ # Autoware、驱动、UI、地图、规划等 ROS 包
|
||||
│ ├── debug/ # 主控板调试脚本
|
||||
│ ├── build.sh # 主控板编译入口
|
||||
│ ├── run_ecar_master_debug.sh
|
||||
│ └── run_preset_route_real_vehicle.sh
|
||||
├── slave/ # 从控板工作空间
|
||||
│ ├── src/ # 控制、车辆接口、CAN、system 等 ROS 包
|
||||
│ ├── debug/ # 从控板诊断脚本
|
||||
│ ├── build.sh # 从控板编译入口
|
||||
│ └── run_slave_real_vehicle.sh
|
||||
└── README.md
|
||||
```
|
||||
|
||||
核心 launch 包位于:
|
||||
|
||||
- `master/src/Launcher/farui_launch`
|
||||
- `slave/src/Launcher/farui_launch`
|
||||
|
||||
主从实车启动文件为:
|
||||
|
||||
- `master/src/Launcher/farui_launch/launch/ecar_master.launch.xml`
|
||||
- `slave/src/Launcher/farui_launch/launch/ecar_slave.launch.xml`
|
||||
|
||||
## 编译
|
||||
|
||||
分别在主控板和从控板进入对应工作空间执行编译脚本。脚本内部使用
|
||||
`colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release`,并设置
|
||||
`AUTOWARE_COMPILE_WITH_CUDA=1`。
|
||||
|
||||
主控板:
|
||||
|
||||
```bash
|
||||
cd /home/nvidia/FaRui/v3.2/master
|
||||
./build.sh
|
||||
```
|
||||
|
||||
从控板:
|
||||
|
||||
```bash
|
||||
cd /home/nvidia/FaRui/v3.2/slave
|
||||
./build.sh
|
||||
```
|
||||
|
||||
如果只想编译部分包,可以按脚本内注释打开 `--packages-select`。
|
||||
|
||||
## 实车启动
|
||||
|
||||
建议先启动从控板,再启动主控板。这样车辆接口、CAN、控制和 system 状态先就绪,
|
||||
主控板启动规划和任务工具后可以直接收到车辆反馈。
|
||||
|
||||
### 1. 启动从控板
|
||||
|
||||
```bash
|
||||
cd /home/nvidia/FaRui/v3.2/slave
|
||||
./run_slave_real_vehicle.sh
|
||||
```
|
||||
|
||||
可选位置参数:
|
||||
|
||||
```bash
|
||||
./run_slave_real_vehicle.sh [车型] [CAN接口] [CAN波特率]
|
||||
```
|
||||
|
||||
常用环境变量:
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `SLAVE_VEHICLE_MODEL` | `ecar_vehicle` | 车型 |
|
||||
| `SLAVE_CAN_INTERFACE` | `can1` | CAN 接口 |
|
||||
| `SLAVE_CAN_BITRATE` | `500000` | CAN 波特率 |
|
||||
| `SLAVE_CONFIGURE_CAN` | `false` | 是否由脚本执行 `sudo ip link` 配置 CAN |
|
||||
| `SLAVE_LAUNCH_HEARTBEAT` | `true` | 是否启动主控板心跳监控 |
|
||||
| `SLAVE_LAUNCH_SYSTEM` | `true` | 是否启动 system 反馈栈 |
|
||||
|
||||
### 2. 启动主控板调试栈
|
||||
|
||||
只启动主控板 Autoware,不启动预设路线 UI:
|
||||
|
||||
```bash
|
||||
cd /home/nvidia/FaRui/v3.2/master
|
||||
./run_ecar_master_debug.sh
|
||||
```
|
||||
|
||||
可选位置参数:
|
||||
|
||||
```bash
|
||||
./run_ecar_master_debug.sh [地图目录] [是否启动RViz] [车型]
|
||||
```
|
||||
|
||||
默认地图目录为 `/home/nvidia/FaRui-test/map/School06`,默认 RViz 为 `true`。
|
||||
|
||||
### 3. 启动主控板和预设路线工具
|
||||
|
||||
```bash
|
||||
cd /home/nvidia/FaRui/v3.2/master
|
||||
./run_preset_route_real_vehicle.sh
|
||||
```
|
||||
|
||||
默认模式是 `ui-only`,只打开预设路线 UI,不启动主板 Autoware 栈。完整参数为:
|
||||
|
||||
```bash
|
||||
./run_preset_route_real_vehicle.sh [模式] [站点文件] [是否启动RViz] [地图目录] [车型]
|
||||
```
|
||||
|
||||
支持模式:
|
||||
|
||||
| 模式 | 说明 |
|
||||
| --- | --- |
|
||||
| `ui-only` | 只启动预设路线 UI |
|
||||
| `none` | 启动主板 Autoware,不启动额外路线工具 |
|
||||
| `record` | 启动站点记录工具 |
|
||||
| `replay` | 启动预设路线发送工具 |
|
||||
| `mission` | 启动站点任务管理器 |
|
||||
|
||||
示例:
|
||||
|
||||
```bash
|
||||
# 只启动主板 Autoware,不启动路线工具
|
||||
./run_preset_route_real_vehicle.sh none
|
||||
|
||||
# 启动主板 Autoware + 站点任务管理器
|
||||
./run_preset_route_real_vehicle.sh mission
|
||||
|
||||
# 指定地图并关闭 RViz
|
||||
./run_preset_route_real_vehicle.sh mission "" false /home/nvidia/FaRui-test/map/School06
|
||||
```
|
||||
|
||||
## 双 Orin 网络与 DDS
|
||||
|
||||
双 Orin 配置文件在两端都有副本:
|
||||
|
||||
- `master/env_config/dual_orin`
|
||||
- `slave/env_config/dual_orin`
|
||||
|
||||
主要内容:
|
||||
|
||||
| 路径 | 作用 |
|
||||
| --- | --- |
|
||||
| `dds/cyclonedds_dual_orin.xml` | CycloneDDS 配置 |
|
||||
| `netplan/master-netplan.yaml` | 主控板静态 IP 示例 |
|
||||
| `netplan/slave-netplan.yaml` | 从控板静态 IP 示例 |
|
||||
| `netplan/hosts` | `/etc/hosts` 示例 |
|
||||
| `scripts/setup_master.sh` | 主控板一键配置脚本 |
|
||||
| `scripts/setup_slave.sh` | 从控板一键配置脚本 |
|
||||
| `scripts/setup_dds.sh` | DDS 配置辅助脚本 |
|
||||
| `scripts/test_connection.sh` | 网络连通性测试 |
|
||||
| `scripts/heartbeat_monitor.sh` | 从控板心跳监控 |
|
||||
|
||||
典型环境变量:
|
||||
|
||||
```bash
|
||||
export ROS_DOMAIN_ID=42
|
||||
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
export CYCLONEDDS_URI=file:///opt/cyclonedds.xml
|
||||
export VEHICLE_ID=ecar_001
|
||||
```
|
||||
|
||||
## 开机配置
|
||||
|
||||
`master/env_config` 和 `slave/env_config` 提供 systemd 开机配置模板,主要用于:
|
||||
|
||||
- 配置 CAN 接口
|
||||
- 配置串口权限
|
||||
- 按顺序执行 `startup.d/` 下的启动脚本
|
||||
- 记录 `startup.log`
|
||||
|
||||
安装服务前先检查 `env_config/config.sh` 中的路径是否指向当前工作空间。
|
||||
|
||||
## 调试与检查
|
||||
|
||||
常用诊断入口:
|
||||
|
||||
```bash
|
||||
# 主控板规划链路检查
|
||||
cd /home/nvidia/FaRui/v3.2/master
|
||||
./debug/check_planning_pipeline.sh
|
||||
|
||||
# 从控板 control、system、CAN 链路检查
|
||||
cd /home/nvidia/FaRui/v3.2/slave
|
||||
./debug/check_system_driver_pipeline.sh
|
||||
```
|
||||
|
||||
常用 ROS 检查命令:
|
||||
|
||||
```bash
|
||||
ros2 node list
|
||||
ros2 topic list
|
||||
ros2 topic echo /planning/scenario_planning/trajectory
|
||||
ros2 topic echo /system/operation_mode/state
|
||||
ros2 topic echo /vehicle/status/velocity_status
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- `master/` 和 `slave/` 是两个独立 ROS 2 工作空间,编译和启动时应分别进入对应目录。
|
||||
- 主从板必须使用一致的 `ROS_DOMAIN_ID`、RMW 实现和 DDS 配置。
|
||||
- 实车启动前确认地图目录、车型配置、CAN 接口、车辆标定文件均存在。
|
||||
- 从控板默认不自动配置 CAN。需要脚本配置 CAN 时设置 `SLAVE_CONFIGURE_CAN=true`。
|
||||
- 当前工作空间路径为 `/home/nvidia/FaRui/v3.2`;如果复制到其他路径,需要同步检查脚本和
|
||||
`env_config/config.sh` 中的硬编码路径。
|
||||
@@ -0,0 +1,94 @@
|
||||
# Git 上传准备记录
|
||||
|
||||
本文记录当前工作空间上传 Git 前已经完成的准备,以及后续推送远端时需要注意的事项。
|
||||
|
||||
## 已处理
|
||||
|
||||
- 已新增根目录 `.gitignore`,排除 colcon 构建产物、Python 缓存、日志、IDE 数据库和本地助手状态目录。
|
||||
- 已新增根目录 `.gitattributes`,将 `.pcd`、`.db3`、`.bag`、`.mcap`、模型文件、静态库、动态库、压缩包和较大的 GIF 标记为 Git LFS 文件。
|
||||
- 已确认本机安装了 Git LFS:`git-lfs/3.0.2`。
|
||||
- 已确认当前未发现 `build/`、`install/`、`log/` 目录。
|
||||
- 已备份并删除无效/嵌套 `.git/` 元数据,备份目录为 `/tmp/farui_git_metadata_backup_20260605_132216`。
|
||||
- 已初始化根目录 Git 仓库,当前分支为 `main`。
|
||||
- 已创建本地初始提交,提交信息为 `Initial import of FaRui Autoware Dual-Orin Stack`。
|
||||
- 已规范 Git 中的 executable bit,仅保留带 shebang 的脚本为可执行。
|
||||
|
||||
## 当前仓库状态
|
||||
|
||||
- 根目录只有一个有效 `.git/`。
|
||||
- 工作区当前为 clean 状态。
|
||||
- 当前未配置远端仓库。
|
||||
- 当前有 26 个文件由 Git LFS 管理。
|
||||
|
||||
## 大文件
|
||||
|
||||
当前最大本地生成物是 `.vscode/browse.vc.db`,约 867 MB,已通过 `.gitignore` 排除。
|
||||
|
||||
仍然建议使用 Git LFS 管理以下类型的大文件:
|
||||
|
||||
- 点云和地图测试数据:`*.pcd`
|
||||
- ROS bag 数据:`*.db3`、`*.bag`、`*.mcap`
|
||||
- SDK 或第三方二进制库:`*.a`、`*.so`
|
||||
- 模型和推理制品:`*.onnx`、`*.engine`、`*.pt`、`*.pth`
|
||||
- 压缩包和大型演示图:`*.zip`、`*.tar*`、`*.gif`
|
||||
|
||||
### 嵌套 Git 仓库
|
||||
|
||||
工作空间内存在多个嵌套 `.git/` 目录。若直接在根目录提交,Git 会把这些目录识别为
|
||||
嵌入式仓库或 submodule 风格条目,容易导致克隆后源码不完整。
|
||||
|
||||
建议二选一:
|
||||
|
||||
- 作为 vendored source:记录来源和 commit 后,删除内部 `.git/` 目录,把源码完整纳入主仓库。当前初始提交采用此方式。
|
||||
- 作为 submodule:在根仓库中正式配置 `.gitmodules`,由 Git 管理第三方依赖版本。
|
||||
|
||||
当前记录到的嵌套仓库如下:
|
||||
|
||||
| 路径 | Commit | Remote |
|
||||
| --- | --- | --- |
|
||||
| `master/src/Api/tier4_ad_api_adaptor` | `3de19bc` | `https://github.com/tier4/tier4_ad_api_adaptor.git` |
|
||||
| `master/src/Driver/Camera/hikvision_ros2_driver` | `a2f8538` | `https://github.com/sjtu-cyberc3/hikvision_ros2_driver.git` |
|
||||
| `master/src/Driver/Vehicle/ros2_socketcan` | `85da8c3` | `https://github.com/autowarefoundation/ros2_socketcan` |
|
||||
| `master/src/Mapping/fast_lio2` | `18418bc` | `https://github.com/Ericsii/FAST_LIO_ROS2.git` |
|
||||
| `master/src/Mapping/liorf` | `da22fa0` | `https://github.com/YJZLuckyBoy/liorf.git` |
|
||||
| `master/src/Mapping/livox_ros_driver2` | `378d1c7` | `https://github.com/Ericsii/livox_ros_driver2.git` |
|
||||
| `master/src/Vehicle/sensor_component_description` | `0798200` | `https://github.com/tier4/sensor_component_description.git` |
|
||||
| `master/src/universe/common/glog` | `ea36766` | `https://github.com/tier4/glog.git` |
|
||||
| `master/src/universe/common/muSSP` | `c79e98f` | `https://github.com/tier4/muSSP.git` |
|
||||
| `master/src/universe/core/autoware_cmake` | `890e312` | `https://github.com/autowarefoundation/autoware_cmake.git` |
|
||||
| `master/src/universe/core/autoware_common` | `6752ca7` | `https://github.com/autowarefoundation/autoware_common.git` |
|
||||
| `master/src/universe/core/autoware_lanelet2_extension` | `6fc35a0` | `https://github.com/autowarefoundation/autoware_lanelet2_extension.git` |
|
||||
| `master/src/universe/core/autoware_msgs/autoware_adapi_msgs` | `2512a4f` | `https://github.com/autowarefoundation/autoware_adapi_msgs.git` |
|
||||
| `master/src/universe/core/autoware_msgs/autoware_internal_msgs` | `4f5feff` | `https://github.com/autowarefoundation/autoware_internal_msgs.git` |
|
||||
| `master/src/universe/core/autoware_msgs/autoware_msgs` | `4f9f1c0` | `https://github.com/autowarefoundation/autoware_msgs.git` |
|
||||
| `master/src/universe/core/autoware_utils` | `451419e` | `https://github.com/autowarefoundation/autoware_utils.git` |
|
||||
| `slave/src/Api/tier4_ad_api_adaptor` | `3de19bc` | `https://github.com/tier4/tier4_ad_api_adaptor.git` |
|
||||
| `slave/src/Driver/Vehicle/Pixkit_Chassis_Driver/pix_driver` | `a0c4902` | `https://github.com/pixmoving-moveit/pix_driver.git` |
|
||||
| `slave/src/Driver/Vehicle/ros2_socketcan` | `85da8c3` | `https://github.com/autowarefoundation/ros2_socketcan` |
|
||||
| `slave/src/Vehicle/sensor_component_description` | `0798200` | `https://github.com/tier4/sensor_component_description.git` |
|
||||
| `slave/src/universe/core/autoware_cmake` | `890e312` | `https://github.com/autowarefoundation/autoware_cmake.git` |
|
||||
| `slave/src/universe/core/autoware_common` | `6752ca7` | `https://github.com/autowarefoundation/autoware_common.git` |
|
||||
| `slave/src/universe/core/autoware_lanelet2_extension` | `6fc35a0` | `https://github.com/autowarefoundation/autoware_lanelet2_extension.git` |
|
||||
| `slave/src/universe/core/autoware_msgs/autoware_adapi_msgs` | `2512a4f` | `https://github.com/autowarefoundation/autoware_adapi_msgs.git` |
|
||||
| `slave/src/universe/core/autoware_msgs/autoware_internal_msgs` | `4f5feff` | `https://github.com/autowarefoundation/autoware_internal_msgs.git` |
|
||||
| `slave/src/universe/core/autoware_msgs/autoware_msgs` | `4f9f1c0` | `https://github.com/autowarefoundation/autoware_msgs.git` |
|
||||
| `slave/src/universe/core/autoware_utils` | `451419e` | `https://github.com/autowarefoundation/autoware_utils.git` |
|
||||
|
||||
## 后续推送流程
|
||||
|
||||
添加远端仓库后推送:
|
||||
|
||||
```bash
|
||||
git remote add origin <远端仓库地址>
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
如果远端平台需要 Git LFS,请确认远端仓库已启用 LFS,并在推送前执行:
|
||||
|
||||
```bash
|
||||
git lfs install
|
||||
git lfs ls-files
|
||||
```
|
||||
|
||||
如果以后决定改成 submodule 管理第三方依赖,需要从当前单体仓库方式重新设计
|
||||
`.gitmodules`,并替换对应目录的 vendored source。
|
||||
@@ -0,0 +1,37 @@
|
||||
#!/usr/bin/env bash
|
||||
# ---------------------------------------------------------
|
||||
# Autoware 编译脚本
|
||||
# ---------------------------------------------------------
|
||||
set -euo pipefail
|
||||
|
||||
readonly RED='\033[0;31m'
|
||||
readonly GREEN='\033[0;32m'
|
||||
readonly NC='\033[0m'
|
||||
|
||||
log() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
warn() { echo -e "${RED}[WARN]${NC} $*" >&2; }
|
||||
|
||||
BUILD_ARGS=(
|
||||
colcon build
|
||||
--symlink-install
|
||||
--cmake-args -DCMAKE_BUILD_TYPE=Release
|
||||
)
|
||||
|
||||
# 如需部分包编译,把 xxx 换成包名后取消下一行注释
|
||||
#BUILD_ARGS+=(--packages-select ecar_vehicle_description)
|
||||
|
||||
log "Starting colcon build..."
|
||||
if AUTOWARE_COMPILE_WITH_CUDA=1 "${BUILD_ARGS[@]}"; then
|
||||
log "Build succeeded. Sourcing workspace..."
|
||||
|
||||
# 临时关闭 -u,避免 COLCON_TRACE 未定义报错
|
||||
set +u
|
||||
source install/setup.bash
|
||||
set -u
|
||||
|
||||
log "Done."
|
||||
else
|
||||
warn "Build failed, skip sourcing."
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,275 @@
|
||||
#!/bin/bash
|
||||
#===============================================================================
|
||||
# 加减速映射表标定启动脚本
|
||||
# 位置: /home/nvidia/FaRui/v3.1/calibrate_accel_brake_map.sh
|
||||
#===============================================================================
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 默认参数
|
||||
VEHICLE_MODEL="ecar_vehicle"
|
||||
USE_SIM_TIME="false"
|
||||
RVIZ="true"
|
||||
RECORD_BAG="false"
|
||||
UPDATE_METHOD="update_offset_four_cell_around"
|
||||
|
||||
# 帮助信息
|
||||
show_help() {
|
||||
echo "============================================================"
|
||||
echo " 加减速映射表标定工具"
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
echo "用法: ./calibrate_accel_brake_map.sh [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " -m, --model <车型> 车辆模型名称 (默认: ecar404)"
|
||||
echo " -s, --sim-time 使用仿真时间 (rosbag回放时使用)"
|
||||
echo " -n, --no-rviz 不启动RViz"
|
||||
echo " -r, --record 录制数据到rosbag"
|
||||
echo " -c, --cell 使用逐网格标定算法 (默认: 四邻域)"
|
||||
echo " -h, --help 显示此帮助信息"
|
||||
echo ""
|
||||
echo "标定模式:"
|
||||
echo " 1. 实车标定: ./calibrate_accel_brake_map.sh"
|
||||
echo " 2. rosbag标定: ./calibrate_accel_brake_map.sh -s"
|
||||
echo " 3. 高精度标定: ./calibrate_accel_brake_map.sh -c"
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
}
|
||||
|
||||
# 解析参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-m|--model)
|
||||
VEHICLE_MODEL="$2"
|
||||
shift 2
|
||||
;;
|
||||
-s|--sim-time)
|
||||
USE_SIM_TIME="true"
|
||||
shift
|
||||
;;
|
||||
-n|--no-rviz)
|
||||
RVIZ="false"
|
||||
shift
|
||||
;;
|
||||
-r|--record)
|
||||
RECORD_BAG="true"
|
||||
shift
|
||||
;;
|
||||
-c|--cell)
|
||||
UPDATE_METHOD="update_offset_each_cell"
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}错误: 未知参数 $1${NC}"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# 获取脚本所在目录
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
echo "============================================================"
|
||||
echo -e "${BLUE} 加减速映射表标定工具${NC}"
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
|
||||
# 检查工作空间
|
||||
if [ ! -f "install/setup.bash" ]; then
|
||||
echo -e "${RED}错误: 未找到 install/setup.bash${NC}"
|
||||
echo "请先编译工作空间: colcon build"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Source 环境
|
||||
echo -e "${BLUE}[1/6] 加载 ROS2 环境...${NC}"
|
||||
source /opt/ros/humble/setup.bash
|
||||
source install/setup.bash
|
||||
|
||||
# 检查 launch 文件是否存在
|
||||
LAUNCH_FILE="src/Launcher/farui_launch/launch/calibration/accel_brake_map_calibration.launch.xml"
|
||||
if [ ! -f "$LAUNCH_FILE" ]; then
|
||||
echo -e "${RED}错误: 未找到标定 launch 文件${NC}"
|
||||
echo "路径: $LAUNCH_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建标定结果目录
|
||||
CALIBRATION_DIR="$SCRIPT_DIR/src/Launcher/farui_launch/config/vehicle/calibrated_maps"
|
||||
mkdir -p "$CALIBRATION_DIR"
|
||||
|
||||
echo -e "${GREEN}✓ 环境加载完成${NC}"
|
||||
echo ""
|
||||
|
||||
# 显示配置信息
|
||||
echo -e "${BLUE}[2/6] 标定配置信息:${NC}"
|
||||
echo " 车辆模型: $VEHICLE_MODEL"
|
||||
echo " 仿真时间: $USE_SIM_TIME"
|
||||
echo " RViz可视化: $RVIZ"
|
||||
echo " 录制数据: $RECORD_BAG"
|
||||
echo " 标定算法: $UPDATE_METHOD"
|
||||
echo " 结果保存路径: $CALIBRATION_DIR"
|
||||
echo ""
|
||||
|
||||
# 检查车辆模型是否存在
|
||||
VEHICLE_PKG="${VEHICLE_MODEL}_description"
|
||||
if ! ros2 pkg list | grep "^$VEHICLE_PKG$" > /dev/null 2>&1; then
|
||||
echo -e "${YELLOW}警告: 未找到车辆模型包 $VEHICLE_PKG${NC}"
|
||||
echo "可用的车辆模型:"
|
||||
ros2 pkg list | grep "_description$" | sed 's/_description$//' | head -10
|
||||
echo ""
|
||||
read -p "是否继续? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 如果录制数据,创建bag目录
|
||||
if [ "$RECORD_BAG" = "true" ]; then
|
||||
BAG_DIR="$SCRIPT_DIR/calibration_bags"
|
||||
mkdir -p "$BAG_DIR"
|
||||
BAG_NAME="calibration_$(date +%Y%m%d_%H%M%S)"
|
||||
fi
|
||||
|
||||
# 启动标定
|
||||
echo -e "${BLUE}[3/6] 启动标定节点...${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}提示: 标定过程中请进行以下操作:${NC}"
|
||||
echo " 1. 确保车辆在安全开阔场地"
|
||||
echo " 2. 使用遥控器控制车辆"
|
||||
echo " 3. 平稳加速、减速,覆盖各种速度"
|
||||
echo " 4. 观察RViz中单元格变红表示数据充足"
|
||||
echo " 5. 重点关注 0-6m/s 低速区间"
|
||||
echo ""
|
||||
read -p "按回车键开始标定,或按 Ctrl+C 取消..."
|
||||
echo ""
|
||||
|
||||
# 构建 launch 参数
|
||||
LAUNCH_ARGS="vehicle_model:=$VEHICLE_MODEL"
|
||||
LAUNCH_ARGS="$LAUNCH_ARGS use_sim_time:=$USE_SIM_TIME"
|
||||
LAUNCH_ARGS="$LAUNCH_ARGS rviz:=$RVIZ"
|
||||
LAUNCH_ARGS="$LAUNCH_ARGS update_method:=$UPDATE_METHOD"
|
||||
LAUNCH_ARGS="$LAUNCH_ARGS progress_file_output:=true"
|
||||
LAUNCH_ARGS="$LAUNCH_ARGS pedal_accel_graph_output:=true"
|
||||
|
||||
# 启动 rosbag 录制(后台)
|
||||
if [ "$RECORD_BAG" = "true" ]; then
|
||||
echo -e "${BLUE}[4/6] 启动数据录制...${NC}"
|
||||
ros2 bag record -o "$BAG_DIR/$BAG_NAME" \
|
||||
/vehicle/status/velocity_status \
|
||||
/vehicle/status/steering_status \
|
||||
/vehicle/status/actuation_status \
|
||||
/control/command/actuation_cmd \
|
||||
/tf \
|
||||
/tf_static \
|
||||
&
|
||||
BAG_PID=$!
|
||||
echo -e "${GREEN}✓ 数据录制已启动,PID: $BAG_PID${NC}"
|
||||
echo " 保存路径: $BAG_DIR/$BAG_NAME"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# 启动标定
|
||||
echo -e "${BLUE}[5/6] 启动标定器...${NC}"
|
||||
echo " 命令: ros2 launch farui_launch accel_brake_map_calibration.launch.xml $LAUNCH_ARGS"
|
||||
echo ""
|
||||
|
||||
# 捕获 Ctrl+C 信号
|
||||
cleanup() {
|
||||
echo ""
|
||||
echo -e "${YELLOW}接收到中断信号,正在清理...${NC}"
|
||||
if [ "$RECORD_BAG" = "true" ] && [ -n "$BAG_PID" ]; then
|
||||
echo "停止数据录制..."
|
||||
kill $BAG_PID 2>/dev/null || true
|
||||
wait $BAG_PID 2>/dev/null || true
|
||||
fi
|
||||
echo -e "${GREEN}✓ 已清理${NC}"
|
||||
exit 0
|
||||
}
|
||||
trap cleanup SIGINT SIGTERM
|
||||
|
||||
# 启动标定节点
|
||||
ros2 launch farui_launch accel_brake_map_calibration.launch.xml $LAUNCH_ARGS &
|
||||
LAUNCH_PID=$!
|
||||
|
||||
# 等待标定节点启动
|
||||
sleep 3
|
||||
|
||||
# 检查节点是否正常运行
|
||||
if ! ps -p $LAUNCH_PID > /dev/null; then
|
||||
echo -e "${RED}错误: 标定节点启动失败${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ 标定节点已启动${NC}"
|
||||
echo ""
|
||||
|
||||
# 显示操作提示
|
||||
echo "============================================================"
|
||||
echo -e "${BLUE} 标定操作指南${NC}"
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
echo "1. ${YELLOW}驾驶车辆${NC}: 使用遥控器控制车辆"
|
||||
echo " - 平稳加速、减速"
|
||||
echo " - 覆盖 0-最大车速 范围"
|
||||
echo " - 覆盖 0-最大踏板开度 范围"
|
||||
echo ""
|
||||
echo "2. ${YELLOW}观察进度${NC}: 查看RViz可视化"
|
||||
echo " - 灰色: 无数据"
|
||||
echo " - 蓝色→红色: 数据逐渐充足"
|
||||
echo " - 目标: 所有单元格变红"
|
||||
echo ""
|
||||
echo "3. ${YELLOW}保存结果${NC}: 新开终端执行"
|
||||
echo " ros2 service call /accel_brake_map_calibrator/update_map_dir \\"
|
||||
echo " tier4_vehicle_msgs/srv/UpdateAccelBrakeMap \\"
|
||||
echo " \"path: '$CALIBRATION_DIR'\""
|
||||
echo ""
|
||||
echo "4. ${YELLOW}查看误差${NC}:"
|
||||
echo " ros2 topic echo /accel_brake_map_calibrator/output/map_error_ratio"
|
||||
echo " (比值 < 0.7 表示标定有效)"
|
||||
echo ""
|
||||
echo "5. ${YELLOW}结束标定${NC}: 在此窗口按 Ctrl+C"
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
|
||||
# 等待用户结束
|
||||
wait $LAUNCH_PID
|
||||
|
||||
# 标定结束后的提示
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
echo -e "${BLUE} 标定已结束${NC}"
|
||||
echo "============================================================"
|
||||
echo ""
|
||||
echo -e "${GREEN}标定结果保存在:${NC}"
|
||||
echo " $CALIBRATION_DIR/"
|
||||
echo ""
|
||||
echo "生成的文件:"
|
||||
ls -lh "$CALIBRATION_DIR/" 2>/dev/null || echo " (目录为空,请检查是否已调用保存服务)"
|
||||
echo ""
|
||||
echo "下一步:"
|
||||
echo " 1. 检查 accel_map.csv 和 brake_map.csv 是否生成"
|
||||
echo " 2. 修改 raw_vehicle_cmd_converter 配置使用新表"
|
||||
echo " 3. 重启 Autoware 验证效果"
|
||||
echo ""
|
||||
echo "============================================================"
|
||||
|
||||
|
||||
# ros2 service call /accel_brake_map_calibrator/input/update_map_dir tier4_vehicle_msgs/srv/UpdateAccelBrakeMap "path: '/home/nvidia/FaRui-test/v3.2/src/Launcher/farui_launch/config/vehicle/calibrated_maps'"
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env bash
|
||||
# Clean leftover master-board Autoware/debug processes.
|
||||
#
|
||||
# 用法:
|
||||
# ./cleanup_master_autoware.sh
|
||||
#
|
||||
# 说明:
|
||||
# 这个脚本用于主板调试后清理残留进程。
|
||||
# 如果你在同一块板上故意运行从板底盘驱动,不要执行本脚本,
|
||||
# 因为它会停止 ecar_can/socket_can 相关节点。
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
|
||||
PATTERNS=(
|
||||
"run_ecar_master_debug.sh"
|
||||
"run_preset_route_real_vehicle.sh"
|
||||
"ros2 launch.*ecar_master"
|
||||
"ros2 launch.*farui_launch"
|
||||
"launch_ros_[0-9]+"
|
||||
"launch_ros"
|
||||
"component_container"
|
||||
"component_container_mt"
|
||||
"timoo_ros"
|
||||
"pointcloud_process"
|
||||
"map_hash_generator"
|
||||
"imu_corrector"
|
||||
"gyro_bias_validator"
|
||||
"hipnuc"
|
||||
"imu_sub"
|
||||
"rqt_gui"
|
||||
"rqt_gui_py_node"
|
||||
"rviz2"
|
||||
"ecar_can"
|
||||
"ecar_can_receiver"
|
||||
"ecar_can_sender"
|
||||
"socket_can"
|
||||
"socket_can_receiver"
|
||||
"socket_can_sender"
|
||||
)
|
||||
|
||||
terminate_patterns() {
|
||||
local signal="$1"
|
||||
local pattern
|
||||
|
||||
for pattern in "${PATTERNS[@]}"; do
|
||||
pkill "-${signal}" -f "${pattern}" 2>/dev/null || true
|
||||
done
|
||||
}
|
||||
|
||||
log_info "Sending TERM to leftover master Autoware processes."
|
||||
terminate_patterns TERM
|
||||
sleep 3
|
||||
|
||||
if pgrep -f "component_container|component_container_mt|timoo_ros|map_hash_generator|imu_corrector|gyro_bias_validator|ecar_can|socket_can|rviz2|rqt_gui|launch_ros|ecar_can_receiver|ecar_can_sender|socket_can_receiver|socket_can_sender" >/dev/null 2>&1; then
|
||||
log_warn "Some processes are still alive; sending KILL."
|
||||
terminate_patterns KILL
|
||||
sleep 1
|
||||
fi
|
||||
|
||||
log_info "Restarting ROS daemon to refresh node discovery."
|
||||
ros2 daemon stop >/dev/null 2>&1 || true
|
||||
ros2 daemon start >/dev/null 2>&1 || true
|
||||
|
||||
log_info "Remaining matching processes:"
|
||||
ps -ef | grep -E 'autoware|component_container|rviz2|timoo|ros2 launch|launch_ros|preset_route|ecar_can|socket_can|imu_corrector|gyro_bias|map_hash|rqt_gui' | grep -v grep || true
|
||||
|
||||
log_info "Remaining ROS nodes:"
|
||||
ros2 node list 2>/dev/null || true
|
||||
|
||||
@@ -0,0 +1,251 @@
|
||||
#!/usr/bin/env bash
|
||||
# 打印 RViz goal 到 planning trajectory 链路上的关键 topic/service 状态。
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
workspace_root="$(cd "${script_dir}/.." && pwd)"
|
||||
ros_setup_file="${ROS_SETUP_FILE:-/opt/ros/${ROS_DISTRO:-humble}/setup.bash}"
|
||||
|
||||
set +u
|
||||
if [[ -f "${ros_setup_file}" ]]; then
|
||||
source "${ros_setup_file}"
|
||||
fi
|
||||
if [[ -f "${workspace_root}/install/setup.bash" ]]; then
|
||||
source "${workspace_root}/install/setup.bash"
|
||||
else
|
||||
log_warn "未找到工作空间 setup 文件: ${workspace_root}/install/setup.bash"
|
||||
log_warn "如果当前 shell 没有手动 source 正确的 install,后续 ros2 查询可能看不到本工作空间的包和节点。"
|
||||
fi
|
||||
set -u
|
||||
|
||||
node_check() {
|
||||
local node="$1"
|
||||
echo
|
||||
log_info "检查 node: ${node}"
|
||||
if ros2 node list | grep -Fx "${node}" >/dev/null; then
|
||||
echo "存在"
|
||||
else
|
||||
log_warn "缺少 node: ${node}"
|
||||
fi
|
||||
}
|
||||
|
||||
component_check() {
|
||||
local container="$1"
|
||||
echo
|
||||
log_info "检查 composable container: ${container}"
|
||||
if ! ros2 node list | grep -Fx "${container}" >/dev/null; then
|
||||
log_warn "容器不存在: ${container}"
|
||||
return
|
||||
fi
|
||||
|
||||
if ! timeout 3s ros2 component list "${container}"; then
|
||||
log_warn "读取容器组件失败: ${container}"
|
||||
fi
|
||||
}
|
||||
|
||||
topic_info() {
|
||||
local topic="$1"
|
||||
echo
|
||||
log_info "检查 topic 信息: ${topic}"
|
||||
if ! timeout 3s ros2 topic info -v "${topic}"; then
|
||||
log_warn "读取 topic 信息失败: ${topic}"
|
||||
fi
|
||||
}
|
||||
|
||||
topic_once() {
|
||||
local topic="$1"
|
||||
echo
|
||||
log_info "读取一次 topic 消息: ${topic}"
|
||||
if ! timeout 3s ros2 topic echo --once "${topic}"; then
|
||||
log_warn "3 秒内没有收到消息: ${topic}"
|
||||
fi
|
||||
}
|
||||
|
||||
topic_once_field() {
|
||||
local topic="$1"
|
||||
local field="$2"
|
||||
echo
|
||||
log_info "读取一次 topic 字段 ${field}: ${topic}"
|
||||
if ! timeout 3s ros2 topic echo --once --field "${field}" "${topic}"; then
|
||||
log_warn "3 秒内没有收到消息: ${topic}"
|
||||
fi
|
||||
}
|
||||
|
||||
param_get() {
|
||||
local node="$1"
|
||||
local param="$2"
|
||||
echo
|
||||
log_info "读取参数: ${node} / ${param}"
|
||||
if ! timeout 3s ros2 param get "${node}" "${param}"; then
|
||||
log_warn "读取参数失败: ${node} / ${param}"
|
||||
fi
|
||||
}
|
||||
|
||||
service_check() {
|
||||
local service="$1"
|
||||
echo
|
||||
log_info "检查 service: ${service}"
|
||||
if ros2 service list | grep -Fx "${service}" >/dev/null; then
|
||||
echo "存在"
|
||||
else
|
||||
log_warn "缺少 service: ${service}"
|
||||
fi
|
||||
}
|
||||
|
||||
package_prefix_check() {
|
||||
local package="$1"
|
||||
echo
|
||||
log_info "检查 ROS 包安装路径: ${package}"
|
||||
local prefix
|
||||
if prefix="$(ros2 pkg prefix "${package}" 2>/dev/null)"; then
|
||||
echo "${prefix}"
|
||||
else
|
||||
log_warn "当前环境找不到 ROS 包: ${package}"
|
||||
fi
|
||||
}
|
||||
|
||||
component_type_check() {
|
||||
local package="$1"
|
||||
local plugin="$2"
|
||||
echo
|
||||
log_info "检查 component plugin: ${package} / ${plugin}"
|
||||
if timeout 5s ros2 component types | grep -A20 -Fx "${package}" | grep -Fx " ${plugin}" >/dev/null; then
|
||||
echo "存在"
|
||||
else
|
||||
log_warn "当前环境没有发现 plugin: ${package} / ${plugin}"
|
||||
fi
|
||||
}
|
||||
|
||||
recent_behavior_container_log() {
|
||||
echo
|
||||
log_info "最近 behavior_planning_container 启动日志"
|
||||
|
||||
local log_file
|
||||
local found="false"
|
||||
for log_file in $(ls -t "${HOME}/.ros/log"/component_container_mt_*.log 2>/dev/null | head -50); do
|
||||
if grep -q "behavior_planning_container" "${log_file}"; then
|
||||
echo "日志文件: ${log_file}"
|
||||
grep -E "behavior_planning_container|behavior_path_planner|Component constructor threw|outside_route|Load Library|Found class|Instantiate class|ERROR|FATAL|exception" "${log_file}" | tail -40
|
||||
found="true"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${found}" == "false" ]]; then
|
||||
log_warn "最近 50 个 component_container_mt 日志里没有找到 behavior_planning_container。"
|
||||
fi
|
||||
}
|
||||
|
||||
recent_planning_failure_log() {
|
||||
echo
|
||||
log_info "最近 planning/component 失败日志"
|
||||
|
||||
local log_root="${HOME}/.ros/log/latest"
|
||||
if [[ ! -d "${log_root}" ]]; then
|
||||
log_warn "未找到 ROS latest 日志目录: ${log_root}"
|
||||
return
|
||||
fi
|
||||
|
||||
local pattern="behavior_planning_container|behavior_path_planner|behavior_velocity_planner|motion_planning_container|mission_planner_container|scenario_selector|glog_component|Component constructor threw|Failed to load|LoadLibrary|plugin|exception|parameter|must be initialized|not found|outside_route|FATAL|ERROR"
|
||||
if ! grep -R -n -E "${pattern}" "${log_root}" 2>/dev/null | tail -120; then
|
||||
log_warn "latest 日志里没有匹配到明显的 planning/component 失败。"
|
||||
fi
|
||||
}
|
||||
|
||||
echo "ROS_DOMAIN_ID=${ROS_DOMAIN_ID:-}"
|
||||
echo "RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION:-}"
|
||||
echo "CYCLONEDDS_URI=${CYCLONEDDS_URI:-}"
|
||||
|
||||
package_prefix_check "farui_launch"
|
||||
package_prefix_check "autoware_behavior_path_planner"
|
||||
package_prefix_check "autoware_behavior_velocity_planner"
|
||||
package_prefix_check "autoware_behavior_path_lane_change_module"
|
||||
package_prefix_check "autoware_behavior_path_external_request_lane_change_module"
|
||||
package_prefix_check "autoware_behavior_path_static_obstacle_avoidance_module"
|
||||
package_prefix_check "autoware_behavior_path_dynamic_obstacle_avoidance_module"
|
||||
package_prefix_check "glog_component"
|
||||
component_type_check "autoware_behavior_path_planner" "autoware::behavior_path_planner::BehaviorPathPlannerNode"
|
||||
component_type_check "autoware_behavior_velocity_planner" "autoware::behavior_velocity_planner::BehaviorVelocityPlannerNode"
|
||||
component_type_check "glog_component" "GlogComponent"
|
||||
|
||||
echo
|
||||
log_info "包含 routing/planning/scenario/operation/localization 的节点"
|
||||
ros2 node list | grep -E 'routing|mission|scenario|planning|operation|localization|velocity_smoother' || true
|
||||
|
||||
node_check "/planning/scenario_planning/lane_driving/behavior_planning/behavior_planning_container"
|
||||
node_check "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner"
|
||||
node_check "/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner"
|
||||
component_check "/planning/scenario_planning/lane_driving/behavior_planning/behavior_planning_container"
|
||||
component_check "/planning/scenario_planning/lane_driving/motion_planning/motion_planning_container"
|
||||
component_check "/planning/mission_planning/mission_planner_container"
|
||||
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner" "launch_modules"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner" "slots"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner" "lane_change.prepare_duration"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner" "external_request_lane_change_right.enable_rtc"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_path_planner" "external_request_lane_change_left.enable_rtc"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner" "launch_modules"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner" "intersection.common.attention_area_length"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner" "merge_from_private.stopline_margin"
|
||||
param_get "/planning/scenario_planning/lane_driving/behavior_planning/behavior_velocity_planner" "merge_from_private.stop_duration_sec"
|
||||
|
||||
service_check "/api/routing/set_route_points"
|
||||
service_check "/planning/mission_planning/route_selector/main/set_waypoint_route"
|
||||
|
||||
topic_info "/map/vector_map"
|
||||
topic_info "/map/vector_map_marker"
|
||||
topic_info "/vehicle/status/velocity_status"
|
||||
topic_info "/sensing/vehicle_velocity_converter/twist_with_covariance"
|
||||
topic_info "/localization/kinematic_state"
|
||||
topic_info "/system/operation_mode/state"
|
||||
topic_info "/api/routing/state"
|
||||
topic_info "/api/routing/route"
|
||||
topic_info "/planning/mission_planning/route_selector/main/state"
|
||||
topic_info "/planning/mission_planning/route"
|
||||
topic_info "/planning/scenario_planning/scenario"
|
||||
topic_info "/planning/scenario_planning/lane_driving/behavior_planning/path_with_lane_id"
|
||||
topic_info "/planning/scenario_planning/lane_driving/behavior_planning/path"
|
||||
topic_info "/planning/scenario_planning/lane_driving/trajectory"
|
||||
topic_info "/planning/scenario_planning/scenario_selector/trajectory"
|
||||
topic_info "/planning/scenario_planning/velocity_smoother/trajectory"
|
||||
topic_info "/planning/scenario_planning/trajectory"
|
||||
|
||||
topic_once_field "/map/vector_map" "header"
|
||||
topic_once "/localization/kinematic_state"
|
||||
topic_once "/system/operation_mode/state"
|
||||
topic_once "/api/routing/state"
|
||||
topic_once "/planning/mission_planning/route_selector/main/state"
|
||||
topic_once "/planning/mission_planning/route"
|
||||
topic_once "/planning/scenario_planning/scenario"
|
||||
topic_once "/planning/scenario_planning/lane_driving/behavior_planning/path"
|
||||
topic_once_field "/planning/scenario_planning/lane_driving/trajectory" "header"
|
||||
topic_once "/planning/scenario_planning/lane_driving/trajectory"
|
||||
topic_once_field "/planning/scenario_planning/trajectory" "header"
|
||||
topic_once "/planning/scenario_planning/trajectory"
|
||||
|
||||
recent_behavior_container_log
|
||||
recent_planning_failure_log
|
||||
|
||||
echo
|
||||
log_info "结果解读"
|
||||
echo "1. 如果 /map/vector_map 没有消息,定位仍可能正常,但 mission planning 无法生成 route。"
|
||||
echo "2. 如果 /api/routing/state 缺失,或者不是 UNSET,RViz goal 不会真正设置新 route。"
|
||||
echo "3. 如果点击 goal 后 /planning/mission_planning/route 缺失,检查 mission_planner 日志:goal 无效、route 为空、odometry 缺失或 lanelet map 缺失。"
|
||||
echo "4. 如果 route 存在但 /planning/scenario_planning/scenario 缺失,优先检查 /system/operation_mode/state。"
|
||||
echo "5. 如果 scenario 存在但 behavior/motion 输出缺失,按上面的 topic 链路找到第一个没有输出的 topic。"
|
||||
echo "6. 如果 lane_driving trajectory 存在但最终 /planning/scenario_planning/trajectory 缺失,检查 operation mode 和 trajectory 时间戳延迟。"
|
||||
echo "7. 如果 behavior_planning_container 或 behavior_path_planner 节点不存在,path 不会生成;先查 master 启动日志中的 component_container_mt 是否加载 autoware_behavior_path_planner 失败。"
|
||||
echo "8. 如果日志出现 glog_component not found 或 GlogComponent plugin 缺失,说明当前运行环境没有正确构建/安装 glog_component,或 launch 中不应在该容器加载它。"
|
||||
echo "9. 如果日志出现 must be initialized,说明组件参数 yaml 没有传入,或运行环境读到了旧版本/错误路径的 yaml。"
|
||||
echo "10. external_request_lane_change 没有独立 yaml;它复用 lane_change.* 参数,并从 scene_module_manager 读取 external_request_lane_change_* 的 RTC/执行策略。"
|
||||
echo "11. merge_from_private 没有独立 yaml;它的 merge_from_private.* 参数位于 behavior_velocity_planner/intersection.param.yaml,同时依赖 intersection.common.*。"
|
||||
@@ -0,0 +1,118 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from collections import deque
|
||||
|
||||
import rclpy
|
||||
from autoware_adapi_v1_msgs.msg import OperationModeState
|
||||
from rclpy.node import Node
|
||||
from rclpy.qos import DurabilityPolicy, QoSProfile, ReliabilityPolicy
|
||||
|
||||
|
||||
class OperationModeStateFallback(Node):
|
||||
def __init__(self):
|
||||
super().__init__("planning_debug_operation_mode_fallback")
|
||||
|
||||
self.topic = (
|
||||
self.declare_parameter("topic", "/system/operation_mode/state")
|
||||
.get_parameter_value()
|
||||
.string_value
|
||||
)
|
||||
self.period_sec = (
|
||||
self.declare_parameter("period_sec", 0.5).get_parameter_value().double_value
|
||||
)
|
||||
self.timeout_sec = (
|
||||
self.declare_parameter("timeout_sec", 1.5).get_parameter_value().double_value
|
||||
)
|
||||
|
||||
qos = QoSProfile(depth=1)
|
||||
qos.reliability = ReliabilityPolicy.RELIABLE
|
||||
qos.durability = DurabilityPolicy.TRANSIENT_LOCAL
|
||||
|
||||
self.pub = self.create_publisher(OperationModeState, self.topic, qos)
|
||||
|
||||
sub_qos = QoSProfile(depth=1)
|
||||
sub_qos.reliability = ReliabilityPolicy.RELIABLE
|
||||
sub_qos.durability = DurabilityPolicy.VOLATILE
|
||||
self.sub = self.create_subscription(
|
||||
OperationModeState, self.topic, self.on_state, sub_qos
|
||||
)
|
||||
|
||||
self.timer = self.create_timer(self.period_sec, self.on_timer)
|
||||
self.publishing_fallback = False
|
||||
self.last_msg_time = None
|
||||
self.own_stamps = deque(maxlen=32)
|
||||
|
||||
self.get_logger().info(
|
||||
f"Monitoring {self.topic}; publishing STOP fallback when no fresh message exists."
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def stamp_key(stamp):
|
||||
return stamp.sec, stamp.nanosec
|
||||
|
||||
def on_state(self, msg):
|
||||
if self.stamp_key(msg.stamp) in self.own_stamps:
|
||||
return
|
||||
self.last_msg_time = self.get_clock().now()
|
||||
|
||||
def has_external_publisher(self):
|
||||
own_name = self.get_name()
|
||||
own_namespace = self.get_namespace()
|
||||
|
||||
for info in self.get_publishers_info_by_topic(self.topic):
|
||||
if info.node_name != own_name or info.node_namespace != own_namespace:
|
||||
return True
|
||||
return False
|
||||
|
||||
def has_fresh_message(self):
|
||||
if self.last_msg_time is None:
|
||||
return False
|
||||
|
||||
age_sec = (self.get_clock().now() - self.last_msg_time).nanoseconds * 1e-9
|
||||
return age_sec <= self.timeout_sec
|
||||
|
||||
def on_timer(self):
|
||||
if self.has_fresh_message():
|
||||
if self.publishing_fallback:
|
||||
self.get_logger().info(
|
||||
f"Detected fresh {self.topic}; fallback is idle."
|
||||
)
|
||||
self.publishing_fallback = False
|
||||
return
|
||||
|
||||
msg = OperationModeState()
|
||||
msg.stamp = self.get_clock().now().to_msg()
|
||||
msg.mode = OperationModeState.STOP
|
||||
msg.is_autoware_control_enabled = False
|
||||
msg.is_in_transition = False
|
||||
msg.is_stop_mode_available = True
|
||||
msg.is_autonomous_mode_available = False
|
||||
msg.is_local_mode_available = False
|
||||
msg.is_remote_mode_available = False
|
||||
self.own_stamps.append(self.stamp_key(msg.stamp))
|
||||
self.pub.publish(msg)
|
||||
|
||||
if not self.publishing_fallback:
|
||||
reason = (
|
||||
"no external publisher"
|
||||
if not self.has_external_publisher()
|
||||
else f"no fresh message within {self.timeout_sec:.1f}s"
|
||||
)
|
||||
self.get_logger().warn(
|
||||
f"{reason} on {self.topic}; publishing STOP fallback for planning."
|
||||
)
|
||||
self.publishing_fallback = True
|
||||
|
||||
|
||||
def main():
|
||||
rclpy.init()
|
||||
node = OperationModeStateFallback()
|
||||
try:
|
||||
rclpy.spin(node)
|
||||
finally:
|
||||
node.destroy_node()
|
||||
rclpy.shutdown()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,145 @@
|
||||
#!/bin/bash
|
||||
# ECar Mapping Script - 在线建图启动脚本
|
||||
# 使用方法: ./mapping.sh [选项]
|
||||
|
||||
set -e # 遇到错误立即退出
|
||||
|
||||
# ============ 配置 ============
|
||||
WORKSPACE_DIR="/home/nvidia/FaRui/v3.1"
|
||||
MAP_SAVE_PATH="${WORKSPACE_DIR}/maps/$(date +%Y%m%d_%H%M%S)"
|
||||
SLAM_METHOD="liorf" # 可选: fast_lio2 或 liorf
|
||||
RECORD_BAG="false"
|
||||
LAUNCH_RVIZ="true"
|
||||
|
||||
# ============ 帮助信息 ============
|
||||
function show_help() {
|
||||
echo "ECar Mapping Script - 在线建图启动脚本"
|
||||
echo ""
|
||||
echo "用法: $0 [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " -h, --help 显示帮助信息"
|
||||
echo " -m, --method METHOD 选择SLAM算法: fast_lio2 或 liorf (默认: ${SLAM_METHOD})"
|
||||
echo " -s, --save PATH 地图保存路径 (默认: ${MAP_SAVE_PATH})"
|
||||
echo " -r, --record 录制rosbag备份"
|
||||
echo " --no-rviz 不启动RViz"
|
||||
echo " -b, --bag-path PATH 指定rosbag录制路径"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " $0 # 默认使用liorf建图"
|
||||
echo " $0 -m fast_lio2 # 使用FAST_LIO2建图"
|
||||
echo " $0 -r -s /home/nvidia/my_maps # 建图并录制bag到指定目录"
|
||||
echo " $0 --no-rviz # 建图但不启动RViz"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# ============ 解析参数 ============
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-h|--help)
|
||||
show_help
|
||||
;;
|
||||
-m|--method)
|
||||
SLAM_METHOD="$2"
|
||||
shift 2
|
||||
;;
|
||||
-s|--save)
|
||||
MAP_SAVE_PATH="$2"
|
||||
shift 2
|
||||
;;
|
||||
-r|--record)
|
||||
RECORD_BAG="true"
|
||||
shift
|
||||
;;
|
||||
--no-rviz)
|
||||
LAUNCH_RVIZ="false"
|
||||
shift
|
||||
;;
|
||||
-b|--bag-path)
|
||||
BAG_SAVE_PATH="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "未知参数: $1"
|
||||
show_help
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# ============ 验证参数 ============
|
||||
if [[ "${SLAM_METHOD}" != "fast_lio2" && "${SLAM_METHOD}" != "liorf" ]]; then
|
||||
echo "错误: 不支持的SLAM算法 '${SLAM_METHOD}'"
|
||||
echo "支持的算法: fast_lio2, liorf"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建地图保存目录
|
||||
mkdir -p "${MAP_SAVE_PATH}"
|
||||
echo "地图将保存到: ${MAP_SAVE_PATH}"
|
||||
|
||||
# ============ 环境设置 ============
|
||||
echo "================================"
|
||||
echo " ECar 在线建图启动"
|
||||
echo "================================"
|
||||
echo "工作目录: ${WORKSPACE_DIR}"
|
||||
echo "SLAM算法: ${SLAM_METHOD}"
|
||||
echo "RViz: ${LAUNCH_RVIZ}"
|
||||
echo "录制bag: ${RECORD_BAG}"
|
||||
echo "================================"
|
||||
|
||||
# 切换到工作目录
|
||||
cd "${WORKSPACE_DIR}"
|
||||
|
||||
# 加载ROS环境
|
||||
echo "[1/3] 加载ROS2环境..."
|
||||
if [ -f "install/setup.bash" ]; then
|
||||
source install/setup.bash
|
||||
echo " 已加载本地工作空间"
|
||||
else
|
||||
echo " 警告: 未找到本地工作空间,使用系统ROS2"
|
||||
source /opt/ros/humble/setup.bash
|
||||
fi
|
||||
|
||||
# 检查必要的包是否存在
|
||||
echo "[2/3] 检查必要组件..."
|
||||
REQUIRED_PKGS=("farui_launch" "timoo_ros2_driver" "wheeltec_gps_driver" "hipnuc_imu")
|
||||
for pkg in "${REQUIRED_PKGS[@]}"; do
|
||||
if ros2 pkg list | grep -q "^${pkg}$"; then
|
||||
echo " ✓ ${pkg}"
|
||||
else
|
||||
echo " ✗ ${pkg} 未找到!"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# 启动建图
|
||||
echo "[3/3] 启动建图节点..."
|
||||
echo ""
|
||||
|
||||
# 构建启动参数
|
||||
LAUNCH_ARGS=""
|
||||
LAUNCH_ARGS+=" slam_method:=${SLAM_METHOD}"
|
||||
LAUNCH_ARGS+=" map_save_path:=${MAP_SAVE_PATH}"
|
||||
LAUNCH_ARGS+=" record_bag:=${RECORD_BAG}"
|
||||
LAUNCH_ARGS+=" rviz:=${LAUNCH_RVIZ}"
|
||||
|
||||
if [ -n "${BAG_SAVE_PATH}" ]; then
|
||||
LAUNCH_ARGS+=" map_save_path:=${BAG_SAVE_PATH}"
|
||||
fi
|
||||
|
||||
echo "启动参数: ${LAUNCH_ARGS}"
|
||||
echo ""
|
||||
|
||||
# 启动 launch 文件
|
||||
ros2 launch farui_launch ecar_mapping.launch.xml ${LAUNCH_ARGS}
|
||||
|
||||
# 建图结束后提示
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo " 建图已结束"
|
||||
echo "================================"
|
||||
if [ -d "${MAP_SAVE_PATH}" ]; then
|
||||
echo "地图保存位置: ${MAP_SAVE_PATH}"
|
||||
ls -lh "${MAP_SAVE_PATH}" 2>/dev/null || true
|
||||
fi
|
||||
echo "================================"
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env bash
|
||||
# -----------------------------------------------------------
|
||||
# 脚本名称: run_simulation.sh
|
||||
# 功 能: 启动 Autoware-CARLA 联合仿真
|
||||
#
|
||||
# 前置条件:
|
||||
# 1) CARLA 服务器已启动。可在carla目录下运行 ./CarlaUE4.sh -prefernvidia -RenderOffScreen
|
||||
# 2) 已编译 Autoware
|
||||
#
|
||||
# 修改提示:
|
||||
# map_path : 本地地图路径
|
||||
# carla_map : CARLA 中的地图名称
|
||||
# -----------------------------------------------------------
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
|
||||
|
||||
# 1. Source 环境
|
||||
log_info "Sourcing workspace environment..."
|
||||
set +u
|
||||
source install/setup.bash
|
||||
set -u
|
||||
|
||||
# 2. 启动仿真
|
||||
log_info "Launching Autoware-CARLA e2e simulation..."
|
||||
ros2 launch farui_launch ecar_launcher.launch.xml \
|
||||
map_path:=/home/nvidia/FaRui-test/map/parker01 \
|
||||
vehicle_model:=ecar_vehicle
|
||||
@@ -0,0 +1,170 @@
|
||||
#!/usr/bin/env bash
|
||||
# Start only the master Orin Autoware launch for debugging, without preset-route UI.
|
||||
#
|
||||
# 用法:
|
||||
# ./run_ecar_master_debug.sh [地图目录] [是否启动RViz] [车型]
|
||||
#
|
||||
# 位置参数都可以省略:
|
||||
# 地图目录: $ECAR_MASTER_MAP_PATH
|
||||
# 默认 /home/nvidia/FaRui-test/map/School06
|
||||
# RViz: $ECAR_MASTER_RVIZ
|
||||
# 默认 true,可选 true | false
|
||||
# 车型: $ECAR_MASTER_VEHICLE_MODEL
|
||||
# 默认 ecar_vehicle
|
||||
#
|
||||
# 常用示例:
|
||||
# 启动主板 Autoware,并打开 RViz:
|
||||
# ./run_ecar_master_debug.sh
|
||||
#
|
||||
# 启动主板 Autoware,但关闭 RViz:
|
||||
# ./run_ecar_master_debug.sh /home/nvidia/FaRui-test/map/School06 false
|
||||
#
|
||||
# 用环境变量指定地图:
|
||||
# ECAR_MASTER_MAP_PATH=/home/nvidia/FaRui-test/map/School06 ./run_ecar_master_debug.sh
|
||||
#
|
||||
# 双 Orin 说明:
|
||||
# 本脚本只启动 src/Launcher/farui_launch/launch/ecar_master.launch.xml。
|
||||
# 不启动 UI、预设路线工具、vehicle、control、system。
|
||||
# 从板仍需单独启动 ecar_slave.launch.xml,负责底盘驱动、控制和 system 反馈。
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
find_workspace_root() {
|
||||
if [[ -n "${ECAR_MASTER_WORKSPACE_ROOT:-}" ]]; then
|
||||
echo "${ECAR_MASTER_WORKSPACE_ROOT}"
|
||||
return
|
||||
fi
|
||||
|
||||
local candidates=(
|
||||
"${script_dir}"
|
||||
"${PWD}"
|
||||
)
|
||||
for candidate in "${candidates[@]}"; do
|
||||
if [[ -f "${candidate}/install/setup.bash" ]]; then
|
||||
(cd "${candidate}" && pwd)
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
echo "${script_dir}"
|
||||
}
|
||||
|
||||
WORKSPACE_ROOT="$(find_workspace_root)"
|
||||
#DEFAULT_MAP_PATH="/home/nvidia/FaRui-test/map/School06" parker01
|
||||
DEFAULT_MAP_PATH="/home/nvidia/FaRui-test/map/School06"
|
||||
DEFAULT_VEHICLE_MODEL="ecar_vehicle"
|
||||
DEFAULT_LAUNCH_FILE="${WORKSPACE_ROOT}/src/Launcher/farui_launch/launch/ecar_master.launch.xml"
|
||||
DEFAULT_OPERATION_MODE_FALLBACK_SCRIPT="${WORKSPACE_ROOT}/debug/operation_mode_state_fallback.py"
|
||||
|
||||
MAP_PATH="${1:-${ECAR_MASTER_MAP_PATH:-${DEFAULT_MAP_PATH}}}"
|
||||
RVIZ="${2:-${ECAR_MASTER_RVIZ:-true}}"
|
||||
VEHICLE_MODEL="${3:-${ECAR_MASTER_VEHICLE_MODEL:-${DEFAULT_VEHICLE_MODEL}}}"
|
||||
LAUNCH_FILE="${ECAR_MASTER_LAUNCH_FILE:-${DEFAULT_LAUNCH_FILE}}"
|
||||
OPERATION_MODE_FALLBACK="${ECAR_MASTER_OPERATION_MODE_FALLBACK:-false}"
|
||||
OPERATION_MODE_FALLBACK_SCRIPT="${ECAR_MASTER_OPERATION_MODE_FALLBACK_SCRIPT:-${DEFAULT_OPERATION_MODE_FALLBACK_SCRIPT}}"
|
||||
|
||||
case "${RVIZ}" in
|
||||
true|false)
|
||||
;;
|
||||
*)
|
||||
log_error "RViz must be true or false, got: ${RVIZ}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${OPERATION_MODE_FALLBACK}" in
|
||||
true|false)
|
||||
;;
|
||||
*)
|
||||
log_error "ECAR_MASTER_OPERATION_MODE_FALLBACK must be true or false, got: ${OPERATION_MODE_FALLBACK}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ! -f "${WORKSPACE_ROOT}/install/setup.bash" ]]; then
|
||||
log_error "Workspace setup file not found: ${WORKSPACE_ROOT}/install/setup.bash"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${LAUNCH_FILE}" ]]; then
|
||||
log_error "Master launch file not found: ${LAUNCH_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d "${MAP_PATH}" ]]; then
|
||||
log_error "Map path not found: ${MAP_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${OPERATION_MODE_FALLBACK}" == "true" && ! -f "${OPERATION_MODE_FALLBACK_SCRIPT}" ]]; then
|
||||
log_error "Operation mode fallback script not found: ${OPERATION_MODE_FALLBACK_SCRIPT}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Workspace: ${WORKSPACE_ROOT}"
|
||||
log_info "Master launch: ${LAUNCH_FILE}"
|
||||
log_info "Map path: ${MAP_PATH}"
|
||||
log_info "Vehicle model: ${VEHICLE_MODEL}"
|
||||
log_info "RViz: ${RVIZ}"
|
||||
log_info "Operation mode fallback: ${OPERATION_MODE_FALLBACK}"
|
||||
log_info "Starting master Autoware without UI."
|
||||
|
||||
cd "${WORKSPACE_ROOT}"
|
||||
set +u
|
||||
source install/setup.bash
|
||||
set -u
|
||||
|
||||
log_ros_pkg_prefix() {
|
||||
local package="$1"
|
||||
local prefix
|
||||
if prefix="$(ros2 pkg prefix "${package}" 2>/dev/null)"; then
|
||||
log_info "ROS package ${package}: ${prefix}"
|
||||
else
|
||||
log_warn "ROS package ${package} not found in the sourced environment."
|
||||
fi
|
||||
}
|
||||
|
||||
log_ros_pkg_prefix "farui_launch"
|
||||
log_ros_pkg_prefix "autoware_behavior_path_planner"
|
||||
log_ros_pkg_prefix "glog_component"
|
||||
|
||||
OPERATION_MODE_FALLBACK_PID=""
|
||||
cleanup() {
|
||||
local status=$?
|
||||
trap - EXIT INT TERM
|
||||
if [[ -n "${OPERATION_MODE_FALLBACK_PID}" ]]; then
|
||||
kill "${OPERATION_MODE_FALLBACK_PID}" 2>/dev/null || true
|
||||
wait "${OPERATION_MODE_FALLBACK_PID}" 2>/dev/null || true
|
||||
fi
|
||||
exit "${status}"
|
||||
}
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
if [[ "${OPERATION_MODE_FALLBACK}" == "true" ]]; then
|
||||
log_info "Starting planning operation mode fallback."
|
||||
python3 "${OPERATION_MODE_FALLBACK_SCRIPT}" &
|
||||
OPERATION_MODE_FALLBACK_PID=$!
|
||||
fi
|
||||
|
||||
ros2 launch "${LAUNCH_FILE}" \
|
||||
map_path:="${MAP_PATH}" \
|
||||
vehicle_model:="${VEHICLE_MODEL}" \
|
||||
launch_planning:=true \
|
||||
launch_system:=false \
|
||||
launch_vehicle:=false \
|
||||
launch_control:=false \
|
||||
launch_api:=true \
|
||||
use_sim_time:=false \
|
||||
rviz:="${RVIZ}" \
|
||||
rviz_respawn:=false
|
||||
@@ -0,0 +1,341 @@
|
||||
#!/usr/bin/env bash
|
||||
# Start the real-vehicle Autoware stack and one preset-route tool mode.
|
||||
#
|
||||
# 用法:
|
||||
# ./run_preset_route_real_vehicle.sh [模式] [站点文件] [是否启动RViz] [地图目录] [车型]
|
||||
#
|
||||
# 位置参数都可以省略,省略时使用下面的默认值或对应环境变量:
|
||||
# 模式: ui-only
|
||||
# 可选 record | replay | mission | none | ui-only
|
||||
# 站点文件: $PRESET_ROUTE_STATIONS_FILE
|
||||
# 默认 src/UI/preset_route_cruise/paths/recorded_stations.yaml
|
||||
# RViz: $PRESET_ROUTE_RVIZ
|
||||
# 非ui-only模式默认 true;ui-only打开UI时默认 false,可选 true | false
|
||||
# 地图目录: $PRESET_ROUTE_MAP_PATH
|
||||
# 默认 /home/nvidia/FaRui-test/map/School06
|
||||
# 车型: $PRESET_ROUTE_VEHICLE_MODEL
|
||||
# 默认 ecar_vehicle
|
||||
#
|
||||
# 常用示例:
|
||||
# 只打开UI,不启动主板Autoware:
|
||||
# ./run_preset_route_real_vehicle.sh
|
||||
#
|
||||
# 只启动主板Autoware,不启动预设路线工具:
|
||||
# ./run_preset_route_real_vehicle.sh none
|
||||
#
|
||||
# 启动主板Autoware并关闭RViz:
|
||||
# ./run_preset_route_real_vehicle.sh mission "" false
|
||||
#
|
||||
# 使用指定地图:
|
||||
# ./run_preset_route_real_vehicle.sh mission "" true /home/nvidia/FaRui-test/map/School06
|
||||
#
|
||||
# 启动主板Autoware + 站点任务管理器:
|
||||
# ./run_preset_route_real_vehicle.sh mission
|
||||
#
|
||||
# 常用环境变量:
|
||||
# PRESET_ROUTE_MAP_PATH=/path/to/map
|
||||
# PRESET_ROUTE_RVIZ=false
|
||||
# PRESET_ROUTE_NO_UI=true
|
||||
# PRESET_ROUTE_SKIP_MAIN_STACK=true
|
||||
# PRESET_ROUTE_START_ON_LAUNCH=true
|
||||
# PRESET_ROUTE_LOOP_MISSION=true
|
||||
# PRESET_ROUTE_START_STATION_INDEX=0
|
||||
# PRESET_ROUTE_AUTOWARE_LAUNCH_FILE=/path/to/ecar_master.launch.xml
|
||||
#
|
||||
# 双Orin说明:
|
||||
# 本脚本用于主板,默认启动 src/Launcher/farui_launch/launch/ecar_master.launch.xml。
|
||||
# 主板默认不启动 system、vehicle、control;这些由从板脚本负责。
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_info() { echo -e "${GREEN}[INFO]${NC} $*"; }
|
||||
log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||
log_error() { echo -e "${RED}[ERROR]${NC} $*" >&2; }
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
find_workspace_root() {
|
||||
if [[ -n "${PRESET_ROUTE_WORKSPACE_ROOT:-}" ]]; then
|
||||
echo "${PRESET_ROUTE_WORKSPACE_ROOT}"
|
||||
return
|
||||
fi
|
||||
|
||||
local candidates=(
|
||||
"${PWD}"
|
||||
"${script_dir}"
|
||||
"${script_dir}/../../../.."
|
||||
"${script_dir}/../../../../.."
|
||||
)
|
||||
for candidate in "${candidates[@]}"; do
|
||||
if [[ -f "${candidate}/install/setup.bash" ]]; then
|
||||
(cd "${candidate}" && pwd)
|
||||
return
|
||||
fi
|
||||
done
|
||||
|
||||
echo "${PWD}"
|
||||
}
|
||||
|
||||
kill_process_group() {
|
||||
local pid="$1"
|
||||
local signal="${2:-TERM}"
|
||||
|
||||
if [[ -z "${pid}" ]] || ! kill -0 "${pid}" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local pgid
|
||||
pgid="$(ps -o pgid= -p "${pid}" 2>/dev/null | tr -d ' ')"
|
||||
|
||||
if [[ -n "${pgid}" ]]; then
|
||||
kill "-${signal}" -- "-${pgid}" 2>/dev/null || true
|
||||
else
|
||||
kill "-${signal}" "${pid}" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
launch_preset_route_ui() {
|
||||
local source_ui="${WORKSPACE_ROOT}/src/UI/preset_route_cruise/scripts/preset_route_operator.py"
|
||||
if [[ -f "${source_ui}" ]]; then
|
||||
log_info "Launching preset route UI from source."
|
||||
python3 "${source_ui}"
|
||||
return
|
||||
fi
|
||||
|
||||
local installed_ui="${WORKSPACE_ROOT}/install/preset_route_cruise/lib/preset_route_cruise/preset_route_operator.py"
|
||||
if [[ -f "${installed_ui}" ]]; then
|
||||
log_warn "preset_route_operator.py is not registered as a ros2 executable; launching installed script."
|
||||
python3 "${installed_ui}"
|
||||
return
|
||||
fi
|
||||
|
||||
if ros2 pkg executables preset_route_cruise 2>/dev/null | awk '{print $2}' | grep -qx "preset_route_operator.py"; then
|
||||
ros2 run preset_route_cruise preset_route_operator.py
|
||||
return
|
||||
fi
|
||||
|
||||
log_error "Preset route UI executable not found. Expected ros2 executable, ${source_ui}, or ${installed_ui}"
|
||||
return 1
|
||||
}
|
||||
|
||||
find_default_map_path() {
|
||||
echo "/home/nvidia/FaRui-test/map/School06"
|
||||
}
|
||||
|
||||
WORKSPACE_ROOT="$(find_workspace_root)"
|
||||
DEFAULT_STATIONS_FILE="${WORKSPACE_ROOT}/src/UI/preset_route_cruise/paths/recorded_stations.yaml"
|
||||
DEFAULT_MAP_PATH="$(find_default_map_path)"
|
||||
DEFAULT_VEHICLE_MODEL="ecar_vehicle"
|
||||
DEFAULT_AUTOWARE_LAUNCH_FILE="${WORKSPACE_ROOT}/src/Launcher/farui_launch/launch/ecar_master.launch.xml"
|
||||
|
||||
ROUTE_MODE="${1:-ui-only}"
|
||||
STATIONS_FILE="${2:-${PRESET_ROUTE_STATIONS_FILE:-${DEFAULT_STATIONS_FILE}}}"
|
||||
RVIZ="${3:-${PRESET_ROUTE_RVIZ:-true}}"
|
||||
MAP_PATH="${4:-${PRESET_ROUTE_MAP_PATH:-${DEFAULT_MAP_PATH}}}"
|
||||
VEHICLE_MODEL="${5:-${PRESET_ROUTE_VEHICLE_MODEL:-${DEFAULT_VEHICLE_MODEL}}}"
|
||||
|
||||
UI_START_RECORDING_ON_LAUNCH="${PRESET_ROUTE_START_RECORDING_ON_LAUNCH:-false}"
|
||||
UI_AUTO_SEND_ON_START="${PRESET_ROUTE_AUTO_SEND_ON_START:-false}"
|
||||
UI_MISSION_START_ON_LAUNCH="${PRESET_ROUTE_START_ON_LAUNCH:-false}"
|
||||
UI_ALLOW_GOAL_MODIFICATION="${PRESET_ROUTE_ALLOW_GOAL_MODIFICATION:-false}"
|
||||
UI_MISSION_LOOP="${PRESET_ROUTE_LOOP_MISSION:-false}"
|
||||
UI_MISSION_START_STATION_INDEX="${PRESET_ROUTE_START_STATION_INDEX:-0}"
|
||||
UI_SKIP_MAIN_STACK="${PRESET_ROUTE_SKIP_MAIN_STACK:-false}"
|
||||
UI_RECORD_CLEAR_ON_START="${PRESET_ROUTE_RECORD_CLEAR_ON_START:-false}"
|
||||
UI_RECORD_APPEND_EXISTING="${PRESET_ROUTE_RECORD_APPEND_EXISTING:-true}"
|
||||
AUTOWARE_LAUNCH_FILE="${PRESET_ROUTE_AUTOWARE_LAUNCH_FILE:-${DEFAULT_AUTOWARE_LAUNCH_FILE}}"
|
||||
|
||||
case "${ROUTE_MODE}" in
|
||||
record|replay|mission|none|ui-only)
|
||||
;;
|
||||
*)
|
||||
log_error "Unsupported route mode: ${ROUTE_MODE}. Expected record, replay, mission, none, or ui-only."
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${RVIZ}" in
|
||||
true|false)
|
||||
;;
|
||||
*)
|
||||
log_error "RVIZ must be true or false, got: ${RVIZ}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ ("${ROUTE_MODE}" == "replay" || "${ROUTE_MODE}" == "mission") && ! -f "${STATIONS_FILE}" ]]; then
|
||||
log_error "Stations file not found: ${STATIONS_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${UI_SKIP_MAIN_STACK}" != "true" && ! -d "${MAP_PATH}" ]]; then
|
||||
log_error "Map path not found: ${MAP_PATH}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "${WORKSPACE_ROOT}/install/setup.bash" ]]; then
|
||||
log_error "Workspace setup file not found: ${WORKSPACE_ROOT}/install/setup.bash"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ "${UI_SKIP_MAIN_STACK}" != "true" && "${ROUTE_MODE}" != "ui-only" && ! -f "${AUTOWARE_LAUNCH_FILE}" ]]; then
|
||||
log_error "Autoware launch file not found: ${AUTOWARE_LAUNCH_FILE}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_info "Workspace: ${WORKSPACE_ROOT}"
|
||||
log_info "Mode: ${ROUTE_MODE}, stations: ${STATIONS_FILE}"
|
||||
log_info "Autoware launch: ${AUTOWARE_LAUNCH_FILE}"
|
||||
log_info "Map path: ${MAP_PATH}"
|
||||
|
||||
cd "${WORKSPACE_ROOT}"
|
||||
set +u
|
||||
source install/setup.bash
|
||||
set -u
|
||||
|
||||
AUTOWARE_STACK_PID=""
|
||||
EXTRA_TOOL_PID=""
|
||||
UI_PID=""
|
||||
|
||||
if [[ "${UI_SKIP_MAIN_STACK}" != "true" && "${ROUTE_MODE}" != "ui-only" ]]; then
|
||||
log_info "Launching master Orin Autoware stack."
|
||||
setsid ros2 launch "${AUTOWARE_LAUNCH_FILE}" \
|
||||
map_path:="${MAP_PATH}" \
|
||||
vehicle_model:="${VEHICLE_MODEL}" \
|
||||
launch_planning:=true \
|
||||
launch_system:=false \
|
||||
launch_vehicle:=false \
|
||||
launch_control:=false \
|
||||
launch_api:=true \
|
||||
use_sim_time:=false \
|
||||
rviz:="${RVIZ}" \
|
||||
rviz_respawn:=false &
|
||||
AUTOWARE_STACK_PID=$!
|
||||
else
|
||||
log_info "Main stack launch skipped by PRESET_ROUTE_SKIP_MAIN_STACK=true."
|
||||
fi
|
||||
|
||||
if [[ "${ROUTE_MODE}" != "ui-only" ]]; then
|
||||
if [[ "${ROUTE_MODE}" == "record" ]]; then
|
||||
log_info "Launching station recorder."
|
||||
setsid ros2 launch preset_route_cruise record_stations_from_rviz.launch.xml \
|
||||
output_file:="${STATIONS_FILE}" \
|
||||
clear_file_on_start:="${UI_RECORD_CLEAR_ON_START}" \
|
||||
append_existing:="${UI_RECORD_APPEND_EXISTING}" \
|
||||
write_on_each_point:=true \
|
||||
start_recording_on_launch:="${UI_START_RECORDING_ON_LAUNCH}" \
|
||||
use_sim_time:=false &
|
||||
EXTRA_TOOL_PID=$!
|
||||
fi
|
||||
|
||||
if [[ "${ROUTE_MODE}" == "replay" ]]; then
|
||||
log_info "Launching preset route sender."
|
||||
setsid ros2 launch preset_route_cruise preset_route_cruise.launch.xml \
|
||||
stations_file:="${STATIONS_FILE}" \
|
||||
clear_route_before_send:=true \
|
||||
allow_goal_modification:="${UI_ALLOW_GOAL_MODIFICATION}" \
|
||||
auto_shutdown_after_send:=false \
|
||||
auto_send_on_start:="${UI_AUTO_SEND_ON_START}" \
|
||||
use_sim_time:=false &
|
||||
EXTRA_TOOL_PID=$!
|
||||
fi
|
||||
|
||||
if [[ "${ROUTE_MODE}" == "mission" ]]; then
|
||||
log_info "Launching station mission manager."
|
||||
setsid ros2 launch preset_route_cruise station_mission_manager.launch.xml \
|
||||
stations_file:="${STATIONS_FILE}" \
|
||||
loop_mission:="${UI_MISSION_LOOP}" \
|
||||
auto_start_on_each_leg:=false \
|
||||
manual_start_first_leg_only:=true \
|
||||
clear_route_before_send:=true \
|
||||
allow_goal_modification:="${UI_ALLOW_GOAL_MODIFICATION}" \
|
||||
start_on_launch:="${UI_MISSION_START_ON_LAUNCH}" \
|
||||
start_station_index:="${UI_MISSION_START_STATION_INDEX}" \
|
||||
auto_shutdown_on_finish:=false \
|
||||
use_sim_time:=false &
|
||||
EXTRA_TOOL_PID=$!
|
||||
fi
|
||||
|
||||
if [[ "${ROUTE_MODE}" == "none" ]]; then
|
||||
log_info "Extra preset-route tool launch skipped."
|
||||
fi
|
||||
else
|
||||
log_info "UI-only mode: main stack and tools will be started from UI."
|
||||
fi
|
||||
|
||||
# 启动 UI 界面
|
||||
if [[ "${PRESET_ROUTE_NO_UI:-false}" != "true" ]]; then
|
||||
export PRESET_ROUTE_MAP_PATH="${MAP_PATH}"
|
||||
export PRESET_ROUTE_STATIONS_FILE="${STATIONS_FILE}"
|
||||
export PRESET_ROUTE_VEHICLE_MODEL="${VEHICLE_MODEL}"
|
||||
if [[ "${ROUTE_MODE}" == "ui-only" ]]; then
|
||||
log_info "Launching preset route UI (UI-only mode)."
|
||||
PRESET_ROUTE_RVIZ="${PRESET_ROUTE_RVIZ:-false}" launch_preset_route_ui &
|
||||
UI_PID=$!
|
||||
else
|
||||
UI_LAUNCH_DELAY="${PRESET_ROUTE_UI_LAUNCH_DELAY:-3}"
|
||||
log_info "UI will launch in ${UI_LAUNCH_DELAY} seconds..."
|
||||
(
|
||||
sleep "${UI_LAUNCH_DELAY}"
|
||||
log_info "Launching preset route UI."
|
||||
launch_preset_route_ui
|
||||
) &
|
||||
UI_PID=$!
|
||||
fi
|
||||
fi
|
||||
|
||||
cleanup() {
|
||||
trap - EXIT INT TERM
|
||||
|
||||
local pids=()
|
||||
if [[ -n "${UI_PID}" ]]; then
|
||||
pids+=("${UI_PID}")
|
||||
fi
|
||||
if [[ -n "${EXTRA_TOOL_PID}" ]]; then
|
||||
pids+=("${EXTRA_TOOL_PID}")
|
||||
fi
|
||||
if [[ -n "${AUTOWARE_STACK_PID}" ]]; then
|
||||
pids+=("${AUTOWARE_STACK_PID}")
|
||||
fi
|
||||
|
||||
if [[ ${#pids[@]} -eq 0 ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
log_info "Shutting down launched processes."
|
||||
|
||||
for pid in "${pids[@]}"; do
|
||||
kill_process_group "${pid}" TERM
|
||||
done
|
||||
|
||||
sleep 2
|
||||
|
||||
for pid in "${pids[@]}"; do
|
||||
kill_process_group "${pid}" KILL
|
||||
done
|
||||
|
||||
wait "${pids[@]}" 2>/dev/null || true
|
||||
}
|
||||
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
WAIT_PIDS=()
|
||||
if [[ -n "${AUTOWARE_STACK_PID}" ]]; then
|
||||
WAIT_PIDS+=("${AUTOWARE_STACK_PID}")
|
||||
fi
|
||||
if [[ -n "${EXTRA_TOOL_PID}" ]]; then
|
||||
WAIT_PIDS+=("${EXTRA_TOOL_PID}")
|
||||
fi
|
||||
if [[ -n "${UI_PID}" ]]; then
|
||||
WAIT_PIDS+=("${UI_PID}")
|
||||
fi
|
||||
|
||||
if [[ ${#WAIT_PIDS[@]} -gt 0 ]]; then
|
||||
wait "${WAIT_PIDS[@]}"
|
||||
fi
|
||||
|
||||
@@ -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.
|
||||
|
||||

|
||||
|
||||
## Conversion
|
||||
|
||||
This is the correspondence between AD API states and autoware states.
|
||||
The launch state is the data that this node holds internally.
|
||||
|
||||

|
||||
@@ -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="<mxfile><diagram id="X9Q9Zxk0nsySa-CThXZE" name="Page-1">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==</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="DGwK_OstZrDMA8GPxkck" name="Page-1">3ZpNc5swEIZ/Sw/cAdnEObbOR3voTKc55JhRjWw0FZJHFraTX18JhI1ZMmESVWFkz9iw4ksPi3bfRRFalsd7ibfFT5ETFqVxfozQTZSmyXw+13/G8txYsuukMWwkze1GZ8MDfSHWGFtrRXOyu9hQCcEU3V4aV4JzslIXNiylOFxuthbs8qxbvCHA8LDCDFofaa4Ka02y63PDd0I3hT31Ir1qGkrcbmx7sitwLg4dE7qN0FIKoZql8rgkzMBruTT73b3SerowSbgas0Nqr3iPWWU7Zy9MPbe9laLiOTE7xBH6diioIg9bvDKtB31/ta1QJdNriV5cU8aWgglZ74vWc/M1dsFVx958tH2npPhLOi1Z/dEtsCu2d3siFTl2TLZr90SURMlnvYltXcws5tbP7Oqhc9PaO1F07te1tWHrJ5vTkc8o9YKl+QpZAPYRU0X55k7I36JSJCDOPcwnpm9xTh1wRoAzE/pJpS9YUcFrwjgo2OnikvbMI+wZgK05GqcOkPMs/jzOc8BZbIlsPbrUATUg0PP0TdDof4HOAGhcKXFiHOM9pgz/YSHx7kdFn459BXhTrqOiGa/rUeQjkB2gSbL3JQwu0Czg2FpxPkUqi5FUkpkDLDBBrfjJZzSEz4bTD8dj4bhwmVYPTfVx6rNJYp9wktfhTNBvRifNJ4gfggPlScV3REXpstHIdD8BRv0UzKuwSKCyqAFNjcnY8J25YAIT06n6Sup1rIF5zZryqQzD/fiden2MYF5D2O6D+bQDKH3VMfQcITQAxUVSk8LAvcZToNLXBqNHFxeuksKIrWQ1QSg+ZUEKI/UPZznepHTpO4u1LuLaUBURV3xVROHVtfrRwOsTDguIvxh2oHInRfhTx1CYoZ3fO9zyjXmzFS5prwMzrB3e6FQ4bFf2Wd0YKBZ+bcTGvcAsXMhelctA2fHOkXKZNGOvryhhth8QWZAdjx0jXCRuCEqGgND2axo+U2IEdUdAZPvqf4Ds4DvHhQuyUGwETHYomg2idVFXQVBfBIQWlDi9BjEoLAJC238b4xctVBIBo/Wp0RCUEHZix5d6TRMW28icKcOlgdj8gtXYzAo5aApPK41QCvZEuJkVkpt99YHqY7mqVQK0AzdgfFl7IBtzNZtGr55nqtZtnfm+6PYf</diagram></mxfile>"
|
||||
>
|
||||
<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 && 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 && 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="<mxfile><diagram id="6E-LtnesXNhnNIPTZu3a" name="Page-1">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==</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="NeQHiIWb25snwK_hvTzY" name="Page-1">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==</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="Cz8Q8T6vesO4MC4sh1-d" name="Page-1">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=</diagram></mxfile>"
|
||||
>
|
||||
<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 > 0
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</foreignObject>
|
||||
<text x="2" y="54" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">
|
||||
cmd vel > 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="<mxfile><diagram id="mvvE6A7THf0XtyBilGqc" name="Page-1">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==</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="-9nZo-msseQFPmowi21l" name="Page-1">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</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="qn1FoCmzmF8PwLU9Dzqv" name="Page-1">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=</diagram></mxfile>"
|
||||
>
|
||||
<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="<mxfile><diagram id="vlU9K5DmlQzOJ9JTXKwZ" name="Page-1">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=</diagram></mxfile>"
|
||||
>
|
||||
<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: "helvetica" ; 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: "helvetica"">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: "helvetica" ; 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: "helvetica"">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.
|
||||
|
||||

|
||||
@@ -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.
|
||||
|
||||

|
||||
|
||||
## States
|
||||
|
||||
The implementation has more detailed state transitions to manage pause state synchronization. The correspondence with the AD API state is as follows.
|
||||
|
||||

|
||||
@@ -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.
|
||||
|
||||

|
||||
|
||||
## 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.
|
||||
|
||||

|
||||
|
||||
## 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.
|
||||
|
||||

|
||||
@@ -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.
|
||||
|
||||

|
||||
@@ -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>
|
||||
@@ -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()
|
||||
@@ -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>
|
||||