autoverse-cli 0.4.1__py3-none-any.whl → 0.6.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- {autoverse_cli-0.4.1.dist-info → autoverse_cli-0.6.0.dist-info}/METADATA +2 -1
- autoverse_cli-0.6.0.dist-info/RECORD +37 -0
- {autoverse_cli-0.4.1.dist-info → autoverse_cli-0.6.0.dist-info}/WHEEL +1 -1
- avrs/app_version.py +1 -1
- avrs/avrs.py +29 -8
- avrs/can_tool.py +192 -0
- avrs/can_tool_util.py +190 -0
- avrs/cfg.py +53 -1
- avrs/launcher.py +7 -1
- avrs/launcher_util.py +3 -0
- avrs/requests/change_camera.py +11 -0
- avrs/requests/demo.py +3 -7
- avrs/requests/{edit_environment.py → environment.py} +15 -3
- avrs/requests/fault_injection.py +186 -0
- avrs/requests/list_sim_objects.py +26 -0
- avrs/requests/request.py +4 -1
- avrs/requests/scenario_control.py +43 -0
- avrs/requests/toggle_hud.py +11 -0
- avrs/requests/vehicle_input.py +21 -0
- avrs/requests/vehicle_replay.py +235 -0
- avrs/simconfig.py +61 -0
- avrs/simconfig_util.py +70 -0
- autoverse_cli-0.4.1.dist-info/RECORD +0 -28
- avrs/requests/can.py +0 -131
- avrs/requests/input.py +0 -46
- {autoverse_cli-0.4.1.dist-info → autoverse_cli-0.6.0.dist-info}/LICENSE +0 -0
- {autoverse_cli-0.4.1.dist-info → autoverse_cli-0.6.0.dist-info}/entry_points.txt +0 -0
- {autoverse_cli-0.4.1.dist-info → autoverse_cli-0.6.0.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,11 @@
|
|
1
1
|
from avrs.requests.request import AvrsApiRequest
|
2
2
|
|
3
|
-
class
|
3
|
+
class AvrsEnvironmentRequests():
|
4
4
|
def __init__(self, parser, cfg):
|
5
|
-
psr = parser.add_parser('
|
5
|
+
psr = parser.add_parser('environment', help='Edits the environment')
|
6
6
|
sps = psr.add_subparsers(required= True, help='')
|
7
7
|
AvrsSetTimeOfDayRequest(sps, cfg)
|
8
|
+
AvrsGetEnvironmentMetaRequets(sps, cfg)
|
8
9
|
|
9
10
|
|
10
11
|
class AvrsSetTimeOfDayRequest(AvrsApiRequest):
|
@@ -18,4 +19,15 @@ class AvrsSetTimeOfDayRequest(AvrsApiRequest):
|
|
18
19
|
self.target_object_id = ''
|
19
20
|
return {
|
20
21
|
'TimeOfDay': args.tod
|
21
|
-
}
|
22
|
+
}
|
23
|
+
|
24
|
+
class AvrsGetEnvironmentMetaRequets(AvrsApiRequest):
|
25
|
+
def __init__(self, parser, cfg):
|
26
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'GetEnvironmentMeta', '')
|
27
|
+
psr = parser.add_parser('get-meta', help='get metadata about the currently loaded environment')
|
28
|
+
psr.set_defaults(func=self.send_request)
|
29
|
+
|
30
|
+
def get_request_body(self, args):
|
31
|
+
self.target_object_id = ''
|
32
|
+
return {
|
33
|
+
}
|
@@ -0,0 +1,186 @@
|
|
1
|
+
from avrs.requests.request import AvrsApiRequest
|
2
|
+
from argparse import RawDescriptionHelpFormatter
|
3
|
+
from argparse import RawTextHelpFormatter
|
4
|
+
|
5
|
+
class AvrsFaultInjectionRequests():
|
6
|
+
def __init__(self, parser, cfg):
|
7
|
+
psr = parser.add_parser('inject-fault', help='utilty to inject faults into components (sensors, actuators, etc)')
|
8
|
+
sps = psr.add_subparsers(required= True, help='sub-command inject-fault')
|
9
|
+
AvrsGnssFaultRequest(sps, cfg)
|
10
|
+
AvrsLidarFaultRequest(sps, cfg)
|
11
|
+
AvrsImuFaultRequest(sps, cfg)
|
12
|
+
AvrsCanFaultRequest(sps, cfg)
|
13
|
+
|
14
|
+
def add_base_injection_args(psr):
|
15
|
+
|
16
|
+
psr.add_argument(
|
17
|
+
'--target',
|
18
|
+
default='ego',
|
19
|
+
help='the simulated object to apply the fault to')
|
20
|
+
|
21
|
+
psr.add_argument(
|
22
|
+
'--duration',
|
23
|
+
type=float,
|
24
|
+
default=1.0,
|
25
|
+
help='how long to apply the fault (0.0 is infinite)')
|
26
|
+
|
27
|
+
psr.add_argument(
|
28
|
+
'--dropout',
|
29
|
+
action='store_true',
|
30
|
+
help='if specified, will apply a complete dropout fault')
|
31
|
+
|
32
|
+
psr.add_argument(
|
33
|
+
'--freeze',
|
34
|
+
action='store_true',
|
35
|
+
help='if specified, will freeze the data (values will not change)')
|
36
|
+
|
37
|
+
class AvrsGnssFaultRequest(AvrsApiRequest):
|
38
|
+
def __init__(self, parser, cfg):
|
39
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'FaultInjection', '')
|
40
|
+
|
41
|
+
psr = parser.add_parser(
|
42
|
+
'gnss',
|
43
|
+
help='inject a gnss fault',
|
44
|
+
formatter_class=RawTextHelpFormatter)
|
45
|
+
|
46
|
+
psr.add_argument(
|
47
|
+
'--horizontal-bias',
|
48
|
+
type=float,
|
49
|
+
default=0.0,
|
50
|
+
help='horizontal bias to apply to the sensor as a fault')
|
51
|
+
|
52
|
+
psr.add_argument(
|
53
|
+
'--vertical-bias',
|
54
|
+
type=float,
|
55
|
+
default=0.0,
|
56
|
+
help='vertical bias to apply to the sensor as a fault')
|
57
|
+
|
58
|
+
psr.add_argument(
|
59
|
+
'--horizontal-stdev',
|
60
|
+
type=float,
|
61
|
+
default=0.0,
|
62
|
+
help='horizontal standard deviation to apply to the sensor')
|
63
|
+
|
64
|
+
psr.add_argument(
|
65
|
+
'--vertical-stdev',
|
66
|
+
type=float,
|
67
|
+
default=0.0,
|
68
|
+
help='vertical standard deviation to apply to the sensor')
|
69
|
+
|
70
|
+
add_base_injection_args(psr)
|
71
|
+
psr.set_defaults(func=self.send_request)
|
72
|
+
|
73
|
+
def get_request_body(self, args):
|
74
|
+
self.target_object_id = args.target
|
75
|
+
self.verbose = args.verbose
|
76
|
+
return {
|
77
|
+
'faultType': 'GnssFault',
|
78
|
+
'duration': args.duration,
|
79
|
+
'bIsDropout': args.dropout,
|
80
|
+
'bIsFreeze': args.freeze,
|
81
|
+
'JsonBody': {
|
82
|
+
'verticalBias': args.vertical_bias,
|
83
|
+
'verticalStdev': args.vertical_stdev,
|
84
|
+
'horizontalBias': args.horizontal_bias,
|
85
|
+
'horizontalStdev': args.horizontal_stdev
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
class AvrsImuFaultRequest(AvrsApiRequest):
|
90
|
+
def __init__(self, parser, cfg):
|
91
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'FaultInjection', '')
|
92
|
+
|
93
|
+
psr = parser.add_parser(
|
94
|
+
'imu',
|
95
|
+
help='inject an imu fault',
|
96
|
+
formatter_class=RawTextHelpFormatter)
|
97
|
+
|
98
|
+
psr.add_argument(
|
99
|
+
'--bias',
|
100
|
+
type=float,
|
101
|
+
default=0.0,
|
102
|
+
help='horizontal bias to apply to the sensor as a fault')
|
103
|
+
|
104
|
+
psr.add_argument(
|
105
|
+
'--stdev',
|
106
|
+
type=float,
|
107
|
+
default=0.0,
|
108
|
+
help='horizontal standard deviation to apply to the sensor')
|
109
|
+
|
110
|
+
add_base_injection_args(psr)
|
111
|
+
psr.set_defaults(func=self.send_request)
|
112
|
+
|
113
|
+
def get_request_body(self, args):
|
114
|
+
self.target_object_id = args.target
|
115
|
+
self.verbose = args.verbose
|
116
|
+
return {
|
117
|
+
'faultType': 'ImuFault',
|
118
|
+
'duration': args.duration,
|
119
|
+
'bIsDropout': args.dropout,
|
120
|
+
'bIsFreeze': args.freeze,
|
121
|
+
'JsonBody': {
|
122
|
+
'bias': args.bias,
|
123
|
+
'stdev': args.stdev
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
class AvrsLidarFaultRequest(AvrsApiRequest):
|
128
|
+
def __init__(self, parser, cfg):
|
129
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'FaultInjection', '')
|
130
|
+
|
131
|
+
psr = parser.add_parser(
|
132
|
+
'lidar',
|
133
|
+
help='inject a lidar fault',
|
134
|
+
formatter_class=RawTextHelpFormatter)
|
135
|
+
|
136
|
+
psr.add_argument(
|
137
|
+
'--point-density-reduction',
|
138
|
+
type=float,
|
139
|
+
default=0.5,
|
140
|
+
help='the percent of point density reduction, where 1.0 drops all points')
|
141
|
+
|
142
|
+
add_base_injection_args(psr)
|
143
|
+
psr.set_defaults(func=self.send_request)
|
144
|
+
|
145
|
+
def get_request_body(self, args):
|
146
|
+
self.target_object_id = args.target
|
147
|
+
self.verbose = args.verbose
|
148
|
+
return {
|
149
|
+
'faultType': 'LidarFault',
|
150
|
+
'duration': args.duration,
|
151
|
+
'bIsDropout': args.dropout,
|
152
|
+
'bIsFreeze': args.freeze,
|
153
|
+
'JsonBody': {
|
154
|
+
'pointDensityReduction': args.point_density_reduction
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
class AvrsCanFaultRequest(AvrsApiRequest):
|
159
|
+
def __init__(self, parser, cfg):
|
160
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'FaultInjection', '')
|
161
|
+
|
162
|
+
psr = parser.add_parser(
|
163
|
+
'can',
|
164
|
+
help='inject a can',
|
165
|
+
formatter_class=RawTextHelpFormatter)
|
166
|
+
|
167
|
+
psr.add_argument(
|
168
|
+
'can_type',
|
169
|
+
choices = ['bsu', 'badenia', 'kistler', 'all'],
|
170
|
+
help='what type of the can interface you wish to apply the fault to')
|
171
|
+
|
172
|
+
add_base_injection_args(psr)
|
173
|
+
psr.set_defaults(func=self.send_request)
|
174
|
+
|
175
|
+
def get_request_body(self, args):
|
176
|
+
self.target_object_id = args.target
|
177
|
+
self.verbose = args.verbose
|
178
|
+
return {
|
179
|
+
'faultType': 'CanFault',
|
180
|
+
'duration': args.duration,
|
181
|
+
'bIsDropout': True,
|
182
|
+
'bIsFreeze': args.freeze,
|
183
|
+
'JsonBody': {
|
184
|
+
'canType': args.can_type
|
185
|
+
}
|
186
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
from avrs.requests.request import AvrsApiRequest
|
2
|
+
|
3
|
+
class AvrsListSimObjectsRequest(AvrsApiRequest):
|
4
|
+
def __init__(self, parser, cfg):
|
5
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ListSimObjects', 0)
|
6
|
+
psr = parser.add_parser('list-sim-objects', help='list all the sim objects that currently exist in the simulator')
|
7
|
+
psr.add_argument(
|
8
|
+
'-v',
|
9
|
+
action='store_true',
|
10
|
+
help='request verbose output')
|
11
|
+
psr.add_argument(
|
12
|
+
'--components',
|
13
|
+
action='store_true',
|
14
|
+
help='also print information about the object components')
|
15
|
+
psr.add_argument(
|
16
|
+
'--isolate',
|
17
|
+
default='',
|
18
|
+
help='indicate a specific object of interest')
|
19
|
+
psr.set_defaults(func=self.send_request)
|
20
|
+
|
21
|
+
def get_request_body(self, args):
|
22
|
+
return {
|
23
|
+
"bVerbose": args.v,
|
24
|
+
'bListComponents': args.components,
|
25
|
+
'isolate': args.isolate
|
26
|
+
}
|
avrs/requests/request.py
CHANGED
@@ -11,12 +11,15 @@ class AvrsApiRequest:
|
|
11
11
|
def __init__(self, parser, cfg, request_type, target_id):
|
12
12
|
self.target_object_id = target_id
|
13
13
|
self.request_type = request_type
|
14
|
+
self.verbose = False
|
14
15
|
|
15
16
|
def get_request(self, args):
|
17
|
+
body = self.get_request_body(args)
|
16
18
|
return {
|
17
19
|
'TargetObjectId': self.target_object_id,
|
18
20
|
'RequestType': self.request_type,
|
19
|
-
'
|
21
|
+
'bVerboseResponse': self.verbose,
|
22
|
+
'RequestBody': body
|
20
23
|
}
|
21
24
|
|
22
25
|
def get_request_body(self, args):
|
@@ -0,0 +1,43 @@
|
|
1
|
+
from avrs.requests.request import AvrsApiRequest
|
2
|
+
from argparse import RawDescriptionHelpFormatter
|
3
|
+
from argparse import RawTextHelpFormatter
|
4
|
+
|
5
|
+
class AvrsScenarioRequests():
|
6
|
+
def __init__(self, parser, cfg):
|
7
|
+
psr = parser.add_parser('scenario', help='commands related to scenarios in the simulator')
|
8
|
+
sps = psr.add_subparsers(required= True, help='sub-command scenario')
|
9
|
+
StartScenarioRequest(sps, cfg)
|
10
|
+
StopScenarioRequest(sps, cfg)
|
11
|
+
|
12
|
+
class StartScenarioRequest(AvrsApiRequest):
|
13
|
+
def __init__(self, parser, cfg):
|
14
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ScenarioControl', '')
|
15
|
+
psr = parser.add_parser(
|
16
|
+
'start', help='start a scenario', formatter_class=RawTextHelpFormatter)
|
17
|
+
|
18
|
+
psr.add_argument(
|
19
|
+
'scenario_name',
|
20
|
+
default='',
|
21
|
+
help='the name of the scenario to start')
|
22
|
+
|
23
|
+
psr.set_defaults(func=self.send_request)
|
24
|
+
|
25
|
+
|
26
|
+
def get_request_body(self, args):
|
27
|
+
return {
|
28
|
+
'scenarioName': args.scenario_name,
|
29
|
+
'action': 'start'
|
30
|
+
}
|
31
|
+
|
32
|
+
class StopScenarioRequest(AvrsApiRequest):
|
33
|
+
def __init__(self, parser, cfg):
|
34
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ScenarioControl', '')
|
35
|
+
psr = parser.add_parser(
|
36
|
+
'stop', help='stop any active scenarios', formatter_class=RawTextHelpFormatter)
|
37
|
+
|
38
|
+
psr.set_defaults(func=self.send_request)
|
39
|
+
|
40
|
+
def get_request_body(self, args):
|
41
|
+
return {
|
42
|
+
'action': 'stop'
|
43
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
from avrs.requests.request import AvrsApiRequest
|
2
|
+
|
3
|
+
class AvrsToggleHudRequest(AvrsApiRequest):
|
4
|
+
def __init__(self, parser, cfg):
|
5
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ToggleHud', 'Ego')
|
6
|
+
psr = parser.add_parser('toggle-hud', help='toggles the HUD on or off')
|
7
|
+
psr.set_defaults(func=self.send_request)
|
8
|
+
|
9
|
+
def get_request_body(self, args):
|
10
|
+
return {
|
11
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from avrs.requests.request import AvrsApiRequest
|
2
|
+
|
3
|
+
class AvrsConfigureVehicleInputRequest(AvrsApiRequest):
|
4
|
+
def __init__(self, parser, cfg):
|
5
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ConfigureVehicleInput', 'Ego')
|
6
|
+
psr = parser.add_parser(
|
7
|
+
'configure-vehicle-input',
|
8
|
+
help='Allows different input modes to be set for a vehicle')
|
9
|
+
|
10
|
+
psr.add_argument(
|
11
|
+
'input_mode',
|
12
|
+
default='None',
|
13
|
+
choices=['None', 'Keyboard', 'WheelAndPedals', 'CAN'],
|
14
|
+
help='the type of input mode to set')
|
15
|
+
|
16
|
+
psr.set_defaults(func=self.send_request)
|
17
|
+
|
18
|
+
def get_request_body(self, args):
|
19
|
+
return {
|
20
|
+
"InputMode": args.input_mode
|
21
|
+
}
|
@@ -0,0 +1,235 @@
|
|
1
|
+
import random
|
2
|
+
from avrs.requests.request import AvrsApiRequest
|
3
|
+
from argparse import RawDescriptionHelpFormatter
|
4
|
+
from argparse import RawTextHelpFormatter
|
5
|
+
|
6
|
+
class AvrsVehicleReplayRequests():
|
7
|
+
def __init__(self, parser, cfg):
|
8
|
+
psr = parser.add_parser('vehicle-replay', help='utilty for recording and replaying vehicle motion')
|
9
|
+
sps = psr.add_subparsers(required= True, help='sub-command vehicle-replay')
|
10
|
+
SpawnReplayVehicle(sps, cfg)
|
11
|
+
StartVehicleReplayRecording(sps, cfg)
|
12
|
+
StopVehicleReplayRecording(sps, cfg)
|
13
|
+
DespawnReplayVehicle(sps, cfg)
|
14
|
+
|
15
|
+
class SpawnReplayVehicle(AvrsApiRequest):
|
16
|
+
def __init__(self, parser, cfg):
|
17
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'SpawnObject', '')
|
18
|
+
psr = parser.add_parser(
|
19
|
+
'spawn', help='spawn a vehicle intended to replay motion', formatter_class=RawTextHelpFormatter)
|
20
|
+
|
21
|
+
psr.add_argument(
|
22
|
+
'replay_file',
|
23
|
+
default='',
|
24
|
+
help='the replay file to use ("random" for a random profile)')
|
25
|
+
|
26
|
+
psr.add_argument(
|
27
|
+
'--name',
|
28
|
+
default='',
|
29
|
+
help='name of the replay vehicle to spawn')
|
30
|
+
|
31
|
+
psr.add_argument(
|
32
|
+
'--vehicle-type',
|
33
|
+
default='EAV24',
|
34
|
+
help='what type of vehicle to spawn for replay')
|
35
|
+
|
36
|
+
# psr.add_argument(
|
37
|
+
# '--position',
|
38
|
+
# choices=('relative', 'absolute'),
|
39
|
+
# default='absolute',
|
40
|
+
# help=NPC_SPAWN_POSITION_HELP)
|
41
|
+
|
42
|
+
|
43
|
+
# psr.add_argument(
|
44
|
+
# '--velocity-type',
|
45
|
+
# default='constant',
|
46
|
+
# help='the path the NPC follows is a constant velocity or speed')
|
47
|
+
|
48
|
+
# psr.add_argument(
|
49
|
+
# '--speed',
|
50
|
+
# type=float,
|
51
|
+
# default=20,
|
52
|
+
# help='the speed of the npc is m/s')
|
53
|
+
|
54
|
+
psr.add_argument(
|
55
|
+
'--rate',
|
56
|
+
type=float,
|
57
|
+
default=1.0,
|
58
|
+
help='the playback rate, 1.0 is normal')
|
59
|
+
|
60
|
+
psr.add_argument(
|
61
|
+
'--random-start',
|
62
|
+
action='store_true',
|
63
|
+
help='if set, will start at a random point in the replay')
|
64
|
+
|
65
|
+
psr.add_argument(
|
66
|
+
'--relative-dist',
|
67
|
+
type=float,
|
68
|
+
default=40.0,
|
69
|
+
help='the distance relative to ego to start the playback (-1 to start at playback start)')
|
70
|
+
|
71
|
+
psr.add_argument(
|
72
|
+
'--auto-start',
|
73
|
+
action='store_true',
|
74
|
+
help='if set, the npc will begin moving immediately')
|
75
|
+
|
76
|
+
psr.add_argument(
|
77
|
+
'--count',
|
78
|
+
type=int,
|
79
|
+
default=1,
|
80
|
+
help='the number of npcs to spawn (only works with automatic name)')
|
81
|
+
|
82
|
+
# psr.add_argument(
|
83
|
+
# '--enable-sensors',
|
84
|
+
# type=bool,
|
85
|
+
# default=False,
|
86
|
+
# help='whether to enable sensors on the replay vehicle')
|
87
|
+
|
88
|
+
psr.add_argument(
|
89
|
+
'--with-view-cameras',
|
90
|
+
action='store_true',
|
91
|
+
help='if set, will attach viewing cameras to the replay vehicle')
|
92
|
+
|
93
|
+
psr.set_defaults(func=self.send_request)
|
94
|
+
|
95
|
+
def send_request(self, args):
|
96
|
+
for i in range(args.count):
|
97
|
+
self.send_http_request(args)
|
98
|
+
|
99
|
+
def get_request_body(self, args):
|
100
|
+
|
101
|
+
replay_ipd = {
|
102
|
+
'bEnableRecording': False,
|
103
|
+
'bRecordOnPhysicsTick': False,
|
104
|
+
'recordMotionMinSpeedThreshold': 0.01,
|
105
|
+
'bEnableReplay': True,
|
106
|
+
'bApplyInitialConfig': True,
|
107
|
+
'initialConfig': {
|
108
|
+
'playRate': args.rate,
|
109
|
+
'profile': args.replay_file,
|
110
|
+
'bUseRandomProfile': args.replay_file == 'random',
|
111
|
+
'replayAction': 'start' if args.auto_start else '',
|
112
|
+
'bStartReplayAtRandomTime': args.random_start,
|
113
|
+
'relativeDistance': args.relative_dist
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
eav_init_pld = {
|
118
|
+
"bEnableBsuCan": False,
|
119
|
+
"bEnableKistlerCan": False,
|
120
|
+
"bEnableBadeniaCan": False,
|
121
|
+
"bHudEnabled": False,
|
122
|
+
"bLidarEnabled": False,
|
123
|
+
"bCameraEnabled": False,
|
124
|
+
"bPublishInputs": False,
|
125
|
+
"bPublishGroundTruth": False
|
126
|
+
}
|
127
|
+
|
128
|
+
plds = [
|
129
|
+
{
|
130
|
+
'TypeName': 'WheeledVehicleReplayIpd',
|
131
|
+
'Body': replay_ipd
|
132
|
+
},
|
133
|
+
{
|
134
|
+
'TypeName': 'Eav24Initializer',
|
135
|
+
'Body': eav_init_pld
|
136
|
+
}
|
137
|
+
]
|
138
|
+
|
139
|
+
if args.with_view_cameras:
|
140
|
+
plds.append(
|
141
|
+
{
|
142
|
+
'TypeName': 'InitializerTemplates',
|
143
|
+
'Body': {
|
144
|
+
'Templates': [
|
145
|
+
{
|
146
|
+
'PayloadType': 'SimViewTargetIpd',
|
147
|
+
'PayloadSpec': 'DefaultCarCams'
|
148
|
+
}
|
149
|
+
]
|
150
|
+
}
|
151
|
+
})
|
152
|
+
|
153
|
+
# Create time based name if not specified
|
154
|
+
name = args.name
|
155
|
+
if name == '':
|
156
|
+
name = 'npc_{}'.format(random.randint(0, 100000))
|
157
|
+
|
158
|
+
return {
|
159
|
+
'Name': name,
|
160
|
+
'Type': args.vehicle_type,
|
161
|
+
'Location': {},
|
162
|
+
'Rotation': {},
|
163
|
+
'Payloads': plds
|
164
|
+
}
|
165
|
+
|
166
|
+
class StartVehicleReplayRecording(AvrsApiRequest):
|
167
|
+
def __init__(self, parser, cfg):
|
168
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ConfigureVehicleReplay', 'Ego')
|
169
|
+
psr = parser.add_parser(
|
170
|
+
'start-recording', help='begin recording vehicle motion', formatter_class=RawTextHelpFormatter)
|
171
|
+
|
172
|
+
psr.add_argument(
|
173
|
+
'out_file',
|
174
|
+
help='the file name to use for the saved recording')
|
175
|
+
|
176
|
+
psr.add_argument(
|
177
|
+
'--rate-hz',
|
178
|
+
type=float,
|
179
|
+
default=100.0,
|
180
|
+
help='the rate to record vehicle motion. high rates will produce large files')
|
181
|
+
|
182
|
+
psr.set_defaults(func=self.send_request)
|
183
|
+
|
184
|
+
|
185
|
+
def get_request_body(self, args):
|
186
|
+
return {
|
187
|
+
'PlayRate': -1.0,
|
188
|
+
'profile': '',
|
189
|
+
'replayAction': '',
|
190
|
+
#'teleportLocation': '',
|
191
|
+
'recordAction': 'start',
|
192
|
+
'recordFileName': args.out_file,
|
193
|
+
'recordRateHz': args.rate_hz
|
194
|
+
}
|
195
|
+
|
196
|
+
class StopVehicleReplayRecording(AvrsApiRequest):
|
197
|
+
def __init__(self, parser, cfg):
|
198
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'ConfigureVehicleReplay', 'Ego')
|
199
|
+
psr = parser.add_parser(
|
200
|
+
'stop-recording', help='begin recording vehicle motion', formatter_class=RawTextHelpFormatter)
|
201
|
+
psr.set_defaults(func=self.send_request)
|
202
|
+
|
203
|
+
|
204
|
+
def get_request_body(self, args):
|
205
|
+
return {
|
206
|
+
'recordAction': 'stop',
|
207
|
+
}
|
208
|
+
|
209
|
+
class DespawnReplayVehicle(AvrsApiRequest):
|
210
|
+
def __init__(self, parser, cfg):
|
211
|
+
AvrsApiRequest.__init__(self, parser, cfg, 'DespawnObject', 'Ego')
|
212
|
+
psr = parser.add_parser(
|
213
|
+
'despawn', help='despawn a replay vehicle or all replay vehicles', formatter_class=RawTextHelpFormatter)
|
214
|
+
|
215
|
+
psr.add_argument(
|
216
|
+
'--name',
|
217
|
+
default='',
|
218
|
+
help='name of the replay vehicle to despawn')
|
219
|
+
|
220
|
+
psr.add_argument(
|
221
|
+
'--all',
|
222
|
+
action='store_true',
|
223
|
+
help='if set, will despawn all replay vehicles')
|
224
|
+
|
225
|
+
psr.set_defaults(func=self.send_request)
|
226
|
+
|
227
|
+
|
228
|
+
def get_request_body(self, args):
|
229
|
+
self.target_object_id = args.name
|
230
|
+
tags = ["Npc"] if args.all else []
|
231
|
+
|
232
|
+
return {
|
233
|
+
'tags': tags,
|
234
|
+
'bMatchAnyTag': True
|
235
|
+
}
|
avrs/simconfig.py
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
import os
|
2
|
+
import stat
|
3
|
+
import json
|
4
|
+
import http.client
|
5
|
+
from avrs.cfg import *
|
6
|
+
from avrs.launcher_util import *
|
7
|
+
from avrs.simconfig_util import *
|
8
|
+
|
9
|
+
class AvrsSimConfig:
|
10
|
+
def __init__(self, parent_parser, cfg):
|
11
|
+
self.cfg = cfg
|
12
|
+
sim_config_parser = parent_parser.add_parser(
|
13
|
+
'sim-config',
|
14
|
+
help='utilities for easily configuring the simulator\n\n')
|
15
|
+
|
16
|
+
sps = sim_config_parser.add_subparsers(required=True, help='sim-config options')
|
17
|
+
|
18
|
+
apply_preset_parser = sps.add_parser(
|
19
|
+
'apply-preset',
|
20
|
+
help='apply a preset configuration for a certain use-case')
|
21
|
+
apply_preset_parser.add_argument(
|
22
|
+
'preset_name',
|
23
|
+
choices=['default', 'lightweight', 'a2rl'],
|
24
|
+
help='the name of the preset to apply')
|
25
|
+
apply_preset_parser.add_argument(
|
26
|
+
'--sim-path',
|
27
|
+
default='',
|
28
|
+
help='''
|
29
|
+
the path to the simulator installation having the intended config to modify, or the
|
30
|
+
index of a known installation. if there is only one known installation, it will be used as
|
31
|
+
the target
|
32
|
+
''')
|
33
|
+
apply_preset_parser.set_defaults(func=self.apply_preset)
|
34
|
+
|
35
|
+
|
36
|
+
def apply_preset(self, args):
|
37
|
+
sim_path = args.sim_path
|
38
|
+
if sim_path == '':
|
39
|
+
if 'installs' in self.cfg and len(self.cfg['installs']) > 0:
|
40
|
+
if len(self.cfg['installs']) > 1:
|
41
|
+
print('multiple known installs. specify path or index')
|
42
|
+
for i in range(len(self.cfg['installs'])):
|
43
|
+
print('({}) {}'.format(i, self.cfg['installs'][i]))
|
44
|
+
return
|
45
|
+
else:
|
46
|
+
sim_path = self.cfg['installs'][0]
|
47
|
+
else:
|
48
|
+
print('sim_path not specified and no known existing installations')
|
49
|
+
return
|
50
|
+
try:
|
51
|
+
sim_path_index = int(sim_path)
|
52
|
+
if 'installs' in self.cfg and len(self.cfg['installs']) > sim_path_index:
|
53
|
+
sim_path = self.cfg['installs'][sim_path_index]
|
54
|
+
except Exception as e:
|
55
|
+
pass
|
56
|
+
if not is_installed_sim(sim_path):
|
57
|
+
print('{} is not a valid sim installation'.format(sim_path))
|
58
|
+
return
|
59
|
+
|
60
|
+
print('applying preset {} to sim install at {}'.format(args.preset_name, sim_path))
|
61
|
+
apply_simconfig_preset(get_sim_saved_dir(sim_path), args.preset_name)
|