isar 1.15.0__py3-none-any.whl → 1.34.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. isar/__init__.py +2 -5
  2. isar/apis/api.py +159 -66
  3. isar/apis/models/__init__.py +0 -1
  4. isar/apis/models/models.py +22 -12
  5. isar/apis/models/start_mission_definition.py +128 -123
  6. isar/apis/robot_control/robot_controller.py +41 -0
  7. isar/apis/schedule/scheduling_controller.py +135 -121
  8. isar/apis/security/authentication.py +5 -5
  9. isar/config/certs/ca-cert.pem +32 -32
  10. isar/config/keyvault/keyvault_service.py +1 -2
  11. isar/config/log.py +47 -39
  12. isar/config/logging.conf +16 -31
  13. isar/config/open_telemetry.py +102 -0
  14. isar/config/predefined_mission_definition/default_exr.json +49 -0
  15. isar/config/predefined_mission_definition/default_mission.json +1 -5
  16. isar/config/predefined_mission_definition/default_turtlebot.json +4 -11
  17. isar/config/predefined_missions/default.json +67 -87
  18. isar/config/predefined_missions/default_extra_capabilities.json +107 -0
  19. isar/config/settings.py +119 -142
  20. isar/eventhandlers/eventhandler.py +123 -0
  21. isar/mission_planner/local_planner.py +6 -20
  22. isar/mission_planner/mission_planner_interface.py +1 -1
  23. isar/models/events.py +184 -0
  24. isar/models/status.py +18 -0
  25. isar/modules.py +118 -205
  26. isar/robot/robot.py +377 -0
  27. isar/robot/robot_battery.py +60 -0
  28. isar/robot/robot_monitor_mission.py +357 -0
  29. isar/robot/robot_pause_mission.py +74 -0
  30. isar/robot/robot_resume_mission.py +67 -0
  31. isar/robot/robot_start_mission.py +66 -0
  32. isar/robot/robot_status.py +61 -0
  33. isar/robot/robot_stop_mission.py +68 -0
  34. isar/robot/robot_upload_inspection.py +75 -0
  35. isar/script.py +171 -0
  36. isar/services/service_connections/mqtt/mqtt_client.py +47 -11
  37. isar/services/service_connections/mqtt/robot_heartbeat_publisher.py +32 -0
  38. isar/services/service_connections/mqtt/robot_info_publisher.py +4 -3
  39. isar/services/service_connections/persistent_memory.py +69 -0
  40. isar/services/utilities/mqtt_utilities.py +93 -0
  41. isar/services/utilities/robot_utilities.py +20 -0
  42. isar/services/utilities/scheduling_utilities.py +393 -65
  43. isar/state_machine/state_machine.py +227 -486
  44. isar/state_machine/states/__init__.py +0 -7
  45. isar/state_machine/states/await_next_mission.py +114 -0
  46. isar/state_machine/states/blocked_protective_stop.py +60 -0
  47. isar/state_machine/states/going_to_lockdown.py +95 -0
  48. isar/state_machine/states/going_to_recharging.py +92 -0
  49. isar/state_machine/states/home.py +115 -0
  50. isar/state_machine/states/intervention_needed.py +77 -0
  51. isar/state_machine/states/lockdown.py +38 -0
  52. isar/state_machine/states/maintenance.py +36 -0
  53. isar/state_machine/states/monitor.py +137 -166
  54. isar/state_machine/states/offline.py +60 -0
  55. isar/state_machine/states/paused.py +92 -23
  56. isar/state_machine/states/pausing.py +48 -0
  57. isar/state_machine/states/pausing_return_home.py +48 -0
  58. isar/state_machine/states/recharging.py +80 -0
  59. isar/state_machine/states/resuming.py +57 -0
  60. isar/state_machine/states/resuming_return_home.py +64 -0
  61. isar/state_machine/states/return_home_paused.py +109 -0
  62. isar/state_machine/states/returning_home.py +217 -0
  63. isar/state_machine/states/stopping.py +61 -0
  64. isar/state_machine/states/stopping_due_to_maintenance.py +61 -0
  65. isar/state_machine/states/stopping_go_to_lockdown.py +60 -0
  66. isar/state_machine/states/stopping_go_to_recharge.py +51 -0
  67. isar/state_machine/states/stopping_return_home.py +77 -0
  68. isar/state_machine/states/unknown_status.py +72 -0
  69. isar/state_machine/states_enum.py +22 -5
  70. isar/state_machine/transitions/mission.py +192 -0
  71. isar/state_machine/transitions/return_home.py +106 -0
  72. isar/state_machine/transitions/robot_status.py +80 -0
  73. isar/state_machine/utils/common_event_handlers.py +73 -0
  74. isar/storage/blob_storage.py +71 -45
  75. isar/storage/local_storage.py +28 -14
  76. isar/storage/storage_interface.py +28 -6
  77. isar/storage/uploader.py +184 -55
  78. isar/storage/utilities.py +35 -27
  79. isar-1.34.9.dist-info/METADATA +496 -0
  80. isar-1.34.9.dist-info/RECORD +135 -0
  81. {isar-1.15.0.dist-info → isar-1.34.9.dist-info}/WHEEL +1 -1
  82. isar-1.34.9.dist-info/entry_points.txt +3 -0
  83. robot_interface/models/exceptions/__init__.py +0 -7
  84. robot_interface/models/exceptions/robot_exceptions.py +274 -4
  85. robot_interface/models/initialize/__init__.py +0 -1
  86. robot_interface/models/inspection/__init__.py +0 -13
  87. robot_interface/models/inspection/inspection.py +43 -34
  88. robot_interface/models/mission/mission.py +18 -14
  89. robot_interface/models/mission/status.py +20 -25
  90. robot_interface/models/mission/task.py +156 -92
  91. robot_interface/models/robots/battery_state.py +6 -0
  92. robot_interface/models/robots/media.py +13 -0
  93. robot_interface/models/robots/robot_model.py +7 -7
  94. robot_interface/robot_interface.py +135 -66
  95. robot_interface/telemetry/mqtt_client.py +84 -12
  96. robot_interface/telemetry/payloads.py +111 -12
  97. robot_interface/utilities/json_service.py +7 -1
  98. isar/config/predefined_missions/default_turtlebot.json +0 -110
  99. isar/config/predefined_poses/__init__.py +0 -0
  100. isar/config/predefined_poses/predefined_poses.py +0 -616
  101. isar/config/settings.env +0 -26
  102. isar/mission_planner/sequential_task_selector.py +0 -23
  103. isar/mission_planner/task_selector_interface.py +0 -31
  104. isar/models/communication/__init__.py +0 -0
  105. isar/models/communication/message.py +0 -12
  106. isar/models/communication/queues/__init__.py +0 -4
  107. isar/models/communication/queues/queue_io.py +0 -12
  108. isar/models/communication/queues/queue_timeout_error.py +0 -2
  109. isar/models/communication/queues/queues.py +0 -19
  110. isar/models/communication/queues/status_queue.py +0 -20
  111. isar/models/mission_metadata/__init__.py +0 -0
  112. isar/services/readers/__init__.py +0 -0
  113. isar/services/readers/base_reader.py +0 -37
  114. isar/services/service_connections/mqtt/robot_status_publisher.py +0 -93
  115. isar/services/service_connections/stid/__init__.py +0 -0
  116. isar/services/service_connections/stid/stid_service.py +0 -45
  117. isar/services/utilities/queue_utilities.py +0 -39
  118. isar/state_machine/states/idle.py +0 -40
  119. isar/state_machine/states/initialize.py +0 -60
  120. isar/state_machine/states/initiate.py +0 -129
  121. isar/state_machine/states/off.py +0 -18
  122. isar/state_machine/states/stop.py +0 -78
  123. isar/storage/slimm_storage.py +0 -181
  124. isar-1.15.0.dist-info/METADATA +0 -417
  125. isar-1.15.0.dist-info/RECORD +0 -113
  126. robot_interface/models/initialize/initialize_params.py +0 -9
  127. robot_interface/models/mission/step.py +0 -211
  128. {isar-1.15.0.dist-info → isar-1.34.9.dist-info/licenses}/LICENSE +0 -0
  129. {isar-1.15.0.dist-info → isar-1.34.9.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,496 @@
1
+ Metadata-Version: 2.4
2
+ Name: isar
3
+ Version: 1.34.9
4
+ Summary: Integration and Supervisory control of Autonomous Robots
5
+ Author-email: Equinor ASA <fg_robots_dev@equinor.com>
6
+ License: Eclipse Public License version 2.0
7
+
8
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
9
+
10
+ 1. DEFINITIONS
11
+ “Contribution” means:
12
+
13
+ a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and
14
+ b) in the case of each subsequent Contributor:
15
+ i) changes to the Program, and
16
+ ii) additions to the Program;
17
+ where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution “originates” from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works.
18
+ “Contributor” means any person or entity that Distributes the Program.
19
+
20
+ “Licensed Patents” mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
21
+
22
+ “Program” means the Contributions Distributed in accordance with this Agreement.
23
+
24
+ “Recipient” means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors.
25
+
26
+ “Derivative Works” shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.
27
+
28
+ “Modified Works” shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof.
29
+
30
+ “Distribute” means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy.
31
+
32
+ “Source Code” means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files.
33
+
34
+ “Secondary License” means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor.
35
+
36
+ 2. GRANT OF RIGHTS
37
+ a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works.
38
+ b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
39
+ c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
40
+ d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
41
+ e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3).
42
+ 3. REQUIREMENTS
43
+ 3.1 If a Contributor Distributes the Program in any form, then:
44
+
45
+ a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and
46
+ b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license:
47
+ i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
48
+ ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
49
+ iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and
50
+ iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3.
51
+ 3.2 When the Program is Distributed as Source Code:
52
+
53
+ a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and
54
+ b) a copy of this Agreement must be included with each copy of the Program.
55
+ 3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability (‘notices’) contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices.
56
+
57
+ 4. COMMERCIAL DISTRIBUTION
58
+ Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (“Commercial Contributor”) hereby agrees to defend and indemnify every other Contributor (“Indemnified Contributor”) against any losses, damages and costs (collectively “Losses”) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
59
+
60
+ For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
61
+
62
+ 5. NO WARRANTY
63
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
64
+
65
+ 6. DISCLAIMER OF LIABILITY
66
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
67
+
68
+ 7. GENERAL
69
+ If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
70
+
71
+ If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
72
+
73
+ All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
74
+
75
+ Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version.
76
+
77
+ Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement.
78
+
79
+ Exhibit A – Form of Secondary Licenses Notice
80
+ “This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}.”
81
+
82
+ Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses.
83
+
84
+ If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
85
+
86
+ You may add additional accurate notices of copyright ownership.
87
+
88
+ Project-URL: repository, https://github.com/equinor/isar.git
89
+ Classifier: Intended Audience :: Developers
90
+ Classifier: Intended Audience :: Science/Research
91
+ Classifier: License :: OSI Approved :: Eclipse Public License 2.0 (EPL-2.0)
92
+ Classifier: Natural Language :: English
93
+ Classifier: Programming Language :: Python :: 3
94
+ Classifier: Programming Language :: Python :: 3.9
95
+ Classifier: Programming Language :: Python :: 3.10
96
+ Classifier: Programming Language :: Python :: 3.11
97
+ Classifier: Programming Language :: Python :: 3.12
98
+ Classifier: Programming Language :: Python :: 3.13
99
+ Classifier: Topic :: Scientific/Engineering
100
+ Classifier: Topic :: Scientific/Engineering :: Physics
101
+ Classifier: Topic :: Software Development :: Libraries
102
+ Requires-Python: >=3.9
103
+ Description-Content-Type: text/markdown
104
+ License-File: LICENSE
105
+ Requires-Dist: alitra>=1.1.3
106
+ Requires-Dist: azure-identity
107
+ Requires-Dist: azure-keyvault-secrets
108
+ Requires-Dist: azure-storage-blob
109
+ Requires-Dist: backoff
110
+ Requires-Dist: click
111
+ Requires-Dist: dacite
112
+ Requires-Dist: fastapi-azure-auth
113
+ Requires-Dist: fastapi>=0.121.0
114
+ Requires-Dist: dependency-injector
115
+ Requires-Dist: numpy
116
+ Requires-Dist: paho-mqtt
117
+ Requires-Dist: pydantic_settings
118
+ Requires-Dist: pydantic
119
+ Requires-Dist: PyJWT
120
+ Requires-Dist: python-dotenv
121
+ Requires-Dist: PyYAML
122
+ Requires-Dist: requests-toolbelt
123
+ Requires-Dist: requests
124
+ Requires-Dist: starlette>=0.49.1
125
+ Requires-Dist: transitions
126
+ Requires-Dist: uvicorn
127
+ Requires-Dist: opentelemetry-api
128
+ Requires-Dist: opentelemetry-sdk
129
+ Requires-Dist: opentelemetry-exporter-otlp
130
+ Requires-Dist: opentelemetry-instrumentation-fastapi
131
+ Requires-Dist: azure-monitor-opentelemetry
132
+ Requires-Dist: azure-monitor-opentelemetry-exporter>=1.0.0b38
133
+ Requires-Dist: pymysql
134
+ Requires-Dist: sqlalchemy
135
+ Requires-Dist: psycopg2-binary
136
+ Provides-Extra: dev
137
+ Requires-Dist: black; extra == "dev"
138
+ Requires-Dist: isort; extra == "dev"
139
+ Requires-Dist: mypy; extra == "dev"
140
+ Requires-Dist: pip-tools; extra == "dev"
141
+ Requires-Dist: pre-commit; extra == "dev"
142
+ Requires-Dist: pytest-mock; extra == "dev"
143
+ Requires-Dist: pytest-xdist; extra == "dev"
144
+ Requires-Dist: pytest; extra == "dev"
145
+ Requires-Dist: requests-mock; extra == "dev"
146
+ Requires-Dist: ruff; extra == "dev"
147
+ Requires-Dist: testcontainers[mysql]; extra == "dev"
148
+ Requires-Dist: alembic; extra == "dev"
149
+ Dynamic: license-file
150
+
151
+ # ISAR
152
+
153
+ [![Python package](https://github.com/equinor/isar/actions/workflows/pythonpackage.yml/badge.svg)](https://github.com/equinor/isar/actions/workflows/pythonpackage.yml)
154
+ [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
155
+ [![License](https://img.shields.io/badge/License-EPL_2.0-blue.svg)](https://opensource.org/licenses/EPL-2.0)
156
+
157
+ ISAR - Integration and Supervisory control of Autonomous Robots - is a tool for integrating robot applications into
158
+ operator systems. Through the ISAR API you can send commands to a robot to do missions and collect results from the
159
+ missions.
160
+
161
+ ## Getting started
162
+
163
+ Steps:
164
+
165
+ - Install
166
+ - Integrate a robot
167
+ - Run the ISAR server
168
+ - Run a robot mission
169
+
170
+ ### Install
171
+
172
+ For local development, please fork the repository. Then, clone and install in the repository root folder:
173
+
174
+ ```
175
+ git clone https://github.com/<path_to_parent>/isar
176
+ cd isar
177
+ pip install -e .[dev]
178
+ ```
179
+
180
+ For `zsh` you might have to type `".[dev]"`
181
+
182
+ Verify that you can run the tests:
183
+
184
+ ```bash
185
+ pytest .
186
+ ```
187
+
188
+ The repository contains a configuration file for installing pre-commit hooks. Currently, [black](https://github.com/psf/black) and a mirror of [mypy](https://github.com/pre-commit/mirrors-mypy) are configured hooks. Install with:
189
+
190
+ ```
191
+ pre-commit install
192
+ ```
193
+
194
+ Verify that pre-commit runs:
195
+
196
+ ```
197
+ pre-commit
198
+ ```
199
+
200
+ pre-commit will now run the installed hooks before code is commited to git. To turn pre-commit off, run:
201
+
202
+ ```
203
+ pre-commit uninstall
204
+ ```
205
+
206
+ ### Robot integration
207
+
208
+ To connect the state machine to a robot in a separate repository, it is required that the separate repository implements
209
+ the [robot interface](https://github.com/equinor/isar/blob/main/src/robot_interface/robot_interface.py).
210
+ The separate repository should also have a settings.env file in a config folder where `CAPABILITIES` and `ROBOT_MODEL` are set.
211
+ A mocked robot can be found in [this repository](https://github.com/equinor/isar-robot). Install the repo, i.e:
212
+
213
+ ```bash
214
+ pip install isar-robot
215
+ ```
216
+
217
+ NB: isar-robot has not been published to PyPi for some time, and needs to be downloaded directly
218
+ from git to work.
219
+
220
+ Then, ensure the `ISAR_ROBOT_PACKAGE` variable in [settings.env](./src/isar/config/settings.env)
221
+ is set to the name of the package you installed. `isar_robot` is set by default. See the section
222
+ for [configuration](#configuration) for overwriting configuration.
223
+
224
+ If you have the robot repository locally, you can simply install through
225
+
226
+ ```bash
227
+ pip install -e /path/to/robot/repo/
228
+ ```
229
+
230
+ #### Running ISAR with a robot simulator
231
+
232
+ A simulator based on the open source robot Turtlebot3 has been implemented for use with ISAR and may be
233
+ found [here](https://github.com/equinor/isar-turtlebot). Follow the installation instructions for the simulator and
234
+ install `isar-turtlebot` in the same manner as given in the [robot integration](#robot-integration) section. Overwrite
235
+ the following configuration variables:
236
+
237
+ ```bash
238
+ ISAR_ROBOT_PACKAGE = isar_turtlebot
239
+ ISAR_DEFAULT_MAP = turtleworld
240
+ ```
241
+
242
+ ### Run with make
243
+ Common commands for the project are in [Makefile](./Makefile).
244
+ This requires the CLI program `make`.
245
+
246
+ Usage:
247
+ ```bash
248
+ make <command-in-makefile> # for example: make run
249
+ ```
250
+
251
+ ### Run ISAR server
252
+
253
+ To run ISAR:
254
+
255
+ ```bash
256
+ isar-start
257
+ ```
258
+
259
+ Note, running the full system requires that an implementation of a robot has been installed. See
260
+ this [section](#robot-integration) for installing a mocked robot or a Turtlebot3 simulator.
261
+
262
+ ### Running a robot mission
263
+
264
+ Once the application has been started the swagger site may be accessed at
265
+
266
+ ```
267
+ http://localhost:3000/docs
268
+ ```
269
+
270
+ Execute the `/schedule/start-mission` endpoint with `mission_id=1` to run a mission.
271
+
272
+ In [this](./src/isar/config/predefined_missions) folder there are predefined default missions, for example the mission
273
+ corresponding to `mission_id=1`. A new mission may be added by adding a new json-file with a mission description. Note,
274
+ the mission IDs must be unique.
275
+
276
+ ### Configuration
277
+
278
+ The system consists of many configuration variables which may alter the functionality. As an example, it is possible to
279
+ change mission planners or add multiple storage handlers as described in the [mission planner](#mission-planner)
280
+ and [storage](#storage) sections.
281
+
282
+ There are two methods of specifying configuration.
283
+
284
+ 1. Override the default value by setting an environment variable.
285
+
286
+ Every configuration variable is defined in [settings.py](./src/isar/config/settings.py), and they may all be
287
+ overwritten by specifying the variables in the environment instead. Note that the configuration variable must be
288
+ prefixed with `ISAR_` when specified in the environment. So for the `ROBOT_PACKAGE`configuration variable:
289
+
290
+ ```shell
291
+ export ISAR_ROBOT_PACKAGE=isar_turtlebot
292
+ ```
293
+
294
+ This means ISAR will connect to `isar_turtlebot` robot package.
295
+
296
+ 2. Adding environment variables through [settings.env](./src/isar/config/settings.env).
297
+
298
+ By adding environment variables with the prefix `ISAR_` to the [settings.env](./src/isar/config/settings.env) file
299
+ the configuration variables will be overwritten by the values in this file.
300
+
301
+ ### Setup for testing
302
+ To be able to execute the tests you need to set the `ISAR_ENV` environment variable beforehand. Depending on your operating system and the command line you are using you can use one of the following commands:
303
+
304
+ **Bash/Zsh**
305
+ ```bash
306
+ export ISAR_ENV=test
307
+ ```
308
+ **Windows Command prompt**
309
+ ```cmd
310
+ set ISAR_ENV=test
311
+ ```
312
+
313
+ Remember to set `ISAR_ENV` back to `None` when you want to run `isar-start` afterwards.
314
+
315
+ ### Running tests
316
+
317
+ After following the steps in [Development](#install), you can run the tests:
318
+
319
+ ```bash
320
+ pytest .
321
+ ```
322
+
323
+ To create an interface test in your robot repository, use the function `interface_test` from `robot_interface`. The
324
+ argument should be an interface object from your robot specific implementation.
325
+ See [isar-robot](https://github.com/equinor/isar-robot/blob/main/tests/interfaces/test_robotinterface.py) for example.
326
+
327
+ #### Integration tests
328
+
329
+ Integration tests can be found [here](https://github.com/equinor/isar/tree/main/tests/integration) and have been created
330
+ with a simulator in mind. The integration tests will not run as part of `pytest .` or as part of the CI/CD pipeline. To
331
+ run the integration tests please follow the instructions in [this section](#running-isar-with-a-robot-simulator) for
332
+ setting up the `isar-turtlebot` implementation with simulator and run the following command once the simulation has been
333
+ launched.
334
+
335
+ ```bash
336
+ pytest tests/integration
337
+ ```
338
+
339
+ Note that these tests will run towards the actual simulation (you may monitor it through Gazebo and RVIZ) and it will
340
+ take a long time.
341
+
342
+ ### Documentation
343
+
344
+ To build the project documentation, run the following commands:
345
+
346
+ ```bash
347
+ cd docs
348
+ make docs
349
+ ```
350
+
351
+ The documentation can now be viewed at `docs/build/html/index.html`.
352
+
353
+ ## Components
354
+
355
+ The system consists of two main components.
356
+
357
+ 1. State machine
358
+ 1. FastAPI
359
+
360
+ ### State machine
361
+
362
+ The state machine handles interaction with the robots API and monitors the execution of missions. It also enables
363
+ interacting with the robot before, during and after missions.
364
+
365
+ The state machine is based on the [transitions](https://github.com/pytransitions/transitions) package for Python. The following are some visualizations of the state machine:
366
+
367
+ Mission behavior without the robot status changed transition that enable the resting states to transition between each other if the robot status changes:
368
+ ![State Machine extended](./docs/extended_state_machine_diagram.png)
369
+
370
+ Robot status changed transition:
371
+ ![State Machine robot status changed](./docs/robot_status_state_machine_diagram.png)
372
+
373
+ Full state machine:
374
+ ![State Machine full](./docs/full_state_machine_diagram.png)
375
+
376
+ In general the states
377
+
378
+ ```
379
+ States.Stopping,
380
+ States.Monitor,
381
+ States.Paused,
382
+ ```
383
+
384
+ indicates that the state machine is already running. For running a mission the state machine need to be in the states
385
+
386
+ ```
387
+ States.Home, States.AwaitNextMission or States.ReturningHome
388
+ ```
389
+
390
+ ### FastAPI
391
+
392
+ The FastAPI establishes an interface to the state machine for the user. As the API and state machine are separate
393
+ threads, they communicate through python queues. FastAPI runs on an ASGI-server, specifically uvicorn. The
394
+ FastAPI-framework is split into routers where the endpoint operations are defined.
395
+
396
+ ## Mission planner
397
+
398
+ The mission planner that is currently in use is a local mission planner, where missions are specified in a json file. You can create your own mission planner by implementing
399
+ the [mission planner interface](./src/isar/mission_planner/mission_planner_interface.py) and adding your planner to the
400
+ selection [here](./src/isar/modules.py). Note that you must add your module as an option in the dictionary.
401
+
402
+ ## Storage
403
+
404
+ The storage modules that are used is defined by the `ISAR_STORAGE` configuration variable. This can be changed by
405
+ overriding the configuration through an environment variable. It accepts a json encoded list and will use each element
406
+ in the list to retrieve the corresponding handler. The current options are
407
+
408
+ ```
409
+ ISAR_STORAGE = '["local", "blob"]'
410
+ ```
411
+
412
+ Note that the `blob` option requires special configuration to authenticate to these endpoints.
413
+
414
+ ### Implement your own storage module
415
+
416
+ You can create your own storage module by implementing the [storage interface](./src/isar/storage/storage_interface.py)
417
+ and adding your storage module to the selection [here](./src/isar/modules.py). Note that you must add your module as an
418
+ option in the dictionary.
419
+
420
+ ## API authentication
421
+
422
+ The API has an option to include user authentication. This can be enabled by setting the environment variable
423
+
424
+ ```
425
+ ISAR_AUTHENTICATION_ENABLED = true
426
+ ```
427
+
428
+ By default, the `local` storage module is used and API authentication is disabled. If using Azure Blob Storage a set of
429
+ environment variables must be available which gives access to an app registration that may use the storage account.
430
+ Enabling API authentication also requires the same environment variables. The required variables are
431
+
432
+ ```
433
+ AZURE_CLIENT_ID
434
+ AZURE_TENANT_ID
435
+ AZURE_CLIENT_SECRET
436
+ ISAR_BLOB_STORAGE_ACCOUNT
437
+ ```
438
+
439
+ ## MQTT communication
440
+
441
+ ISAR is able to publish parts of its internal state to topics on an MQTT broker whenever they change. This is by default
442
+ turned off but may be activated by setting the environment variable
443
+
444
+ ```
445
+ ISAR_MQTT_ENABLED = true
446
+ ```
447
+
448
+ The connection to the broker will be determined by the following configuration values in `settings.py`
449
+
450
+ ```
451
+ ISAR_MQTT_USERNAME
452
+ ISAR_MQTT_HOST
453
+ ISAR_MQTT_PORT
454
+ ```
455
+
456
+ The default values of these are overwritten by the environment in `settings.env`.
457
+
458
+ To specify broker password, add the following environment variable to a .env file in the root of the repository:
459
+
460
+ ```
461
+ ISAR_MQTT_PASSWORD
462
+ ```
463
+
464
+ If not specified the password will default to an empty string.
465
+
466
+ ## Running several ISAR instances locally
467
+
468
+ To run several ISAR instances in parallel locally:
469
+
470
+ 1. Generate a guid: https://www.guidgenerator.com/
471
+ 2. Open a new terminal in the isar folder
472
+ 3. Run the following command before running main.py:
473
+
474
+ ```
475
+ export ISAR_API_PORT=port_name_higher_than_1024 ISAR_ISAR_ID=guid ISAR_ROBOT_NAME=random_robot_name
476
+ ```
477
+
478
+ # Dependencies
479
+
480
+ The dependencies used for this package are listed in `pyproject.toml` and pinned in `requirements.txt`. This ensures our builds are predictable and deterministic. This project uses `pip-compile` (from [`pip-tools`](https://github.com/jazzband/pip-tools)) for this:
481
+
482
+ ```
483
+ pip-compile --output-file=requirements.txt pyproject.toml
484
+ ```
485
+
486
+ To update the requirements to the latest versions, run the same command with the `--upgrade` flag:
487
+
488
+ ```
489
+ pip-compile --output-file=requirements.txt pyproject.toml --upgrade
490
+ ```
491
+
492
+ # Contributions
493
+
494
+ Equinor welcomes all kinds of contributions, including code, bug reports, issues, feature requests, and documentation
495
+ Please initiate your contribution by creating an [issue](https://github.com/equinor/isar/issues) or by forking the
496
+ project and making a pull requests. Commit messages shall be written according to [this guide](https://cbea.msgit-commit/).
@@ -0,0 +1,135 @@
1
+ isar/__init__.py,sha256=cH8p8bVveu3FUL6kBhldcSlLaoHgD82Kd0-SwSNfGXw,87
2
+ isar/modules.py,sha256=2bo4Z4H2n4vl9BVwV5V5twOUevsLIuXsPiRPICjCB3k,4404
3
+ isar/script.py,sha256=mkwdRMEYW2HI9eFLyFy23Ks1_vvrsp17b8VlvkhrNao,5913
4
+ isar/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ isar/apis/api.py,sha256=0s0C1l5qGhko8rzm4D3y27mwibk_S2s2o95eAl7bH3k,16126
6
+ isar/apis/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ isar/apis/models/models.py,sha256=UqIzHiqrvI-ICi6H_xlBFH2HHgYHnMWAKlnqrdqM380,2099
8
+ isar/apis/models/start_mission_definition.py,sha256=v-wt1XDd53Sw7DCdFAkxBBut-xd_uGJa7qMJnE3VI9k,6364
9
+ isar/apis/robot_control/robot_controller.py,sha256=RSVlxbw9D668tHWItVLtyjvAnsJkCs2yUSkU3iqeAcY,1393
10
+ isar/apis/schedule/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ isar/apis/schedule/scheduling_controller.py,sha256=oyUSo0MdKB24cB796GcfdSzw6-pendz9Thtrh9yAlvc,10890
12
+ isar/apis/security/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ isar/apis/security/authentication.py,sha256=Se2puhe2TUBmfio2RLma52-VSLRhqvWgu0Cd1bhdwMo,2000
14
+ isar/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ isar/config/configuration_error.py,sha256=rO6WOhafX6xvVib8WxV-eY483Z0PpN-9PxGsq5ATfKc,46
16
+ isar/config/log.py,sha256=16qEMVKWrAc5I9xgE0xZQBpuYpy7wMz9NT19JVBZlf4,2218
17
+ isar/config/logging.conf,sha256=skjTp6AsXQGW6L6DeMxGszD-XvWu1BAVWjDipQ4QHvU,854
18
+ isar/config/open_telemetry.py,sha256=Lgu0lbRQA-zz6ZDoBKKk0whQex5w18jl1wjqWzHUGdg,3634
19
+ isar/config/settings.py,sha256=BmcLwk4_MODG1NVuFsbu2W__t68rlmMozzJFWbI4zkQ,12289
20
+ isar/config/certs/ca-cert.pem,sha256=qoNljfad_qcMxhXJIUMLd7nT-Qwf_d4dYSdoOFEOE8I,2179
21
+ isar/config/keyvault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ isar/config/keyvault/keyvault_error.py,sha256=zvPCsZLjboxsxthYkxpRERCTFxYV8R5WmACewAUQLwk,41
23
+ isar/config/keyvault/keyvault_service.py,sha256=TEAJv5RlWnYvy-n9keivdATDafdTQDj4QY8Aw3SEKoU,3124
24
+ isar/config/maps/JSP1_intermediate_deck.json,sha256=fdotzN6MVotyLbqpIjRSrbBYM84vogLkdS585NjBnL8,826
25
+ isar/config/maps/JSP1_weather_deck.json,sha256=_dG3cSBI8q4_uHqHMOO5kSYqMXn85JL3_9PaH4uk1yQ,832
26
+ isar/config/maps/default_map.json,sha256=3CdGMr0Qn3PrL4TfUK8I5a-hotMrS_n5DKfaEORJPT4,776
27
+ isar/config/maps/klab_b.json,sha256=qXgWVUYPaTdVuomf6lQL-uRbV3Tsa6CftnzcbT3dY78,842
28
+ isar/config/maps/klab_compressor.json,sha256=1Vrk5u_l4WXjrTtG4YfXlrCPbOoRs4TtYHOm0430u2A,803
29
+ isar/config/maps/klab_turtlebot.json,sha256=HcB79XFEdY0Wm96EssIFO4TMyAWzc2KENoqN7TbTT0k,823
30
+ isar/config/maps/turtleworld.json,sha256=EKLMpSK9Gu2lAN-E9l41XOaO3f9Su5n_I97mA6z7sWY,764
31
+ isar/config/predefined_mission_definition/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ isar/config/predefined_mission_definition/default_exr.json,sha256=diSi4KMnGQY01ZumYUBZDvrekgl4bgiTk-9YPXVeBCY,1550
33
+ isar/config/predefined_mission_definition/default_mission.json,sha256=NAspX-kTaHh9VygJGrytJGNjebEIPbiTnWHhj7qt9rk,2722
34
+ isar/config/predefined_mission_definition/default_turtlebot.json,sha256=20ee7q1EIx7bIIojMucSwdBafuCG5sewbMQn9gJuPEo,3704
35
+ isar/config/predefined_missions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ isar/config/predefined_missions/default.json,sha256=eBVuHXRoXELpzN0IbSOHdTVjZnhxFqJQf6h67Ez4Iqk,1243
37
+ isar/config/predefined_missions/default_extra_capabilities.json,sha256=ddYx54xvz1w5hSS5i6YrHOj8-4YMmtuolLXVha4kLvE,2157
38
+ isar/eventhandlers/eventhandler.py,sha256=xM5wmrYO3nQtxxsGt-s98ajKhfl3bCMajqtJ29CoGyo,3816
39
+ isar/mission_planner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ isar/mission_planner/local_planner.py,sha256=Mkg3vvUBF1jImfQnaFvXLNpKVadR21X4mwDd_wHqJ2w,2520
41
+ isar/mission_planner/mission_planner_interface.py,sha256=UgpPIM4FbrWOD7fGY3Ul64k3uYb8wo0FwSWGewYoVbc,485
42
+ isar/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
+ isar/models/events.py,sha256=zE2YQoWzfuVTDLX99YdXb4wu6lmc_KZlwWYQAxiNfvA,6262
44
+ isar/models/status.py,sha256=ed_CZH08IFwIKwX0t1U6MQpq5tax2LwWrTe_TjII5mg,506
45
+ isar/robot/robot.py,sha256=gw8MI_mLLY1uEFn7xMEFGcz1uBJO6MWH4JXGxbELm2k,15138
46
+ isar/robot/robot_battery.py,sha256=goLdgmn61QCgE2Ja3YuiwE_sqJzIhCkS3u90sz1kdug,2089
47
+ isar/robot/robot_monitor_mission.py,sha256=Pb0dhnVncNt6VuiidlJDyniEXiqoO1ZArSCdWCqX6IY,13831
48
+ isar/robot/robot_pause_mission.py,sha256=2zVQLh1Qoo-PIgpYUd6IBA39EJ1azIGh_lV1b9BeXqk,2631
49
+ isar/robot/robot_resume_mission.py,sha256=naseBgY3mX1p4lsfW2lW_bocuHO59VHx3fhprxi3Nf0,2417
50
+ isar/robot/robot_start_mission.py,sha256=UFwhSTBbCo-R4FO-BnrCB7bnvOkL1p_0CMDuxnSWi5E,2435
51
+ isar/robot/robot_status.py,sha256=dfAls3s8_Vha7ZMLSYngELqsdpaEpcweAWRHanQj8u8,2361
52
+ isar/robot/robot_stop_mission.py,sha256=CaXLsZjjazHmydU9iR7uOWUHtJ2zvKh4ItUbkWY5sIk,2321
53
+ isar/robot/robot_upload_inspection.py,sha256=uCc9nuH1Am5uxD2Tgnm4ZTOm0tQnud0F6eHs0rSUfvY,2539
54
+ isar/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ isar/services/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ isar/services/auth/azure_credentials.py,sha256=9PlwGe5FrPRbW2dp0go7LMp8_l_FRvL8xOXotXwzRDo,364
57
+ isar/services/service_connections/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ isar/services/service_connections/persistent_memory.py,sha256=duNj5vX4VtL5XCu6oiZ0VPmNMlFbNJMzcLcQL8nNfN8,2188
59
+ isar/services/service_connections/request_handler.py,sha256=0LxC0lu_HXeEf_xmJWjfEsh14oAUI97cpG1IWtBlcs4,4278
60
+ isar/services/service_connections/mqtt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ isar/services/service_connections/mqtt/mqtt_client.py,sha256=8Dr65JNwPx5-kRY8UsRtZ_nrQ2gXXSUH6LWFOYlnluo,4482
62
+ isar/services/service_connections/mqtt/robot_heartbeat_publisher.py,sha256=SKPvY2QwBxqnhL9aGuZQDGQ8F_NDqPtQI5bzRBIUxkQ,1203
63
+ isar/services/service_connections/mqtt/robot_info_publisher.py,sha256=AxokGk51hRPTxxD2r0P9braPJCMrf1InaCxrUBKkF4g,1402
64
+ isar/services/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ isar/services/utilities/mqtt_utilities.py,sha256=_e-UzWcoXvsBUrvb89rNXQaDN4G3rTsYlZRIhmC9fQc,3101
66
+ isar/services/utilities/robot_utilities.py,sha256=4zCigsLXfqDC8POHchktSq81zr1_pTaRve_LQsVr6Mk,514
67
+ isar/services/utilities/scheduling_utilities.py,sha256=wxLBc7l6Pc6y0aLRP-gOzBMfKUs-xg8BA9QiNdBG7bU,23814
68
+ isar/services/utilities/threaded_request.py,sha256=py4G-_RjnIdHljmKFAcQ6ddqMmp-ZYV39Ece-dqRqjs,1874
69
+ isar/state_machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
70
+ isar/state_machine/state_machine.py,sha256=Kmys0yIpsBuBxPrcqHo3FYDfAfx34haHfczihHYLmEU,13669
71
+ isar/state_machine/states_enum.py,sha256=1jiON-PJCDWIA0VHtI0AUFlWeVtbWbGijShVJyViqwI,1012
72
+ isar/state_machine/states/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ isar/state_machine/states/await_next_mission.py,sha256=IJ79RuPveK6xBnHHkMldZ8LJybLfhMcS812t7-I6-iU,4381
74
+ isar/state_machine/states/blocked_protective_stop.py,sha256=Ya5GIZS81olGoTXqKVjDaUXfl3zR6FxdsUXktPJIU80,2578
75
+ isar/state_machine/states/going_to_lockdown.py,sha256=dmOhTkg3zNLIIdxfC9b5ss0rWu-pHm-yol2ASoOIUqo,3879
76
+ isar/state_machine/states/going_to_recharging.py,sha256=CMtA9hmiW8XmH7Skj3B0_IAtdZcJCNt_qAvUL0Rmqgg,3562
77
+ isar/state_machine/states/home.py,sha256=IfAFi9bDvoqNaJRahAw8tQwRQ2Wg84kI-nAmtzXp75U,4856
78
+ isar/state_machine/states/intervention_needed.py,sha256=DmRm5bQYxUzTRCwYiFN9L4bRXWSdGgDKCBwh-hV6ySo,3156
79
+ isar/state_machine/states/lockdown.py,sha256=ZFw9XMDENECuH3lh89RKeU_3CTzW0ZBvqCKptFJG5xo,1364
80
+ isar/state_machine/states/maintenance.py,sha256=PIlPLtS7zn5uTJZ9kTrpOQGUuJww4j5vD-qaNcoj7aI,1267
81
+ isar/state_machine/states/monitor.py,sha256=WYhCkZAfsGoqO092jvnuSJEspY5gBje__-pf4nuGEDY,6267
82
+ isar/state_machine/states/offline.py,sha256=FbchMo1q2d0aZUiDj9VWuD1IAha7sD1d8e5MqyR_JBc,2564
83
+ isar/state_machine/states/paused.py,sha256=-XRjjMpzKgKQZ7oYmI1bAZXNbtti1KHlH0tt59Cv0eg,4149
84
+ isar/state_machine/states/pausing.py,sha256=Q0yH9iTWA-2yGGsD_atb_bqFJG8cApPfmd_TdcGvRbY,1693
85
+ isar/state_machine/states/pausing_return_home.py,sha256=yEMojzOwn6z2u80S1BF2gVVgs3SOLk90LscO3DIj1R8,1740
86
+ isar/state_machine/states/recharging.py,sha256=9VszfV5zAPOaAcI_k_if6uapu7lO3XDWj6GbvnldnEI,3143
87
+ isar/state_machine/states/resuming.py,sha256=Evh9gxxntKwY8MKM4gn0Sq-H9DpMx6RRJrID57LIv4Y,2071
88
+ isar/state_machine/states/resuming_return_home.py,sha256=YZhHno_WdtR5DkoeKmsN4jALmTXcOdWgOGZ0d8Tz2HQ,2414
89
+ isar/state_machine/states/return_home_paused.py,sha256=598K-hKMxjZZf3iVWDaOOauAETSwJxxDbU1wlHnt9UM,4485
90
+ isar/state_machine/states/returning_home.py,sha256=oXc7Ou7lhzLSm4oZocoiB_4I2vUyxzt2CvJP6wAJhRs,9196
91
+ isar/state_machine/states/stopping.py,sha256=B2tcd4jaSOXEkTrd5BnNfMVrzM9wRkJm5hnmM7gxUc0,2484
92
+ isar/state_machine/states/stopping_due_to_maintenance.py,sha256=Mjbwf6bQIB0ihBKrsTxnCCUzkIe0LNybVHiLGzcXSNA,2561
93
+ isar/state_machine/states/stopping_go_to_lockdown.py,sha256=_w9yL8Uq2E6W97-ccp9NJvbfjV2hv87LEK_skS5Jhqg,2327
94
+ isar/state_machine/states/stopping_go_to_recharge.py,sha256=02i37QI_551o-i_Ejc3Z9_xuI9o0g8e6WKCXcwkW2ac,1923
95
+ isar/state_machine/states/stopping_return_home.py,sha256=sKA0tZASme_XVHEj0mwotfiKjFtCZ-FB-y1IoPaj9q4,3089
96
+ isar/state_machine/states/unknown_status.py,sha256=oL92_66TDBwsIELdfqWvFvZ8NkY4oOLaGYKdZHsxAB4,3171
97
+ isar/state_machine/transitions/mission.py,sha256=coHW4Mo3HdEzjolNg6FIppTcU_g_GCvAkr3gU0ERwXc,7317
98
+ isar/state_machine/transitions/return_home.py,sha256=G9mxFpM7IR5NNq7JC-Cbign7XAMC_d7vOkVxCBFVNGE,3701
99
+ isar/state_machine/transitions/robot_status.py,sha256=60EAb1LwuOfk1TPDCgh8S5FBgcZAPHdC2KtCGDrsQrM,2763
100
+ isar/state_machine/utils/common_event_handlers.py,sha256=lBoreI1EuXrqmMkkPIZiy3yCLBDTShW_EFUxMGrCQVE,2492
101
+ isar/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
+ isar/storage/blob_storage.py,sha256=d44z3XpZDUbiKwN8Av2gytTJxnefMXrp5VhiGm4PWxU,3703
103
+ isar/storage/local_storage.py,sha256=Rn-iiiz9DI7PzIhevOMshPIaqzJaqBXeVJMQRhVSl2M,2191
104
+ isar/storage/storage_interface.py,sha256=x-imVeQTdL6dCaTaPTHpXwCR6N4e27WxK_Vpumg0x-Y,1230
105
+ isar/storage/uploader.py,sha256=0BBrxyZGGRkNxGeZeoREucegs4yKUow2523oLEie07o,10841
106
+ isar/storage/utilities.py,sha256=oLH0Rp7UtrQQdilfITnmXO1Z0ExdeDhBImYHid55vBA,3449
107
+ isar-1.34.9.dist-info/licenses/LICENSE,sha256=3fc2-ebLwHWwzfQbulGNRdcNob3SBQeCfEVUDYxsuqw,14058
108
+ robot_interface/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
+ robot_interface/robot_interface.py,sha256=s04zOYDpnUu3GxUyDo3DlX1cFf94DmSt-GrwsFPgnYw,9357
110
+ robot_interface/test_robot_interface.py,sha256=FV1urn7SbsMyWBIcTKjsBwAG4IsXeZ6pLHE0mA9EGGs,692
111
+ robot_interface/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
112
+ robot_interface/models/exceptions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ robot_interface/models/exceptions/robot_exceptions.py,sha256=7extsX9NuJsJ00xeTQ0aI7yeVGW-dzjbH-LH8Mc-uEQ,10821
114
+ robot_interface/models/initialize/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ robot_interface/models/inspection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
+ robot_interface/models/inspection/inspection.py,sha256=cjAvekL8r82s7bgukWeXpYylHvJG_oRSCJNISPVCvZg,2238
117
+ robot_interface/models/mission/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
+ robot_interface/models/mission/mission.py,sha256=MQ9p5cuclLXexaZu9bkDh5-aN99eunvYC0vP-Z_kUwI,960
119
+ robot_interface/models/mission/status.py,sha256=3KHA02Jer-HSOwFmUhRkE6cr81H1zPgbwB3p4IjchEY,702
120
+ robot_interface/models/mission/task.py,sha256=SEsdR82CIcqTymecMqYjuY3Nijj_LS90YJdxiConJag,4207
121
+ robot_interface/models/robots/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
+ robot_interface/models/robots/battery_state.py,sha256=ktOtJ8ltdK0k_i7BoqYfhc5dbOzIG6Oo-uWC67fCWio,98
123
+ robot_interface/models/robots/media.py,sha256=8A-CuuubfngzPprs6zWB9hSaqe3jzgsE8rcCzRX2Uto,227
124
+ robot_interface/models/robots/robot_model.py,sha256=-0jNKWPcEgtF_2klb1It3u0SCoAR0hSW9nce58Zq0Co,417
125
+ robot_interface/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
+ robot_interface/telemetry/mqtt_client.py,sha256=0P1S9mWdJcByGoSOwwn2NPQr9I-OX4b1VPbrIYOU-Zo,4334
127
+ robot_interface/telemetry/payloads.py,sha256=A0SWiG609k6o6-Y3vhDWE6an2-_m7D_ND85ohfW4qWs,3236
128
+ robot_interface/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
+ robot_interface/utilities/json_service.py,sha256=9N1zijW7K4d3WFR2autpaS8U9o1ibymiOX-6stTKCyk,1243
130
+ robot_interface/utilities/uuid_string_factory.py,sha256=_NQIbBQ56w0qqO0MUDP6aPpHbxW7ATRhK8HnQiBSLkc,76
131
+ isar-1.34.9.dist-info/METADATA,sha256=LmXJhW-UywCqnF6C2sLVOJ_Lr6JVJfa9yq7ESgZL7L4,29271
132
+ isar-1.34.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
133
+ isar-1.34.9.dist-info/entry_points.txt,sha256=RdnGYFhaBdMGEsOVJAAZxHCflEptjSisHqZ-Rgc4t7Q,98
134
+ isar-1.34.9.dist-info/top_level.txt,sha256=UwIML2RtuQKCyJJkatcSnyp6-ldDjboB9k9JgKipO-U,21
135
+ isar-1.34.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.40.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ isar-start = isar.script:start
3
+ isar-test-print = isar.script:print_startup_info