From 048665eb8e2e0a734ec5750f631951679b8d93a5 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Thu, 20 Jun 2024 09:39:00 +0200 Subject: [PATCH 01/21] Add empty markdown for documentation --- doc/images/.keep | 0 doc/mission_module.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/.keep create mode 100644 doc/mission_module.md diff --git a/doc/images/.keep b/doc/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/doc/mission_module.md b/doc/mission_module.md new file mode 100644 index 0000000..e69de29 From 07d291c6beff5c9052e0bf191fa4e0a770aeed1c Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Fri, 21 Jun 2024 10:27:03 +0200 Subject: [PATCH 02/21] Add status, status error and command payload examples --- doc/mission_module.md | 98 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/doc/mission_module.md b/doc/mission_module.md index e69de29..fb778b5 100644 --- a/doc/mission_module.md +++ b/doc/mission_module.md @@ -0,0 +1,98 @@ +# Supported devices + +The ONLY supported device is the Autonomy Device. Device ID currently has the following field values: +- module ID: 1, +- device type: 0, +- device role: `driving`. + +The last field `device name` is not prescribed, as it is only informative and optional. + + +# Messages + + +## Status payload + +Always contains +- state (State enum value) + +If state is "DRIVE" or "IN_STOP", it must contain +- next stop (Station) + +Optionally, the status contains +- telemetry (Telemetry) + +Example +```json +{ + "state": "DRIVE", + "telemetry": { + "position": { + "latitude": 45.8137528, + "longitude": 15.9870608, + "altitude": 120.7 + }, + "speed": 7.2, + "fuel": 0.62 + } + "nextStop": { + "name": "Ribnjak", + "position": { + "latitude": 45.815011, + "longitude": 15.981919, + "altitude": 125.3 + } + } +} +``` + +## Status Error payload + +Always contains +- finished stops (list of Station) + +Example: +```json +{ + "finishedStops": [ + {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}}, + {"name": "Vlaška", "position": {"latitude": 45.8139306, "longitude": 15.9913147, "altitude": 118.4}} + ] +} +``` + +## Command payload + +Always contains +- action (Action enum value) +- stop (Station) +- stations (list of Station) +- route (string) + +Example of command payload when car received the mission: +```json +{ + "action": "START", + "stations": [ + {"name": "Ribnjak", "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3}}, + {"name": "Trg hrvatskih velikana", "position": {"latitude": 45.8120758, "longitude": 15.9837108, "altitude": 120.7}}, + {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}} + ], + "route": "Kvatrić" +} +``` + +Example of command payload when there is no mission defined for the car: +```json +{ + "action": "NO_ACTION", + "stations": [], + "route": "" +} +``` + + +# Device documentation + +## Autonomy Device + From 29ad53c4aa58b6cbcc17750d2972692cb346cc79 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Wed, 26 Jun 2024 09:21:05 +0200 Subject: [PATCH 03/21] Add activity diagram of command handling --- doc/mission_module.md | 98 --------------- {doc => docs}/images/.keep | 0 docs/images/image.png | Bin 0 -> 34532 bytes docs/mission_module.md | 114 ++++++++++++++++++ docs/uml/command.puml | 51 ++++++++ .../command_activity_diagram.png | Bin 0 -> 36404 bytes 6 files changed, 165 insertions(+), 98 deletions(-) delete mode 100644 doc/mission_module.md rename {doc => docs}/images/.keep (100%) create mode 100644 docs/images/image.png create mode 100644 docs/mission_module.md create mode 100644 docs/uml/command.puml create mode 100644 docs/uml/exported_diagrams/command_activity_diagram.png diff --git a/doc/mission_module.md b/doc/mission_module.md deleted file mode 100644 index fb778b5..0000000 --- a/doc/mission_module.md +++ /dev/null @@ -1,98 +0,0 @@ -# Supported devices - -The ONLY supported device is the Autonomy Device. Device ID currently has the following field values: -- module ID: 1, -- device type: 0, -- device role: `driving`. - -The last field `device name` is not prescribed, as it is only informative and optional. - - -# Messages - - -## Status payload - -Always contains -- state (State enum value) - -If state is "DRIVE" or "IN_STOP", it must contain -- next stop (Station) - -Optionally, the status contains -- telemetry (Telemetry) - -Example -```json -{ - "state": "DRIVE", - "telemetry": { - "position": { - "latitude": 45.8137528, - "longitude": 15.9870608, - "altitude": 120.7 - }, - "speed": 7.2, - "fuel": 0.62 - } - "nextStop": { - "name": "Ribnjak", - "position": { - "latitude": 45.815011, - "longitude": 15.981919, - "altitude": 125.3 - } - } -} -``` - -## Status Error payload - -Always contains -- finished stops (list of Station) - -Example: -```json -{ - "finishedStops": [ - {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}}, - {"name": "Vlaška", "position": {"latitude": 45.8139306, "longitude": 15.9913147, "altitude": 118.4}} - ] -} -``` - -## Command payload - -Always contains -- action (Action enum value) -- stop (Station) -- stations (list of Station) -- route (string) - -Example of command payload when car received the mission: -```json -{ - "action": "START", - "stations": [ - {"name": "Ribnjak", "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3}}, - {"name": "Trg hrvatskih velikana", "position": {"latitude": 45.8120758, "longitude": 15.9837108, "altitude": 120.7}}, - {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}} - ], - "route": "Kvatrić" -} -``` - -Example of command payload when there is no mission defined for the car: -```json -{ - "action": "NO_ACTION", - "stations": [], - "route": "" -} -``` - - -# Device documentation - -## Autonomy Device - diff --git a/doc/images/.keep b/docs/images/.keep similarity index 100% rename from doc/images/.keep rename to docs/images/.keep diff --git a/docs/images/image.png b/docs/images/image.png new file mode 100644 index 0000000000000000000000000000000000000000..b86bd50c7e4133ee8d9226041d87e8fb9d680e34 GIT binary patch literal 34532 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 Squ8vLa#;1KN}7_1*Z%>nfg$Vw literal 0 HcmV?d00001 diff --git a/docs/mission_module.md b/docs/mission_module.md new file mode 100644 index 0000000..c65612e --- /dev/null +++ b/docs/mission_module.md @@ -0,0 +1,114 @@ +# Supported devices + +The ONLY supported device is the Autonomy Device. Device ID currently has the following field values: +- module ID: 1, +- device type: 0, +- device role: `driving`. + +The last field `device name` is not prescribed, as it is only informative and optional. + +# Autonomy Device + +The device drives the car according to the current mission (list of stops with names and position). + +## Messages + +### Structure + +The basic message structure for message in Internal and External protocol is described [here](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/message-structure). + +Below, the data passed in the messages used in the External Protocol are described. The data structure can be also found in the [.proto](../lib/protobuf-mission-module/) file. + +### Status data + +Always contains +- state (State enum value: `IDLE`, `DRIVE`, `IN_STOP`, `OBSTACLE`, `ERROR`) + +If state is `DRIVE` or `IN_STOP`, it must contain +- next stop (`Station`) + +Optionally, the status contains +- telemetry (`Telemetry`) + +Example: +```json +{ + "state": "DRIVE", + "telemetry": { + "position": {"latitude": 45.8137528, "longitude": 15.9870608, "altitude": 120.7}, + "speed": 7.2, + "fuel": 0.62 + } + "nextStop": { + "name": "Ribnjak", + "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3} + } +} +``` + +### Status Error data + +Always contains +- finished stops (list of Station) + +Example: +```json +{ + "finishedStops": [ + {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}}, + {"name": "Vlaška", "position": {"latitude": 45.8139306, "longitude": 15.9913147, "altitude": 118.4}} + ] +} +``` + +### Command payload + +Always contains +- action (Action enum value) +- stop (Station) +- stations (list of Station) +- route (string) + +Example of command payload when car received the mission: +```json +{ + "action": "START", + "stations": [ + {"name": "Ribnjak", "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3}}, + {"name": "Trg hrvatskih velikana", "position": {"latitude": 45.8120758, "longitude": 15.9837108, "altitude": 120.7}}, + {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}} + ], + "route": "Kvatrić" +} +``` + +Example of command payload when there is no mission defined for the car: +```json +{ + "action": "NO_ACTION", + "stations": [], + "route": "" +} +``` + +### Validation + +The validation of each of the messages is done against the message structure described above (and in the [.proto](../lib/protobuf-mission-module/) file). The functions for validation: +- `parseAutonomyStatus` for status, +- `parseAutonomyError` for status error, +- `parseAutonomyCommand` for command. + + +## Device State + +After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by +- the received command (e.g., command stops names and the action value), +- the sensors for car orientation (e.g., some obstacle prevents car from driving). + +![autonomy state diagram](images/image.png)[Car state diagram] + +The Autonomy keeps in memory the NAME of the next stop it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. + +![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png) + + diff --git a/docs/uml/command.puml b/docs/uml/command.puml new file mode 100644 index 0000000..d1710d1 --- /dev/null +++ b/docs/uml/command.puml @@ -0,0 +1,51 @@ +@startuml command_activity_diagram + +start + +switch (Action) +case (\n STOP) + :Set nextStop to ""; + note left + This branch is + always used to + stop the car. + end note + #LightGray:Cancel driving; +case (\n NO_ACTION) + :Set nextStop to ""; + note right + The stops as a + consequence of + not having another + stop to drive to. + end note + #LightGray:Cancel driving; +case (\n START) + if (Is list of stops empty?) then (No) + if (Is nextStop equal to name of stops[0]?) then (No) + :Set nextStop to stops[0]; + #LightGray:Cancel driving; + :Start driving to nextStop; + else (Yes) + endif + else (Yes) + :Set nextStop to ""; + #LightGray:Cancel driving; + endif +endswitch +stop + +@enduml \ No newline at end of file diff --git a/docs/uml/exported_diagrams/command_activity_diagram.png b/docs/uml/exported_diagrams/command_activity_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..7715e76bdb72befee1eb21388bab679e9a3c7e0a GIT binary patch literal 36404 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 F{{^?deoO!W literal 0 HcmV?d00001 From 0dea914e7d15c3bdad357c3cc1db33ec3334c607 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Fri, 28 Jun 2024 11:02:11 +0200 Subject: [PATCH 04/21] Fix typos in readme --- docs/mission_module.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/mission_module.md b/docs/mission_module.md index c65612e..8918fbe 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -38,7 +38,7 @@ Example: "position": {"latitude": 45.8137528, "longitude": 15.9870608, "altitude": 120.7}, "speed": 7.2, "fuel": 0.62 - } + }, "nextStop": { "name": "Ribnjak", "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3} @@ -105,10 +105,10 @@ After connection, the autonomy device is in state `Idle`. The internal state of - the received command (e.g., command stops names and the action value), - the sensors for car orientation (e.g., some obstacle prevents car from driving). -![autonomy state diagram](images/image.png)[Car state diagram] +![autonomy state diagram](images/image.png "Car state diagram") The Autonomy keeps in memory the NAME of the next stop it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. -![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png) +![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") From 744768c2ab7c1bfbf4b8f6be384abe5b267944b8 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Fri, 28 Jun 2024 11:19:19 +0200 Subject: [PATCH 05/21] Add missing info --- docs/mission_module.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/mission_module.md b/docs/mission_module.md index 8918fbe..fdda6fe 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -1,6 +1,10 @@ # Supported devices -The ONLY supported device is the Autonomy Device. Device ID currently has the following field values: +The ONLY supported device is the Autonomy Device, serving as a driver for the car. The device is connected to the Mission Module and receives the mission to drive the car to the desired stops. + +This module handles backward compatibility with Fleet protocol v1.2.0. This version did not have modules and supported only one type of payload - CarStateProtocol, which contains statuses from autonomy and commands for autonomy. The payload for the module is serialized by protobuf v 3.21.12, the same version as the fleet protocol itself. + +Device ID currently has the following field values: - module ID: 1, - device type: 0, - device role: `driving`. @@ -19,7 +23,7 @@ The basic message structure for message in Internal and External protocol is des Below, the data passed in the messages used in the External Protocol are described. The data structure can be also found in the [.proto](../lib/protobuf-mission-module/) file. -### Status data +### Status payload data Always contains - state (State enum value: `IDLE`, `DRIVE`, `IN_STOP`, `OBSTACLE`, `ERROR`) @@ -46,7 +50,7 @@ Example: } ``` -### Status Error data +### Status Error payload data Always contains - finished stops (list of Station) @@ -61,7 +65,7 @@ Example: } ``` -### Command payload +### Command payload data Always contains - action (Action enum value) @@ -111,4 +115,4 @@ The Autonomy keeps in memory the NAME of the next stop it should drive to (it ca ![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") - +The Autonomy device sends the status of the car to the Mission Module. The status contains field `State` with value correspoding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). \ No newline at end of file From 536b558ef6fd038d8b47f52b51481a9eeebf6198 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Wed, 3 Jul 2024 13:52:12 +0200 Subject: [PATCH 06/21] Remove unnecessary .keep file --- docs/images/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/.keep diff --git a/docs/images/.keep b/docs/images/.keep deleted file mode 100644 index e69de29..0000000 From 69ea925835bd919c2c552a677ec43d6bec7e2c7c Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Mon, 8 Jul 2024 08:38:09 +0200 Subject: [PATCH 07/21] =?UTF-8?q?Reorder=20sections=20in=20the=20README?= =?UTF-8?q?=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 6df0aaa..8f09e6c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,28 @@ -# Mission module +# Introduction -Module for missions. This module connects Fleet Management and autonomy. +The module is a part of the BringAuto in-house [Fleet Protocol](https://drive.google.com/file/d/1LYX23FhOn9n67qt3apTscwstsx48Spzi/view), which provides communication between a car and a cloud. -### Config +This specific module provides communication between Fleet Management (an application giving control over the car's mission to the end user) and the Autonomy device - the driving component of the car. -Some configuration is required when running this module. Example config: +For a detailed description of the inner workings of the module, see the [Mission Module documentation](./docs/mission_module.md). +# Dependencies + +- [CMakeLib](https://github.com/cmakelib/cmakelib) + +# Build + +```bash +mkdir _build && cd _build +cmake -DCMAKE_BUILD_TYPE=Release [-DBRINGAUTO_INSTALL=ON] [-DBRINGAUTO_PACKAGE=ON] .. +make ``` + +# Configuration + +Configuration is required. Configuration file with example values: + +```json "config": { "api_url": "http://localhost:8080", "api_key": "StaticAccessKeyToBeUsedByDevelopersOnEtna", @@ -19,19 +35,8 @@ Some configuration is required when running this module. Example config: } ``` -- api_url : URL of fleet http api ([project repository](https://gitlab.bringauto.com/bring-auto/fleet-protocol-v2/http-api/fleet-v2-http-api)) -- api_key : generated in fleet http api (script/new_admin.py) -- company_name, car_name : used to identify car in fleet http api -- max_requests_threshold_count, max_requests_threshold_period_ms, delay_after_threshold_reached_ms, retry_requests_delay_ms : explained in [http client README](./lib/fleet-v2-http-client/README.md) +- `api_url`: URL of the Fleet Protocol HTTP API (the [project repository](https://gitlab.bringauto.com/bring-auto/fleet-protocol-v2/http-api/fleet-v2-http-api)) +- `api_key`: generated in Fleet Protocol HTTP API (script/new_admin.py) +- `company_name`, `car_name`: used to identify the car in Fleet Protocol HTTP API +- `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms` : explained in [HTTP client README](./lib/fleet-v2-http-client/README.md) -### Dependencies - -- [CMakeLib](https://github.com/cmakelib/cmakelib) - -### Build - -``` -mkdir _build && cd _build -cmake -DCMAKE_BUILD_TYPE=Release [-DBRINGAUTO_INSTALL=ON] [-DBRINGAUTO_PACKAGE=ON] .. -make -``` From bc152703593e5858bd26ffa2f1f98b6204688af4 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Mon, 8 Jul 2024 08:50:17 +0200 Subject: [PATCH 08/21] Move module idenfication and supported devices to README --- README.md | 18 +++++++++++++++--- docs/mission_module.md | 31 +++++++------------------------ 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 8f09e6c..25ccf9b 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,22 @@ # Introduction -The module is a part of the BringAuto in-house [Fleet Protocol](https://drive.google.com/file/d/1LYX23FhOn9n67qt3apTscwstsx48Spzi/view), which provides communication between a car and a cloud. +The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://drive.google.com/file/d/1LYX23FhOn9n67qt3apTscwstsx48Spzi/view) for communication between a car and a cloud. -This specific module provides communication between Fleet Management (an application giving control over the car's mission to the end user) and the Autonomy device - the driving component of the car. +It provides communication between Fleet Management (an application giving control over the car's mission to the end user) and the Autonomy device - the driving component of the car. -For a detailed description of the inner workings of the module, see the [Mission Module documentation](./docs/mission_module.md). +For a detailed description of the inner workings, see the [Mission Module documentation](./docs/mission_module.md). + +# Identification and supported devices + +The Mission Module is identified by a module number (module ID) `1`. Below are listed the supported devices. + +## Autonomy Device + +The device drives the car according to the current mission (list of stops with names and positions). + +### Device identification +- device type: 0 +- device role: `driving` # Dependencies diff --git a/docs/mission_module.md b/docs/mission_module.md index fdda6fe..07a8c29 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -1,29 +1,12 @@ -# Supported devices +# Messages -The ONLY supported device is the Autonomy Device, serving as a driver for the car. The device is connected to the Mission Module and receives the mission to drive the car to the desired stops. - -This module handles backward compatibility with Fleet protocol v1.2.0. This version did not have modules and supported only one type of payload - CarStateProtocol, which contains statuses from autonomy and commands for autonomy. The payload for the module is serialized by protobuf v 3.21.12, the same version as the fleet protocol itself. - -Device ID currently has the following field values: -- module ID: 1, -- device type: 0, -- device role: `driving`. - -The last field `device name` is not prescribed, as it is only informative and optional. - -# Autonomy Device - -The device drives the car according to the current mission (list of stops with names and position). - -## Messages - -### Structure +## Structure The basic message structure for message in Internal and External protocol is described [here](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/message-structure). Below, the data passed in the messages used in the External Protocol are described. The data structure can be also found in the [.proto](../lib/protobuf-mission-module/) file. -### Status payload data +## Status payload data Always contains - state (State enum value: `IDLE`, `DRIVE`, `IN_STOP`, `OBSTACLE`, `ERROR`) @@ -50,7 +33,7 @@ Example: } ``` -### Status Error payload data +## Status Error payload data Always contains - finished stops (list of Station) @@ -65,7 +48,7 @@ Example: } ``` -### Command payload data +## Command payload data Always contains - action (Action enum value) @@ -95,7 +78,7 @@ Example of command payload when there is no mission defined for the car: } ``` -### Validation +## Validation The validation of each of the messages is done against the message structure described above (and in the [.proto](../lib/protobuf-mission-module/) file). The functions for validation: - `parseAutonomyStatus` for status, @@ -103,7 +86,7 @@ The validation of each of the messages is done against the message structure des - `parseAutonomyCommand` for command. -## Device State +# Device State After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by - the received command (e.g., command stops names and the action value), From 4ad54d1ed94d194d2c77c0e30d82fadce0a30a13 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Mon, 8 Jul 2024 09:20:32 +0200 Subject: [PATCH 09/21] Update activity diagram in mission_module.md --- docs/uml/command.puml | 38 +++++++++++++----- .../command_activity_diagram.png | Bin 36404 -> 54862 bytes 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/docs/uml/command.puml b/docs/uml/command.puml index d1710d1..757e0fa 100644 --- a/docs/uml/command.puml +++ b/docs/uml/command.puml @@ -15,35 +15,53 @@ start -switch (Action) +note right + Device accepts + command with action + and list of stops. +end note + +note left + Autonomy stores the `nextStop` - + - name of the next stop + it drives to, or empty string if + it is not driving. +end note + +switch (Action value) case (\n STOP) - :Set nextStop to ""; + #LightGray:Set nextStop to ""; note left This branch is always used to stop the car. end note - #LightGray:Cancel driving; + #LightGray:Autonomy cancels driving; + #Pink:send status with IDLE state; case (\n NO_ACTION) - :Set nextStop to ""; + #LightGray::Set nextStop to ""; note right The stops as a consequence of not having another stop to drive to. end note - #LightGray:Cancel driving; + #LightGray:Autonomy cancels driving; + #Pink:send status with IDLE state; case (\n START) if (Is list of stops empty?) then (No) if (Is nextStop equal to name of stops[0]?) then (No) - :Set nextStop to stops[0]; - #LightGray:Cancel driving; - :Start driving to nextStop; + #LightGray::Set nextStop to first + stop in the stop list; + #LightGray:Autonomy cancels driving; + #LightGray:Start driving to nextStop; + #Pink:send status with DRIVE state; else (Yes) endif else (Yes) - :Set nextStop to ""; - #LightGray:Cancel driving; + #LightGray:Set nextStop to ""; + #LightGray:Autonomy cancels driving; + #Pink:send status with IDLE state; endif endswitch stop diff --git a/docs/uml/exported_diagrams/command_activity_diagram.png b/docs/uml/exported_diagrams/command_activity_diagram.png index 7715e76bdb72befee1eb21388bab679e9a3c7e0a..b8a3c0c798ec082190d6ecadb4c44a91153cd3e6 100644 GIT binary patch literal 54862 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%0DW(v^i!J5RtxoRvV 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 literal 36404 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 F{{^?deoO!W From a6eea617250df8ee322a738601f6d56014e48c19 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 07:51:13 +0200 Subject: [PATCH 10/21] Add intro to mission_module.md, link to README --- docs/mission_module.md | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/docs/mission_module.md b/docs/mission_module.md index 07a8c29..a717334 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -1,3 +1,24 @@ +# Introduction to the Mission Module details + +Here, additional info related to the Mission Module functionality is provided. The info on the Mission Module purpose and usage is in the main [README](../README.md). + +# Behavior of supported devices + +## Autonomy Device + +After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by +- the received command (e.g., command stops names and the action value), +- the sensors for car orientation (e.g., some obstacle prevents car from driving). + +![autonomy state diagram](images/image.png "Car state diagram") + +The Autonomy keeps in memory the NAME of the next stop it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. + +![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") + +The Autonomy device sends the status of the car to the Mission Module. The status contains field `State` with value correspoding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). + + # Messages ## Structure @@ -84,18 +105,3 @@ The validation of each of the messages is done against the message structure des - `parseAutonomyStatus` for status, - `parseAutonomyError` for status error, - `parseAutonomyCommand` for command. - - -# Device State - -After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by -- the received command (e.g., command stops names and the action value), -- the sensors for car orientation (e.g., some obstacle prevents car from driving). - -![autonomy state diagram](images/image.png "Car state diagram") - -The Autonomy keeps in memory the NAME of the next stop it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. - -![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") - -The Autonomy device sends the status of the car to the Mission Module. The status contains field `State` with value correspoding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). \ No newline at end of file From fdaef858c52db6085c8303062e30f5f21461fc5a Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:03:58 +0200 Subject: [PATCH 11/21] Shorten introductions in both README and mission_module.md --- README.md | 8 +++++--- docs/mission_module.md | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 25ccf9b..89ab642 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,19 @@ The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://drive.google.com/file/d/1LYX23FhOn9n67qt3apTscwstsx48Spzi/view) for communication between a car and a cloud. -It provides communication between Fleet Management (an application giving control over the car's mission to the end user) and the Autonomy device - the driving component of the car. +It provides communication between +1. Fleet Management - the application giving control over the car's mission to the end user, +2. Autonomy device - the driving component of the car. For a detailed description of the inner workings, see the [Mission Module documentation](./docs/mission_module.md). # Identification and supported devices -The Mission Module is identified by a module number (module ID) `1`. Below are listed the supported devices. +Module number/ID: `1`. ## Autonomy Device -The device drives the car according to the current mission (list of stops with names and positions). +The device drives the car according to the current mission. ### Device identification - device type: 0 diff --git a/docs/mission_module.md b/docs/mission_module.md index a717334..ab39fda 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -1,6 +1,6 @@ # Introduction to the Mission Module details -Here, additional info related to the Mission Module functionality is provided. The info on the Mission Module purpose and usage is in the main [README](../README.md). +Here, additional info on the Mission Module is provided. For the purpose and usage see the [README](../README.md). # Behavior of supported devices @@ -12,7 +12,7 @@ After connection, the autonomy device is in state `Idle`. The internal state of ![autonomy state diagram](images/image.png "Car state diagram") -The Autonomy keeps in memory the NAME of the next stop it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. +The Autonomy keeps in memory the NAME of the next stop (the `nextStop` in the acitivty diagram below), it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. ![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") From 3db0d266c45c267d1bbf24ece2051fbba2c2a841 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:06:44 +0200 Subject: [PATCH 12/21] Add blank lines around fenced code blocks in mission_module.md --- docs/mission_module.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/mission_module.md b/docs/mission_module.md index ab39fda..4e1864d 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -39,6 +39,7 @@ Optionally, the status contains - telemetry (`Telemetry`) Example: + ```json { "state": "DRIVE", @@ -60,6 +61,7 @@ Always contains - finished stops (list of Station) Example: + ```json { "finishedStops": [ @@ -78,6 +80,7 @@ Always contains - route (string) Example of command payload when car received the mission: + ```json { "action": "START", @@ -91,6 +94,7 @@ Example of command payload when car received the mission: ``` Example of command payload when there is no mission defined for the car: + ```json { "action": "NO_ACTION", From 5cb884112a8ceaf55bf3274017a512272d282796 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:07:46 +0200 Subject: [PATCH 13/21] Add blank lines before lists --- README.md | 1 + docs/mission_module.md | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 89ab642..6bd409f 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Module number/ID: `1`. The device drives the car according to the current mission. ### Device identification + - device type: 0 - device role: `driving` diff --git a/docs/mission_module.md b/docs/mission_module.md index 4e1864d..d654459 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -7,6 +7,7 @@ Here, additional info on the Mission Module is provided. For the purpose and usa ## Autonomy Device After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by + - the received command (e.g., command stops names and the action value), - the sensors for car orientation (e.g., some obstacle prevents car from driving). @@ -30,12 +31,15 @@ Below, the data passed in the messages used in the External Protocol are describ ## Status payload data Always contains + - state (State enum value: `IDLE`, `DRIVE`, `IN_STOP`, `OBSTACLE`, `ERROR`) If state is `DRIVE` or `IN_STOP`, it must contain + - next stop (`Station`) Optionally, the status contains + - telemetry (`Telemetry`) Example: @@ -58,6 +62,7 @@ Example: ## Status Error payload data Always contains + - finished stops (list of Station) Example: @@ -74,6 +79,7 @@ Example: ## Command payload data Always contains + - action (Action enum value) - stop (Station) - stations (list of Station) @@ -106,6 +112,7 @@ Example of command payload when there is no mission defined for the car: ## Validation The validation of each of the messages is done against the message structure described above (and in the [.proto](../lib/protobuf-mission-module/) file). The functions for validation: + - `parseAutonomyStatus` for status, - `parseAutonomyError` for status error, - `parseAutonomyCommand` for command. From 335524f53ea2888d8b8cd0b4c012272f6247c43f Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:21:21 +0200 Subject: [PATCH 14/21] Remove irrelevant info from mission_module.md --- README.md | 6 +++--- docs/mission_module.md | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 6bd409f..b01a151 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Introduction -The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://drive.google.com/file/d/1LYX23FhOn9n67qt3apTscwstsx48Spzi/view) for communication between a car and a cloud. +The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/summary) for communication between a car and a cloud. It provides communication between 1. Fleet Management - the application giving control over the car's mission to the end user, @@ -50,8 +50,8 @@ Configuration is required. Configuration file with example values: } ``` -- `api_url`: URL of the Fleet Protocol HTTP API (the [project repository](https://gitlab.bringauto.com/bring-auto/fleet-protocol-v2/http-api/fleet-v2-http-api)) +- `api_url`: URL of the Fleet Protocol HTTP API (the [project repository](https://github.com/bringauto/fleet-protocol-http-api)) - `api_key`: generated in Fleet Protocol HTTP API (script/new_admin.py) - `company_name`, `car_name`: used to identify the car in Fleet Protocol HTTP API -- `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms` : explained in [HTTP client README](./lib/fleet-v2-http-client/README.md) +- `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms`: explained in [HTTP client README](./lib/fleet-v2-http-client/README.md) diff --git a/docs/mission_module.md b/docs/mission_module.md index d654459..ebd3b0b 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -24,8 +24,6 @@ The Autonomy device sends the status of the car to the Mission Module. The statu ## Structure -The basic message structure for message in Internal and External protocol is described [here](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/message-structure). - Below, the data passed in the messages used in the External Protocol are described. The data structure can be also found in the [.proto](../lib/protobuf-mission-module/) file. ## Status payload data From 02270fffe57347dabe00dc412f9d3b53bf99f7ba Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:23:36 +0200 Subject: [PATCH 15/21] Remove blank line --- docs/mission_module.md | 88 +++++++++++++++++++++++++++++++----------- 1 file changed, 65 insertions(+), 23 deletions(-) diff --git a/docs/mission_module.md b/docs/mission_module.md index ebd3b0b..a0bbdbe 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -19,7 +19,6 @@ The Autonomy keeps in memory the NAME of the next stop (the `nextStop` in the ac The Autonomy device sends the status of the car to the Mission Module. The status contains field `State` with value correspoding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). - # Messages ## Structure @@ -44,16 +43,24 @@ Example: ```json { - "state": "DRIVE", - "telemetry": { - "position": {"latitude": 45.8137528, "longitude": 15.9870608, "altitude": 120.7}, - "speed": 7.2, - "fuel": 0.62 + "state": "DRIVE", + "telemetry": { + "position": { + "latitude": 45.8137528, + "longitude": 15.9870608, + "altitude": 120.7 }, - "nextStop": { - "name": "Ribnjak", - "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3} + "speed": 7.2, + "fuel": 0.62 + }, + "nextStop": { + "name": "Ribnjak", + "position": { + "latitude": 45.815011, + "longitude": 15.981919, + "altitude": 125.3 } + } } ``` @@ -67,10 +74,24 @@ Example: ```json { - "finishedStops": [ - {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}}, - {"name": "Vlaška", "position": {"latitude": 45.8139306, "longitude": 15.9913147, "altitude": 118.4}} - ] + "finishedStops": [ + { + "name": "Trg Eugena Kvaternika", + "position": { + "latitude": 45.8144669, + "longitude": 15.9965289, + "altitude": 115.1 + } + }, + { + "name": "Vlaška", + "position": { + "latitude": 45.8139306, + "longitude": 15.9913147, + "altitude": 118.4 + } + } + ] } ``` @@ -87,13 +108,34 @@ Example of command payload when car received the mission: ```json { - "action": "START", - "stations": [ - {"name": "Ribnjak", "position": {"latitude": 45.815011, "longitude": 15.981919, "altitude": 125.3}}, - {"name": "Trg hrvatskih velikana", "position": {"latitude": 45.8120758, "longitude": 15.9837108, "altitude": 120.7}}, - {"name": "Trg Eugena Kvaternika", "position": {"latitude": 45.8144669, "longitude": 15.9965289, "altitude": 115.1}} - ], - "route": "Kvatrić" + "action": "START", + "stations": [ + { + "name": "Ribnjak", + "position": { + "latitude": 45.815011, + "longitude": 15.981919, + "altitude": 125.3 + } + }, + { + "name": "Trg hrvatskih velikana", + "position": { + "latitude": 45.8120758, + "longitude": 15.9837108, + "altitude": 120.7 + } + }, + { + "name": "Trg Eugena Kvaternika", + "position": { + "latitude": 45.8144669, + "longitude": 15.9965289, + "altitude": 115.1 + } + } + ], + "route": "Kvatrić" } ``` @@ -101,9 +143,9 @@ Example of command payload when there is no mission defined for the car: ```json { - "action": "NO_ACTION", - "stations": [], - "route": "" + "action": "NO_ACTION", + "stations": [], + "route": "" } ``` From d8f2590e64e2dd5d913e2c0885ca0aa581254174 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Tue, 9 Jul 2024 08:27:41 +0200 Subject: [PATCH 16/21] Fix spelling and grammar errors --- docs/mission_module.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/mission_module.md b/docs/mission_module.md index a0bbdbe..232285f 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -6,18 +6,18 @@ Here, additional info on the Mission Module is provided. For the purpose and usa ## Autonomy Device -After connection, the autonomy device is in state `Idle`. The internal state of the Autonomy is driven by +After connection, the autonomy device is in a state `Idle`. The internal state of Autonomy is driven by -- the received command (e.g., command stops names and the action value), -- the sensors for car orientation (e.g., some obstacle prevents car from driving). +- the received command (e.g., the command stops names and the action value), +- the sensors for car orientation (e.g., some obstacle prevents the car from driving). ![autonomy state diagram](images/image.png "Car state diagram") -The Autonomy keeps in memory the NAME of the next stop (the `nextStop` in the acitivty diagram below), it should drive to (it can be empty). This stop is used when calling for change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving command are shown below. Note the `route` in the command is informative and does not affect the actions. +The Autonomy keeps in memory the NAME of the next stop (the `nextStop` in the activity diagram below), it should drive to (it can be empty). This stop is used when calling for a change in the internal components of the Autonomy device driving the car. The actions taken by the autonomy after receiving the command are shown below. Note the `route` in the command is informative and does not affect the actions. ![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") -The Autonomy device sends the status of the car to the Mission Module. The status contains field `State` with value correspoding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). +The Autonomy device sends the status of the car to the Mission Module. The status contains a field `State` with the value corresponding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). # Messages @@ -31,7 +31,7 @@ Always contains - state (State enum value: `IDLE`, `DRIVE`, `IN_STOP`, `OBSTACLE`, `ERROR`) -If state is `DRIVE` or `IN_STOP`, it must contain +If the state is `DRIVE` or `IN_STOP`, it must contain - next stop (`Station`) @@ -104,7 +104,7 @@ Always contains - stations (list of Station) - route (string) -Example of command payload when car received the mission: +Example of command payload when the car received the mission: ```json { From eb5f97e34bc545a94fae144c550d416673c0c553 Mon Sep 17 00:00:00 2001 From: Jan Kubalek Date: Sun, 28 Jul 2024 20:21:27 +0200 Subject: [PATCH 17/21] Small documentation updates --- README.md | 32 +++++++++++--------- docs/mission_module.md | 14 ++++----- resource/external_server_example_config.json | 10 ++++++ 3 files changed, 34 insertions(+), 22 deletions(-) create mode 100644 resource/external_server_example_config.json diff --git a/README.md b/README.md index b01a151..6f8d190 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,44 @@ # Introduction -The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/summary) for communication between a car and a cloud. +The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://github.com/bringauto/fleet-protocol) for communication between a car and a cloud. It provides communication between + 1. Fleet Management - the application giving control over the car's mission to the end user, 2. Autonomy device - the driving component of the car. For a detailed description of the inner workings, see the [Mission Module documentation](./docs/mission_module.md). -# Identification and supported devices +## Identification and supported devices Module number/ID: `1`. -## Autonomy Device - -The device drives the car according to the current mission. - -### Device identification +### Device list -- device type: 0 -- device role: `driving` +| **Device Name** | **Device Type** | **Device Roles** | Comment | +|-----------------|-----------------|------------------|-------------------------------------------------------------| +| autonomy | 0 | driving | The device drives the car according the mission. | -# Dependencies +## Dependencies - [CMakeLib](https://github.com/cmakelib/cmakelib) -# Build +If BRINGAUTO_SYSTEM_DEP=ON is set the dependencies described by [cmake/Dependencies.cmake](cmake/Dependencies.cmake) +need to be installed as part of the system. + +## Build ```bash mkdir _build && cd _build -cmake -DCMAKE_BUILD_TYPE=Release [-DBRINGAUTO_INSTALL=ON] [-DBRINGAUTO_PACKAGE=ON] .. +cmake -DCMAKE_BUILD_TYPE=Release [-DBRINGAUTO_INSTALL=ON] [-DBRINGAUTO_PACKAGE=ON] [-DBRINGAUTO_SYSTEM_DEP=ON] .. make +make install # in case of INSTALL feature on +cpack # in case of PACKAGE feature on ``` -# Configuration +## Configuration -Configuration is required. Configuration file with example values: +External Server Module Configuration is required as: ```json "config": { @@ -54,4 +57,3 @@ Configuration is required. Configuration file with example values: - `api_key`: generated in Fleet Protocol HTTP API (script/new_admin.py) - `company_name`, `car_name`: used to identify the car in Fleet Protocol HTTP API - `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms`: explained in [HTTP client README](./lib/fleet-v2-http-client/README.md) - diff --git a/docs/mission_module.md b/docs/mission_module.md index 232285f..8385c7d 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -54,7 +54,7 @@ Example: "fuel": 0.62 }, "nextStop": { - "name": "Ribnjak", + "name": "Train Station", "position": { "latitude": 45.815011, "longitude": 15.981919, @@ -76,7 +76,7 @@ Example: { "finishedStops": [ { - "name": "Trg Eugena Kvaternika", + "name": "Train Station", "position": { "latitude": 45.8144669, "longitude": 15.9965289, @@ -84,7 +84,7 @@ Example: } }, { - "name": "Vlaška", + "name": "Bus Station", "position": { "latitude": 45.8139306, "longitude": 15.9913147, @@ -111,7 +111,7 @@ Example of command payload when the car received the mission: "action": "START", "stations": [ { - "name": "Ribnjak", + "name": "Fish Market", "position": { "latitude": 45.815011, "longitude": 15.981919, @@ -119,7 +119,7 @@ Example of command payload when the car received the mission: } }, { - "name": "Trg hrvatskih velikana", + "name": "Bus Station", "position": { "latitude": 45.8120758, "longitude": 15.9837108, @@ -127,7 +127,7 @@ Example of command payload when the car received the mission: } }, { - "name": "Trg Eugena Kvaternika", + "name": "Train Station", "position": { "latitude": 45.8144669, "longitude": 15.9965289, @@ -135,7 +135,7 @@ Example of command payload when the car received the mission: } } ], - "route": "Kvatrić" + "route": "FishMarketRoundTrip" } ``` diff --git a/resource/external_server_example_config.json b/resource/external_server_example_config.json new file mode 100644 index 0000000..89b31ed --- /dev/null +++ b/resource/external_server_example_config.json @@ -0,0 +1,10 @@ +{ + "api_url": "http://localhost:8080", + "api_key": "StaticAccessKeyToBeUsedByDevelopersOnEtna", + "company_name": "bringauto", + "car_name": "virtual_vehicle", + "max_requests_threshold_count": "10", + "max_requests_threshold_period_ms": "5000", + "delay_after_threshold_reached_ms": "5000", + "retry_requests_delay_ms": "200" +} \ No newline at end of file From 844f041272006374e698af1bcc2bde2e2c5e47f3 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Mon, 29 Jul 2024 12:32:48 +0200 Subject: [PATCH 18/21] Fix the introduction of README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b01a151..736edf3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Introduction -The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://ref.bringautofleet.com/r/protocol/v2/2.0.1/summary) for communication between a car and a cloud. +The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](https://github.com/bringauto/fleet-protocol) for communication between a car and a cloud. It provides communication between -1. Fleet Management - the application giving control over the car's mission to the end user, -2. Autonomy device - the driving component of the car. + +1. Autonomy device - the driving component of the car. +2. Cloud - a component providing interface giving the end user to control the car's mission. For a detailed description of the inner workings, see the [Mission Module documentation](./docs/mission_module.md). @@ -54,4 +55,3 @@ Configuration is required. Configuration file with example values: - `api_key`: generated in Fleet Protocol HTTP API (script/new_admin.py) - `company_name`, `car_name`: used to identify the car in Fleet Protocol HTTP API - `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms`: explained in [HTTP client README](./lib/fleet-v2-http-client/README.md) - From 967f2bac1d398433531cb1f1f37fe1d651a06930 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Mon, 29 Jul 2024 12:35:06 +0200 Subject: [PATCH 19/21] Remove line break in README --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index aafc982..b29aeb9 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,7 @@ Module number/ID: `1`. - [CMakeLib](https://github.com/cmakelib/cmakelib) -If BRINGAUTO_SYSTEM_DEP=ON is set the dependencies described by [cmake/Dependencies.cmake](cmake/Dependencies.cmake) -need to be installed as part of the system. +If BRINGAUTO_SYSTEM_DEP=ON is set the dependencies described by [cmake/Dependencies.cmake](cmake/Dependencies.cmake) needs to be installed as part of the system. ## Build From 7c25423033450612af6293895c71396315f93517 Mon Sep 17 00:00:00 2001 From: "jiri.strouhal" Date: Thu, 1 Aug 2024 09:50:19 +0200 Subject: [PATCH 20/21] Fix typos and grammar --- README.md | 8 ++++---- docs/mission_module.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b29aeb9..12551e5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ The Mission Module is a core module of the BringAuto in-house [Fleet Protocol](h It provides communication between 1. Autonomy device - the driving component of the car. -2. Cloud - a component providing interface giving the end user to control the car's mission. +2. Cloud - a component providing an interface giving the end user to control the car's mission. For a detailed description of the inner workings, see the [Mission Module documentation](./docs/mission_module.md). @@ -15,15 +15,15 @@ Module number/ID: `1`. ### Device list -| **Device Name** | **Device Type** | **Device Roles** | Comment | -|-----------------|-----------------|------------------|-------------------------------------------------------------| +| **Device Name** | **Device Type** | **Device Roles** | Comment | +| --------------- | --------------- | ---------------- | ------------------------------------------------ | | autonomy | 0 | driving | The device drives the car according the mission. | ## Dependencies - [CMakeLib](https://github.com/cmakelib/cmakelib) -If BRINGAUTO_SYSTEM_DEP=ON is set the dependencies described by [cmake/Dependencies.cmake](cmake/Dependencies.cmake) needs to be installed as part of the system. +If BRINGAUTO_SYSTEM_DEP=ON is set, the dependencies described by [cmake/Dependencies.cmake](cmake/Dependencies.cmake) need to be installed as part of the system. ## Build diff --git a/docs/mission_module.md b/docs/mission_module.md index 8385c7d..d94cd00 100644 --- a/docs/mission_module.md +++ b/docs/mission_module.md @@ -17,13 +17,13 @@ The Autonomy keeps in memory the NAME of the next stop (the `nextStop` in the ac ![activity diagram of autonomy receiving command](uml/exported_diagrams/command_activity_diagram.png "Activity diagram of the autonomy receiving command") -The Autonomy device sends the status of the car to the Mission Module. The status contains a field `State` with the value corresponding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). +The Autonomy device sends the car status to the Mission Module. The status contains a field `State` with the value corresponding to the state of the device (`DRIVE`, `IN_STOP`, `IDLE`, `OBSTACLE`, `ERROR`). # Messages ## Structure -Below, the data passed in the messages used in the External Protocol are described. The data structure can be also found in the [.proto](../lib/protobuf-mission-module/) file. +Below, the data passed in the messages used in the External Protocol are described. The data structure can also be found in the [.proto](../lib/protobuf-mission-module/) file. ## Status payload data From 552de503e7264a0b68310e711eb3d2a7c32c8030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Strouhal?= <66553485+jiristrouhal@users.noreply.github.com> Date: Thu, 1 Aug 2024 09:55:14 +0200 Subject: [PATCH 21/21] Update README.md Add missing article Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 12551e5..1f9bca1 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ External Server Module Configuration is required as: } ``` -- `api_url`: URL of the Fleet Protocol HTTP API (the [project repository](https://github.com/bringauto/fleet-protocol-http-api)) +- `api_url`: URL of the Fleet Protocol HTTP API ([project repository](https://github.com/bringauto/fleet-protocol-http-api)) - `api_key`: generated in Fleet Protocol HTTP API (script/new_admin.py) - `company_name`, `car_name`: used to identify the car in Fleet Protocol HTTP API - `max_requests_threshold_count`, `max_requests_threshold_period_ms`, `delay_after_threshold_reached_ms`, `retry_requests_delay_ms`: explained in [HTTP client README](./lib/fleet-v2-http-client/README.md)