1"""
2Argument parsers for arguments used by CARLA examples.
3
4.. deprecated:: _
5 In favor of Hydra_.
6"""
7import argparse
8from functools import wraps
9from typing import Optional
10
11# maybe later: add some more flexible way to construct a parser.
12# i.e. combine certain subparsers, e.g. one for port& host another one for settings
13
14
[docs]
15def subparser(func) -> argparse.ArgumentParser:
16 """This decorator allows to join multiple subparsers in a flexible way."""
17
18 @wraps(func)
19 def wrapper(parser: Optional[argparse.ArgumentParser] = None, *args, **kwargs) -> argparse.ArgumentParser:
20 if parser is None: # create a parser if none is given
21 parser = argparse.ArgumentParser()
22 # else: TODO: are subparsers useful?
23 func(parser, *args, **kwargs)
24 return parser # return the parser object again
25
26 # allows to circumvent calling the function.
27 # i.e. parser_function.parse_args() instead of parser_function().parse_args()
28 wrapper.parse_args = lambda: wrapper(parser=None).parse_args() # type: ignore[attr-defined]
29 # allows to adjust parsers by adding another parser or by adding a parser function
30 wrapper.add = lambda parser: wrapper(parser) if isinstance(parser, argparse.ArgumentParser) else wrapper(parser()) # type: ignore[attr-defined]
31 return wrapper
32
33
[docs]
34@subparser
35def client_settings(parser: argparse.ArgumentParser):
36 parser.add_argument(
37 '--host',
38 metavar='H',
39 default='127.0.0.1',
40 help='IP of the host server (default: 127.0.0.1)')
41 parser.add_argument(
42 '-p', '--port',
43 metavar='P',
44 default=2000,
45 type=int,
46 help='TCP port to listen to (default: 2000)')
47 parser.add_argument('-m', '--map', help='Map', default="Town04_Opt", type=str)
48 parser.add_argument('--fps', help='Frames per second.', default=20, type=int)
49
50
[docs]
51@subparser
52def interactive_mode(parser: argparse.ArgumentParser):
53 parser.add_argument('-I', '--interactive', action='store_true', help='Interactive mode', default=False)
54
55
[docs]
56@subparser
57def interactive_control_example(parser: argparse.ArgumentParser):
58 parser.add_argument(
59 '--rolename',
60 metavar='NAME',
61 default='hero',
62 help='actor role name (default: "hero")')
63 parser.add_argument(
64 '--gamma',
65 default=2.2,
66 type=float,
67 help='Gamma correction of the camera (default: 2.2)')
68 parser.add_argument(
69 '--externalActor',
70 action='store_true',
71 help='attaches to externally created actor by role name')
72
73
[docs]
74@subparser
75def automatic_control_example(argparser: argparse.ArgumentParser):
76 argparser.description = 'CARLA Lunatic Agent Example'
77 argparser.add_argument(
78 '-v', '--verbose',
79 action='store_true',
80 dest='debug',
81 help='Print debug information')
82 argparser.add_argument(
83 '--res',
84 metavar='WIDTHxHEIGHT',
85 default='1280x720',
86 help='Window resolution (default: 1280x720)')
87 argparser.add_argument(
88 '--sync',
89 action='store_true',
90 help='Synchronous mode execution')
91 argparser.add_argument(
92 '--filter',
93 metavar='PATTERN',
94 default='vehicle.*',
95 help='Actor filter (default: "vehicle.*")')
96 argparser.add_argument(
97 '--generation',
98 metavar='G',
99 default='2',
100 help='restrict to certain actor generation (values: "1","2","All" - default: "2")')
101 argparser.add_argument(
102 '-l', '--loop',
103 action='store_true',
104 dest='loop',
105 help='Sets a new random destination upon reaching the previous one (default: False)')
106
107 # TODO: separate into subparsers
108 argparser.add_argument(
109 "-a", "--agent", type=str,
110 choices=["Behavior", "Basic", "Constant"],
111 help="select which agent to run",
112 default="Behavior")
113 argparser.add_argument(
114 '-b', '--behavior', type=str,
115 # choices=["cautious", "normal", "aggressive"],
116 help='Choose one of the possible agent behaviors (default: normal) ',
117 default='normal')
118
119 argparser.add_argument(
120 '-s', '--seed',
121 help='Set seed for repeating executions (default: None)',
122 default=None,
123 type=int)
124 argparser.add_argument(
125 '-I', '--interactive',
126 help='Enter interactive mode after initialization',
127 action="store_true")
128 argparser.add_argument(
129 '-ap', '--autopilot',
130 action='store_true',
131 help='enable autopilot')
132
133
[docs]
134def main_parser():
135 parser = argparse.ArgumentParser()
136 client_settings.add(parser) # type: ignore[attr-defined]
137 automatic_control_example.add(parser) # type: ignore[attr-defined]
138 interactive_control_example.add(parser) # type: ignore[attr-defined]
139 return parser