Added detailed documentation of RSSSensor

This commit is contained in:
Bernd Gassmann 2020-04-01 11:51:33 +02:00
parent 5743930238
commit 938c4516ae
7 changed files with 429 additions and 120 deletions

View File

@ -1132,6 +1132,70 @@ Parses the axis' orientations to string.
---
## carla.RssEgoDynamicsOnRoute<a name="carla.RssEgoDynamicsOnRoute"></a>
Data contained inside a [carla.RssResponse.ego_dynamics_on_route](#carla.RssResponse.ego_dynamics_on_route).
<h3>Instance Variables</h3>
- <a name="carla.RssEgoDynamicsOnRoute.ego_speed"></a>**<font color="#f8805a">ego_speed</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>_)
The ego speed.
- <a name="carla.RssEgoDynamicsOnRoute.min_stopping_distance"></a>**<font color="#f8805a">min_stopping_distance</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Distance.html">libad_physics_python.Distance</a>_)
The current minimum stopping distance.
- <a name="carla.RssEgoDynamicsOnRoute.ego_center"></a>**<font color="#f8805a">ego_center</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/structad_1_1map_1_1point_1_1ENUPoint.html">libad_map_access_python.ENUPoint</a>_)
The considered enu position of the ego vehicle.
- <a name="carla.RssEgoDynamicsOnRoute.ego_heading"></a>**<font color="#f8805a">ego_heading</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>_)
The considered heading of the ego vehicle.
- <a name="carla.RssEgoDynamicsOnRoute.ego_center_within_route"></a>**<font color="#f8805a">ego_center_within_route</font>** (_bool_)
Indicating if the ego center is within route.
- <a name="carla.RssEgoDynamicsOnRoute.crossing_border"></a>**<font color="#f8805a">crossing_border</font>** (_bool_)
Indicating if the vehicle is already crossing one of the lane borders.
- <a name="carla.RssEgoDynamicsOnRoute.route_heading"></a>**<font color="#f8805a">route_heading</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>_)
The considered heading of the route.
- <a name="carla.RssEgoDynamicsOnRoute.route_nominal_center"></a>**<font color="#f8805a">route_nominal_center</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/structad_1_1map_1_1point_1_1ENUPoint.html">libad_map_access_python.ENUPoint</a>_)
The considered nominal center of the current route.
- <a name="carla.RssEgoDynamicsOnRoute.heading_diff"></a>**<font color="#f8805a">heading_diff</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>_)
The considered heading diff towards the route.
- <a name="carla.RssEgoDynamicsOnRoute.route_speed_lat"></a>**<font color="#f8805a">route_speed_lat</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>_)
The ego speed component lat in respect to the route.
- <a name="carla.RssEgoDynamicsOnRoute.route_speed_lon"></a>**<font color="#f8805a">route_speed_lon</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>_)
The ego speed component lon in respect to the route.
- <a name="carla.RssEgoDynamicsOnRoute.route_accel_lat"></a>**<font color="#f8805a">route_accel_lat</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>_)
The ego acceleration component lat in respect to the route.
- <a name="carla.RssEgoDynamicsOnRoute.route_accel_lon"></a>**<font color="#f8805a">route_accel_lon</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>_)
The ego acceleration component lon in respect to the route.
- <a name="carla.RssEgoDynamicsOnRoute.avg_route_accel_lat"></a>**<font color="#f8805a">avg_route_accel_lat</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>_)
The ego acceleration component lat in respect to the route smoothened by an average filter.
- <a name="carla.RssEgoDynamicsOnRoute.avg_route_accel_lon"></a>**<font color="#f8805a">avg_route_accel_lon</font>** (_<a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>_)
The ego acceleration component lon in respect to the route smoothened by an average filter.
<h3>Methods</h3>
<h3>Dunder methods</h3>
- <a name="carla.RssEgoDynamicsOnRoute.__str__"></a>**<font color="#7fb800">\__str__</font>**(<font color="#00a6ed">**self**</font>)
---
## carla.RssResponse<a name="carla.RssResponse"></a>
Data contained inside a [carla.RssResponse](#carla.RssResponse).
<h3>Instance Variables</h3>
- <a name="carla.RssResponse.response_valid"></a>**<font color="#f8805a">response_valid</font>** (_bool_)
Is the current response data valid.
- <a name="carla.RssResponse.proper_response"></a>**<font color="#f8805a">proper_response</font>** (_<a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1state_1_1ProperResponse.html">libad_rss_python.ProperResponse</a>_)
The proper response of the RSS calculation.
- <a name="carla.RssResponse.acceleration_restriction"></a>**<font color="#f8805a">acceleration_restriction</font>** (_<a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1world_1_1AccelerationRestriction.html">libad_rss_python.AccelerationRestriction</a>_)
The acceleration restrictions of the RSS calculation.
- <a name="carla.RssResponse.rss_state_snapshot"></a>**<font color="#f8805a">rss_state_snapshot</font>** (_<a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1state_1_1RssStateSnapshot.html">libad_rss_python.RssStateSnapshot</a>_)
The detailed RSS states at the current point in time.
- <a name="carla.RssResponse.ego_dynamics_on_route"></a>**<font color="#f8805a">ego_dynamics_on_route</font>** (_[carla.RssEgoDynamicsOnRoute](#carla.RssEgoDynamicsOnRoute)_)
The current ego vehicle dynamics in respect to the current route.
<h3>Methods</h3>
<h3>Dunder methods</h3>
- <a name="carla.RssResponse.__str__"></a>**<font color="#7fb800">\__str__</font>**(<font color="#00a6ed">**self**</font>)
---
## carla.Sensor<a name="carla.Sensor"></a>
<div style="padding-left:30px;margin-top:-20px"><small><b>Inherited from _[carla.Actor](#carla.Actor)_</b></small></div></p><p>Sensors compound a specific family of actors quite diverse and unique. They are normally spawned as attachment/sons of a vehicle (take a look at [carla.World](#carla.World) to learn about actor spawning). Sensors are thoroughly designed to retrieve different types of data that they are listening to. The data they receive is shaped as different subclasses inherited from [carla.SensorData](#carla.SensorData) (depending on the sensor).
@ -1144,6 +1208,7 @@ Parses the axis' orientations to string.
- [Lidar raycast](ref_sensors.md#lidar-raycast-sensor).
- [RGB camera](ref_sensors.md#rgb-camera).
- [Semantic Segmentation camera](ref_sensors.md#semantic-segmentation-camera).
- [RSS sensor](ref_sensors.md#rss-sensor).
<b>Only receive data when triggered:</b>
- [Collision detector](ref_sensors.md#collision-detector).
- [Lane invasion detector](ref_sensors.md#lane-invasion-detector).
@ -1176,6 +1241,7 @@ Base class for all the objects containing data generated by a [carla.Sensor](#ca
- Lidar raycast: [carla.LidarMeasurement](#carla.LidarMeasurement).
- Obstacle detector: [carla.ObstacleDetectionEvent](#carla.ObstacleDetectionEvent).
- Radar detector: [carla.RadarMeasurement](#carla.RadarMeasurement).
- RSS response: [carla.RssResponse](#carla.RssResponse).
<h3>Instance Variables</h3>
- <a name="carla.SensorData.frame"></a>**<font color="#f8805a">frame</font>** (_int_)

View File

@ -10,6 +10,7 @@
* [__Radar sensor__](#radar-sensor)
* [__RGB camera__](#rgb-camera)
* [__Semantic segmentation camera__](#semantic-segmentation-camera)
* [__RSS sensor__](#rss-sensor)
---
@ -1267,3 +1268,118 @@ The following tags are currently available:
<br>
---
## RSS sensor
* __Blueprint:__ sensor.other.rss
* __Output:__ [carla.RssResponse](python_api.md#carla.RssResponse) per step (unless `sensor_tick` says otherwise).
This sensor is disabled by default and has to be explicitly enalbed and built. Details on additional requirements and the scope of the sensor is described [here](rss_lib_integration.md).
The RSS sensor calculates the RSS state of a vehicle and reports the current RSS Response. The output can be used in conjunction with a [RssRestrictor](rss_lib_integration.md#RssRestrictor) to adapt
a _VehicleControl_ command before sending to a vehicle (see the _PythonAPI/examples/manual_control_rss.py_).
!!! Important
This sensor works fully on the client-side.
#### Configuration attributes
!!! Important
The change of attributes only has an effect AFTER the sensor.listen() has been called since no actual server side blueprint is available.
<table class ="defTable">
<thead>
<th>Configuration attribute</th>
<th>Type</th>
<th>Default</th>
<th>Description</th>
</thead>
<tbody>
<td>
<code>ego_vehicle_dynamics</code> </td>
<td>libad_rss_python.RssDynamics</td>
<td>see <a href="https://intel.github.io/ad-rss-lib/ad_rss/Appendix-ParameterDiscussion">RSS Parameter discussion</a></td>
<td>Get/set the RSS parameters to be applied for the ego vehicle </td>
<tr>
<td>
<code>other_vehicle_dynamics</code> </td>
<td>libad_rss_python.RssDynamics</td>
<td>see <a href="https://intel.github.io/ad-rss-lib/ad_rss/Appendix-ParameterDiscussion">RSS Parameter discussion</a></td>
<td>Get/set the RSS parameters to be applied for the other vehicles</td>
<tr>
<td><code>road_boundaries_mode</code></td>
<td>carla.RoadBoundariesMode</td>
<td>carla.RoadBoundariesMode.On</td>
<td>Switch the <a href="https://intel.github.io/ad-rss-lib/ad_rss_map_integration/HandleRoadBoundaries">stay on road feature</a> <i>On</i> and <i>Off</i></td>
<tr>
<td><code>visualization_mode</code></td>
<td>carla.VisualizationMode</td>
<td>carla.VisualizationMode.All</td>
<td>The RSS Sensor makes use of the <code>DebugHelper</code> to draw RSS visulation on server side. Possible values to set are: <i>Off</i>, <i>RouteOnly</i>,
<i>VehicleStateOnly</i>, <i>VehicleStateAndRoute</i> and <i>All</i>. Because debug drawing takes some time, some RSS responses will
be delayed. Therefore, best is to disable the visualization if performing automated RSS evaluations.
</td>
</table>
<br>
#### Routing functionality
The RSS calcuations always are based on a route of the ego vehicle throught the road network.
Therefore, the sensor provides the possibility to control the considered route from outside by providing some key points on the way.
These points are best selected after the intersections to force the route to take the desired turn.
If no routing targets are defined, a random route is selected automatically.
<table class ="defTable">
<thead>
<th>Routing functions</th>
<th>Type</th>
<th>Description</th>
</thead>
<tbody>
<td><code>routing_targets</code></td>
<td>vector&lt;<a href="../python_api#carlatransform">carla.Transform</a>&gt; </td>
<td>Get the current list of routing targets used for route.</td>
<tr>
<td><code>append_routing_target</code></td>
<td><a href="../python_api#carlatransform">carla.Transform</a></td>
<td>Append an additional position to the current routing targets.</td>
<tr>
<td><code>reset_routing_targets</code></td>
<td>(void)</td>
<td>Reset the current list of routing targets.</td>
<tr>
<td><code>drop_route</code></td>
<td>(void)</td>
<td>Drop the current selected route.</td>
</table>
<br>
#### RSS Restrictor functionality
The carla.RssRestrictor object can be instanciated to caluculate restrictions based on the RSS acceleration restrictions calculated by the RSS sensor.
Therefore, the <code>restrict_vehicle_control</code> function has to be called returning the adapted <a href="../python_api#carlavehiclecontrol">carla.VehicleControl</a>
data with the following input parameters:
<table class ="defTable">
<thead>
<th>Parameter Name</th>
<th>Parameter Type</th>
<th>Description</th>
</thead>
<tbody>
<td><code>vehicle_control</code></td>
<td><a href="../python_api#carlavehiclecontrol">carla.VehicleControl</a></td>
<td>The current input vehicle control data to be restricted.</td>
<tr>
<td><code>restriction</code></td>
<td><a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1world_1_1AccelerationRestriction.html">libad_rss_python.AccelerationRestriction</a></td>
<td>Usually the RSS sensor output <code>libad_rss_python.RssResponse.acceleration_restriction</code> is passed in as a parameter.</td>
<tr>
<td><code>ego_dynamics_on_route</code></td>
<td>carla.RssEgoDynamicsOnRoute</td>
<td>Usually the RSS sensor output <code>libad_rss_python.RssResponse.ego_dynamics_on_route</code> is passed in as a parameter.</td>
<tr>
<td><code>vehicle_physics</code></td>
<td><a href="../python_api#carlavehiclephysicscontrol">carla.VehcilePhysicsControl</a></td>
<td>The physics control of the ego vehicle.</td>
</table>
<br>

View File

@ -77,6 +77,9 @@ RssCheck::RssCheck()
_other_vehicle_dynamics(GetDefaultVehicleDynamics()),
_road_boundaries_mode(GetDefaultRoadBoundariesMode()),
_visualization_mode(GetDefaultVisualizationMode()) {
_other_vehicle_dynamics.responseTime = ::ad::physics::Duration(2.0);
_logger = getLogger();
spdlog::set_level(spdlog::level::warn);
_logger->set_level(spdlog::level::warn);
@ -100,7 +103,8 @@ RssCheck::~RssCheck() {}
default_dynamics.alphaLon.brakeMinCorrect = ::ad::physics::Acceleration(-3);
default_dynamics.alphaLat.accelMax = ::ad::physics::Acceleration(0.2);
default_dynamics.alphaLat.brakeMin = ::ad::physics::Acceleration(-0.8);
default_dynamics.responseTime = ::ad::physics::Duration(.5);
default_dynamics.lateralFluctuationMargin = ::ad::physics::Distance(0.1);
default_dynamics.responseTime = ::ad::physics::Duration(1.0);
return default_dynamics;
}

View File

@ -84,7 +84,7 @@ struct EgoDynamicsOnRoute {
::ad::map::point::ENUHeading route_heading;
/// @brief the considered nominal center of the current route
::ad::map::point::ENUPoint route_nominal_center;
/// @brief the considered heading of the route
/// @brief the considered heading diff towards the route
::ad::map::point::ENUHeading heading_diff;
/// @brief the ego speed component lat in respect to a route
::ad::physics::Speed route_speed_lat;
@ -97,7 +97,7 @@ struct EgoDynamicsOnRoute {
/// @brief the ego acceleration component lat in respect to a route
/// smoothened by an average filter
::ad::physics::Acceleration avg_route_accel_lat;
/// @brief the ego acceleration component lat in respect to a route
/// @brief the ego acceleration component lon in respect to a route
/// smoothened by an average filter
::ad::physics::Acceleration avg_route_accel_lon;
};

View File

@ -96,7 +96,7 @@ void export_ad_rss() {
namespace cs = carla::sensor;
namespace csd = carla::sensor::data;
class_<carla::rss::EgoDynamicsOnRoute>("EgoDynamicsOnRoute")
class_<carla::rss::EgoDynamicsOnRoute>("RssEgoDynamicsOnRoute")
.def_readwrite("timestamp", &carla::rss::EgoDynamicsOnRoute::timestamp)
.def_readwrite("time_since_epoch_check_start_ms",
&carla::rss::EgoDynamicsOnRoute::time_since_epoch_check_start_ms)
@ -153,6 +153,6 @@ void export_ad_rss() {
no_init)
.def(init<>())
.def("restrict_vehicle_control", &carla::rss::RssRestrictor::RestrictVehicleControl,
(arg("restriction"), arg("vehicleControl")))
(arg("vehicle_control"), arg("restriction"), arg("ego_dynamics_on_route"), arg("vehicle_physics")))
.def(self_ns::str(self_ns::self));
}

View File

@ -17,6 +17,7 @@
- [Lidar raycast](ref_sensors.md#lidar-raycast-sensor).
- [RGB camera](ref_sensors.md#rgb-camera).
- [Semantic Segmentation camera](ref_sensors.md#semantic-segmentation-camera).
- [RSS sensor](ref_sensors.md#rss-sensor).
<b>Only receive data when triggered:</b>
- [Collision detector](ref_sensors.md#collision-detector).
- [Lane invasion detector](ref_sensors.md#lane-invasion-detector).

View File

@ -14,6 +14,7 @@
- Lidar raycast: carla.LidarMeasurement.
- Obstacle detector: carla.ObstacleDetectionEvent.
- Radar detector: carla.RadarMeasurement.
- RSS response: carla.RssResponse.
# - PROPERTIES -------------------------
instance_variables:
- var_name: frame
@ -343,4 +344,125 @@
methods:
- def_name: __str__
# --------------------------------------
- class_name: RssResponse
# - DESCRIPTION ------------------------
doc: >
Data contained inside a carla.RssResponse.
# - PROPERTIES -------------------------
instance_variables:
- var_name: response_valid
type: bool
doc: >
Is the current response data valid.
# --------------------------------------
- var_name: proper_response
type: <a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1state_1_1ProperResponse.html">libad_rss_python.ProperResponse</a>
doc: >
The proper response of the RSS calculation.
# --------------------------------------
- var_name: acceleration_restriction
type: <a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1world_1_1AccelerationRestriction.html">libad_rss_python.AccelerationRestriction</a>
doc: >
The acceleration restrictions of the RSS calculation.
# --------------------------------------
- var_name: rss_state_snapshot
type: <a href="https://intel.github.io/ad-rss-lib/doxygen/ad_rss/structad_1_1rss_1_1state_1_1RssStateSnapshot.html">libad_rss_python.RssStateSnapshot</a>
doc: >
The detailed RSS states at the current point in time.
# --------------------------------------
- var_name: ego_dynamics_on_route
type: carla.RssEgoDynamicsOnRoute
doc: >
The current ego vehicle dynamics in respect to the current route.
# - METHODS ----------------------------
methods:
- def_name: __str__
# --------------------------------------
- class_name: RssEgoDynamicsOnRoute
# - DESCRIPTION ------------------------
doc: >
Data contained inside a carla.RssResponse.ego_dynamics_on_route
# - PROPERTIES -------------------------
instance_variables:
- var_name: ego_speed
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>
doc: >
The ego speed.
# --------------------------------------
- var_name: min_stopping_distance
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Distance.html">libad_physics_python.Distance</a>
doc: >
The current minimum stopping distance.
# --------------------------------------
- var_name: ego_center
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/structad_1_1map_1_1point_1_1ENUPoint.html">libad_map_access_python.ENUPoint</a>
doc: >
The considered enu position of the ego vehicle.
# --------------------------------------
- var_name: ego_heading
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>
doc: >
The considered heading of the ego vehicle.
# --------------------------------------
- var_name: ego_center_within_route
type: bool
doc: >
Indicating if the ego center is within route.
# --------------------------------------
- var_name: crossing_border
type: bool
doc: >
Indicating if the vehicle is already crossing one of the lane borders.
# --------------------------------------
- var_name: route_heading
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>
doc: >
The considered heading of the route.
# --------------------------------------
- var_name: route_nominal_center
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/structad_1_1map_1_1point_1_1ENUPoint.html">libad_map_access_python.ENUPoint</a>
doc: >
The considered nominal center of the current route.
# --------------------------------------
- var_name: heading_diff
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_map_access/apidoc/html/classad_1_1map_1_1point_1_1ENUHeading.html">libad_map_access_python.ENUHeading</a>
doc: >
The considered heading diff towards the route.
# --------------------------------------
- var_name: route_speed_lat
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>
doc: >
The ego speed component lat in respect to the route.
# --------------------------------------
- var_name: route_speed_lon
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Speed.html">libad_physics_python.Speed</a>
doc: >
The ego speed component lon in respect to the route.
# --------------------------------------
- var_name: route_accel_lat
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>
doc: >
The ego acceleration component lat in respect to the route.
# --------------------------------------
- var_name: route_accel_lon
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>
doc: >
The ego acceleration component lon in respect to the route.
# --------------------------------------
- var_name: avg_route_accel_lat
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>
doc: >
The ego acceleration component lat in respect to the route smoothened by an average filter.
# --------------------------------------
- var_name: avg_route_accel_lon
type: <a href="https://ad-map-access.readthedocs.io/en/latest/ad_physics/apidoc/html/classad_1_1physics_1_1Acceleration.html">libad_physics_python.Acceleration</a>
doc: >
The ego acceleration component lon in respect to the route smoothened by an average filter.
# - METHODS ----------------------------
methods:
- def_name: __str__
# --------------------------------------
...