agx-openplx 0.15.0__cp39-cp39-macosx_11_0_x86_64.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. agx_openplx-0.15.0.dist-info/METADATA +231 -0
  2. agx_openplx-0.15.0.dist-info/RECORD +41 -0
  3. agx_openplx-0.15.0.dist-info/WHEEL +4 -0
  4. agx_openplx-0.15.0.dist-info/entry_points.txt +8 -0
  5. openplx/Core.py +7781 -0
  6. openplx/DriveTrain.py +8574 -0
  7. openplx/Math.py +5372 -0
  8. openplx/Physics.py +36195 -0
  9. openplx/Physics1D.py +6732 -0
  10. openplx/Physics3D.py +42524 -0
  11. openplx/Robotics.py +15762 -0
  12. openplx/Simulation.py +1056 -0
  13. openplx/Terrain.py +3891 -0
  14. openplx/Urdf.py +654 -0
  15. openplx/Vehicles.py +8793 -0
  16. openplx/Visuals.py +3901 -0
  17. openplx/_AgxOpenPlxPyApi.cpython-39-darwin.so +0 -0
  18. openplx/_CorePythonSwig.cpython-39-darwin.so +0 -0
  19. openplx/_DriveTrainSwig.cpython-39-darwin.so +0 -0
  20. openplx/_MathSwig.cpython-39-darwin.so +0 -0
  21. openplx/_Physics1DSwig.cpython-39-darwin.so +0 -0
  22. openplx/_Physics3DSwig.cpython-39-darwin.so +0 -0
  23. openplx/_PhysicsSwig.cpython-39-darwin.so +0 -0
  24. openplx/_RoboticsSwig.cpython-39-darwin.so +0 -0
  25. openplx/_SimulationSwig.cpython-39-darwin.so +0 -0
  26. openplx/_TerrainSwig.cpython-39-darwin.so +0 -0
  27. openplx/_UrdfSwig.cpython-39-darwin.so +0 -0
  28. openplx/_VehiclesSwig.cpython-39-darwin.so +0 -0
  29. openplx/_VisualsSwig.cpython-39-darwin.so +0 -0
  30. openplx/__init__.py +51 -0
  31. openplx/agxtoopenplx.py +55 -0
  32. openplx/anytoopenplx.py +44 -0
  33. openplx/api.py +1337 -0
  34. openplx/migrate.py +136 -0
  35. openplx/migration_hint.py +14 -0
  36. openplx/migrations.py +521 -0
  37. openplx/openplx_application.py +133 -0
  38. openplx/openplx_serialize.py +35 -0
  39. openplx/openplx_validate.py +57 -0
  40. openplx/openplx_view.py +14 -0
  41. openplx/versionaction.py +11 -0
@@ -0,0 +1,231 @@
1
+ Metadata-Version: 2.1
2
+ Name: agx-openplx
3
+ Version: 0.15.0
4
+ Summary: AGX-OpenPLX python interface development
5
+ Home-page: https://pub.algoryx.dev/openplx/
6
+ License: Apache 2.0
7
+ Author: Algoryx
8
+ Author-email: algoryx@algoryx.com
9
+ Requires-Python: >=3.8
10
+ Classifier: Intended Audience :: Manufacturing
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: License :: Other/Proprietary License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Topic :: Scientific/Engineering :: Physics
19
+ Classifier: Topic :: Scientific/Engineering :: Visualization
20
+ Requires-Dist: agx (==2.38.0.2)
21
+ Requires-Dist: openplx-bundles (>=0.15.0,<0.16.0)
22
+ Requires-Dist: pclick (>=0.4.1,<0.5.0)
23
+ Description-Content-Type: text/markdown
24
+
25
+ # AGX OpenPLX
26
+
27
+ The agx-openplx package implements all OpenPLX bundles such as Physics, Robotics, DriveTrain and Simulation using [AGX Dynamics Real-time multi-body simulation](https://www.algoryx.se/agx-dynamics/).
28
+ The package contains python bindings and native libraries needed to load and run .openplx files.
29
+
30
+ See [OpenPLX documentation](https://pub.algoryx.dev/openplx/) for more info on OpenPLX.
31
+
32
+ ## Prerequisites
33
+
34
+ - Python 3.9 on Windows or OSX
35
+ - Python 3.8 on Ubuntu 20.04
36
+ - Python 3.10 on Ubuntu 22.04
37
+ - [AGX Dynamics](https://www.algoryx.se/agx-dynamics/) 2.38.0.2 and an AGX Dynamics License
38
+
39
+ At [OpenPLX documentation](https://pub.algoryx.dev/openplx/getopenplx/) you can find out which older version of OpenPLX matches which version of AGX.
40
+
41
+ ## Install
42
+
43
+ To get the version corresponding to your AGX on Windows do:
44
+
45
+ ```bash
46
+ setup_env.bat
47
+ pip install %AGX_DATA_DIR%/agx-pypi
48
+ pip install -U agx-openplx
49
+ ```
50
+
51
+ To get the version corresponding to your AGX on OSX and Linux do:
52
+
53
+ ```bash
54
+ source setup_env.sh
55
+ pip3 install $AGX_DATA_DIR/agx-pypi
56
+ pip3 install -U agx-openplx
57
+ ```
58
+
59
+ ## License
60
+
61
+ [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
62
+
63
+ ## Usage Examples
64
+
65
+ Given the python file and openplx file below, run with:
66
+
67
+ ```bash
68
+ python3 inverted_pendulum.py
69
+ ```
70
+
71
+ To just simulate the openplx file without controllers, do:
72
+
73
+ ```bash
74
+ openplx_view inverted_pendulum.openplx
75
+ ```
76
+
77
+ or `python3 -m openplx.openplx_view inverted_pendulum.openplx`
78
+
79
+ Store contents below in a new file named `inverted_pendulum.openplx`:
80
+
81
+ ```openplx
82
+ Rod is Physics3D.Bodies.RigidBody:
83
+ inertia.mass: 10
84
+ geometry is Physics3D.Charges.Box:
85
+ size: Math.Vec3.from_xyz(0.1, 0.1, 1)
86
+ arrow is Physics3D.Charges.Box:
87
+ local_transform:
88
+ position.z: 0.5
89
+ rotation: Math.Quat.angleAxis(Math.PI / 4, Math.Vec3.Y_AXIS())
90
+ size: Math.Vec3.from_xyz(0.071, 0.1, 0.071)
91
+ mate_connector is Physics3D.Charges.MateConnector:
92
+ position.z: -geometry.size.z * 0.7
93
+ main_axis: Math.Vec3.Y_AXIS()
94
+ normal: Math.Vec3.Z_AXIS()
95
+
96
+ Cart is Physics3D.Bodies.RigidBody:
97
+ inertia.mass: 10
98
+ geometry is Physics3D.Charges.Box:
99
+ size: Math.Vec3.from_xyz(0.1, 0.1, 0.1)
100
+ connector is Physics3D.Charges.MateConnector:
101
+ main_axis: Math.Vec3.X_AXIS()
102
+ normal: Math.Vec3.Z_AXIS()
103
+ rotated_connector is Physics3D.Charges.MateConnector:
104
+ main_axis: Math.Vec3.Y_AXIS()
105
+ normal: Math.Vec3.Z_AXIS()
106
+
107
+ PendulumScene is Physics3D.System:
108
+ world_connector is Physics3D.Charges.MateConnector:
109
+ main_axis: Math.Vec3.X_AXIS()
110
+ normal: Math.Vec3.Z_AXIS()
111
+
112
+ cart is Cart
113
+ rod is Rod
114
+
115
+ prismatic is Physics3D.Interactions.Prismatic:
116
+ charges: [world_connector, cart.connector]
117
+
118
+ cart_motor is Physics3D.Interactions.LinearVelocityMotor:
119
+ desired_speed: 0
120
+ charges: prismatic.charges
121
+
122
+ hinge is Physics3D.Interactions.Hinge:
123
+ initial_angle: 0
124
+ charges: [cart.rotated_connector, rod.mate_connector]
125
+
126
+ motor_input is Physics3D.Signals.LinearVelocityMotorVelocityInput:
127
+ motor: cart_motor
128
+
129
+ hinge_angle_output is Physics3D.Signals.HingeAngleOutput:
130
+ hinge: hinge
131
+ hinge_angular_velocity_output is Physics3D.Signals.HingeAngularVelocityOutput:
132
+ hinge: hinge
133
+
134
+ cart_position_output is Physics3D.Signals.RigidBodyPositionOutput:
135
+ rigid_body: cart
136
+ cart_velocity_output is Physics3D.Signals.RigidBodyVelocityOutput:
137
+ rigid_body: cart
138
+ ```
139
+
140
+ Store contents below in a new file named `inverted_pendulum.py`:
141
+
142
+ ```python
143
+ import os
144
+ import signal
145
+ import agxOSG
146
+ import agxSDK
147
+ from openplxbundles import bundle_path
148
+
149
+ # Import useful utilities to access the current simulation, graphics root and application
150
+ from agxPythonModules.utils.environment import init_app, simulation, root
151
+
152
+ from openplx import Math, Physics, Physics3D, Signals
153
+ from openplx import InputSignalListener, OutputSignalListener, load_from_file
154
+
155
+ def file_dir():
156
+ return os.path.dirname(os.path.abspath(__file__))
157
+
158
+ def pendulum():
159
+ return f"{file_dir()}/inverted_pendulum.openplx"
160
+
161
+ class PDController:
162
+ def __init__(self, kp, kd, goal):
163
+ self.kp = kp
164
+ self.kd = kd
165
+ self.goal = goal
166
+
167
+ def observe(self, x, xdot):
168
+ error = self.goal - x
169
+ return self.kp * error - self.kd * xdot
170
+
171
+
172
+ class CartController(agxSDK.StepEventListener):
173
+ motor_input: Physics3D.Signals_LinearVelocityMotorVelocityInput
174
+ cart: PDController
175
+ pole: PDController
176
+
177
+ def __init__(self, motor_input: Physics3D.Signals_LinearVelocityMotorVelocityInput):
178
+ super().__init__()
179
+ self.motor_input = motor_input
180
+ self.cart = PDController(kp=10, kd=5, goal=0)
181
+ self.pole = PDController(kp=20, kd=5, goal=0)
182
+
183
+ def pre(self, time):
184
+ if time == 0.0:
185
+ hinge_angle = 0
186
+ hinge_angular_velocity = 0
187
+ cart_position = Math.Vec3.from_xyz(0,0,0)
188
+ cart_velocity = Math.Vec3.from_xyz(0,0,0)
189
+ else:
190
+ signal_values = {signal.source().getName():signal.value().value() for signal in Signals.getOutputSignals()}
191
+ hinge_angle = signal_values["PendulumScene.hinge_angle_output"]
192
+ hinge_angular_velocity = signal_values["PendulumScene.hinge_angular_velocity_output"]
193
+ cart_position = signal_values["PendulumScene.cart_position_output"]
194
+ cart_velocity = signal_values["PendulumScene.cart_velocity_output"]
195
+
196
+ u_cart = self.cart.observe(cart_position.x(), cart_velocity.x())
197
+ u_pole = self.pole.observe(hinge_angle, hinge_angular_velocity)
198
+
199
+ Signals.sendInputSignal(Physics.Signals_RealInputSignal.create(-u_cart - u_pole, self.motor_input))
200
+
201
+
202
+ def buildScene():
203
+
204
+ result = load_from_file(simulation(), pendulum(), bundle_path(), "")
205
+ assembly = result.assembly()
206
+ openplx_scene = result.scene()
207
+ # Add a signal listener so that signals are picked up from inputs
208
+ input_signal_listener = InputSignalListener(assembly)
209
+ output_signal_listener = OutputSignalListener(assembly, openplx_scene)
210
+ simulation().add(input_signal_listener, InputSignalListener.RECOMMENDED_PRIO)
211
+ simulation().add(output_signal_listener, OutputSignalListener.RECOMMENDED_PRIO)
212
+ simulation().add(assembly.get())
213
+ agxOSG.createVisual(assembly.get(), root())
214
+
215
+ motor_input: Physics3D.Signals_LinearVelocityMotorVelocityInput = openplx_scene.getDynamic("motor_input").asObject()
216
+ controller = CartController(motor_input)
217
+ simulation().add(controller)
218
+
219
+
220
+ def handler(_, __):
221
+ os._exit(0)
222
+
223
+ signal.signal(signal.SIGINT, handler)
224
+
225
+ init = init_app(name=__name__,
226
+ scenes=[(buildScene, '1')],
227
+ autoStepping=True, # Default: False
228
+ onInitialized=lambda app: print('App successfully initialized.'),
229
+ onShutdown=lambda app: print('App successfully shut down.'))
230
+ ```
231
+
@@ -0,0 +1,41 @@
1
+ openplx/Core.py,sha256=8V0Y0pJANycjq8SpFEUmqb3cNiqQbFkRI8IagtcsMFE,270043
2
+ openplx/DriveTrain.py,sha256=c7N8ivmXsfTeGnVSFaEM7-CzKpjOalZK7ZpQqxgjI1Y,418894
3
+ openplx/Math.py,sha256=kTaoNjhQSmvVHmo1WV3z9GdjNvuzPSXFW6kd-UQpJAQ,188561
4
+ openplx/Physics.py,sha256=A2TcVBtnpTh7WJjpRruH1Me70kTBKaIc2k0xCMZNtjs,1884436
5
+ openplx/Physics1D.py,sha256=wix9M9SMRvmGSPrQyCKWdMM7IqdkkVI9Vi7eyrMrfIE,345906
6
+ openplx/Physics3D.py,sha256=5YQwAXEAp-CMP8Ajqvj_QKgTj3Uvp7gWI9vyRsQ5D0A,2437851
7
+ openplx/Robotics.py,sha256=NvqWJbCpk1jDZvJJVi0PijOwOpWZm2OZGZJ1_HegNj8,798979
8
+ openplx/Simulation.py,sha256=mIuypCjz1O6c9_x4O_Ro6GLhOiXRzNlZlVjdgoGYq3U,46318
9
+ openplx/Terrain.py,sha256=9CxizkDVf9UtPIyBumenXzfbxAL6yn2G_d0_ZWbv-JY,184884
10
+ openplx/Urdf.py,sha256=JOryVyaFIROiyJ9V9OMrZAS3MoUwVmJW_2TTPSsRlH4,23780
11
+ openplx/Vehicles.py,sha256=QmtdIawHlYcIRtJH4LotXSQNs06rCpxPl6e5gklUvWg,450074
12
+ openplx/Visuals.py,sha256=lYBFzzPZvMeWaKzXQgzikmO-fuDshcgf5uCJJQ-WKTM,187052
13
+ openplx/_AgxOpenPlxPyApi.cpython-39-darwin.so,sha256=hlnjyOt2lHVNHBHhV15buJtmSAxPb3V5_Q6lVZVI2lA,13376328
14
+ openplx/_CorePythonSwig.cpython-39-darwin.so,sha256=KTqryio2-WkSZafuauqcl1kJhklRJgBW_O2_POnU4Ms,3456360
15
+ openplx/_DriveTrainSwig.cpython-39-darwin.so,sha256=qCjZ9L2dAatc0CILZSEKKO-ETnD4YZ-6g-QuO1TBdo0,6868592
16
+ openplx/_MathSwig.cpython-39-darwin.so,sha256=7FzvhpHVXgk3hCFaX6EcvBS8gQCTAsQWwMHSNA01oNc,2252240
17
+ openplx/_Physics1DSwig.cpython-39-darwin.so,sha256=HdCSQvldV2NBUfR6NV926hHWSxta-4cqmE4OAlYTVds,4333648
18
+ openplx/_Physics3DSwig.cpython-39-darwin.so,sha256=iEYGgR7sIuQjRumXhiIL6-BgDZk-2RrVmFZjX52EQ1g,17450072
19
+ openplx/_PhysicsSwig.cpython-39-darwin.so,sha256=i8_ZJ9Tvc1Kcb3PlTRsKYHa91igEJ7wOmp_dQ1KoQz4,12886896
20
+ openplx/_RoboticsSwig.cpython-39-darwin.so,sha256=pntsL0V8LX4FYIvUKrnnjQC990MpFz32035LpABYS38,9826080
21
+ openplx/_SimulationSwig.cpython-39-darwin.so,sha256=vytUS5UpOwL4W1Tvc8dG9-ZTHp2lWRHFdjxRxltCRAQ,2478472
22
+ openplx/_TerrainSwig.cpython-39-darwin.so,sha256=UEts78ZKoIOJMXCIFQeioaGhbJ2629qEMT_xrfhwMTo,5080488
23
+ openplx/_UrdfSwig.cpython-39-darwin.so,sha256=cCiq2vUF5hEFZ9BC_9X3ZkYlzfhZ_oQggWTTI2XU6no,4071728
24
+ openplx/_VehiclesSwig.cpython-39-darwin.so,sha256=7a0fOFlkv-t8tEjLXhiu8Ea7Q6j4f4kfCGjK6c9h72Y,6870360
25
+ openplx/_VisualsSwig.cpython-39-darwin.so,sha256=z_Urcou-14DxvuXuz5kKhKBxryCqm8ksRU40NGRKJzI,2390848
26
+ openplx/__init__.py,sha256=84JW4DGXG1xhGs6hL701s4_zXS_ksXBfgboChdrwBoE,2050
27
+ openplx/agxtoopenplx.py,sha256=gxQgZ_Pgda_5scCCBBhyu8D-jjL1yxlE7bZLtxigKCs,2422
28
+ openplx/anytoopenplx.py,sha256=qAZVnelFOVAQIpCQt3y9LlfCBHQcNmxUWXFbCZuNQUc,2274
29
+ openplx/api.py,sha256=05ECQBudlYfrMh1OgAYbq8VDsj_UlZKlPxx31RGnES0,46915
30
+ openplx/migrate.py,sha256=Lm3dyiAH-1NUV9xjtCCKOj1GldYkw5DggJM8GO_p4us,5602
31
+ openplx/migration_hint.py,sha256=2Xs2OB_HikmiynDAk4xHKhmU5N4pqOnPFPpeIWhK37Y,603
32
+ openplx/migrations.py,sha256=-j9it2oNK0A4Z-PCPyXRE0UYdU4kMpbVEVoEIjGxkFA,15094
33
+ openplx/openplx_application.py,sha256=VDSsIGCDay8__omhsdKkSRaqmvY_vH6yLHQr3fTzyzA,6346
34
+ openplx/openplx_serialize.py,sha256=Uul2-6_BwyJzg26JdgAz2MjR37mQJ6kWKjPbmE-sJzk,1456
35
+ openplx/openplx_validate.py,sha256=pqBg9WBh7OUi63dOmmCpDWt_jTn8OhCSmtgL-nmb1XY,2055
36
+ openplx/openplx_view.py,sha256=nUca0BVnTTcCzGoj8q2f3QVmZFpKd3PPptjuKqoHA18,350
37
+ openplx/versionaction.py,sha256=Obj_q69dn5GnFMZs2as87ZScPMLaLAduPppmXUzLB6I,283
38
+ agx_openplx-0.15.0.dist-info/METADATA,sha256=n0lbchTEYxII_StBn_BQjEzYA-X-z40E8jL7Yk8mfBg,7824
39
+ agx_openplx-0.15.0.dist-info/WHEEL,sha256=W307N0wBfaRdJhpFt3-O569UHUDhv6HYSm6E0RX82zU,105
40
+ agx_openplx-0.15.0.dist-info/entry_points.txt,sha256=IyHBVBNuH_4ZhfWnB1ZVXYtpKG_QT7dwGIUMLWdyhrc,263
41
+ agx_openplx-0.15.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.7.0
3
+ Root-Is-Purelib: false
4
+ Tag: cp39-cp39-macosx_11_0_x86_64
@@ -0,0 +1,8 @@
1
+ [console_scripts]
2
+ agxtoopenplx=openplx.agxtoopenplx:run
3
+ anytoopenplx=openplx.anytoopenplx:run
4
+ openplx_migrate=openplx.migrate:run
5
+ openplx_serialize=openplx.openplx_serialize:run
6
+ openplx_validate=openplx.openplx_validate:run
7
+ openplx_view=openplx.openplx_view:run
8
+