From e31dc388c2fa08e397167e4ca4b1c142948a71dd Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 02:35:21 +0900 Subject: [PATCH 1/6] docs(diagnostic_graph_aggregator): update documents Signed-off-by: Takagi, Isamu --- system/diagnostic_graph_aggregator/README.md | 29 ++++++++++++------- .../doc/format/and.md | 11 ------- .../doc/format/diag.md | 10 ------- .../doc/format/edit.md | 14 +++++++++ .../doc/format/edit/remove.md | 10 +++++++ .../doc/format/graph-file.md | 10 ------- .../doc/format/graph.md | 11 +++++++ .../doc/format/node.md | 24 ++++++++++++--- .../doc/format/node/and.md | 17 +++++++++++ .../doc/format/node/const.md | 18 ++++++++++++ .../doc/format/node/diag.md | 10 +++++++ .../doc/format/node/link.md | 10 +++++++ .../doc/format/node/or.md | 11 +++++++ .../doc/format/node/remap.md | 21 ++++++++++++++ .../doc/format/or.md | 11 ------- .../doc/format/path.md | 10 +++---- .../doc/format/unit.md | 10 ------- .../{example_diags.py => dummy-diags.py} | 0 ...ple.launch.xml => example-edit.launch.xml} | 4 +-- .../example/example-main.launch.xml | 7 +++++ .../example/graph/edit.yaml | 6 ++++ .../{example_0.yaml => graph/main.yaml} | 4 +-- .../{example_1.yaml => graph/module1.yaml} | 0 .../{example_2.yaml => graph/module2.yaml} | 0 24 files changed, 182 insertions(+), 76 deletions(-) delete mode 100644 system/diagnostic_graph_aggregator/doc/format/and.md delete mode 100644 system/diagnostic_graph_aggregator/doc/format/diag.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/edit.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/edit/remove.md delete mode 100644 system/diagnostic_graph_aggregator/doc/format/graph-file.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/graph.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/and.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/const.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/diag.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/link.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/or.md create mode 100644 system/diagnostic_graph_aggregator/doc/format/node/remap.md delete mode 100644 system/diagnostic_graph_aggregator/doc/format/or.md delete mode 100644 system/diagnostic_graph_aggregator/doc/format/unit.md rename system/diagnostic_graph_aggregator/example/{example_diags.py => dummy-diags.py} (100%) rename system/diagnostic_graph_aggregator/example/{example.launch.xml => example-edit.launch.xml} (81%) create mode 100644 system/diagnostic_graph_aggregator/example/example-main.launch.xml create mode 100644 system/diagnostic_graph_aggregator/example/graph/edit.yaml rename system/diagnostic_graph_aggregator/example/{example_0.yaml => graph/main.yaml} (83%) rename system/diagnostic_graph_aggregator/example/{example_1.yaml => graph/module1.yaml} (100%) rename system/diagnostic_graph_aggregator/example/{example_2.yaml => graph/module2.yaml} (100%) diff --git a/system/diagnostic_graph_aggregator/README.md b/system/diagnostic_graph_aggregator/README.md index 4dc44feaafc33..dabbb1402db4c 100644 --- a/system/diagnostic_graph_aggregator/README.md +++ b/system/diagnostic_graph_aggregator/README.md @@ -53,20 +53,27 @@ This feature breaks the generality of the graph and may be changed to a plugin o ## Examples -- [example_0.yaml](./example/example_0.yaml) -- [example_1.yaml](./example/example_1.yaml) -- [example_2.yaml](./example/example_2.yaml) +This is an example of a diagnostic graph configuration. The configuration can be split into multiple files. + +- [main.yaml](./example/graph/main.yaml) +- [module1.yaml](./example/graph/module1.yaml) +- [module2.yaml](./example/graph/module2.yaml) + +```bash +ros2 launch diagnostic_graph_aggregator example-main.launch.xml +``` + +You can reuse the graph by making partial edits. For example, disable hardware checks for simulation. + +- [edit.yaml](./example/graph/edit.yaml) ```bash -ros2 launch diagnostic_graph_aggregator example.launch.xml +ros2 launch diagnostic_graph_aggregator example-edit.launch.xml ``` ## Graph file format -- [GraphFile](./doc/format/graph-file.md) -- [Path](./doc/format/path.md) -- [Node](./doc/format/node.md) - - [Diag](./doc/format/diag.md) - - [Unit](./doc/format/unit.md) - - [And](./doc/format/and.md) - - [Or](./doc/format/or.md) +- [graph](./doc/format/graph.md) +- [path](./doc/format/path.md) +- [node](./doc/format/node.md) +- [edit](./doc/format/edit.md) diff --git a/system/diagnostic_graph_aggregator/doc/format/and.md b/system/diagnostic_graph_aggregator/doc/format/and.md deleted file mode 100644 index a92aa2817832e..0000000000000 --- a/system/diagnostic_graph_aggregator/doc/format/and.md +++ /dev/null @@ -1,11 +0,0 @@ -# Unit - -And is a node that is evaluated as the AND of the input nodes. - -## Format - -| Name | Type | Required | Description | -| ---- | ------------------------------------------ | -------- | ------------------------------------- | -| type | string | yes | Specify `and` when using this object. | -| name | string | yes | Name of diagnostic status. | -| list | List<[Diag](./diag.md)\|[Unit](./unit.md)> | yes | List of input node references. | diff --git a/system/diagnostic_graph_aggregator/doc/format/diag.md b/system/diagnostic_graph_aggregator/doc/format/diag.md deleted file mode 100644 index 04e850129cbbf..0000000000000 --- a/system/diagnostic_graph_aggregator/doc/format/diag.md +++ /dev/null @@ -1,10 +0,0 @@ -# Diag - -Diag is a node that refers to a source diagnostics. - -## Format - -| Name | Type | Required | Description | -| ---- | ------ | -------- | -------------------------------------- | -| type | string | yes | Specify `diag` when using this object. | -| diag | string | yes | Name of diagnostic status. | diff --git a/system/diagnostic_graph_aggregator/doc/format/edit.md b/system/diagnostic_graph_aggregator/doc/format/edit.md new file mode 100644 index 0000000000000..71ea8a96bc17f --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/edit.md @@ -0,0 +1,14 @@ +# Edit + +The `edit` is a base object that edits the existing diagnostic graph. +Any derived object can be used where a edit object is required. + +## Format + +| Name | Type | Required | Description | +| ------ | -------- | -------- | ------------------------------------------------- | +| `type` | `string` | yes | The string indicating the type of derived object. | + +## Derived objects + +- [remove](./edit/remove.md) diff --git a/system/diagnostic_graph_aggregator/doc/format/edit/remove.md b/system/diagnostic_graph_aggregator/doc/format/edit/remove.md new file mode 100644 index 0000000000000..6cd4b25e98828 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/edit/remove.md @@ -0,0 +1,10 @@ +# Remove + +The `remove` object is a edit that removes other nodes. + +## Format + +| Name | Type | Required | Description | +| ------ | -------- | -------- | ---------------------------------------- | +| `type` | `string` | yes | Specify `remove` when using this object. | +| `path` | `string` | yes | The path of the node to remove. | diff --git a/system/diagnostic_graph_aggregator/doc/format/graph-file.md b/system/diagnostic_graph_aggregator/doc/format/graph-file.md deleted file mode 100644 index 3c4cfec996a4a..0000000000000 --- a/system/diagnostic_graph_aggregator/doc/format/graph-file.md +++ /dev/null @@ -1,10 +0,0 @@ -# GraphFile - -GraphFile is the top level object that makes up the configuration file. - -## Format - -| Name | Type | Required | Description | -| ----- | ----------------------- | -------- | ------------------------------ | -| files | List<[Path](./path.md)> | no | Paths of the files to include. | -| nodes | List<[Node](./node.md)> | no | Nodes of the diagnostic graph. | diff --git a/system/diagnostic_graph_aggregator/doc/format/graph.md b/system/diagnostic_graph_aggregator/doc/format/graph.md new file mode 100644 index 0000000000000..9dace8a2f0e6d --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/graph.md @@ -0,0 +1,11 @@ +# Graph + +The graph object is the top level structure that makes up the configuration file. + +## Format + +| Name | Type | Required | Description | +| ------- | -------------------------------------- | -------- | ------------------------------------------------- | +| `files` | list\[[path](./path.md)\] | no | List of path objects for importing subgraphs. | +| `nodes` | list\[[node](./node.md)\] | no | List of node objects that make up the graph. | +| `edits` | list\[[edit](./edit.md)\] | no | List of edit objects to partially edit the graph. | diff --git a/system/diagnostic_graph_aggregator/doc/format/node.md b/system/diagnostic_graph_aggregator/doc/format/node.md index da8e8e57b111f..0f4b52b9b8a72 100644 --- a/system/diagnostic_graph_aggregator/doc/format/node.md +++ b/system/diagnostic_graph_aggregator/doc/format/node.md @@ -1,9 +1,25 @@ # Node -Node is a base object that makes up the diagnostic graph. +The `node` is a base object that makes up the diagnostic graph. +Any derived object can be used where a node object is required. ## Format -| Name | Type | Required | Description | -| ---- | ------ | -------- | ------------------------------------------- | -| type | string | yes | Node type. See derived objects for details. | +| Name | Type | Required | Description | +| ------ | -------- | -------- | ------------------------------------------------- | +| `type` | `string` | yes | The string indicating the type of derived object. | +| `path` | `string` | no | Any string to reference from other nodes. | + +## Derived objects + +- [diag](./node/diag.md) +- [and](./node/and.md) +- [or](./node/or.md) +- [remapping](./node/remap.md) + - warn-to-ok + - warn-to-error +- [constant](./node/const.md) + - ok + - warn + - error + - stale diff --git a/system/diagnostic_graph_aggregator/doc/format/node/and.md b/system/diagnostic_graph_aggregator/doc/format/node/and.md new file mode 100644 index 0000000000000..562018bf0995b --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/and.md @@ -0,0 +1,17 @@ +# And + +The `and` object is a node that is evaluated as the maximum error level of the input nodes. +Note that error level `stale` is treated as `error`. + +## Format + +| Name | Type | Required | Description | +| ------ | -------------------------------------- | -------- | ------------------------------------------------------------ | +| `type` | string | yes | Specify `and` or `short-circuit-and` when using this object. | +| `list` | list\[[node](../node.md)] | yes | List of input node objects. | + +## Short-circuit evaluation + +!!! warning + + The`short-circuit-and` is work in progress (WIP). diff --git a/system/diagnostic_graph_aggregator/doc/format/node/const.md b/system/diagnostic_graph_aggregator/doc/format/node/const.md new file mode 100644 index 0000000000000..13495be6cdbda --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/const.md @@ -0,0 +1,18 @@ +# Constant + +The constant object is a node with a fixed error level. + +## Format + +| Name | Type | Required | Description | +| ------ | -------- | -------- | ------------------------------------------- | +| `type` | `string` | yes | Specify error level when using this object. | + +## Error levels + +The supported error levels are as follows. + +- `ok` +- `warn` +- `error` +- `stale` diff --git a/system/diagnostic_graph_aggregator/doc/format/node/diag.md b/system/diagnostic_graph_aggregator/doc/format/node/diag.md new file mode 100644 index 0000000000000..beba8ed0df5b4 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/diag.md @@ -0,0 +1,10 @@ +# Diag + +The `diag` object is a node that refers to a specific status within the source diagnostics. + +## Format + +| Name | Type | Required | Description | +| ------ | -------- | -------- | -------------------------------------- | +| `type` | `string` | yes | Specify `diag` when using this object. | +| `diag` | `string` | yes | The name of the diagnostic status. | diff --git a/system/diagnostic_graph_aggregator/doc/format/node/link.md b/system/diagnostic_graph_aggregator/doc/format/node/link.md new file mode 100644 index 0000000000000..c23aa92575e54 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/link.md @@ -0,0 +1,10 @@ +# Link + +The `link` object is a node that refers to other nodes. + +## Format + +| Name | Type | Required | Description | +| ------ | -------- | -------- | -------------------------------------- | +| `type` | `string` | yes | Specify `link` when using this object. | +| `link` | `string` | yes | The path of the node to reference. | diff --git a/system/diagnostic_graph_aggregator/doc/format/node/or.md b/system/diagnostic_graph_aggregator/doc/format/node/or.md new file mode 100644 index 0000000000000..74e94ffd628e3 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/or.md @@ -0,0 +1,11 @@ +# Or + +The `or` object is a node that is evaluated as the minimum error level of the input nodes. +Note that error level `stale` is treated as `error`. + +## Format + +| Name | Type | Required | Description | +| ------ | -------------------------------------- | -------- | ------------------------------------ | +| `type` | string | yes | Specify `or` when using this object. | +| `list` | list\[[node](../node.md)] | yes | List of input node objects. | diff --git a/system/diagnostic_graph_aggregator/doc/format/node/remap.md b/system/diagnostic_graph_aggregator/doc/format/node/remap.md new file mode 100644 index 0000000000000..abf0d11fae12d --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/format/node/remap.md @@ -0,0 +1,21 @@ +# Constant + +!!! warning + + This object is under development. It may be removed in the future. + +The remapping object is a node that converts error levels. + +## Format + +| Name | Type | Required | Description | +| ------ | -------------------------------------- | -------- | ---------------------------------------------------- | +| `type` | `string` | yes | Specify remapping type when using this object. | +| `list` | list\[[node](../node.md)] | yes | List of input node objects. The list size must be 1. | + +## Remapping types + +The supported remapping types are as follows. + +- `warn-to-ok` +- `warn-to-error` diff --git a/system/diagnostic_graph_aggregator/doc/format/or.md b/system/diagnostic_graph_aggregator/doc/format/or.md deleted file mode 100644 index 3e668b686c9e8..0000000000000 --- a/system/diagnostic_graph_aggregator/doc/format/or.md +++ /dev/null @@ -1,11 +0,0 @@ -# Unit - -Or is a node that is evaluated as the OR of the input nodes. - -## Format - -| Name | Type | Required | Description | -| ---- | ------------------------------------------ | -------- | ------------------------------------ | -| type | string | yes | Specify `or` when using this object. | -| name | string | yes | Name of diagnostic status. | -| list | List<[Diag](./diag.md)\|[Unit](./unit.md)> | yes | List of input node references. | diff --git a/system/diagnostic_graph_aggregator/doc/format/path.md b/system/diagnostic_graph_aggregator/doc/format/path.md index 1f27accefa35a..591d048d31527 100644 --- a/system/diagnostic_graph_aggregator/doc/format/path.md +++ b/system/diagnostic_graph_aggregator/doc/format/path.md @@ -1,10 +1,10 @@ # Path -Path is an object that indicates the path of the file to include. +The path object specifies the file path of the subgraph to be imported. +The structure of the subgraph file should be [graph object](./graph.md). ## Format -| Name | Type | Required | Description | -| ------- | ------ | -------- | ----------------------------- | -| package | string | yes | Package name. | -| path | string | yes | Relative path in the package. | +| Name | Type | Required | Description | +| ------ | -------- | -------- | ------------------------------ | +| `path` | `string` | yes | The file path of the subgraph. | diff --git a/system/diagnostic_graph_aggregator/doc/format/unit.md b/system/diagnostic_graph_aggregator/doc/format/unit.md deleted file mode 100644 index 791689aa2d98a..0000000000000 --- a/system/diagnostic_graph_aggregator/doc/format/unit.md +++ /dev/null @@ -1,10 +0,0 @@ -# Unit - -Diag is a node that refers to a functional unit. - -## Format - -| Name | Type | Required | Description | -| ---- | ------ | -------- | -------------------------------------- | -| type | string | yes | Specify `unit` when using this object. | -| name | string | yes | Name of diagnostic status. | diff --git a/system/diagnostic_graph_aggregator/example/example_diags.py b/system/diagnostic_graph_aggregator/example/dummy-diags.py similarity index 100% rename from system/diagnostic_graph_aggregator/example/example_diags.py rename to system/diagnostic_graph_aggregator/example/dummy-diags.py diff --git a/system/diagnostic_graph_aggregator/example/example.launch.xml b/system/diagnostic_graph_aggregator/example/example-edit.launch.xml similarity index 81% rename from system/diagnostic_graph_aggregator/example/example.launch.xml rename to system/diagnostic_graph_aggregator/example/example-edit.launch.xml index 71e59a1833d6e..91bcc46df6494 100644 --- a/system/diagnostic_graph_aggregator/example/example.launch.xml +++ b/system/diagnostic_graph_aggregator/example/example-edit.launch.xml @@ -1,7 +1,7 @@ - + - + diff --git a/system/diagnostic_graph_aggregator/example/example-main.launch.xml b/system/diagnostic_graph_aggregator/example/example-main.launch.xml new file mode 100644 index 0000000000000..ab7bfaa2e0617 --- /dev/null +++ b/system/diagnostic_graph_aggregator/example/example-main.launch.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/system/diagnostic_graph_aggregator/example/graph/edit.yaml b/system/diagnostic_graph_aggregator/example/graph/edit.yaml new file mode 100644 index 0000000000000..2fbdbffca438d --- /dev/null +++ b/system/diagnostic_graph_aggregator/example/graph/edit.yaml @@ -0,0 +1,6 @@ +files: + - { path: $(find-pkg-share diagnostic_graph_aggregator)/example/graph/main.yaml } + +edits: + - path: /functions/obstacle_detection + type: remove diff --git a/system/diagnostic_graph_aggregator/example/example_0.yaml b/system/diagnostic_graph_aggregator/example/graph/main.yaml similarity index 83% rename from system/diagnostic_graph_aggregator/example/example_0.yaml rename to system/diagnostic_graph_aggregator/example/graph/main.yaml index 7b01883723c76..2bea907d9c119 100644 --- a/system/diagnostic_graph_aggregator/example/example_0.yaml +++ b/system/diagnostic_graph_aggregator/example/graph/main.yaml @@ -1,6 +1,6 @@ files: - - { path: $(find-pkg-share diagnostic_graph_aggregator)/example/example_1.yaml } - - { path: $(find-pkg-share diagnostic_graph_aggregator)/example/example_2.yaml } + - { path: $(dirname)/module1.yaml } + - { path: $(dirname)/module2.yaml } nodes: - path: /autoware/modes/stop diff --git a/system/diagnostic_graph_aggregator/example/example_1.yaml b/system/diagnostic_graph_aggregator/example/graph/module1.yaml similarity index 100% rename from system/diagnostic_graph_aggregator/example/example_1.yaml rename to system/diagnostic_graph_aggregator/example/graph/module1.yaml diff --git a/system/diagnostic_graph_aggregator/example/example_2.yaml b/system/diagnostic_graph_aggregator/example/graph/module2.yaml similarity index 100% rename from system/diagnostic_graph_aggregator/example/example_2.yaml rename to system/diagnostic_graph_aggregator/example/graph/module2.yaml From d313a581b54cf89428b2efe1babba4ffe0e0ba67 Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 02:47:29 +0900 Subject: [PATCH 2/6] add substitutions Signed-off-by: Takagi, Isamu --- system/diagnostic_graph_aggregator/doc/format/path.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/system/diagnostic_graph_aggregator/doc/format/path.md b/system/diagnostic_graph_aggregator/doc/format/path.md index 591d048d31527..6ca32a7eaad80 100644 --- a/system/diagnostic_graph_aggregator/doc/format/path.md +++ b/system/diagnostic_graph_aggregator/doc/format/path.md @@ -8,3 +8,12 @@ The structure of the subgraph file should be [graph object](./graph.md). | Name | Type | Required | Description | | ------ | -------- | -------- | ------------------------------ | | `path` | `string` | yes | The file path of the subgraph. | + +## Substitutions + +File paths can contain substitutions like ROS 2 launch. The supported substitutions are as follows. + +| Substitution | Description | +| ----------------------------- | -------------------------------- | +| `$(dirname)` | The path of this file directory. | +| `$(find-pkg-share )` | The path of the package. | From 56517154461fbb25e81761a42e253a6ceaf246e8 Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 10:26:17 +0900 Subject: [PATCH 3/6] update tools Signed-off-by: Takagi, Isamu --- .../CMakeLists.txt | 13 +- system/diagnostic_graph_aggregator/README.md | 6 + .../doc/tool/converter.md | 29 ++++ .../doc/tool/dump.md | 36 +++++ .../doc/tool/images/rqt_robot_monitor.png | Bin 0 -> 87323 bytes .../doc/tool/images/rqt_runtime_monitor.png | Bin 0 -> 82540 bytes .../doc/tool/tree.md | 40 +++++ .../example/example-edit.launch.xml | 5 +- .../example/example-main.launch.xml | 7 +- ...gator.launch.xml => aggregator.launch.xml} | 0 .../launch/converter.launch.xml | 6 + .../script/dump.py | 1 - .../src/node/converter.cpp | 40 ++++- .../src/node/converter.hpp | 5 + .../src/tool/plantuml.cpp | 49 ++++++ .../src/tool/tool.cpp | 140 ------------------ .../src/tool/tree.cpp | 69 +++++++++ .../src/tool/utils/loader.cpp | 57 +++++++ .../src/tool/utils/loader.hpp | 48 ++++++ 19 files changed, 403 insertions(+), 148 deletions(-) create mode 100644 system/diagnostic_graph_aggregator/doc/tool/converter.md create mode 100644 system/diagnostic_graph_aggregator/doc/tool/dump.md create mode 100644 system/diagnostic_graph_aggregator/doc/tool/images/rqt_robot_monitor.png create mode 100644 system/diagnostic_graph_aggregator/doc/tool/images/rqt_runtime_monitor.png create mode 100644 system/diagnostic_graph_aggregator/doc/tool/tree.md rename system/diagnostic_graph_aggregator/launch/{diagnostic_graph_aggregator.launch.xml => aggregator.launch.xml} (100%) create mode 100644 system/diagnostic_graph_aggregator/launch/converter.launch.xml create mode 100644 system/diagnostic_graph_aggregator/src/tool/plantuml.cpp delete mode 100644 system/diagnostic_graph_aggregator/src/tool/tool.cpp create mode 100644 system/diagnostic_graph_aggregator/src/tool/tree.cpp create mode 100644 system/diagnostic_graph_aggregator/src/tool/utils/loader.cpp create mode 100644 system/diagnostic_graph_aggregator/src/tool/utils/loader.hpp diff --git a/system/diagnostic_graph_aggregator/CMakeLists.txt b/system/diagnostic_graph_aggregator/CMakeLists.txt index c4a67032541b2..574978ec5adce 100644 --- a/system/diagnostic_graph_aggregator/CMakeLists.txt +++ b/system/diagnostic_graph_aggregator/CMakeLists.txt @@ -22,10 +22,17 @@ ament_auto_add_executable(converter ) target_include_directories(converter PRIVATE src/common) -ament_auto_add_executable(tool - src/tool/tool.cpp +ament_auto_add_executable(tree + src/tool/tree.cpp + src/tool/utils/loader.cpp ) -target_include_directories(tool PRIVATE src/common) +target_include_directories(tree PRIVATE src/common) + +ament_auto_add_executable(plantuml + src/tool/plantuml.cpp + src/tool/utils/loader.cpp +) +target_include_directories(plantuml PRIVATE src/common) if(BUILD_TESTING) get_filename_component(RESOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/test/files ABSOLUTE) diff --git a/system/diagnostic_graph_aggregator/README.md b/system/diagnostic_graph_aggregator/README.md index dabbb1402db4c..cc49ed88ba98f 100644 --- a/system/diagnostic_graph_aggregator/README.md +++ b/system/diagnostic_graph_aggregator/README.md @@ -71,6 +71,12 @@ You can reuse the graph by making partial edits. For example, disable hardware c ros2 launch diagnostic_graph_aggregator example-edit.launch.xml ``` +## Debug tools + +- [dump](./doc/tool/dump.md) +- [converter](./doc/tool/converter.md) +- [tree](./doc/tool/tree.md) + ## Graph file format - [graph](./doc/format/graph.md) diff --git a/system/diagnostic_graph_aggregator/doc/tool/converter.md b/system/diagnostic_graph_aggregator/doc/tool/converter.md new file mode 100644 index 0000000000000..b98d7eac32970 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/tool/converter.md @@ -0,0 +1,29 @@ +# Converter tool + +This tool converts `/diagnostics_graph` to `/diagnostics_agg` so it can be read by tools such as `rqt_runtime_monitor` and `rqt_robot_monitor`. + +## Usage + +```bash +ros2 launch diagnostic_graph_aggregator converter.launch.xml complement:=false +``` + +The `complement` argument specifies whether to add an intermediate path that does not exist. +This means that if the graph contains paths `/A/B` and `/A/B/C/D/E`, the intermediate paths `/A`, `/A/B/C` and `/A/B/C/D` will be added. +This is useful for tree view in `rqt_robot_monitor`. The completed node has an error level of `SATLE`. + +## Examples + +```bash +ros2 launch diagnostic_graph_aggregator example-main.launch.xml complement:=false +ros2 run rqt_runtime_monitor rqt_runtime_monitor --ros-args -r diagnostics:=diagnostics_agg +``` + +![rqt_runtime_monitor](./images/rqt_runtime_monitor.png) + +```bash +ros2 launch diagnostic_graph_aggregator example-main.launch.xml complement:=true +ros2 run rqt_robot_monitor rqt_robot_monitor +``` + +![rqt_robot_monitor](./images/rqt_robot_monitor.png) diff --git a/system/diagnostic_graph_aggregator/doc/tool/dump.md b/system/diagnostic_graph_aggregator/doc/tool/dump.md new file mode 100644 index 0000000000000..33f05ff866603 --- /dev/null +++ b/system/diagnostic_graph_aggregator/doc/tool/dump.md @@ -0,0 +1,36 @@ +# Dump tool + +This tool displays `/diagnostics_graph` in table format. + +## Usage + +```bash +ros2 run diagnostic_graph_aggregator dump +``` + +## Examples + +```bash +ros2 launch diagnostic_graph_aggregator example-main.launch.xml +ros2 run diagnostic_graph_aggregator dump +``` + +```txt +| ----- | ----- | -------------------------------- | ----- | +| index | level | name | links | +| ----- | ----- | -------------------------------- | ----- | +| 0 | OK | /sensing/radars/front | | +| 1 | OK | /sensing/lidars/front | | +| 2 | ERROR | /sensing/lidars/top | | +| 3 | OK | /functions/obstacle_detection | 1 0 | +| 4 | ERROR | /functions/pose_estimation | 2 | +| 5 | OK | /external/remote_command | | +| 6 | OK | /external/joystick_command | | +| 7 | ERROR | /autoware/modes/pull_over | 4 3 | +| 8 | OK | /autoware/modes/comfortable_stop | 3 | +| 9 | OK | /autoware/modes/emergency_stop | | +| 10 | OK | /autoware/modes/remote | 5 | +| 11 | OK | /autoware/modes/local | 6 | +| 12 | ERROR | /autoware/modes/autonomous | 4 3 | +| 13 | OK | /autoware/modes/stop | | +``` diff --git a/system/diagnostic_graph_aggregator/doc/tool/images/rqt_robot_monitor.png b/system/diagnostic_graph_aggregator/doc/tool/images/rqt_robot_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..e4aa169f02addf3c6a60972c41bb4aee228e06b8 GIT binary patch literal 87323 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 pcA3VMTjV7%pPm; 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%0Du5v^+jiA86TBjS}9Z4dU7~ zJXMNR4F)}4#x4jf=JT)T_ipmtaFq`Oz*?FOWqW3LZmi27UXC3GuJULI+JQa4@^I3D zu$&{Mb^96L+%`X^u;{dUcOf-(GVN-xP?b+WRDj1S$~m^(%t0ZWO!%nccbdJ5Mv;f6 zZIfz$IDj{N`)jE4R*L-D`r_waK_(@a#38Gd}9kt&`3MW$TtM;wwqR znzRu}wpm9;*?~eczkmCez|S|@ElMigu@_W_-o?t5{`d!Vtbr(w;FQIQGI8pDtsPw8 zVi$dLyENg!XA1IUkf9u+PuE{WbwWFtiNZHO2ymddb!cQc7~*kKwiZ;voCeZtpBUQQj5#5&l==j5_@$^kb;`FQKynP`WcN;j zbpo=ha1ycJ@$D%LDgADauO_6CaLNd|<=nVtb8iUn{tHdOz_eqF>|Dj{Op<+J@g%F* zigaQ8@{b^=D!zGM^tDD;wzI}~wi;{T@JiqAD;%uVHhQmaXIyc`k2GPM0=y>cnRu_l zcf|(VN5a(5h4p8s!)R8~_H!?D;>rjt-Of$gzd$wfI^xV8N%E_))p_HfKNPMPHZ~bK z$3g1`uO3%coLgXhYJyTw!!&LI)|)br&s`t9f^{|x^lsuCTEO>FgNl8HGK@2D|LftN zsfNyy!&@YgJ>V?Gguc9l7s|S2blY4YxW>@PuxViR4IK6?K(NyXW=PdOP{VzT!S0y) zvb!6Uu9ECasSkH1;*cfu$sJZ&LqyeM26qAau19!kr0fH$H=SJ5Hly9Ik7Sk&A;Z|i z6&L&LxJG<`YScT03tu(oblck9wMEYex1m46v_*A&DNT)Ua#uq@pb|?~o~83@5fWDV3-Pb|)SM(;4}VVUicjP6PUaT(v@gX`0~oUp=} z?wL@b&kM~&fs1^x7cb#z<2sL&SPz4X4k^i#*6o|lW>C%4Bhp6d>%^nHXgH`|D2hIs z<1|U~RO8&TPr9M&ySJTKgj7TQPjQ~;wH>Ud!}o>tR-?nj8J8TgEJIHTiztyfJyU*5 zYv!Af=}cQkRNTRv)3%6kiUS94Z6RwbW5pB(|G52OlgXg*x#q;$BkDE9!qac9{p}5k z&u|BLb~qK>j!;S==YHL&!)tsP7HiV*doH89En-VZ!7CWXFpNlRtge>m`=a zQ7Ift1O8Od6Ygp>gT6H2wjPTvq(+Btm||kkYOB&E&;h2(( zMMcabQGmM`vj45P+Wv5tKW=uwXp*Xk4R+L(uKJ<{Usz{j3_A4F3~%ZnXggSS^DB%U zTW%fciR)Ulb;}~tj{HEnI9!wpRLM@QoAd-~yuh-}EXJRG+ZIniZ$Au0o4Y8=vb-Wa z_RM0ez;9Law5ZbOy}N^(%1};`qvpi+L;uv!Uy&Ad-KM=qIPOy09Q$w4*o6u^dahyv z+K5h5T*Ip~KF=6pVd-DHNjK%%KUh#tm2fgj`TYk(MA}e8)+{3W-3f2k*%#09gt!O8YVfVBZ zqsurl>eLDBqs4%QQd<(iOtBJ?(Xo77WHgd^{|#Is&P_7Hn5HVpr?)sx#d;&%k4!X| z-*A;8Vy$?hH}5*H3nICxn!Zup{+s_2htV)LMph> z?YMv^7o$I7vJ>C`R84gZ39FZud(Lz4TPKdA7f6->R=P<^Vpji&U$}jH7rUr`S+RHL zrzthFCYOmZEsy?s>?>!1L|0ANZYeyz+&B>WZ zp=esSCfZi!KKrsTxa|l=xolw|z=ha$n}4qQOn6I-G~gPC6787!3oUW5#GT(f-eZOu zVZeU}{L{i~!OQ+Fa*-r`XKN_93$)^?#;8A01CEbmQLIem%Hl&5x^zkQS5aeb*G1i5wy~ zSA>@4%xZY~<@N)Z>-fnKT>zXgmYaRR!G_4kDCC#YQ2Mk` z9s^Ov*t&E6!u#~wpK1#~-i$;*;1vDEENkL7pb4lBlk!E8Ib ztGD;qiX^Nlh5H_EjMlEioq<#BgIP?L%G)MOl~LDQ-cufN$^RL{-}BOwe>b>u=Cj~V z`}o%ahwE86s6#_5{iugAV@{?|7bO~XBZ#kGyU1M(k>b29Y61?h1S@Gttl)tS{}m87 zI3u3@ixBA5EQI}g-Abe<@|SmYX>Waa-Rbd z6yw?0LSdO;j!l^s74T7mctA_&KD0031#-mgonPVNg-3J7-jUroN>YmnPt7x5Pyjwh z^(`FgwC%Tqtc{t;bRI-1e8Kci@y}W$?}BF6^g=sw-P?Cy#5rz`1H>PfRzFQb*OE9( zh-)H${@PPW=&>X_^~`hIsFN_BioCFy=H^J>=G&i)bmSTFZqxbAg7Lq$P2j>-WzV2X zOv&@nexbw@a(7|UsN+!7*C;%Rn%Py97zfpB8(#ux%op0GtWDYMEZd~Fv82LI=wP#Yi01F*KW7z6%(j%a1+| z_4;j<(```-p>HWz+;v0{tt^la^!%mwk;zl`9-L{@obS$-!~D#2!I|5v757r6qU&#U z(Bz=PpXe)(bQDfG$Rk+s z@^ScU#4l$@m_kJwfrho4^u2^Z4Cm-LAgT@VI;An-&p4?N%?dJb4Ek$@i(WNKF@uOI z!yV2HzI67OInB;Q9+h>h1HVx?@p-T7kVaLc>ea1-m-m~4qI$mTQIE6Jl7k3r9C$t6(_yd@IG9P6rkwcb{4-xez0QZHVPtiw9T~jkbZUaCe^Ls) z)aa!2`p%nTq%oRBdx8*vx2$ z+@55mr8PRO3Ff=uXP;QPpUznEHL7E`LBqek5J+!T1`F)Q!wVM99Z$6^v1}hT=2FNFThHiZ+5_ECwKcZ|8VJXq&ZYMDr_!fL zTxkvzw>uu{e5>txX!)@LZ`F7~V6h@UILu46Sz=$deqB zlVVsI%0O(Tt)J=92e;1b9&LmP<_Zp;0zN@fuyfY1Ji1m#&n7&Ec13_?XbGxZdIYyN z(>hA*tu|8muq?`65^Xl0E&|z2Y%zPD_M}S*KvCY0=YTD1r1u3bk)+P4T>$s0z=Ev+fy53l5WO4CGq5Ye3_ToxBQRB2-Q;yHHIt6TYvWX zA;Lo`5wvs@kUjWg6`|^OP9b7NUm!&CCiG{nmu<{WdVRV*8r|H=t9wJp-#^*5Hg)#> z$Drw~T^BmY;L38J2M1QQDQfdfW!$!VUb1OdT-d{d7<1Uw=kzu5tj8UUWMf`z*J%2{ zwRPDlt8FRJ#d~q{%INy5*T&Z6_Kt#A_cwesMYvne>UC`VRHi@;9>CfU9AkRZF<7e) z_6(?P8gNsUM$_r_7M*l1xyLSKPishxH1&zQKXEc`yd$t?FzxQ_&neg0j0COi_GcNr z7uYqKuGqzibPk>XkW}rI`Iaihg~}BUCm#dT6GXlO_V&9Jt;&c>)_IWFU3p&+<%GKY z8Zjdq!5RI=gEh7-5{Ac-Dx%^wRMGOqS0RbTlhL3t_wCBQVBpd%+fl4Pd;LdA&-#$l z5PDa4f}yJsvwYZT%hygnfS8YFu)KIH5wcov(mTKerTyCXyDjl?-gKK^??lF&M=e?% zr{uuy`)&w#ml;|HRs|YWspO6LKk?EgGi>+5&;96D_X_eDKeK*$l)PgWG~-$Ib2guM zZj(1|tBh#O0=S&6-1W8Wq~C+x;i9GdJ*8cv_tUMw@|Sh&2Z8$^HGjrm%~l#cwOY8G zBJ;dP&1L;`7^UfSfhN6|!e@BLh#zd9)^V2-5Be^E0v3{%rhyJb&eD-itnqnN=H~U& zh!5Yoja&aP!|)2uY5UX!4)}0XWI7q|n<)L*1Y^{v7s0N^K_k z)6~*CywO$0BPJJ@uUCinUG41|Fp>I*$;pFKQ%l2I9TAN-mBNprrG$mo$*+c}?ec%* zV(_~LG2FBk?OgXoV$nO`&hp%2Ypjo`Kr+x8y9tDo$MPwoC@RhJyV1c$jI1Z+#aCr+ z2xx2FG7;c1e9>kfU+*mTwjw-eb$`9A{}@-<=$xZ)Zd;KYPMyLTa1_awRN%}#fQSQ_ zSCFs&w=-Pq>K#86HYE%UlpkVG( z@4knk{jY*V;RnR{xJ}N8tmJ}0Uc76`BFe`T+y)d4rd*Th)P%corlx6ZHrKKP7@(0G zgVC+p3lZSe?a?H$+r+VZu`1f?P6zk9bK;@fHti7^jDz0uHS+5R8WrGb-+fPMO;!e6 ztcN^)9dAw1W5U^}&d;yxp^4t3WexgZ!fNviN0yehVZ;1g4POlQtRG(9t=Pb++Ry-=seoP%^%^=~b5wk9e1;f0&t~?zZG2ZA<qMhg;YkF+Up(3E)t9i8ep!`3usJgRr#_uz!Z3Juyxns57zfPkcfKXWoin_M ziVo29TIxc3xWSO#`H)MiISd!6)sf$XqW>6eYf*2(RYcA+umNS89=&klHXyLEx!n!# z_||N&PA(-)#)>{eXpe%fh=jO}dtS`Jqj%q8>yeC9Qfc0)Z;(7s32s(FPF=WO3(7T# zFux?1gF6Mxa<>g-I;*IuDJdr>7kbBiwPf#M??opT-5MMc8p?iHzfJ~42ZgMl<~_5g zud#S9iv9QnJrsbYgtpCIaK79}_Zhno+iS|lSJ@x%r5fykppI4ef(TvXx;#62VgjMB zpDe4^zwW6jUR#7f@XC^|Vk2A*x78XkvoLdVqZe7}1tH_&Pk5ylnMezcqO^*9zc^Bw z+WK2?*l$W8CwDh6&{!abB?aOjz0V27(!TLR)+D0kM7xsXpc&YcbMc|e@yfzzCQN}s zy&>4wOMrbZ+uY?dc-27?G%^*0nwOCS7uiY+`f^7F88JQM7Cx5`ka=H$G0-Un8 z`_AfZH(ZzIHi8az6_1(EDb+y!e~Jd+ibC3$M2wPA_4!La1W6h46&*|D_xva%IeohS zzn%UOHUrkw)Vw#k5QxrJKD&x0F*S*DCw@?fL?phd_K029Y>`S9T$i0IWNy*b{eLX9YFTnDwZo_nF0nnWN|T!q7Z%a z?-p`mXJ%%upo{4j;zWX}R)20K(*!imdpdfwH_?3(6)`H+4qu+1q(-cw>q(sf?Re6Y z@g-+3C;igg^Wg%i5WGjs4+tNI1y1;tVnX5spq_0U$iG8=y2BNKO7ZLg;C_C7swra< z?B6AaglrMzI@F*H1eDZ&=|T#NnE@fCLxEJf7PKMAD(Q!lOS0`Yzoee+@8ZxTt$O=p zehKEEMxlAN0lmwlm_GqclV$7L2jTMwt}E%}pRKn_j<+i+D8x*;>FKSSwu@)r=bLNx z)Y8imq@vSnPXqkXpS!e}SiV7Jl{G8Ffmk_Ba+_9q?kd(us?n<8j~T9zD)jV<1Mc$47Bo(*^0sVml!^d`nAud zC$`_FT9oA+?S^CK`wr@U3BkoA+as?BHd}q56SOf3jJeL z3|~pd4uQRcU#gxX2KaS^uN`+g-P!4Md&jxj>1>dU* z&T1r+(ree7nQByZAS4GCy^-ot`ie)TJpLt4GG~DPxtHt?zC%*#FtU#;a#1Q4TuheK ze#^z~ff4(wDgzCt^vB{FOrhYYB0G{S#OOpqX2a^2iv3_;C3`+9y^N67n +``` + +## Examples + +```bash +ros2 run diagnostic_graph_aggregator tree system/diagnostic_graph_aggregator/example/graph/main.yaml +``` + +```txt +===== root nodes ================================= +- /autoware/modes/local (and) + - /external/joystick_command (diag) +- /autoware/modes/comfortable_stop (and) + - /functions/obstacle_detection (or) +- /autoware/modes/pull_over (and) + - /functions/pose_estimation (and) + - /functions/obstacle_detection (or) +- /autoware/modes/autonomous (and) + - /functions/pose_estimation (and) + - /functions/obstacle_detection (or) +- /autoware/modes/remote (and) + - /external/remote_command (diag) +===== intermediate nodes ========================= +- /functions/obstacle_detection (or) + - /sensing/lidars/front (diag) + - /sensing/radars/front (diag) +- /functions/pose_estimation (and) + - /sensing/lidars/top (diag) +===== isolated nodes ============================= +- /autoware/modes/stop (const) +- /autoware/modes/emergency_stop (const) +``` diff --git a/system/diagnostic_graph_aggregator/example/example-edit.launch.xml b/system/diagnostic_graph_aggregator/example/example-edit.launch.xml index 91bcc46df6494..c168b76f19c21 100644 --- a/system/diagnostic_graph_aggregator/example/example-edit.launch.xml +++ b/system/diagnostic_graph_aggregator/example/example-edit.launch.xml @@ -1,7 +1,10 @@ + - + + + diff --git a/system/diagnostic_graph_aggregator/example/example-main.launch.xml b/system/diagnostic_graph_aggregator/example/example-main.launch.xml index ab7bfaa2e0617..cdc1bc8afca53 100644 --- a/system/diagnostic_graph_aggregator/example/example-main.launch.xml +++ b/system/diagnostic_graph_aggregator/example/example-main.launch.xml @@ -1,7 +1,10 @@ - + + - + + + diff --git a/system/diagnostic_graph_aggregator/launch/diagnostic_graph_aggregator.launch.xml b/system/diagnostic_graph_aggregator/launch/aggregator.launch.xml similarity index 100% rename from system/diagnostic_graph_aggregator/launch/diagnostic_graph_aggregator.launch.xml rename to system/diagnostic_graph_aggregator/launch/aggregator.launch.xml diff --git a/system/diagnostic_graph_aggregator/launch/converter.launch.xml b/system/diagnostic_graph_aggregator/launch/converter.launch.xml new file mode 100644 index 0000000000000..effebf8381ee1 --- /dev/null +++ b/system/diagnostic_graph_aggregator/launch/converter.launch.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/system/diagnostic_graph_aggregator/script/dump.py b/system/diagnostic_graph_aggregator/script/dump.py index 3e639cbce104d..9abcaeb7a080c 100755 --- a/system/diagnostic_graph_aggregator/script/dump.py +++ b/system/diagnostic_graph_aggregator/script/dump.py @@ -84,7 +84,6 @@ def callback(self, msg): if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--topic", default="/diagnostics_graph") - parser.add_argument("--order", default="index") args, unparsed = parser.parse_known_args() try: diff --git a/system/diagnostic_graph_aggregator/src/node/converter.cpp b/system/diagnostic_graph_aggregator/src/node/converter.cpp index 89acfce31a5ab..54360fa033985 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.cpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.cpp @@ -16,6 +16,8 @@ #include #include +#include +#include namespace diagnostic_graph_aggregator { @@ -35,6 +37,29 @@ std::string level_to_string(DiagnosticLevel level) return "UNKNOWN"; } +std::string parent_path(const std::string & path) +{ + return path.substr(0, path.rfind('/')); +} + +std::vector complement_paths(const DiagnosticGraph & graph) +{ + std::unordered_map paths; + for (const auto & node : graph.nodes) { + std::string path = node.status.name; + paths[path] = false; + while (path = parent_path(path), !path.empty()) { + if (paths.count(path)) break; + paths[path] = true; + } + } + std::vector result; + for (const auto & [path, flag] : paths) { + if (flag) result.push_back(path); + } + return result; +} + ToolNode::ToolNode() : Node("diagnostic_graph_aggregator_converter") { using std::placeholders::_1; @@ -43,7 +68,8 @@ ToolNode::ToolNode() : Node("diagnostic_graph_aggregator_converter") const auto callback = std::bind(&ToolNode::on_graph, this, _1); sub_graph_ = create_subscription("/diagnostics_graph", qos_graph, callback); - pub_array_ = create_publisher("/diagnostics_array", qos_array); + pub_array_ = create_publisher("/diagnostics_agg", qos_array); + complement_inner_nodes_ = declare_parameter("complement_inner_nodes"); } void ToolNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) @@ -63,6 +89,18 @@ void ToolNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) } } } + + if (complement_inner_nodes_) { + if (!inner_node_names_) { + inner_node_names_ = complement_paths(*msg); + } + for (const auto & name : inner_node_names_.value()) { + message.status.emplace_back(); + message.status.back().name = name; + message.status.back().level = DiagnosticStatus::STALE; + } + } + pub_array_->publish(message); } diff --git a/system/diagnostic_graph_aggregator/src/node/converter.hpp b/system/diagnostic_graph_aggregator/src/node/converter.hpp index 7a3e8e4e58033..62fbfc518b16e 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.hpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.hpp @@ -19,6 +19,9 @@ #include +#include +#include + namespace diagnostic_graph_aggregator { @@ -28,6 +31,8 @@ class ToolNode : public rclcpp::Node ToolNode(); private: + bool complement_inner_nodes_; + std::optional> inner_node_names_; rclcpp::Subscription::SharedPtr sub_graph_; rclcpp::Publisher::SharedPtr pub_array_; void on_graph(const DiagnosticGraph::ConstSharedPtr msg); diff --git a/system/diagnostic_graph_aggregator/src/tool/plantuml.cpp b/system/diagnostic_graph_aggregator/src/tool/plantuml.cpp new file mode 100644 index 0000000000000..bfbb382a78fcb --- /dev/null +++ b/system/diagnostic_graph_aggregator/src/tool/plantuml.cpp @@ -0,0 +1,49 @@ +// Copyright 2023 The Autoware Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "utils/loader.hpp" + +#include + +namespace diagnostic_graph_aggregator +{ + +void dump_root(const std::string & path) +{ + const auto graph = load_graph_nodes(path); + const auto color = "#FFFFFF"; + + for (const auto & node : graph.nodes) { + std::cout << "card " << node << " " << color << " [" << std::endl; + std::cout << node->path << std::endl; + std::cout << "]" << std::endl; + } + + for (const auto & node : graph.nodes) { + for (const auto & child : node->children) { + std::cout << node << " --> " << child << std::endl; + } + } +} + +} // namespace diagnostic_graph_aggregator + +int main(int argc, char ** argv) +{ + if (argc != 2) { + std::cerr << "usage: plantuml " << std::endl; + return 1; + } + diagnostic_graph_aggregator::dump_root(argv[1]); +} diff --git a/system/diagnostic_graph_aggregator/src/tool/tool.cpp b/system/diagnostic_graph_aggregator/src/tool/tool.cpp deleted file mode 100644 index 657f76c2d91b7..0000000000000 --- a/system/diagnostic_graph_aggregator/src/tool/tool.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2023 The Autoware Contributors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "graph/graph.hpp" -#include "graph/types.hpp" -#include "graph/units.hpp" - -#include -#include -#include - -namespace diagnostic_graph_aggregator -{ - -struct GraphNode -{ - using UniquePtr = std::unique_ptr; - std::string type; - std::string path; - std::vector children; - std::vector parents; -}; - -struct GraphRoot -{ - std::vector owner; - std::vector nodes; -}; - -GraphRoot load_graph_nodes(const std::string & path) -{ - GraphRoot result; - { - std::unordered_map mapping; - Graph graph; - graph.init(path); - - for (const auto & node : graph.nodes()) { - auto data = std::make_unique(); - data->path = node->path(); - data->type = node->type(); - mapping[node] = std::move(data); - } - - for (const auto & [node, data] : mapping) { - for (const auto & link : node->children()) { - const auto parent = data.get(); - const auto child = mapping.at(link).get(); - child->parents.push_back(parent); - parent->children.push_back(child); - } - } - - for (auto & [node, data] : mapping) { - result.owner.push_back(std::move(data)); - } - for (const auto & node : result.owner) { - result.nodes.push_back(node.get()); - } - } - return result; -} - -void dump_plantuml_path(const std::string & path) -{ - const auto graph = load_graph_nodes(path); - const auto color = "#FFFFFF"; - - for (const auto & node : graph.nodes) { - std::cout << "card " << node << " " << color << " [" << std::endl; - std::cout << node->path << std::endl; - std::cout << "]" << std::endl; - } - - for (const auto & node : graph.nodes) { - for (const auto & child : node->children) { - std::cout << node << " --> " << child << std::endl; - } - } -} - -void dump_tree_node(const GraphNode * node, const std::string & indent = "", bool root = true) -{ - const auto path = node->path.empty() ? "" : node->path + " "; - const auto type = "(" + node->type + ")"; - std::cout << indent << "- " << path << type << std::endl; - - if (root || node->parents.size() == 1) { - for (const auto child : node->children) { - dump_tree_node(child, indent + " ", false); - } - } -} - -void dump_tree_path(const std::string & path) -{ - const auto graph = load_graph_nodes(path); - - std::cout << "===== root nodes =================================" << std::endl; - for (const auto & node : graph.nodes) { - if (node->parents.size() == 0 && node->children.size() != 0) { - dump_tree_node(node); - } - } - std::cout << "===== intermediate nodes =========================" << std::endl; - for (const auto & node : graph.nodes) { - if (node->parents.size() >= 2) { - dump_tree_node(node); - } - } - - std::cout << "===== isolated nodes =============================" << std::endl; - for (const auto & node : graph.nodes) { - if (node->parents.size() == 0 && node->children.size() == 0) { - dump_tree_node(node); - } - } -} - -} // namespace diagnostic_graph_aggregator - -int main(int argc, char ** argv) -{ - if (argc != 2) { - std::cerr << "usage: " << argv[0] << " " << std::endl; - return 1; - } - diagnostic_graph_aggregator::dump_tree_path(argv[1]); -} diff --git a/system/diagnostic_graph_aggregator/src/tool/tree.cpp b/system/diagnostic_graph_aggregator/src/tool/tree.cpp new file mode 100644 index 0000000000000..9dbbc539b3b91 --- /dev/null +++ b/system/diagnostic_graph_aggregator/src/tool/tree.cpp @@ -0,0 +1,69 @@ +// Copyright 2023 The Autoware Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "utils/loader.hpp" + +#include + +namespace diagnostic_graph_aggregator +{ + +void dump_node(const GraphNode * node, const std::string & indent = "", bool root = true) +{ + const auto path = node->path.empty() ? "" : node->path + " "; + const auto type = "(" + node->type + ")"; + std::cout << indent << "- " << path << type << std::endl; + + if (root || node->parents.size() == 1) { + for (const auto child : node->children) { + dump_node(child, indent + " ", false); + } + } +} + +void dump_root(const std::string & path) +{ + const auto graph = load_graph_nodes(path); + + std::cout << "===== root nodes =================================" << std::endl; + for (const auto & node : graph.nodes) { + if (node->parents.size() == 0 && node->children.size() != 0) { + dump_node(node); + } + } + std::cout << "===== intermediate nodes =========================" << std::endl; + for (const auto & node : graph.nodes) { + if (node->parents.size() >= 2) { + dump_node(node); + } + } + + std::cout << "===== isolated nodes =============================" << std::endl; + for (const auto & node : graph.nodes) { + if (node->parents.size() == 0 && node->children.size() == 0) { + dump_node(node); + } + } +} + +} // namespace diagnostic_graph_aggregator + +int main(int argc, char ** argv) +{ + if (argc != 2) { + std::cerr << "usage: tree " << std::endl; + return 1; + } + diagnostic_graph_aggregator::dump_root(argv[1]); +} diff --git a/system/diagnostic_graph_aggregator/src/tool/utils/loader.cpp b/system/diagnostic_graph_aggregator/src/tool/utils/loader.cpp new file mode 100644 index 0000000000000..a2e6ce8b85334 --- /dev/null +++ b/system/diagnostic_graph_aggregator/src/tool/utils/loader.cpp @@ -0,0 +1,57 @@ +// Copyright 2023 The Autoware Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "loader.hpp" + +#include +#include + +namespace diagnostic_graph_aggregator +{ + +GraphRoot load_graph_nodes(const std::string & path) +{ + GraphRoot result; + { + std::unordered_map mapping; + Graph graph; + graph.init(path); + + for (const auto & node : graph.nodes()) { + auto data = std::make_unique(); + data->path = node->path(); + data->type = node->type(); + mapping[node] = std::move(data); + } + + for (const auto & [node, data] : mapping) { + for (const auto & link : node->children()) { + const auto parent = data.get(); + const auto child = mapping.at(link).get(); + child->parents.push_back(parent); + parent->children.push_back(child); + } + } + + for (auto & [node, data] : mapping) { + result.owner.push_back(std::move(data)); + } + for (const auto & node : result.owner) { + result.nodes.push_back(node.get()); + } + } + return result; +} + +} // namespace diagnostic_graph_aggregator diff --git a/system/diagnostic_graph_aggregator/src/tool/utils/loader.hpp b/system/diagnostic_graph_aggregator/src/tool/utils/loader.hpp new file mode 100644 index 0000000000000..70e01ec2a77b4 --- /dev/null +++ b/system/diagnostic_graph_aggregator/src/tool/utils/loader.hpp @@ -0,0 +1,48 @@ +// 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. + +#ifndef TOOL__UTILS__LOADER_HPP_ +#define TOOL__UTILS__LOADER_HPP_ + +#include "graph/graph.hpp" +#include "graph/types.hpp" +#include "graph/units.hpp" + +#include +#include +#include + +namespace diagnostic_graph_aggregator +{ + +struct GraphNode +{ + using UniquePtr = std::unique_ptr; + std::string type; + std::string path; + std::vector children; + std::vector parents; +}; + +struct GraphRoot +{ + std::vector owner; + std::vector nodes; +}; + +GraphRoot load_graph_nodes(const std::string & path); + +} // namespace diagnostic_graph_aggregator + +#endif // TOOL__UTILS__LOADER_HPP_ From 257e53039815b98dd0b68701e8d2704cd8c2783f Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 13:00:36 +0900 Subject: [PATCH 4/6] fix typo Signed-off-by: Takagi, Isamu --- system/diagnostic_graph_aggregator/doc/tool/converter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/diagnostic_graph_aggregator/doc/tool/converter.md b/system/diagnostic_graph_aggregator/doc/tool/converter.md index b98d7eac32970..2351bc1e01054 100644 --- a/system/diagnostic_graph_aggregator/doc/tool/converter.md +++ b/system/diagnostic_graph_aggregator/doc/tool/converter.md @@ -10,7 +10,7 @@ ros2 launch diagnostic_graph_aggregator converter.launch.xml complement:=false The `complement` argument specifies whether to add an intermediate path that does not exist. This means that if the graph contains paths `/A/B` and `/A/B/C/D/E`, the intermediate paths `/A`, `/A/B/C` and `/A/B/C/D` will be added. -This is useful for tree view in `rqt_robot_monitor`. The completed node has an error level of `SATLE`. +This is useful for tree view in `rqt_robot_monitor`. The completed node has an error level of `STALE`. ## Examples From cf6b39b2141d5b48755de7a4d8dcd85e446fd86e Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 15:35:24 +0900 Subject: [PATCH 5/6] rename nodes Signed-off-by: Takagi, Isamu --- .../src/node/aggregator.cpp | 14 +++++++------- .../src/node/aggregator.hpp | 6 +++--- .../src/node/converter.cpp | 10 +++++----- .../src/node/converter.hpp | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/system/diagnostic_graph_aggregator/src/node/aggregator.cpp b/system/diagnostic_graph_aggregator/src/node/aggregator.cpp index 48f489c186bdb..cd16ce8e33e59 100644 --- a/system/diagnostic_graph_aggregator/src/node/aggregator.cpp +++ b/system/diagnostic_graph_aggregator/src/node/aggregator.cpp @@ -20,7 +20,7 @@ namespace diagnostic_graph_aggregator { -MainNode::MainNode() : Node("diagnostic_graph_aggregator_aggregator") +AggregatorNode::AggregatorNode() : Node("aggregator") { // Init diagnostics graph. { @@ -39,7 +39,7 @@ MainNode::MainNode() : Node("diagnostic_graph_aggregator_aggregator") const auto qos_input = rclcpp::QoS(declare_parameter("input_qos_depth")); const auto qos_graph = rclcpp::QoS(declare_parameter("graph_qos_depth")); - const auto callback = std::bind(&MainNode::on_diag, this, _1); + const auto callback = std::bind(&AggregatorNode::on_diag, this, _1); sub_input_ = create_subscription("/diagnostics", qos_input, callback); pub_graph_ = create_publisher("/diagnostics_graph", qos_graph); @@ -51,12 +51,12 @@ MainNode::MainNode() : Node("diagnostic_graph_aggregator_aggregator") debug_ = declare_parameter("use_debug_mode"); } -MainNode::~MainNode() +AggregatorNode::~AggregatorNode() { // for unique_ptr } -void MainNode::on_timer() +void AggregatorNode::on_timer() { const auto stamp = now(); pub_graph_->publish(graph_.report(stamp)); @@ -64,7 +64,7 @@ void MainNode::on_timer() if (modes_) modes_->update(stamp); } -void MainNode::on_diag(const DiagnosticArray::ConstSharedPtr msg) +void AggregatorNode::on_diag(const DiagnosticArray::ConstSharedPtr msg) { graph_.callback(now(), *msg); } @@ -73,10 +73,10 @@ void MainNode::on_diag(const DiagnosticArray::ConstSharedPtr msg) int main(int argc, char ** argv) { - using diagnostic_graph_aggregator::MainNode; + using diagnostic_graph_aggregator::AggregatorNode; rclcpp::init(argc, argv); rclcpp::executors::SingleThreadedExecutor executor; - auto node = std::make_shared(); + auto node = std::make_shared(); executor.add_node(node); executor.spin(); executor.remove_node(node); diff --git a/system/diagnostic_graph_aggregator/src/node/aggregator.hpp b/system/diagnostic_graph_aggregator/src/node/aggregator.hpp index dd64809e939cc..6bf9aead9754d 100644 --- a/system/diagnostic_graph_aggregator/src/node/aggregator.hpp +++ b/system/diagnostic_graph_aggregator/src/node/aggregator.hpp @@ -26,11 +26,11 @@ namespace diagnostic_graph_aggregator { -class MainNode : public rclcpp::Node +class AggregatorNode : public rclcpp::Node { public: - MainNode(); - ~MainNode(); + AggregatorNode(); + ~AggregatorNode(); private: Graph graph_; diff --git a/system/diagnostic_graph_aggregator/src/node/converter.cpp b/system/diagnostic_graph_aggregator/src/node/converter.cpp index 54360fa033985..e93a7c6800201 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.cpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.cpp @@ -60,19 +60,19 @@ std::vector complement_paths(const DiagnosticGraph & graph) return result; } -ToolNode::ToolNode() : Node("diagnostic_graph_aggregator_converter") +ConverterNode::ConverterNode() : Node("converter") { using std::placeholders::_1; const auto qos_graph = rclcpp::QoS(1); const auto qos_array = rclcpp::QoS(1); - const auto callback = std::bind(&ToolNode::on_graph, this, _1); + const auto callback = std::bind(&ConverterNode::on_graph, this, _1); sub_graph_ = create_subscription("/diagnostics_graph", qos_graph, callback); pub_array_ = create_publisher("/diagnostics_agg", qos_array); complement_inner_nodes_ = declare_parameter("complement_inner_nodes"); } -void ToolNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) +void ConverterNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) { DiagnosticArray message; message.header.stamp = msg->stamp; @@ -108,10 +108,10 @@ void ToolNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) int main(int argc, char ** argv) { - using diagnostic_graph_aggregator::ToolNode; + using diagnostic_graph_aggregator::ConverterNode; rclcpp::init(argc, argv); rclcpp::executors::SingleThreadedExecutor executor; - auto node = std::make_shared(); + auto node = std::make_shared(); executor.add_node(node); executor.spin(); executor.remove_node(node); diff --git a/system/diagnostic_graph_aggregator/src/node/converter.hpp b/system/diagnostic_graph_aggregator/src/node/converter.hpp index 62fbfc518b16e..6a70cbc2df4c6 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.hpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.hpp @@ -25,10 +25,10 @@ namespace diagnostic_graph_aggregator { -class ToolNode : public rclcpp::Node +class ConverterNode : public rclcpp::Node { public: - ToolNode(); + ConverterNode(); private: bool complement_inner_nodes_; From 720b06678c6ee0d7cfc1aa0f2696f75086f53343 Mon Sep 17 00:00:00 2001 From: "Takagi, Isamu" Date: Thu, 14 Mar 2024 20:57:48 +0900 Subject: [PATCH 6/6] calc inner node level Signed-off-by: Takagi, Isamu --- .../example/dummy-diags.py | 9 ++-- .../launch/converter.launch.xml | 2 +- .../src/node/converter.cpp | 54 ++++++++++++------- .../src/node/converter.hpp | 16 +++++- 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/system/diagnostic_graph_aggregator/example/dummy-diags.py b/system/diagnostic_graph_aggregator/example/dummy-diags.py index 52d6189a63f30..08f81bcd738ed 100755 --- a/system/diagnostic_graph_aggregator/example/dummy-diags.py +++ b/system/diagnostic_graph_aggregator/example/dummy-diags.py @@ -59,6 +59,9 @@ def create_status(name: str): "external_command_checker: joystick_command", "external_command_checker: remote_command", ] - rclpy.init() - rclpy.spin(DummyDiagnostics(diags)) - rclpy.shutdown() + try: + rclpy.init() + rclpy.spin(DummyDiagnostics(diags)) + rclpy.shutdown() + except KeyboardInterrupt: + pass diff --git a/system/diagnostic_graph_aggregator/launch/converter.launch.xml b/system/diagnostic_graph_aggregator/launch/converter.launch.xml index effebf8381ee1..9111338bf622a 100644 --- a/system/diagnostic_graph_aggregator/launch/converter.launch.xml +++ b/system/diagnostic_graph_aggregator/launch/converter.launch.xml @@ -1,6 +1,6 @@ - + diff --git a/system/diagnostic_graph_aggregator/src/node/converter.cpp b/system/diagnostic_graph_aggregator/src/node/converter.cpp index e93a7c6800201..f0b2108374017 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.cpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.cpp @@ -14,10 +14,7 @@ #include "converter.hpp" -#include -#include -#include -#include +#include namespace diagnostic_graph_aggregator { @@ -42,22 +39,24 @@ std::string parent_path(const std::string & path) return path.substr(0, path.rfind('/')); } -std::vector complement_paths(const DiagnosticGraph & graph) +auto create_tree(const DiagnosticGraph & graph) { - std::unordered_map paths; + std::map, std::greater> tree; + for (const auto & node : graph.nodes) { + tree.emplace(node.status.name, std::make_unique(true)); + } for (const auto & node : graph.nodes) { std::string path = node.status.name; - paths[path] = false; while (path = parent_path(path), !path.empty()) { - if (paths.count(path)) break; - paths[path] = true; + if (tree.count(path)) break; + tree.emplace(path, std::make_unique(false)); } } - std::vector result; - for (const auto & [path, flag] : paths) { - if (flag) result.push_back(path); + for (const auto & [path, node] : tree) { + const auto parent = parent_path(path); + node->parent = parent.empty() ? nullptr : tree[parent].get(); } - return result; + return tree; } ConverterNode::ConverterNode() : Node("converter") @@ -69,7 +68,9 @@ ConverterNode::ConverterNode() : Node("converter") const auto callback = std::bind(&ConverterNode::on_graph, this, _1); sub_graph_ = create_subscription("/diagnostics_graph", qos_graph, callback); pub_array_ = create_publisher("/diagnostics_agg", qos_array); - complement_inner_nodes_ = declare_parameter("complement_inner_nodes"); + + initialize_tree_ = false; + complement_tree_ = declare_parameter("complement_tree"); } void ConverterNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) @@ -90,14 +91,27 @@ void ConverterNode::on_graph(const DiagnosticGraph::ConstSharedPtr msg) } } - if (complement_inner_nodes_) { - if (!inner_node_names_) { - inner_node_names_ = complement_paths(*msg); + if (complement_tree_ && !initialize_tree_) { + initialize_tree_ = true; + tree_ = create_tree(*msg); + } + + if (complement_tree_) { + for (const auto & [path, node] : tree_) { + node->level = DiagnosticStatus::OK; + } + for (const auto & node : msg->nodes) { + tree_[node.status.name]->level = node.status.level; + } + for (const auto & [path, node] : tree_) { + if (!node->parent) continue; + node->parent->level = std::max(node->parent->level, node->level); } - for (const auto & name : inner_node_names_.value()) { + for (const auto & [path, node] : tree_) { + if (node->leaf) continue; message.status.emplace_back(); - message.status.back().name = name; - message.status.back().level = DiagnosticStatus::STALE; + message.status.back().name = path; + message.status.back().level = node->level; } } diff --git a/system/diagnostic_graph_aggregator/src/node/converter.hpp b/system/diagnostic_graph_aggregator/src/node/converter.hpp index 6a70cbc2df4c6..1f98abed4d619 100644 --- a/system/diagnostic_graph_aggregator/src/node/converter.hpp +++ b/system/diagnostic_graph_aggregator/src/node/converter.hpp @@ -19,20 +19,32 @@ #include +#include +#include // Use map for sorting keys. +#include #include #include namespace diagnostic_graph_aggregator { +struct TreeNode +{ + explicit TreeNode(bool leaf) : leaf(leaf) {} + bool leaf; + TreeNode * parent; + uint8_t level; +}; + class ConverterNode : public rclcpp::Node { public: ConverterNode(); private: - bool complement_inner_nodes_; - std::optional> inner_node_names_; + bool initialize_tree_; + bool complement_tree_; + std::map, std::greater> tree_; rclcpp::Subscription::SharedPtr sub_graph_; rclcpp::Publisher::SharedPtr pub_array_; void on_graph(const DiagnosticGraph::ConstSharedPtr msg);