From f2601e035106cf23ba050c1f73a2f7ea6ca32564 Mon Sep 17 00:00:00 2001 From: Alexandre Vannobel <41082816+alexvannobel@users.noreply.github.com> Date: Fri, 4 Jun 2021 07:48:30 -0400 Subject: [PATCH] Merge release 2.3 to master (#66) * Update C++ part * Update Python part * Update documentation, add modbus --- .../ActuatorConfig/ControlLoopSelection.md | 1 + .../enums/ActuatorConfig/ControlMode.md | 1 + .../doc/markdown/enums/Api/SubErrorCodes.md | 3 + .../doc/markdown/enums/Base/ActionEvent.md | 1 + api_cpp/doc/markdown/enums/Base/ActionType.md | 3 + .../doc/markdown/enums/Base/ControllerType.md | 3 +- api_cpp/doc/markdown/enums/Base/GpioAction.md | 16 + .../doc/markdown/enums/Base/GpioBehavior.md | 1 + .../enums/Base/GpioPinPropertyFlags.md | 15 + .../doc/markdown/enums/Base/NetworkType.md | 2 +- .../enums/Base/TrajectoryErrorIdentifier.md | 12 +- .../enums/Base/TrajectoryErrorType.md | 55 ++- .../markdown/enums/Base/TrajectoryInfoType.md | 25 ++ .../enums/ControlConfig/ControlMode.md | 1 + api_cpp/doc/markdown/index.md | 16 + .../messages/ActuatorConfig/AxisOffsets.md | 4 +- .../messages/ActuatorConfig/AxisPosition.md | 2 +- api_cpp/doc/markdown/messages/Base/Action.md | 25 +- .../messages/Base/ActionNotification.md | 8 + .../markdown/messages/Base/AngularWaypoint.md | 34 ++ .../messages/Base/CartesianWaypoint.md | 37 ++ .../doc/markdown/messages/Base/GpioCommand.md | 30 ++ .../messages/Base/GpioConfiguration.md | 26 ++ .../messages/Base/GpioConfigurationList.md | 22 + .../messages/Base/GpioPinConfiguration.md | 30 ++ api_cpp/doc/markdown/messages/Base/IKData.md | 28 ++ .../Base/KinematicTrajectoryConstraints.md | 30 ++ .../doc/markdown/messages/Base/MapEvent.md | 2 +- .../messages/Base/TrajectoryErrorElement.md | 6 +- .../markdown/messages/Base/TrajectoryInfo.md | 26 ++ .../doc/markdown/messages/Base/Waypoint.md | 37 ++ .../markdown/messages/Base/WaypointList.md | 30 ++ .../messages/Base/WaypointValidationReport.md | 28 ++ .../ControlConfig/ControlModeNotification.md | 39 ++ .../messages/GripperCyclic/MotorCommand.md | 2 +- .../markdown/summary_pages/ActuatorConfig.md | 80 ++-- .../markdown/summary_pages/ActuatorCyclic.md | 28 +- api_cpp/doc/markdown/summary_pages/Api.md | 6 +- api_cpp/doc/markdown/summary_pages/Base.md | 337 ++++++++------- .../doc/markdown/summary_pages/BaseCyclic.md | 28 +- api_cpp/doc/markdown/summary_pages/Common.md | 6 +- .../markdown/summary_pages/ControlConfig.md | 74 ++-- .../markdown/summary_pages/DeviceConfig.md | 88 ++-- .../markdown/summary_pages/DeviceManager.md | 22 +- .../markdown/summary_pages/GripperConfig.md | 6 +- .../markdown/summary_pages/GripperCyclic.md | 28 +- .../summary_pages/InterconnectConfig.md | 48 ++- .../summary_pages/InterconnectCyclic.md | 28 +- .../summary_pages/NotificationTopics.md | 43 -- .../summary_pages/ProductConfiguration.md | 6 +- api_cpp/doc/markdown/summary_pages/Session.md | 28 +- .../markdown/summary_pages/VisionConfig.md | 44 +- .../000-Getting_started/01-api_creation.cpp | 15 +- .../000-Getting_started/03-api_mechanism.cpp | 67 +-- .../04-error_management.cpp | 11 +- .../000-Getting_started/05-notification.cpp | 11 +- .../100-Overview/01-devices_routing.cpp | 11 +- .../02-protection_zones_configuration.cpp | 11 +- .../01-move_angular_and_cartesian.cpp | 15 +- .../02-sequence.cpp | 13 +- .../03-twist_command.cpp | 11 +- .../04-send_joint_speeds.cpp | 11 +- .../01-gripper_command.cpp | 7 +- .../01-gripper_low_level_command.cpp | 7 +- .../01-torque_control_cyclic.cpp | 51 ++- .../01-ethernet_bridge_configuration.cpp | 7 +- .../01-send_angular_wapoint_trajectory.cpp | 374 +++++++++++++++++ .../02-send_cartesian_waypoint_trajectory.cpp | 395 ++++++++++++++++++ ...01-actuator_low_level_velocity_control.cpp | 14 +- .../01_vision_intrinsics.cpp | 11 +- .../02_vision_extrinsics.cpp | 11 +- .../03_vision_sensor_focus_action.cpp | 11 +- .../04_vision_sensor_options.cpp | 13 +- api_cpp/examples/CMakeLists.txt | 55 ++- api_cpp/examples/readme.md | 27 +- .../examples/scripts/download_kortex_api.bat | 2 +- .../examples/scripts/download_kortex_api.sh | 2 +- api_cpp/examples/utilities.cpp | 44 ++ api_cpp/examples/utilities.h | 27 ++ .../ActuatorConfig/ControlLoopSelection.md | 1 + .../enums/ActuatorConfig/ControlMode.md | 1 + .../doc/markdown/enums/Api/SubErrorCodes.md | 3 + .../doc/markdown/enums/Base/ActionEvent.md | 1 + .../doc/markdown/enums/Base/ActionType.md | 3 + .../doc/markdown/enums/Base/ControllerType.md | 3 +- .../doc/markdown/enums/Base/GpioAction.md | 16 + .../doc/markdown/enums/Base/GpioBehavior.md | 1 + .../enums/Base/GpioPinPropertyFlags.md | 15 + .../doc/markdown/enums/Base/NetworkType.md | 2 +- .../enums/Base/TrajectoryErrorIdentifier.md | 12 +- .../enums/Base/TrajectoryErrorType.md | 55 ++- .../markdown/enums/Base/TrajectoryInfoType.md | 25 ++ .../enums/ControlConfig/ControlMode.md | 1 + api_python/doc/markdown/index.md | 16 + .../messages/ActuatorConfig/AxisOffsets.md | 4 +- .../messages/ActuatorConfig/AxisPosition.md | 2 +- .../doc/markdown/messages/Base/Action.md | 7 +- .../messages/Base/ActionNotification.md | 1 + .../markdown/messages/Base/AngularWaypoint.md | 12 + .../messages/Base/CartesianWaypoint.md | 14 + .../doc/markdown/messages/Base/GpioCommand.md | 13 + .../messages/Base/GpioConfiguration.md | 11 + .../messages/Base/GpioConfigurationList.md | 10 + .../messages/Base/GpioPinConfiguration.md | 13 + .../doc/markdown/messages/Base/IKData.md | 11 + .../Base/KinematicTrajectoryConstraints.md | 12 + .../doc/markdown/messages/Base/MapEvent.md | 2 +- .../messages/Base/TrajectoryErrorElement.md | 3 +- .../markdown/messages/Base/TrajectoryInfo.md | 12 + .../doc/markdown/messages/Base/Waypoint.md | 12 + .../markdown/messages/Base/WaypointList.md | 12 + .../messages/Base/WaypointValidationReport.md | 11 + .../ControlConfig/ControlModeNotification.md | 13 + .../messages/GripperCyclic/MotorCommand.md | 2 +- .../markdown/summary_pages/ActuatorConfig.md | 80 ++-- .../markdown/summary_pages/ActuatorCyclic.md | 28 +- api_python/doc/markdown/summary_pages/Api.md | 6 +- api_python/doc/markdown/summary_pages/Base.md | 337 ++++++++------- .../doc/markdown/summary_pages/BaseCyclic.md | 28 +- .../doc/markdown/summary_pages/Common.md | 6 +- .../markdown/summary_pages/ControlConfig.md | 74 ++-- .../markdown/summary_pages/DeviceConfig.md | 88 ++-- .../markdown/summary_pages/DeviceManager.md | 22 +- .../markdown/summary_pages/GripperConfig.md | 6 +- .../markdown/summary_pages/GripperCyclic.md | 28 +- .../summary_pages/InterconnectConfig.md | 48 ++- .../summary_pages/InterconnectCyclic.md | 28 +- .../summary_pages/ProductConfiguration.md | 6 +- .../doc/markdown/summary_pages/Session.md | 28 +- .../markdown/summary_pages/VisionConfig.md | 44 +- .../000-Getting_Started/03-api_mechanism.py | 26 +- .../01-torque_control_cyclic.py | 123 ++++-- .../01-send_angular_wapoint_trajectory.py | 203 +++++++++ .../02-send_cartesian_waypoint_trajectory.py | 208 +++++++++ api_python/examples/readme.md | 18 +- linked_md/artifactory.png | Bin 188419 -> 204455 bytes linked_md/modbus_icd.md | 231 ++++++++++ .../000-Getting_Started/01-basic_functions.py | 299 +++++++++++++ modbus/examples/readme.md | 82 ++++ modbus/examples/requirements.txt | 1 + readme.md | 49 ++- 141 files changed, 4044 insertions(+), 1120 deletions(-) create mode 100644 api_cpp/doc/markdown/enums/Base/GpioAction.md create mode 100644 api_cpp/doc/markdown/enums/Base/GpioPinPropertyFlags.md create mode 100644 api_cpp/doc/markdown/enums/Base/TrajectoryInfoType.md create mode 100644 api_cpp/doc/markdown/messages/Base/AngularWaypoint.md create mode 100644 api_cpp/doc/markdown/messages/Base/CartesianWaypoint.md create mode 100644 api_cpp/doc/markdown/messages/Base/GpioCommand.md create mode 100644 api_cpp/doc/markdown/messages/Base/GpioConfiguration.md create mode 100644 api_cpp/doc/markdown/messages/Base/GpioConfigurationList.md create mode 100644 api_cpp/doc/markdown/messages/Base/GpioPinConfiguration.md create mode 100644 api_cpp/doc/markdown/messages/Base/IKData.md create mode 100644 api_cpp/doc/markdown/messages/Base/KinematicTrajectoryConstraints.md create mode 100644 api_cpp/doc/markdown/messages/Base/TrajectoryInfo.md create mode 100644 api_cpp/doc/markdown/messages/Base/Waypoint.md create mode 100644 api_cpp/doc/markdown/messages/Base/WaypointList.md create mode 100644 api_cpp/doc/markdown/messages/Base/WaypointValidationReport.md create mode 100644 api_cpp/doc/markdown/messages/ControlConfig/ControlModeNotification.md delete mode 100644 api_cpp/doc/markdown/summary_pages/NotificationTopics.md rename api_cpp/examples/{102-Movement_high_level => 102-High_level_movement}/01-move_angular_and_cartesian.cpp (97%) rename api_cpp/examples/{102-Movement_high_level => 102-High_level_movement}/02-sequence.cpp (96%) rename api_cpp/examples/{102-Movement_high_level => 102-High_level_movement}/03-twist_command.cpp (95%) rename api_cpp/examples/{102-Movement_high_level => 102-High_level_movement}/04-send_joint_speeds.cpp (96%) create mode 100644 api_cpp/examples/110-Waypoints/01-send_angular_wapoint_trajectory.cpp create mode 100644 api_cpp/examples/110-Waypoints/02-send_cartesian_waypoint_trajectory.cpp create mode 100644 api_cpp/examples/utilities.cpp create mode 100644 api_cpp/examples/utilities.h create mode 100644 api_python/doc/markdown/enums/Base/GpioAction.md create mode 100644 api_python/doc/markdown/enums/Base/GpioPinPropertyFlags.md create mode 100644 api_python/doc/markdown/enums/Base/TrajectoryInfoType.md create mode 100644 api_python/doc/markdown/messages/Base/AngularWaypoint.md create mode 100644 api_python/doc/markdown/messages/Base/CartesianWaypoint.md create mode 100644 api_python/doc/markdown/messages/Base/GpioCommand.md create mode 100644 api_python/doc/markdown/messages/Base/GpioConfiguration.md create mode 100644 api_python/doc/markdown/messages/Base/GpioConfigurationList.md create mode 100644 api_python/doc/markdown/messages/Base/GpioPinConfiguration.md create mode 100644 api_python/doc/markdown/messages/Base/IKData.md create mode 100644 api_python/doc/markdown/messages/Base/KinematicTrajectoryConstraints.md create mode 100644 api_python/doc/markdown/messages/Base/TrajectoryInfo.md create mode 100644 api_python/doc/markdown/messages/Base/Waypoint.md create mode 100644 api_python/doc/markdown/messages/Base/WaypointList.md create mode 100644 api_python/doc/markdown/messages/Base/WaypointValidationReport.md create mode 100644 api_python/doc/markdown/messages/ControlConfig/ControlModeNotification.md create mode 100644 api_python/examples/110-Waypoints/01-send_angular_wapoint_trajectory.py create mode 100644 api_python/examples/110-Waypoints/02-send_cartesian_waypoint_trajectory.py create mode 100644 linked_md/modbus_icd.md create mode 100644 modbus/examples/000-Getting_Started/01-basic_functions.py create mode 100644 modbus/examples/readme.md create mode 100644 modbus/examples/requirements.txt diff --git a/api_cpp/doc/markdown/enums/ActuatorConfig/ControlLoopSelection.md b/api_cpp/doc/markdown/enums/ActuatorConfig/ControlLoopSelection.md index a0b0bd1b..d21b3606 100644 --- a/api_cpp/doc/markdown/enums/ActuatorConfig/ControlLoopSelection.md +++ b/api_cpp/doc/markdown/enums/ActuatorConfig/ControlLoopSelection.md @@ -13,6 +13,7 @@ Enumeration ControlLoopSelection |MOTOR\_VELOCITY|8|0x8 - Motor velocity control| |JOINT\_TORQUE|16|0x10 - Joint torque control| |MOTOR\_CURRENT|32|0x20 - Motor current control| +|JOINT\_TORQUE\_HIGH\_VELOCITY|64|0x30 - High velocity joint torque control| **Parent topic:** [ActuatorConfig \(C++\)](../../summary_pages/ActuatorConfig.md) diff --git a/api_cpp/doc/markdown/enums/ActuatorConfig/ControlMode.md b/api_cpp/doc/markdown/enums/ActuatorConfig/ControlMode.md index 9069bea7..4f21c173 100644 --- a/api_cpp/doc/markdown/enums/ActuatorConfig/ControlMode.md +++ b/api_cpp/doc/markdown/enums/ActuatorConfig/ControlMode.md @@ -12,6 +12,7 @@ Enumeration ControlMode |TORQUE|3|Torque mode| |CURRENT|4|Current mode| |CUSTOM|5|Custom mode| +|TORQUE\_HIGH\_VELOCITY|6|High velocity torque mode| **Parent topic:** [ActuatorConfig \(C++\)](../../summary_pages/ActuatorConfig.md) diff --git a/api_cpp/doc/markdown/enums/Api/SubErrorCodes.md b/api_cpp/doc/markdown/enums/Api/SubErrorCodes.md index df659f01..42d8cd9a 100644 --- a/api_cpp/doc/markdown/enums/Api/SubErrorCodes.md +++ b/api_cpp/doc/markdown/enums/Api/SubErrorCodes.md @@ -103,6 +103,9 @@ Enumeration SubErrorCodes |READ\_PERMISSION\_DENIED|136|Attempting read command on unreadable entity| |CONTROLLER\_INVALID\_MAPPING|137|Attempting to assign an unsuited mapping to controller| |ACTION\_IN\_USE|138|Attempting to delete an Action used by another entity| +|SEND\_FAILED|139|An error occured when trying to send the message \(Transport error\)| +|CONTROL\_WAYPOINT\_TRAJECTORY\_ABORTED|140|Waypoint trajectory sequence aborted by kontrol library| +|CONTROL\_PERMISSION\_DENIED|141|Permission to execute a routine from the kontrol interface denied| **Parent topic:** [Api \(C++\)](../../summary_pages/Api.md) diff --git a/api_cpp/doc/markdown/enums/Base/ActionEvent.md b/api_cpp/doc/markdown/enums/Base/ActionEvent.md index 57dbdd99..d2dd1984 100644 --- a/api_cpp/doc/markdown/enums/Base/ActionEvent.md +++ b/api_cpp/doc/markdown/enums/Base/ActionEvent.md @@ -17,6 +17,7 @@ Enumeration ActionEvent |ACTION\_POSTPROCESS\_START|8|Action post-process started| |ACTION\_POSTPROCESS\_ABORT|9|Action post-process aborted| |ACTION\_POSTPROCESS\_END|10|Action post-process ended| +|ACTION\_FEEDBACK|11|Action feedback received| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/ActionType.md b/api_cpp/doc/markdown/enums/Base/ActionType.md index 8bbf6a7c..f5101d2b 100644 --- a/api_cpp/doc/markdown/enums/Base/ActionType.md +++ b/api_cpp/doc/markdown/enums/Base/ActionType.md @@ -25,8 +25,11 @@ Enumeration ActionType |TIME\_DELAY|31|Apply a delay| |EXECUTE\_ACTION|32|Execute an existing action| |SEND\_GRIPPER\_COMMAND|33|Send a gripper command| +|SEND\_GPIO\_COMMAND|34|Send a gpio command \(not implemented yet\)| |STOP\_ACTION|35|Stop robot movement| |PLAY\_PRE\_COMPUTED\_TRAJECTORY|39|Play a pre-computed trajectory| +|EXECUTE\_SEQUENCE|40|Execute an existing sequence| +|EXECUTE\_WAYPOINT\_LIST|41|Execute a trajectory defined by a series of waypoints| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/ControllerType.md b/api_cpp/doc/markdown/enums/Base/ControllerType.md index 7ea476d2..13d078aa 100644 --- a/api_cpp/doc/markdown/enums/Base/ControllerType.md +++ b/api_cpp/doc/markdown/enums/Base/ControllerType.md @@ -10,7 +10,8 @@ Enumeration ControllerType |XBOX\_CONTROLLER|1|Xbox gamepad| |WRIST\_CONTROLLER|2|Wrist buttons| |BASIC\_JOYSTICK\_CONTROLLER|3|Simplified joystick connected to Kinova robot base| -|BASE\_GPIO\_CONTROLLER|4|GPIO Controller \(not implemented yet\)| +|BASE\_GPIO\_CONTROLLER|4|GPIO Controller| +|GPIO\_JOYSTICK|5|TEMP, will be deleted| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/GpioAction.md b/api_cpp/doc/markdown/enums/Base/GpioAction.md new file mode 100644 index 00000000..5acd11e2 --- /dev/null +++ b/api_cpp/doc/markdown/enums/Base/GpioAction.md @@ -0,0 +1,16 @@ +# enum GpioAction + +## Overview / Purpose + +Enumeration GpioAction + +|Enumerator|Value|Description| +|----------|-----|-----------| +|UNSPECIFIED\_GPIO\_ACTION|0|Unspecified gpio action| +|GPIOACTION\_SET|1|Set GPIO output| +|GPIOACTION\_CLEAR|2|Clear GPIO output| +|GPIOACTION\_PULSE\_HIGH|3|Pulse high GPIO output with specified period| +|GPIOACTION\_PULSE\_LOW|4|Pulse low GPIO output with specified period| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/enums/Base/GpioBehavior.md b/api_cpp/doc/markdown/enums/Base/GpioBehavior.md index a06e7d36..8b006c7e 100644 --- a/api_cpp/doc/markdown/enums/Base/GpioBehavior.md +++ b/api_cpp/doc/markdown/enums/Base/GpioBehavior.md @@ -11,6 +11,7 @@ Enumeration GpioBehavior |GPIO\_RISING|2|Rising edge| |GPIO\_PULSE\_LOW|3|Sequence of HIGH - LOW - HIGH| |GPIO\_PULSE\_HIGH|4|Sequence of LOW - HIGH - LOW| +|GPIO\_ANALOG\_CHANGE|5|Analog input value change| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/GpioPinPropertyFlags.md b/api_cpp/doc/markdown/enums/Base/GpioPinPropertyFlags.md new file mode 100644 index 00000000..e6d9d61f --- /dev/null +++ b/api_cpp/doc/markdown/enums/Base/GpioPinPropertyFlags.md @@ -0,0 +1,15 @@ +# enum GpioPinPropertyFlags + +## Overview / Purpose + +Enumeration GpioPinPropertyFlags + +|Enumerator|Value|Description| +|----------|-----|-----------| +|GPIOPROPERTY\_UNKNOWN|0| | +|GPIOPROPERTY\_INPUT|1|0x1 : Pin can be used as digital input| +|GPIOPROPERTY\_OUTPUT|2|0x2 : Pin can be used as digital output| +|GPIOPROPERTY\_ANALOG|4|0x4 : Pin can be used as analog input| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/enums/Base/NetworkType.md b/api_cpp/doc/markdown/enums/Base/NetworkType.md index c5713059..8e6e7815 100644 --- a/api_cpp/doc/markdown/enums/Base/NetworkType.md +++ b/api_cpp/doc/markdown/enums/Base/NetworkType.md @@ -10,7 +10,7 @@ Enumeration NetworkType |WIFI|1|Wi-Fi network| |WIRED\_ETHERNET|2|Wired Ethernet network| |WIRED\_MICROUSB|3|Wired Ethernet over USB network \(RNDIS\)| -|WIRED\_USB|4|Wired Ethernet over USB network| +|WIRED\_USB|4|This enum value is deprecated and will be removed in a future release.| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/TrajectoryErrorIdentifier.md b/api_cpp/doc/markdown/enums/Base/TrajectoryErrorIdentifier.md index d98feac2..0e78132b 100644 --- a/api_cpp/doc/markdown/enums/Base/TrajectoryErrorIdentifier.md +++ b/api_cpp/doc/markdown/enums/Base/TrajectoryErrorIdentifier.md @@ -6,12 +6,12 @@ Enumeration TrajectoryErrorIdentifier |Enumerator|Value|Description| |----------|-----|-----------| -|TRAJECTORY\_ERROR\_IDENTIFIER\_UNSPECIFIED|0|Unspecified error identifier| -|TRAJECTORY\_ERROR\_IDENTIFIER\_UNAPPLICABLE|1|No identifier required for this error| -|TRAJECTORY\_ERROR\_IDENTIFIER\_TIME|2|Time validation failed| -|TRAJECTORY\_ERROR\_IDENTIFIER\_POSITION|3|Position validation failed| -|TRAJECTORY\_ERROR\_IDENTIFIER\_VELOCITY|4|Velocity validation failed| -|TRAJECTORY\_ERROR\_IDENTIFIER\_ACCELERATION|5|Acceleration validation failed| +|TRAJECTORY\_ERROR\_IDENTIFIER\_UNSPECIFIED|0|Unspecified error identifier. This enum is deprecated.| +|TRAJECTORY\_ERROR\_IDENTIFIER\_UNAPPLICABLE|1|No identifier required for this error. This enum is deprecated.| +|TRAJECTORY\_ERROR\_IDENTIFIER\_TIME|2|Time validation failed. This enum is deprecated.| +|TRAJECTORY\_ERROR\_IDENTIFIER\_POSITION|3|Position validation failed. This enum is deprecated.| +|TRAJECTORY\_ERROR\_IDENTIFIER\_VELOCITY|4|Velocity validation failed. This enum is deprecated.| +|TRAJECTORY\_ERROR\_IDENTIFIER\_ACCELERATION|5|Acceleration validation failed. This enum is deprecated.| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/TrajectoryErrorType.md b/api_cpp/doc/markdown/enums/Base/TrajectoryErrorType.md index b5882b5b..ab27165a 100644 --- a/api_cpp/doc/markdown/enums/Base/TrajectoryErrorType.md +++ b/api_cpp/doc/markdown/enums/Base/TrajectoryErrorType.md @@ -7,25 +7,42 @@ Enumeration TrajectoryErrorType |Enumerator|Value|Description| |----------|-----|-----------| |TRAJECTORY\_ERROR\_TYPE\_UNSPECIFIED|0|Unspecified error type| -|TRAJECTORY\_ERROR\_TYPE\_OUTSIDE\_WORKSPACE|1|The trajectory point is outside robot workspace| -|TRAJECTORY\_ERROR\_TYPE\_ACTUATOR\_COUNT\_MISMATCH|2|There is an actuator count mismatch with the robot| -|TRAJECTORY\_ERROR\_TYPE\_INVALID\_DURATION|3|The trajectory has an invalid duration| -|TRAJECTORY\_ERROR\_TYPE\_ZERO\_DISTANCE|4|The trajectory does not move the robot because the delta is either zero or too small| -|TRAJECTORY\_ERROR\_TYPE\_INVALID\_SPEED|5|The speed for a trajectory point for an actuator is invalid| -|TRAJECTORY\_ERROR\_TYPE\_LARGE\_SPEED|6|The speed for a trajectory point for an actuator exceeds its limit| -|TRAJECTORY\_ERROR\_TYPE\_INVALID\_ACCELERATION|7|The acceleration for a trajectory point for an actuator is invalid| -|TRAJECTORY\_ERROR\_TYPE\_INVALID\_TIME\_STEP|8|The time step for a trajectory point is invalid| -|TRAJECTORY\_ERROR\_TYPE\_LARGE\_SIZE|9|The trajectory is too large| -|TRAJECTORY\_ERROR\_TYPE\_WRONG\_MODE|10|The robot is not currently in Trajectory Control mode| -|TRAJECTORY\_ERROR\_TYPE\_JOINT\_POSITION\_LIMIT|11|The position limit for a trajectory point for an actuator is exceeded| -|TRAJECTORY\_ERROR\_TYPE\_FILE\_ERROR|12|An internal file error was encountered| -|TRAJECTORY\_ERROR\_TYPE\_NO\_FILE\_IN\_MEMORY|13|An internal file memory error was encountered| -|TRAJECTORY\_ERROR\_TYPE\_INDEX\_OUT\_OF\_TRAJ|14|The index for a trajectory point is invalid| -|TRAJECTORY\_ERROR\_TYPE\_ALREADY\_RUNNING|15|A trajectory is already running| -|TRAJECTORY\_ERROR\_TYPE\_WRONG\_STARTING\_POINT|16|The difference between the trajectory's starting point and the current position is too large| -|TRAJECTORY\_ERROR\_TYPE\_CARTESIAN\_CANNOT\_START|17|The cartesian trajectory is not able to start| -|TRAJECTORY\_ERROR\_TYPE\_WRONG\_STARTING\_SPEED|18|The difference between the trajectory's starting speed and the current speed is too large| -|TRAJECTORY\_ERROR\_TYPE\_INVALID\_POSITION|19|The position for a trajectory point for an actuator is invalid| +|TRAJECTORY\_ERROR\_TYPE\_OUTSIDE\_WORKSPACE|1|The desired pose is outside robot workspace| +|TRAJECTORY\_ERROR\_TYPE\_ACTUATOR\_COUNT\_MISMATCH|2|The provided number of joint values does not match robot's number of actuators| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_DURATION|3|The duration exceeds a limit or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_JOINT\_NO\_MOTION|4|The robot's actuators are already at the targeted configuration| +|TRAJECTORY\_ERROR\_TYPE\_ZERO\_DISTANCE|4|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_JOINT\_SPEED|5|The joint speed exceeds a limit, initial speed does not match current robot speed or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_SPEED|5|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_LARGE\_SPEED|6|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_JOINT\_ACCELERATION|7|The joint acceleration exceeds a limit or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_ACCELERATION|7|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_TIME\_STEP|8|The time step does not match robot time step or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_TRAJECTORY\_SIZE|9|The trajectory size is outside the limits or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_LARGE\_SIZE|9|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_WRONG\_MODE|10|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_JOINT\_POSITION|11|The joint position exceeds a limit, initial joint position does not match current robot joint position or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_JOINT\_POSITION\_LIMIT|11|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_FILE\_ERROR|12|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_NO\_FILE\_IN\_MEMORY|13|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INDEX\_OUT\_OF\_TRAJ|14|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_TRAJECTORY\_ALREADY\_RUNNING|15|The new trajectory cannot start because another trajectory is being played| +|TRAJECTORY\_ERROR\_TYPE\_ALREADY\_RUNNING|15|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_WRONG\_STARTING\_POINT|16|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_CARTESIAN\_CANNOT\_START|17|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_WRONG\_STARTING\_SPEED|18|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_POSITION|19|This enum value is deprecated and will be removed in a future release.| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_CARTESIAN\_POSITION|20|The cartesian position exceeds a limit, initial pose does not match current robot pose or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_CARTESIAN\_ORIENTATION|21|The cartesian orientation exceeds a limit, initial orientation does not match current robot orientation or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_CARTESIAN\_LINEAR\_VELOCITY|22|The cartesian linear velocity exceeds a limit or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_CARTESIAN\_ANGULAR\_VELOCITY|23|The cartesian angular velocity exceeds a limit or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_JOINT\_TORQUE|24|The joint torque exceeds a limit or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_MULTIPLE\_WAYPOINT\_TYPE\_LIST|25|The waypoints in a trajectory must be all of the same type \(cartesian or angular\)| +|TRAJECTORY\_ERROR\_TYPE\_INITIAL\_WAYPOINT\_NO\_STOP|26|The first waypoint must not have blending \(currently unused\)| +|TRAJECTORY\_ERROR\_TYPE\_FINAL\_WAYPOINT\_NO\_STOP|27|The last waypoint must not have blending| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_BLENDING\_RADIUS|28|The blending radius must be positive and not overlap other blendings or waypoint or is invalid| +|TRAJECTORY\_ERROR\_TYPE\_INVALID\_REFERENCE\_FRAME|29|The reference frame is invalid or not supported| +|TRAJECTORY\_ERROR\_TYPE\_NUMERICAL\_ERROR\_IMPOSSIBLE\_TRAJECTORY|30|The conditions \(points, velocities\) of the trajectory lead to numerical errors that make the computation impossible| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/enums/Base/TrajectoryInfoType.md b/api_cpp/doc/markdown/enums/Base/TrajectoryInfoType.md new file mode 100644 index 00000000..19ba0814 --- /dev/null +++ b/api_cpp/doc/markdown/enums/Base/TrajectoryInfoType.md @@ -0,0 +1,25 @@ +# enum TrajectoryInfoType + +## Overview / Purpose + +Enumeration TrajectoryInfoType + +|Enumerator|Value|Description| +|----------|-----|-----------| +|UNSPECIFIED\_TRAJECTORY\_INFORMATION|0|No information provided| +|JOINT\_ACCELERATION\_LIMIT\_REACHED|1|Joint acceleration limit reached| +|JOINT\_SPEED\_LIMIT\_REACHED|2|Joint speed limit reached| +|JOINT\_POSITION\_LIMIT\_REACHED|3|Joint position limit reached| +|JOINT\_TORQUE\_LIMIT\_REACHED|4|Joint torque limit reached| +|SINGULARITY\_REGION|5|The arm is inside a singularity region| +|INVERSE\_KINEMATIC\_FAILED|6|The inverse kinematic calculation has failed| +|CARTESIAN\_ACCELERATION\_LIMIT\_REACHED|7|Cartesian acceleration limit reached| +|CARTESIAN\_SPEED\_LIMIT\_REACHED|8|Cartesian speed limit reached| +|CARTESIAN\_POSITION\_LIMIT\_REACHED|9|Cartesian position limit reached| +|CARTESIAN\_WRENCH\_LIMIT\_REACHED|10|Cartesian torque limit reached| +|ENTERING\_PROTECTION\_ZONE|11|The arm is entering a protection zone| +|WAYPOINT\_REACHED|12|Waypoint reached| +|TRAJECTORY\_OK|13|There is more trajectory notification| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/enums/ControlConfig/ControlMode.md b/api_cpp/doc/markdown/enums/ControlConfig/ControlMode.md index 1fb9b2cc..c421f191 100644 --- a/api_cpp/doc/markdown/enums/ControlConfig/ControlMode.md +++ b/api_cpp/doc/markdown/enums/ControlConfig/ControlMode.md @@ -16,6 +16,7 @@ Enumeration ControlMode |NULL\_SPACE\_ADMITTANCE|8|Null space mode| |FORCE\_CONTROL|10|Force control mode| |FORCE\_CONTROL\_MOTION\_RESTRICTED|11|Force control motion restricted mode| +|CARTESIAN\_WAYPOINT\_TRAJECTORY|12|Cartesian waypoint trajectory mode| |IDLE|13|Idle| **Parent topic:** [ControlConfig \(C++\)](../../summary_pages/ControlConfig.md) diff --git a/api_cpp/doc/markdown/index.md b/api_cpp/doc/markdown/index.md index 5c7a512a..28ce1894 100644 --- a/api_cpp/doc/markdown/index.md +++ b/api_cpp/doc/markdown/index.md @@ -49,6 +49,7 @@ - [class ActuatorInformation](messages/Base/ActuatorInformation.md) - [class Admittance](messages/Base/Admittance.md) - [class AdvancedSequenceHandle](messages/Base/AdvancedSequenceHandle.md) + - [class AngularWaypoint](messages/Base/AngularWaypoint.md) - [class AppendActionInformation](messages/Base/AppendActionInformation.md) - [class ArmStateInformation](messages/Base/ArmStateInformation.md) - [class ArmStateNotification](messages/Base/ArmStateNotification.md) @@ -62,6 +63,7 @@ - [class CartesianLimitationList](messages/Base/CartesianLimitationList.md) - [class CartesianSpeed](messages/Base/CartesianSpeed.md) - [class CartesianTrajectoryConstraint](messages/Base/CartesianTrajectoryConstraint.md) + - [class CartesianWaypoint](messages/Base/CartesianWaypoint.md) - [class ChangeJointSpeeds](messages/Base/ChangeJointSpeeds.md) - [class ChangeTwist](messages/Base/ChangeTwist.md) - [class ChangeWrench](messages/Base/ChangeWrench.md) @@ -96,10 +98,15 @@ - [class FirmwareComponentVersion](messages/Base/FirmwareComponentVersion.md) - [class FullIPv4Configuration](messages/Base/FullIPv4Configuration.md) - [class FullUserProfile](messages/Base/FullUserProfile.md) + - [class GpioCommand](messages/Base/GpioCommand.md) + - [class GpioConfiguration](messages/Base/GpioConfiguration.md) + - [class GpioConfigurationList](messages/Base/GpioConfigurationList.md) - [class GpioEvent](messages/Base/GpioEvent.md) + - [class GpioPinConfiguration](messages/Base/GpioPinConfiguration.md) - [class Gripper](messages/Base/Gripper.md) - [class GripperCommand](messages/Base/GripperCommand.md) - [class GripperRequest](messages/Base/GripperRequest.md) + - [class IKData](messages/Base/IKData.md) - [class IPv4Configuration](messages/Base/IPv4Configuration.md) - [class IPv4Information](messages/Base/IPv4Information.md) - [class JointAngle](messages/Base/JointAngle.md) @@ -111,6 +118,7 @@ - [class JointTorques](messages/Base/JointTorques.md) - [class JointTrajectoryConstraint](messages/Base/JointTrajectoryConstraint.md) - [class JointsLimitationsList](messages/Base/JointsLimitationsList.md) + - [class KinematicTrajectoryConstraints](messages/Base/KinematicTrajectoryConstraints.md) - [class Map](messages/Base/Map.md) - [class MapElement](messages/Base/MapElement.md) - [class MapEvent](messages/Base/MapEvent.md) @@ -175,6 +183,7 @@ - [class Timeout](messages/Base/Timeout.md) - [class TrajectoryErrorElement](messages/Base/TrajectoryErrorElement.md) - [class TrajectoryErrorReport](messages/Base/TrajectoryErrorReport.md) + - [class TrajectoryInfo](messages/Base/TrajectoryInfo.md) - [class TransformationMatrix](messages/Base/TransformationMatrix.md) - [class TransformationRow](messages/Base/TransformationRow.md) - [class Twist](messages/Base/Twist.md) @@ -185,6 +194,9 @@ - [class UserNotificationList](messages/Base/UserNotificationList.md) - [class UserProfile](messages/Base/UserProfile.md) - [class UserProfileList](messages/Base/UserProfileList.md) + - [class Waypoint](messages/Base/Waypoint.md) + - [class WaypointList](messages/Base/WaypointList.md) + - [class WaypointValidationReport](messages/Base/WaypointValidationReport.md) - [class WifiConfiguration](messages/Base/WifiConfiguration.md) - [class WifiConfigurationList](messages/Base/WifiConfigurationList.md) - [class WifiInformation](messages/Base/WifiInformation.md) @@ -210,7 +222,9 @@ - [enum EventIdSequenceInfoNotification](enums/Base/EventIdSequenceInfoNotification.md) - [enum FactoryEvent](enums/Base/FactoryEvent.md) - [enum Gen3GpioPinId](enums/Base/Gen3GpioPinId.md) + - [enum GpioAction](enums/Base/GpioAction.md) - [enum GpioBehavior](enums/Base/GpioBehavior.md) + - [enum GpioPinPropertyFlags](enums/Base/GpioPinPropertyFlags.md) - [enum GripperMode](enums/Base/GripperMode.md) - [enum JointNavigationDirection](enums/Base/JointNavigationDirection.md) - [enum JointTrajectoryConstraintType](enums/Base/JointTrajectoryConstraintType.md) @@ -232,6 +246,7 @@ - [enum TrajectoryContinuityMode](enums/Base/TrajectoryContinuityMode.md) - [enum TrajectoryErrorIdentifier](enums/Base/TrajectoryErrorIdentifier.md) - [enum TrajectoryErrorType](enums/Base/TrajectoryErrorType.md) + - [enum TrajectoryInfoType](enums/Base/TrajectoryInfoType.md) - [enum UserEvent](enums/Base/UserEvent.md) - [enum WifiEncryptionType](enums/Base/WifiEncryptionType.md) - [enum WifiSecurityType](enums/Base/WifiSecurityType.md) @@ -279,6 +294,7 @@ - [class CartesianTransform](messages/ControlConfig/CartesianTransform.md) - [class ControlConfigurationNotification](messages/ControlConfig/ControlConfigurationNotification.md) - [class ControlModeInformation](messages/ControlConfig/ControlModeInformation.md) + - [class ControlModeNotification](messages/ControlConfig/ControlModeNotification.md) - [class DesiredSpeeds](messages/ControlConfig/DesiredSpeeds.md) - [class GravityVector](messages/ControlConfig/GravityVector.md) - [class JointAccelerationSoftLimits](messages/ControlConfig/JointAccelerationSoftLimits.md) diff --git a/api_cpp/doc/markdown/messages/ActuatorConfig/AxisOffsets.md b/api_cpp/doc/markdown/messages/ActuatorConfig/AxisOffsets.md index 9c1ac096..bd925c49 100644 --- a/api_cpp/doc/markdown/messages/ActuatorConfig/AxisOffsets.md +++ b/api_cpp/doc/markdown/messages/ActuatorConfig/AxisOffsets.md @@ -4,8 +4,8 @@ |Member name|Data type|Description| |-----------|---------|-----------| -|absolute\_offset|float32|Absolute offset value \(meters\)| -|relative\_offset|float32|Relative offset value \(meters\)| +|absolute\_offset|float32|Absolute offset value \(degrees\)| +|relative\_offset|float32|Relative offset value \(degrees\)| **Member functions** diff --git a/api_cpp/doc/markdown/messages/ActuatorConfig/AxisPosition.md b/api_cpp/doc/markdown/messages/ActuatorConfig/AxisPosition.md index 64bafe00..97475cad 100644 --- a/api_cpp/doc/markdown/messages/ActuatorConfig/AxisPosition.md +++ b/api_cpp/doc/markdown/messages/ActuatorConfig/AxisPosition.md @@ -4,7 +4,7 @@ |Member name|Data type|Description| |-----------|---------|-----------| -|position|float32|Axis position \(meters\)| +|position|float32|Axis position \(degrees\)| **Member functions** diff --git a/api_cpp/doc/markdown/messages/Base/Action.md b/api_cpp/doc/markdown/messages/Base/Action.md index 7db3c46f..6d34e674 100644 --- a/api_cpp/doc/markdown/messages/Base/Action.md +++ b/api_cpp/doc/markdown/messages/Base/Action.md @@ -10,8 +10,8 @@ |send\_twist\_command|oneof:action\_parameters [TwistCommand](TwistCommand.md#)|Control the tool in velocity| |send\_wrench\_command|oneof:action\_parameters [WrenchCommand](WrenchCommand.md#)|Control the tool in force \(EXPERIMENTAL\)| |send\_joint\_speeds|oneof:action\_parameters [JointSpeeds](JointSpeeds.md#)|Action to control each joint speed| -|reach\_pose|oneof:action\_parameters [ConstrainedPose](ConstrainedPose.md#)|Reach a pose given Cartesian constraints.| -|reach\_joint\_angles|oneof:action\_parameters [ConstrainedJointAngles](ConstrainedJointAngles.md#)|Reach a series of joint angles given angular constraints.| +|reach\_pose|oneof:action\_parameters [ConstrainedPose](ConstrainedPose.md#)|Reach a pose given Cartesian constraints. This action will be deprecated in a future version and will be replaced by execute\_waypoint\_list.| +|reach\_joint\_angles|oneof:action\_parameters [ConstrainedJointAngles](ConstrainedJointAngles.md#)|Reach a series of joint angles given angular constraints. This action will be deprecated in a future version and will be replaced by execute\_waypoint\_list.| |toggle\_admittance\_mode|oneof:action\_parameters uint32|Enable or disable the admittance mode| |snapshot|oneof:action\_parameters [Snapshot](Snapshot.md#)|Take a snapshot of current robot position| |switch\_control\_mapping|oneof:action\_parameters [SwitchControlMapping](SwitchControlMapping.md#)|Switch the active controller map| @@ -25,8 +25,11 @@ |delay|oneof:action\_parameters [Delay](Delay.md#)|Apply a delay| |execute\_action|oneof:action\_parameters [ActionHandle](ActionHandle.md#)|Execute an existing action| |send\_gripper\_command|oneof:action\_parameters [GripperCommand](GripperCommand.md#)|Send a gripper command| +|send\_gpio\_command|oneof:action\_parameters [GpioCommand](GpioCommand.md#)|Send a gpio command \(not implemented yet\)| |stop\_action|oneof:action\_parameters [Stop](Stop.md#)|Stop movement| |play\_pre\_computed\_trajectory|oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#)|Play a pre-computed joint trajectory| +|execute\_sequence|oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)|Execute an existing sequence| +|execute\_waypoint\_list|oneof:action\_parameters [WaypointList](WaypointList.md#)|Execute a trajectory defined by a series of waypoints| **Member functions** @@ -153,6 +156,12 @@ |clear\_send\_gripper\_command\(\)|void|void|Nothing will be changed if the oneof case is not kSend\_gripper\_command. If the oneof case equals kSend\_gripper\_command, frees the field and clears the oneof case. has\_send\_gripper\_command\(\) will return false, send\_gripper\_command\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| |set\_allocated\_send\_gripper\_command\(\)|void|oneof:action\_parameters [GripperCommand](GripperCommand.md#)\*|Calls clear\_action\_parameters\(\). If the oneof:action\_parameters [GripperCommand](GripperCommand.md#) pointer is not NULL: Sets the oneof:action\_parameters [GripperCommand](GripperCommand.md#) object to the field and sets the oneof case to kSend\_gripper\_command. The message takes ownership of the allocated oneof:action\_parameters [GripperCommand](GripperCommand.md#) object, has\_send\_gripper\_command\(\) will return true and action\_parameters\_case\(\) will return kSend\_gripper\_command. If the pointer is NULL, has\_send\_gripper\_command\(\) will return false and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET. \(The behavior is like calling clear\_action\_parameters\(\)\)| |release\_send\_gripper\_command\(\)|oneof:action\_parameters [GripperCommand](GripperCommand.md#)\*|void|Returns NULL if oneof case is not kSend\_gripper\_command. If the oneof case is kSend\_gripper\_command, clears the oneof case, releases the ownership of the field and returns the pointer of the action\_parameters object. After calling this, caller takes the ownership of the allocated action\_parameters object, has\_send\_gripper\_command\(\) will return false, send\_gripper\_command\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|has\_send\_gpio\_command\(\) const|void|void|Returns the current value of the field if oneof case is kSend\_gpio\_command. Otherwise, returns oneof:action\_parameters [GpioCommand](GpioCommand.md#)::default\_instance\(\)| +|send\_gpio\_command\(\) const|const oneof:action\_parameters [GpioCommand](GpioCommand.md#)&|void|Returns the current value of the field if oneof case is kSend\_gpio\_command| +|mutable\_send\_gpio\_command\(\)|oneof:action\_parameters [GpioCommand](GpioCommand.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_action\_parameters\(\). Sets the oneof case to kSend\_gpio\_command and returns a pointer to the mutable oneof:action\_parameters [GpioCommand](GpioCommand.md#) object that stores the field's value. If the oneof case was not kSend\_gpio\_command prior to the call, then the returned oneof:action\_parameters [GpioCommand](GpioCommand.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:action\_parameters [GpioCommand](GpioCommand.md#)\). After calling this, has\_send\_gpio\_command\(\) will return true, send\_gpio\_command\(\) will return a reference to the same instance of oneof:action\_parameters [GpioCommand](GpioCommand.md#) and action\_parameters\_case\(\) will return kSend\_gpio\_command| +|clear\_send\_gpio\_command\(\)|void|void|Nothing will be changed if the oneof case is not kSend\_gpio\_command. If the oneof case equals kSend\_gpio\_command, frees the field and clears the oneof case. has\_send\_gpio\_command\(\) will return false, send\_gpio\_command\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|set\_allocated\_send\_gpio\_command\(\)|void|oneof:action\_parameters [GpioCommand](GpioCommand.md#)\*|Calls clear\_action\_parameters\(\). If the oneof:action\_parameters [GpioCommand](GpioCommand.md#) pointer is not NULL: Sets the oneof:action\_parameters [GpioCommand](GpioCommand.md#) object to the field and sets the oneof case to kSend\_gpio\_command. The message takes ownership of the allocated oneof:action\_parameters [GpioCommand](GpioCommand.md#) object, has\_send\_gpio\_command\(\) will return true and action\_parameters\_case\(\) will return kSend\_gpio\_command. If the pointer is NULL, has\_send\_gpio\_command\(\) will return false and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET. \(The behavior is like calling clear\_action\_parameters\(\)\)| +|release\_send\_gpio\_command\(\)|oneof:action\_parameters [GpioCommand](GpioCommand.md#)\*|void|Returns NULL if oneof case is not kSend\_gpio\_command. If the oneof case is kSend\_gpio\_command, clears the oneof case, releases the ownership of the field and returns the pointer of the action\_parameters object. After calling this, caller takes the ownership of the allocated action\_parameters object, has\_send\_gpio\_command\(\) will return false, send\_gpio\_command\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| |has\_stop\_action\(\) const|void|void|Returns the current value of the field if oneof case is kStop\_action. Otherwise, returns oneof:action\_parameters [Stop](Stop.md#)::default\_instance\(\)| |stop\_action\(\) const|const oneof:action\_parameters [Stop](Stop.md#)&|void|Returns the current value of the field if oneof case is kStop\_action| |mutable\_stop\_action\(\)|oneof:action\_parameters [Stop](Stop.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_action\_parameters\(\). Sets the oneof case to kStop\_action and returns a pointer to the mutable oneof:action\_parameters [Stop](Stop.md#) object that stores the field's value. If the oneof case was not kStop\_action prior to the call, then the returned oneof:action\_parameters [Stop](Stop.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:action\_parameters [Stop](Stop.md#)\). After calling this, has\_stop\_action\(\) will return true, stop\_action\(\) will return a reference to the same instance of oneof:action\_parameters [Stop](Stop.md#) and action\_parameters\_case\(\) will return kStop\_action| @@ -165,6 +174,18 @@ |clear\_play\_pre\_computed\_trajectory\(\)|void|void|Nothing will be changed if the oneof case is not kPlay\_pre\_computed\_trajectory. If the oneof case equals kPlay\_pre\_computed\_trajectory, frees the field and clears the oneof case. has\_play\_pre\_computed\_trajectory\(\) will return false, play\_pre\_computed\_trajectory\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| |set\_allocated\_play\_pre\_computed\_trajectory\(\)|void|oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#)\*|Calls clear\_action\_parameters\(\). If the oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#) pointer is not NULL: Sets the oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#) object to the field and sets the oneof case to kPlay\_pre\_computed\_trajectory. The message takes ownership of the allocated oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#) object, has\_play\_pre\_computed\_trajectory\(\) will return true and action\_parameters\_case\(\) will return kPlay\_pre\_computed\_trajectory. If the pointer is NULL, has\_play\_pre\_computed\_trajectory\(\) will return false and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET. \(The behavior is like calling clear\_action\_parameters\(\)\)| |release\_play\_pre\_computed\_trajectory\(\)|oneof:action\_parameters [PreComputedJointTrajectory](PreComputedJointTrajectory.md#)\*|void|Returns NULL if oneof case is not kPlay\_pre\_computed\_trajectory. If the oneof case is kPlay\_pre\_computed\_trajectory, clears the oneof case, releases the ownership of the field and returns the pointer of the action\_parameters object. After calling this, caller takes the ownership of the allocated action\_parameters object, has\_play\_pre\_computed\_trajectory\(\) will return false, play\_pre\_computed\_trajectory\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|has\_execute\_sequence\(\) const|void|void|Returns the current value of the field if oneof case is kExecute\_sequence. Otherwise, returns oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)::default\_instance\(\)| +|execute\_sequence\(\) const|const oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)&|void|Returns the current value of the field if oneof case is kExecute\_sequence| +|mutable\_execute\_sequence\(\)|oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_action\_parameters\(\). Sets the oneof case to kExecute\_sequence and returns a pointer to the mutable oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) object that stores the field's value. If the oneof case was not kExecute\_sequence prior to the call, then the returned oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)\). After calling this, has\_execute\_sequence\(\) will return true, execute\_sequence\(\) will return a reference to the same instance of oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) and action\_parameters\_case\(\) will return kExecute\_sequence| +|clear\_execute\_sequence\(\)|void|void|Nothing will be changed if the oneof case is not kExecute\_sequence. If the oneof case equals kExecute\_sequence, frees the field and clears the oneof case. has\_execute\_sequence\(\) will return false, execute\_sequence\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|set\_allocated\_execute\_sequence\(\)|void|oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)\*|Calls clear\_action\_parameters\(\). If the oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) pointer is not NULL: Sets the oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) object to the field and sets the oneof case to kExecute\_sequence. The message takes ownership of the allocated oneof:action\_parameters [SequenceHandle](SequenceHandle.md#) object, has\_execute\_sequence\(\) will return true and action\_parameters\_case\(\) will return kExecute\_sequence. If the pointer is NULL, has\_execute\_sequence\(\) will return false and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET. \(The behavior is like calling clear\_action\_parameters\(\)\)| +|release\_execute\_sequence\(\)|oneof:action\_parameters [SequenceHandle](SequenceHandle.md#)\*|void|Returns NULL if oneof case is not kExecute\_sequence. If the oneof case is kExecute\_sequence, clears the oneof case, releases the ownership of the field and returns the pointer of the action\_parameters object. After calling this, caller takes the ownership of the allocated action\_parameters object, has\_execute\_sequence\(\) will return false, execute\_sequence\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|has\_execute\_waypoint\_list\(\) const|void|void|Returns the current value of the field if oneof case is kExecute\_waypoint\_list. Otherwise, returns oneof:action\_parameters [WaypointList](WaypointList.md#)::default\_instance\(\)| +|execute\_waypoint\_list\(\) const|const oneof:action\_parameters [WaypointList](WaypointList.md#)&|void|Returns the current value of the field if oneof case is kExecute\_waypoint\_list| +|mutable\_execute\_waypoint\_list\(\)|oneof:action\_parameters [WaypointList](WaypointList.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_action\_parameters\(\). Sets the oneof case to kExecute\_waypoint\_list and returns a pointer to the mutable oneof:action\_parameters [WaypointList](WaypointList.md#) object that stores the field's value. If the oneof case was not kExecute\_waypoint\_list prior to the call, then the returned oneof:action\_parameters [WaypointList](WaypointList.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:action\_parameters [WaypointList](WaypointList.md#)\). After calling this, has\_execute\_waypoint\_list\(\) will return true, execute\_waypoint\_list\(\) will return a reference to the same instance of oneof:action\_parameters [WaypointList](WaypointList.md#) and action\_parameters\_case\(\) will return kExecute\_waypoint\_list| +|clear\_execute\_waypoint\_list\(\)|void|void|Nothing will be changed if the oneof case is not kExecute\_waypoint\_list. If the oneof case equals kExecute\_waypoint\_list, frees the field and clears the oneof case. has\_execute\_waypoint\_list\(\) will return false, execute\_waypoint\_list\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| +|set\_allocated\_execute\_waypoint\_list\(\)|void|oneof:action\_parameters [WaypointList](WaypointList.md#)\*|Calls clear\_action\_parameters\(\). If the oneof:action\_parameters [WaypointList](WaypointList.md#) pointer is not NULL: Sets the oneof:action\_parameters [WaypointList](WaypointList.md#) object to the field and sets the oneof case to kExecute\_waypoint\_list. The message takes ownership of the allocated oneof:action\_parameters [WaypointList](WaypointList.md#) object, has\_execute\_waypoint\_list\(\) will return true and action\_parameters\_case\(\) will return kExecute\_waypoint\_list. If the pointer is NULL, has\_execute\_waypoint\_list\(\) will return false and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET. \(The behavior is like calling clear\_action\_parameters\(\)\)| +|release\_execute\_waypoint\_list\(\)|oneof:action\_parameters [WaypointList](WaypointList.md#)\*|void|Returns NULL if oneof case is not kExecute\_waypoint\_list. If the oneof case is kExecute\_waypoint\_list, clears the oneof case, releases the ownership of the field and returns the pointer of the action\_parameters object. After calling this, caller takes the ownership of the allocated action\_parameters object, has\_execute\_waypoint\_list\(\) will return false, execute\_waypoint\_list\(\) will return the default value and action\_parameters\_case\(\) will return ACTION\_PARAMETERS\_NOT\_SET.| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/messages/Base/ActionNotification.md b/api_cpp/doc/markdown/messages/Base/ActionNotification.md index e11cdfc2..a13c8605 100644 --- a/api_cpp/doc/markdown/messages/Base/ActionNotification.md +++ b/api_cpp/doc/markdown/messages/Base/ActionNotification.md @@ -10,6 +10,7 @@ |user\_handle| [UserProfileHandle](../Common/UserProfileHandle.md#)|User that caused the action event| |abort\_details|uint32|Details if action\_event is equal to ACTION\_ABORT| |connection| [Connection](../Common/Connection.md#)|Connection that caused the action event| +|trajectory\_info| [TrajectoryInfo](TrajectoryInfo.md#)|Additional information from the current action| **Member functions** @@ -45,6 +46,13 @@ |clear\_connection\(\)|void|void|Clears the value of the field. After calling this, has\_connection\(\) will return false and connection\(\) will return the default value.| |set\_allocated\_connection\(\)|void| [Connection](../Common/Connection.md#) \*|Sets the [Connection](../Common/Connection.md#) object to the field and frees the previous field value if it exists. If the [Connection](../Common/Connection.md#) pointer is not NULL, the message takes ownership of the allocated [Connection](../Common/Connection.md#) object and has\_ [Connection](../Common/Connection.md#)\(\) will return true. Otherwise, if the connection is NULL, the behavior is the same as calling clear\_connection\(\).| |release\_connection\(\)| [Connection](../Common/Connection.md#) \*|void|Releases the ownership of the field and returns the pointer of the [Connection](../Common/Connection.md#) object. After calling this, caller takes the ownership of the allocated [Connection](../Common/Connection.md#) object, has\_connection\(\) will return false, and connection\(\) will return the default value.| +|trajectory\_info\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|trajectory\_info\(\) const|const [TrajectoryInfo](TrajectoryInfo.md#)|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, trajectory\_info\_size\(\)\) yields undefined behavior.| +|mutable\_trajectory\_info\(\)| [TrajectoryInfo](TrajectoryInfo.md#)\*|int index|Returns a pointer to the mutable [TrajectoryInfo](TrajectoryInfo.md#) object that stores the value of the element at the given zero-based index. Calling this method with index outside of \[0, trajectory\_info\_size\(\)\) yields undefined behavior.| +|add\_trajectory\_info\(\)| [TrajectoryInfo](TrajectoryInfo.md#)\*|void|Adds a new element and returns a pointer to it. The returned [TrajectoryInfo](TrajectoryInfo.md#) is mutable and will have none of its fields set \(i.e. it will be identical to a newly-allocated [TrajectoryInfo](TrajectoryInfo.md#)\).| +|clear\_trajectory\_info\(\)|void|void|Removes all elements from the field. After calling this, trajectory\_info\_size\(\) will return zero.| +|trajectory\_info\(\) const|const RepeatedPtrField< [TrajectoryInfo](TrajectoryInfo.md#)\>&|void|Returns the underlying RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_trajectory\_info\(\)|RepeatedPtrField< [TrajectoryInfo](TrajectoryInfo.md#)\>\*|void|Returns a pointer to the underlying mutable RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/messages/Base/AngularWaypoint.md b/api_cpp/doc/markdown/messages/Base/AngularWaypoint.md new file mode 100644 index 00000000..1cde19fc --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/AngularWaypoint.md @@ -0,0 +1,34 @@ +# class AngularWaypoint + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|angles|float32|Target position \(in deg\)| +|maximum\_velocities|float32|Maximum velocities for each actuator \(in deg/s\) during movement \(optional\)| +|duration|float32|Duration to reach this waypoint from the previous position \(in seconds\)| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|angles\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|angles\(\) const|int|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, angles\_size\(\)\) yields undefined behavior.| +|set\_angles\(\)|void|\(int index, int32 value\)|Sets the value of the element at the given zero-based index.| +|add\_angles\(\)|void|\(int32 value\)|Appends a new element to the field with the given value.| +|clear\_angles\(\)|void|void|Removes all elements from the field. After calling this, angles\_size\(\) will return zero.| +|angles\(\) const|const RepeatedField&|void|Returns the underlying RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_angles\(\)|RepeatedField\*|void|Returns a pointer to the underlying mutable RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|maximum\_velocities\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|maximum\_velocities\(\) const|int|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, maximum\_velocities\_size\(\)\) yields undefined behavior.| +|set\_maximum\_velocities\(\)|void|\(int index, int32 value\)|Sets the value of the element at the given zero-based index.| +|add\_maximum\_velocities\(\)|void|\(int32 value\)|Appends a new element to the field with the given value.| +|clear\_maximum\_velocities\(\)|void|void|Removes all elements from the field. After calling this, maximum\_velocities\_size\(\) will return zero.| +|maximum\_velocities\(\) const|const RepeatedField&|void|Returns the underlying RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_maximum\_velocities\(\)|RepeatedField\*|void|Returns a pointer to the underlying mutable RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|duration\(\)|float32|void|Returns the current value of duration. If the duration is not set, returns 0.| +|set\_duration\(\)|void|float32|Sets the value of duration. After calling this, duration\(\) will return value.| +|clear\_duration\(\)|void|void|Clears the value of duration. After calling this, duration\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/CartesianWaypoint.md b/api_cpp/doc/markdown/messages/Base/CartesianWaypoint.md new file mode 100644 index 00000000..762d6f37 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/CartesianWaypoint.md @@ -0,0 +1,37 @@ +# class CartesianWaypoint + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|pose| [Pose](Pose.md#)|Target Cartesian Pose| +|reference\_frame|uint32|The reference frame used for the goal Pose| +|maximum\_linear\_velocity|float32|Maximum linear velocity \(in m/s\) during movement \(optional\)| +|maximum\_angular\_velocity|float32|Maximum angular velocity \(in deg/s\) during movement \(optional\)| +|blending\_radius|float32|Blending radius \(in m\) to use for the movement \(if this waypoint is not an endpoint\).| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|has\_pose\(\) const|bool|void|Returns true if pose is set.| +|pose\(\)|const [Pose](Pose.md#)&|void|Returns the current value of pose. If pose is not set, returns a [Pose](Pose.md#) with none of its fields set \(possibly pose::default\_instance\(\)\).| +|mutable\_pose\(\)| [Pose](Pose.md#) \*|void|Returns a pointer to the mutable [Pose](Pose.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [Pose](Pose.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [Pose](Pose.md#)\). After calling this, has\_pose\(\) will return true and pose\(\) will return a reference to the same instance of [Pose](Pose.md#).| +|clear\_pose\(\)|void|void|Clears the value of the field. After calling this, has\_pose\(\) will return false and pose\(\) will return the default value.| +|set\_allocated\_pose\(\)|void| [Pose](Pose.md#) \*|Sets the [Pose](Pose.md#) object to the field and frees the previous field value if it exists. If the [Pose](Pose.md#) pointer is not NULL, the message takes ownership of the allocated [Pose](Pose.md#) object and has\_ [Pose](Pose.md#)\(\) will return true. Otherwise, if the pose is NULL, the behavior is the same as calling clear\_pose\(\).| +|release\_pose\(\)| [Pose](Pose.md#) \*|void|Releases the ownership of the field and returns the pointer of the [Pose](Pose.md#) object. After calling this, caller takes the ownership of the allocated [Pose](Pose.md#) object, has\_pose\(\) will return false, and pose\(\) will return the default value.| +|reference\_frame\(\) const|uint32|void|Returns the current value of reference\_frame. If the reference\_frame is not set, returns 0.| +|set\_reference\_frame\(\)|void|uint32|Sets the value of reference\_frame. After calling this, reference\_frame\(\) will return value.| +|clear\_reference\_frame\(\)|void|void|Clears the value of reference\_frame. After calling this, reference\_frame\(\) will return the empty string/empty bytes.| +|maximum\_linear\_velocity\(\)|float32|void|Returns the current value of maximum\_linear\_velocity. If the maximum\_linear\_velocity is not set, returns 0.| +|set\_maximum\_linear\_velocity\(\)|void|float32|Sets the value of maximum\_linear\_velocity. After calling this, maximum\_linear\_velocity\(\) will return value.| +|clear\_maximum\_linear\_velocity\(\)|void|void|Clears the value of maximum\_linear\_velocity. After calling this, maximum\_linear\_velocity\(\) will return 0.| +|maximum\_angular\_velocity\(\)|float32|void|Returns the current value of maximum\_angular\_velocity. If the maximum\_angular\_velocity is not set, returns 0.| +|set\_maximum\_angular\_velocity\(\)|void|float32|Sets the value of maximum\_angular\_velocity. After calling this, maximum\_angular\_velocity\(\) will return value.| +|clear\_maximum\_angular\_velocity\(\)|void|void|Clears the value of maximum\_angular\_velocity. After calling this, maximum\_angular\_velocity\(\) will return 0.| +|blending\_radius\(\)|float32|void|Returns the current value of blending\_radius. If the blending\_radius is not set, returns 0.| +|set\_blending\_radius\(\)|void|float32|Sets the value of blending\_radius. After calling this, blending\_radius\(\) will return value.| +|clear\_blending\_radius\(\)|void|void|Clears the value of blending\_radius. After calling this, blending\_radius\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/GpioCommand.md b/api_cpp/doc/markdown/messages/Base/GpioCommand.md new file mode 100644 index 00000000..bcbfe458 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/GpioCommand.md @@ -0,0 +1,30 @@ +# class GpioCommand + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|port\_identifier|uint32|Gpio port identifier \(0 == base expansion port\)| +|pin\_identifier|uint32|Gpio pin identifier| +|action|uint32|Action to perform on gpio| +|period|uint32|Period, in ms, of GPIO action \(applicable only for pulse commands\)| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|port\_identifier\(\)|uint32|void|Returns the current value of port\_identifier. If the port\_identifier is not set, returns 0.| +|set\_port\_identifier\(\)|void|uint32|Sets the value of port\_identifier. After calling this, port\_identifier\(\) will return value.| +|clear\_port\_identifier\(\)|void|void|Clears the value of port\_identifier. After calling this, port\_identifier\(\) will return 0.| +|pin\_identifier\(\)|uint32|void|Returns the current value of pin\_identifier. If the pin\_identifier is not set, returns 0.| +|set\_pin\_identifier\(\)|void|uint32|Sets the value of pin\_identifier. After calling this, pin\_identifier\(\) will return value.| +|clear\_pin\_identifier\(\)|void|void|Clears the value of pin\_identifier. After calling this, pin\_identifier\(\) will return 0.| +|action\(\) const|uint32|void|Returns the current value of action. If the action is not set, returns 0.| +|set\_action\(\)|void|uint32|Sets the value of action. After calling this, action\(\) will return value.| +|clear\_action\(\)|void|void|Clears the value of action. After calling this, action\(\) will return the empty string/empty bytes.| +|period\(\)|uint32|void|Returns the current value of period. If the period is not set, returns 0.| +|set\_period\(\)|void|uint32|Sets the value of period. After calling this, period\(\) will return value.| +|clear\_period\(\)|void|void|Clears the value of period. After calling this, period\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/GpioConfiguration.md b/api_cpp/doc/markdown/messages/Base/GpioConfiguration.md new file mode 100644 index 00000000..5850f14c --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/GpioConfiguration.md @@ -0,0 +1,26 @@ +# class GpioConfiguration + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|port\_number|uint32|Port number \(Base extension port is port 0\)| +|pin\_configurations| [GpioPinConfiguration](GpioPinConfiguration.md#)|Pin configuration list| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|port\_number\(\)|uint32|void|Returns the current value of port\_number. If the port\_number is not set, returns 0.| +|set\_port\_number\(\)|void|uint32|Sets the value of port\_number. After calling this, port\_number\(\) will return value.| +|clear\_port\_number\(\)|void|void|Clears the value of port\_number. After calling this, port\_number\(\) will return 0.| +|pin\_configurations\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|pin\_configurations\(\) const|const [GpioPinConfiguration](GpioPinConfiguration.md#)|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, pin\_configurations\_size\(\)\) yields undefined behavior.| +|mutable\_pin\_configurations\(\)| [GpioPinConfiguration](GpioPinConfiguration.md#)\*|int index|Returns a pointer to the mutable [GpioPinConfiguration](GpioPinConfiguration.md#) object that stores the value of the element at the given zero-based index. Calling this method with index outside of \[0, pin\_configurations\_size\(\)\) yields undefined behavior.| +|add\_pin\_configurations\(\)| [GpioPinConfiguration](GpioPinConfiguration.md#)\*|void|Adds a new element and returns a pointer to it. The returned [GpioPinConfiguration](GpioPinConfiguration.md#) is mutable and will have none of its fields set \(i.e. it will be identical to a newly-allocated [GpioPinConfiguration](GpioPinConfiguration.md#)\).| +|clear\_pin\_configurations\(\)|void|void|Removes all elements from the field. After calling this, pin\_configurations\_size\(\) will return zero.| +|pin\_configurations\(\) const|const RepeatedPtrField< [GpioPinConfiguration](GpioPinConfiguration.md#)\>&|void|Returns the underlying RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_pin\_configurations\(\)|RepeatedPtrField< [GpioPinConfiguration](GpioPinConfiguration.md#)\>\*|void|Returns a pointer to the underlying mutable RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/GpioConfigurationList.md b/api_cpp/doc/markdown/messages/Base/GpioConfigurationList.md new file mode 100644 index 00000000..4899c535 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/GpioConfigurationList.md @@ -0,0 +1,22 @@ +# class GpioConfigurationList + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|port\_configurations| [GpioConfiguration](GpioConfiguration.md#)|Port configuration list| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|port\_configurations\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|port\_configurations\(\) const|const [GpioConfiguration](GpioConfiguration.md#)|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, port\_configurations\_size\(\)\) yields undefined behavior.| +|mutable\_port\_configurations\(\)| [GpioConfiguration](GpioConfiguration.md#)\*|int index|Returns a pointer to the mutable [GpioConfiguration](GpioConfiguration.md#) object that stores the value of the element at the given zero-based index. Calling this method with index outside of \[0, port\_configurations\_size\(\)\) yields undefined behavior.| +|add\_port\_configurations\(\)| [GpioConfiguration](GpioConfiguration.md#)\*|void|Adds a new element and returns a pointer to it. The returned [GpioConfiguration](GpioConfiguration.md#) is mutable and will have none of its fields set \(i.e. it will be identical to a newly-allocated [GpioConfiguration](GpioConfiguration.md#)\).| +|clear\_port\_configurations\(\)|void|void|Removes all elements from the field. After calling this, port\_configurations\_size\(\) will return zero.| +|port\_configurations\(\) const|const RepeatedPtrField< [GpioConfiguration](GpioConfiguration.md#)\>&|void|Returns the underlying RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_port\_configurations\(\)|RepeatedPtrField< [GpioConfiguration](GpioConfiguration.md#)\>\*|void|Returns a pointer to the underlying mutable RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/GpioPinConfiguration.md b/api_cpp/doc/markdown/messages/Base/GpioPinConfiguration.md new file mode 100644 index 00000000..574c84c7 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/GpioPinConfiguration.md @@ -0,0 +1,30 @@ +# class GpioPinConfiguration + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|pin\_id|uint32|Pin identifier| +|pin\_property|uint32|Pin property \(read only\)| +|output\_enable|bool|Pin is configured as output if set to TRUE. If output is enabled, input events are masked.| +|default\_output\_value|bool|Default output pin value. This is the value set when pin is initialized \(TRUE == high / FALSE == low\).| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|pin\_id\(\)|uint32|void|Returns the current value of pin\_id. If the pin\_id is not set, returns 0.| +|set\_pin\_id\(\)|void|uint32|Sets the value of pin\_id. After calling this, pin\_id\(\) will return value.| +|clear\_pin\_id\(\)|void|void|Clears the value of pin\_id. After calling this, pin\_id\(\) will return 0.| +|pin\_property\(\) const|uint32|void|Returns the current value of pin\_property. If the pin\_property is not set, returns 0.| +|set\_pin\_property\(\)|void|uint32|Sets the value of pin\_property. After calling this, pin\_property\(\) will return value.| +|clear\_pin\_property\(\)|void|void|Clears the value of pin\_property. After calling this, pin\_property\(\) will return the empty string/empty bytes.| +|output\_enable\(\)|bool|void|Returns the current value of output\_enable. If the output\_enable is not set, returns 0.| +|set\_output\_enable\(\)|void|bool|Sets the value of output\_enable. After calling this, output\_enable\(\) will return value.| +|clear\_output\_enable\(\)|void|void|Clears the value of output\_enable. After calling this, output\_enable\(\) will return 0.| +|default\_output\_value\(\)|bool|void|Returns the current value of default\_output\_value. If the default\_output\_value is not set, returns 0.| +|set\_default\_output\_value\(\)|void|bool|Sets the value of default\_output\_value. After calling this, default\_output\_value\(\) will return value.| +|clear\_default\_output\_value\(\)|void|void|Clears the value of default\_output\_value. After calling this, default\_output\_value\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/IKData.md b/api_cpp/doc/markdown/messages/Base/IKData.md new file mode 100644 index 00000000..2e7f35e4 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/IKData.md @@ -0,0 +1,28 @@ +# class IKData + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|cartesian\_pose| [Pose](Pose.md#)|Cartesian pose of the end effector used to calculate the corresponding joint angles| +|guess| [JointAngles](JointAngles.md#)|Initial guess for the joint angles| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|has\_cartesian\_pose\(\) const|bool|void|Returns true if cartesian\_pose is set.| +|cartesian\_pose\(\)|const [Pose](Pose.md#)&|void|Returns the current value of cartesian\_pose. If cartesian\_pose is not set, returns a [Pose](Pose.md#) with none of its fields set \(possibly cartesian\_pose::default\_instance\(\)\).| +|mutable\_cartesian\_pose\(\)| [Pose](Pose.md#) \*|void|Returns a pointer to the mutable [Pose](Pose.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [Pose](Pose.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [Pose](Pose.md#)\). After calling this, has\_cartesian\_pose\(\) will return true and cartesian\_pose\(\) will return a reference to the same instance of [Pose](Pose.md#).| +|clear\_cartesian\_pose\(\)|void|void|Clears the value of the field. After calling this, has\_cartesian\_pose\(\) will return false and cartesian\_pose\(\) will return the default value.| +|set\_allocated\_cartesian\_pose\(\)|void| [Pose](Pose.md#) \*|Sets the [Pose](Pose.md#) object to the field and frees the previous field value if it exists. If the [Pose](Pose.md#) pointer is not NULL, the message takes ownership of the allocated [Pose](Pose.md#) object and has\_ [Pose](Pose.md#)\(\) will return true. Otherwise, if the cartesian\_pose is NULL, the behavior is the same as calling clear\_cartesian\_pose\(\).| +|release\_cartesian\_pose\(\)| [Pose](Pose.md#) \*|void|Releases the ownership of the field and returns the pointer of the [Pose](Pose.md#) object. After calling this, caller takes the ownership of the allocated [Pose](Pose.md#) object, has\_cartesian\_pose\(\) will return false, and cartesian\_pose\(\) will return the default value.| +|has\_guess\(\) const|bool|void|Returns true if guess is set.| +|guess\(\)|const [JointAngles](JointAngles.md#)&|void|Returns the current value of guess. If guess is not set, returns a [JointAngles](JointAngles.md#) with none of its fields set \(possibly guess::default\_instance\(\)\).| +|mutable\_guess\(\)| [JointAngles](JointAngles.md#) \*|void|Returns a pointer to the mutable [JointAngles](JointAngles.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [JointAngles](JointAngles.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [JointAngles](JointAngles.md#)\). After calling this, has\_guess\(\) will return true and guess\(\) will return a reference to the same instance of [JointAngles](JointAngles.md#).| +|clear\_guess\(\)|void|void|Clears the value of the field. After calling this, has\_guess\(\) will return false and guess\(\) will return the default value.| +|set\_allocated\_guess\(\)|void| [JointAngles](JointAngles.md#) \*|Sets the [JointAngles](JointAngles.md#) object to the field and frees the previous field value if it exists. If the [JointAngles](JointAngles.md#) pointer is not NULL, the message takes ownership of the allocated [JointAngles](JointAngles.md#) object and has\_ [JointAngles](JointAngles.md#)\(\) will return true. Otherwise, if the guess is NULL, the behavior is the same as calling clear\_guess\(\).| +|release\_guess\(\)| [JointAngles](JointAngles.md#) \*|void|Releases the ownership of the field and returns the pointer of the [JointAngles](JointAngles.md#) object. After calling this, caller takes the ownership of the allocated [JointAngles](JointAngles.md#) object, has\_guess\(\) will return false, and guess\(\) will return the default value.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/KinematicTrajectoryConstraints.md b/api_cpp/doc/markdown/messages/Base/KinematicTrajectoryConstraints.md new file mode 100644 index 00000000..5b217dcd --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/KinematicTrajectoryConstraints.md @@ -0,0 +1,30 @@ +# class KinematicTrajectoryConstraints + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|angular\_velocities|float32|Angular velocities for each actuator \(in deg/s\)| +|linear\_velocity|float32|Linear velocity \(in m/s\)| +|angular\_velocity|float32|Angular velocity \(in deg/s\)| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|angular\_velocities\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|angular\_velocities\(\) const|int|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, angular\_velocities\_size\(\)\) yields undefined behavior.| +|set\_angular\_velocities\(\)|void|\(int index, int32 value\)|Sets the value of the element at the given zero-based index.| +|add\_angular\_velocities\(\)|void|\(int32 value\)|Appends a new element to the field with the given value.| +|clear\_angular\_velocities\(\)|void|void|Removes all elements from the field. After calling this, angular\_velocities\_size\(\) will return zero.| +|angular\_velocities\(\) const|const RepeatedField&|void|Returns the underlying RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_angular\_velocities\(\)|RepeatedField\*|void|Returns a pointer to the underlying mutable RepeatedField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|linear\_velocity\(\)|float32|void|Returns the current value of linear\_velocity. If the linear\_velocity is not set, returns 0.| +|set\_linear\_velocity\(\)|void|float32|Sets the value of linear\_velocity. After calling this, linear\_velocity\(\) will return value.| +|clear\_linear\_velocity\(\)|void|void|Clears the value of linear\_velocity. After calling this, linear\_velocity\(\) will return 0.| +|angular\_velocity\(\)|float32|void|Returns the current value of angular\_velocity. If the angular\_velocity is not set, returns 0.| +|set\_angular\_velocity\(\)|void|float32|Sets the value of angular\_velocity. After calling this, angular\_velocity\(\) will return value.| +|clear\_angular\_velocity\(\)|void|void|Clears the value of angular\_velocity. After calling this, angular\_velocity\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/MapEvent.md b/api_cpp/doc/markdown/messages/Base/MapEvent.md index 6cd7a66e..2506e3d1 100644 --- a/api_cpp/doc/markdown/messages/Base/MapEvent.md +++ b/api_cpp/doc/markdown/messages/Base/MapEvent.md @@ -5,7 +5,7 @@ |Member name|Data type|Description| |-----------|---------|-----------| |safety\_event|oneof:events [SafetyEvent](SafetyEvent.md#)|Mapped safety event \(not implemented yet\)| -|gpio\_event|oneof:events [GpioEvent](GpioEvent.md#)|Mapped GPIO event \(not implemented yet\)| +|gpio\_event|oneof:events [GpioEvent](GpioEvent.md#)|Mapped GPIO event| |controller\_event|oneof:events [ControllerEvent](ControllerEvent.md#)|Mapped controller event| |name|string|Map event friendly name| diff --git a/api_cpp/doc/markdown/messages/Base/TrajectoryErrorElement.md b/api_cpp/doc/markdown/messages/Base/TrajectoryErrorElement.md index 19955355..abdb68bb 100644 --- a/api_cpp/doc/markdown/messages/Base/TrajectoryErrorElement.md +++ b/api_cpp/doc/markdown/messages/Base/TrajectoryErrorElement.md @@ -5,12 +5,13 @@ |Member name|Data type|Description| |-----------|---------|-----------| |error\_type|uint32|Error type| -|error\_identifier|uint32|Error identifier| +|error\_identifier|uint32|This field is deprecated and will be removed in a future release.| |error\_value|float32|Erroneous value| |min\_value|float32|Minimum permitted value| |max\_value|float32|Maximum permitted value| |index|uint32|Actuator index| |message|string|Clarification message for the error| +|waypoint\_index|uint32|Waypoint index \(if it applies\)| **Member functions** @@ -42,6 +43,9 @@ |clear\_message\(\)|void|void|Clears the value of message. After calling this, message\(\) will return the empty string/empty bytes.| |set\_allocated\_message\(\)|void|string\*|Sets the string object to the field and frees the previous field value if it exists. If the string pointer is not NULL, the message takes ownership of the allocated string object. The message is free to delete the allocated string object at any time, so references to the object may be invalidated. Otherwise, if the value is NULL, the behavior is the same as calling clear\_message\(\).| |release\_message\(\)|string \*|void|Releases the ownership of message and returns the pointer of the string object. After calling this, caller takes the ownership of the allocated string object and message\(\) will return the empty string/empty bytes.| +|waypoint\_index\(\)|uint32|void|Returns the current value of waypoint\_index. If the waypoint\_index is not set, returns 0.| +|set\_waypoint\_index\(\)|void|uint32|Sets the value of waypoint\_index. After calling this, waypoint\_index\(\) will return value.| +|clear\_waypoint\_index\(\)|void|void|Clears the value of waypoint\_index. After calling this, waypoint\_index\(\) will return 0.| **Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) diff --git a/api_cpp/doc/markdown/messages/Base/TrajectoryInfo.md b/api_cpp/doc/markdown/messages/Base/TrajectoryInfo.md new file mode 100644 index 00000000..dfcea022 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/TrajectoryInfo.md @@ -0,0 +1,26 @@ +# class TrajectoryInfo + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|trajectory\_info\_type|uint32|Trajectory information type| +|waypoint\_index|uint32|Waypoint index \(if applicable\)| +|joint\_index|uint32|Joint index \(if applicable\)| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|trajectory\_info\_type\(\) const|uint32|void|Returns the current value of trajectory\_info\_type. If the trajectory\_info\_type is not set, returns 0.| +|set\_trajectory\_info\_type\(\)|void|uint32|Sets the value of trajectory\_info\_type. After calling this, trajectory\_info\_type\(\) will return value.| +|clear\_trajectory\_info\_type\(\)|void|void|Clears the value of trajectory\_info\_type. After calling this, trajectory\_info\_type\(\) will return the empty string/empty bytes.| +|waypoint\_index\(\)|uint32|void|Returns the current value of waypoint\_index. If the waypoint\_index is not set, returns 0.| +|set\_waypoint\_index\(\)|void|uint32|Sets the value of waypoint\_index. After calling this, waypoint\_index\(\) will return value.| +|clear\_waypoint\_index\(\)|void|void|Clears the value of waypoint\_index. After calling this, waypoint\_index\(\) will return 0.| +|joint\_index\(\)|uint32|void|Returns the current value of joint\_index. If the joint\_index is not set, returns 0.| +|set\_joint\_index\(\)|void|uint32|Sets the value of joint\_index. After calling this, joint\_index\(\) will return value.| +|clear\_joint\_index\(\)|void|void|Clears the value of joint\_index. After calling this, joint\_index\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/Waypoint.md b/api_cpp/doc/markdown/messages/Base/Waypoint.md new file mode 100644 index 00000000..b9abef70 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/Waypoint.md @@ -0,0 +1,37 @@ +# class Waypoint + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|name|string|Waypoint friendly name| +|angular\_waypoint|oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)| | +|cartesian\_waypoint|oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)| | + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|name\(\)|const string&|void|Returns the current value of name. If name is not set, returns the empty string/empty bytes.| +|set\_name\(\)|void|const string&|Sets the value of name. After calling this, name\(\) will return a copy of value.| +|set\_name\(\)|void|string&&|\(C++11 and beyond\): Sets the value of name, moving from the passed string. After calling this, name\(\) will return a copy of value.| +|set\_name\(\)|void|const char\*|Sets the value of name using a C-style null-terminated string. After calling this, name\(\) will return a copy of value.| +|mutable\_name\(\)|string \*|void|Returns a pointer to the mutable string object that stores name's value. If the field was not set prior to the call, then the returned string will be empty. After calling this, name\(\) will return whatever value is written into the given string.| +|clear\_name\(\)|void|void|Clears the value of name. After calling this, name\(\) will return the empty string/empty bytes.| +|set\_allocated\_name\(\)|void|string\*|Sets the string object to the field and frees the previous field value if it exists. If the string pointer is not NULL, the message takes ownership of the allocated string object. The message is free to delete the allocated string object at any time, so references to the object may be invalidated. Otherwise, if the value is NULL, the behavior is the same as calling clear\_name\(\).| +|release\_name\(\)|string \*|void|Releases the ownership of name and returns the pointer of the string object. After calling this, caller takes the ownership of the allocated string object and name\(\) will return the empty string/empty bytes.| +|has\_angular\_waypoint\(\) const|void|void|Returns the current value of the field if oneof case is kAngular\_waypoint. Otherwise, returns oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)::default\_instance\(\)| +|angular\_waypoint\(\) const|const oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)&|void|Returns the current value of the field if oneof case is kAngular\_waypoint| +|mutable\_angular\_waypoint\(\)|oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_type\_of\_waypoint\(\). Sets the oneof case to kAngular\_waypoint and returns a pointer to the mutable oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) object that stores the field's value. If the oneof case was not kAngular\_waypoint prior to the call, then the returned oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)\). After calling this, has\_angular\_waypoint\(\) will return true, angular\_waypoint\(\) will return a reference to the same instance of oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) and type\_of\_waypoint\_case\(\) will return kAngular\_waypoint| +|clear\_angular\_waypoint\(\)|void|void|Nothing will be changed if the oneof case is not kAngular\_waypoint. If the oneof case equals kAngular\_waypoint, frees the field and clears the oneof case. has\_angular\_waypoint\(\) will return false, angular\_waypoint\(\) will return the default value and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET.| +|set\_allocated\_angular\_waypoint\(\)|void|oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)\*|Calls clear\_type\_of\_waypoint\(\). If the oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) pointer is not NULL: Sets the oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) object to the field and sets the oneof case to kAngular\_waypoint. The message takes ownership of the allocated oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#) object, has\_angular\_waypoint\(\) will return true and type\_of\_waypoint\_case\(\) will return kAngular\_waypoint. If the pointer is NULL, has\_angular\_waypoint\(\) will return false and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET. \(The behavior is like calling clear\_type\_of\_waypoint\(\)\)| +|release\_angular\_waypoint\(\)|oneof:type\_of\_waypoint [AngularWaypoint](AngularWaypoint.md#)\*|void|Returns NULL if oneof case is not kAngular\_waypoint. If the oneof case is kAngular\_waypoint, clears the oneof case, releases the ownership of the field and returns the pointer of the type\_of\_waypoint object. After calling this, caller takes the ownership of the allocated type\_of\_waypoint object, has\_angular\_waypoint\(\) will return false, angular\_waypoint\(\) will return the default value and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET.| +|has\_cartesian\_waypoint\(\) const|void|void|Returns the current value of the field if oneof case is kCartesian\_waypoint. Otherwise, returns oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)::default\_instance\(\)| +|cartesian\_waypoint\(\) const|const oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)&|void|Returns the current value of the field if oneof case is kCartesian\_waypoint| +|mutable\_cartesian\_waypoint\(\)|oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)\*|void|If any other oneof field in the same oneof is set, calls clear\_type\_of\_waypoint\(\). Sets the oneof case to kCartesian\_waypoint and returns a pointer to the mutable oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) object that stores the field's value. If the oneof case was not kCartesian\_waypoint prior to the call, then the returned oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)\). After calling this, has\_cartesian\_waypoint\(\) will return true, cartesian\_waypoint\(\) will return a reference to the same instance of oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) and type\_of\_waypoint\_case\(\) will return kCartesian\_waypoint| +|clear\_cartesian\_waypoint\(\)|void|void|Nothing will be changed if the oneof case is not kCartesian\_waypoint. If the oneof case equals kCartesian\_waypoint, frees the field and clears the oneof case. has\_cartesian\_waypoint\(\) will return false, cartesian\_waypoint\(\) will return the default value and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET.| +|set\_allocated\_cartesian\_waypoint\(\)|void|oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)\*|Calls clear\_type\_of\_waypoint\(\). If the oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) pointer is not NULL: Sets the oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) object to the field and sets the oneof case to kCartesian\_waypoint. The message takes ownership of the allocated oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#) object, has\_cartesian\_waypoint\(\) will return true and type\_of\_waypoint\_case\(\) will return kCartesian\_waypoint. If the pointer is NULL, has\_cartesian\_waypoint\(\) will return false and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET. \(The behavior is like calling clear\_type\_of\_waypoint\(\)\)| +|release\_cartesian\_waypoint\(\)|oneof:type\_of\_waypoint [CartesianWaypoint](CartesianWaypoint.md#)\*|void|Returns NULL if oneof case is not kCartesian\_waypoint. If the oneof case is kCartesian\_waypoint, clears the oneof case, releases the ownership of the field and returns the pointer of the type\_of\_waypoint object. After calling this, caller takes the ownership of the allocated type\_of\_waypoint object, has\_cartesian\_waypoint\(\) will return false, cartesian\_waypoint\(\) will return the default value and type\_of\_waypoint\_case\(\) will return TYPE\_OF\_WAYPOINT\_NOT\_SET.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/WaypointList.md b/api_cpp/doc/markdown/messages/Base/WaypointList.md new file mode 100644 index 00000000..9e7ea181 --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/WaypointList.md @@ -0,0 +1,30 @@ +# class WaypointList + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|waypoints| [Waypoint](Waypoint.md#)|Array of waypoints| +|duration|float32|Duration of the waypoint list \(in seconds\). If unspecified or equal to 0, optimal duration is assumed.| +|use\_optimal\_blending|bool|At validation if this value is true, the waypoint list with optimal blending will be returned.| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|waypoints\_size\(\) const|int|void|Returns the number of elements currently in the field.| +|waypoints\(\) const|const [Waypoint](Waypoint.md#)|int index|Returns the element at the given zero-based index. Calling this method with index outside of \[0, waypoints\_size\(\)\) yields undefined behavior.| +|mutable\_waypoints\(\)| [Waypoint](Waypoint.md#)\*|int index|Returns a pointer to the mutable [Waypoint](Waypoint.md#) object that stores the value of the element at the given zero-based index. Calling this method with index outside of \[0, waypoints\_size\(\)\) yields undefined behavior.| +|add\_waypoints\(\)| [Waypoint](Waypoint.md#)\*|void|Adds a new element and returns a pointer to it. The returned [Waypoint](Waypoint.md#) is mutable and will have none of its fields set \(i.e. it will be identical to a newly-allocated [Waypoint](Waypoint.md#)\).| +|clear\_waypoints\(\)|void|void|Removes all elements from the field. After calling this, waypoints\_size\(\) will return zero.| +|waypoints\(\) const|const RepeatedPtrField< [Waypoint](Waypoint.md#)\>&|void|Returns the underlying RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|mutable\_waypoints\(\)|RepeatedPtrField< [Waypoint](Waypoint.md#)\>\*|void|Returns a pointer to the underlying mutable RepeatedPtrField that stores the field's elements. This container class provides STL-like iterators and other methods.| +|duration\(\)|float32|void|Returns the current value of duration. If the duration is not set, returns 0.| +|set\_duration\(\)|void|float32|Sets the value of duration. After calling this, duration\(\) will return value.| +|clear\_duration\(\)|void|void|Clears the value of duration. After calling this, duration\(\) will return 0.| +|use\_optimal\_blending\(\)|bool|void|Returns the current value of use\_optimal\_blending. If the use\_optimal\_blending is not set, returns 0.| +|set\_use\_optimal\_blending\(\)|void|bool|Sets the value of use\_optimal\_blending. After calling this, use\_optimal\_blending\(\) will return value.| +|clear\_use\_optimal\_blending\(\)|void|void|Clears the value of use\_optimal\_blending. After calling this, use\_optimal\_blending\(\) will return 0.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/Base/WaypointValidationReport.md b/api_cpp/doc/markdown/messages/Base/WaypointValidationReport.md new file mode 100644 index 00000000..b8d8b84d --- /dev/null +++ b/api_cpp/doc/markdown/messages/Base/WaypointValidationReport.md @@ -0,0 +1,28 @@ +# class WaypointValidationReport + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|trajectory\_error\_report| [TrajectoryErrorReport](TrajectoryErrorReport.md#)|Report on the validation, the waypoint list is valid if empty| +|optimal\_waypoint\_list| [WaypointList](WaypointList.md#)|Validated Waypoint List with optimal blending radius if the option was set| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|has\_trajectory\_error\_report\(\) const|bool|void|Returns true if trajectory\_error\_report is set.| +|trajectory\_error\_report\(\)|const [TrajectoryErrorReport](TrajectoryErrorReport.md#)&|void|Returns the current value of trajectory\_error\_report. If trajectory\_error\_report is not set, returns a [TrajectoryErrorReport](TrajectoryErrorReport.md#) with none of its fields set \(possibly trajectory\_error\_report::default\_instance\(\)\).| +|mutable\_trajectory\_error\_report\(\)| [TrajectoryErrorReport](TrajectoryErrorReport.md#) \*|void|Returns a pointer to the mutable [TrajectoryErrorReport](TrajectoryErrorReport.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [TrajectoryErrorReport](TrajectoryErrorReport.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [TrajectoryErrorReport](TrajectoryErrorReport.md#)\). After calling this, has\_trajectory\_error\_report\(\) will return true and trajectory\_error\_report\(\) will return a reference to the same instance of [TrajectoryErrorReport](TrajectoryErrorReport.md#).| +|clear\_trajectory\_error\_report\(\)|void|void|Clears the value of the field. After calling this, has\_trajectory\_error\_report\(\) will return false and trajectory\_error\_report\(\) will return the default value.| +|set\_allocated\_trajectory\_error\_report\(\)|void| [TrajectoryErrorReport](TrajectoryErrorReport.md#) \*|Sets the [TrajectoryErrorReport](TrajectoryErrorReport.md#) object to the field and frees the previous field value if it exists. If the [TrajectoryErrorReport](TrajectoryErrorReport.md#) pointer is not NULL, the message takes ownership of the allocated [TrajectoryErrorReport](TrajectoryErrorReport.md#) object and has\_ [TrajectoryErrorReport](TrajectoryErrorReport.md#)\(\) will return true. Otherwise, if the trajectory\_error\_report is NULL, the behavior is the same as calling clear\_trajectory\_error\_report\(\).| +|release\_trajectory\_error\_report\(\)| [TrajectoryErrorReport](TrajectoryErrorReport.md#) \*|void|Releases the ownership of the field and returns the pointer of the [TrajectoryErrorReport](TrajectoryErrorReport.md#) object. After calling this, caller takes the ownership of the allocated [TrajectoryErrorReport](TrajectoryErrorReport.md#) object, has\_trajectory\_error\_report\(\) will return false, and trajectory\_error\_report\(\) will return the default value.| +|has\_optimal\_waypoint\_list\(\) const|bool|void|Returns true if optimal\_waypoint\_list is set.| +|optimal\_waypoint\_list\(\)|const [WaypointList](WaypointList.md#)&|void|Returns the current value of optimal\_waypoint\_list. If optimal\_waypoint\_list is not set, returns a [WaypointList](WaypointList.md#) with none of its fields set \(possibly optimal\_waypoint\_list::default\_instance\(\)\).| +|mutable\_optimal\_waypoint\_list\(\)| [WaypointList](WaypointList.md#) \*|void|Returns a pointer to the mutable [WaypointList](WaypointList.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [WaypointList](WaypointList.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [WaypointList](WaypointList.md#)\). After calling this, has\_optimal\_waypoint\_list\(\) will return true and optimal\_waypoint\_list\(\) will return a reference to the same instance of [WaypointList](WaypointList.md#).| +|clear\_optimal\_waypoint\_list\(\)|void|void|Clears the value of the field. After calling this, has\_optimal\_waypoint\_list\(\) will return false and optimal\_waypoint\_list\(\) will return the default value.| +|set\_allocated\_optimal\_waypoint\_list\(\)|void| [WaypointList](WaypointList.md#) \*|Sets the [WaypointList](WaypointList.md#) object to the field and frees the previous field value if it exists. If the [WaypointList](WaypointList.md#) pointer is not NULL, the message takes ownership of the allocated [WaypointList](WaypointList.md#) object and has\_ [WaypointList](WaypointList.md#)\(\) will return true. Otherwise, if the optimal\_waypoint\_list is NULL, the behavior is the same as calling clear\_optimal\_waypoint\_list\(\).| +|release\_optimal\_waypoint\_list\(\)| [WaypointList](WaypointList.md#) \*|void|Releases the ownership of the field and returns the pointer of the [WaypointList](WaypointList.md#) object. After calling this, caller takes the ownership of the allocated [WaypointList](WaypointList.md#) object, has\_optimal\_waypoint\_list\(\) will return false, and optimal\_waypoint\_list\(\) will return the default value.| + +**Parent topic:** [Base \(C++\)](../../summary_pages/Base.md) + diff --git a/api_cpp/doc/markdown/messages/ControlConfig/ControlModeNotification.md b/api_cpp/doc/markdown/messages/ControlConfig/ControlModeNotification.md new file mode 100644 index 00000000..a93c9ec2 --- /dev/null +++ b/api_cpp/doc/markdown/messages/ControlConfig/ControlModeNotification.md @@ -0,0 +1,39 @@ +# class ControlModeNotification + + **Member values** + +|Member name|Data type|Description| +|-----------|---------|-----------| +|control\_mode|uint32|New control mode| +|timestamp| [Timestamp](../Common/Timestamp.md#)|Event timestamp| +|user\_handle| [UserProfileHandle](../Common/UserProfileHandle.md#)|User that caused the control mode event| +|connection| [Connection](../Common/Connection.md#)|Connection that caused the control mode event| + + **Member functions** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|control\_mode\(\) const|uint32|void|Returns the current value of control\_mode. If the control\_mode is not set, returns 0.| +|set\_control\_mode\(\)|void|uint32|Sets the value of control\_mode. After calling this, control\_mode\(\) will return value.| +|clear\_control\_mode\(\)|void|void|Clears the value of control\_mode. After calling this, control\_mode\(\) will return the empty string/empty bytes.| +|has\_timestamp\(\) const|bool|void|Returns true if timestamp is set.| +|timestamp\(\)|const [Timestamp](../Common/Timestamp.md#)&|void|Returns the current value of timestamp. If timestamp is not set, returns a [Timestamp](../Common/Timestamp.md#) with none of its fields set \(possibly timestamp::default\_instance\(\)\).| +|mutable\_timestamp\(\)| [Timestamp](../Common/Timestamp.md#) \*|void|Returns a pointer to the mutable [Timestamp](../Common/Timestamp.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [Timestamp](../Common/Timestamp.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [Timestamp](../Common/Timestamp.md#)\). After calling this, has\_timestamp\(\) will return true and timestamp\(\) will return a reference to the same instance of [Timestamp](../Common/Timestamp.md#).| +|clear\_timestamp\(\)|void|void|Clears the value of the field. After calling this, has\_timestamp\(\) will return false and timestamp\(\) will return the default value.| +|set\_allocated\_timestamp\(\)|void| [Timestamp](../Common/Timestamp.md#) \*|Sets the [Timestamp](../Common/Timestamp.md#) object to the field and frees the previous field value if it exists. If the [Timestamp](../Common/Timestamp.md#) pointer is not NULL, the message takes ownership of the allocated [Timestamp](../Common/Timestamp.md#) object and has\_ [Timestamp](../Common/Timestamp.md#)\(\) will return true. Otherwise, if the timestamp is NULL, the behavior is the same as calling clear\_timestamp\(\).| +|release\_timestamp\(\)| [Timestamp](../Common/Timestamp.md#) \*|void|Releases the ownership of the field and returns the pointer of the [Timestamp](../Common/Timestamp.md#) object. After calling this, caller takes the ownership of the allocated [Timestamp](../Common/Timestamp.md#) object, has\_timestamp\(\) will return false, and timestamp\(\) will return the default value.| +|has\_user\_handle\(\) const|bool|void|Returns true if user\_handle is set.| +|user\_handle\(\)|const [UserProfileHandle](../Common/UserProfileHandle.md#)&|void|Returns the current value of user\_handle. If user\_handle is not set, returns a [UserProfileHandle](../Common/UserProfileHandle.md#) with none of its fields set \(possibly user\_handle::default\_instance\(\)\).| +|mutable\_user\_handle\(\)| [UserProfileHandle](../Common/UserProfileHandle.md#) \*|void|Returns a pointer to the mutable [UserProfileHandle](../Common/UserProfileHandle.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [UserProfileHandle](../Common/UserProfileHandle.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [UserProfileHandle](../Common/UserProfileHandle.md#)\). After calling this, has\_user\_handle\(\) will return true and user\_handle\(\) will return a reference to the same instance of [UserProfileHandle](../Common/UserProfileHandle.md#).| +|clear\_user\_handle\(\)|void|void|Clears the value of the field. After calling this, has\_user\_handle\(\) will return false and user\_handle\(\) will return the default value.| +|set\_allocated\_user\_handle\(\)|void| [UserProfileHandle](../Common/UserProfileHandle.md#) \*|Sets the [UserProfileHandle](../Common/UserProfileHandle.md#) object to the field and frees the previous field value if it exists. If the [UserProfileHandle](../Common/UserProfileHandle.md#) pointer is not NULL, the message takes ownership of the allocated [UserProfileHandle](../Common/UserProfileHandle.md#) object and has\_ [UserProfileHandle](../Common/UserProfileHandle.md#)\(\) will return true. Otherwise, if the user\_handle is NULL, the behavior is the same as calling clear\_user\_handle\(\).| +|release\_user\_handle\(\)| [UserProfileHandle](../Common/UserProfileHandle.md#) \*|void|Releases the ownership of the field and returns the pointer of the [UserProfileHandle](../Common/UserProfileHandle.md#) object. After calling this, caller takes the ownership of the allocated [UserProfileHandle](../Common/UserProfileHandle.md#) object, has\_user\_handle\(\) will return false, and user\_handle\(\) will return the default value.| +|has\_connection\(\) const|bool|void|Returns true if connection is set.| +|connection\(\)|const [Connection](../Common/Connection.md#)&|void|Returns the current value of connection. If connection is not set, returns a [Connection](../Common/Connection.md#) with none of its fields set \(possibly connection::default\_instance\(\)\).| +|mutable\_connection\(\)| [Connection](../Common/Connection.md#) \*|void|Returns a pointer to the mutable [Connection](../Common/Connection.md#) object that stores the field's value. If the field was not set prior to the call, then the returned [Connection](../Common/Connection.md#) will have none of its fields set \(i.e. it will be identical to a newly-allocated [Connection](../Common/Connection.md#)\). After calling this, has\_connection\(\) will return true and connection\(\) will return a reference to the same instance of [Connection](../Common/Connection.md#).| +|clear\_connection\(\)|void|void|Clears the value of the field. After calling this, has\_connection\(\) will return false and connection\(\) will return the default value.| +|set\_allocated\_connection\(\)|void| [Connection](../Common/Connection.md#) \*|Sets the [Connection](../Common/Connection.md#) object to the field and frees the previous field value if it exists. If the [Connection](../Common/Connection.md#) pointer is not NULL, the message takes ownership of the allocated [Connection](../Common/Connection.md#) object and has\_ [Connection](../Common/Connection.md#)\(\) will return true. Otherwise, if the connection is NULL, the behavior is the same as calling clear\_connection\(\).| +|release\_connection\(\)| [Connection](../Common/Connection.md#) \*|void|Releases the ownership of the field and returns the pointer of the [Connection](../Common/Connection.md#) object. After calling this, caller takes the ownership of the allocated [Connection](../Common/Connection.md#) object, has\_connection\(\) will return false, and connection\(\) will return the default value.| + +**Parent topic:** [ControlConfig \(C++\)](../../summary_pages/ControlConfig.md) + diff --git a/api_cpp/doc/markdown/messages/GripperCyclic/MotorCommand.md b/api_cpp/doc/markdown/messages/GripperCyclic/MotorCommand.md index bb7cf914..bcc0f585 100644 --- a/api_cpp/doc/markdown/messages/GripperCyclic/MotorCommand.md +++ b/api_cpp/doc/markdown/messages/GripperCyclic/MotorCommand.md @@ -7,7 +7,7 @@ |motor\_id|uint32|Motor ID \(1, nb\_motor\)| |position|float32|Desired position of the gripper fingers in percentage \(0-100%\)| |velocity|float32|Desired velocity in percentage \(0-100%\) with which position will be set| -|force|float32|Desired force limit of the gripper fingers in percentage \(0-100%\)| +|force|float32|This field is deprecated and unused. It will be removed in a future release.| **Member functions** diff --git a/api_cpp/doc/markdown/summary_pages/ActuatorConfig.md b/api_cpp/doc/markdown/summary_pages/ActuatorConfig.md index 8df9e6a5..c057f0b2 100644 --- a/api_cpp/doc/markdown/summary_pages/ActuatorConfig.md +++ b/api_cpp/doc/markdown/summary_pages/ActuatorConfig.md @@ -2,45 +2,9 @@ This page describes the C++ ActuatorConfig API. -## Class reference - -This section describes the data classes used in this API, as well as their member values and member functions. - - **Messages** - -|Class|Description| -|-----|-----------| -|[AxisOffsets](../messages/ActuatorConfig/AxisOffsets.md#)|Axis offsets| -|[AxisPosition](../messages/ActuatorConfig/AxisPosition.md#)|Axis position| -|[CoggingFeedforwardModeInformation](../messages/ActuatorConfig/CoggingFeedforwardModeInformation.md#)|Cogging feedforward mode| -|[CommandModeInformation](../messages/ActuatorConfig/CommandModeInformation.md#)|Command mode| -|[ControlLoop](../messages/ActuatorConfig/ControlLoop.md#)|Control loop| -|[ControlLoopParameters](../messages/ActuatorConfig/ControlLoopParameters.md#)|Control loop parameters \(discrete transfer function\)| -|[ControlModeInformation](../messages/ActuatorConfig/ControlModeInformation.md#)|Control mode information| -|[CustomDataSelection](../messages/ActuatorConfig/CustomDataSelection.md#)|Selected custom data channels content| -|[EncoderDerivativeParameters](../messages/ActuatorConfig/EncoderDerivativeParameters.md#)|Variable window derivative parameters| -|[FrequencyResponse](../messages/ActuatorConfig/FrequencyResponse.md#)|Frequency response| -|[LoopSelection](../messages/ActuatorConfig/LoopSelection.md#)|Defines the loop selection| -|[PositionCommand](../messages/ActuatorConfig/PositionCommand.md#)|Angular position command for an actuator| -|[RampResponse](../messages/ActuatorConfig/RampResponse.md#)|Ramp response| -|[Servoing](../messages/ActuatorConfig/Servoing.md#)|Enables/disables servoing| -|[StepResponse](../messages/ActuatorConfig/StepResponse.md#)|Step response| -|[TorqueCalibration](../messages/ActuatorConfig/TorqueCalibration.md#)|Torque calibration settings| -|[TorqueOffset](../messages/ActuatorConfig/TorqueOffset.md#)|Defines torque offset| -|[VectorDriveParameters](../messages/ActuatorConfig/VectorDriveParameters.md#)|Field-oriented control PI controller gain values| +## RPC reference - **Enumerators** - -|Enumerator|Description| -|----------|-----------| -|[CoggingFeedforwardMode](../enums/ActuatorConfig/CoggingFeedforwardMode.md#)|Admissable cogging feedforward modes| -|[CommandMode](../enums/ActuatorConfig/CommandMode.md#)|Admissible command modes| -|[ControlLoopSelection](../enums/ActuatorConfig/ControlLoopSelection.md#)|Admissible control loop selections| -|[ControlMode](../enums/ActuatorConfig/ControlMode.md#)|Admissible control modes| -|[CustomDataIndex](../enums/ActuatorConfig/CustomDataIndex.md#)|Custom data options| -|[SafetyIdentifierBankA](../enums/ActuatorConfig/SafetyIdentifierBankA.md#)|Admissible bank A actuator safeties| -|[SafetyLimitType](../enums/ActuatorConfig/SafetyLimitType.md#)|Admissible limit types| -|[ServiceVersion](../enums/ActuatorConfig/ServiceVersion.md#)|Identifies ActuatorConfig service current version| +This section describes the existing RPCs used in this API. Service to configure actuators @@ -81,3 +45,43 @@ Service to configure actuators |SetCoggingFeedforwardMode|[Empty](../messages/Common/Empty.md#)|[CoggingFeedforwardModeInformation](../messages/ActuatorConfig/CoggingFeedforwardModeInformation.md#)|Sets cogging feedforward mode| |GetCoggingFeedforwardMode|[CoggingFeedforwardModeInformation](../messages/ActuatorConfig/CoggingFeedforwardModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves cogging feedforward mode| +## Class reference + +This section describes the data classes used in this API. + + **Messages** + +|Class|Description| +|-----|-----------| +|[AxisOffsets](../messages/ActuatorConfig/AxisOffsets.md#)|Axis offsets| +|[AxisPosition](../messages/ActuatorConfig/AxisPosition.md#)|Axis position| +|[CoggingFeedforwardModeInformation](../messages/ActuatorConfig/CoggingFeedforwardModeInformation.md#)|Cogging feedforward mode| +|[CommandModeInformation](../messages/ActuatorConfig/CommandModeInformation.md#)|Command mode| +|[ControlLoop](../messages/ActuatorConfig/ControlLoop.md#)|Control loop| +|[ControlLoopParameters](../messages/ActuatorConfig/ControlLoopParameters.md#)|Control loop parameters \(discrete transfer function\)| +|[ControlModeInformation](../messages/ActuatorConfig/ControlModeInformation.md#)|Control mode information| +|[CustomDataSelection](../messages/ActuatorConfig/CustomDataSelection.md#)|Selected custom data channels content| +|[EncoderDerivativeParameters](../messages/ActuatorConfig/EncoderDerivativeParameters.md#)|Variable window derivative parameters| +|[FrequencyResponse](../messages/ActuatorConfig/FrequencyResponse.md#)|Frequency response| +|[LoopSelection](../messages/ActuatorConfig/LoopSelection.md#)|Defines the loop selection| +|[PositionCommand](../messages/ActuatorConfig/PositionCommand.md#)|Angular position command for an actuator| +|[RampResponse](../messages/ActuatorConfig/RampResponse.md#)|Ramp response| +|[Servoing](../messages/ActuatorConfig/Servoing.md#)|Enables/disables servoing| +|[StepResponse](../messages/ActuatorConfig/StepResponse.md#)|Step response| +|[TorqueCalibration](../messages/ActuatorConfig/TorqueCalibration.md#)|Torque calibration settings| +|[TorqueOffset](../messages/ActuatorConfig/TorqueOffset.md#)|Defines torque offset| +|[VectorDriveParameters](../messages/ActuatorConfig/VectorDriveParameters.md#)|Field-oriented control PI controller gain values| + + **Enumerators** + +|Enumerator|Description| +|----------|-----------| +|[CoggingFeedforwardMode](../enums/ActuatorConfig/CoggingFeedforwardMode.md#)|Admissable cogging feedforward modes| +|[CommandMode](../enums/ActuatorConfig/CommandMode.md#)|Admissible command modes| +|[ControlLoopSelection](../enums/ActuatorConfig/ControlLoopSelection.md#)|Admissible control loop selections| +|[ControlMode](../enums/ActuatorConfig/ControlMode.md#)|Admissible control modes| +|[CustomDataIndex](../enums/ActuatorConfig/CustomDataIndex.md#)|Custom data options| +|[SafetyIdentifierBankA](../enums/ActuatorConfig/SafetyIdentifierBankA.md#)|Admissible bank A actuator safeties| +|[SafetyLimitType](../enums/ActuatorConfig/SafetyLimitType.md#)|Admissible limit types| +|[ServiceVersion](../enums/ActuatorConfig/ServiceVersion.md#)|Identifies ActuatorConfig service current version| + diff --git a/api_cpp/doc/markdown/summary_pages/ActuatorCyclic.md b/api_cpp/doc/markdown/summary_pages/ActuatorCyclic.md index 0f6c7cd9..0bc00bfe 100644 --- a/api_cpp/doc/markdown/summary_pages/ActuatorCyclic.md +++ b/api_cpp/doc/markdown/summary_pages/ActuatorCyclic.md @@ -2,9 +2,24 @@ This page describes the C++ ActuatorCyclic API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to exchange cyclic data with an actuator + + **ActuatorCyclicClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|Refresh|[Feedback](../messages/ActuatorCyclic/Feedback.md#)|[Command](../messages/ActuatorCyclic/Command.md#)|Sends a command to a single actuator and receives feedback on status of that actuator| +|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/ActuatorCyclic/Command.md#)|Sends a command to a single actuator without feedback| +|RefreshFeedback|[Feedback](../messages/ActuatorCyclic/Feedback.md#)|[MessageId](../messages/ActuatorCyclic/MessageId.md#)|Obtains feedback from a single actuator| +|RefreshCustomData|[CustomData](../messages/ActuatorCyclic/CustomData.md#)|[MessageId](../messages/ActuatorCyclic/MessageId.md#)|Obtains custom data from a single actuator| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -23,14 +38,3 @@ This section describes the data classes used in this API, as well as their membe |[ServiceVersion](../enums/ActuatorCyclic/ServiceVersion.md#)|Identifies ActuatorCyclic service current version| |[StatusFlags](../enums/ActuatorCyclic/StatusFlags.md#)|Identifies actuator status| -Service to exchange cyclic data with an actuator - - **ActuatorCyclicClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|Refresh|[Feedback](../messages/ActuatorCyclic/Feedback.md#)|[Command](../messages/ActuatorCyclic/Command.md#)|Sends a command to a single actuator and receives feedback on status of that actuator| -|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/ActuatorCyclic/Command.md#)|Sends a command to a single actuator without feedback| -|RefreshFeedback|[Feedback](../messages/ActuatorCyclic/Feedback.md#)|[MessageId](../messages/ActuatorCyclic/MessageId.md#)|Obtains feedback from a single actuator| -|RefreshCustomData|[CustomData](../messages/ActuatorCyclic/CustomData.md#)|[MessageId](../messages/ActuatorCyclic/MessageId.md#)|Obtains custom data from a single actuator| - diff --git a/api_cpp/doc/markdown/summary_pages/Api.md b/api_cpp/doc/markdown/summary_pages/Api.md index c55ae76e..2cdf7932 100644 --- a/api_cpp/doc/markdown/summary_pages/Api.md +++ b/api_cpp/doc/markdown/summary_pages/Api.md @@ -2,9 +2,13 @@ This page describes the C++ API error codes. +## RPC reference + +This section describes the existing RPCs used in this API. + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Enumerators** diff --git a/api_cpp/doc/markdown/summary_pages/Base.md b/api_cpp/doc/markdown/summary_pages/Base.md index 2bf3d986..7e351e46 100644 --- a/api_cpp/doc/markdown/summary_pages/Base.md +++ b/api_cpp/doc/markdown/summary_pages/Base.md @@ -2,9 +2,169 @@ This page describes the C++ Base API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Base service. Broadly useful service. Provides functions for configuring a range of base-related functionalities and for enabling high-level control for the robot. + + **BaseClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|CreateUserProfile|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|[FullUserProfile](../messages/Base/FullUserProfile.md#)|Creates a user profile and returns a handle to the profile| +|UpdateUserProfile|[Empty](../messages/Common/Empty.md#)|[UserProfile](../messages/Base/UserProfile.md#)|Updates an existing user profile| +|ReadUserProfile|[UserProfile](../messages/Base/UserProfile.md#)|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|Retrieves an existing user profile| +|DeleteUserProfile|[Empty](../messages/Common/Empty.md#)|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|Deletes an existing user profile| +|ReadAllUserProfiles|[UserProfileList](../messages/Base/UserProfileList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all user profiles| +|ReadAllUsers|[UserList](../messages/Base/UserList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all user profile handles| +|ChangePassword|[Empty](../messages/Common/Empty.md#)|[PasswordChange](../messages/Base/PasswordChange.md#)|Changes the password of an existing user| +|CreateSequence|[SequenceHandle](../messages/Base/SequenceHandle.md#)|[Sequence](../messages/Base/Sequence.md#)|Creates a new sequence and returns a handle to the sequence| +|UpdateSequence|[Empty](../messages/Common/Empty.md#)|[Sequence](../messages/Base/Sequence.md#)|Updates an existing sequence| +|ReadSequence|[Sequence](../messages/Base/Sequence.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Retrieves an existing sequence| +|DeleteSequence|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Deletes an existing sequence| +|ReadAllSequences|[SequenceList](../messages/Base/SequenceList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all existing sequences| +|PlaySequence|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Plays an existing sequence| +|PlayAdvancedSequence|[Empty](../messages/Common/Empty.md#)|[AdvancedSequenceHandle](../messages/Base/AdvancedSequenceHandle.md#)|Plays an existing sequence with options| +|StopSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops execution of currently playing sequence| +|PauseSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Pauses execution of currently playing sequence| +|ResumeSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Resumes execution of currently paused sequence| +|CreateProtectionZone|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|[ProtectionZone](../messages/Base/ProtectionZone.md#)|Creates a new protection zone and returns a handle to the protection zone| +|UpdateProtectionZone|[Empty](../messages/Common/Empty.md#)|[ProtectionZone](../messages/Base/ProtectionZone.md#)|Updates an existing protection zone| +|ReadProtectionZone|[ProtectionZone](../messages/Base/ProtectionZone.md#)|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|Retrieves an existing protection zone| +|DeleteProtectionZone|[Empty](../messages/Common/Empty.md#)|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|Deletes an existing protection zone| +|ReadAllProtectionZones|[ProtectionZoneList](../messages/Base/ProtectionZoneList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves a list of all protection zones| +|CreateMapping|[MappingHandle](../messages/Base/MappingHandle.md#)|[Mapping](../messages/Base/Mapping.md#)|Creates a new mapping| +|ReadMapping|[Mapping](../messages/Base/Mapping.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Retrieves an existing mapping| +|UpdateMapping|[Empty](../messages/Common/Empty.md#)|[Mapping](../messages/Base/Mapping.md#)|Updates an existing mapping| +|DeleteMapping|[Empty](../messages/Common/Empty.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Deletes an existing mapping| +|ReadAllMappings|[MappingList](../messages/Base/MappingList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves a list of all mappings| +|CreateMap|[MapHandle](../messages/Base/MapHandle.md#)|[Map](../messages/Base/Map.md#)|Creates a new map| +|ReadMap|[Map](../messages/Base/Map.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Retrieves an existing map| +|UpdateMap|[Empty](../messages/Common/Empty.md#)|[Map](../messages/Base/Map.md#)|Updates an existing map| +|DeleteMap|[Empty](../messages/Common/Empty.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Deletes an existing map| +|ReadAllMaps|[MapList](../messages/Base/MapList.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Retrieves a list of all maps associated to the specified mapping| +|ActivateMap|[Empty](../messages/Common/Empty.md#)|[ActivateMapHandle](../messages/Base/ActivateMapHandle.md#)|Activates the specified map within the specified map group and mapping| +|CreateAction|[ActionHandle](../messages/Base/ActionHandle.md#)|[Action](../messages/Base/Action.md#)|Creates a new action| +|ReadAction|[Action](../messages/Base/Action.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Retrieves an existing action| +|ReadAllActions|[ActionList](../messages/Base/ActionList.md#)|[RequestedActionType](../messages/Base/RequestedActionType.md#)|Retrieves a list of all existing actions| +|DeleteAction|[Empty](../messages/Common/Empty.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Deletes an existing action| +|UpdateAction|[Empty](../messages/Common/Empty.md#)|[Action](../messages/Base/Action.md#)|Updates an existing action| +|ExecuteActionFromReference|[Empty](../messages/Common/Empty.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Commands the robot to execute the specified existing action| +|ExecuteAction|[Empty](../messages/Common/Empty.md#)|[Action](../messages/Base/Action.md#)|Commands the robot to execute the specified action| +|PauseAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Pauses the currently executed action. ResumeAction can be invoked afterwards| +|StopAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops the currently executed action. ResumeAction cannot be invoked afterwards| +|ResumeAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Resumes execution of the currently paused action| +|GetIPv4Configuration|[IPv4Configuration](../messages/Base/IPv4Configuration.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Retrieves the IPv4 network configuration for the specified network adapter| +|SetIPv4Configuration|[Empty](../messages/Common/Empty.md#)|[FullIPv4Configuration](../messages/Base/FullIPv4Configuration.md#)|Modifies the IPv4 network configuration for the specified network adapter| +|SetCommunicationInterfaceEnable|[Empty](../messages/Common/Empty.md#)|[CommunicationInterfaceConfiguration](../messages/Base/CommunicationInterfaceConfiguration.md#)|Enables \(or disables\) the specified communication interface| +|IsCommunicationInterfaceEnable|[CommunicationInterfaceConfiguration](../messages/Base/CommunicationInterfaceConfiguration.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Determines if the specified communication interface is enabled \(or disabled\)| +|GetAvailableWifi|[WifiInformationList](../messages/Base/WifiInformationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of available Wi-Fi networks| +|GetWifiInformation|[WifiInformation](../messages/Base/WifiInformation.md#)|[Ssid](../messages/Base/Ssid.md#)|Retrieves information about a specific Wi-Fi network| +|AddWifiConfiguration|[Empty](../messages/Common/Empty.md#)|[WifiConfiguration](../messages/Base/WifiConfiguration.md#)|Configures a specific Wi-Fi network| +|DeleteWifiConfiguration|[Empty](../messages/Common/Empty.md#)|[Ssid](../messages/Base/Ssid.md#)|Deletes a specific Wi-Fi network| +|GetAllConfiguredWifis|[WifiConfigurationList](../messages/Base/WifiConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of configured Wi-Fi networks| +|ConnectWifi|[Empty](../messages/Common/Empty.md#)|[Ssid](../messages/Base/Ssid.md#)|Connects robot to specified Wi-Fi network| +|DisconnectWifi|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Disconnects the robot from the currently connected Wi-Fi network| +|GetConnectedWifiInformation|[WifiInformation](../messages/Base/WifiInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves information about the connected Wi-Fi network| +|Unsubscribe|[Empty](../messages/Common/Empty.md#)|[NotificationHandle](../messages/Common/NotificationHandle.md#)|Unsubscribes client from receiving notifications for the specified topic| +|OnNotificationConfigurationChangeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to configuration change topic for notifications| +|OnNotificationMappingInfoTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to mapping information topic for notifications| +|OnNotificationControlModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to control mode topic for notifications. **This function may be removed in a future release. It has been moved to ControlConfig service.**| +|OnNotificationOperatingModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to operating mode topic for notifications| +|OnNotificationSequenceInfoTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to sequence information topic for notifications| +|OnNotificationProtectionZoneTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to protection zone topic for notifications| +|OnNotificationUserTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to user topic for notifications| +|OnNotificationControllerTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to controller topic for notifications| +|OnNotificationActionTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to action topic for notifications| +|OnNotificationRobotEventTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to robot event topic for notifications| +|PlayCartesianTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedPose](../messages/Base/ConstrainedPose.md#)|Moves robot to the specifed tool pose \(position and orientation\) while imposing specified constraints. This RPC will be deprecated in a future version and will be replaced by ExecuteWaypointTrajectory.. **This function will be removed in a future release.**| +|PlayCartesianTrajectoryPosition|[Empty](../messages/Common/Empty.md#)|[ConstrainedPosition](../messages/Base/ConstrainedPosition.md#)|Moves robot to the specifed position while imposing specified constraints. This RPC will be deprecated in a future version and will be replaced by ExecuteWaypointTrajectory.. **This function will be removed in a future release.**| +|PlayCartesianTrajectoryOrientation|[Empty](../messages/Common/Empty.md#)|[ConstrainedOrientation](../messages/Base/ConstrainedOrientation.md#)|Moves to the specifed orientation while imposing specified constraints. This RPC will be deprecated in a future version and will be replaced by ExecuteWaypointTrajectory.. **This function will be removed in a future release.**| +|Stop|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops robot movement| +|GetMeasuredCartesianPose|[Pose](../messages/Base/Pose.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the current computed tool pose \(position and orientation\) for the robot| +|SendWrenchCommand|[Empty](../messages/Common/Empty.md#)|[WrenchCommand](../messages/Base/WrenchCommand.md#)|Sends a wrench command \(screw consisting of force and torque\) to be applied to the tool. This method is EXPERIMENTAL.| +|SendWrenchJoystickCommand|[Empty](../messages/Common/Empty.md#)|[WrenchCommand](../messages/Base/WrenchCommand.md#)|Sends a wrench \(screw consisting of force and torque\) joystick command to be applied to the tool. The wrench values sent to this call are expected to be a ratio of maximum value \(between -1.0/+1.0\). This method is EXPERIMENTAL.| +|SendTwistJoystickCommand|[Empty](../messages/Common/Empty.md#)|[TwistCommand](../messages/Base/TwistCommand.md#)|Sends a twist \(screw consisting of linear and angular velocity\) joystick command to be applied to the tool. The twist values sent to this call are expected to be a ratio of the maximum value \(between -1.0/+1.0\).| +|SendTwistCommand|[Empty](../messages/Common/Empty.md#)|[TwistCommand](../messages/Base/TwistCommand.md#)|Sends a twist \(screw consisting of linear and angular velocity\) command to be applied to the tool| +|PlayJointTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedJointAngles](../messages/Base/ConstrainedJointAngles.md#)|Moves joints to the specified joint angles while imposing specified constraints. This RPC will be deprecated in a future version and will be replaced by ExecuteWaypointTrajectory.. **This function will be removed in a future release.**| +|PlaySelectedJointTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedJointAngle](../messages/Base/ConstrainedJointAngle.md#)|Moves specifed joint to the specifed joint angle while imposing specified constraints. This RPC will be deprecated in a future version and will be replaced by ExecuteWaypointTrajectory.. **This function will be removed in a future release.**| +|GetMeasuredJointAngles|[JointAngles](../messages/Base/JointAngles.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the currently measured joint angles for each joint| +|SendJointSpeedsCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeeds](../messages/Base/JointSpeeds.md#)|Sends a set of joint speed commands to all joints with one command. Joint speed commmands must be sent to all joints. If you do not want to move some of the joints, simply send a speed value of 0 degrees / second for that joint.| +|SendSelectedJointSpeedCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeed](../messages/Base/JointSpeed.md#)|Sends a speed command for a specific joint| +|SendGripperCommand|[Empty](../messages/Common/Empty.md#)|[GripperCommand](../messages/Base/GripperCommand.md#)|Sends a command to move the gripper| +|GetMeasuredGripperMovement|[Gripper](../messages/Base/Gripper.md#)|[GripperRequest](../messages/Base/GripperRequest.md#)|Retrieves the current gripper movement, that is the current gripper position, force or speed| +|SetAdmittance|[Empty](../messages/Common/Empty.md#)|[Admittance](../messages/Base/Admittance.md#)|Sets the robot in the chosen admittance mode| +|SetOperatingMode|[Empty](../messages/Common/Empty.md#)|[OperatingModeInformation](../messages/Base/OperatingModeInformation.md#)|Sets a new operating mode. Only Maintenance, Update and Run modes are permitted.| +|ApplyEmergencyStop|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops robot movement and activates emergency stop state. You will not be able to move the robot. Use ClearFaults\(\) to clear the stop.| +|ClearFaults|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Clears robot stop. Robot is permitted to move again.| +|GetControlMode|[ControlModeInformation](../messages/Base/ControlModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current control mode. **This function may be removed in a future release. It has been moved to ControlConfig service.**| +|GetOperatingMode|[OperatingModeInformation](../messages/Base/OperatingModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current operating mode| +|SetServoingMode|[Empty](../messages/Common/Empty.md#)|[ServoingModeInformation](../messages/Base/ServoingModeInformation.md#)|Sets the servoing mode| +|GetServoingMode|[ServoingModeInformation](../messages/Base/ServoingModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current servoing mode| +|OnNotificationServoingModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to servoing mode topic for notifications| +|RestoreFactorySettings|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Deletes all configurations and reverts settings to their factory defaults \(except network settings\)| +|Reboot|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Reboots the robot| +|OnNotificationFactoryTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to factory topic for notifications| +|GetAllConnectedControllers|[ControllerList](../messages/Base/ControllerList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all connected controllers| +|GetControllerState|[ControllerState](../messages/Base/ControllerState.md#)|[ControllerHandle](../messages/Base/ControllerHandle.md#)|Retrieves the state of a specified controller| +|GetActuatorCount|[ActuatorInformation](../messages/Base/ActuatorInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the number of actuators in the robot| +|StartWifiScan|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Initiates Wi-Fi scanning| +|GetConfiguredWifi|[WifiConfiguration](../messages/Base/WifiConfiguration.md#)|[Ssid](../messages/Base/Ssid.md#)|Retrieves a configured Wi-Fi network| +|OnNotificationNetworkTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to network event notifications| +|GetArmState|[ArmStateInformation](../messages/Base/ArmStateInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current robot arm state| +|OnNotificationArmStateTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to robot arm state notifications| +|GetIPv4Information|[IPv4Information](../messages/Base/IPv4Information.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Retrieves the IPv4 network information for the specified network adapter| +|SetWifiCountryCode|[Empty](../messages/Common/Empty.md#)|[CountryCode](../messages/Common/CountryCode.md#)|Sets the Wi-Fi country code| +|GetWifiCountryCode|[CountryCode](../messages/Common/CountryCode.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the Wi-Fi country code| +|SetCapSenseConfig|[Empty](../messages/Common/Empty.md#)|[CapSenseConfig](../messages/Base/CapSenseConfig.md#)|Configures capacitive sensor on the gripper or wrist| +|GetCapSenseConfig|[CapSenseConfig](../messages/Base/CapSenseConfig.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves configuration of capacitive sensor on the gripper or wrist| +|GetAllJointsSpeedHardLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves speed hard limits for all joints. **This function will be removed in a future release. Use GetKinematicHardLimits from the ControlConfig service instead.**| +|GetAllJointsTorqueHardLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves torque hard limits for all joints. **This function will be removed in a future release.**| +|GetTwistHardLimitation|[TwistLimitation](../messages/Base/TwistLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves twist hard limitations. **This function will be removed in a future release. Use GetKinematicHardLimits from the ControlConfig service instead.**| +|GetWrenchHardLimitation|[WrenchLimitation](../messages/Base/WrenchLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves wrench hard limitations. **This function will be removed in a future release.**| +|SendJointSpeedsJoystickCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeeds](../messages/Base/JointSpeeds.md#)|Sends the desired joystick speeds to all joints with one command. The speed values sent to this call are expected to be a ratio of the maximum value \(between -1.0/+1.0\) Speeds must be sent to all joints. If you don't want to move some of the joints, send a value of 0.| +|SendSelectedJointSpeedJoystickCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeed](../messages/Base/JointSpeed.md#)|Sends a joystick speed for a specific joint. The speed value sent to this call is expected to be a ratio of the maximum value \(between -1.0/+1.0\)| +|EnableBridge|[BridgeResult](../messages/Base/BridgeResult.md#)|[BridgeConfig](../messages/Base/BridgeConfig.md#)|Enables TCP bridge to hardware device| +|DisableBridge|[BridgeResult](../messages/Base/BridgeResult.md#)|[BridgeIdentifier](../messages/Base/BridgeIdentifier.md#)|Disables specified TCP bridge| +|GetBridgeList|[BridgeList](../messages/Base/BridgeList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of created bridges| +|GetBridgeConfig|[BridgeConfig](../messages/Base/BridgeConfig.md#)|[BridgeIdentifier](../messages/Base/BridgeIdentifier.md#)|Retrieves configuration for specified bridge| +|PlayPreComputedJointTrajectory|[Empty](../messages/Common/Empty.md#)|[PreComputedJointTrajectory](../messages/Base/PreComputedJointTrajectory.md#)|Plays a pre-computed angular trajectory| +|GetProductConfiguration|[CompleteProductConfiguration](../messages/ProductConfiguration/CompleteProductConfiguration.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves product configuration information| +|UpdateEndEffectorTypeConfiguration|[Empty](../messages/Common/Empty.md#)|[ProductConfigurationEndEffectorType](../messages/ProductConfiguration/ProductConfigurationEndEffectorType.md#)|Set new end-effector type in product configuration \(Identification Number\)| +|RestoreFactoryProductConfiguration|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Restores product configuration to factory product configuration| +|GetTrajectoryErrorReport|[TrajectoryErrorReport](../messages/Base/TrajectoryErrorReport.md#)|[Empty](../messages/Common/Empty.md#)|Obtains trajectory error report listing errors for rejected trajectory. Provides some feedback on why the trajectory could not be completed.| +|GetAllJointsSpeedSoftLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of soft speed limits for all joints. **This function will be removed in a future release. Use GetKinematicSoftLimits from the ControlConfig service instead.**| +|GetAllJointsTorqueSoftLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of soft torque limits for all joints. **This function will be removed in a future release.**| +|GetTwistSoftLimitation|[TwistLimitation](../messages/Base/TwistLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all twist soft limitations. **This function will be removed in a future release. Use GetKinematicSoftLimits from the ControlConfig service instead.**| +|GetWrenchSoftLimitation|[WrenchLimitation](../messages/Base/WrenchLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all wrench soft limitations. **This function will be removed in a future release.**| +|SetControllerConfigurationMode|[Empty](../messages/Common/Empty.md#)|[ControllerConfigurationMode](../messages/Base/ControllerConfigurationMode.md#)|Sets controller configuration mode| +|GetControllerConfigurationMode|[ControllerConfigurationMode](../messages/Base/ControllerConfigurationMode.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current controller configuration mode| +|StartTeaching|[Empty](../messages/Common/Empty.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Enables the teaching mode on a sequence| +|StopTeaching|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Disables the teaching mode on a sequence| +|AddSequenceTasks|[SequenceTasksRange](../messages/Base/SequenceTasksRange.md#)|[SequenceTasksConfiguration](../messages/Base/SequenceTasksConfiguration.md#)|Adds tasks to the specified sequence| +|UpdateSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTaskConfiguration](../messages/Base/SequenceTaskConfiguration.md#)|Updates a task within the specified sequence| +|SwapSequenceTasks|[Empty](../messages/Common/Empty.md#)|[SequenceTasksPair](../messages/Base/SequenceTasksPair.md#)|Swaps two task indexes in a sequence| +|ReadSequenceTask|[SequenceTask](../messages/Base/SequenceTask.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Reads a specific task from the specified sequence| +|ReadAllSequenceTasks|[SequenceTasks](../messages/Base/SequenceTasks.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Reads all tasks from the specified sequence| +|DeleteSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Deletes a specific task from the specified sequence| +|DeleteAllSequenceTasks|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Deletes all tasks from the specified sequence| +|TakeSnapshot|[Empty](../messages/Common/Empty.md#)|[Snapshot](../messages/Base/Snapshot.md#)|Take a snapshot of current robot Cartesian, joint or gripper position| +|GetFirmwareBundleVersions|[FirmwareBundleVersions](../messages/Base/FirmwareBundleVersions.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current firmware bundle versions| +|ExecuteWaypointTrajectory|[Empty](../messages/Common/Empty.md#)|[WaypointList](../messages/Base/WaypointList.md#)|Executes a trajectory defined by a series of waypoints in joint space or in Cartesian space| +|MoveSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTasksPair](../messages/Base/SequenceTasksPair.md#)|Move task to new index in a sequence| +|DuplicateMapping|[MappingHandle](../messages/Base/MappingHandle.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Duplicates an existing mapping| +|DuplicateMap|[MapHandle](../messages/Base/MapHandle.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Duplicates an existing map| +|SetControllerConfiguration|[Empty](../messages/Common/Empty.md#)|[ControllerConfiguration](../messages/Base/ControllerConfiguration.md#)|Sets controller configuration| +|GetControllerConfiguration|[ControllerConfiguration](../messages/Base/ControllerConfiguration.md#)|[ControllerHandle](../messages/Base/ControllerHandle.md#)|Retrieves current controller configuration| +|GetAllControllerConfigurations|[ControllerConfigurationList](../messages/Base/ControllerConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all controller configurations| +|ComputeForwardKinematics|[Pose](../messages/Base/Pose.md#)|[JointAngles](../messages/Base/JointAngles.md#)|Get the forward kinematics given specified angular positions of actuators| +|ComputeInverseKinematics|[JointAngles](../messages/Base/JointAngles.md#)|[IKData](../messages/Base/IKData.md#)|Get the inverse kinematics given a specified cartesian pose and guess of joint angles| +|ValidateWaypointList|[WaypointValidationReport](../messages/Base/WaypointValidationReport.md#)|[WaypointList](../messages/Base/WaypointList.md#)|Validate a waypoint list, returns an empty trajectory error report list if the waypoint list is valid. If the use\_optimal\_blending option is true, a waypoint list with optimal blending will be return.| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -20,6 +180,7 @@ This section describes the data classes used in this API, as well as their membe |[ActuatorInformation](../messages/Base/ActuatorInformation.md#)|A count of the number of actuators in the robot| |[Admittance](../messages/Base/Admittance.md#)|An admittance mode| |[AdvancedSequenceHandle](../messages/Base/AdvancedSequenceHandle.md#)|Reference to a sequence along with execution options| +|[AngularWaypoint](../messages/Base/AngularWaypoint.md#)|An angular Waypoint| |[AppendActionInformation](../messages/Base/AppendActionInformation.md#)|Representation of the result of appending \(adding at the end\) an action to an existing sequence \(not implemented yet\)| |[ArmStateInformation](../messages/Base/ArmStateInformation.md#)|Information about the arm state| |[ArmStateNotification](../messages/Base/ArmStateNotification.md#)|Notification about a single arm state event| @@ -33,6 +194,7 @@ This section describes the data classes used in this API, as well as their membe |[CartesianLimitationList](../messages/Base/CartesianLimitationList.md#)|Array of Cartesian limitations| |[CartesianSpeed](../messages/Base/CartesianSpeed.md#)|A Cartesian tool speed \(translation speed and angular speed\)| |[CartesianTrajectoryConstraint](../messages/Base/CartesianTrajectoryConstraint.md#)|Cartesian trajectory constraint that can be applied when controlling in Cartesian trajectory mode| +|[CartesianWaypoint](../messages/Base/CartesianWaypoint.md#)|A Cartesian Waypoint| |[ChangeJointSpeeds](../messages/Base/ChangeJointSpeeds.md#)|Action to change the maximum angular velocity per joint by a specific increment| |[ChangeTwist](../messages/Base/ChangeTwist.md#)|Action to change the maximum Cartesian velocity by a specific increment| |[ChangeWrench](../messages/Base/ChangeWrench.md#)|Action to change the maximum Cartesian force by a specific increment| @@ -67,10 +229,15 @@ This section describes the data classes used in this API, as well as their membe |[FirmwareComponentVersion](../messages/Base/FirmwareComponentVersion.md#)|Individual component with its version| |[FullIPv4Configuration](../messages/Base/FullIPv4Configuration.md#)|IPv4 configuration for a specific network| |[FullUserProfile](../messages/Base/FullUserProfile.md#)|Information about a user, together with a password. Full set of information needed to create a user profile.| -|[GpioEvent](../messages/Base/GpioEvent.md#)|A GPIO event \(not implemented yet\)| +|[GpioCommand](../messages/Base/GpioCommand.md#)|A command to control expansion port's GPIO| +|[GpioConfiguration](../messages/Base/GpioConfiguration.md#)|GPIO port configuration information| +|[GpioConfigurationList](../messages/Base/GpioConfigurationList.md#)|List of GPIO port configurations| +|[GpioEvent](../messages/Base/GpioEvent.md#)|A GPIO event| +|[GpioPinConfiguration](../messages/Base/GpioPinConfiguration.md#)|GPIO pin configuration information| |[Gripper](../messages/Base/Gripper.md#)|Gripper movement composed of a series of fingers movement| |[GripperCommand](../messages/Base/GripperCommand.md#)|A command to control the gripper movement| |[GripperRequest](../messages/Base/GripperRequest.md#)|Request to apply a specific gripper mode| +|[IKData](../messages/Base/IKData.md#)|Input needed for the calculation of inverse kinematics| |[IPv4Configuration](../messages/Base/IPv4Configuration.md#)|IPv4 configuration information| |[IPv4Information](../messages/Base/IPv4Information.md#)|Information about an IPv4 endpoint| |[JointAngle](../messages/Base/JointAngle.md#)|Angle value of a specific joint| @@ -82,6 +249,7 @@ This section describes the data classes used in this API, as well as their membe |[JointTorques](../messages/Base/JointTorques.md#)|An array of joint torques| |[JointTrajectoryConstraint](../messages/Base/JointTrajectoryConstraint.md#)|Joint trajectory constraint that can be applied when controlling a joint in trajectory mode| |[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|Array of joint limitations| +|[KinematicTrajectoryConstraints](../messages/Base/KinematicTrajectoryConstraints.md#)|Angular and Cartesian kinematic constraints \(maximum velocities\)| |[Map](../messages/Base/Map.md#)|A map as an array of map elements| |[MapElement](../messages/Base/MapElement.md#)|Associates an event to an action| |[MapEvent](../messages/Base/MapEvent.md#)|A map event| @@ -146,6 +314,7 @@ This section describes the data classes used in this API, as well as their membe |[Timeout](../messages/Base/Timeout.md#)|Timeout for a specified duration| |[TrajectoryErrorElement](../messages/Base/TrajectoryErrorElement.md#)|Details for a single trajectory validation error| |[TrajectoryErrorReport](../messages/Base/TrajectoryErrorReport.md#)|Report collecting information on different validation errors for a particular trajectory| +|[TrajectoryInfo](../messages/Base/TrajectoryInfo.md#)|Additional trajectory information| |[TransformationMatrix](../messages/Base/TransformationMatrix.md#)|A 4x4 homogeneous transformation matrix representing the transformation between two reference frames.| |[TransformationRow](../messages/Base/TransformationRow.md#)|A single row of a 4x4 homogeneous transformation matrix| |[Twist](../messages/Base/Twist.md#)|A twist \(linear and angular velocity\).| @@ -156,6 +325,9 @@ This section describes the data classes used in this API, as well as their membe |[UserNotificationList](../messages/Base/UserNotificationList.md#)|Array of user notifications| |[UserProfile](../messages/Base/UserProfile.md#)|Information about a user| |[UserProfileList](../messages/Base/UserProfileList.md#)|Array of user profiles| +|[Waypoint](../messages/Base/Waypoint.md#)|A waypoint describing part of a trajectory.| +|[WaypointList](../messages/Base/WaypointList.md#)|A waypoint list| +|[WaypointValidationReport](../messages/Base/WaypointValidationReport.md#)|Waypoint Validation results| |[WifiConfiguration](../messages/Base/WifiConfiguration.md#)|Wi-Fi connection configuration| |[WifiConfigurationList](../messages/Base/WifiConfigurationList.md#)|Array of Wi-Fi connection configuration for different networks| |[WifiInformation](../messages/Base/WifiInformation.md#)|Information about a specific Wi-Fi network| @@ -185,8 +357,10 @@ This section describes the data classes used in this API, as well as their membe |[ControllerType](../enums/Base/ControllerType.md#)|Admissible controller types| |[EventIdSequenceInfoNotification](../enums/Base/EventIdSequenceInfoNotification.md#)|Admissible sequence event types| |[FactoryEvent](../enums/Base/FactoryEvent.md#)|Admissible factory events| -|[Gen3GpioPinId](../enums/Base/Gen3GpioPinId.md#)|Available GPIO PIN \(not implemented yet\)| -|[GpioBehavior](../enums/Base/GpioBehavior.md#)|Admissible GPIO behavior \(not implemented yet\)| +|[Gen3GpioPinId](../enums/Base/Gen3GpioPinId.md#)|Available GPIO PIN \(See the user guide at section Base expansion connector\)| +|[GpioAction](../enums/Base/GpioAction.md#)|Admissible GPIO actions| +|[GpioBehavior](../enums/Base/GpioBehavior.md#)|Admissible GPIO behavior| +|[GpioPinPropertyFlags](../enums/Base/GpioPinPropertyFlags.md#)|Admissible gpio pin properties| |[GripperMode](../enums/Base/GripperMode.md#)|Admissible gripper control mode| |[JointNavigationDirection](../enums/Base/JointNavigationDirection.md#)|Admissible joint navigation directions| |[JointTrajectoryConstraintType](../enums/Base/JointTrajectoryConstraintType.md#)|Admissible constraint types that can be applied when controlling a joint in trajectory mode| @@ -206,8 +380,9 @@ This section describes the data classes used in this API, as well as their membe |[SnapshotType](../enums/Base/SnapshotType.md#)|Admissible types of snapshots| |[SoundType](../enums/Base/SoundType.md#)|Admissible sound types \(not implemented yet\)| |[TrajectoryContinuityMode](../enums/Base/TrajectoryContinuityMode.md#)|Admissible trajectory continuity mode| -|[TrajectoryErrorIdentifier](../enums/Base/TrajectoryErrorIdentifier.md#)|Trajectory validation error identifiers| +|[TrajectoryErrorIdentifier](../enums/Base/TrajectoryErrorIdentifier.md#)|This enum is deprecated and will be removed in a future release| |[TrajectoryErrorType](../enums/Base/TrajectoryErrorType.md#)|Trajectory validation error types| +|[TrajectoryInfoType](../enums/Base/TrajectoryInfoType.md#)|Additional trajectory info type| |[UserEvent](../enums/Base/UserEvent.md#)|Admissible user event types| |[WifiEncryptionType](../enums/Base/WifiEncryptionType.md#)|Admissible Wi-Fi encryption types| |[WifiSecurityType](../enums/Base/WifiSecurityType.md#)|Admissible Wi-Fi Security types| @@ -216,155 +391,3 @@ This section describes the data classes used in this API, as well as their membe |[Xbox360AnalogInputIdentifier](../enums/Base/Xbox360AnalogInputIdentifier.md#)|Admissible XBOX360 analog inputs| |[Xbox360DigitalInputIdentifier](../enums/Base/Xbox360DigitalInputIdentifier.md#)|Admissible XBOX360 digital inputs| -Base service. Broadly useful service. Provides functions for configuring a range of base-related functionalities and for enabling high-level control for the robot. - - **BaseClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|CreateUserProfile|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|[FullUserProfile](../messages/Base/FullUserProfile.md#)|Creates a user profile and returns a handle to the profile| -|UpdateUserProfile|[Empty](../messages/Common/Empty.md#)|[UserProfile](../messages/Base/UserProfile.md#)|Updates an existing user profile| -|ReadUserProfile|[UserProfile](../messages/Base/UserProfile.md#)|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|Retrieves an existing user profile| -|DeleteUserProfile|[Empty](../messages/Common/Empty.md#)|[UserProfileHandle](../messages/Common/UserProfileHandle.md#)|Deletes an existing user profile| -|ReadAllUserProfiles|[UserProfileList](../messages/Base/UserProfileList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all user profiles| -|ReadAllUsers|[UserList](../messages/Base/UserList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all user profile handles| -|ChangePassword|[Empty](../messages/Common/Empty.md#)|[PasswordChange](../messages/Base/PasswordChange.md#)|Changes the password of an existing user| -|CreateSequence|[SequenceHandle](../messages/Base/SequenceHandle.md#)|[Sequence](../messages/Base/Sequence.md#)|Creates a new sequence and returns a handle to the sequence| -|UpdateSequence|[Empty](../messages/Common/Empty.md#)|[Sequence](../messages/Base/Sequence.md#)|Updates an existing sequence| -|ReadSequence|[Sequence](../messages/Base/Sequence.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Retrieves an existing sequence| -|DeleteSequence|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Deletes an existing sequence| -|ReadAllSequences|[SequenceList](../messages/Base/SequenceList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all existing sequences| -|PlaySequence|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Plays an existing sequence| -|PlayAdvancedSequence|[Empty](../messages/Common/Empty.md#)|[AdvancedSequenceHandle](../messages/Base/AdvancedSequenceHandle.md#)|Plays an existing sequence with options| -|StopSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops execution of currently playing sequence| -|PauseSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Pauses execution of currently playing sequence| -|ResumeSequence|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Resumes execution of currently paused sequence| -|CreateProtectionZone|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|[ProtectionZone](../messages/Base/ProtectionZone.md#)|Creates a new protection zone and returns a handle to the protection zone| -|UpdateProtectionZone|[Empty](../messages/Common/Empty.md#)|[ProtectionZone](../messages/Base/ProtectionZone.md#)|Updates an existing protection zone| -|ReadProtectionZone|[ProtectionZone](../messages/Base/ProtectionZone.md#)|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|Retrieves an existing protection zone| -|DeleteProtectionZone|[Empty](../messages/Common/Empty.md#)|[ProtectionZoneHandle](../messages/Base/ProtectionZoneHandle.md#)|Deletes an existing protection zone| -|ReadAllProtectionZones|[ProtectionZoneList](../messages/Base/ProtectionZoneList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves a list of all protection zones| -|CreateMapping|[MappingHandle](../messages/Base/MappingHandle.md#)|[Mapping](../messages/Base/Mapping.md#)|Creates a new mapping| -|ReadMapping|[Mapping](../messages/Base/Mapping.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Retrieves an existing mapping| -|UpdateMapping|[Empty](../messages/Common/Empty.md#)|[Mapping](../messages/Base/Mapping.md#)|Updates an existing mapping| -|DeleteMapping|[Empty](../messages/Common/Empty.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Deletes an existing mapping| -|ReadAllMappings|[MappingList](../messages/Base/MappingList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves a list of all mappings| -|CreateMap|[MapHandle](../messages/Base/MapHandle.md#)|[Map](../messages/Base/Map.md#)|Creates a new map| -|ReadMap|[Map](../messages/Base/Map.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Retrieves an existing map| -|UpdateMap|[Empty](../messages/Common/Empty.md#)|[Map](../messages/Base/Map.md#)|Updates an existing map| -|DeleteMap|[Empty](../messages/Common/Empty.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Deletes an existing map| -|ReadAllMaps|[MapList](../messages/Base/MapList.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Retrieves a list of all maps associated to the specified mapping| -|ActivateMap|[Empty](../messages/Common/Empty.md#)|[ActivateMapHandle](../messages/Base/ActivateMapHandle.md#)|Activates the specified map within the specified map group and mapping| -|CreateAction|[ActionHandle](../messages/Base/ActionHandle.md#)|[Action](../messages/Base/Action.md#)|Creates a new action| -|ReadAction|[Action](../messages/Base/Action.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Retrieves an existing action| -|ReadAllActions|[ActionList](../messages/Base/ActionList.md#)|[RequestedActionType](../messages/Base/RequestedActionType.md#)|Retrieves a list of all existing actions| -|DeleteAction|[Empty](../messages/Common/Empty.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Deletes an existing action| -|UpdateAction|[Empty](../messages/Common/Empty.md#)|[Action](../messages/Base/Action.md#)|Updates an existing action| -|ExecuteActionFromReference|[Empty](../messages/Common/Empty.md#)|[ActionHandle](../messages/Base/ActionHandle.md#)|Commands the robot to execute the specified existing action| -|ExecuteAction|[Empty](../messages/Common/Empty.md#)|[Action](../messages/Base/Action.md#)|Commands the robot to execute the specified action| -|PauseAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Pauses the currently executed action. ResumeAction can be invoked afterwards| -|StopAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops the currently executed action. ResumeAction cannot be invoked afterwards| -|ResumeAction|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Resumes execution of the currently paused action| -|GetIPv4Configuration|[IPv4Configuration](../messages/Base/IPv4Configuration.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Retrieves the IPv4 network configuration for the specified network adapter| -|SetIPv4Configuration|[Empty](../messages/Common/Empty.md#)|[FullIPv4Configuration](../messages/Base/FullIPv4Configuration.md#)|Modifies the IPv4 network configuration for the specified network adapter| -|SetCommunicationInterfaceEnable|[Empty](../messages/Common/Empty.md#)|[CommunicationInterfaceConfiguration](../messages/Base/CommunicationInterfaceConfiguration.md#)|Enables \(or disables\) the specified communication interface| -|IsCommunicationInterfaceEnable|[CommunicationInterfaceConfiguration](../messages/Base/CommunicationInterfaceConfiguration.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Determines if the specified communication interface is enabled \(or disabled\)| -|GetAvailableWifi|[WifiInformationList](../messages/Base/WifiInformationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of available Wi-Fi networks| -|GetWifiInformation|[WifiInformation](../messages/Base/WifiInformation.md#)|[Ssid](../messages/Base/Ssid.md#)|Retrieves information about a specific Wi-Fi network| -|AddWifiConfiguration|[Empty](../messages/Common/Empty.md#)|[WifiConfiguration](../messages/Base/WifiConfiguration.md#)|Configures a specific Wi-Fi network| -|DeleteWifiConfiguration|[Empty](../messages/Common/Empty.md#)|[Ssid](../messages/Base/Ssid.md#)|Deletes a specific Wi-Fi network| -|GetAllConfiguredWifis|[WifiConfigurationList](../messages/Base/WifiConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of configured Wi-Fi networks| -|ConnectWifi|[Empty](../messages/Common/Empty.md#)|[Ssid](../messages/Base/Ssid.md#)|Connects robot to specified Wi-Fi network| -|DisconnectWifi|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Disconnects the robot from the currently connected Wi-Fi network| -|GetConnectedWifiInformation|[WifiInformation](../messages/Base/WifiInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves information about the connected Wi-Fi network| -|Unsubscribe|[Empty](../messages/Common/Empty.md#)|[NotificationHandle](../messages/Common/NotificationHandle.md#)|Unsubscribes client from receiving notifications for the specified topic| -|OnNotificationConfigurationChangeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to configuration change topic for notifications| -|OnNotificationMappingInfoTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to mapping information topic for notifications| -|OnNotificationControlModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to control mode topic for notifications| -|OnNotificationOperatingModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to operating mode topic for notifications| -|OnNotificationSequenceInfoTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to sequence information topic for notifications| -|OnNotificationProtectionZoneTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to protection zone topic for notifications| -|OnNotificationUserTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to user topic for notifications| -|OnNotificationControllerTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to controller topic for notifications| -|OnNotificationActionTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to action topic for notifications| -|OnNotificationRobotEventTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to robot event topic for notifications| -|PlayCartesianTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedPose](../messages/Base/ConstrainedPose.md#)|Moves robot to the specified tool pose \(position and orientation\) while imposing specified constraints.| -|PlayCartesianTrajectoryPosition|[Empty](../messages/Common/Empty.md#)|[ConstrainedPosition](../messages/Base/ConstrainedPosition.md#)|Moves robot to the specified position while imposing specified constraints.| -|PlayCartesianTrajectoryOrientation|[Empty](../messages/Common/Empty.md#)|[ConstrainedOrientation](../messages/Base/ConstrainedOrientation.md#)|Moves to the specified orientation while imposing specified constraints.| -|Stop|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops robot movement| -|GetMeasuredCartesianPose|[Pose](../messages/Base/Pose.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the current computed tool pose \(position and orientation\) for the robot| -|SendWrenchCommand|[Empty](../messages/Common/Empty.md#)|[WrenchCommand](../messages/Base/WrenchCommand.md#)|Sends a wrench command \(screw consisting of force and torque\) to be applied to the tool. This method is EXPERIMENTAL.| -|SendWrenchJoystickCommand|[Empty](../messages/Common/Empty.md#)|[WrenchCommand](../messages/Base/WrenchCommand.md#)|Sends a wrench \(screw consisting of force and torque\) joystick command to be applied to the tool. The wrench values sent to this call are expected to be a ratio of maximum value \(between -1.0/+1.0\). This method is EXPERIMENTAL.| -|SendTwistJoystickCommand|[Empty](../messages/Common/Empty.md#)|[TwistCommand](../messages/Base/TwistCommand.md#)|Sends a twist \(screw consisting of linear and angular velocity\) joystick command to be applied to the tool. The twist values sent to this call are expected to be a ratio of the maximum value \(between -1.0/+1.0\).| -|SendTwistCommand|[Empty](../messages/Common/Empty.md#)|[TwistCommand](../messages/Base/TwistCommand.md#)|Sends a twist \(screw consisting of linear and angular velocity\) command to be applied to the tool| -|PlayJointTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedJointAngles](../messages/Base/ConstrainedJointAngles.md#)|Moves joints to the specified joint angles while imposing specified constraints.| -|PlaySelectedJointTrajectory|[Empty](../messages/Common/Empty.md#)|[ConstrainedJointAngle](../messages/Base/ConstrainedJointAngle.md#)|Moves specifed joint to the specifed joint angle while imposing specified constraints.| -|GetMeasuredJointAngles|[JointAngles](../messages/Base/JointAngles.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the currently measured joint angles for each joint| -|SendJointSpeedsCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeeds](../messages/Base/JointSpeeds.md#)|Sends a set of joint speed commands to all joints with one command. Joint speed commmands must be sent to all joints. If you do not want to move some of the joints, simply send a speed value of 0 degrees / second for that joint.| -|SendSelectedJointSpeedCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeed](../messages/Base/JointSpeed.md#)|Sends a speed command for a specific joint| -|SendGripperCommand|[Empty](../messages/Common/Empty.md#)|[GripperCommand](../messages/Base/GripperCommand.md#)|Sends a command to move the gripper| -|GetMeasuredGripperMovement|[Gripper](../messages/Base/Gripper.md#)|[GripperRequest](../messages/Base/GripperRequest.md#)|Retrieves the current gripper movement, that is the current gripper position, force or speed| -|SetAdmittance|[Empty](../messages/Common/Empty.md#)|[Admittance](../messages/Base/Admittance.md#)|Sets the robot in the chosen admittance mode| -|SetOperatingMode|[Empty](../messages/Common/Empty.md#)|[OperatingModeInformation](../messages/Base/OperatingModeInformation.md#)|Sets a new operating mode. Only Maintenance, Update and Run modes are permitted.| -|ApplyEmergencyStop|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Stops robot movement and activates emergency stop state. You will not be able to move the robot. Use ClearFaults\(\) to clear the stop.| -|ClearFaults|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Clears robot stop. Robot is permitted to move again.| -|GetControlMode|[ControlModeInformation](../messages/Base/ControlModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current control mode| -|GetOperatingMode|[OperatingModeInformation](../messages/Base/OperatingModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current operating mode| -|SetServoingMode|[Empty](../messages/Common/Empty.md#)|[ServoingModeInformation](../messages/Base/ServoingModeInformation.md#)|Sets the servoing mode| -|GetServoingMode|[ServoingModeInformation](../messages/Base/ServoingModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current servoing mode| -|OnNotificationServoingModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to servoing mode topic for notifications| -|RestoreFactorySettings|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Deletes all configurations and reverts settings to their factory defaults \(except network settings\)| -|Reboot|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Reboots the robot| -|OnNotificationFactoryTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to factory topic for notifications| -|GetAllConnectedControllers|[ControllerList](../messages/Base/ControllerList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of all connected controllers| -|GetControllerState|[ControllerState](../messages/Base/ControllerState.md#)|[ControllerHandle](../messages/Base/ControllerHandle.md#)|Retrieves the state of a specified controller| -|GetActuatorCount|[ActuatorInformation](../messages/Base/ActuatorInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the number of actuators in the robot| -|StartWifiScan|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Initiates Wi-Fi scanning| -|GetConfiguredWifi|[WifiConfiguration](../messages/Base/WifiConfiguration.md#)|[Ssid](../messages/Base/Ssid.md#)|Retrieves a configured Wi-Fi network| -|OnNotificationNetworkTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to network event notifications| -|GetArmState|[ArmStateInformation](../messages/Base/ArmStateInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current robot arm state| -|OnNotificationArmStateTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to robot arm state notifications| -|GetIPv4Information|[IPv4Information](../messages/Base/IPv4Information.md#)|[NetworkHandle](../messages/Base/NetworkHandle.md#)|Retrieves the IPv4 network information for the specified network adapter| -|SetWifiCountryCode|[Empty](../messages/Common/Empty.md#)|[CountryCode](../messages/Common/CountryCode.md#)|Sets the Wi-Fi country code| -|GetWifiCountryCode|[CountryCode](../messages/Common/CountryCode.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the Wi-Fi country code| -|SetCapSenseConfig|[Empty](../messages/Common/Empty.md#)|[CapSenseConfig](../messages/Base/CapSenseConfig.md#)|Configures capacitive sensor on the gripper or wrist| -|GetCapSenseConfig|[CapSenseConfig](../messages/Base/CapSenseConfig.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves configuration of capacitive sensor on the gripper or wrist| -|GetAllJointsSpeedHardLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves speed hard limits for all joints. **This function will be removed in a future release. Use GetKinematicHardLimits from the ControlConfig service instead.**| -|GetAllJointsTorqueHardLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves torque hard limits for all joints. **This function will be removed in a future release.**| -|GetTwistHardLimitation|[TwistLimitation](../messages/Base/TwistLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves twist hard limitations. **This function will be removed in a future release. Use GetKinematicHardLimits from the ControlConfig service instead.**| -|GetWrenchHardLimitation|[WrenchLimitation](../messages/Base/WrenchLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves wrench hard limitations. **This function will be removed in a future release.**| -|SendJointSpeedsJoystickCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeeds](../messages/Base/JointSpeeds.md#)|Sends the desired joystick speeds to all joints with one command. The speed values sent to this call are expected to be a ratio of the maximum value \(between -1.0/+1.0\) Speeds must be sent to all joints. If you don't want to move some of the joints, send a value of 0.| -|SendSelectedJointSpeedJoystickCommand|[Empty](../messages/Common/Empty.md#)|[JointSpeed](../messages/Base/JointSpeed.md#)|Sends a joystick speed for a specific joint. The speed value sent to this call is expected to be a ratio of the maximum value \(between -1.0/+1.0\)| -|EnableBridge|[BridgeResult](../messages/Base/BridgeResult.md#)|[BridgeConfig](../messages/Base/BridgeConfig.md#)|Enables TCP bridge to hardware device| -|DisableBridge|[BridgeResult](../messages/Base/BridgeResult.md#)|[BridgeIdentifier](../messages/Base/BridgeIdentifier.md#)|Disables specified TCP bridge| -|GetBridgeList|[BridgeList](../messages/Base/BridgeList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of created bridges| -|GetBridgeConfig|[BridgeConfig](../messages/Base/BridgeConfig.md#)|[BridgeIdentifier](../messages/Base/BridgeIdentifier.md#)|Retrieves configuration for specified bridge| -|PlayPreComputedJointTrajectory|[Empty](../messages/Common/Empty.md#)|[PreComputedJointTrajectory](../messages/Base/PreComputedJointTrajectory.md#)|Plays a pre-computed angular trajectory| -|GetProductConfiguration|[CompleteProductConfiguration](../messages/ProductConfiguration/CompleteProductConfiguration.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves product configuration information| -|UpdateEndEffectorTypeConfiguration|[Empty](../messages/Common/Empty.md#)|[ProductConfigurationEndEffectorType](../messages/ProductConfiguration/ProductConfigurationEndEffectorType.md#)|Set new end-effector type in product configuration \(Identification Number\)| -|RestoreFactoryProductConfiguration|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Restores product configuration to factory product configuration| -|GetTrajectoryErrorReport|[TrajectoryErrorReport](../messages/Base/TrajectoryErrorReport.md#)|[Empty](../messages/Common/Empty.md#)|Obtains trajectory error report listing errors for rejected trajectory. Provides some feedback on why the trajectory could not be completed.| -|GetAllJointsSpeedSoftLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of soft speed limits for all joints. **This function will be removed in a future release. Use GetKinematicSoftLimits from the ControlConfig service instead.**| -|GetAllJointsTorqueSoftLimitation|[JointsLimitationsList](../messages/Base/JointsLimitationsList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves list of soft torque limits for all joints. **This function will be removed in a future release.**| -|GetTwistSoftLimitation|[TwistLimitation](../messages/Base/TwistLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all twist soft limitations. **This function will be removed in a future release. Use GetKinematicSoftLimits from the ControlConfig service instead.**| -|GetWrenchSoftLimitation|[WrenchLimitation](../messages/Base/WrenchLimitation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all wrench soft limitations. **This function will be removed in a future release.**| -|SetControllerConfigurationMode|[Empty](../messages/Common/Empty.md#)|[ControllerConfigurationMode](../messages/Base/ControllerConfigurationMode.md#)|Sets controller configuration mode| -|GetControllerConfigurationMode|[ControllerConfigurationMode](../messages/Base/ControllerConfigurationMode.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current controller configuration mode| -|StartTeaching|[Empty](../messages/Common/Empty.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Enables the teaching mode on a sequence| -|StopTeaching|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Disables the teaching mode on a sequence| -|AddSequenceTasks|[SequenceTasksRange](../messages/Base/SequenceTasksRange.md#)|[SequenceTasksConfiguration](../messages/Base/SequenceTasksConfiguration.md#)|Adds tasks to the specified sequence| -|UpdateSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTaskConfiguration](../messages/Base/SequenceTaskConfiguration.md#)|Updates a task within the specified sequence| -|SwapSequenceTasks|[Empty](../messages/Common/Empty.md#)|[SequenceTasksPair](../messages/Base/SequenceTasksPair.md#)|Swaps two task indexes in a sequence| -|ReadSequenceTask|[SequenceTask](../messages/Base/SequenceTask.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Reads a specific task from the specified sequence| -|ReadAllSequenceTasks|[SequenceTasks](../messages/Base/SequenceTasks.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Reads all tasks from the specified sequence| -|DeleteSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTaskHandle](../messages/Base/SequenceTaskHandle.md#)|Deletes a specific task from the specified sequence| -|DeleteAllSequenceTasks|[Empty](../messages/Common/Empty.md#)|[SequenceHandle](../messages/Base/SequenceHandle.md#)|Deletes all tasks from the specified sequence| -|TakeSnapshot|[Empty](../messages/Common/Empty.md#)|[Snapshot](../messages/Base/Snapshot.md#)|Take a snapshot of current robot Cartesian, joint or gripper position| -|GetFirmwareBundleVersions|[FirmwareBundleVersions](../messages/Base/FirmwareBundleVersions.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current firmware bundle versions| -|MoveSequenceTask|[Empty](../messages/Common/Empty.md#)|[SequenceTasksPair](../messages/Base/SequenceTasksPair.md#)|Move task to new index in a sequence| -|DuplicateMapping|[MappingHandle](../messages/Base/MappingHandle.md#)|[MappingHandle](../messages/Base/MappingHandle.md#)|Duplicates an existing mapping| -|DuplicateMap|[MapHandle](../messages/Base/MapHandle.md#)|[MapHandle](../messages/Base/MapHandle.md#)|Duplicates an existing map| -|SetControllerConfiguration|[Empty](../messages/Common/Empty.md#)|[ControllerConfiguration](../messages/Base/ControllerConfiguration.md#)|Sets controller configuration| -|GetControllerConfiguration|[ControllerConfiguration](../messages/Base/ControllerConfiguration.md#)|[ControllerHandle](../messages/Base/ControllerHandle.md#)|Retrieves current controller configuration| -|GetAllControllerConfigurations|[ControllerConfigurationList](../messages/Base/ControllerConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves all controller configurations| - diff --git a/api_cpp/doc/markdown/summary_pages/BaseCyclic.md b/api_cpp/doc/markdown/summary_pages/BaseCyclic.md index ce9ef040..51db3055 100644 --- a/api_cpp/doc/markdown/summary_pages/BaseCyclic.md +++ b/api_cpp/doc/markdown/summary_pages/BaseCyclic.md @@ -2,9 +2,24 @@ This page describes the C++ BaseCyclic API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to exchange cyclic data with base + + **BaseCyclicClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|Refresh|[Feedback](../messages/BaseCyclic/Feedback.md#)|[Command](../messages/BaseCyclic/Command.md#)|Sends a command to actuators and interface and returns feedback from base, actuators, and interface on actual status| +|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/BaseCyclic/Command.md#)|Sends a command to actuators and interface without receiving feedback| +|RefreshFeedback|[Feedback](../messages/BaseCyclic/Feedback.md#)|[Empty](../messages/Common/Empty.md#)|Obtains feedback from base, actuators, and interface on their status| +|RefreshCustomData|[CustomData](../messages/BaseCyclic/CustomData.md#)|[CustomData](../messages/BaseCyclic/CustomData.md#)|Retrieves custom data| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -24,14 +39,3 @@ This section describes the data classes used in this API, as well as their membe |----------|-----------| |[ServiceVersion](../enums/BaseCyclic/ServiceVersion.md#)|Identifies BaseCyclic current version| -Service to exchange cyclic data with base - - **BaseCyclicClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|Refresh|[Feedback](../messages/BaseCyclic/Feedback.md#)|[Command](../messages/BaseCyclic/Command.md#)|Sends a command to actuators and interface and returns feedback from base, actuators, and interface on actual status| -|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/BaseCyclic/Command.md#)|Sends a command to actuators and interface without receiving feedback| -|RefreshFeedback|[Feedback](../messages/BaseCyclic/Feedback.md#)|[Empty](../messages/Common/Empty.md#)|Obtains feedback from base, actuators, and interface on their status| -|RefreshCustomData|[CustomData](../messages/BaseCyclic/CustomData.md#)|[CustomData](../messages/BaseCyclic/CustomData.md#)|Retrieves custom data| - diff --git a/api_cpp/doc/markdown/summary_pages/Common.md b/api_cpp/doc/markdown/summary_pages/Common.md index 4d06af97..edc1e79c 100644 --- a/api_cpp/doc/markdown/summary_pages/Common.md +++ b/api_cpp/doc/markdown/summary_pages/Common.md @@ -2,9 +2,13 @@ This page describes the C++ Common API. +## RPC reference + +This section describes the existing RPCs used in this API. + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** diff --git a/api_cpp/doc/markdown/summary_pages/ControlConfig.md b/api_cpp/doc/markdown/summary_pages/ControlConfig.md index 41ce5f11..72452730 100644 --- a/api_cpp/doc/markdown/summary_pages/ControlConfig.md +++ b/api_cpp/doc/markdown/summary_pages/ControlConfig.md @@ -2,40 +2,9 @@ This page describes the C++ ControlConfig API. -## Class reference - -This section describes the data classes used in this API, as well as their member values and member functions. +## RPC reference - **Messages** - -|Class|Description| -|-----|-----------| -|[AngularTwist](../messages/ControlConfig/AngularTwist.md#)|Desired Joystick angular speed.| -|[CartesianReferenceFrameInfo](../messages/ControlConfig/CartesianReferenceFrameInfo.md#)|Cartesian reference frame| -|[CartesianTransform](../messages/ControlConfig/CartesianTransform.md#)|Defines a Cartesian transform| -|[ControlConfigurationNotification](../messages/ControlConfig/ControlConfigurationNotification.md#)|Notification about a single control configuration event| -|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|Control mode information| -|[DesiredSpeeds](../messages/ControlConfig/DesiredSpeeds.md#)|Desired Joystick speeds.| -|[GravityVector](../messages/ControlConfig/GravityVector.md#)|Defines the gravity vector in terms of the robot base frame. If not explicitly configured, it defaults to \(0, 0, -9.81\), assuming a mounting on a horizontal surface. If the robot is mounted on a wall or ceiling, the gravity vector relative to the base frame will change. The control library needs to be aware of this to accurately compensate for gravity.| -|[JointAccelerationSoftLimits](../messages/ControlConfig/JointAccelerationSoftLimits.md#)|Software Joint acceleration limits| -|[JointSpeedSoftLimits](../messages/ControlConfig/JointSpeedSoftLimits.md#)|Software joint speed limits| -|[JointSpeeds](../messages/ControlConfig/JointSpeeds.md#)|Desired Joystick joint speeds.| -|[KinematicLimits](../messages/ControlConfig/KinematicLimits.md#)|Kinematic limits| -|[KinematicLimitsList](../messages/ControlConfig/KinematicLimitsList.md#)|Kinematic limits| -|[LinearTwist](../messages/ControlConfig/LinearTwist.md#)|Desired Joystick linear speed.| -|[PayloadInformation](../messages/ControlConfig/PayloadInformation.md#)|Defines payload information| -|[Position](../messages/ControlConfig/Position.md#)|A Cartesian position| -|[ToolConfiguration](../messages/ControlConfig/ToolConfiguration.md#)|Defines a tool configuration| -|[TwistAngularSoftLimit](../messages/ControlConfig/TwistAngularSoftLimit.md#)|Software twist angular speed limit| -|[TwistLinearSoftLimit](../messages/ControlConfig/TwistLinearSoftLimit.md#)|Software twist linear speed limit| - - **Enumerators** - -|Enumerator|Description| -|----------|-----------| -|[ControlConfigurationEvent](../enums/ControlConfig/ControlConfigurationEvent.md#)|Admissible control configuration events| -|[ControlMode](../enums/ControlConfig/ControlMode.md#)|Admissible robot control modes| -|[ServiceVersion](../enums/ControlConfig/ServiceVersion.md#)|Identifies ControlConfig current version| +This section describes the existing RPCs used in this API. Service to configure robot control library @@ -53,7 +22,7 @@ Service to configure robot control library |Unsubscribe|[Empty](../messages/Common/Empty.md#)|[NotificationHandle](../messages/Common/NotificationHandle.md#)|Unsubscribes client from receiving specified type of notifications| |SetCartesianReferenceFrame|[Empty](../messages/Common/Empty.md#)|[CartesianReferenceFrameInfo](../messages/ControlConfig/CartesianReferenceFrameInfo.md#)|Defines the reference frame to use with twist and wrench commands| |GetCartesianReferenceFrame|[CartesianReferenceFrameInfo](../messages/ControlConfig/CartesianReferenceFrameInfo.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the current reference frame used by the twist and wrench commands| -|GetControlMode|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current control mode \(not implemented yet\)| +|GetControlMode|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves current control mode| |SetJointSpeedSoftLimits|[Empty](../messages/Common/Empty.md#)|[JointSpeedSoftLimits](../messages/ControlConfig/JointSpeedSoftLimits.md#)|Set the software joint speed limits.| |SetTwistLinearSoftLimit|[Empty](../messages/Common/Empty.md#)|[TwistLinearSoftLimit](../messages/ControlConfig/TwistLinearSoftLimit.md#)|Set the software twist linear limit.| |SetTwistAngularSoftLimit|[Empty](../messages/Common/Empty.md#)|[TwistAngularSoftLimit](../messages/ControlConfig/TwistAngularSoftLimit.md#)|Set the software twist angular limit.| @@ -72,4 +41,41 @@ Service to configure robot control library |ResetTwistLinearSoftLimit|[TwistLinearSoftLimit](../messages/ControlConfig/TwistLinearSoftLimit.md#)|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|Resets twist linear soft limit to default value| |ResetTwistAngularSoftLimit|[TwistAngularSoftLimit](../messages/ControlConfig/TwistAngularSoftLimit.md#)|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|Resets twist angular soft limit to default value| |ResetJointAccelerationSoftLimits|[JointAccelerationSoftLimits](../messages/ControlConfig/JointAccelerationSoftLimits.md#)|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|Resets joint acceleration soft limits to default values| +|OnNotificationControlModeTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to control mode topic for notifications| + +## Class reference + +This section describes the data classes used in this API. + + **Messages** + +|Class|Description| +|-----|-----------| +|[AngularTwist](../messages/ControlConfig/AngularTwist.md#)|Desired Joystick angular speed.| +|[CartesianReferenceFrameInfo](../messages/ControlConfig/CartesianReferenceFrameInfo.md#)|Cartesian reference frame| +|[CartesianTransform](../messages/ControlConfig/CartesianTransform.md#)|Defines a Cartesian transform| +|[ControlConfigurationNotification](../messages/ControlConfig/ControlConfigurationNotification.md#)|Notification about a single control configuration event| +|[ControlModeInformation](../messages/ControlConfig/ControlModeInformation.md#)|Control mode information| +|[ControlModeNotification](../messages/ControlConfig/ControlModeNotification.md#)|Notification about a single control mode event| +|[DesiredSpeeds](../messages/ControlConfig/DesiredSpeeds.md#)|Desired Joystick speeds.| +|[GravityVector](../messages/ControlConfig/GravityVector.md#)|Defines the gravity vector in terms of the robot base frame. If not explicitly configured, it defaults to \(0, 0, -9.81\), assuming a mounting on a horizontal surface. If the robot is mounted on a wall or ceiling, the gravity vector relative to the base frame will change. The control library needs to be aware of this to accurately compensate for gravity.| +|[JointAccelerationSoftLimits](../messages/ControlConfig/JointAccelerationSoftLimits.md#)|Software Joint acceleration limits| +|[JointSpeedSoftLimits](../messages/ControlConfig/JointSpeedSoftLimits.md#)|Software joint speed limits| +|[JointSpeeds](../messages/ControlConfig/JointSpeeds.md#)|Desired Joystick joint speeds.| +|[KinematicLimits](../messages/ControlConfig/KinematicLimits.md#)|Kinematic limits| +|[KinematicLimitsList](../messages/ControlConfig/KinematicLimitsList.md#)|Kinematic limits| +|[LinearTwist](../messages/ControlConfig/LinearTwist.md#)|Desired Joystick linear speed.| +|[PayloadInformation](../messages/ControlConfig/PayloadInformation.md#)|Defines payload information| +|[Position](../messages/ControlConfig/Position.md#)|A Cartesian position| +|[ToolConfiguration](../messages/ControlConfig/ToolConfiguration.md#)|Defines a tool configuration| +|[TwistAngularSoftLimit](../messages/ControlConfig/TwistAngularSoftLimit.md#)|Software twist angular speed limit| +|[TwistLinearSoftLimit](../messages/ControlConfig/TwistLinearSoftLimit.md#)|Software twist linear speed limit| + + **Enumerators** + +|Enumerator|Description| +|----------|-----------| +|[ControlConfigurationEvent](../enums/ControlConfig/ControlConfigurationEvent.md#)|Admissible control configuration events| +|[ControlMode](../enums/ControlConfig/ControlMode.md#)|Admissible robot control modes| +|[ServiceVersion](../enums/ControlConfig/ServiceVersion.md#)|Identifies ControlConfig current version| diff --git a/api_cpp/doc/markdown/summary_pages/DeviceConfig.md b/api_cpp/doc/markdown/summary_pages/DeviceConfig.md index 9d5c9015..6ad0b8e7 100644 --- a/api_cpp/doc/markdown/summary_pages/DeviceConfig.md +++ b/api_cpp/doc/markdown/summary_pages/DeviceConfig.md @@ -2,9 +2,54 @@ This page describes the C++ DeviceConfig API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to get and set device configuration information + + **DeviceConfigClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|GetRunMode|[RunMode](../messages/DeviceConfig/RunMode.md#)|[Empty](../messages/Common/Empty.md#)|Returns the run mode for the device| +|SetRunMode|[Empty](../messages/Common/Empty.md#)|[RunMode](../messages/DeviceConfig/RunMode.md#)|Sets the run mode for the device| +|GetDeviceType|[DeviceType](../messages/DeviceConfig/DeviceType.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the type for the device| +|GetFirmwareVersion|[FirmwareVersion](../messages/DeviceConfig/FirmwareVersion.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device firmware version| +|GetBootloaderVersion|[BootloaderVersion](../messages/DeviceConfig/BootloaderVersion.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device bootloader version| +|GetModelNumber|[ModelNumber](../messages/DeviceConfig/ModelNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device model number| +|GetPartNumber|[PartNumber](../messages/DeviceConfig/PartNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device part number| +|GetSerialNumber|[SerialNumber](../messages/DeviceConfig/SerialNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device serial number| +|GetMACAddress|[MACAddress](../messages/DeviceConfig/MACAddress.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device MAC address| +|GetIPv4Settings|[IPv4Settings](../messages/DeviceConfig/IPv4Settings.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device IPv4 settings \(not implemented on Base\)| +|SetIPv4Settings|[Empty](../messages/Common/Empty.md#)|[IPv4Settings](../messages/DeviceConfig/IPv4Settings.md#)|Sets the device IPv4 settings \(not implemented on Base\)| +|GetPartNumberRevision|[PartNumberRevision](../messages/DeviceConfig/PartNumberRevision.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device part number revision| +|RebootRequest|[Empty](../messages/Common/Empty.md#)|[RebootRqst](../messages/DeviceConfig/RebootRqst.md#)|Sends a request to the device to reboot| +|SetSafetyEnable|[Empty](../messages/Common/Empty.md#)|[SafetyEnable](../messages/DeviceConfig/SafetyEnable.md#)|Enables \(disable\) the specified safety| +|SetSafetyErrorThreshold|[Empty](../messages/Common/Empty.md#)|[SafetyThreshold](../messages/DeviceConfig/SafetyThreshold.md#)|Sets the error threshold for the specified safety| +|SetSafetyWarningThreshold|[Empty](../messages/Common/Empty.md#)|[SafetyThreshold](../messages/DeviceConfig/SafetyThreshold.md#)|Sets the warning threshold for the specified safety| +|SetSafetyConfiguration|[Empty](../messages/Common/Empty.md#)|[SafetyConfiguration](../messages/DeviceConfig/SafetyConfiguration.md#)|Configures the specified safety \(i.e. sets error and warning thresholds\)| +|GetSafetyConfiguration|[SafetyConfiguration](../messages/DeviceConfig/SafetyConfiguration.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Retrieves configuration about the specified safety| +|GetSafetyInformation|[SafetyInformation](../messages/DeviceConfig/SafetyInformation.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Retrieves information about the specified safety| +|GetSafetyEnable|[SafetyEnable](../messages/DeviceConfig/SafetyEnable.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Indicates if specified safety is enabled \(or disabled\)| +|GetSafetyStatus|[SafetyStatus](../messages/DeviceConfig/SafetyStatus.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Indicates if the specified safety is raised| +|ClearAllSafetyStatus|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Clear all safety status for this device if they are no longer raised| +|ClearSafetyStatus|[Empty](../messages/Common/Empty.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Clear a specific safety status if it is no longer raised| +|GetAllSafetyConfiguration|[SafetyConfigurationList](../messages/DeviceConfig/SafetyConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves configuration on all safeties| +|GetAllSafetyInformation|[SafetyInformationList](../messages/DeviceConfig/SafetyInformationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves information on all safeties| +|ResetSafetyDefaults|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Restores all safety configurations to factory defaults| +|OnNotificationSafetyTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to safety notifications| +|ExecuteCalibration|[Empty](../messages/Common/Empty.md#)|[Calibration](../messages/DeviceConfig/Calibration.md#)|Starts device calibration \(intended for Kinova Production of Pico\)| +|GetCalibrationResult|[CalibrationResult](../messages/DeviceConfig/CalibrationResult.md#)|[CalibrationElement](../messages/DeviceConfig/CalibrationElement.md#)|Retrieves the status/result of device calibration \(intended for Kinova Production of Pico\)| +|StopCalibration|[CalibrationResult](../messages/DeviceConfig/CalibrationResult.md#)|[Calibration](../messages/DeviceConfig/Calibration.md#)|Stop calibration in progress| +|SetCapSenseConfig|[Empty](../messages/Common/Empty.md#)|[CapSenseConfig](../messages/DeviceConfig/CapSenseConfig.md#)|Sets the capacitive sensor calibration| +|GetCapSenseConfig|[CapSenseConfig](../messages/DeviceConfig/CapSenseConfig.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the capacitive sensor calibration| +|ReadCapSenseRegister|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|Reads low-level register from the capacitive sensor \(for Kinova internal use ony, not to be used in the field\)| +|WriteCapSenseRegister|[Empty](../messages/Common/Empty.md#)|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|Writes to low-level register of the capacitive sensor \(for Kinova internal use ony, not to be used in the field\)| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -47,44 +92,3 @@ This section describes the data classes used in this API, as well as their membe |[SafetyLimitType](../enums/DeviceConfig/SafetyLimitType.md#)|Types of safeties limits| |[ServiceVersion](../enums/DeviceConfig/ServiceVersion.md#)|Identifies DeviceConfig current version| -Service to get and set device configuration information - - **DeviceConfigClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|GetRunMode|[RunMode](../messages/DeviceConfig/RunMode.md#)|[Empty](../messages/Common/Empty.md#)|Returns the run mode for the device| -|SetRunMode|[Empty](../messages/Common/Empty.md#)|[RunMode](../messages/DeviceConfig/RunMode.md#)|Sets the run mode for the device| -|GetDeviceType|[DeviceType](../messages/DeviceConfig/DeviceType.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the type for the device| -|GetFirmwareVersion|[FirmwareVersion](../messages/DeviceConfig/FirmwareVersion.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device firmware version| -|GetBootloaderVersion|[BootloaderVersion](../messages/DeviceConfig/BootloaderVersion.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device bootloader version| -|GetModelNumber|[ModelNumber](../messages/DeviceConfig/ModelNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device model number| -|GetPartNumber|[PartNumber](../messages/DeviceConfig/PartNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device part number| -|GetSerialNumber|[SerialNumber](../messages/DeviceConfig/SerialNumber.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device serial number| -|GetMACAddress|[MACAddress](../messages/DeviceConfig/MACAddress.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device MAC address| -|GetIPv4Settings|[IPv4Settings](../messages/DeviceConfig/IPv4Settings.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device IPv4 settings \(not implemented on Base\)| -|SetIPv4Settings|[Empty](../messages/Common/Empty.md#)|[IPv4Settings](../messages/DeviceConfig/IPv4Settings.md#)|Sets the device IPv4 settings \(not implemented on Base\)| -|GetPartNumberRevision|[PartNumberRevision](../messages/DeviceConfig/PartNumberRevision.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the device part number revision| -|RebootRequest|[Empty](../messages/Common/Empty.md#)|[RebootRqst](../messages/DeviceConfig/RebootRqst.md#)|Sends a request to the device to reboot| -|SetSafetyEnable|[Empty](../messages/Common/Empty.md#)|[SafetyEnable](../messages/DeviceConfig/SafetyEnable.md#)|Enables \(disable\) the specified safety| -|SetSafetyErrorThreshold|[Empty](../messages/Common/Empty.md#)|[SafetyThreshold](../messages/DeviceConfig/SafetyThreshold.md#)|Sets the error threshold for the specified safety| -|SetSafetyWarningThreshold|[Empty](../messages/Common/Empty.md#)|[SafetyThreshold](../messages/DeviceConfig/SafetyThreshold.md#)|Sets the warning threshold for the specified safety| -|SetSafetyConfiguration|[Empty](../messages/Common/Empty.md#)|[SafetyConfiguration](../messages/DeviceConfig/SafetyConfiguration.md#)|Configures the specified safety \(i.e. sets error and warning thresholds\)| -|GetSafetyConfiguration|[SafetyConfiguration](../messages/DeviceConfig/SafetyConfiguration.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Retrieves configuration about the specified safety| -|GetSafetyInformation|[SafetyInformation](../messages/DeviceConfig/SafetyInformation.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Retrieves information about the specified safety| -|GetSafetyEnable|[SafetyEnable](../messages/DeviceConfig/SafetyEnable.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Indicates if specified safety is enabled \(or disabled\)| -|GetSafetyStatus|[SafetyStatus](../messages/DeviceConfig/SafetyStatus.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Indicates if the specified safety is raised| -|ClearAllSafetyStatus|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Clear all safety status for this device if they are no longer raised| -|ClearSafetyStatus|[Empty](../messages/Common/Empty.md#)|[SafetyHandle](../messages/Common/SafetyHandle.md#)|Clear a specific safety status if it is no longer raised| -|GetAllSafetyConfiguration|[SafetyConfigurationList](../messages/DeviceConfig/SafetyConfigurationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves configuration on all safeties| -|GetAllSafetyInformation|[SafetyInformationList](../messages/DeviceConfig/SafetyInformationList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves information on all safeties| -|ResetSafetyDefaults|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Restores all safety configurations to factory defaults| -|OnNotificationSafetyTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to safety notifications| -|ExecuteCalibration|[Empty](../messages/Common/Empty.md#)|[Calibration](../messages/DeviceConfig/Calibration.md#)|Starts device calibration \(intended for Kinova Production of Pico\)| -|GetCalibrationResult|[CalibrationResult](../messages/DeviceConfig/CalibrationResult.md#)|[CalibrationElement](../messages/DeviceConfig/CalibrationElement.md#)|Retrieves the status/result of device calibration \(intended for Kinova Production of Pico\)| -|StopCalibration|[CalibrationResult](../messages/DeviceConfig/CalibrationResult.md#)|[Calibration](../messages/DeviceConfig/Calibration.md#)|Stop calibration in progress| -|SetCapSenseConfig|[Empty](../messages/Common/Empty.md#)|[CapSenseConfig](../messages/DeviceConfig/CapSenseConfig.md#)|Sets the capacitive sensor calibration| -|GetCapSenseConfig|[CapSenseConfig](../messages/DeviceConfig/CapSenseConfig.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the capacitive sensor calibration| -|ReadCapSenseRegister|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|Reads low-level register from the capacitive sensor \(for Kinova internal use ony, not to be used in the field\)| -|WriteCapSenseRegister|[Empty](../messages/Common/Empty.md#)|[CapSenseRegister](../messages/DeviceConfig/CapSenseRegister.md#)|Writes to low-level register of the capacitive sensor \(for Kinova internal use ony, not to be used in the field\)| - diff --git a/api_cpp/doc/markdown/summary_pages/DeviceManager.md b/api_cpp/doc/markdown/summary_pages/DeviceManager.md index 13bfaa9d..70e2b6f1 100644 --- a/api_cpp/doc/markdown/summary_pages/DeviceManager.md +++ b/api_cpp/doc/markdown/summary_pages/DeviceManager.md @@ -2,9 +2,21 @@ This page describes the C++ DeviceManager API. +## RPC reference + +This section describes the existing RPCs used in this API. + +This service provides information about which devices are present in the robot + + **DeviceManagerClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|ReadAllDevices|[DeviceHandles](../messages/DeviceManager/DeviceHandles.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of every device that the system contains, along with its type and order within the system| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -18,11 +30,3 @@ This section describes the data classes used in this API, as well as their membe |----------|-----------| |[ServiceVersion](../enums/DeviceManager/ServiceVersion.md#)|Identifies DeviceManager service current version| -This service provides information about which devices are present in the robot - - **DeviceManagerClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|ReadAllDevices|[DeviceHandles](../messages/DeviceManager/DeviceHandles.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of every device that the system contains, along with its type and order within the system| - diff --git a/api_cpp/doc/markdown/summary_pages/GripperConfig.md b/api_cpp/doc/markdown/summary_pages/GripperConfig.md index da9a4b1f..25eb62f3 100644 --- a/api_cpp/doc/markdown/summary_pages/GripperConfig.md +++ b/api_cpp/doc/markdown/summary_pages/GripperConfig.md @@ -2,9 +2,13 @@ This page describes the C++ GripperConfig API. +## RPC reference + +This section describes the existing RPCs used in this API. + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Enumerators** diff --git a/api_cpp/doc/markdown/summary_pages/GripperCyclic.md b/api_cpp/doc/markdown/summary_pages/GripperCyclic.md index f914d2bb..4d3acf80 100644 --- a/api_cpp/doc/markdown/summary_pages/GripperCyclic.md +++ b/api_cpp/doc/markdown/summary_pages/GripperCyclic.md @@ -2,9 +2,24 @@ This page describes the C++ GripperCyclic API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to exchange cyclic data with gripper + + **GripperCyclicClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|Refresh|[Feedback](../messages/GripperCyclic/Feedback.md#)|[Command](../messages/GripperCyclic/Command.md#)|Sends a command to the gripper and receives feedback about the actual status of the gripper| +|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/GripperCyclic/Command.md#)|Sends a command to the gripper without receiving feedback| +|RefreshFeedback|[Feedback](../messages/GripperCyclic/Feedback.md#)|[MessageId](../messages/GripperCyclic/MessageId.md#)|Obtains feedback from the gripper on its status| +|RefreshCustomData|[CustomData](../messages/GripperCyclic/CustomData.md#)|[MessageId](../messages/GripperCyclic/MessageId.md#)|Obtains custom data from the gripper| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -24,14 +39,3 @@ This section describes the data classes used in this API, as well as their membe |----------|-----------| |[ServiceVersion](../enums/GripperCyclic/ServiceVersion.md#)| | -Service to exchange cyclic data with gripper - - **GripperCyclicClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|Refresh|[Feedback](../messages/GripperCyclic/Feedback.md#)|[Command](../messages/GripperCyclic/Command.md#)|Sends a command to the gripper and receives feedback about the actual status of the gripper| -|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/GripperCyclic/Command.md#)|Sends a command to the gripper without receiving feedback| -|RefreshFeedback|[Feedback](../messages/GripperCyclic/Feedback.md#)|[MessageId](../messages/GripperCyclic/MessageId.md#)|Obtains feedback from the gripper on its status| -|RefreshCustomData|[CustomData](../messages/GripperCyclic/CustomData.md#)|[MessageId](../messages/GripperCyclic/MessageId.md#)|Obtains custom data from the gripper| - diff --git a/api_cpp/doc/markdown/summary_pages/InterconnectConfig.md b/api_cpp/doc/markdown/summary_pages/InterconnectConfig.md index ee853603..eb95793c 100644 --- a/api_cpp/doc/markdown/summary_pages/InterconnectConfig.md +++ b/api_cpp/doc/markdown/summary_pages/InterconnectConfig.md @@ -2,9 +2,34 @@ This page describes the C++ InterconnectConfig API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to get and set interface module \(interconnect\) configuration information, including user expansion + + **InterconnectConfigClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|GetUARTConfiguration|[UARTConfiguration](../messages/Common/UARTConfiguration.md#)|[UARTDeviceIdentification](../messages/Common/UARTDeviceIdentification.md#)|Retrieves user UART configuration| +|SetUARTConfiguration|[Empty](../messages/Common/Empty.md#)|[UARTConfiguration](../messages/Common/UARTConfiguration.md#)|Configures user UART| +|GetEthernetConfiguration|[EthernetConfiguration](../messages/InterconnectConfig/EthernetConfiguration.md#)|[EthernetDeviceIdentification](../messages/InterconnectConfig/EthernetDeviceIdentification.md#)|Retrieves user Ethernet configuration| +|SetEthernetConfiguration|[Empty](../messages/Common/Empty.md#)|[EthernetConfiguration](../messages/InterconnectConfig/EthernetConfiguration.md#)|Configures user Ethernet port| +|GetGPIOConfiguration|[GPIOConfiguration](../messages/InterconnectConfig/GPIOConfiguration.md#)|[GPIOIdentification](../messages/InterconnectConfig/GPIOIdentification.md#)|Retrieves user GPIO configuration| +|SetGPIOConfiguration|[Empty](../messages/Common/Empty.md#)|[GPIOConfiguration](../messages/InterconnectConfig/GPIOConfiguration.md#)|Configures user GPIO| +|GetGPIOState|[GPIOState](../messages/InterconnectConfig/GPIOState.md#)|[GPIOIdentification](../messages/InterconnectConfig/GPIOIdentification.md#)|Retrieves user GPIO state| +|SetGPIOState|[Empty](../messages/Common/Empty.md#)|[GPIOState](../messages/InterconnectConfig/GPIOState.md#)|Configures user GPIO state| +|GetI2CConfiguration|[I2CConfiguration](../messages/InterconnectConfig/I2CConfiguration.md#)|[I2CDeviceIdentification](../messages/InterconnectConfig/I2CDeviceIdentification.md#)|Retrieves user I2C configuration| +|SetI2CConfiguration|[Empty](../messages/Common/Empty.md#)|[I2CConfiguration](../messages/InterconnectConfig/I2CConfiguration.md#)|Configures user I2C| +|I2CRead|[I2CData](../messages/InterconnectConfig/I2CData.md#)|[I2CReadParameter](../messages/InterconnectConfig/I2CReadParameter.md#)|Performs an I2C read request| +|I2CReadRegister|[I2CData](../messages/InterconnectConfig/I2CData.md#)|[I2CReadRegisterParameter](../messages/InterconnectConfig/I2CReadRegisterParameter.md#)|Performs an I2C read register request| +|I2CWrite|[Empty](../messages/Common/Empty.md#)|[I2CWriteParameter](../messages/InterconnectConfig/I2CWriteParameter.md#)|Performs an I2C write request| +|I2CWriteRegister|[Empty](../messages/Common/Empty.md#)|[I2CWriteRegisterParameter](../messages/InterconnectConfig/I2CWriteRegisterParameter.md#)|Performs an I2C write register request| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -42,24 +67,3 @@ This section describes the data classes used in this API, as well as their membe |[ServiceVersion](../enums/InterconnectConfig/ServiceVersion.md#)|Identifies InterconnectConfig current version| |[UARTPortId](../enums/InterconnectConfig/UARTPortId.md#)|Admissible UART port| -Service to get and set interface module \(interconnect\) configuration information, including user expansion - - **InterconnectConfigClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|GetUARTConfiguration|[UARTConfiguration](../messages/Common/UARTConfiguration.md#)|[UARTDeviceIdentification](../messages/Common/UARTDeviceIdentification.md#)|Retrieves user UART configuration| -|SetUARTConfiguration|[Empty](../messages/Common/Empty.md#)|[UARTConfiguration](../messages/Common/UARTConfiguration.md#)|Configures user UART| -|GetEthernetConfiguration|[EthernetConfiguration](../messages/InterconnectConfig/EthernetConfiguration.md#)|[EthernetDeviceIdentification](../messages/InterconnectConfig/EthernetDeviceIdentification.md#)|Retrieves user Ethernet configuration| -|SetEthernetConfiguration|[Empty](../messages/Common/Empty.md#)|[EthernetConfiguration](../messages/InterconnectConfig/EthernetConfiguration.md#)|Configures user Ethernet port| -|GetGPIOConfiguration|[GPIOConfiguration](../messages/InterconnectConfig/GPIOConfiguration.md#)|[GPIOIdentification](../messages/InterconnectConfig/GPIOIdentification.md#)|Retrieves user GPIO configuration| -|SetGPIOConfiguration|[Empty](../messages/Common/Empty.md#)|[GPIOConfiguration](../messages/InterconnectConfig/GPIOConfiguration.md#)|Configures user GPIO| -|GetGPIOState|[GPIOState](../messages/InterconnectConfig/GPIOState.md#)|[GPIOIdentification](../messages/InterconnectConfig/GPIOIdentification.md#)|Retrieves user GPIO state| -|SetGPIOState|[Empty](../messages/Common/Empty.md#)|[GPIOState](../messages/InterconnectConfig/GPIOState.md#)|Configures user GPIO state| -|GetI2CConfiguration|[I2CConfiguration](../messages/InterconnectConfig/I2CConfiguration.md#)|[I2CDeviceIdentification](../messages/InterconnectConfig/I2CDeviceIdentification.md#)|Retrieves user I2C configuration| -|SetI2CConfiguration|[Empty](../messages/Common/Empty.md#)|[I2CConfiguration](../messages/InterconnectConfig/I2CConfiguration.md#)|Configures user I2C| -|I2CRead|[I2CData](../messages/InterconnectConfig/I2CData.md#)|[I2CReadParameter](../messages/InterconnectConfig/I2CReadParameter.md#)|Performs an I2C read request| -|I2CReadRegister|[I2CData](../messages/InterconnectConfig/I2CData.md#)|[I2CReadRegisterParameter](../messages/InterconnectConfig/I2CReadRegisterParameter.md#)|Performs an I2C read register request| -|I2CWrite|[Empty](../messages/Common/Empty.md#)|[I2CWriteParameter](../messages/InterconnectConfig/I2CWriteParameter.md#)|Performs an I2C write request| -|I2CWriteRegister|[Empty](../messages/Common/Empty.md#)|[I2CWriteRegisterParameter](../messages/InterconnectConfig/I2CWriteRegisterParameter.md#)|Performs an I2C write register request| - diff --git a/api_cpp/doc/markdown/summary_pages/InterconnectCyclic.md b/api_cpp/doc/markdown/summary_pages/InterconnectCyclic.md index 284c3042..246ed4fa 100644 --- a/api_cpp/doc/markdown/summary_pages/InterconnectCyclic.md +++ b/api_cpp/doc/markdown/summary_pages/InterconnectCyclic.md @@ -2,9 +2,24 @@ This page describes the C++ InterconnectCyclic API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to exchange cyclic data with interface module + + **InterconnectCyclicClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|Refresh|[Feedback](../messages/InterconnectCyclic/Feedback.md#)|[Command](../messages/InterconnectCyclic/Command.md#)|Sends a command to the interface module and receive feedback about the actual status| +|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/InterconnectCyclic/Command.md#)|Sends a command to the interface module without receiving feedback| +|RefreshFeedback|[Feedback](../messages/InterconnectCyclic/Feedback.md#)|[MessageId](../messages/InterconnectCyclic/MessageId.md#)|Obtains feedback from the interface module on its status| +|RefreshCustomData|[CustomData](../messages/InterconnectCyclic/CustomData.md#)|[MessageId](../messages/InterconnectCyclic/MessageId.md#)|Obtains custom data from the interface module| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -21,14 +36,3 @@ This section describes the data classes used in this API, as well as their membe |----------|-----------| |[ServiceVersion](../enums/InterconnectCyclic/ServiceVersion.md#)|Identifies InterconnectCyclic service current version| -Service to exchange cyclic data with interface module - - **InterconnectCyclicClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|Refresh|[Feedback](../messages/InterconnectCyclic/Feedback.md#)|[Command](../messages/InterconnectCyclic/Command.md#)|Sends a command to the interface module and receive feedback about the actual status| -|RefreshCommand|[Empty](../messages/Common/Empty.md#)|[Command](../messages/InterconnectCyclic/Command.md#)|Sends a command to the interface module without receiving feedback| -|RefreshFeedback|[Feedback](../messages/InterconnectCyclic/Feedback.md#)|[MessageId](../messages/InterconnectCyclic/MessageId.md#)|Obtains feedback from the interface module on its status| -|RefreshCustomData|[CustomData](../messages/InterconnectCyclic/CustomData.md#)|[MessageId](../messages/InterconnectCyclic/MessageId.md#)|Obtains custom data from the interface module| - diff --git a/api_cpp/doc/markdown/summary_pages/NotificationTopics.md b/api_cpp/doc/markdown/summary_pages/NotificationTopics.md deleted file mode 100644 index d3a3d10a..00000000 --- a/api_cpp/doc/markdown/summary_pages/NotificationTopics.md +++ /dev/null @@ -1,43 +0,0 @@ -# Subscribing to Notifications - -In order to receive notifications on a topic, a program must subscribe to it using the following syntax: - -C++ -``` -service->OnNotification<$TopicName$>(callback, NotificationOptions) -``` - -Python -``` -service.OnNotification<$TopicName$>(callback, NotificationOptions) -``` - -Where: -* `service` is the API service responsible for publishing -* `<$TopicName$>` should be replaced by the appropriate topic name -* `callback` is a user-defined callback function -* `NotificationOptions` is an empty NotificationOptions object - -Below is a list of all the topics made available by each service. - -## List of available Notification Topics - -|Service|Topic name|Description|Example| -|----------|-----|-----------|--------| -|Base|ConfigurationChangeTopic|Publishes on any configuration change|Action is modified| -|Base|MappingInfoTopic|Publishes on Controler mapping change|Set user-defined XBox controller mapping| -|Base|ControlModeTopic|Publishes on Control mode event|Switch control mode to joystick| -|Base|OperatingModeTopic|Publishes on Operating mode change|Robot operating mode switches to UPDATING_DEVICE_MODE| -|Base|SequenceInfoTopic|Publishes on Sequence progress|Sequence current action is COMPLETE| -|Base|ProtectionZoneTopic|Publishes on interaction with Protection Zones| Protection zone is entered| -|Base|UserTopic|Publishes on User activity| User Logged in| -|Base|ControllerTopic|Publishes on Controller activity| XBox controller axis 1 set to -1| -|Base|ActionTopic|Publishes on Action activity|Action is started| -|Base|RobotEventTopic|Publishes on Robot Event|Tool was disconnected| -|Base|ServoingModeTopic|Publishes on Servoing mode change|Robot is set to LOW_LEVEL servoing| -|Base|FactoryTopic|Publishes on Factory activity|Factory reset is complete| -|Base|NetworkTopic|Publishes on Network activity|Connected to Wi-Fi network| -|Base|ArmStateTopic|Publishes on Arm State activity| Arm state changes to ARMSTATE_SERVOING_PLAYING_SEQUENCE| -|ControlConfig|ControlConfigurationTopic|Publishes on Control Configuration change|Gravity vector was changed| -|DeviceConfig|SafetyTopic|Publishes on Safety-related activity|Robot error was raised| -|VisionConfig|VisionTopic|Publishes on vision configuration change|Focus action complete| \ No newline at end of file diff --git a/api_cpp/doc/markdown/summary_pages/ProductConfiguration.md b/api_cpp/doc/markdown/summary_pages/ProductConfiguration.md index 3c0a992c..9e4d5d14 100644 --- a/api_cpp/doc/markdown/summary_pages/ProductConfiguration.md +++ b/api_cpp/doc/markdown/summary_pages/ProductConfiguration.md @@ -2,9 +2,13 @@ This page describes the C++ ProductConfiguration API. +## RPC reference + +This section describes the existing RPCs used in this API. + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** diff --git a/api_cpp/doc/markdown/summary_pages/Session.md b/api_cpp/doc/markdown/summary_pages/Session.md index a592f444..376ff277 100644 --- a/api_cpp/doc/markdown/summary_pages/Session.md +++ b/api_cpp/doc/markdown/summary_pages/Session.md @@ -2,9 +2,24 @@ This page describes the C++ Session API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to manage user sessions + + **SessionClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|CreateSession|[Empty](../messages/Common/Empty.md#)|[CreateSessionInfo](../messages/Session/CreateSessionInfo.md#)|Creates a new session on the robot using given values for user name, session timeout value, and password| +|CloseSession|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Closes an existing open session| +|KeepAlive|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Sends message to robot to keep current session alive| +|GetConnections|[ConnectionList](../messages/Session/ConnectionList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of connections| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -19,14 +34,3 @@ This section describes the data classes used in this API, as well as their membe |----------|-----------| |[ServiceVersion](../enums/Session/ServiceVersion.md#)|Identifies session service current version| -Service to manage user sessions - - **SessionClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|CreateSession|[Empty](../messages/Common/Empty.md#)|[CreateSessionInfo](../messages/Session/CreateSessionInfo.md#)|Creates a new session on the robot using given values for user name, session timeout value, and password| -|CloseSession|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Closes an existing open session| -|KeepAlive|[Empty](../messages/Common/Empty.md#)|[Empty](../messages/Common/Empty.md#)|Sends message to robot to keep current session alive| -|GetConnections|[ConnectionList](../messages/Session/ConnectionList.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves the list of connections| - diff --git a/api_cpp/doc/markdown/summary_pages/VisionConfig.md b/api_cpp/doc/markdown/summary_pages/VisionConfig.md index d110bb8c..1531bbe7 100644 --- a/api_cpp/doc/markdown/summary_pages/VisionConfig.md +++ b/api_cpp/doc/markdown/summary_pages/VisionConfig.md @@ -2,9 +2,32 @@ This page describes the C++ VisionConfig API. +## RPC reference + +This section describes the existing RPCs used in this API. + +Service to configure the Vision Module + + **VisionConfigClient RPCs** + +|Function name|Return type|Input type|Description| +|-------------|-----------|----------|-----------| +|SetSensorSettings|[Empty](../messages/Common/Empty.md#)|[SensorSettings](../messages/VisionConfig/SensorSettings.md#)|Sets sensor settings \(resolution, frame rate, etc\)| +|GetSensorSettings|[SensorSettings](../messages/VisionConfig/SensorSettings.md#)|[SensorIdentifier](../messages/VisionConfig/SensorIdentifier.md#)|Retrieves sensor settings \(resolution, frame rate, etc\)| +|GetOptionValue|[OptionValue](../messages/VisionConfig/OptionValue.md#)|[OptionIdentifier](../messages/VisionConfig/OptionIdentifier.md#)|Retrieves option value from the sensor| +|SetOptionValue|[Empty](../messages/Common/Empty.md#)|[OptionValue](../messages/VisionConfig/OptionValue.md#)|Writes new value to sensor option| +|GetOptionInformation|[OptionInformation](../messages/VisionConfig/OptionInformation.md#)|[OptionIdentifier](../messages/VisionConfig/OptionIdentifier.md#)|Retrieves option information from the sensor| +|OnNotificationVisionTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to Vision configuration notifications| +|DoSensorFocusAction|[Empty](../messages/Common/Empty.md#)|[SensorFocusAction](../messages/VisionConfig/SensorFocusAction.md#)|Do a focus action| +|GetIntrinsicParameters|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|[SensorIdentifier](../messages/VisionConfig/SensorIdentifier.md#)|Retrieves sensor intrinsic parameters| +|GetIntrinsicParametersProfile|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|[IntrinsicProfileIdentifier](../messages/VisionConfig/IntrinsicProfileIdentifier.md#)|Retrieves sensor intrinsic parameters for a specific profile| +|SetIntrinsicParameters|[Empty](../messages/Common/Empty.md#)|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|Sets sensor intrinsic parameters| +|GetExtrinsicParameters|[ExtrinsicParameters](../messages/VisionConfig/ExtrinsicParameters.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves sensor extrinsic parameters| +|SetExtrinsicParameters|[Empty](../messages/Common/Empty.md#)|[ExtrinsicParameters](../messages/VisionConfig/ExtrinsicParameters.md#)|Sets sensor extrinsic parameters| + ## Class reference -This section describes the data classes used in this API, as well as their member values and member functions. +This section describes the data classes used in this API. **Messages** @@ -40,22 +63,3 @@ This section describes the data classes used in this API, as well as their membe |[ServiceVersion](../enums/VisionConfig/ServiceVersion.md#)|Identifies VisionConfig service current version| |[VisionEvent](../enums/VisionConfig/VisionEvent.md#)|Admissible Vision module events.| -Service to configure the Vision Module - - **VisionConfigClient RPCs** - -|Function name|Return type|Input type|Description| -|-------------|-----------|----------|-----------| -|SetSensorSettings|[Empty](../messages/Common/Empty.md#)|[SensorSettings](../messages/VisionConfig/SensorSettings.md#)|Sets sensor settings \(resolution, frame rate, etc\)| -|GetSensorSettings|[SensorSettings](../messages/VisionConfig/SensorSettings.md#)|[SensorIdentifier](../messages/VisionConfig/SensorIdentifier.md#)|Retrieves sensor settings \(resolution, frame rate, etc\)| -|GetOptionValue|[OptionValue](../messages/VisionConfig/OptionValue.md#)|[OptionIdentifier](../messages/VisionConfig/OptionIdentifier.md#)|Retrieves option value from the sensor| -|SetOptionValue|[Empty](../messages/Common/Empty.md#)|[OptionValue](../messages/VisionConfig/OptionValue.md#)|Writes new value to sensor option| -|GetOptionInformation|[OptionInformation](../messages/VisionConfig/OptionInformation.md#)|[OptionIdentifier](../messages/VisionConfig/OptionIdentifier.md#)|Retrieves option information from the sensor| -|OnNotificationVisionTopic|[NotificationHandle](../messages/Common/NotificationHandle.md#)|[NotificationOptions](../messages/Common/NotificationOptions.md#)|Subscribes to Vision configuration notifications| -|DoSensorFocusAction|[Empty](../messages/Common/Empty.md#)|[SensorFocusAction](../messages/VisionConfig/SensorFocusAction.md#)|Do a focus action| -|GetIntrinsicParameters|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|[SensorIdentifier](../messages/VisionConfig/SensorIdentifier.md#)|Retrieves sensor intrinsic parameters| -|GetIntrinsicParametersProfile|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|[IntrinsicProfileIdentifier](../messages/VisionConfig/IntrinsicProfileIdentifier.md#)|Retrieves sensor intrinsic parameters for a specific profile| -|SetIntrinsicParameters|[Empty](../messages/Common/Empty.md#)|[IntrinsicParameters](../messages/VisionConfig/IntrinsicParameters.md#)|Sets sensor intrinsic parameters| -|GetExtrinsicParameters|[ExtrinsicParameters](../messages/VisionConfig/ExtrinsicParameters.md#)|[Empty](../messages/Common/Empty.md#)|Retrieves sensor extrinsic parameters| -|SetExtrinsicParameters|[Empty](../messages/Common/Empty.md#)|[ExtrinsicParameters](../messages/VisionConfig/ExtrinsicParameters.md#)|Sets sensor extrinsic parameters| - diff --git a/api_cpp/examples/000-Getting_started/01-api_creation.cpp b/api_cpp/examples/000-Getting_started/01-api_creation.cpp index 68cd9265..a227f89c 100644 --- a/api_cpp/examples/000-Getting_started/01-api_creation.cpp +++ b/api_cpp/examples/000-Getting_started/01-api_creation.cpp @@ -17,24 +17,27 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 -void example_api_creation() +void example_api_creation(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // ----------------------------------------------------------- // How to create an API with the SessionManager, DeviceConfigClient and BaseClient services auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) @@ -72,5 +75,5 @@ void example_api_creation() int main(int argc, char **argv) { - example_api_creation(); + example_api_creation(argc, argv); } \ No newline at end of file diff --git a/api_cpp/examples/000-Getting_started/03-api_mechanism.cpp b/api_cpp/examples/000-Getting_started/03-api_mechanism.cpp index d2557ec3..558792c0 100644 --- a/api_cpp/examples/000-Getting_started/03-api_mechanism.cpp +++ b/api_cpp/examples/000-Getting_started/03-api_mechanism.cpp @@ -12,35 +12,43 @@ #include #include +#include #include #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 /***************************** * Example related functions * *****************************/ -void print_limitations(const k_api::Base::JointsLimitationsList& limitations) +void print_action_list(const k_api::Base::ActionList& action_list) { - std::cout << "============================================" << std::endl; - for(auto limitation : limitations.joints_limitations()) + std::cout << "List of all actions in the arm:" << std::endl; + for(auto action : action_list.action_list()) { - std::cout << "Joint: " << limitation.joint_identifier() << std::endl; - std::cout << "Type of limitation: " << k_api::Base::LimitationType_Name(limitation.type()) << std::endl; - std::cout << "Value: " << limitation.value() << std::endl << std::endl; + std::cout << "============================================" << std::endl; + std::cout << "Action name : " << action.name() << std::endl; + std::cout << "Action identifier: " << action.handle().identifier() << std::endl; + std::cout << "Action type: " << Kinova::Api::Base::ActionType_Name(action.handle().action_type()) << std::endl; + std::cout << "Action permissions: " << std::endl; + if (action.handle().permission() & Kinova::Api::Common::NO_PERMISSION) std::cout << "\t- " << Kinova::Api::Common::Permission_Name(Kinova::Api::Common::NO_PERMISSION) << std::endl; + if (action.handle().permission() & Kinova::Api::Common::READ_PERMISSION) std::cout << "\t- " << Kinova::Api::Common::Permission_Name(Kinova::Api::Common::READ_PERMISSION) << std::endl; + if (action.handle().permission() & Kinova::Api::Common::UPDATE_PERMISSION) std::cout << "\t- " << Kinova::Api::Common::Permission_Name(Kinova::Api::Common::UPDATE_PERMISSION) << std::endl; + if (action.handle().permission() & Kinova::Api::Common::DELETE_PERMISSION) std::cout << "\t- " << Kinova::Api::Common::Permission_Name(Kinova::Api::Common::DELETE_PERMISSION) << std::endl; + std::cout << "============================================" << std::endl; } - std::cout << "============================================" << std::endl << std::endl; } -void function_callback(const k_api::Error& err, const k_api::Base::JointsLimitationsList& limitations) +void function_callback(const k_api::Error& err, const k_api::Base::ActionList& action_list) { - std::cout << "Callback function results: " << std::endl << std::endl; - print_limitations(limitations); + std::cout << "Callback function results: " << std::endl; + print_action_list(action_list); } /************************** @@ -49,41 +57,45 @@ void function_callback(const k_api::Error& err, const k_api::Base::JointsLimitat void example_blocking_function_call(k_api::Base::BaseClient* base) { // Execution will be blocked until GetAvailableWifi has completed execution. - auto limitations = base->GetAllJointsSpeedHardLimitation(); + k_api::Base::RequestedActionType requested_action_type; + auto action_list = base->ReadAllActions(requested_action_type); std::cout << "Blocking function results: " << std::endl << std::endl; - print_limitations(limitations); + print_action_list(action_list); } void example_callback_function_call(k_api::Base::BaseClient* base) { // Specify a callback to be executed when the method executes. - base->GetAllJointsSpeedHardLimitation_callback(function_callback); + // The callback is the argument after the input, if any + k_api::Base::RequestedActionType requested_action_type; + base->ReadAllActions_callback(requested_action_type, function_callback); // A lambda function can also be used as a callback function. - auto lambda_function_callback = [](const k_api::Error &err, const k_api::Base::JointsLimitationsList& limitations) + auto lambda_function_callback = [](const k_api::Error &err, const k_api::Base::ActionList& action_list) { - print_limitations(limitations); + print_action_list(action_list); }; - base->GetAllJointsSpeedHardLimitation_callback(lambda_function_callback); + base->ReadAllActions_callback(requested_action_type, lambda_function_callback); } void example_future_function_call(k_api::Base::BaseClient* base) { // The function returns a future object, and not a workable object. - std::future limitations_future_async = base->GetAllJointsSpeedHardLimitation_async(); + k_api::Base::RequestedActionType requested_action_type; + std::future action_list_future_async = base->ReadAllActions_async(requested_action_type); // Waiting for the promise to be completed by the API. auto timeout_ms = std::chrono::milliseconds(10000); - std::future_status status = limitations_future_async.wait_for(timeout_ms); + std::future_status status = action_list_future_async.wait_for(timeout_ms); if(status != std::future_status::ready) { throw std::runtime_error("Timeout detected while waiting for function\n"); } // Retrieve the workable object from the future object. - auto limitations_async = limitations_future_async.get(); + auto action_list_async = action_list_future_async.get(); std::cout << "Future function results: " << std::endl << std::endl; - print_limitations(limitations_async); + print_action_list(action_list_async); } @@ -105,24 +117,27 @@ void example_router_option(k_api::Base::BaseClient* base) router_options.andForget = false; router_options.delay_ms = 0; // (milliseconds) - auto limitations = base->GetAllJointsSpeedHardLimitation(device_id, router_options); + k_api::Base::RequestedActionType requested_action_type; + auto action_list = base->ReadAllActions(requested_action_type, device_id, router_options); std::cout << "Call with router option results: " << std::endl << std::endl; - print_limitations(limitations); + print_action_list(action_list); } int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/000-Getting_started/04-error_management.cpp b/api_cpp/examples/000-Getting_started/04-error_management.cpp index 5b672bd4..3998b6a7 100644 --- a/api_cpp/examples/000-Getting_started/04-error_management.cpp +++ b/api_cpp/examples/000-Getting_started/04-error_management.cpp @@ -20,9 +20,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 void example_error_management(k_api::Base::BaseClient* base) @@ -51,16 +52,18 @@ void example_error_management(k_api::Base::BaseClient* base) int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/000-Getting_started/05-notification.cpp b/api_cpp/examples/000-Getting_started/05-notification.cpp index 9dd4fdf7..a02258b1 100644 --- a/api_cpp/examples/000-Getting_started/05-notification.cpp +++ b/api_cpp/examples/000-Getting_started/05-notification.cpp @@ -19,9 +19,10 @@ #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 void example_notification(k_api::Base::BaseClient* base) @@ -86,16 +87,18 @@ void example_notification(k_api::Base::BaseClient* base) int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/100-Overview/01-devices_routing.cpp b/api_cpp/examples/100-Overview/01-devices_routing.cpp index af0c55a3..d327f3c4 100644 --- a/api_cpp/examples/100-Overview/01-devices_routing.cpp +++ b/api_cpp/examples/100-Overview/01-devices_routing.cpp @@ -21,7 +21,8 @@ #include -#define IP_ADDRESS "192.168.1.10" +#include "utilities.h" + #define PORT 10000 namespace k_api = Kinova::Api; @@ -67,16 +68,18 @@ void example_device_routing(k_api::DeviceManager::DeviceManagerClient* device_ma int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/100-Overview/02-protection_zones_configuration.cpp b/api_cpp/examples/100-Overview/02-protection_zones_configuration.cpp index 17db67a8..7d60c7d4 100644 --- a/api_cpp/examples/100-Overview/02-protection_zones_configuration.cpp +++ b/api_cpp/examples/100-Overview/02-protection_zones_configuration.cpp @@ -18,7 +18,8 @@ #include -#define IP_ADDRESS "192.168.1.10" +#include "utilities.h" + #define PORT 10000 namespace k_api = Kinova::Api; @@ -231,16 +232,18 @@ void print_protection_zones(k_api::Base::BaseClient* base) int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/102-Movement_high_level/01-move_angular_and_cartesian.cpp b/api_cpp/examples/102-High_level_movement/01-move_angular_and_cartesian.cpp similarity index 97% rename from api_cpp/examples/102-Movement_high_level/01-move_angular_and_cartesian.cpp rename to api_cpp/examples/102-High_level_movement/01-move_angular_and_cartesian.cpp index 872386e2..40ecbd95 100644 --- a/api_cpp/examples/102-Movement_high_level/01-move_angular_and_cartesian.cpp +++ b/api_cpp/examples/102-High_level_movement/01-move_angular_and_cartesian.cpp @@ -17,7 +17,8 @@ #include #include -#define IP_ADDRESS "192.168.1.10" +#include "utilities.h" + #define PORT 10000 namespace k_api = Kinova::Api; @@ -118,6 +119,10 @@ bool example_move_to_home_position(k_api::Base::BaseClient* base) return false; } const auto promise_event = finish_future.get(); + + std::cout << "Move to Home completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(promise_event) << std::endl; + return true; } } @@ -336,16 +341,18 @@ bool example_cartesian_trajectory_movement(k_api::Base::BaseClient* base, k_api: int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/102-Movement_high_level/02-sequence.cpp b/api_cpp/examples/102-High_level_movement/02-sequence.cpp similarity index 96% rename from api_cpp/examples/102-Movement_high_level/02-sequence.cpp rename to api_cpp/examples/102-High_level_movement/02-sequence.cpp index f5418504..4e38be18 100644 --- a/api_cpp/examples/102-Movement_high_level/02-sequence.cpp +++ b/api_cpp/examples/102-High_level_movement/02-sequence.cpp @@ -17,9 +17,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 // Maximum allowed waiting time during actions @@ -81,7 +82,7 @@ std::function }; } -void create_angular_action(k_api::Base::Action* action, int actuator_count) +void create_angular_action(k_api::Base::Action* action, unsigned int actuator_count) { std::cout << "Creating angular action" << std::endl; @@ -222,16 +223,18 @@ bool example_create_sequence(k_api::Base::BaseClient* base, k_api::BaseCyclic::B int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/102-Movement_high_level/03-twist_command.cpp b/api_cpp/examples/102-High_level_movement/03-twist_command.cpp similarity index 95% rename from api_cpp/examples/102-Movement_high_level/03-twist_command.cpp rename to api_cpp/examples/102-High_level_movement/03-twist_command.cpp index c6b689a4..10353cce 100644 --- a/api_cpp/examples/102-Movement_high_level/03-twist_command.cpp +++ b/api_cpp/examples/102-High_level_movement/03-twist_command.cpp @@ -16,9 +16,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 // Maximum allowed waiting time during actions @@ -131,16 +132,18 @@ bool example_twist_command(k_api::Base::BaseClient* base) int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/102-Movement_high_level/04-send_joint_speeds.cpp b/api_cpp/examples/102-High_level_movement/04-send_joint_speeds.cpp similarity index 96% rename from api_cpp/examples/102-Movement_high_level/04-send_joint_speeds.cpp rename to api_cpp/examples/102-High_level_movement/04-send_joint_speeds.cpp index 8b4df1a7..c66bab30 100644 --- a/api_cpp/examples/102-Movement_high_level/04-send_joint_speeds.cpp +++ b/api_cpp/examples/102-High_level_movement/04-send_joint_speeds.cpp @@ -19,9 +19,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 // Maximum allowed waiting time during actions @@ -160,16 +161,18 @@ bool example_send_joint_speeds(k_api::Base::BaseClient* base) int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/106-Gripper_command/01-gripper_command.cpp b/api_cpp/examples/106-Gripper_command/01-gripper_command.cpp index 8ab3f0df..e2f43d72 100644 --- a/api_cpp/examples/106-Gripper_command/01-gripper_command.cpp +++ b/api_cpp/examples/106-Gripper_command/01-gripper_command.cpp @@ -20,9 +20,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 /////////////////////////////////////////////////////////////////////// @@ -177,8 +178,10 @@ class GripperCommandExample int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + GripperCommandExample* gripper_command_example; - gripper_command_example = new GripperCommandExample(IP_ADDRESS, PORT); + gripper_command_example = new GripperCommandExample(parsed_args.ip_address, PORT, parsed_args.username, parsed_args.password); gripper_command_example->Init(); gripper_command_example->Run(); delete gripper_command_example; diff --git a/api_cpp/examples/107-Gripper_low_level_command/01-gripper_low_level_command.cpp b/api_cpp/examples/107-Gripper_low_level_command/01-gripper_low_level_command.cpp index 715edd28..73120a37 100644 --- a/api_cpp/examples/107-Gripper_low_level_command/01-gripper_low_level_command.cpp +++ b/api_cpp/examples/107-Gripper_low_level_command/01-gripper_low_level_command.cpp @@ -64,9 +64,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 #define PORT_REAL_TIME 10001 @@ -319,8 +320,10 @@ class GripperLowLevel int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + GripperLowLevel* gripper_low_level; - gripper_low_level = new GripperLowLevel(IP_ADDRESS, PORT_REAL_TIME, PORT, "admin", "admin"); + gripper_low_level = new GripperLowLevel(parsed_args.ip_address, PORT_REAL_TIME, PORT, parsed_args.username, parsed_args.password); gripper_low_level->Init(PROPORTIONAL_GAIN); // Example core diff --git a/api_cpp/examples/108-Gen3_torque_control/01-torque_control_cyclic.cpp b/api_cpp/examples/108-Gen3_torque_control/01-torque_control_cyclic.cpp index 184cab9a..73fb3134 100644 --- a/api_cpp/examples/108-Gen3_torque_control/01-torque_control_cyclic.cpp +++ b/api_cpp/examples/108-Gen3_torque_control/01-torque_control_cyclic.cpp @@ -58,6 +58,8 @@ #include #include +#include "utilities.h" + #include #if defined(_MSC_VER) @@ -69,13 +71,9 @@ namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" - #define PORT 10000 #define PORT_REAL_TIME 10001 -#define ACTUATOR_COUNT 7 - float TIME_DURATION = 30.0f; // Duration of the example (seconds) // Maximum allowed waiting time during actions @@ -125,7 +123,7 @@ std::function /************************** * Example core functions * **************************/ -void example_move_to_home_position(k_api::Base::BaseClient* base) +bool example_move_to_home_position(k_api::Base::BaseClient* base) { // Make sure the arm is in Single Level Servoing before executing an Action auto servoingMode = k_api::Base::ServoingModeInformation(); @@ -151,6 +149,7 @@ void example_move_to_home_position(k_api::Base::BaseClient* base) if (action_handle.identifier() == 0) { std::cout << "Can't reach safe position, exiting" << std::endl; + return false; } else { @@ -172,8 +171,14 @@ void example_move_to_home_position(k_api::Base::BaseClient* base) if(status != std::future_status::ready) { std::cout << "Timeout on action notification wait" << std::endl; + return false; } const auto promise_event = finish_future.get(); + + std::cout << "Move to Home completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(promise_event) << std::endl; + + return true; } } @@ -181,6 +186,9 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc { bool return_status = true; + // Get actuator count + unsigned int actuator_count = base->GetActuatorCount().count(); + // Clearing faults try { @@ -196,6 +204,8 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc k_api::BaseCyclic::Feedback base_feedback; k_api::BaseCyclic::Command base_command; + std::vector commands; + auto servoing_mode = k_api::Base::ServoingModeInformation(); int timer_count = 0; @@ -211,8 +221,10 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc base_feedback = base_cyclic->RefreshFeedback(); // Initialize each actuator to their current position - for (int i = 0; i < ACTUATOR_COUNT; i++) + for (unsigned int i = 0; i < actuator_count; i++) { + commands.push_back(base_feedback.actuators(i).position()); + // Save the current actuator position, to avoid a following error base_command.add_actuators()->set_position(base_feedback.actuators(i).position()); } @@ -228,10 +240,10 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc actuator_config->SetControlMode(control_mode_message, first_actuator_device_id); // Initial delta between first and last actuator - float init_delta_position = base_feedback.actuators(0).position() - base_feedback.actuators(6).position(); + float init_delta_position = base_feedback.actuators(0).position() - base_feedback.actuators(actuator_count - 1).position(); // Initial first and last actuator torques; avoids unexpected movement due to torque offsets - float init_last_torque = base_feedback.actuators(6).torque(); + float init_last_torque = base_feedback.actuators(actuator_count - 1).torque(); float init_first_torque = -base_feedback.actuators(0).torque(); //Torque measure is reversed compared to actuator direction float torque_amplification = 2.0; @@ -251,18 +263,18 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc base_command.mutable_actuators(0)->set_position(base_feedback.actuators(0).position()); // First actuator torque command is set to last actuator torque measure times an amplification - base_command.mutable_actuators(0)->set_torque_joint(init_first_torque + (torque_amplification * (base_feedback.actuators(6).torque() - init_last_torque))); + base_command.mutable_actuators(0)->set_torque_joint(init_first_torque + (torque_amplification * (base_feedback.actuators(actuator_count - 1).torque() - init_last_torque))); // First actuator position is sent as a command to last actuator - base_command.mutable_actuators(6)->set_position(base_feedback.actuators(0).position() - init_delta_position); + base_command.mutable_actuators(actuator_count - 1)->set_position(base_feedback.actuators(0).position() - init_delta_position); // Incrementing identifier ensures actuators can reject out of time frames base_command.set_frame_id(base_command.frame_id() + 1); if (base_command.frame_id() > 65535) base_command.set_frame_id(0); - for (int idx = 0; idx < ACTUATOR_COUNT; idx++) + for (int idx = 0; idx < actuator_count; idx++) { base_command.mutable_actuators(idx)->set_command_id(base_command.frame_id()); } @@ -323,18 +335,20 @@ bool example_cyclic_torque_control(k_api::Base::BaseClient* base, k_api::BaseCyc int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; std::cout << "Creating transport objects" << std::endl; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); std::cout << "Creating transport real time objects" << std::endl; auto transport_real_time = new k_api::TransportClientUdp(); auto router_real_time = new k_api::RouterClient(transport_real_time, error_callback); - transport_real_time->connect(IP_ADDRESS, PORT_REAL_TIME); + transport_real_time->connect(parsed_args.ip_address, PORT_REAL_TIME); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); @@ -357,11 +371,12 @@ int main(int argc, char **argv) auto actuator_config = new k_api::ActuatorConfig::ActuatorConfigClient(router); // Example core - example_move_to_home_position(base); - auto isOk = example_cyclic_torque_control(base, base_cyclic, actuator_config); - if (!isOk) + bool success = true; + success &= example_move_to_home_position(base); + success &= example_cyclic_torque_control(base, base_cyclic, actuator_config); + if (!success) { - std::cout << "There has been an unexpected error in example_cyclic_torque_control() function." << endl;; + std::cout << "There has been an unexpected error." << endl; } // Close API session @@ -384,4 +399,6 @@ int main(int argc, char **argv) delete router_real_time; delete transport; delete transport_real_time; + + return success ? 0 : 1; } diff --git a/api_cpp/examples/109-Gen3_ethernet_bridge/01-ethernet_bridge_configuration.cpp b/api_cpp/examples/109-Gen3_ethernet_bridge/01-ethernet_bridge_configuration.cpp index 4a6c3bc4..7b59f359 100644 --- a/api_cpp/examples/109-Gen3_ethernet_bridge/01-ethernet_bridge_configuration.cpp +++ b/api_cpp/examples/109-Gen3_ethernet_bridge/01-ethernet_bridge_configuration.cpp @@ -18,9 +18,10 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" #define PORT 10000 /////////////////////////////////////////////////////////////////////// @@ -144,8 +145,10 @@ class EthernetBridgeConfigurationExample // Example core int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + EthernetBridgeConfigurationExample* ethernet_bridge; - ethernet_bridge = new EthernetBridgeConfigurationExample(IP_ADDRESS , PORT, "admin", "admin"); + ethernet_bridge = new EthernetBridgeConfigurationExample(parsed_args.ip_address , PORT, parsed_args.username, parsed_args.password); ethernet_bridge->Init(); ethernet_bridge->EnableEthernetBridge(); diff --git a/api_cpp/examples/110-Waypoints/01-send_angular_wapoint_trajectory.cpp b/api_cpp/examples/110-Waypoints/01-send_angular_wapoint_trajectory.cpp new file mode 100644 index 00000000..074ee3da --- /dev/null +++ b/api_cpp/examples/110-Waypoints/01-send_angular_wapoint_trajectory.cpp @@ -0,0 +1,374 @@ +/* +* KINOVA (R) KORTEX (TM) +* +* Copyright (c) 2021 Kinova inc. All rights reserved. +* +* This software may be modified and distributed +* under the terms of the BSD 3-Clause license. +* +* Refer to the LICENSE file for details. +* +*/ + +#include +#include +#include + +#include +#include +#include +#include + +#include "utilities.h" + +#define PORT 10000 + +namespace k_api = Kinova::Api; + +// Maximum allowed waiting time during actions +constexpr auto TIMEOUT_DURATION = std::chrono::seconds{100}; + +// Create an event listener that will set the promise action event to the exit value +// Will set promise to either END or ABORT +// Use finish_promise_cart.get_future.get() to wait and get the value +std::function + create_event_listener_by_promise(std::promise& finish_promise_cart) +{ + return [&finish_promise_cart] (k_api::Base::ActionNotification notification) + { + const auto action_event = notification.action_event(); + switch(action_event) + { + case k_api::Base::ActionEvent::ACTION_END: + case k_api::Base::ActionEvent::ACTION_ABORT: + finish_promise_cart.set_value(action_event); + break; + default: + break; + } + }; +} + +// Create an event listener that will set the sent reference to the exit value +// Will set to either END or ABORT +// Read the value of returnAction until it is set +std::function + create_event_listener_by_ref(k_api::Base::ActionEvent& returnAction) +{ + return [&returnAction](k_api::Base::ActionNotification notification) + { + const auto action_event = notification.action_event(); + switch(action_event) + { + case k_api::Base::ActionEvent::ACTION_END: + case k_api::Base::ActionEvent::ACTION_ABORT: + returnAction = action_event; + break; + default: + break; + } + }; +} + +bool example_trajectory(k_api::Base::BaseClient* base) +{ + bool success = false; + + auto product = base->GetProductConfiguration(); + bool gen3LiteModelCompatible = false; + if( product.model() == k_api::ProductConfiguration::MODEL_ID_L53 + || product.model() == k_api::ProductConfiguration::MODEL_ID_L31) + { + if(product.model() == k_api::ProductConfiguration::MODEL_ID_L31) + { + gen3LiteModelCompatible = true; // Detected a Gen3 Lite + } + } + else + { + std::cout << "Product is not compatible to run this example please contact support with KIN number bellow" << std::endl; + std::cout << "Product KIN is : " << product.kin() << std::endl; + return success; + } + + // Make sure the arm is in Single Level Servoing before executing an Action + auto servoingMode = k_api::Base::ServoingModeInformation(); + servoingMode.set_servoing_mode(k_api::Base::ServoingMode::SINGLE_LEVEL_SERVOING); + base->SetServoingMode(servoingMode); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // Create the trajectory + k_api::Base::WaypointList wpts = k_api::Base::WaypointList(); + + // Binded to degrees of movement and each degrees correspond to one degree of liberty + auto actuators = base->GetActuatorCount(); + uint32_t degreesOfFreedom = actuators.count(); + + // Move arm with waypoints list + const int kmaxDegreesOfFreedom = 7; + auto jointPoses = std::vector>(); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Note : To customize this example for your needs an array of array is used containing the information needed : + // all values correspond to a joint/motor + // If you have 6DoF the array will contain 6 positions expressed in degrees in float format. + // If you have 7DoF the array will contain 7 positions expressed in degrees in float format. + // You may overwrite the jointPose array for the proper arm + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + if(gen3LiteModelCompatible == true) // Gen3 Lite + { + jointPoses.push_back({ 0.0f, 344.0f, 75.0f, 360.0f, 300.0f, 0.0f }); // Home + jointPoses.push_back({ 0.0f, 21.0f, 145.0f, 272.0f, 32.0f, 273.0f}); // Retract + jointPoses.push_back({ 42.0f, 334.0f, 79.0f, 241.0f, 305.0f, 56.0f });// Angular pick down + } + else if(degreesOfFreedom == 6) // 6DoF and not Gen3 Lite + { + jointPoses.push_back({ 360.0f, 35.6f, 281.8f, 0.8f, 23.8f, 88.9f }); + jointPoses.push_back({ 359.6f, 49.1f, 272.1f, 0.3f, 47.0f, 89.1f }); + jointPoses.push_back({ 320.5f, 76.5f, 335.5f, 293.4f, 46.1f, 165.6f }); + jointPoses.push_back({ 335.6f, 38.8f, 266.1f, 323.9f, 49.7f, 117.3f }); + jointPoses.push_back({ 320.4f, 76.5f, 335.5f, 293.4f, 46.1f, 165.6f }); + jointPoses.push_back({ 28.8f, 36.7f, 273.2f, 40.8f, 39.5f, 59.8f }); + jointPoses.push_back({ 360.0f, 45.6f, 251.9f, 352.2f, 54.3f, 101.0f }); + } + else // 7DoF + { + jointPoses.push_back({ 360.0f, 35.6f, 180.7f, 281.8f, 0.8f, 23.8f, 88.9f }); + jointPoses.push_back({ 359.6f, 49.1f, 181.0f, 272.1f, 0.3f, 47.0f, 89.1f }); + jointPoses.push_back({ 320.5f, 76.5f, 166.5f, 335.5f, 293.4f, 46.1f, 165.6f }); + jointPoses.push_back({ 335.6f, 38.8f, 177.0f, 266.1f, 323.9f, 49.7f, 117.3f }); + jointPoses.push_back({ 320.4f, 76.5f, 166.5f, 335.5f, 293.4f, 46.1f, 165.6f }); + jointPoses.push_back({ 28.8f, 36.7f, 174.7f, 273.2f, 40.8f, 39.5f, 59.8f }); + jointPoses.push_back({ 360.0f, 45.6f, 171.0f, 251.9f, 352.2f, 54.3f, 101.0f }); + } + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + const float firstTime = 5.0f; + + for(auto index = 0; index < jointPoses.size(); ++index) + { + k_api::Base::Waypoint *wpt = wpts.add_waypoints(); + if(wpt != nullptr) + { + wpt->set_name(std::string("waypoint_") + std::to_string(index)); + k_api::Base::AngularWaypoint *ang = wpt->mutable_angular_waypoint(); + if(ang != nullptr) + { + for(auto angleIndex = 0;angleIndex < degreesOfFreedom; ++angleIndex) + { + ang->add_angles(jointPoses.at(index).at(angleIndex)); + } + + // Joints/motors 5 and 7 are slower and need more time + if(index == 4 || index == 6) + { + ang->set_duration(firstTime * 6); // min 30 seconds + } + else + { + ang->set_duration(firstTime); + } + } + } + } + + // Connect to notification action topic + std::promise finish_promise_cart; + auto finish_future_cart = finish_promise_cart.get_future(); + auto promise_notification_handle_cart = base->OnNotificationActionTopic( create_event_listener_by_promise(finish_promise_cart), + k_api::Common::NotificationOptions()); + + k_api::Base::WaypointValidationReport result; + try + { + // Verify validity of waypoints + auto validationResult = base->ValidateWaypointList(wpts); + result = validationResult; + } + catch(k_api::KDetailedException& ex) + { + std::cout << "Try catch error on waypoint list" << std::endl; + // You can print the error informations and error codes + auto error_info = ex.getErrorInfo().getError(); + std::cout << "KDetailedoption detected what: " << ex.what() << std::endl; + + std::cout << "KError error_code: " << error_info.error_code() << std::endl; + std::cout << "KError sub_code: " << error_info.error_sub_code() << std::endl; + std::cout << "KError sub_string: " << error_info.error_sub_string() << std::endl; + + // Error codes by themselves are not very verbose if you don't see their corresponding enum value + // You can use google::protobuf helpers to get the string enum element for every error code and sub-code + std::cout << "Error code string equivalent: " << k_api::ErrorCodes_Name(k_api::ErrorCodes(error_info.error_code())) << std::endl; + std::cout << "Error sub-code string equivalent: " << k_api::SubErrorCodes_Name(k_api::SubErrorCodes(error_info.error_sub_code())) << std::endl; + return false; + } + + // Trajectory error report always exists and we need to make sure no elements are found in order to validate the trajectory + if(result.trajectory_error_report().trajectory_error_elements_size() == 0) + { + // Execute action + try + { + // Move arm with waypoints list + std::cout << "Moving the arm creating a trajectory of " << jointPoses.size() << " angular waypoints" << std::endl; + base->ExecuteWaypointTrajectory(wpts); + } + catch(k_api::KDetailedException& ex) + { + std::cout << "Try catch error executing normal trajectory" << std::endl; + // You can print the error informations and error codes + auto error_info = ex.getErrorInfo().getError(); + std::cout << "KDetailedoption detected what: " << ex.what() << std::endl; + + std::cout << "KError error_code: " << error_info.error_code() << std::endl; + std::cout << "KError sub_code: " << error_info.error_sub_code() << std::endl; + std::cout << "KError sub_string: " << error_info.error_sub_string() << std::endl; + + // Error codes by themselves are not very verbose if you don't see their corresponding enum value + // You can use google::protobuf helpers to get the string enum element for every error code and sub-code + std::cout << "Error code string equivalent: " << k_api::ErrorCodes_Name(k_api::ErrorCodes(error_info.error_code())) << std::endl; + std::cout << "Error sub-code string equivalent: " << k_api::SubErrorCodes_Name(k_api::SubErrorCodes(error_info.error_sub_code())) << std::endl; + return false; + } + // Wait for future value from promise + const auto ang_status = finish_future_cart.wait_for(TIMEOUT_DURATION); + + base->Unsubscribe(promise_notification_handle_cart); + + if(ang_status != std::future_status::ready) + { + std::cout << "Timeout on action notification wait for angular waypoint trajectory" << std::endl; + } + else + { + const auto ang_promise_event = finish_future_cart.get(); + std::cout << "Angular waypoint trajectory completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(ang_promise_event) << std::endl; + + success = true; + + // We are now ready to reuse the validation output to test default trajectory generated... + // Here we need to understand that trajectory using angular waypoint is never optimized. + // In other words the waypoint list is the same and this is a limitation of Kortex API for now + } + } + else + { + std::cout << "Error found in trajectory" << std::endl; + result.trajectory_error_report().PrintDebugString(); + } + + return success; +} + +bool example_move_to_home_position(k_api::Base::BaseClient* base) +{ + // Make sure the arm is in Single Level Servoing before executing an Action + auto servoingMode = k_api::Base::ServoingModeInformation(); + servoingMode.set_servoing_mode(k_api::Base::ServoingMode::SINGLE_LEVEL_SERVOING); + base->SetServoingMode(servoingMode); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // Move arm to ready position + std::cout << "Moving the arm to a safe position" << std::endl; + auto action_type = k_api::Base::RequestedActionType(); + action_type.set_action_type(k_api::Base::REACH_JOINT_ANGLES); + auto action_list = base->ReadAllActions(action_type); + auto action_handle = k_api::Base::ActionHandle(); + action_handle.set_identifier(0); + + for (auto action : action_list.action_list()) + { + if (action.name() == "Home") + { + action_handle = action.handle(); + } + } + + if (action_handle.identifier() == 0) + { + std::cout << "Can't reach safe position, exiting" << std::endl; + return false; + } + else + { + // Connect to notification action topic + std::promise finish_promise_cart; + auto finish_future_cart = finish_promise_cart.get_future(); + auto promise_notification_handle_cart = base->OnNotificationActionTopic( + create_event_listener_by_promise(finish_promise_cart), + k_api::Common::NotificationOptions() + ); + + // Execute action + base->ExecuteActionFromReference(action_handle); + + + // Wait for future value from promise + const auto status = finish_future_cart.wait_for(TIMEOUT_DURATION); + base->Unsubscribe(promise_notification_handle_cart); + + if(status != std::future_status::ready) + { + std::cout << "Timeout on action notification wait" << std::endl; + return false; + } + const auto promise_event = finish_future_cart.get(); + + std::cout << "Move to Home completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(promise_event) << std::endl; + + return true; + } +} + + +int main(int argc, char **argv) +{ + auto parsed_args = ParseExampleArguments(argc, argv); + + // Create API objects + auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; + auto transport = new k_api::TransportClientTcp(); + auto router = new k_api::RouterClient(transport, error_callback); + transport->connect(parsed_args.ip_address, PORT); + + // Set session data connection information + auto create_session_info = k_api::Session::CreateSessionInfo(); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); + create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) + create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) + + // Session manager service wrapper + std::cout << "Creating session for communication" << std::endl; + auto session_manager = new k_api::SessionManager(router); + session_manager->CreateSession(create_session_info); + std::cout << "Session created" << std::endl; + + // Create services + auto base = new k_api::Base::BaseClient(router); + auto base_cyclic = new k_api::BaseCyclic::BaseCyclicClient(router); + + // Example core + bool success = true; + // We need to make sure to be hoome before attemping any trajectory + success &= example_move_to_home_position(base); + // This is a trajectory example using angular waypoints + success &= example_trajectory(base); + + // Close API session + session_manager->CloseSession(); + + // Deactivate the router and cleanly disconnect from the transport object + router->SetActivationStatus(false); + transport->disconnect(); + + // Destroy the API + delete base; + delete session_manager; + delete router; + delete transport; + + return success? 0: 1; +} \ No newline at end of file diff --git a/api_cpp/examples/110-Waypoints/02-send_cartesian_waypoint_trajectory.cpp b/api_cpp/examples/110-Waypoints/02-send_cartesian_waypoint_trajectory.cpp new file mode 100644 index 00000000..d60deee5 --- /dev/null +++ b/api_cpp/examples/110-Waypoints/02-send_cartesian_waypoint_trajectory.cpp @@ -0,0 +1,395 @@ +/* +* KINOVA (R) KORTEX (TM) +* +* Copyright (c) 2021 Kinova inc. All rights reserved. +* +* This software may be modified and distributed +* under the terms of the BSD 3-Clause license. +* +* Refer to the LICENSE file for details. +* +*/ + +#include +#include +#include + +#include +#include +#include + +#include "utilities.h" + +#define PORT 10000 + +namespace k_api = Kinova::Api; + +// Maximum allowed waiting time during actions +constexpr auto TIMEOUT_DURATION = std::chrono::seconds{60}; + +// Create an event listener that will set the promise action event to the exit value +// Will set promise to either END or ABORT +// Use finish_promise_cart.get_future.get() to wait and get the value +std::function + create_event_listener_by_promise(std::promise& finish_promise_cart) +{ + return [&finish_promise_cart] (k_api::Base::ActionNotification notification) + { + const auto action_event = notification.action_event(); + switch(action_event) + { + case k_api::Base::ActionEvent::ACTION_END: + case k_api::Base::ActionEvent::ACTION_ABORT: + finish_promise_cart.set_value(action_event); + break; + default: + break; + } + }; +} + +// Create an event listener that will set the sent reference to the exit value +// Will set to either END or ABORT +// Read the value of returnAction until it is set +std::function + create_event_listener_by_ref(k_api::Base::ActionEvent& returnAction) +{ + return [&returnAction](k_api::Base::ActionNotification notification) + { + const auto action_event = notification.action_event(); + switch(action_event) + { + case k_api::Base::ActionEvent::ACTION_END: + case k_api::Base::ActionEvent::ACTION_ABORT: + returnAction = action_event; + break; + default: + break; + } + }; +} + +static constexpr int kWaypointNumber = 7; +static constexpr int kNumberOfVariables = 4; // x, y, z, blending radius +static constexpr int posX = 0; +static constexpr int posY = 1; +static constexpr int posZ = 2; +static constexpr int posBlendingRadius = 3; +static constexpr int posThetaX = 4; +static constexpr int posThetaY = 5; +static constexpr int posThetaZ = 6; + +// Helper function to populate Cartesian waypoint +void populateCartesianCoordinate(k_api::Base::CartesianWaypoint* cartesianCoordinate, std::vector waypointDefinition) +{ + static const k_api::Common::CartesianReferenceFrame kReferenceFrame = k_api::Common::CartesianReferenceFrame::CARTESIAN_REFERENCE_FRAME_BASE; + + + cartesianCoordinate->mutable_pose()->set_x(waypointDefinition[posX]); + cartesianCoordinate->mutable_pose()->set_y(waypointDefinition[posY]); + cartesianCoordinate->mutable_pose()->set_z(waypointDefinition[posZ]); + cartesianCoordinate->set_blending_radius(waypointDefinition[posBlendingRadius]); + + cartesianCoordinate->mutable_pose()->set_theta_x(waypointDefinition[posThetaX]); + cartesianCoordinate->mutable_pose()->set_theta_y(waypointDefinition[posThetaY]); + cartesianCoordinate->mutable_pose()->set_theta_z(waypointDefinition[posThetaZ]); + + + cartesianCoordinate->set_reference_frame(kReferenceFrame); +} + +bool example_trajectory(k_api::Base::BaseClient* base) +{ + bool success = false; + std::vector> waypointsDefinition; + auto product = base->GetProductConfiguration(); + if( product.model() == k_api::ProductConfiguration::MODEL_ID_L53 + || product.model() == k_api::ProductConfiguration::MODEL_ID_L31) + { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Note : To customize this example for your needs an array of array is used containing the information needed : + // 1 - x position + // 2 - y position + // 3 - z position + // 4 - blending radius + // 5 - Theta x + // 6 - Theta y + // 7 - Theta z + // You may overwrite the waypointsDefinition vector by commenting the code bellow and populating it with your own + // waypoint list information. + //////////////////////////////////////////////////////////////////////////////////////////////////////////////// + if(product.model() == k_api::ProductConfiguration::MODEL_ID_L31) + { + // Detected a PICO model + const float kTheta_x = 90.6; + const float kTheta_y = -1.0; + const float kTheta_z = 150.0; + waypointsDefinition = { {0.439f, 0.194f, 0.448f, 0.0f, kTheta_x, kTheta_y, kTheta_z}, + {0.200f, 0.150f, 0.400f, 0.0f, kTheta_x, kTheta_y, kTheta_z}, + {0.350f, 0.050f, 0.300f, 0.0f, kTheta_x, kTheta_y, kTheta_z}}; + } + else + { + const float kTheta_x = 90.0; + const float kTheta_y = 0.0; + const float kTheta_z = 90.0; + waypointsDefinition = { {0.7f, 0.0f, 0.5f, 0.0f, kTheta_x, kTheta_y, kTheta_z}, + {0.7f, 0.0f, 0.33f, 0.1f, kTheta_x, kTheta_y, kTheta_z}, + {0.7f, 0.48f, 0.33f, 0.1f, kTheta_x, kTheta_y, kTheta_z}, + {0.61f, 0.22f, 0.4f, 0.1f, kTheta_x, kTheta_y, kTheta_z}, + {0.7f, 0.48f, 0.33f, 0.1f, kTheta_x, kTheta_y, kTheta_z}, + {0.63f, -0.22f, 0.45f, 0.1f, kTheta_x, kTheta_y, kTheta_z}, + {0.65f, 0.05f, 0.33f, 0.0f, kTheta_x, kTheta_y, kTheta_z}}; + } + } + else + { + std::cout << "Product is not compatible to run this example please contact support with KIN number bellow" << std::endl; + std::cout << "Product KIN is : " << product.kin() << std::endl; + return success; + } + // Make sure the arm is in Single Level Servoing before executing an Action + auto servoingMode = k_api::Base::ServoingModeInformation(); + servoingMode.set_servoing_mode(k_api::Base::ServoingMode::SINGLE_LEVEL_SERVOING); + base->SetServoingMode(servoingMode); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // Create the trajectory + k_api::Base::WaypointList wpts = k_api::Base::WaypointList(); + wpts.set_duration(0.0); // as fast as possible + wpts.set_use_optimal_blending(false); + + // Start waypoint list creation + int index = 0; + for(std::vector>::iterator it = waypointsDefinition.begin(); + it != waypointsDefinition.end(); ++it, ++index) + { + k_api::Base::Waypoint *wpt = wpts.add_waypoints(); + if(wpt != nullptr) + { + wpt->set_name(std::string("waypoint_") + std::to_string(index)); + Kinova::Api::Base::CartesianWaypoint* coordinate = wpt->mutable_cartesian_waypoint(); + if(coordinate != nullptr) + { + populateCartesianCoordinate(coordinate, *it); + } + } + } + + // Connect to notification action topic + std::promise finish_promise_cart; + auto finish_future_cart = finish_promise_cart.get_future(); + auto promise_notification_handle_cart_end = base->OnNotificationActionTopic( create_event_listener_by_promise(finish_promise_cart), + k_api::Common::NotificationOptions()); + + // Verify validity of waypoints + auto result = base->ValidateWaypointList(wpts); + + if(result.trajectory_error_report().trajectory_error_elements_size() == 0) + { + // Execute action + try + { + // Move arm with waypoints list + std::cout << "Moving the arm creating a trajectory of " << waypointsDefinition.size() << " cartesian waypoints" << std::endl; + base->ExecuteWaypointTrajectory(wpts); + } + catch(k_api::KDetailedException& ex) + { + std::cout << "Try catch error executing normal trajectory" << std::endl; + // You can print the error informations and error codes + auto error_info = ex.getErrorInfo().getError(); + std::cout << "KDetailedoption detected what: " << ex.what() << std::endl; + + std::cout << "KError error_code: " << error_info.error_code() << std::endl; + std::cout << "KError sub_code: " << error_info.error_sub_code() << std::endl; + std::cout << "KError sub_string: " << error_info.error_sub_string() << std::endl; + + // Error codes by themselves are not very verbose if you don't see their corresponding enum value + // You can use google::protobuf helpers to get the string enum element for every error code and sub-code + std::cout << "Error code string equivalent: " << k_api::ErrorCodes_Name(k_api::ErrorCodes(error_info.error_code())) << std::endl; + std::cout << "Error sub-code string equivalent: " << k_api::SubErrorCodes_Name(k_api::SubErrorCodes(error_info.error_sub_code())) << std::endl; + return false; + } + // Wait for future value from promise + const auto cart_end_status = finish_future_cart.wait_for(TIMEOUT_DURATION); + + base->Unsubscribe(promise_notification_handle_cart_end); + + if(cart_end_status != std::future_status::ready) + { + std::cout << "Timeout on action notification wait for cartesian waypoint trajectory" << std::endl; + } + else + { + const auto cart_promise_event = finish_future_cart.get(); + std::cout << "cartesian waypoint trajectory completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(cart_promise_event) << std::endl; + + // Connect to notification action topic + std::promise finish_promise_cart_opt; + auto finish_future_cart_opt = finish_promise_cart_opt.get_future(); + + auto promise_notification_handle_cart_opt = base->OnNotificationActionTopic(create_event_listener_by_promise(finish_promise_cart_opt), + k_api::Common::NotificationOptions()); + + // Execute optimized trajectory + wpts.set_use_optimal_blending(true); + try + { + base->ExecuteWaypointTrajectory(wpts); + } + catch(k_api::KDetailedException& ex) + { + std::cout << "Try catch error executing optimized trajectory" << std::endl; + // You can print the error informations and error codes + auto error_info = ex.getErrorInfo().getError(); + std::cout << "KDetailedoption detected what: " << ex.what() << std::endl; + + std::cout << "KError error_code: " << error_info.error_code() << std::endl; + std::cout << "KError sub_code: " << error_info.error_sub_code() << std::endl; + std::cout << "KError sub_string: " << error_info.error_sub_string() << std::endl; + + // Error codes by themselves are not very verbose if you don't see their corresponding enum value + // You can use google::protobuf helpers to get the string enum element for every error code and sub-code + std::cout << "Error code string equivalent: " << k_api::ErrorCodes_Name(k_api::ErrorCodes(error_info.error_code())) << std::endl; + std::cout << "Error sub-code string equivalent: " << k_api::SubErrorCodes_Name(k_api::SubErrorCodes(error_info.error_sub_code())) << std::endl; + return false; + } + + + // Wait for future value from promise + const auto cart_status = finish_future_cart_opt.wait_for(TIMEOUT_DURATION); + base->Unsubscribe(promise_notification_handle_cart_opt); + if(cart_status != std::future_status::ready) + { + std::cout << "Timeout on action notification wait for optimized cartesian waypoint trajectory" << std::endl; + } + else + { + const auto opt_cart_promise_event = finish_future_cart_opt.get(); + std::cout << "Optimized cartesian waypoint trajectory completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(opt_cart_promise_event) << std::endl; + success = true; + } + } + } + else + { + std::cout << "Error found in trajectory" << std::endl; + result.trajectory_error_report().PrintDebugString(); + } + + return success; +} + +bool example_move_to_home_position(k_api::Base::BaseClient* base) +{ + // Make sure the arm is in Single Level Servoing before executing an Action + auto servoingMode = k_api::Base::ServoingModeInformation(); + servoingMode.set_servoing_mode(k_api::Base::ServoingMode::SINGLE_LEVEL_SERVOING); + base->SetServoingMode(servoingMode); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + + // Move arm to ready position + std::cout << "Moving the arm to a safe position" << std::endl; + auto action_type = k_api::Base::RequestedActionType(); + action_type.set_action_type(k_api::Base::REACH_JOINT_ANGLES); + auto action_list = base->ReadAllActions(action_type); + auto action_handle = k_api::Base::ActionHandle(); + action_handle.set_identifier(0); + + for (auto action : action_list.action_list()) + { + if (action.name() == "Home") + { + action_handle = action.handle(); + } + } + + if (action_handle.identifier() == 0) + { + std::cout << "Can't reach safe position, exiting" << std::endl; + return false; + } + else + { + // Connect to notification action topic + std::promise finish_promise_cart; + auto finish_future_cart = finish_promise_cart.get_future(); + auto promise_notification_handle_cart = base->OnNotificationActionTopic( + create_event_listener_by_promise(finish_promise_cart), + k_api::Common::NotificationOptions() + ); + + // Execute action + base->ExecuteActionFromReference(action_handle); + + + // Wait for future value from promise + const auto status = finish_future_cart.wait_for(TIMEOUT_DURATION); + base->Unsubscribe(promise_notification_handle_cart); + + if(status != std::future_status::ready) + { + std::cout << "Timeout on action notification wait" << std::endl; + return false; + } + const auto promise_event = finish_future_cart.get(); + + std::cout << "Move to Home completed" << std::endl; + std::cout << "Promise value : " << k_api::Base::ActionEvent_Name(promise_event) << std::endl; + + return true; + } +} + + +int main(int argc, char **argv) +{ + auto parsed_args = ParseExampleArguments(argc, argv); + + // Create API objects + auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; + auto transport = new k_api::TransportClientTcp(); + auto router = new k_api::RouterClient(transport, error_callback); + transport->connect(parsed_args.ip_address, PORT); + + // Set session data connection information + auto create_session_info = k_api::Session::CreateSessionInfo(); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); + create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) + create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) + + // Session manager service wrapper + std::cout << "Creating session for communication" << std::endl; + auto session_manager = new k_api::SessionManager(router); + session_manager->CreateSession(create_session_info); + std::cout << "Session created" << std::endl; + + // Create services + auto base = new k_api::Base::BaseClient(router); + + // Example core + bool success = true; + // We need to make sure to be hoome before attemping any trajectory + success &= example_move_to_home_position(base); + // This is a trajectory example using cartesian waypoints + success &= example_trajectory(base); + + // Close API session + session_manager->CloseSession(); + + // Deactivate the router and cleanly disconnect from the transport object + router->SetActivationStatus(false); + transport->disconnect(); + + // Destroy the API + delete base; + delete session_manager; + delete router; + delete transport; + + return success? 0: 1; +} \ No newline at end of file diff --git a/api_cpp/examples/200-Actuator_low_level_control/01-actuator_low_level_velocity_control.cpp b/api_cpp/examples/200-Actuator_low_level_control/01-actuator_low_level_velocity_control.cpp index c1da85f2..65e5118b 100644 --- a/api_cpp/examples/200-Actuator_low_level_control/01-actuator_low_level_velocity_control.cpp +++ b/api_cpp/examples/200-Actuator_low_level_control/01-actuator_low_level_velocity_control.cpp @@ -28,6 +28,8 @@ #include +#include "utilities.h" + #if defined(_MSC_VER) #include #else @@ -37,8 +39,6 @@ namespace k_api = Kinova::Api; -#define IP_ADDRESS "192.168.1.10" - #define PORT 10000 #define PORT_REAL_TIME 10001 @@ -242,21 +242,23 @@ bool example_actuator_low_level_velocity_control(k_api::Base::BaseClient* base, int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); auto transport_real_time = new k_api::TransportClientUdp(); auto router_real_time = new k_api::RouterClient(transport_real_time, error_callback); - transport_real_time->connect(IP_ADDRESS, PORT_REAL_TIME); + transport_real_time->connect(parsed_args.ip_address, PORT_REAL_TIME); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/500-Gen3_vision_configuration/01_vision_intrinsics.cpp b/api_cpp/examples/500-Gen3_vision_configuration/01_vision_intrinsics.cpp index c27efbe7..11172638 100644 --- a/api_cpp/examples/500-Gen3_vision_configuration/01_vision_intrinsics.cpp +++ b/api_cpp/examples/500-Gen3_vision_configuration/01_vision_intrinsics.cpp @@ -19,10 +19,11 @@ #include // for std::setprecision +#include "utilities.h" + namespace k_api = Kinova::Api; #define PORT 10000 -#define IP_ADDRESS "192.168.1.10" /** * Map of all Sensor strings @@ -256,16 +257,18 @@ void example_routed_vision_set_intrinsics(k_api::VisionConfig::VisionConfigClien int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/500-Gen3_vision_configuration/02_vision_extrinsics.cpp b/api_cpp/examples/500-Gen3_vision_configuration/02_vision_extrinsics.cpp index d8d43338..a14bfab6 100644 --- a/api_cpp/examples/500-Gen3_vision_configuration/02_vision_extrinsics.cpp +++ b/api_cpp/examples/500-Gen3_vision_configuration/02_vision_extrinsics.cpp @@ -20,10 +20,11 @@ #include // for std::setprecision +#include "utilities.h" + namespace k_api = Kinova::Api; #define PORT 10000 -#define IP_ADDRESS "192.168.1.10" /***************************** * Example related functions * @@ -137,16 +138,18 @@ void example_routed_vision_set_extrinsics(k_api::VisionConfig::VisionConfigClien int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/500-Gen3_vision_configuration/03_vision_sensor_focus_action.cpp b/api_cpp/examples/500-Gen3_vision_configuration/03_vision_sensor_focus_action.cpp index 0017b43e..8cd7121e 100644 --- a/api_cpp/examples/500-Gen3_vision_configuration/03_vision_sensor_focus_action.cpp +++ b/api_cpp/examples/500-Gen3_vision_configuration/03_vision_sensor_focus_action.cpp @@ -29,10 +29,11 @@ #include #include +#include "utilities.h" + namespace k_api = Kinova::Api; #define PORT 10000 -#define IP_ADDRESS "192.168.1.10" /** * Returns the device identifier of the Vision module, 0 if not found @@ -196,16 +197,18 @@ void example_routed_vision_set_manual_focus(k_api::VisionConfig::VisionConfigCli int main(int argc, char **argv) { + auto parsed_args = ParseExampleArguments(argc, argv); + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/500-Gen3_vision_configuration/04_vision_sensor_options.cpp b/api_cpp/examples/500-Gen3_vision_configuration/04_vision_sensor_options.cpp index f05a4ad3..cb2322e0 100644 --- a/api_cpp/examples/500-Gen3_vision_configuration/04_vision_sensor_options.cpp +++ b/api_cpp/examples/500-Gen3_vision_configuration/04_vision_sensor_options.cpp @@ -30,10 +30,11 @@ #include #include // for std::setprecision, std::setfill, std::setw +#include "utilities.h" + namespace k_api = Kinova::Api; #define PORT 10000 -#define IP_ADDRESS "192.168.1.10" typedef struct _option_info { @@ -481,16 +482,18 @@ void example_routed_vision_confirm_saved_sensor_options_values(k_api::VisionConf int main(int argc, char **argv) { -// Create API objects + auto parsed_args = ParseExampleArguments(argc, argv); + + // Create API objects auto error_callback = [](k_api::KError err){ cout << "_________ callback error _________" << err.toString(); }; auto transport = new k_api::TransportClientTcp(); auto router = new k_api::RouterClient(transport, error_callback); - transport->connect(IP_ADDRESS, PORT); + transport->connect(parsed_args.ip_address, PORT); // Set session data connection information auto create_session_info = k_api::Session::CreateSessionInfo(); - create_session_info.set_username("admin"); - create_session_info.set_password("admin"); + create_session_info.set_username(parsed_args.username); + create_session_info.set_password(parsed_args.password); create_session_info.set_session_inactivity_timeout(60000); // (milliseconds) create_session_info.set_connection_inactivity_timeout(2000); // (milliseconds) diff --git a/api_cpp/examples/CMakeLists.txt b/api_cpp/examples/CMakeLists.txt index 524b471f..8df2a022 100644 --- a/api_cpp/examples/CMakeLists.txt +++ b/api_cpp/examples/CMakeLists.txt @@ -29,7 +29,7 @@ # ---------------------------------------------------------------------------- cmake_minimum_required(VERSION 3.5) -project(kortexApiCppExamples VERSION 2.2.0 LANGUAGES CXX) +project(kortexApiCppExamples VERSION 2.3.0 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_VERBOSE_MAKEFILE ON) @@ -41,7 +41,7 @@ endif() option(USE_CONAN "Use the Conan package manager to automatically fetch the Kortex API" ON) -option(DOWNLOAD_API "Automatically download the API if conan is not used" ON) + # Activate C++ 11 set (CMAKE_CXX_STANDARD 11) @@ -120,7 +120,7 @@ if(USE_CONAN) URL https://artifactory.kinovaapps.com/artifactory/api/conan/conan-public) if(UNIX) - conan_cmake_run(REQUIRES kortex_api_cpp/2.2.0-r.31@kortex/stable + conan_cmake_run(REQUIRES kortex_api_cpp/2.3.0-r.34@kortex/stable SETTINGS kortex_api_cpp:compiler=gcc SETTINGS kortex_api_cpp:compiler.version=5 SETTINGS compiler.libcxx=libstdc++11 @@ -141,18 +141,16 @@ if(USE_CONAN) set(kortex_api_cpp_target "msvc-2019") endif() - conan_cmake_run(REQUIRES kortex_api_cpp/2.2.0-r.31@kortex/stable - OPTIONS kortex_api_cpp:target=${kortex_api_cpp_target} + conan_cmake_run(REQUIRES kortex_api_cpp/2.3.0-r.34@kortex/stable PROFILE_AUTO build_type BASIC_SETUP UPDATE) else() - conan_cmake_run(REQUIRES kortex_api_cpp/2.2.0-r.31@kortex/stable + conan_cmake_run(REQUIRES kortex_api_cpp/2.3.0-r.34@kortex/stable SETTINGS kortex_api_cpp:compiler=gcc SETTINGS kortex_api_cpp:compiler.version=5 SETTINGS compiler.libcxx=libstdc++11 - OPTIONS kortex_api_cpp:target=mingw PROFILE_AUTO build_type BASIC_SETUP UPDATE) @@ -179,31 +177,26 @@ else() # Not using Conan endif() # Download the API - if(DOWNLOAD_API) - if(UNIX) - execute_process(COMMAND ./download_kortex_api.sh - WORKING_DIRECTORY ../scripts - RESULT_VARIABLE DOWNLOAD_API_RESULT - OUTPUT_VARIABLE DOWNLOAD_API_OUTPUT) - if(NOT DOWNLOAD_API_RESULT EQUAL 0) - message("Kortex API was not downloaded prior to running CMake.") - message(FATAL_ERROR ${DOWNLOAD_API_OUTPUT}) - endif() - elseif(WIN32) - execute_process(COMMAND download_kortex_api.bat - WORKING_DIRECTORY ../scripts - RESULT_VARIABLE DOWNLOAD_API_RESULT - OUTPUT_VARIABLE DOWNLOAD_API_OUTPUT) - if(NOT DOWNLOAD_API_RESULT EQUAL 0) - message("Kortex API was not downloaded prior to running CMake.") - message(FATAL_ERROR ${DOWNLOAD_API_OUTPUT}) - endif() - endif() - endif() if(UNIX) - link_libraries(${KORTEX_DIR}lib/${KORTEX_LIB_SUBDIR}/libKortexApiCpp.a) + execute_process(COMMAND ./download_kortex_api.sh + WORKING_DIRECTORY ../scripts + RESULT_VARIABLE DOWNLOAD_API_RESULT + OUTPUT_VARIABLE DOWNLOAD_API_OUTPUT) + if(NOT DOWNLOAD_API_RESULT EQUAL 0) + message("Kortex API was not downloaded prior to running CMake.") + message(FATAL_ERROR ${DOWNLOAD_API_OUTPUT}) + endif() + link_libraries(${KORTEX_DIR}lib/${KORTEX_LIB_SUBDIR}/libKortexApi.a) elseif(WIN32) - link_libraries(${KORTEX_DIR}lib/${KORTEX_LIB_SUBDIR}/KortexApiCpp.lib) + execute_process(COMMAND ./download_kortex_api.bat + WORKING_DIRECTORY ../scripts + RESULT_VARIABLE DOWNLOAD_API_RESULT + OUTPUT_VARIABLE DOWNLOAD_API_OUTPUT) + if(NOT DOWNLOAD_API_RESULT EQUAL 0) + message("Kortex API was not downloaded prior to running CMake.") + message(FATAL_ERROR ${DOWNLOAD_API_OUTPUT}) + endif() + link_libraries(${KORTEX_DIR}lib/${KORTEX_LIB_SUBDIR}/KortexApi.lib) endif() # Add Include Directories @@ -235,6 +228,6 @@ foreach ( SRC_FILE ${EXE_LIST} ) MESSAGE("creating TARGET_EXE_NAME: '${TARGET_EXE_NAME}'") - add_executable(${TARGET_EXE_NAME} ${SRC_FILE}) + add_executable(${TARGET_EXE_NAME} ${SRC_FILE} utilities.cpp) endforeach() diff --git a/api_cpp/examples/readme.md b/api_cpp/examples/readme.md index 25575068..3ba7e081 100644 --- a/api_cpp/examples/readme.md +++ b/api_cpp/examples/readme.md @@ -17,18 +17,20 @@

Table of Contents

- [Setup (C++ environment)](#setup-c-environment) - - [Setup PC environment](#set-up-pc-environment) + - [Set up PC environment](#set-up-pc-environment) - [CMake](#cmake) - - [GCC 5.4 compiler (preferred)](#gcc-54-compiler-prefered) - - [Install GCC 5.4 under Linux (Ubuntu 16.04 and higher)](#procedure-to-install-gcc-54-under-linux-ubuntu-1604) - - [Install GCC 5.4 under Windows](#procedure-to-install-gcc-54-under-windows) + - [GCC compiler](#gcc-compiler) + - [Procedure to install GCC under Linux (GCC 5.4 on Ubuntu 16.04, GCC 7.4 on Ubuntu 18.04)](#procedure-to-install-gcc-under-linux-gcc-54-on-ubuntu-1604-gcc-74-on-ubuntu-1804) + - [Procedure to install GCC 5.4 under Windows](#procedure-to-install-gcc-54-under-windows) - [Conan](#conan) -- [Build](#build-instruction) -- [Run](#how-to-use-examples-with-your-robot) -- [C++ API documentation](#api-documentation) + - [Using Conan](#using-conan) + - [Not using Conan](#not-using-conan) +- [Build](#build) +- [Run](#run) +- [C++ API documentation](#c-api-documentation) - [Reference](#reference) - - [Useful Links](#usefull-links) -- [Back to root topic: **readme.md**](#back-to-root-topic-readmemd) + - [Useful Links](#useful-links) + - [Back to root topic: **readme.md**](#back-to-root-topic-readmemd) -- [Setup (Python environment)](#setup-example-python-environment) - - [Python setup](#requested-basic-python--python-modules) - - [Install Kortex Python API and required dependencies](#install-python-kortex-api-and-required-dependencies) -- [How to use the examples](#how-to-use-examples-with-your-robot) -- [Python API documentation](#api-documentation) +- [Setup (Python environment)](#setup-python-environment) + - [Required Python version and module](#required-python-version-and-module) + - [Install Kortex Python API and required dependencies](#install-kortex-python-api-and-required-dependencies) +- [How to use the examples](#how-to-use-the-examples) +- [Python API documentation](#python-api-documentation) - [Reference](#reference) - [useful links](#useful-links) -- [Back to root topic: **readme.md**](#back-to-root-topic-readmemd) + - [Back to root topic: **readme.md**](#back-to-root-topic-readmemd) @@ -43,7 +43,7 @@ Refer to the main README for Python installation details: [parent readme](../../ Install what is needed to run the examples via a downloaded whl file (Python wheel package). -The whl file can be downloaded via the Kinova Artifactory: [kortex_api](https://artifactory.kinovaapps.com/artifactory/generic-public/kortex/API/2.2.0/kortex_api-2.2.0.post31-py3-none-any.whl) +The whl file can be downloaded via the Kinova Artifactory: [kortex_api](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-public&path=kortex%2FAPI%2F2.3.0%2Fkortex_api-2.3.0.post34-py3-none-any.whl) On Linux: @@ -94,5 +94,5 @@ Here's a link to the generated documentation | Google Proto Buffer generated Python: | [https://developers.google.com/protocol-buffers/docs/reference/python-generated](https://developers.google.com/protocol-buffers/docs/reference/python-generated) | __________________________ - -## Back to root topic: **[readme.md](../../readme.md)** + +## Back to root topic: **[readme.md](../../readme.md)** \ No newline at end of file diff --git a/linked_md/artifactory.png b/linked_md/artifactory.png index 35ed5d9ffd8d247452af8c2c7964622a7ca6cd09..924c573456faf1477698b1614a9c071449414705 100644 GIT binary patch literal 204455 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�a9Ux)D~)Hq_~;`B0Wl3du-IS+pV#qPV`*d300MT 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

Nou&SaR3RyexV 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ℜ;en6X$huW8el^ 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 V@2M693tpB{d7!RTcpvii{{WeY3s?XE literal 188419 zcmd43Ra{$9*Efh1EACKS3dOCswS_`)D^}dy-DxSsp+NBf#fwXDNP@exxCECJ4epRh zpYQp8^UmDO&CINebCP}bIoW&dwf;-?%8AibSHyq*;yDTm3ck_@d2JLFtPm6w^hRt< zWJ^IKw<7ZN%(*2F`n@OBM?~pW7vYf;wc3<-xk`( zW~ET;{h}*AE5u)%tAb}QXI~mQ`Hf3EHLZA~qXM(2qU(kh49<5MN+o;Iip9MfxuA0TqZ#!jc1Hx)ngH7|V?~f>@PX;*U z|0iw7e)KFY2FZQr0)z!&F*5&Oh*Dk2jQD?2GJ)#mz8QDVOzX?b zZ)3f|`S0x8XzwnX1@93-#h_jyV&Y`X9~b1r#J8xLJ;;9lh&ST^tH03?8_B(?@D%X> zg^A2`ng8Fm6oAl?gZ?k=89;yJy043Q#HIkrKYo1s#+?1#*vj8kmUwe%A9CW`?lV!U zlSzXc&>@-@$P+c z(|M%`*R-<;sSx9fpziC1BMcY4n*T5xdHA5H8*nA2=y@)#x3n(4u?YMjuHji#7hboj zWxUK{(90bg{Xld>y$1ynTBOr|{pLHM>E&_#L&vv0nshMHv-1W|-}dT54V%8-l%GBO z!~KiTUP@+&=r?Gt_zvE;**3f_L2Md~QV%as0P5@_%c#!cSRN9&O`}k;2h68~NCczn z_K{1&_@J%ySP_tZAl(ZExHx7)nzCGM{J;53HTdFa<(ECSDc=barw?cycf+zXc&SX{~#0c!Yg>hXXhe(jOV z{W`i14$j_KVMcnL>tht9?v->ZJ3#;2?28HHkauB8W4ohOCX~A1=xA>#OfSAKBhNvE z0*)BOzG@m0)Zxma>VsN<8sF!?**{<8JkZd;01WOUO#4>_!x@m%6WMIBckA6+y(2)MPe&NM4tHbmj`P0D`l0ra(|~ll+qB{q0dF?6J*<-tk(R* z1sUu|PWPj5N?aDoVe@WoN zHhH*%B}03{@mGd4e=u*~>HM_5b&~ybgun%D=(o)^x`L`kP*IzEdxB_Dc^)W~Sm77_ z?ji&dGxFeB5!axiLggr)ZaT$-9keB{XzE}- zZ0KNgwd(QO3dyJIN$H63^xn|r&$xFXw!o}4+3T?YrM1;Lca)dG@8xS0lCRHhdW&!* zo6}n657*^ihUW;DrS%yS@^fSVjISbxz|f7}FT1UIv&i0FV^PiBiY=#uhwh}-nu*E8 zvzL3$J}mn*UI81X2RS4*imxz6>2aV!p+pvIaAqD55de#icjI6!uDgYB`)~q}K-|dG zI22{#*lw#sgjxI8;#V6e0+mz4%YBrsIpp9cbh0Obw3NS7F$n7=ay`y^bvItEFD!EM ze~Na@JgMH%I1&CMp9bIRst1x$(iZ94^YJP&EM?~N*iBFJ_I{I>uffc{BU*&K?P(cN z3mE259vwOPh+!#cgk3Hf6J#zLNElxbd@ZBiG0AmWu_b!(q6ZUDaI*;i^$U;H-AO+PlYX(L0cI!~N*x8cQ?Lcn?RnZ$v75n<^R}6Os-0@5ve}aFsB-t(xJ-sQ(vhY*g7P(%#ai0IPzr$7MW;()^ zGs)xlmtH|M?8fze?ZcYZoV`ai3Gw90R?+S5&lGUR%;Gy=x8;ddc&vwBxIi%%=x(*^ zuTc?>3w+^IcL-~QpH3V#KrnK{B-o&!;rkKI^|YTQ8mLn8TdSAs)}x6n2^Q(8ui9D$Z*`Mt5DPz-zSgo=l1=E5@HYriJtFTaI2+aG^!g;KR|+iN zWBP>%Ip*__P+8~u{~>QiiqwJv*_`T}3Slbh|g6)Lsg*OE7{WYasal2`{ClR&~P1Fn823xGdl zpqA(N>p|3#t&}!Kda1KPQd{>}mg_Q4Taowc_jsm;XE?h*>;mi!=)*#;)Xt*Rw?5=th|efM7l$v)B?G$hWk<%~zL35cI6U|wNk zTstH(Jp6#bn*~o5MM-xFt?c+LxycU$t_@cg-FDKIQd@o8-Fj3teJi3LO!80W)$Z*h zUZ3j@^>IYlVnwfq*cz*m)upA(S^gqfU;Uf>ROH8?_ z6|vBd4~wY&QBGG3B+tU_RB-b6RJymLPAR3k{wj72nIjQ#E3CTZtwBI5?W8Q=vU!X0 z#k$F)V$ygZRT;2&kts7wxGZ#P1_@hJ#U1`3i#bgPYI)v%Ad4c@!>cdnG7O?uzHA!p zIUQ{3eIy(uFTxm=;%gazY?034vWeeB`t7jp-S6^YcDkg^@l%{9Sgp{yMDD6;L$kS z!fPaW%EL7=5%v-S>{q9kyCw^S!HR!2oWXIbKg}#K-O6Aayj+F9NcO>1roR4I`7VSu zBXoZNH=A@*1mfZzRfX+k?o4aN@SneC-aw4ttjBpl91<6tM(W{AmL#(I>2DVHLY(it zxoo;EE~>=TKZCxzG(V|QyP8klL6UvY0E(P{1A+uox5gHxL>u;~ynza&zPpViV9JU! z*8V~13wmnBk4gKsm2EVa+NH;&v`}ywA0fr&1=Ze?AAgY>gF1XakBt4wrp`x0roU|T zI>T*F;9D&R*d#&7t*emepw#6}`*+)VMn9sa)eq zPx3oFegxcX^R+#@x!x?@?uZu88$EvPmdD#u-^j>WXrKICX36CSY06#Clt1n$@jHi5 zx-a^j-pXF5m>FZT34tt0+d$L$!8avzNgdx?*6z^S@oY9hy*Lwyl=!gY!O#Xgw1~ei zLeX1R1%8;`;l4xaR*ix#edlB~{gHn&0Xu-*W=zx>`sPQPT!63uc$LeNw1y~a&)PtLE=E%zjW zyEL*7b-%BhIi;xAEW_@5f*xLw)RqiB=9WW`);~I8JVo^KuldnQ*J<5oiHEWTOA*G|@7k5<`q_*DoX|)2ldK>a6hu*b~Rm1rZ zcq>A%R;=VFWZ9Px?q|QN3CyB2`xMNJdVn7E78TtJ^QJS{#DnEqDl$MhZ*B?gRU8XB ziwVqM^dxwleNt@*<}Cw0%Q=4oDgflpN=H=Bo#;Kv5EJh$1QIZ)%fDgTTU^_Ck|A0y z&uQBmD9H44DLKaVemg_k|C&tbdw<>Y2IE-y=ak7K!UiDIkOWfXJ*`Z5GTB?@ z35P!WZ>diIYrB|8>2#U)P8HZ2510U=owCq;FmT&2gdI3auqksq_$*mx~9~i zA8@Y-54?XLM&(k?yIGaXCj^l1TkTJ(#Tg(wWD6T*5B8AyVg#pGTq6>l*!27&iE4-H z#}q_(VQD-S0iEraJI$NCxj7G;s`O+2qvkCu6VmlfnmhK-{AFRV{)^^b(P_yFb)kn& zsxJbO>8HnRqAjwTcK$FcVXn;R)&S<+E<%H#Lri*A2~k!rAmn=6RYqw!&f`WbG+5sc zucRMv0#~-5mp|rq(oC1kkB^VYbj=&Ououb`V&{+|z&G=zKzcuIjyD)Y>x3WMLA@WF z7kJM!wX`s9h>6^9NsuA9=c#IUZqDQC))+gY>#Z_p#9xX(Wy#O#QFZEYkW#*a@}P=( zgE99pb}c~31A-#^5P|-pX161p@!de=x|zXPeZQ|Uy?JVC#Twzy(N_9Q?Idk-@~^Ts zfZIbnSN7HxKu_-P)bRD^oFQ3HC|v=uq@zh%z7z{4ksPb>w@c=D0EbYCcHiQ`e?q-s z)Vx|-<~D0^Yr}ym7x7aCWx(vZ3R10+6K4NOh*hwwLG%gf!G5NIb%r?4^{Qrji-M{* zkRI}Lpm_1(P7W#QG=mX~7uNC-#@FlvjR&pNMvwt04Vi^#dwA%r`!wc#@P{Zf@sz_?_?A6w9SQyK}eQBJ-qi?N^fwP;~sYasSRcToX-o0O$03JBmVx_rZr?2gO zQdkGvxaXRgx`ulArZ2hg0;ks*@0lDC=17HE4`J_;G&Z0^d|QVS_WZ2Hrq1p}{+sj( z*WDuFna{55hsnDdtE-F4q@CkELZbPZ2UGHZ;ET1|hJFu@2!3MeK-&I%o0Cigxi~=Y6^nzw9@&8rT5UB ze7-d|kezo0QIVUN{5oI^f<%7yOJZwpSE(=8$o>8h5&eQfQJxar{O5hw=Zn>*+|5*? zmCE`x&3K-&Oj9`$9N}lAA-ORL_k^3VFZ^Aj_rD1kf87mrt9Oy@2f1!`7l1&^$1^#* z&40_$@YwL4F!6Ses~dU_bhfrRl5nHi-F>)+nh{g_v3TVH2A}q=k6PQg45KmLT@zMSNH)IZ&7SoA&Vd8u3f}x-TK^JTQS#d=^tjt zeZbf@3n!+|w~cjIq%9o@%}!K(E7R~T3M=}(1O3xWVs^at3^R?x5ZA0ZnH&%2o!kt9 zDK~4WmV_6>E*ue5v~4N+^VWWyeQq|ySA~N7Si(<_hU^o-gs|Dtcg$46x1rxCcI(3s zrZS;$m3Bf6Ru6kWys|hCJ+g+7OB(0ejzmbLHs$Z(_ov|6oBcO3>=jl%xu-;dF1eWC zF#SNogJKyC%B^Cq$DF{s9R}4FUZ3pWPYP%c6{N)p?#nK;QdT>quizr>ii*UY^WVnB zzZVEA%^;F)hj5YTEwnmn@uEMd^S<_#Wevl~`a!!-UE7a;ZtYUa zXI=|iG(efS&c`ke6;_k%;D%4bdtcDh^}m?GT)mIH#kZseg9p*(RyPZw(zHmTbk^Rvn$RAXJ~ZD5%5 z@3yaQp|@>$eRj*C#@DT_G)fwXPLU1VRi zVr`s$@C`FTtFSJowm!y4@~#xYIN?f^jHreNI_Qx95H;;h*U{yIZ+ zw=B`G)M#Hy&sXPev`cxzE`*5K4lF`gJH!sy(%W>2yLfe_JSJ2sBvSZx^IDbOfopB+ zU{oYB=JUGgA3Qku`0vllhWA>S9ksbV?p;=YM_aMr%(T{&)3j z-n@vXj`j&p+hAwRT-W+f1<5#L-coZ?Wq53KW8%RWbp^l3QqeTuVW6d38#t0=L_Dap z7xWYs^XxYVm{J$CbYju7C^!;Vpd)V=k6Km{bnn~aU5%>V_KFV`Ex|jMVEwQ|Tnt?G z^Xx}dg`W4>(XWdk%%2aNo|pghAN-1GeU1oi^UJBw?FNHI70)uTUou)*ccTrf=ZRS1 zp)5B@r?_HBtzUAmdsYOFk4(bEQ+cr10;$WUhmm+7B@nO;s!9|&DozU6*Aw;eTV z*TEeeuz$%j67mh|%q{yQFjFH1<;$dx3hLpATqVfh$D z4d9hgqXtn+U8$?na+WZMVZDD$ZL9WTTBGME9{U{^x`MtjsU;<)C7`X@kS z4>YZ2Tl>)7v2|BZEN5^P&KNkB6my_^{%bPgyvr`w^S8priB@A{%-nchv-S2!V`Ox2K}v5hq>o4GoFSuo?9Ic*1qb*<`n zH+h#C+4CzP{*!g)=H2x#r#WHiLfIJv@0gpvM(>gP^qA+Ev)J}^do4H|9b3siarS($ zFiTQiK3mUYlgf^>gLrBva@p&Qv8{~&Ezm@xcour22_Yv?&jrtD`O-egbxc2S538LY zxDEtsbhXj9*qQt&%^S$tXWeGPU16y0Yg;6EDZ{%*Z7_lQG=Pd?0W&Six zL!})K%9<5BceBLggQb`h@Eee!% zP7|#MiQ5fIiwm~cpcmLwFTTP?rv^lSE30IHhVxCIG{8e2FuKyc!p$acdBQ^cY>ou) zU9dVwbqQ}fy%%%T2$+t%C2nt7AnVt-q54Lp(}q29d_1lK7Tn0K7QoNXEHMK5-}6s( zbHDPv!H8=^((hC8M1_*mJJzm^TM0`X!2IbdrNXGYl#!&?y zzc#B~c?%}(QAo5k4<`B+E11Zz(tme}=vviE1#9NqRJX!qT=lYto&&%ro>^B_q)#~uqdF{W(}8TGh-OF*LL9rQ9(QL4Mc$xd?< z)hgN$xt*4r-g-#OmB?BQyOopbm;|h=E>b^eWN14Giwb7Ty)41F1so4ee&N-#8O^1s zl#xl=*AZOJ zz-6iA7`ZPShoK^1Cl=>C);%Hc?GvlbF-knsO3Vw9>^~9h2i00gTS<(<$suVNztzW~ zJdwUte!;@XA8qbM*?x`9(puW~>C+qa#9W~~l(9Kf`6#Rwv!peVxv<}n8ZX(IJ^OJF z->wzZe-)AXru#P_w{OD2N6MwWr1jNx4!H9Ofs=pIkq1H(|2#v@-}UABrjV7Ct66HT0#1IGjJVxxy=uN3tdNv( zZwWQ)I>lFql84@0V>90zyN|7?dmQeu{CIp5bZ45zx38ajrWw$M5gwF!-oP4+icC5Z z-DQ^dJ!iR z4F48R`3v4zAjr_v+8B`hk`f(lyvM1MbaHeo*mI9xsHktXb$*SuKA`)+vlbHcRq)yd zPxFO-;1|*`0%m7VLT-(yEe-OtmpdP~#a=z-7cw~aP}WT4fsaPEqYzCBaH8KRHJqFf zuCj^``e;aZ%H2h@6POiE^NmEWA*q&dHrJws@=<}HFX-M=r_qlqO1qK9-X*PZ}Z1aFZ8 zdZGDmblX_#7fMkikbj&*@@|+;`coHIEsqnNAK9fC74rA9s9uvF(f_*q-{VwkiqOj= zx-Z5X|EY%f@8tfS{(mv$|HtDIYV<>4rZf2m-JeYF2E$yY&;G|VE-Iof)rW) ztu2oDypSE#d5$aqkp&XV!kM&da#Qtu4+P1i^L%}Y%g&V^_MUq# zOY$Oz(pH76gK6u-GqL&`CKvV&?@c(WTo4v3au_f#J0PnKS&@P+!p$2k=33ouV)Jr4 zy?Miz_8`j-PCG}|XpvRD$$U^^onkg3gQ)DS%oKMeD4+OdCT1ur`gxCQd858SGUp{n z40lxqq4#$%V-}9reCh$_e0n77q`~L$klWq^P2|I*B|hKg&>$qd-ZB@ljj_!BS;zIG zh&#?5nF`5}=t^YE&;_PsA@%~;Ra1@4xUK#qzS;%nza3c0$P!s6`Nl3|Uq`qilKx~# zZ0O>_<8bX1vg{Eml_U-q?&LQH9O{>)Jfx6Bo3o!M+>QYxKKFgqVpYwY=xhNxTvTk1 z*^V>VrUcue6_Jo+y2HJ9xzz_lIeOZEdKFyG_f?K4(Hu}tTHS$SSmWv6zuSCPDpUXc zGQg!J=CFmbzWauVOLp9R>&!5ozu9CF$+RhtR|r;5oLQBdSY(M3`Go2eu2Vo@F|pLk z1+S@qgWC*$LB`l7pw+T1DN}v?BeA@%L(b->@ut*9JeDm4Fd=l(2FB`iN=remwz)&e zPHKZv=*F~Db8IlX>S+2shDZ*(biI^PAOmi_c#zeH;H5v`iK~j(S3kT_GPt`n)k$RW z9kJ4mZb8WuFlkum6UD#U@XKt&!P6o%4ajBhaMhTBhmWgh2QHJs)?g#;#l#&{wytB~&2w^|syKB%~yn zw|Og33kRMlpi`bHFXPKiRm8cJt;~1TvuzyK$xq1I8_IRo^Goru07)98@~f(hn&)us-Msc4Ff3}WXjaPjt~54wLKWg9Z&gz!wuE)!^d(8P3{8t%nBbH zPXdA{QvzP4y_d~@^X{FMbT41kgi~$#q#pcWczDbdU>X9x*JDqls`c^!a~__WqrOkd2`0Z z#HgAW3n_mkjuip^joA-u1I8RUlitsQUGU+-T0(*H(}M~oJoLCSP`*XMe4KOb;gyCT ziySztssa8-RiDad>dSd!Vq`^ z1PzurNzAtLBpjqxlP^P7e6=Yj*~II2mzLH)O-)@3XNyy+=1IA^ZDkAY(;4B{#9-`k z-(G%%p9<9MO3Vyh0S>Z+EM%NyOnU(N>Mw6saaa-F^p#gLOrc&H_}6lzM7EX7%<~Ga z8OS@%NBLhiv1igUL9Q& zeqV&0#Wn8oYRGHZK*CQZr$ef*@}N1j`O2o0dR_>YCG7J}pPN1C^7&y5UtQqkr@5Mt z7}h~SiW=8oduzp|;N4C`)dz%$+9!n2e05;jSuK1ucC_N8FQb-s}3^a~MoMAaW9S>_(MFKUiJr$kl_uc@)hyft824Cg+z66q=4NnQ zx@G@W!)GT#$B;W96rJfBGS&fy44^;K82x>>-w8OJt$YP83p9fO! zHYY3>8AQwj-NhZKmltm`U|Bve>?-^d1A0msp1Q zi_-`-13k1zcHk4Tez`7}Z8M&9&B5F^rO@UtuvK1*2QPTT6<-pm(@DW$`o!#RB2W)1 zWD=#VG#d9Z)F1-nR!2gLzDTY1a@g3KC$G1mP(TVIk#KZiYLo4Oe{TArS_W=(2Tm-V z!00+%e9>S9YdG7&Ylc9=i34h1{{efXwEHtjvcMW7TqGS1($60vwqo$zEXx3@Ht!W! zy)tTTkJeMW$L;WqMRvFMz)*Ac655kTNt<2+G) zDl^W-EZZ`x`LC`meyxnY?Ctk5Hz!M@@za8uPwfz~sa+u$z9h?TXZMoET*H}c9-~9} z-sV!`KR1k1`7YM@d72%EU%-;&b0n0MTYZ4$`}3W;z6knpxWjts7sJZNmXev-^=mtF zJ0ajR#`VYA`U7+k0PSd%S>nqPywVy0*72spN@o zwN{zliqpd3T&au%5xCffW$O>aJl?ao`Oic(ktf(c2KJyIHy7-?FL?YtPCaT&T${x5h|da;UprOQ#tiksbOnjItZ56i>a)$OlJ* z@n5u}kTNl`@n_Yq@~5|gS8F{*gTs%~4aeHYV~5Rq1T8VA6(l~~UqFM$U`Kw0;lx&T z)Oc*%kDJj9+Bz0&@4h5_6}g_16E|R=u+f|RNCBFbXD&fH8o^LskuZST_M^sk!LImW zYc|J+tudaVcXW(FB+R=q%Ju1N%EZ1M^@fQi~Pwi-)1OeA_=l89p$GKuy zC{SiuftT_gr^*@r9bytn%uH0=NpM6~0EuIT0e1toBaSPGM z59X!sKT7k=DT(`cS-%dLT+9>bTcg-I|K3U&$UO^V^l@QBFO^l-mKDkz>tmfX=iYN( zRluTAEOG}*(iyFowoi;#En3?y@##d@XLixP zpNdHR3uZ~HR%ZZT>mtbVTG*P|N;|xx!z^)DOog!cn#55@_iso}DRKHMco@ zOm#9Fs9P0|`;nKkc=F!Iz4X=Q;2`nr>@!T9abL-EzTg=47(-?r!+F^V`;>_nzL z5w2!8-=Hl=-JJeG->mMQg?pXo3K{kBmUt#!M#AM}h0x_wsY4q*OU&0^`A+9oI~Zpr zHQ6A@%*@*KSaed4WwSXQiOP?~!3JccUaaU`~)8`9|*%7Px4R)Zft9KRmzesg6 zvu#I|>vkNQ)Zds4W_#8>6)<+%*;OeU*PooBqO`_pxi8a#o5)m}6j3FoPPG~GjACk9 zd1dgj6vZuIM>C8-qa_!>!qkWN3(+cF5r*eH#4?Ewp6GO z>8IgK2^_^`6~3lHQSo1q5dMNQGHMbY*9m`KXDs?NbPCpPz&xsN!4-aEluA|aPo6_K z&RCHjH#XV8zjo^B@Tcz-8Q@Q|K6O8VZ~=whcZfOJXe(wA>`4 z&lJpB$V1`v1dsRD+lb)M9MoEY51^!X=U4YXu`+`ub;giY3^XKc$)0AOnjfS;#j?hZg10BTj?lmN?b9d8Ma+u5Be=Mh7;gh{*yfcc5*qnr# zqg6O@QOU7!I$J#EPuk$6!Q@pR%WwU2;_M-n=eCAD^>bhtK6x zyiGs}Btnb;eS)30YWou~vEW~oG6_|4nc=8?E5D~`s44YeOdFRl9^v;2mOKr~`UC8EC36a@U0k|7^!CZR3 z9~MJ^@r2C_uXwRu4Q{+9HH3w1?H<3KU}^iIC?d9dCr?7Xz7>b>W5B|4@Gu(9aRc>f zzJzJx`WRF%T6NEN1@#FQCexRVr@8!7uRAfP(>w`ycmS)8n7D!%Ck)V4XelblO_`i^Zrk6#4H2ho+CNIaLBEIZ7_)P1`6(cBhv)W z?)axdKhMor9A-oR{iP|caJgcrMBB8_ufzAte=>!13igy->HAno=_h1)BHR2MS;E#b zL@M#M5&q9^B*HHuUp_wtK=SJQU3OElZP}l?Zz%GPUetdzs-H6&Qu>g~S~rSbO0(PG zYxta}#DBu;EqXzw(p~?wYMh@r#|=juMU_R@=8w`SrDyS!(-(q+sjoe8+-$Z5S)`K2 zCEJB;V?=Y;Rqt7VYvG1*raO_Swq4!X>?w=T*v$iJGJ-^lC0wU0?^n6_@EXfi^h&Dx zL(kpS-Ie@g!W!#KE44Dgi8Z+GCVfB}VcEh5la^Rr4OSrAt&M32D@AIzyuCZNtr@{2 za%Q3KLO{w|yD{8LEOfU}M8}X5udAQ!7Nn@;?L5t5z6{~?Dqhj)gZ8J2bK9n?R;Q!e z--l;DDeW0s8cFA-Cnr~borWW40s?wf@}f#pr7!(68sf7?&x}fwFNa^~@q~Q!n;YMp zrObhRYt*xX8~{AKdbVXlhNf9)%nFCkn^(1Y8%*=YdstHa1OA{{^7zB5=n#63J;7kC zS?(~4y~6YwV6}8ccCB2kZBpdGYfnhu%#APagV?#_zL?Oh=j7Nh8|;pQ8(FjTOVpoR zE+tcdHO4{q(+CU1pbv{BLued5bD++A3kfb)mXlx#B$_)VRu2tJJx&NsBIE)PtZP1-FFVMrlh{%)K8Fy<75CJ4Zk(z?O6TdUG9BZcE+ zC_*DbDYO}iw13r3z?&srq1)97Y}`S|vEFpp7qHslnuwd(U5#r_Us=23m7l0d80GB0 zz${ts&&dRHhPKaU%is8Kfygqxy*jDYLGWCt*4OPF^UC|LZ8P7Fq9cbw!2}eaqL{v+ zCd0nXG*Dn%&%&SPW)=`R01aUhai>5n3j3&drKD+`$NfEM7P~RxO&nVOTum0LUh*qMhX z?-?oR<-|O$bovW^d6LDlXUlm5FyGqQzX3*3l1Ww41PZEvU9}rDGO~61{>QGV!PrxG z`Zga@XAIv%o*x^Iv*g!PxhmuIxRe19=Njky$ytR&q5R`4q-%e*SYN$g?XWNVBa;#9 zYU^V@mbf+C$x^oIBE;&2N@hzowNvnOuZ${dS8ujT8P`qPlkH@`R&{5j@hAM;R7;*{ z2P|VuDZbxy3VJSyd+3uGMCy?=W^)0d5PTdQW|eJ!Hh4qnZ`K|3)DxcHBm-AaYXWMegFZ}uwWoYPQlhVHg>ZTAfVb9x?-B$}l(-?Lz);*&8 zj?ARaI%v$*w(%Vm*}@3C(j-07+TGJ6>ftIj!!&z8l4wUYN%@1Hb4X7cHjCvNv%3ps z%w%LF2e>>>#WejOPmvNTg?Zl*XK*hM2eie4^VMOhv&)wXTQ71Df3H3VO)%SNYT9(1MvSAQy zUyYo(?YBR=HK&&w$vx=~<9iA0!r;YPWau0+ic;X;srjX#XKxtiV}lGaaTckwW@9uc z+Ya=;o6d*;KiqwUVa?T9=i*1<0;04HFXq&%{4~x8TvoMnTfK&%neS_g0>!T2XLT7_ z^{?k<$1MA`8*;|n0PDURo@O`oAM?|S?*}v=j^CvRXUFyK^=X;2cv-cJ4o^b^j54}o zg=sx~od=H5^tD7PO^xJCxdMH26jYfx7}IP^M#Z+`_>EVOdqAq8d3)0{!fP#%0;C@%=BYUFqIp1Sn1)NQ z;jAemKtjCP_haf@lVPxZMpJfHaTYLoI3RNIJU!)3jh7$_eb9o&FbCKfvyKE~k(v^b z;rC5&l)99QBI0cjC|XzYXmyJlxkdV=`IQlJe=E3TBlkUT)EP5)IeEnIh%O4LJ-TB% z;t{~Y&a7@2pm;*1Dz{^9MmS~Rt6`^vi^7PDWHDIG>`OL^mo{o}L<&Ki{QBbkX=QMkq67#^f-`~1pX5Kyu^m4vJ zd%k~v>;IP@SwIDVi`&^w0N}7-u$gKC^WU?+N~y)wmBzo+{avtQ>m|ToYe+qHoCbd~ zh`w~v?O@Wf*RS3qE{0&bsKR7nZjAfUaZ8I?S>I-jDKebKpKekJR?lowo^9lA)IpYaBbBK| z`h2hy_gMH#cTnl6acxe0P}J1ss#ZKaZ7f?*kKBC_D0RQw#L&X@ziR=!*;f1{{f+9r z`uFe=>N-w?T#_~8D879}-vZB_SPs47fC%hjfHR0<) z>_Xx`FU}R9-51WJ1w27QCj}y7DpGNQxk>?v9uAxhlU!R>vV^vU3KJW*ezrpJKg<4X z)AH`q_IKl%?Erf+Q7#YFq0w)j=RoB2@r z$JaSnuz}<~V%0u6zO%E4+qcI;hpEPrF-EpRF6zwXB0}ky#PYJI%#ZI>mMKlB9)44l zCOu*0XBPUO<%;f2|M~(iAwiRnp3J!t^}oy=+!Gc+oUi6B_7eiMn$&q$ax>MMv_Z4oLe`h4Qy&_1XS71#mu-|GiW2`9cY5u*L!n?jje8lcLGfwV{_KGEHFjSDw~!=J3f2^W zE4m8GhN!Q_j8lYz73w@}UClJujvk({-+%FuW;a~((*^B&nvwHBoRVOQiRS5`0|w+q zrISRA9*r$R^OJW_o>oi7pZZ!wG7$WAz3l~^l;7_}_$*?uE2}8_3d_EC{f|lJ>uU?w zTwK(7UyGAW_Igljt+}rb=*^f>nHM5`@0i2(izMFePRt|rwRp!Gx7~w@9&tekk~b)N zU|`C7D_Lvpc6{K=a7?v3{wG8swut^Cd~^zMDyn1?x<+1QCFs?FT+foIOuv~}amFwA zWeUW9ex8jYy|Lso0psb$tTTf5oCOy4Tbw4VyL|fkd;d1ei!tkKwzBff{@BjuT$I~? zSCHQ(Ar@_++-k^!ox=(%Iykk*Cw79~!hwz-7uVj0aqraEpF+jGq@hkCXpxt@Az``S&IT;$)TVS;w6)#QmDM$)K*j$6k++5~=1gbYW zK_G|UKRY9eToh%$Mt{d_pA|m>ugZ{21-w&h6**rs(IeNAMX_t9j!9F z4lr*2UsE_AYcE@v2Cg7b@goF6nj^=fjEGjc@C=l0Y>DBIM9NW$U$`1o|BW3t>&t&? zQkY@cE?7W#Kw?5bw>Q-pr%Q#kyUBkhm(kXX&4v(<6aBW*?cISB9$vXTWwnHNXJRs* zMvClFj`?C*zc}S}Y3=`hW5U1lM|LY8{WnN1{SV?)fBS!XBL{Bge}5h60R1nbrC;Eg^HY&uke55)VWMM3pcZvw)33iqAwd5>sQT)tHkj<~7H_cv#kFWD z?k+9v6sNdDaS1L33KR(LUc9)wySux)6Ci{jU%I>R{`R|nBqt|l?9RO-cb<7hF%TzR z62`lL*rhK4yJG);!ps!hy;;$Pd#gUFnODF@fJOi;&s>O5gjYl(KvPUtv@q(_#QNXX z#Kl`0{k4{VOAMuMsF+F|q3&1y zm|>1xk&iGHnzIwI5oByKK3X^s>2|FLxL2tDufFK954jALd#(^WMSbBr;5t?4k=!~L zo*G~p5U^jUA=ik$#RlgV(; zfNT2kUg@(zOlraA$eN*p*+VlqY6mDB>Bs*mVpnCyg+H7ceGl1F@3pulw5sIuQfNzr zc5%?jAA+};O&CE{(!a}DUzK)NsQvu>H?NUbyy!uN{*MPg7*KRsSsVV(D0IJvA$g-C z!DAGbxJhe1M`u%H4XP&xIEv&Gy57i*7xU4$^;RT@{&|YXz8^}upA}e z+9kPOMwXmAEChYuX3T-QZ_z&VNXg{qr%hMMz6M^|KTbVJrZq>wKM z$B?*y-SwOSwE>OsME3vB6`2Ww15TCqe(Eo#zb75n{H$L@^8foPGwXP_um9ecJ(uRl zTxne8$^XTc?ZR#KhR%?l0zMsjeP-|^!F@~^o`!Yu{|NpMA{PLk*<#CA7l>TvvD+O zB>cI=qJLyY+|V%eC<)?}67}U5K9Si&*kE6uK=kEF8n$uKd6?R?$0~;PDm!hYj(k7^ zq2Rb}3Y_+e*7dbiUTs@aj87&lZ>M;Fg>?#eSvqq_r|Wo2;dQ09Y9&u|_|=Y=lX?tC zqJ2+iH(isAO{P$A68B1F@^Hr*u9+TBtPyfZ^{AfItBnVR(AM!UhR?2r-ul8EIEEHTyzA(;LhwqLuvDv z!d;X5>kf=D?m8%2=1XDB5(ex$Wl_oo$9M@pZ?=Gf~*z#G-T2x_vQ<6~5fR}zq{u+#Kj z=29R8L0yB-78ScM3x2+)Pa%9andtg81|hzgg4huxbv=DfoN{TW>55J+GeojkY-To- zm{nz<=UvSA{T)Ycm^^R1=ofv}hmE<|O3`A;c}4CQ!=RNCOOJmV=rkm^_{ikty~18} zQ8%mb5IbZ*Lgn3w1GK|`C1sqqe%eLv{)yeN;hWfOXoF@c#I9+>34X+wdhzSq6bqW!?yB$YXaFqLJ=ER z2dRb^HE56gG9ouTZwP}_(a6Z|?~~u4)V|v+v)Ka4z~&pi0UK)XwqzP>ZY;1D`_K|? zK*gE(%alnY-6}vc2CydG?1$Bt-lD1n8Aoy@tu}u9woqZCkZ?vM_R)0V3`c;q;#m%O zsWsAlyCNfxyfImSL%^MwZMzmz7dS%Tvhgh^vDC=Y{VKJ0?4;}WnVxpNF~OEZ`;!fu zYST#yJepQr{BuOugvpZ?Va4cEGAT5+(o+k?&V|aBoTTTF`JDXId|PP-m|u=(AU55W zvQ$DT80ed733e(yk(~B1(b0%NH5~&kXoJPxCb@m@+t5*B-_Alk(&nT{z9v)xdy>xF z-;TDP*BGxD!HoL+Bqw=hV>s1qp_+;fv9;&du`uu}6+ia&I+@OP(r8*;GP>g%t(q{# zl^S|6jk3*{N$e21O5$8$ODXAGQI&;wN0gG{QNpFc!CL>mfGjUr^Hkj9ZI1DA)J<^~b`B*;zn{RXs~4lAOM+ssf&4?|*V|APj^ZqjVPb47yvt zMdj&__1F0L+8xbd5s12^fjSPPqhR>bpwInUWVK1XmG-feL|17-5CrQOrK2s!NDVLb-{dW1)>2|=Vsjw zIH;1Xdc@vH(3&*l2C!d#AKWOWafwdN+e+#q`QEqvzf-1c(wKj*i91(Q zumek{E4IKo0@r1iFK=*Dh3_a?2;$6?>2}TU>p((LY z>bXxAn!$cA{h9AAeS?iZe_nrV6iUQl(ot(|$s+~yt-ORVAvysn8m)7wte?U;z zNVzBqV?cTSoN4;VlHsG+NV`Z3(gyI@cB(C8T|Uq{@DA1;M8_n`OlK9Da+OL^ZEyfk z>D47*CS26mdM(dkA`<(v>6W5jWG&t>Rtvn0U><=<0UP2rtyke_J<*K2TLGlx1IkrylP!21`^lJwxl8hT#=C#^_6B1jT%5V(wC)^ z93zm+qX{LIGcejl5pdQ3=9@i7{oYj=B};&tiefc0MDYjMdbe7m5jW&b)+iax@&Hbd zTvL|W^V<+r7$1v49MSl^H9wZtj0_vL`v77B`PtX~iuzode8m>nC^e?GUxw2#+-6@lXqe zs-Hjne3jn!j*8a$6a8mW!s!kg1vtZru%cE@v$xq;a!quLdV`sr&7rw6^)5R_Ng-cZ zSb>9*4Lc&OBE)G-yK7QCY#u+Ba7q#7>L;(Knp(YPPF4kI{iTF6<)U7(roFbwBjJ+~ z-(Uj*(Ry4=aX_@~+T)Km=KX_3t7T88NF4!Hj=B2+NQL=~A`J7@3l&Z8b8 znrdikLUmiqkB321QpxQ%)CC+gHe}E^_>^pywi2!_fNtC|4@$OH_gU4({bk^-&7xO4 ziSs+2+LpNNw(@+t=>>V;Cmrm_gX?QmM|VOo4~J3DC z>KP=2oGLlFT|q84TLJ`V&|*M#-jY3)3uAIU!~t3&9l8?(kHRzr?+tlUlT;3fXuzhQ zJ9%z~o9|ax!C!@N3ehg7EI|telm~PP#golx=@30+m19!r_9Aj@7~LL@`S7J6h;!6 zLExoltoEjz;puZAkPMN?ap3}&T{9#LYJA*J~Ie12V*G~uH zW-@pg`7=fD#ES0{ku3D6t6N>b!&J6q1{t~HNOr**A9Qt41#D%WZrjeVS+}DxmX=aH zGNl&s-#vYo)8axc_@3ft<>g?vPo*`VoG(iD29#xzW3|rKXy>f=F1d5K0(q)B#CpdD z8Ej145CHMHUNFoZVZzIVc;XcKoCA<~RTpmnjO`7rUx>+N(I1vk3N{W4LoonC4dQ~L z9pfV&<_n6Yn8AiiVDz*o$!R}BfiI&!n&`nd7lUD2RV1DAh@PB$2iy2}TmEi1x=N2! zO%|)VlC@(U&!V%HW6`*8 z7Frr@3|6~PCN>eWY#$dNMM5VomQbbjhhIKCw>!5VB8q$jBQe*%4Ka@3$X_g{$cUAp z=|uNTYMTKrPR&Dq>+M`DU1m|awAHkGZDZBRCLoYbXozb@+}H z^ou3mIiVD^qWS7R(>miruZ9on)$E22G7FV#yO}|`k@$uaS>HQHCbF!7nIuBmxYlec z0-eNJwTzJ&E-EVnqKcmU$dQC7cJIaYYT`~!2KXEfc?(KTwl7|9QVTGJFGn0ZwpAeS zW>OzjxL~UYHr2;}_I940;fvnht=<$ZzhaAZri>Gbi@Hi;i&mCndWEd1kLR|0 zJrrlUn~HMN!VBO2N_{z{{^Hh+)uXFq)FTIV!K<)JF|}r{F%l>y|OUPDXzTW`3tB%*nGr+_+9 znB!-YwQH;?)3eicd4?%BFvn!-N{?wvJh*$^0O#$==}c_qT6l2$SZ!+?)oVwC>JLjo zM}xH7FQ(Zh;6yW|^0D})tjL_!J}3l_p345M)+7hj*QUp=XxRAx%l*Zi|L z((SIshFs3|!6?cM4=2YZ`cH0YOFgXl>oB%@{WPx6{eIutmW`7P-h3Yo473kIw`aFm zek;71DE)0JGZAceAgAL@cDkP2T-T{460kn?f%+V{GpMb;+CBEN5MP^oAv1X4co}uE zl#27Yuz*G~x2zhF*zJw3#~;+Vtw-j|*>R##E_t?L2p8<9Yg=(yN1VGn$|=a=I}5KRA+LDI|`YQ2b<73#5tC)sVIuiO|8IPLAkJ z>$FUwO@+`tl~cvi_uKP~=8)iwUUK=aROH>Is{NpuI!iXyGF5w&Dy_?&$ho(O9iK+` zRfkg;X$M`9g(oN|n(1u!$4q-7*=i$#Ne%2nxJ{0GZ* z6<9`y+ApUMUz%*70nZ{IOHJ1gvJ6*VO6LTyH(8HL+3+r&#j_=kFjzs^6Md^g8}Ch3 zY|5o8gh+G3@UAQ0DJMY3nv){P8BNY2d9hV&7C|otl* zn+SV5u4hWb*96?9+wFy6Y$)yq>kVJ-j*;yRkb~_%@9- zjrlTkn7x6QMNjebMsWO-K>eLUnPt_3N&C`9f>hd<)q396Z0Cm4^^Roo}IDpG%>m@nQ7y>e%!%RplEH3tqYneu+$vLF1gmMV4TS@)4@-RJ9{ z)Zg|Q8fZSv_~_W0Y<7=@kFk2PDLZexua?y?ELuB(?SX{NZY0irvp<$8@mqf8QxU?J zXPrYe$&>tO;dGZL-Veg{HSS%fXzZYm&t>tkvTtb_C2}=27*doOiMcuY-nQdCenftW zys>=Y$KkOXSSI2=`@y}loIpweLd!GDs;WH&y_Z=@;_%v63npa)P1Q!;YcnSIw6I(B zw;?2@Pqf63ZW)h6z@{_9dGEH+ymr#1s|&4w7D4sJ2!O#LEH%5Y13gJY;9kTj66DnShK8@~3wTuxlc4`&2QbeY_jSI)B$cku2$10Pi;=!|o)nYhEOu z*Rfv`d!A8o>PeSza&B_l$_}fQVx`v-wy-Qlj@Lyb=bx~IaB1|!?sC01$;)V)G4|V~RRnINGy-iLH zJ)XiEDYsv&g%G>CyX07>UGIvgzOfScMGvnNO9yHfO^^BRt7^5kv+d&e z{ML&u&6-+Qk3F&75c z__yc|M|wB--wsd_T$KuJdND>K)~s8Y=vzxh5O*J9i6wJ-zN3P!dEUL=FmAP6KRAxg+0ngegjgOyOR&;>aj-hG_gpocAK!6d zT$$$c2F14qj39CzkhU>j*b4ZnPZPQstWjHjb4Eg`QlpJxYufcN^G*1f-hY;VP~fcVVT`{CnZZB{>x*H~~#1qh$+1@ijO5t5Z#=E1sfu|D8dcv@FoU~|BSLIsUi8fgZKC%xN5M%d z_VJtj`KU|jUj2O`p-fzZ3u<9s7RMIus=L5Go5wa1+@=Bsy|mt%^SZjzmS$qTo{^^4 zX4SFxQtYO5Rp5oT-k0X2`;EBD`RETmJNUPSPa={ve5m(UY$kN$7H4i%y>zrO@r_Am z*5=o<)+<%3Tt6cHMeP_F%tsG)DjKlxvqZZus%#8|5{zo<2YW)D&W#=^-+ni)sNol$9I(>0NEeo%w61c1J9g89v9)4|2c_O^}WqPj6 z(x=Gv?9?Up#34E@O-^I~P3(&-&4(UQWq1Q`v{#u3vm9}0uIU}qXS=(5F(wT$zKr2G zk(A+8W^wV~sRp*Fd7uc$uu$8HyDBt(*HGzrzC=QC+3|UNv~SDBu*Tfs1Zw<_Zaa|tB48(MJz_oK3jqP74!G8vn*rrdquoReNpdE2)b)9`X->+A;4mawA@0~ z(*@nA?+XK1o?oGI(dGk{D;rChdyrZQdW|27f*oP+2~~4bbKo7?R;ISxmCil?hyn4? zDi!x=qUe`2z+TMZwHozL480z0UWPmspiQs_>IOT<5M#+@`2p}%%_G;GN50>td|&P-4}^4#*gUXb3|gjo!=M#0YB z)oCeiB>6E62BTZ3CJNwpjTtjCjlVpq?T?dnH`}0CVvqg6sv)R$qR<)VZAeLsY8QP8 ztYC%4kd0y-4#%s{ghe6h5=|5cvRg3@ao};-b$VZ-Q{{|M(8{Bkua;5*!ZQb3SjH^Y zrx!fTwcm29QW$-Ow_IMR1HR4;sj~0)Mp^^$Cu%5NottoDFSL!PF2q*ur&J*X;Q+u4 z@`q*R8UGw(?y3P+*2aD}1~Dc-!(|aTU%hQgILK^{`*rOS?9Lx)atb-t5tiof4<%uR zAYrYya8xKL(>{n*^LJ*S<8ib&smfwq*pjFB&fL0g{t0~+*yXAN)( z@*1J&DG`gJ|Mp2!)+nox8b})++~>W*uz1@Xpd#pJ2eo0UpC34rESYfU+^ z47ed61q9LhmbtGH|M%!%TsWq}!ll%qlf_^f8NTUaMta}x(PgiHs*KI%G<_~BG<40~ zZ2J}EaSK>k_iQFL1AO$dl84DY;o+-C!epIf}vkFzeRc(TS(~6QR^7 z8JGkH76_c$^z6MwG5lzIxKf;$B$mpBY2Wc}wm9~+5yQB-(C6kE`RFV<^`;~4lQ+|( zw9F+t>Rcx4iQSGPWxRH6wyi3Xz$kGzvQFN^15Nngoeiqx{H-r!0NnM5Cs7QsW^}Z`;G2IxZ7sXelmz^=xY6XL4fYVs zZcu8KhHHn-U^?~GID9$Mo%o$}(X?2aM&Ep<=V)XBwijD%r?-dw(RXkEUgQ6_sIl00 zr#6%aWFqHRw_1$@YajJ@9n#Mca;z#UTd4hi`a3*++1aC$;4ZPnF;mTAzZ^ zs*euNy)7S`Rf2)n2bNSobLebE;`Im<{NbuQ7ZlvAZ}oVI7QFZ}RG~n=S#GUV>1&0y z1?JuvUN&l7%ft73w#Jx=T1|v+yju$${Kx9zBA-XKE#jA7F_QOfsU> zATMI`u$}D9osJ_21{~hp8zR-A_H4hNPo|MyTL8w85>5ZUMO$xy`gsdkAdO%mOg&$9 zp*?g2mpehZS>4tPPZi-+XARfenPSZ7&j{|K-eEjfW=Z;cd6=ITKBgdVDuL-aj^1-5 zT8JoB3}?_<7^CD(DKLG^1;290bG+zK>}^V#?Z#a=x?yNrn$Wk2))($R+231NyxP`UW8&NREW{fgG-b7toyl2 z74i}NH#f9HZ>+}tY>O4HKIeFKG_`Y#qsLhMnX&=7P_3m+b zknYdog4~In4Gy<;Ng|P#SIz|sdkIY?i=LI@4gKv#E}oXGN&wWY2`&!pN0T{MuhW$R z(ukME{#DMw)#{8Mj+N zd5u(uY2slFce`AhGeo|@Q6|fgo9|uCO9U0l-GE=sXs73m7pc6fWH{~teQC8(R}jZzbZIL1jUQ&dRwh$fzveIXv7uO z&2k0I&%bqZu;jCOinA275{_kgxz<2Czp|gvdIySG&7UHbbCPbifD72I$J(7Do^*Vl zUE1piHM#A_9`2Ny3o|;`J^9#l6kqY>6_At}cH;kWh6f9~AUFJ+M?y{x2-w`9y=28w zh9V41k5`&v`e`-+DQDQHhw_+TLv~8Y1%@{eP2L?;LRZ$3$*iSz=B#u#_<=$j?O*$# z^21Cl5xZIKAvyjV>F+Vl*M~OdXV6Ig2lS#61jB3buKDZ3he7nIub1oSE?}E`BD6*f zMgp`s9Xk4qtrdGVU$7oPGgnO=?*@_gZl_QXeD9hH02Vl(5H|`JziFoxNO_UlP6C7{ zL+3PH3)2H@2RB`7JG_Z^Jeer_N&RlyY)R}lmQy`-xYeDu^lN>0WzLP+lz`8fCLa2n z#KIxjuRQ3ag}$bpoMakdc}U3!*=;{G({{E!`99yrN`99-s#yfvm@@<(k$A*2l>a(7 zNybT7#VC63wz=Tg6M--{ynA8b=B)NV$Sf?r2{eM$E(5oBTFmYq4Xa^BKO4L{m0D^u;%eb3Ex(pX+8f3wdvou>)e=sS^76yd?#*g1OTIct z9HU?)&~o#&U*-o_{LKT2{j3)%4ovy3vZM7?^7>aKH0BoAJ}tM~4|*k#y+(ZW0PDC^ z?|{)$5+csGJ-x!Gc{PB659i0O$O{9dt`SEoJgJig!e(x+gbZVHnu}umaF{Im_&ffPDi3LpG29(3t@TteL4#B_Q4dii$rkp^`PTB(iPmrT8crO6> z9egIEr-5+yx(oE=K_hSyv9zs7B<4oi@NeQa-bV-}-XmWBAtW4@I0X&;F;jDWwZCen z6f(iYwkURTJu<&`ysZ7t8UXg~kbmF2-GvtNmHU~h4H_NL83l+Oej%ST$uJzshSMg~zR3qN1mwO#N zxLqCxw6AV{y^=W9zGIvy=lfRlT{m9v(Q2cCs$FN}V+*Qf%=hit3=^215A-CM?_I|K z9gu8t-$nM$P-NXi2*e4T64khqA;CbVWl;k5qjm%?glEpk3^8~ITC;C<&dF4iA6OTs zuFk47{k|9yH-2tQ>G*U->U7^33L{oER;xJSXkB6m3N5WBNj&+_N(xudGg4m4;{T(u~ZQ$Fng2NkQIir zycB{l_lxtc$({Xe-Tyt>Z|ocacy40u@FGy> z(B{_x>%mNk4CmM8{$#lsDfKeBK zax*6D*81b?))whuZtd%3w9Tpe{+ zJP=%yqn#Vt5vH_5w3o)aA8m^C6Rb*#$~!Ay5KgBsr@y`Wqz}8#SOhn&n%UTb0H^2{ zZvV^&1>)oITl_nos7rF~Kq=1Pp$rmYKasjs)fk0s*@=*pJfxJ={8d{Up8W z$iKGJw|)Guw5fJk8BBk=*yI4*Q^j4MW#W<>s!vUohk+~T_iyNM>H74U=c7x@DPb-D zRD5|o@zi@nG(sn`sPpcT$;togb-LaohRS~x<5~WZrH|uXc+|S};KW_R_pjHM??v?c z=r?t0;^#D+xycJb8D}uy?5}v$nEsuBU=xd&i$>Ls)AanuzZf#e+lvdPGkNVB&m4;T z6NJF7p`#1NIlh0NWbRIXy(YStJ>eHapHOVAjVHYX@RJ@iF*_AI)y~B~$c|YmeTDVl zFipqRVh`+8eFS#;qSb~Aqt9#l#Ycj1$_KmDN>c7sjgEwN&X#r^V)rS0{O^6NzrvNA zv_Kyxudko%?OmMBuA&dI<>E^D_CtJkGz^Hjb##>7Zvs0Xa2~bfG`_xeu{h>OH%eP2rv9-KZN z{nO8|ZeoJfbDvGo_PfAA4Bwiy{m~93vNMEuR&;bCsBIR`TDn2KfNZ zAACyqRy0juxIio1v1@f`6%0TQ*=OWMZVA5P+T`5rh!u(GeslPrUWak6ou@A!s&Gac z^X|=oq*B@`RWQaWU;e_*A+cF|I+v~S9kOXT|1Cm#j-h2N|3Swj9>xt>_?6x4&qGHo zY=C5@8Q->o;b+3}R{6hOlc`vQO8v8Qq(;|o$L zJ2PIGp7QVHe-Np#HUvv1eLvmNhS?e)RUI*ms5$84#l2A^ws;^v*__P5ppkVgwYF#Ap#g2U7&-m?#ZU{~x!^py`U=?Qa@7;(&|LMrV{B3#1 zxMQ1=t5G7)cRxzM7ytOBOEB94JG9i5cEWg3+;&99z=k{xs&keY+%C1>3SjI6MOrX} zOPCsN@EOON&i1R}+xvJ&&bOMxtBj-mWni!mC#y?&p;X;90L<}WuKz{*@piz-=G7u^ zt4Pe{gXWI&_wx^C`y7MFe>o6?qbnM{f8MqiiRLywuJ-ApLmN@#vY;YdSH~ z)bu$-<>0cpK%h+rnvwf3>r!Ond&H*ysL4*VvzyOmAdn1B#GpP+Uy%FHbhz7{4|CXb zL;#)#8(*s#Rvez4@r&c;3XSfD4apiy$@#a?Uuv;EvfCFjGy$R9v3KMYoRw^VahcTy zVJ1%@(QtPCr@CE)ig(XbC8V!$ziE2Z_*x(Htw=t`I?8XD_bkvQGw&Ge!S3u<%Ux*q z;)Iu(?yHnDB<=1+O`T-C(tkEbnrfc@w~@ujNh_YR7uYqYZz(+mI$_Y#;1hDeI&Ri| z=@EP;WAlcvt8s-`W6gL5yphtPeL2o;=i5$tTWp68n_rd5v2 zW~|z%{lRG6+Ybe6ubHy6^D&gcV>`yJM&OVGu^HCfiPA*qZOx9o^mwz`qnqpS6m! zlwNBdlYy*0JNdP(`eo#Ch)q|(j(Y0(z>>71%y?U*&BIhz=?hDMPr+X^Adht4e{vIK zP)xjP&i){lqigynfk8$^Y|jWdp1FLm^xVLec}4gLUR$!Ux^$mI zGM>mq(t}PzvQ#0IeYb+nC+v7H4TQP&<$7(nI9T+UQb>M%=lfv!fs_%vjIl(CV5V^3 zjoK@qFUGO1d3I#gr%!u92GS-(UI*Lyytnev>b25s^Ec<%VVdft=Wr%ZMr0FXOHwOW z7p%Me2C6Y?evyRW(z|y86oAf(` znU3nI-AG}ycDjJdX2UU79NkPG)fk8~juzxvWm{-?e7ihdZC=4U{mARf5oi%4NJxev zwXOB?OqofXIk<~yKAA7gxKM9FuO!&^%jYxcq0h@lBm+_)4GW@AyMr$9KT78V zUt? z4l)MI5n8;8I8%yi0%%B9MyLB;g1Or~9@~`}ca4Q&MZ4dK=u)wI&aiHqe}fuyE`3<% zVcpCmzW3}RJAIW0>JunA^4+1*z0ey2;9&9LnCPX}+XXY3^B_;KU+Pq%bSUT8+38BW zHo)&-D5ts(tJbfZY_(7#$|~X2Qb=qJmcik{zU)mC-1zXy31@u5bL=bd+wBFYrW`bQ z_as@L7Yw>=9lAjUD7AhF`{>N>*4moMgbbaW$oQPm>dHUU!9HcyFCe(_eCpSrX8QaS zcSbv&XzZ!M?x3f)Mt?7bbZu1grE11}6ixEhW#K3oB_~z%+9!PRo}5AN++jl|xh|YX zUrT(uj>_F$L!_H|equx7LH}R3EMh>thYFw&{mpi3p`kjn=+xRQa&Dil$0jJ@n5sDwI0=o7weW^KRaQhv$wN5{vUI^d~sWMQXGTNJX{zQ-$uz3%_QC8DG(3r7zdZ zGg}OmtI{!|6!uyP&sq89_TWN|$1T`Zp3JGHgo)aO7-aD9vvhoi0FY)Kzm>jdCjYP+ zWn^Nv-_T?qxBNhUIfHjsXb}^4BG#kP=J8v{MAlwtXlv3>cq^{LL`HU^uSWkPQ#0)S z5YWRp*_=w~((zzUOHc0GLM5#y2V7xzYI87kPulX+M$lZ>T|-vVHmxf?Z4A7E$&Nce1` zocN~n%T7R3rkaJe$gFIXlE?BEF;OgUKYqo%F93a?jD9!3?R!s?aANn#p2`ZN!**G| zXCQ=wd6t;nSo>~SWxoyY3&=N$k#pOwooc8k_-F-yU#VPw>tNrG>KF_7Z=X!e# zsEA&-R7Qc5eFA1XjPV^~_U(3XnvM|=;txOIJj@lYnPF||=&TAip-n!rF1{`jDGesz z?`STZ@7U*O9wIhz=8%yA=a2jZyWa;>&Imm!iez5!nL(a4M&U%n(I%CztN|7TDx-g!WRKE zC^>LHR@Gb?^<~oiko9en40MQFoS*2wthac`@i1fwka%Lbe-KCY*~529g7(Hkke zI_?--<@0^tX8(Qr?R~+8;oaqdmWl0`C@*A=N`J(YE%!SQgy@&>>3WL~Nb`P(wf<>Iu)Ey_>vKO*`6 zpz(L3T|U99v3~6(|J9ZiH6XZ~={4SzWB--Un;)nsK z#I~v%hE{PV8i&BxGfN6r%QUSo=ai#SK)QA%>csRfVS=H(1YK=HS#61i9|s5cR)cXr zu6+e|2_vPE+vKLBm!QI4%F8u%;rIga+;6Lj-qRFOkeqF>Uskix?`@3|%3I}1kP#YH zJN?#2jz3N{BNzm<x^rAdkSo`c==^y6DWHevRcwJ7al>X+UUe_ZHWO14fr1D}Y zm`^;Yn;aB=!hD<1X34y1>Pkt8FRH-x^^Shk;zT032^Ft{YWGwhJsa#~z(Y)H;K!KZ zJJ>t=+$ z3dn?vebMmN|5bBr69G)lRh6#e5hQ&7Udo%CBlA*x`hjb8pJypF3ZtO47Qrpo^^QCb zYoTc?u+*6(R|Trv{voNGsJ+Yup0BS>T26_Qau9`;_uR@3Oc8x8H1*UjN%Ky!h^HuLxHhL~`nu)2(@pLaP)ZBr#73EXK` z4F#!xTJ(*EnF0@Sjr+bwne9^H$lNhd9MsG!2-zO<#1M+q)ZAtyX*ClswkIbEf26u= zmsDlVN=S%_Qu@&3NzdWef`zYGZ82t=&zC_Tfm1P$B?#Hp({j$*yaP%lL-yrXp*2$X zwI|~1?pM2>?dpAfr(KF_No9UpJ(g2Jx%IQ>#3ZiE__y`ep5)KC-ZrnI*w% zP?}8JvuAk+Um&vnSk5LVl|@<&U{5wo%x*8+Ad;duB%w0+#XR^PSJ`1uwj%oBB^6aT zeQest$K$ZfE!owApDH+t;%Pi2ncGge$M3?-bQ}^LFj>`lHI8-;J(8AO<&3Sul;3IJ z-7imlV;v>=a-o$``pAm>vK!)VbFWRNSXxYbTuvy+DVSLKj={)BmEdJH4tTRM_$YD0 zdy>`guZ{6_hI#E0N-=ZcDtaSmaNU^N$c2b)4QPngotfU{u)985`ZPOW%dLsoG z$IIMj*oEKHuU4>;I%Ukdo^#cj2ZxOU!;6PQQiN*$`6;v%ux;5mrS~|Y5D%82@`*;T znUanc3XNF^a-g@v()&aN3xOozXO%RS%XJQ&E&IGzBgh!gm{j>5-8$C0{srQmHmT4Ztl6|rg3#~UfSOW)JIN<+iDx}tS6+r#+1dO-RH zizWSJAl^^pyz$KI(e|$64+7ko%&MaaZ(~!edHuT>h79uAdeh*8Wg?-wkDCigyIqCU zBcra}0Y)dU=_XUnU{p|Rd=V|eS)Hqz=G9M!Qt`Kb(U{|aV_-Cv;N2j<@AIhK=*`JU ze@B{hmQYM~;VwK=TZM`EW1-E&((teuv+knI`9@NuWY(HuVO()4JB$}B^y#5WK7}x- zt^la;!jsgbO5O=M!Axdfgp<y)foxLE7`$r!u-nKVB5c< z1hQEcCv(kF2P}(L;#2wwx`PU0R$YyQTgGukl-&;It%X&I0C)eEtQ^&ty^OZLX^h|l6^(jSaP-xhhG zrqo%!Y4V|sn=VUvC?uT&BsMI6W64yNx|t6sY>GPh#_FoLyp!N-0P06w4F1kH%w#~I&^>Yv+1r6TFw@vCT=_s$r1S*<;RSB0iu!Dbvj(=|3| zEg4BkkrtMfaS#YqKr2?JZxuYgh0#2H(%A^%Oi(c`Jlo%k#yS7er)1H>YbrJ#wRy^%-fw( zCToAA!sKN`TV2wflpt&(Fg7vz=>t! z{Mc6ho;uL|oK3RU6cHPyn?hAo1ue0%%4Q%u*WrK6tOZA0oS^iZaN1*q%Fw;laRU;D ze_AY;oc7HXH(C|dP-RAWR*mxoeRiuDYyGRucj=J%@RUJe?rK+DRV;mJBW1Ln7DS_8 z^;O0?AI>p?;t{0Si=A_6@lSo*Lmu<(t9C^xcj!#t5tk%6-G9jj%}8lv22BCZi5 zoZrQaWY{BoeXZ>9=f}SJW(`8{|6}bhqvBecKVTFKgy8Owpuyc;f(1!JaCi6M?(Xg( zxVyW%ySoJ)9EO2+lAN69{6DJKyZBw zHF;DP!8%?~8XA4*ad0U~0-6wvkF0jpeBQ327v+~n;p!T*3 z}vQ^kW}k`WDvA$|!RhxQTH4{6lJ z#r=wV-v^rl=?=OcX)>$~+><=$#$V`ZQAm3C_ z_!RVu_LW;CmeNpgy*s)lb8(}L!B-R>CrPYq zZ-jD6NP8o}>|%cPp8Jl%L;mu36os-wc>lbBrSzKdX`}vUO#>L{mmzc@vb?Mf25_s00ws zN0cdl=sM3b>?&8Gl4gvte~*+^Pc4_ym5ibZee-jHqJH_* z-z6hHV_&$cI7d;ZFspoVmMl@&4=%&~Ly)eSsoS|@^#Z0s9aR{WXS(#yhyiU*R?s=a zB1aOhwai}Pfl|FYXt73PVEc5%HlUaFuvlT)fmr%d2cbOURlEzND6R+iY&)d}-d2^A z*y?s~Y`o0!j}`6<+2ZA=X&Eh58`1%fjooiMtXT}5RdVWz%KQVpYjR7Mg0SG>$q;c2 z-NxJV?Gza1+qmOOQ_*Bx$n*BhDYI_x4u0Gp^P>`qE0^&z{1UaMt?(=X;VFCxQi4oz z9lH)jpfcPjbLcCtwqVPQAl4(WXYoxGIDR2F&YqN!TLYtiw(6eG+Imup;pYOWYx#d1%HVQl|8%jFt%~Wqh#VPZlVz?I~Mt(8G2% z3`&W<(<+s~E89YTSkJzh;UZDi>b&)soSVOZo2(;~L{=S^ASovU6^Szwu1StlQY9{O zoftogFUH;yJ;pwtq#=UlCD+aB8C-pvfZ|L$*;^`>Z6-@upNu;ql}fOXtqZ;r>WSjB z-(Y{PTnnHk4`+h*PB`|&oj9(+j%#8KsA`i}qE`pIn?ABIHwSnva@P!LAPrgPq0XS$6W!fD1Q%H=evWLY*9=WDrRnp`%H53M8aT0afuS~_49 z!t=r+1|jvGuLGSesM;HFLkQVJ!lPJ+9>?NZ?R$l6qD%r`NHcnOHWb3!f@?|iMQssn z2RbkwKA>X2b8Cx5yE+`7MhJs=+ZW>~u}Z;{ zs_`j?n*2^hW}mmBX4(-)R8*Gm-jzPZeqX_6xaRYCN9*7yJLR+&=&dL{1evpi9fx2R zfYd%Vk;zg8VY*$Sf#og$h5GpJElGH}{PYK~VzMF#R!ov`Sa-{+u31zh@%VjTMS(Ng z7b&i?o1wNfgBj)e;P3|o6&x<#Bx_U2M|?dzK^Jmvd4aCBIVWZg_R#VuEH#Iw=p1^{*r>$@Me0*37jWLKnb$$Fk zlxntnqc|<$UG)cJz?&V9VWc!}LmCNQLl`YDh6K)(#>0pJL#)-PcjG8vfNc#LS3 zYU0vS4)o>U^z4GAR(+%}QkutI{PwCHVuRj|ES+&tluwSpvR<{Wx{6@0^W#3vI0;m7 z#%U7Vkzon!i$T$Zr;~YS5s)U=$9jd;Bc=TCknWo$3*w9z=pN9+brYsc&^+@&1f7N- z3F(@r_m6F8s%{nsL^8Tv#EuVf3D7A~mxEI+jqC!5GudUO?p}}tAXw%-iw>_}8v~4d zIA18a0KT^PP;E#r=nsvzfBB8g!Nl!7mqz`zy7Xwo01 zb~=QUF`ZuLutAK2w?W3k$9d6@(s; zGt^NJdPiy}d_R>pad&7p?<&r76P*1*5iD7bny*6H&H}xjK5?QQY2=y!U&5amzp}Bp zw|&It`m|NVuiDCGPL%lBn#J~FXt&(qUZ3xJX(Hu$SthV|^zB~wNTpI0AOlCWl`)aJ zB9}A#>noYh;a=O00v%2a6VC#fC})w~EZ^|YpO(j0Kd6p+oQbAOlrTBeWAGY~TFc;$ zOo|Uwk<0I7EQq9lo+UWbVl5gk5#Fr;L;l~?5+`j-Bysq$#hno8g8Kw3I z7zAWRVF}t>Pij6cFz^N<$YVkJ9G>w&>2tMTeeY+i>iU{4+XK(_j)3pFCNZkBe=VW# zP)O<7gMks$cEq4?{w*_uKkxa@TvoTg#hU4*;p*WKl%#TEcE7fY=|tLP7UC7`WE8}F z(3bbK6_LkPBBLS#jJ2Csd<5w_o?s(9dz{`_UfK_?LznZ{G~Hb-$wpWbcSHLb*QJ@uKI;rn0EhhuUUrcFhXy?%-EWtSX5e=7p|2-3FLo* z5ml?}zLJt?PwrD6dBY$hNs7~z*+yaMc+%Y5JY%&mH^<&;27j^$_$HfIXLhN|!$&7i1Bs0u> zHOSq@se;wfz9@mdIce%##pU6=BKpUR*KZ371IdH{0;>@leVRa9`&0O;h3kt8wxvVE zSz|lL7bTBcw2T`r~g=_QHKbc^-59=J*wSGIfrHO|GSwEM%}qbfFiSS6ob?j8zPMx`QzbQICG zROL@U1Xux19oJ<=aUUYh1*Nq4W}W$+Cs@_hb1W)?HRPW38g~K?mU+M>Tw=loP$d_} z6TomFFRl8FfGerb>7n|^n)x=dpJb|ysVmkUVJO&Z60-?5d3$pxve@XP zB3NFQ^V`b?>_3&4LE+J*!=h(mISZ?Qy!_Ay2)kR~Nwi`pHh;=)4$o-v+HA09JV-Ml znfq_fKJcsV-B)^?8k}Sj|}CX6mfs{&5!ibE_?L4E&#+*x$`6J-AIO%snA&GCua_k3+4?k?)Pd;xMNWP37@twsq4 za+8ETQX6DO=+_Jsz421H-6fxA|2ZP~)5?gCJ=kG_Z&c#LByeEjs$|L*1_+(tLg%t& zDnL{0d&bFf6w-2J4Xf|W*bHo01U^`&+>T}~tsL>N5NC~+eHPwipm1AfZEeZNeA;Qe z0Sr9YS}4nSernp0Z++Yao>*8B(f=mv-;1f!vcvS^H%&kj4ksHS}jw zlFlen#@)}dFt^fM14EiifCIi_NNJAhlYkEv5B(oDD-TjUCgg*kPZaAPGzSZOJI&qV64b_ zxd$G$ZRt`nFm!iJ7-)Gxd9vOhU&iFHDx7fyNB<#YFAlZtQp+D zq=Yok7oa0(cKdPt@c-9C?AO!`V&!R4d9-Pv2znlSC0*JaQr$ z0vNix%8RxTsg|y_L?5>slNQv54-1er8k!J~%wySBUhmreW)^=hyTg;^aqUT8W%0aR zPLS8>3waEKLe6^5_7576yN!I!=&o-W_Z2z?3u%3V-n@UAKUDK-UbR7KunDh|z@LyM zl6zS>)4!f%f@%{wuz^Z<>4bDl6qXjjd{)1DOB1;cL{Rwx{q3jpckak=&X*_>lBhw% z2XU{#tiD-J&;AMP7xpWv_?Wg$_VqF9=J!dzZCZc3Cbk?H+kQ|2oB+#nbmk;LtP1R= z?=$kwE?sw!h2>mAd3m&5o}ZS;0qU}bXD=5fXAZ3_56T*Mb2Fv{De^XfYgp4eV4ZVA(z+wiG^;~xBvCGI z2sg2>ggXxvS1u{_3j|++9I{n%-%3`;z^?Y1(6OTQ; z1(R1-2QC+!=Enu00^=ZgyY|+oZ~(PCz>x#aTm~j^h53weQ^$s|tps6FRqKP{l-GSf z|LZ5ly}lUQsdf+GG7lIXjyXs4iYqD;{lk-fK|$ZwC_LIWQfZnZP6xMp7&DEhedQYq zE+KdYpZ)9dY;S<8ORaZyjFc}w`Jbgyg64%Pw_xwB=hjb>tFi~TMKM8C}kzXugolSWJw^pj`f@^OXsA*{ zSy_p>gF1iVKe-<59^kp`{Jj;1BMG^?(LAE8aeS9~yje|*r8eH&CJ=g8mY10v>uzwi z0P6QE*EEShoQ7@`HxVko}rKV!|``Z{C{UY~TH$ zwkFpaI;vnQSaTw!z}@OgL&h)=`g~8YFYX)!k3U{#CxKltrn*vZ`)@MPUq6&gGtZLR zI8RL_ogZ(4%X9wg*!g>d?S5^yB>HWH`2CLGm)gwOKbg-g$!Tdz{JB@QTE)T3a3RV_GH&<(Er+4Xr5 zwEPGIHdMD9I(Kt|L!x8IBTFMC0|Th0tHhns4^rSv#7(<$L|Y}j|8n1S6xnk+QpX(DwTa@7p^|CvhuERa zUeMeG7?Q-8(n0f%yVT@B49=X$sB8Z6e&O}yoA|F8bTk`^a@YO%+ z*h@AKt?loi?6Q9i%95&*O0*)#AuGdpdjWT-5))-#{KJ_gtx9t~jB*(cgkMEUu&%yj z;c)NPD<%w3jxKJ(#sAVdgSW06c(|tOIHZ7MY9r8NPIzdo9?U8*%r;pMm!s8_LfelU zmw-T}w%$J&Bcc_vTvdL6*l}Ae_MU#ixUZUS{@iA>+n1gv!tGq9H#8`Af_3Ogoj5P3 z71#H)cY`f32HFxAa`o5+*k>sQHiFwY5FSwu%ikN!y_D;Ka6uF5U8 zy#7Gx>0v2$>#)#~?Q*Gd`RIOGjDOw`$MNngUL3Yr8zUr}f;P=fS_NtutIm=fz%7S-2FC}*Hm(Nb0sCyM)sNySqWr?{ZUDRdgE*wvXUBY2t$k#F!(?n&WLyKqr#U^0qhC5N_)6!(p0t zy>RYi(Luxu>1ymy>-tf5V+ax0sZ&Y`!6<66%bvzb%|qAtImGAtC-sqa81o7KTx(M+{G(KK zrBO{G&soiIFD}>;wD+UCDSfgfbtd>`e+5tQ{Xy;vzOdNxCnUIrgV;1}*@<2PwWNzz z7hH?6%Dx1hIuxXf*o^cylxAVtfXBd$GqNEW+`{eUB`w6D>&(^SMgncWj(1 zKZr+j(IuW3rWmZSN;VJ6^hGNEM!CbEW%Ko|l)NK!yx;;{kYfX1?a;4vPEUkF9xti= z8+siq=@ys1I*&H!!lk4bfZ`p6A|N0DF^dcoPV4`c4(9&TMo=P;lY&Fi6XgdnV4`5g zf{M~UW5kZ@dZ=@*R4?e%ugHg2S|(1(E&GFGm1&)U0UsKf^}~pU+G5aD{$GH}20BE2 zMAIVxo!T=`low3mg->o?!PfKS)Hdt?<|W3Flv_1q!|`Nss|T#TZ|>}bMO91;Wv%cq zbryWAEGsYb<4UtaQ?7G(O?qJIHMBrq++b`y^dU0W#lgX$V6D8Q#N2rfeX&Yk-QUrO zox;E?S}JozynBo}-ZM5#*93o_p7uSWJXu$pFQF5ZDgPVQsy=D6HwIp*Q7eQ4$-D}| zCPQqa;1yW*_48-Q&LnNmrELyqSVV~L_2p-^+T`9C@^O#%_d=RP4s6dS?J|P@1ZjZ< zmnzXQ3J-#aC;sPi+utfZ=@IRv=8s(PAvKur`_%e9%oy69z4YswHu8TWSz>PU>Vr4R zmu+dDLM2}PMX4#BDvLE|@pUCb>CbECh@5hAosf*k$q|mK(B>3tF**w7L zum`Xfs`JFTq4X}#141O*tik1FO9_X~3F>9BE%@~$n_V!a9PQHr9gXBJm92ZY-iHi+ z4ZEl#IzM z%XTngtgAHAq@_t%*G2m*9`&G8u7-7o$zy$2c&d#s4`Lq{EPEw5r5|DYnfH}#E%6h7 z4?x2eTt4>CCmRWsmL1DPVs@6oyRcSUMVNfn*|o=;mQk9e(OWZ==Y7xc69*KOB?}0P z)msE&ZaWOt<^-k=1L#+CI!KZ_PwaPBac^G|?`-KZP);P0)ua2GfBK9zTCw;c8(yjb z@HvzcH%q~O&rC5@pYPayD(|*X3}y;R+ktSO$XEFCUrY&HURlM$@~Q%UT3qf>#h_IN zQjl01YWJFCHZ#V22f5H`xBJTS5;mIAFFy9h-R`h$H{(HGSY!_DcwNNa)<}jb8P)7~ ztDqbMfD!&dNll~Qdbvm$C=CCxd%e+!+6dczp1!xi>cK2GTyI` z1BJRL;X#ew$PbfbUE-ktIp_@5wLij#5=)9$zz8b_7>uXM%T=W$6ZA6~IV0{{+aP@RZOS^htaW3&$PMbjn3nO^}!eekAzWI0T$gf3h96xAD>biT$kngmkbdn9Jt$Kg7db|Exw%; zpDRbb9&!4dfMCqscxO#^7gyF8u_boPo$`E5$P&lr!eYvQ99MEScC}>FDfzA6nFaml zfpR1Y;Nt0NY}Y+Sd^Gwyh9#L-yzp}8+qZ#QbrcrrjR{Dvi1kj=2A`(`P9-n~CCf=t z2rL~xaWO{8zS0j4F_+vWw$&v9ZOGs|+Oc0CuZ?=+9M3WL`g34%xGq9}XL3Ty3*_ow zixF?d!$pmBTR<@IND0~r{K_Y>wrNgY=!Q6DD~top>O?-e>$L-MvDrj6N|tB% z>pJ$ObH3=IbH@tfofwZsv+U;E*Rw9)&-mn2bBSm{D|A}->OFzn>Hb;k!qrHHrtcBX z+$J-98d^0_<43x*~oqTEGDJw^o&r_t6RKHlME@ zh@Wds`M{Fw_bumkM_A-)J1d&^O9xO+#9{gTqd)pvd}(bKy!ojkeAHhC10NWpH^@?Z zcfWpt6*u|C#(%kL<^1^ojvh36^KKL;GzxQz{0*%RJieqfD&|)@$b+F`Mem}K36~Nl zx(Maz8_qz^WtQ#pnWrta<)A#kp{6n=iZv*jWu%O6{yeBRHQZwDhJ50L_ihHO=?e@B zeox_ZS2A>&nEwh>7LR)MluXj2tm!z_)=$afQto9YZ7%s-+RDs{B=6=Jy>sA~CZ}YLRT-@cHWrthz_&?3FB9q#7BTtoVG3Z9MmP zZ4cGHg}nF${19aLz)u7m+BWemRe=(j>ObZdUON+%@wykkB^9BsTnQP$6&5pLoeLKh zL&p2CyGd^6bth}szfo7gaY2`8T1MzTD|xi*W=?6pnv$Z_AZp>4O4)ek^2EQVR3?o%IG_oFS1&y zl(ZhMpKWa@!cepeuW%l$nELahQDY^>C9YJqL#etKgtf+vRx{vY`Iri&)~3?~=*VNV z0?|3j7<%>bBt_!UMniHDM~$BQDMnd&r5br&=d`46L!nGL<)YdDG}#gN_4Q*~z^*af zqw)QLnCwQ5wy|3&PU^)Je&JQ7GY7l^kPo2g-fq%S_f8pd;q_R=mug8m8p6b&De=tn zyr;Vps>CWm|D%(ihW@+RL^mT^nG0FN!m96c-Py11l>MwB=8+x0h+qVp-*aGNGY2%> z^Vc|47|C@>e0_jHHNxxnFqXVdFIMz`iP{n`X*3U4v2fg;`3cPi=dFKAQ}4Oozhg{!UkqbKkP&*i67;JS6k5zkvV4+`x~4kZ zJ5s9CCG}~e0kELQd+MmEso7JK*cnN*Ldy0_RV(=cju>Ff`lY1?qz=Nv&7DXm4^}7wUB`??ErA!jgEfi78zbxA1VGD78(C#Ns@P~ z$ba4tzca()_YV8(+YkALN*0_&<35`G_UnLYhqH4ko%-3D3_U*o4LtmvGw55uk z&xyuTFU`#tx-EG4>U@$b$n~a0TRrQ)5Rc?>-AHalR1^x@?Rr7{yzR;1XFg&SSU(?R zBIs1Q@Kye88sr3$@BPPZwO!ycFv`cdKlH(ledK5`Hrg5AXW1Fw@kn+M2rAQ4iT$Lo%tv!>aMW#?3g6pPC@wLn*mxv*qU5TmUaspb1$$P$TU z^bQ|JN55oXo|wMX*WLAc-+*&^;~p@-J)`fdsvy+=`UZY$^A;*ObAR&)`DMk}P1NHKV(kD3DZFBsPfKzDXK?z#%8))DKS+_?pLzmuoC}URt^ir<$EP!4>V%aJ(LISa0^zUmot_F-R?l zMq6XLUCbCLjv!09-kcFj{!VKBuI4#DfZvP{VAM${=4^qF(Z5)gvbxLYmG8+)mXzk4nck;xKGjz@eX%%7pvWpf*R;=rk_N8Ht1e70UP*PGRZ) zrJ4h$Qm{ESb3IsIUZz|Dp9iz^=`Mi5)E%G){*8iy+v6~OL{5GpznktJ_%;V~#=={l=1cB~VQppyW6}`ULa4%()sw{!=Es_zC^V zB*{yyMk7P*AiCayT+}J19~_6v&L{DosylQ$z@T8Kq=k<-6D%4l6Z*#{ze{mz>;95h z$y1zfKb||yE#uD}ZSpBXB9tj&(U+o~IaZ`v-lblSrM(wOVt0!0kZj^Ee@;!YB#)GS z_v0IX+Fe#&25;1=mvHwXb8i5gE^;k88kQ|-$bWKak>bd;;2*i^SmSkRT2hIhI3m{C zG(JHLtV$eBzSnit0P}|Oo}fcqldgi#^G+L?YX?|C6V`^D|--LkbA#7)2WckrksJ)EsuaAeG!Q9PdqjscUgDH*hc$dL|Vf-$xHc=i88Jw&?H{eQqJZ$gfX-)PhU zWYL=g$Gc?F^TmG|X>d?hu;q-W<{!rq7uNg3d3TPzkOlH0%6PlVNz>N@8`Zk?dVX%0 z@OB1{Y4}`0Or9d1-X?vLg8^(A7n1$w48Rdap zO(PEtw%^w7(d^t@RZAgiMM3Iow{wiWAQT>3B7xcB9V$dTaZODkFo_5kJEC58t@$gi z;Hv^++kWap6ql4x)6#aCl*$Ve6_w^5D7L*{ZAX%KxN#wp*u7Nh>GIVO07j){h72Jh z@*iM%bTI}8zrMoTm<;z}&P7JB`l|Q#{p@@-XV+C4;dd?jE1KE(NUT@3a!j~>wW$7x1U^}qa6w17I`6vI(_*(XFfG<( zl+~SNh2vA{yz^i{DIA~8$2 zgL$?3TvApRBuVEne+qU{F^?nZ5%9cq?D{9skVDUx#e>CX(svB$z%^zkpv6K)XH?w>)$p1VMc{2We_4)v@9Etq2ct zIMt5_!!F3zZ{Yi*6~scQLX!JM{XiCr76XH{4kEKd*{#3*-=$!(^0Xl|0x*dYsRWwd zZ6P#{WDxR>gf>Os`IQ!wojUN?pxf(ZwdDF=%5jv!c20PsU9ibPB_%1?ntfT^>r_Q@ zyaJq}OGm<>E!@xvzgnq`kr*NlK402a01Gq-Cgb%ezYM)iLi-j#Z{y~Tg?ZiI;99Wz z!7Fuj&-3Rm=1x-J%yam|jyN+{KieTxL`9Btkaet&7Eb7wkY*?RR+&3RD%z)D9IWDl zmlQ-C6z5z9zz6vVr}jDNq;w{f^(;)TRp z{}QChTaPhQAsFLPu_d_j?6F=IrXd%3qP7ry(U$pKCJXjVI?Y|(>_Xf$raFx|kmNNd zgN_LasWtF4)}LiUm$8nkv%nDM?9nxXaV#ahBEjl4 zy0%_=tb^q61rcHHb4%i5hc|qK{wPQrXfOH5F`$t6aei5{A2G7iS%?3l;F|E@ceWEx zp@P?>qa}mDX{l{gT4%6nWyMw6eDvCSdI-6?h69b6C2|uVE-mq3yOAcKkyZ8-5p^-E zcM*$DwLX0itZ(4$X1C@Nx-M5`@W_I*EoopP1hy~FzxzXA@ZX=2i3C=`MxYX~O&t=M zcrl1Qmlx9KhB^W4x7Ah=l2>03TQT65)#aU~J)=-k&ePw{Pk}=hctNaeJ9-MPIAU`x zN#TQy(B9rYJ3s#{=ypf4@y+EB^fJdmBCUpR4kd2U87yXz&|Ns7MCa$K&N<>wv^;i( z7}+CbjY2rEw5!y>I#4EOC@@Jh!4av?TLSDhvWFh;rfOOk#>sj+eJ3z5R&FgPN~sJT0pAY*n2F_%COQknC`9Kr(+hbuA5R|TI-LLi({5VcPH+5rCbAY`jGO7<-xop!*N~Z{E2@_{?KDD*S)>L`X5Zs-iV|OUZ zE0hvV5TURD1(dIK(t}nRjTEXM729jpJ8=zqGBQN>B@_#0bu*a!_#}|}CMr5N%(}RF z(o$-w-O!}er5NA;aB-l{t6(6Xgp%rErA|KRUpk=uubxn@S6;_U23iY2(3O?kOOeQ&)QpOMu5S zI&@w_!>q3U5HuR{WVsLogO8kX$tB>)q(305Bl!iLen6dTb3@{3v+Lyk%5i$Ya1)m! z+=ff0@Bx>7rG9$a?#UO(2tCja!Z{y-KcGbq`PM=dBF1BNiYO&{7*&2lcapPxkT>g} zZXhR{^PC|~hjC?N!I;B95jFY=k3ckKH=;1dqQ!5Ouu!GLFPc5$DadY|yX{J7SM!EY z(42aAiP7b;1&sYDx9Kpw?yR?5an&?>x(7hiN|5&U_M(ChT^WnfkO2s0W@f5$GBna} z9_Q^M8~@rkU@QB{B$`2`l&%|lHK`188|`0VEe;Ww-2Kyz16#&j)?<2tF6KcuEZ35` z=a`SfeW*wtS1z|7O+jl|XfY+3B7b0NFcXsxq~*RQik{(hT5ebv@!XI&aIPk;ZD`Q0 z7x+Kk3t*Q;XrAkU!}o!M-b5vT;O@T%>NF>`0JuJF3~Q4y-&hT34gRk(1HL!W=>c1y z|NiHnyWJM%KURppn;B8(&HpJyD<%fZ6z~UV`S+*L$^Z8H&+}s-WwQTuJox>jL5TeS zQmvt*y%h9YzowKaQDS+@gpUi8lac?23V4%j;H+TRY5Hy)S7-Ac zgy-fT0)x^g^2MPyW|F&LpMXzP))7VnXaq|iY6h7YD#sGd5(Vm#Fa2;-+7Zr+5AMf9 zo7#Vpn?~HyRT;W=EC(C#ktXMQP9w@iLSS!$}s|# z3s=5==zh(4)b`qQ%tJB0{JsA1`i@Gh!r)?_ z#V9A=E#}mU9Un|d;f>9R?TLqZ$}&+MO0*1BJzzgX?QgTZt!+tB~^SrRI$vGc#kof8P)mUlv z?w+2RS~IazoN~OU+B<}Wjh|i9X$fQMKUIJ;iuYE)H}cP6a4XD=1REOSd8Rx0kqW-* zNj2Xxq{fvq_0C??cCGD|s?^7SIfi)I>Mb*C*ZrQnD(g(?wVKUg; zQI%}i!iPB?0ox8kL#@UUXx@0g&_TAIuP+>vpT*x3z4Nv!ElkllK6PY>aE z_22!doU-0aL`s^p9*x-_jw>^>jshU!-RKsEdNx{ySeBK+i0waMJ(%JiO^=5XyMt5- zT(s?luAOp!FI0$Am*$}OH4S6X?Jbf-tB>woG;j&=#5Tj2?Gva)jZooo2+y#G36W6$ za`2@#p)9Q)18P(=;VTi*NUbm3sw3^Z0S91kQ2FA+DA#{-!l&X)c zZS0LGb1)`4U~BYG*X3kaq#uUrBO?~$BjI386$-Mr3dY!uWX16LP`_KMh=1F)q$@IDEqK-q=xi9O%xa{00z$FP zJ^NGDr@J;gh+GW~SfN-M{_CgoYg5pJncnn7H{rVKP>UB5GmH5fjKHkB&~{Ygp1tbZ zdtW0&DKe+nwh>~4`mJ#UFSPKzr+sOY^9P%mc8>nFqkPvMe6#*>(ly7+Wc$ke};_ej$?)v~Z0XCffDL&^xQn7dCErP3p7P)n)oAcZ?a zldXrcFNN3_Vk}ga_vo%HzUUJ9*!x#O)Mq==L6UgZjEsx=#2N0Sb7c$w7C6(tjK5T6 z)$39(?sPh45RG*4-^(;7uyG_k;js>pd>$B1n1g|2ve7c8x^S`{_?tfS*M1mG`85%b zV^wSCPB86pc%1H&0m=rALrnv{Z%_{?&j}`CoyJA5`BYV}jle>y4D1nIfrTayt6*Fp z{cfI}Cf2jffsF>7YFz)9s^a)JPVbgD)!@%)3a*`m`>`W?V3~~2Qve@TT8i;kKu27! zH}BH8_%$UimIvRz*BQ9`sPded*5t%%vz8FiQXIZ_e6lNlsbh|^eK(Kx%_!!K@7!4W zzvS})9~P1wQms~OJJm$tgv&wTB>SZ~dLF??AC}tGayV(kEc+-+tvDm?u|nm^USjy9 zmEtejoYFcIyBFQg$Y!)XwlRKk?(G!D_G!gny} z4>=`abcfoXu`EQplT1!$Kbd_pp z7yTmUKh3?mPs7|v{ILat)NZ;R)b44{`~MFa#-{J)?iF~(s8pG7GjhFF>Mh$CSUsPd zA(qL|^z`(CLqaGhIre+?y_1uZn2)y~5O_CK2D|r2HZ5TWG@}4)>Zeyv2M z-&3+nGv95UnJS}nhS0j2D(*FyZ&7+UBVed*(;fc^8Im0) zOV9dRDmW9y`yHdS8{-GC8`dgM+l))lh)sK}Pv?xX&pmb zPtl%3cVf3~=F6GX`!U*$%`|Jz)s3WoA8!qNc0C>`hECZ#Q_n7B-cuB`-H$|}YoIZZ zI0Qg~9Gx^g&;C8mYx40iXnFTA->=?PpFr3f?>B~m#%yMSt7KXY-}?m**xJK7t>U3r z^14{gVW+OX^rCbC-|N$LUL$S`KBI$+;Zb;{0@(YJS37Kelj;|>7CWCL$;U%a(;Do@ zWQ8hIcHGqD3C)0=9}g2_$T#%Goc#URtd#x;Vs?F1tDVUNyqw!o)s({OwDemw=_I$? zH^NW5RgLmb6!sYU3PhFrqK?EqRgoXp&Hs@lV`#@a5j}cN#UdM^t7;b>;mZZYb9X-F zc9EYYKA)uj8QS<;SR|gPnHK*p08Sg@UvUF^0sKqTY_NYb>pf7E>(LLoHk~7sQ{#-{ z(@K*@mDI-_!}IUIAE03Y-@vplzIeYS=UBfdR^ViW;#F+veQbwoFYD#>>7ViDdLd3u z;&82tyP5OGSmk?~zc6)Hp)h(S{r-OUOLK^+cKRS=2M~7SiQ{QTQ`EFrYv{NR5Dr>! zFFW{S@CEbwGDuLBq>Pu-cND#I+^)$Ax%qCu3~~k1}@9rIIbkD3MFGWe0Bd#-~C~lRK7%Vm{7VJn;|tzZi4U zW2}*fuS?h{f9v?{Ot9eZUc2f^wh#`F@pSYK)?+GCx5gG^5;x!Q^EDxEe_a4Qp>unR z|A4rjY^d=CtG?9gGurcufLwP@PNR_qAG4oc$jQ1y4=vCH3DVZDa=bZYS4yh4uO4H) zI!%;hxyjKEDsi+*<3$Kz;Q2~4wSvG0ltqN=_m0xS&SFUpf5W;(Y{LI9gZi^bsbP%{ z39PmkfA)~O8!`=OuSjjKB`P4Jq}s+OqC^~~c5I>QUXj*vAL651p-gGmg(o(01j@>h zHy$sB^!OF539Wd&U~ODYnP%w+k=ui0flDtrk*^!j%FH1rztUbXb-@+4>yj4hfe{x?w2QVW|WbW4?yaS$>iphM$YR` zT`l{qVWOn@6Cehz^2YBV1)1=#irhoF{pA3E?$9INNFHwArZD6Y;IriVS;l>6TkNx> zfCU0S4DER*rII_s+Pxir%TX0^v1MNdTIsKPS(PFe zdABGIxTk8l?KXIFd?I+H2l8n4T&Q;!RMY+}~Q%64#U_PRVBB2xJ)| z_$;yH2-n2@smc>hct*BMf5vv;_hI_K$<=6tBzo-EDF5ECOV#D#4XyncoERy@?RaTY zo|P_hvM)3sb@0Y$!sgnQ$RO&g? z!AR6{1L2Ro{A`tq({`C%760U8SocmAcgwu!tQxxb(19U;G4cpR$9k18SToXgz zdn4_Mrj9KI=L7o;Pfy+@PWk;X$8D&ee7wWPWz+GhwZr1BH)cJzS{negD;YQsKKwt# zeN|Lk-_j=%AUFx`!QI`H5L^QU3GVLh4#66Cch|<>7I|D=wkfpf(4U)$BlE7_jaDHjvtX zhJsnYRd|**`#kHys?3zzk~2rO2fqJ~x~G6Tm{J`b@wH9%Lqv0H>Hh@O-#_lR@shHw z7sy+gkb3k@=qmMJYbZ%IMK@3~oLN8!?=H9RQ-;`Z{S-*`|aEhMz0xkr3l`<1rJE#0_bcPsbB?O5+k zM?qpqiBW+&0nW$$ENpKNyx5blif!}iCEJ?h9WZ1{r=AgADWH8X+9+`*Zt;fKxEKN{VIw|2PwXU>Epwc-(Gv`~a1{~dW)8u;pZO7R$ebb9K%YS- z*XUxD47c#jI)u>}E0(gRoYycBZT&rbT@p?OeSs%SWUax6Bg3(r%y%j0^nu0c`F=_- z>n$_VEJrCuzWd*)xBGif2ON7Zt`X1-b&Iu zTMpP8v;aoC@1==zw>AHjuYo6AFu|JaBL;v>N>5+p^Ri(SKUEHPPX3>nh@Hy+FHA(w z)PFJ&^=wdU=uXP=JZ6lSuPcG?P-^sdO6gw%BL?;ixAyy{(T?>9=FHa%t; zccEVARr`22_`6h7XcI0L8F9SKi8Qf2W_tw$v=ulVT)lyJs6Rz7vp)`C91E}=mK1SP zMcsbH1Gqr^!3t?2*iW=_^ZnrljI6sVsnh!hF z#F!VqOgCi=!IsdOSIfCZwSv+Y$~XzEP{)CkGyl2E)S;ch?miE{03HqXp@NRCvE<}% zS^ihNQ9zwLABQE~4i$)(Q%{kX2q#Y_-D@+Ab2^V}OWGd}sup?V2cY$M+hH@WBKOhj zDHwK3nunv;ado}7risWKC+5iufI70DwA+XuOiTT;#Ylkak&5&fQrg|Y^ilCx&P8ve zxKN#nJ=5dpX8mNUVclIywYDE0xeJ|&c@GrW2>Jeap{4y76|e1ge|7?>qbu1mn8Tn%5<127BpDAH zF+4tp8N-PYJ;|#WDu4mm>;-nb?YHx?r>MR4Xf)Nv-#T$nY|};N01qy);&UD4xwp+o zak}|fMd1u2N&~ZxoT`WcQCIl@*(f%x`=1uxp&-R zIEXsu@RpGI}YhbA&J}dISGUz>Cr$z zxF=IxHt4=&g(^f@8}jq^Pj`Z_EtdpjE?}zX$XM_{y;M`qzaQ!v0qEIFY@II|z6Vaz zMI~Dlo9#5`ZSm={zS;F9Ze7NDbRv=c7>j)u%A+OKZN^o*g#XTfuoN?7#S@1?^)_vb; zg^LYVoGSWU2@O^`@Lu~d<4!F;%)HOZZbz|RhpG_%_nG=dHv1qQ{4mJ1xKeBvQAAOW zh1U^v=Dt=7_Fm;2X_ZgnW9HQBp({7w4>Te46-K{`6H(Af-mSLC=t$`v3EV~>R0`UL zI{q)kxzo48$Xu=>Y#Z~2^!F!rpH*!E>HP!~rqi6DDVo8xu1#&mLcJ>wyR^koM!)z{ zDOX2fANe%QN95vd{-oJMIssi5%0&QPXr{Jr$E=^d11FoYAv$5MImNT@=U-mcL49j# z{_m{Uao7Tv9f<2RORA8@3T#*{G@7I4p)HY|3Su7PyRAN7vn`&ahoH9~u&VUHb$GVDx$Dn0&r9 z0R59F1T3BjOH0$URI^YKL4(D#wARQkKYm`fJtBBcfSZ%}9u!6XI@a>rO+K8(vE|g* zVzmK1WNZJ~rHN|)jh_151QuF5Ei5f~FLt`=*~INi(35cyVw3{e2Wi(x6xEf#DY4<7 zVK2~=le}}SH|U&msW|<~)8xqoAs`2~S0XVX2iZUCg!kXlQ#4y(Ynd7zvPZS-I^Dz= zY5C#krwv}o3^l*Xwlz2EKVOINKczFfK+|)Do2`5c{Nn3~eUvCHW=dj3&Ovd~tpV;Lb(wbW=#rs5iOjgqcO({<_dM7SZvbw=P(%Iln z-oNwx9BE?AJ}K%_=a@(Fcdk}+U2SbNDq{DCeHK@JjJ~ZD0pOQbsoXb zUDBDk6_;E3srq+nbJkSYOYW&wX?Y8@rB*dD3H?){CI5%E1XoknFfSddUe2LRwWsyF z_M?%iAouV9%J|B-E4Dka&z=jC>K><(pL;d<>p7oNRcaj6;K!{oqgmcCd&WJhusELZ zBM_xVfUJBLFHLsW=kyYuU~7c5zjT>UDfjduWx8thxR0p1_kJ1{x%;xEpdt1O+!z|{ z&am64tSyF_katMb`pX!>zW+xvwNq<69q+pML}SP&upP+*60d?aQ%)w+qBX#kyM3fg|niB`}iig(DLZd~r3 zPRev}G|&>i*xaJuLaNizSP*z}`=x{5wkoZU>6BzInUr;tkFL1j?f^kUTl=Gx2S;CJ zobK}`6oPeRkjqO%<;5>7RQtWX4c?JTy`uVnKI=C_&!X?th9Ewbc-JS@^nyi!{Vwkh zK5PQ$kz)`@Y0d`guI>ykWSwYlmCN&&SkhtGrsTYadiHhS6sd{bH^Z_LX?+|&Lx*9O zMeG=h99DhdqjP=rK#vzH;oG}(U98Lv3$n~FQ*B6pE(gzyMAC)oExcH72pz0(Y-N0| z4|?e5q_005q)(f;Vu4NaDp{k=_bA2oE)C4fKEN1dAomnc9PV+9W27y3P~8J?erA}D zzU_swOaJuiMSeV^m&Sk_c{Ih4zN|UpDNaDi;u77Ag+)V6`caR_bf~TQFPDc4@effv zXsAmmyWUmo?&A0j7Zx7d_qVr@tXZ=JiZ-L>>t7>;?>70T+$YP2Qs{G-W?wp@D zvQSiw^;RDk6(cURNrLpHO=zzP=g7?{I4jf6*eB)je=_Bu z*8&Fd%8_K~P~_uF*M!+k;N3x~Di+3igY+bozs26zz*;aEjnIXScFrwQ#Ib;tnHs}GZ zo}_S=c#q_DP5VQK{&a&EidCsAgiCybop zU+d*w&t~IE(94PcUv3V0sgs2w^Rd2Tco-R%zHx1KOhQ>>Yg*2Nr$3?xXeRIi@ss6Y z0w-Q%yvPK>07;JOxY=&>ieQRQv~1BzYT()k=0#K-A1lvHk#Kyua0tf=rmT@_hxueh zujKGTqGhF1z!6eTdkPWz01aHf)wdX(+bFU~VGD>Ya#*rc?VX)< zY>Up5pga}}Ed<@#5SnVIi~zxbV2L$>k*;95$)`1rO&#(6`3=f(;jRfJFf%DIcSUT6 zDd7UhMd)#v?NGJ>TjJG}u)boy=h83oFE0SK1OCqi(BA2VmKfEvda$(#EUFX#M7=HU za;=%bs_;7Q>PJUIh8r5W7-#o^iJvPhY@dpPhJ`-w=HBNy&z$1f1EiK!WDib}?1)FY zT4apRlb?yb9JhnB+uhX|ccjKBVgvlSi>tSx_E2-f5`WN z$>JpD%(Q8-{A4dPPVnkrx_%?$W8}vGUl{%cNWNH|zTB+`3F4r-MMH%BIfoM9dG}0W zwswc5?VW2b3|l;~l(kpwMym4Wk=Z?w0Wk<>w7&kbs7q9|%fU?R`}lWt#>ln3Un?CR z=6KVHQ>v}C7$<2xelxM=ttrIcs@r*gP*FuXmFo`5Yn*BDA|MdlmAK98rW1Y@HYvYG6qQ8Zzo~KS;412m69I~ z90~v)E0#^x5r6I%X1Adt_wm@G2ms~}56u%rDx__(kUEbZ+~2=NJ8HIkpw|BCYkR6; zw7O}yQ)#}>Q*%^S7=wA}XW-?Ck{n?e=k*h9W$k1D+h*O#8CTcZam&`%TN}E!NgUUU z;Pj-T!i1q}`PecKG-@ltzc&?kw7a-ssJJI=KiA-M~K zJxf_en)Bjq?`H|4HAlc?N8&GDH@%7MGa~=td9CfHJ?yWo;0a8@yaf>e`^_ri0qwP) zGCWkW9(Om_8Uhe-bkxt~664qfX`bKrWW}D2P9KC(@6HH;8~Y+}{~mYH{{LDcPn&7m z7zXc_YSmoSxTKv${E}}WHm*c1Temp zRGv$tyRpo=7-RKw#)#qS7uNa&>)W6rj|+i>opJbV!C2W(99sWwSxt6FmhNOywsW{K z1f6+}F1xm0u81PQ`ciV((~7k}lOoH}I9i|7F8Fe?o!yO;rm_=bd#f$LXLKt@DL^Fe* zl-CaCfpfTcMr=eloRR!(m_qyQ z3wtY*AjOxWMSlHXiqViH z>J8 zGyGNcPm3GUp++sahf{!IGVgBE(6uu1>q!f{m!_!olIy4aWK8yCow}AGm#iPA`Z)6$f8V6)@_aWsnl~>!J z<|ngPLRYX1j?EDl7n+z@0+0MiF9twWD;!}t3Grn#_e6%D(0dZPxMTbSSiXM0RJ`f2|ewva+BK+_3&qxEMr=uV#spSpC5}T+cT+<{Ns= z_cp}}oZ15(H59YKZpy1q|JPFKU(e0qFxlw{~4P@$+0)&)RTD znYVuu$B61(y?>M3wn$;($-O~>fad62!likSz%%ZyT!@$dhelI)#5GyH8+)Mmsg&Ly zN!$*`?0?o?MZieRVBOsMLsC@VQI3TLL}Y>3ZQ%q3zE4vgWK`Gk=srm#RqSxSxrvF` z-&mm$?_tffDYS;1=Bm^C%zv*st|sQIWossNH$Kr|_jL8HFky1krTIsh7LuxfH?q>x zzTw>S^C%D0k@H@3&Gc~N056ob4>#TTSH|~q96vp1n(eD`4lwv%xMNes^-ug&>2BT` zb#BZbH z!&J%d;6LcIoAQ9cBy)VKrSYaXkiVtqjFs!x2jf-5Z3p*JIoB08CyUz{&rEze9Zt7m zkCxC~7MNv+K<|SY-qFC8k?$P^4SrJ{+=HnptH)~^f03`DJlMtXOliAd6Hb`A*hmpe z<9tPO$8lKXLe+aU9^Iba?Pa!F+C6V*R?~R`Q7i%+!h4@*cYs$0G>&HZSV(YLq19Vc z?~y^f58^fc`zKj=k}q~l*~`B7hjk!|%p*oNY!UILyWSSsOTZFof9}$pwOBnO-2xsg zRGfAGadK^&{kFM2OhiRXry-qofCkp*&zNZj_;-3@&xikyvWnSKRe2odVLh;;E@CT!MB3+0iRelBof;?lntOhn z)j}xOTM4p$yS4DoHDaQ4Hx+Jx_ym4dfKttU?uRi3%KB7$YUEWyW7D*YA(-f|2gG3Gej*@2Q{n zeEEH7dsZ?>T&sq(jMV&=)kUc6t659nq4o9E324t(Qn_r|zh&Qa7r_43ipJ=i7ay20 zJfQ#41Y{TLZA?Ky=IRWF2G4|5m>CxJ1U0 z+a7Tc$EuIn;x{+};FTQ8dSR|MvZOA9_>>7a)1({6By=i;c=cRVD84b^N0rKqUal-)oZT9Y0}63o57RxUk-I}LKa=xML}?2PU3omVTEFu z?WVGoZ!Y>p5VD(~qTFD5ZGCrCT9hio8`)@JsVzOFKK>%sk`TX|h7c8Lsz6rARyNi2 z#!6t>DVCG_a#{7mQO_yr*T?>by9aztRJ=SQKDFT(i-EaolcOOw|HmhG!n2DDbbPt; zwT#b-NhUlk_>s>?nn(}N1jGrxbT3DHe{jX$%OKS>1%f97_X#!m>9iGW-J0YDxEsOC zJ=%uUbkYwb6J3~5K=_^scM75ywZt@p~0L0Hr5?f zl2`rwU5+A$IzgjCOjSP^|HF#5Vw%^W@5xhD=xPr9s;_?S;e~30mpbObSk;%mUkc;D zeIgBQ;7fXuXRP4K;8U00*ygn#FT;pzm)Kd{J`(z#8uTL*J8WR$TG^ejR73SP z4L$Y)x6^@9FmlSuT=tyKWJmcI{%FZSY#Z%RNL#G3xp6-fR>5@1zTx+h>4Dn?ydP$K ztc@W+ga?goUps82IMr@m4aS>HuVq1qR7&vH$`MRy7Ll4UCm6{|jGe#s1}gd}q>3 z)kKrK8MnO%F;&N;%t5eh4ycb zzfQdxX}Vv5h&_ zb$5-I&{ms3Io)X{N3!MRTv-X*BcnAbedmZP)!veZrkti<$nsAN{?{7R8r@eH!fayy zhN^qy|Jt9F0H;kb!_W9$2d#ps8ndoLua&_g4kDiS%;KeAi`Im1eKDaO&v{Pd9GeQm?eTo8Z=z$`n zDa9)eOYpY$EjS;Hwh}50S#`cID+rrzV2T$6ToFoNoMj{Z(!k}O8T9R(B$Da{X=+U0 zzb5}AL3snXEk}GlsQ2E9XS#Dee|-t{e_p|kE>-*A68LSUe67L9eC6TpWn^bCKY*JA zJEXdr&|}y;Q2%VM?N~B#nW0h)Yj_{sG#0vKTu$Baz{Jp+as7VQ-v?C2HNzF51D&(r z9gnC(P`kHx@J_zE36HsN*K*n==1Ft4zWuET9t?pqownP7`!+8?HwYOCV0&h*PW?K| zv>@-y?KW=tntD3+w(72l2x_UT;R01Z@;q4RNWfjat+F-v`ME7)wu1AsW}thP{M{d)u(?j7*!T)`eqx zW9J}$SOvHrIqa@vR$SZt39ex4fp8QdUESWi%-cSbR=#qtU&GoPv%RN4=2tCFdfME{ z^Z{Y*v&&8G8@say4Wi^*nEpjL$Z~?^D}Ak}XX;&SBOBo<>UQT#?DO`vAFsT3FzwD0 zR?4uHm-%2b)0v9)USFH$FUTMEcBdVlnIReGEK8`swrxzWhgB`{(XG_i=iP{5 z3CsESvkIdjb3>1^z*rGRczqYFz{{G47W{us8oNG(uMKWAmEJ!`_a`RwZ}!c!PDJ+2 z9}bIFu>D-9GL#D2HGU_;*k#t))`yv{w;j%(M!qi96YsS@xhKc0^}jy-dab@)Fx~qu z#>Vn`x%~c7g)^a|AH*B5X5V_M$alNGC8T7325hj~%3{TnJ0k3DobdM5CFUQ{H+0wi zS%)NL)@M<)TX>pxnbs0crTzH9?U&``yQbI??@^%0EPGJyV>7F0er)T5MEf~$Fw3&G zPS-2V=4yxFSWrd+?do%>6^K`NCNcT3&z#1){fG0du-#n8Mf!lz#W|PvD2mUv1OGtA zcHe6YKARQBbmk+QFkp(n>`?u3?>+x;byo;^Mh!6D{}Gk#Xq^8=_X}w)xSvVS0lXvj7)RW5 z3EA0k(ET}_#R8Tl*TPl8dBv?!f27RO%eI!?TJopvdXCnX4os8$bJSATwb6BAD?$tb zlGap)R41{*c$CMpm)D~eZx^MV8+$|(#Jy_iMcj%5;NF3ED9N7Wo*)a)K zNmde;8bkHEmL)bcQd0NSOH*E5j4kSBxx~{}HppJ@&1~Qkswm^K$rFaUsYAGx3VGkb zCb7tVfa8|9dtrf$iPHYaoOOHHY)4`5#lI)WW3o z#|X9yFsl1FB1&gKRG{J)ZOO}KVg4G&Hv-hxaBT*e0i@b`?R(Wgw9jwP?>SubAD}FQ zOBNs2$nN@~r;`P&-w=yHt4d^eQ-zSBY(9ABKV46EE$azwRvOQQpr`HMP@HegD_^Ff zBMv@IR^B^J6AgQ-^a2niWBJ}d6C9Tk-1nZ#9v`Ne@Qe*|ZyCN3NQ<`ZF@^WC^HNav zDL6BEKMwF;_DUG>n?O*Qm=r1y_a ztW3ELJOuA=VhUb@@mPTCNo(Qv7anN!qjxA_6?*tc%gz%ikgF=)Wcoo%rle}>qn6=*kpVR$E~s( zJ(aJ$2!Yw5A*OSKU`GXKYgyd6!y~@_rZ<@?Iwo4CKV2ZR>sr`~wqAL|t1^1m33KZU z9PZ`bCiCrublSxhErTuy6p!LCr#B1*UQ(bMEB!te$!EgkO|9tZsN z$Ct^b(Heq3?*wNX+zF)^byepOpX^SwKV3B!q9A60K;n+*PWqIQ7;voxr@zLuw+p=N#Kabukw1fO`zB6T=UZCr3l0}Hc(fF%XNgHLlgg$4D@kT)s1xwke|5UbVseeUOw4$11GyA%r0vQZ5vin4EqYYxA85MtZV60=X(y{q7x1Vp5sN2Jid`z!MrO?7uN}ovp#`|x zg4H;PUL{(LIcJXOBfE>d6r+3{M(c;my&M-_v-rcV2Qm@0V#-lYv7tA*n0-v`U+(WP z4X9{+L_H7Oh5?I1PbUgk6gct@ZKr(C(2QEtWnJ8Cu}{_@=He_c%&Xv1uF(~v;|gzj zQb(&8^g`l+<`hHd50ILWELH3nn6Qh1Wug52%zuQj?MrC;B;0E0n;*R;x?3VwI{wfy zBDfWBS_CgG@k)g1dHe=*;v~x**}C=G>F!Q5MK&|*TtFz(%aR+xX0z8cD3XH>i<`Go zhK7qfiDPUu%o{#SwWH4y97Fc7Wjlu;WT+UVTWz_$&(nkOPqs!H{My-Sw6sAFE)A&# zRIEwyXPh8>l9!RSZ8|dk*1L-EMY_M|f-Va}Nr_*HUV4H=!9>pkEYm|9;WrzZYo*p^ z-1#nu@}4p2W_QL#`xxdgV$E)vYWC1-@Wk?UTs}^cV%2%f&YxfVZf+R&O`$i^GyR91K`9v`w{bK~UWx@-31x&hLz#CXMkhjBSJu61lGZzjwD6gt{|J+v2XCX>Nh00EZwbkNd7 zlgKRw@S>a?LE$OxSr>a%aeA;_TOWkQlyaiKbHR#}IA^DNUfEmo|xtZ>W83WLW0<4s>*-aaO#wvgONHQ%#e#oGPqU*pv{*PB0tju|98$ z*U|xpv_L$%2Fg|3=l# zWvuz&=HZdEJcpeUdZ3WeObBV(PIAD;9Pbi1UDZGJ>ds6dJ^SD|BRi@;q(O&}^*F5d zm=n3}2Q}qZOgV=qsd_1ybTx1(9uir5;AM)8nOmdwp!44CL+4Ox8n<<5tJ^ObS%QS} zMu4dgRB%ZVw+`832$F?yrgDCzbaBvLge5c3=g56RhzYwaXBK$BR z--+qt%$q6i2R;Q5hRJI{?r9T^_YIHJT{D$rFuKq+-;>Q^Ikjcsq?}i;_RFErSv{m9 zrqZ}qoN>lPXNxPQ`ODm^kx=WtO-dO^4NwYcqz!L2|80F=NLBj)Rk`Y$=?9=MIB_kR+yO*1r@FOC}F zmY0g>3h?cG_Nq5g$Q(zy_LH!oqS*4xKr&3%EQEQ6dyJ`>x}ZL27Q^Ot$7e zCp~oo!`)&Tq}CR6zUh5W%?51B>Wtu-Xd&Oeij}CGjASEC8oK_=3$P!YIh@FaE~(WW zic9%c>AahlYpzd5+Dnl^A}k%}=XnCQ!aG?q<3-Z< zacCz~pF<@#Rd2*4^W3j*m@|ap^fGu8{dlluzQUT^I)$*d8bcp8m~jIU2iv}hpuRCV zE-%&E-*X|%60Vz3#je>OXi8dwo{7V%$zJG;5qq@G?QkKRtr^lRF@!Wh++<|Tp%jeu zvtE*a6licLn^%=MccL3lqf)~Wde5QN=cb2j{%p#BeRhA6Ue|_C{h)}1>nay5BwA>z z0?&jQud9(DGj(KLQMy@pSwPhTzexbDH@r#c#yIf`?5sKUBs!9SQL zC~8L-c6uC4GCqEU4-NI*7u4!d)LMSTJZh@X2xC+43E+SZx`Rxx;tYNp$*lL|SXZkv zQm9|@0y(`Pq9OVtE-?XA3kPfQ{CpX9M1`c)iM5gWqx68B>6NZIQ57DdMSV=#$9p9d?_)5&*E_AUsIj?+nXD&c*-z{?xdivGP zs{7v2%`Eu&wM*^>+9Jyjk#OanKxlDMir>@fkX_9AIU)1(;W+RxeYLAugpXHFXYF!L zUz;iQ-9LLi&r`Lpo;ST^+-b%2r^px$oU1la_XlkMl0?URA6p%fAKNq;c8I=Z-dNR_ zgh`kJG(7fB9e8dWDLs$0XTCjJ$<>dwNt59Q3rFM;J&x2qfTmk5w%o0%iQx~X zWl+>fifIckszI;R+*VMBY58S1XKW;}nz7iYEOg^7GSTxtk2*7|Fe90e;DaEE@I&&( zc=-|vLLJRWZQTVs*LKMdYT@R!pvMQ&Rgoc#6pVO^wDz*Kqz-U;z6r|>esFf0y1)IJ zsL=VrN(H)qhH9u0xYbyFGaYHAJ#YxK0(tv6`O6XkU%>*Pk!`w&4}0uIvBBW&Yd1EuNg%e}H2c8U;807foE(!WBbjL%SiE@9m(~t7;DRY%Jua?4 z3?N-zrH?tOjcV^4YR2YL$WJL=u_n1>5i2B52HY~BJ`gT0=<&(fqi3XrXnxaid;c)P zSDdL&QC#?jE(?ZV$-??$8(qVEs$6Z*cmCWXjOCeW4Z_!P+SaY~w$W2Y@v$4vq9IrE zYlobvZjIfJU?)MC~^VeI2E7D8A?7a?)5)9~kh zvM}C$k~#P{pV^6RwqA`mrLa|hz&Fv*EO)~8yuWZ?a-#nD(Y*K8>HVTBT~%M*=3^!) zg7#9lsTvli$UuiB^sFT8eX)_rCFq(!0f1#SN2Lq1FdMW4>XQAKU+nE8<9M-kCe(+JJwtUOe9)7P#QIJ;hRyPfJ^)!aR zA~L{YSODCz*Y1i->k3adw>_P=A(yJF{Da*E6Em(NYA)hW$M@#GCSrq2Ku%peC#pxx zzx*LF-rCM0KD!ExtcChIAv4fI?zQ%frsFl4;PGQ*-T#QJlT&im97_6Vj~^Y@oEwhA z=k1Sc*k2X|PXx^_l(t0M1x$2;=_Kq$7$-`c@sFgsDsohGZG7{iQQCC)(b z*2b=kOku-8*#b&gpA9*fy~-&MR90W1f7%bSRi(2zMULT|4p?39=Np#wf)bd7-F6oOmt_*dHO;tOP8+D(y6nRWX+!n!3W)Y)Kx|s`gi6t{TS2%?#$me8Tv+YMo zAbqs{=1lnQEYZP&8bOk;wjNsS`3*a9hB2|e{oZwMxyb-Y4A0jp>E@=}FRJQ3oz?GD zDK(PH;7`9#{Ib(FP+I;vt$Gz}Q6|tgbMHcEGQ~9>UTklzk`CIZYg!U(h44`I=Sy3t z`<{T)?TAlp_M@wbJ;FYCbn<1Kfe^&}ov)elgpN_j*GII6Zp5{0MDq|Kgz7sa%uazr zP3(M4eQ)G5--wOFxcUL%Yy+xeNxQ)8$1yF!N9Xrs(^j_3A~ZQp9imgUmydsi1*Eh~)2jUL5SaCC2j?7z z>e8*%Qlx4jP)m-a6IY!{3dH2c$J$l8Vo>&pdAfMwsK{pTlP_ac6;)xKneJ&Cs-;&%tA@%w{?O-PI~ZK;9k7Mw^XM5#w3$<^wZwuM#aK+8xZ?p@=}`yE(L z{3$io7R8z;yBqx=;H|2gyJrrB1C-cjocHwDlrN8byG&VIkNWUdim+0#k1j?z(l{;T z0TD?9etc*FM52YiQ_%n%Gw@=z6zYeZ$A7~JRKB~4-g;&t{}Xot8h3FC*T`N^>Cx=I zUg-(^;@-MPY&p)7P8*38l00My$#Q-=$taw0zi*)m;c|k)mI=*r>qQKE6DL0lpzxKK$+QS8Ew6^F%8|o766r$~;^upmh(n8o@c5Y%1f5LNp#Ja6kaRaggr*U`1o&S) z3#%L`q66i2Hum!`&>?oF+L!SQm<)z23B|Op2E{q-g4+S}L^)rqTk_BtQ>-K5R#uz7 zV|~nJvDjYaL)oHrj(&Q+gdYR1IEXJa(5;>C#V*Lw2cnNF|barauBs6SDJ*&MO;xP1}bw%Z4K~Z4|KcU*eby7S8t|zSt z$9P-AA2yie39v@l7Y5zdX)8`~2L@mAQcShr8+O`A9xgRmxr4jL_1QR$UJ+>n+cjMT zPvlTfyA(-2>&pLp%XP@?q;s&Dpife30wah#{du4bbKivvdy6Qsrv{D;-dW6!HDi;b zwRUkh6t0|F5{V2sh*3h0LzY5x`e#nL0linu3;-v7lF|e(1TSB2KMf{=QwL`@R2vak z*)O7>+x>vqGJcw0(Ssgcl+ z{6wZeBy*%L0S*te%r6f~vWUptd&wuIc?OZu;l%k@=}6Y|rpGrKcV**>f0BvBO;&~a z0eB*hJ>WsR+CRtRaTs9;%__wCfx+6LuBR!*jTl=MwGNK8QLhuRAhL9urtb@Tr!I1t z@xUbF{dp!cvmp}mk{`ve|Eql7$mS2`mwu!0`f*L-(xg*qvcqwVGNy{08cv_BmkhJT zW~~Jd@+91^&yZd#uI=tqiV=68ZIi}4RWgd5;Ogf!XE;)LjyQB)3k6I3bM)l5kTsds zGb8rMh$C{33_K5xUiRMzV*@@>W9L<}Okz##Q33012uqzxsY`GN`~ss-I&s&lCljl& zMjOu`90+3JzOO9^h_X>`N&Le1XKqp_WuEgXR-Y|L@g%P7{isCemO9>)(q3=$InxPb zW$&|oU>|t(lfbk`FsS_+vrG3W^EHQ!g{H1%J*|Z$$zNnmc~=}6 z_6BlAYf9pa@8FtTO;sNx=TfZum$iIP-;$@77YT0XR3g7iM2?F^wIyULF+Gz+rEwB*#z`DapMbi&EtXrUdpd;$A3OZsiqXe`4z4MN z8kBt*uO}IuAEz5J&T;RAHQuhZcwKQ4YQh=D#NwVKTdZ!AWI2X6sDJl$mPQy4c|NKz z8(`rPe+J9WfO`GYa`U~H436CBMkC^kNOqIyw=?ly7k?Hf)C4!ebvGCymm+A|37?o)|0SulG3XEoyQ{{Zwa3xl=o^7-}13cDRG|J3A_O$4>lRio+EpQ+#EMNmGwR z46o1pkpj}XK#@C_V$HmG{}V>p(4s-o&DWYfklcvSe`RSr;b4dP5>s%5+7%?d7pvzOlY4B~bh$4k{4<3#tA$jKibbR_op(K(Y?U{-B z2%WsJ%9KBotC{@FT{;$Q-XLmsqL6?^Z+I?jZ|l(9)tQp!cdkQ0(c%%nL3mt5d>X9# zz%RxzD}QxlHjH;Q=w->2Et)>&e~a?L7E~}<)#mq*8?C?gD9Tg!os`CT(53zN(r@I| zG};^evk5-GwT0KSG#E|oPuYB5azguI%z}i>`rR<`FwM)3QHmqXY?9BG*WtZmKh+ky zE47;wneQ}95*3eHl6^g*GK{*B;G+7-!c(QtZXh}f4i!1;WAuHVgHow!L|t5*6?xtP z_;5YEvLI@02~Np1K{U0Gp`m}~%2*)s_v}KjD^wTvb|HyVIRnqNHK7Cq^nzuCG(giD z3lZk~4ujmQ*EtqDr``NWC=(g7LppqFcQ2m!UR_yfGWS)@)+;As+qFq=-~$bExkyJA zo!0pxiw0Lrf4R9@Q=Puw`{3ht0=vBh`CK>~iz|t)n{p2)=l8ZGt!KbWPbXY)D<7+cS~Bv`nA3PPL4ov>pEK0ma%G3sU)n_C%G|<{ zx2Eqmz=*1V!JxW5xu*Qkb=MGCGlWc60q?Rf_&hFgGo3xtyNNAEp0&_0dRI+u=#@N% ztrhE4W{Cc%R%XqLi^17ov+)B8Isn)C>(`TRcki3NbbGv&#?bo{J}W`I1K5>`b) z&E-Xd!TC(CY@BjBmW;49TsKjPGn|PPs(fw#Y`*Jd83lc+{(;l#*D8T1vHpVhT3|w- zr(-qx)9Mqs68kc=%NV1U5I8~6;_Ud<@9`P~m|y%j{IobDpwhkDk`Qfp$fJw5To)ZG z7c(?+T;$hA;a_H2O5-*wviU#gddKL>mattk=p-GdlaAFv$F|e4)v;~c>e#kz+qP}n zw(d&rz0W!K-0%KbV~vcJnzP<|{XA9mkfwC78+GTh+jiT6)JZ}RlW$macU<0>H#TSZqgZq2 zAVVg`oB@ogvGG2Kn5+j|IXCj;`9I5oghj0-QTsEmI>4rht_t`k<&BSCnx~EPo4-?#Hbo!=Ct&1mdL#3Gk@xr=ddN1~$gM|URFRJ6tfVs~lBZgM zr!HQ+{|hzpi+FAU&s@DrcXQlRgn>?5D0L6u3H+YjTf(qY>us(Ot>d#rvcN{%w*J~Z z{=IBfku zyo22w89%?3BHqcvy11kyn*yj;_`Nox-^2w$krwHZPs-7=xZ2G?34+d7Bd6enN=mAb zR#p+T@Az#hv)^w{m?bz`IZkTc&dcX2--}cb6Obe4Ctz_hWo}+YnQ+jwP%*J%TTre~ zd%_1{K?2B>+WN!Hub`?entBue!thB(&$lx;6?6O^j?D@)A`b(K!E(<~c;)VAJlzDc zgJZUW{SeRXoOEmH5lCLI;bhsUvD4mQ_U`zI1LbQ6n3L*%5Gm>hb5+D zF^wBDQv$w;znstLZ8+;QoorMmd#+6JZCu71i*seu?M;RIQva$AenNpJXaF~EqT7N& zjEnUXYup;_WFHGa+wNBdw@x+rn>C04-k%HpJEpPb!cms3;H_2UWRT>Bjy%D>6By0r z=*Uwk{;S%xxk{f{LABHKN}C;wlZ>O_Cj^`!Yo3W~EBl_0yYjZ=v&vc2cwe+iLloZg zvi2pPm39E6;LogOMJKi{fs_Rz!uD}Y;@C_{O#oZ)2-;P426H zsyE#}-!!Gv_{@{4>z)dgTGEdJw~Rg*)L5xVH53L>vz@%L=ElX#HWq`x{t)eREActS z&DD+bO!h_4L^Jr^L7%V*F#305O1gF1(r+i~NfhlH9S})QU{@K;SPc#^PH%PB(O0b_P~#3 zq6kI2-bmU0g2*-&{lcC=Y1u(dcl0WLo?MqFS~7^%=&0U8v5nlnxgnvu9|GS_V+N=Y zta$U%uZlK?v`gE~L~jwK7bWmt4>Gbdy!m6kAVxy&Uvy#;Y1yaGtU^tC#VIizo~lw+ zi;yqIF$5(mb#Q;7&^0!MhN(VSKiZKKr!d%gE%M{2r3(e~40M!)R-f5Fb|WxvQ5j5( z^gGMuYH#Gr$M)-OKF$i91!${C9-&!C=z2I{%rAz+GR((;uBT=}m}q zBfvHnB*t0(l!@FfIE8PyOi%95E~rLd`UmrMOvX3&JuX_TO-l9wP7dlxP3+1J_)Vi; z$qY=EL5`n#nwvN7S5X9pjZ~kctha%QE-MTmhzzS>O1+buy*@*TJ|2}o!BbDLF~e0) z9~TrirWU__(mMd~b(hbEjn?rN7__=g>%Un9UN0jdURWv?eE_vVqUIfVG?7|W;AgAh z3hal7CP45kYlwh@nLb9e*Me^9PpHL@(;p+b6&JoS5z|+7&|NntVDwt`oH6Nu+n|~c_VrK0SMHbn_#pDTOvj%$V~nh!fKCBfUWfhuM(Q8h zS}=&4Gt*e&n-DxqLp4HFL{PMHSiHM`v0pdqB@MHZ~n$wm-H>SX15XKPM^l$N`(L>r!=W3Y^E zz>5opj|@07Wj57@=E0N+rYbYEF25?#nq&@EU~!=)-FgR>iHlq6EyXjN!UkOg$(eL7@cco6CByBtg3g$7#>AE;G&1Ya ze}JEWiVbFbOVX!tFrQ>u=ReT|@fFe0yGS|4Hz;j7@kkm&O%bQ?Nb`AT#=7K5_ z-Od|`$LRLT@LM*s*#LrFQc|aP0D_urORN?+MBwbkH$PMo-(B#4&=AJ|Y9Bc5OPs11 zVe5YXo)}&a2A`D_EN(Ax6xaSKqBSA+HN#R+Tf>wg^YmwbZpHp}RnpFjB=16L#We}X z{HN|!Os<36I$4gyuOHW$WvXN?Z5bFF>-AF-C%>K}(X>?mw~Rl(9cI{FQ23(R5cEqC zFg_7UzQC!ub))`*ubkM4u$#lu?T$tWz$nS=B_pXKGigP?L8FhaN;9=rWqnOgnEVwT z(a%tANY?lppSkix<4|nE%mG>}F6hZZAa1E!cVVzJ$4C7BCMhwBPU%CTUkF3OUQO zkcvw(ufzRv*Rv7VJCepM$ywf~P@F{(DbOP3WF1N3Zm*zxPl{Ie_y$(%k|Na2*7XTa zETByW`JQkwX(V6p<~=le{|8&htw7i={)Wx|I;}94Kv<_`bI(%l*? z=B{+u85H^;@TNY5AC%#(+$Yf+y12OkGU@OP2f+v|*6&$&Wn)rv7bBNO2GIwEQ;+^3 zi4}TU%ZlF2cs_b%e@rNoLLoKC?vsS2e2UHQjEd7r1E%rU7#>7>WLy2st(AAjM7lG9 z%rU%^bv)kkg8~u^?^Nep?jQlYQWY*?_xM(0P^lO|V%Es8WrgO|=K64DKWX2WYS|FrpF&vcd?ShUjUZ>qgdlLSi$h_=3mVzoh-+kCSZH(ROZ0${g9xaE|L zwc_a$V+(3=e}OLFMgt?RVQ2zK%~@kNOL;hvw2u$7o8Q;7F0W^NC|Un5TwsasXDXB} z^?xLEVSqDG3Fceql-)Yi`!kULuCQW1DK2scW$v>Q$oLUk`5Pa0F)@*!;jyq zQ43(~(R>EQpLaU2K1(UU|MFW(J{7rDMGg}fOy68vdB`z%5tEe8xT>lKh9KnbKlqt(O$Iwx z!vZK0#lohzd~y)CPAWm+=5R{T(;{LIxZqx>wW$WN^Wynh&mH_ zp0o8vbF4^Bj1dMnOOsYgv^ST8X8wz~cE25R453>eax}{a>GgS2p<~N`t4YoBSquGr zP&t(hZDDb6a4;L2UulKwRqXtZWsNST5oUA3wY>m<#6|Maj-@CE69lagNiXl6??T38 zp1K9wYG;sR)uXk%k%a~L4=O5) zK!U%;yF4*e<6^N&pP&H`(^edEA__J8Mw@L)MsPQ*6OlocQy#XiDv+b|Hvs|K?;Oeg zO=6e|)40mwt2g9DZSLq`MN#AS_ENYjuuUXn>j6)yU>vRiz-L-N1^NW!&=Mkz<$nlj z=R%3j3Y?jxVcXS+%C>zb}lM4`PDY!ZI93_JHKHoW4k)O>I^qp{D*Ft zclcG@3>cNMeZ+F3W2J9vg)Y&QIg6hhji?~T0D5O><*S#AA=8LQs*kRgPtCug2gn~L z@Uy7?XCcU*g;bSWS`m!|*cm}qM$N7bSERwS&a42$x+*w|G|Ui*P7|~Itw`|s5p*GW zVk;7U+a73+s)7?NdzBIW+W+i}_v=&xdE#vtz_%N*PPyzc{WH98BREMfzt8$isRMR) zOTKL!;6w+`)857Xf@&+!cNxe;aDpA^NiN~D+b*{a#Q3o@Mz@krn z43cdkK5<=jzd_qB$F!c}vx59*crI!=@r8&Vvx|ZA=8~1PokJ&|u(@`iOb|T=O{fIE zZhG3~eOM!JLc4w2+3SY?7kYwl53dee@Mk%Kc4;hwn?1QF02gEc9rA5V=#ftKA9CBL z=o`^|Qf{%iz)R>;NY-2b+DKl;{gvvSC@miq5HEo<41cQ$s! zZkyx0X3?my1Xk3CW}oq#i`r`)>vJ;F#*7XH6p@r2MGKpA0%)e+xjt-L1K74n2>crn z+8y5x&Domah6#!3w=ox6hxmShzBS@H8iTFVlCltMynCpeTkCMjb@`XweF;B_db^$7 zgyi2pxrnWNUeZ~OM*fS}e!fWW4~*9Hw2GD(^rVf=`jhaRsTIphg&yr~GZYZZv#rO$ zl_tY?W|}aJ+OmHISpF08Xm_tqx;-!TZiUatoXmR1oCW23B<lM2YFYrA@co_m!x8IK?-?F z91Ajte$br-`$o%7ieX;F0w=azp}+YI09YdLgazetCW8DjEs+e#&+-Ic6Av*>aKIP7 zJOm<}Sn)Bs*7$EFfMHVXUJ}OD9LTF;9)}(GZByRi=2A8~AB-QY-3Dl!Etnocxh3B| zo`YIg(+T7&uI|5~UnmBiuV1w?>aB3u?u$o6Or)~TT+NIhMiEpD)~BST00)MIwBVn? z<6v)$(-pU>vlqx&iV)Dx4evQXkphhFh8Qb6*6w_*#j*25JdF+6>z>{ajmZqH$6tV! z!ep_j1K1xH)8YLgi9R*!#_%ETWfX;1ji)(a8(CmBt+{coG)YP(5~Il(ztxtLyrDO$ zg$&|FE6k7bUl$AFl`qA8cBLY*>sVmQm}ckcmIuR|ckz`d*Tbi`&~Z`WdBbhiJ(3D2 z+*<4A1}lXwqr%;u%zTUnkJB$g!+MI)5wJm^{HF`3e8s}{(YnvB2kgkLTk3R3+h1jD zlnYLK5{swFdBV4d4F63ld03*N@n1AU?b;)D-zlK8r+c*@xwnAaKobnl==HVEVYS~? zcMAwdT2<^WdGWF?(tG2BawI;}Utu4hX8(fc`*?adIp4GEK)s?tLF6Qci@KVPEZ9#R zy-U{xJTOn|(CaWe|DDLqK&&Xv57oZPNyr zWk175S@?0sU5#{XO1v+!o(gwJAXV-hicG0~R03H7%-<)JgKha(n3z(sv|9|&pzTQh zv!4Pm3AN_YTuT_D8?a7nmZNWMj%^S4u6zT= zP}l`|?$n;J>g2l58WW|+9o^3^IMnByoU>hkojUqwY-MXL{_mqkvmGY_DJ*g;sDGU{ zDy69RzREmx8TKRFF@sKaxtj3bzXLwXxf0TD!@|O{emYf)Sr!o8z}CKG(2`69;JL0!JP zGh<*tsp?mEo#8yi$pX28dGPkf?M~n0y4p~B83~}218-O?CR)>D;4YM*EL#Viw4gCW z_f@0PGjDQSnuG0-tQ7D0u=4QR9_|Ej_FNzZx-{!X#O4|(<0<&+JSXWo3hirn|0FsTf5=wqL> z!9n3j^kBgn-NlxY^0au8HqGRzDE*CUqV#Jq0_9y&BLb@|g`rj2EhZmT|0QSEKh+GT z8{%YL$g8THqw1+Yab?W z`%FFphYN5I;vS@O60t@#t9^y&*7uGUxO65=1+dJpTA|i*JU!w*g5OUv>xg|DZ6q7M zJXvjg*eE$}x1K#i$21dj?M}?u`;HBXx2nXnoAa#p3C#8y{=SsJB>Vp-Eng^AR7G!} zDWtMWRnvG7ns6j`{}cKTnjPo=XSOd?{L&H&=DckEjHE{~@I^e`F%q3J8RXx<7dYW> z(#5q#H!Jh6$@(@9f7*)EBU%p+j3e~$w#>56CR*z7CN>Gb2Vt!@F!Us4_ zvUP(>U`UvEevf*y9}b1f%KfQadRE_eF?O)@Drs}`zsYQ)gy9* z+QI%#m7{eITd)iP*A{i(gv{~N7qsy(`fDe>F1voR$?J2|*Zrr3%QRo70q!dw&&B{u zA)vF2%7eXvC-*U8pAWsS*08MZ&kSQ@W2kkKYHDg3HvthT-R?u?r-e)2C!_8x#Ezn` z>0*zP#P-ilf@&&@iV7|M4XC^e{m(N!dd=x&;Q!0wS41fE;R!#hwvr2Y?HYgtR?m_TF%2Pk3)O4H$iw&C@w5+ zhrHy)Sl7q zV>HJjBT8=%HH%wMo>*y>Uaw#avTtTMEASE9BO#t$@YU;kLx_oY4-GqS_Bh<09}K+` zT4sRWS0AdXn%b%Wu^WWRCv0*K}OY3G~=?s)G>(0TM_omv{Crq0&|^UOj#@PlcF zQPF|j91q?z1FRi(YSYeW1ffG|0ybiQWb}2MG&bg3g>mW3sux4zP}E5q@vKF=Kn^##C`Z%!4^3tRN4fa3g~k zGP|($<)tKn@=algWc%M)>|c*pZ1W_dDY?CJwefnla+4J2oXXvZu@J&y2in)4W=BWZNgr z>EeXSD==W2Qf0FTTANa@>$cjiXi0yJ6>_#XUP|<*Z*_*~$pJl8>cDtQ@tokBpz?ZN zczpA0_kS4v&I*Oc7K#R#s9s??XXg>*kfJl7k@x?l8>v+CJ74003`iIz!0uR@^&8RW zOltmaoLT)}Oea^a6~Bjg*<&%Ct%otWHaXrsY_Qyj3u~EwD}aC10mhq0_!(rG$HC&+ z(!lKoljCxd@Yqz1f#DI2>+KuedAs+P%r93YArP(XI0OAJR$z!7pmf19)=-xpHI9JM z=AL#2H0fXz(F0U7GvRj4yn>-jyejbp6O7vkp;{0l-6CiuKULjQf+($e!cM*2v_g)(A+mPlcEPhQYy z<%C+;GXl0(tm7#|bDe`Cyu<9ZW}`twd2Y<%j-i9mMrk>(>G=%EoET?nW29uj#gzP> zKkegw9*V_1hRtiKrj68_yVS~5J-V)Jqoj|dd{BdJ_(eIb)3Hnc7dZY3{?WOn(Si~^ zyxOq`=_Rx$P#A0` z+Ti1h58eg&?Y<2hE=!QY1Hy7VRE;QvC3s-f{8`=zY9_Cw$hFz?yl)={O5kb<3{XTQ0~YbCL!Q(nu{xF;gkAMg^mW z`HrkBAMLRPs2#)4W~%2NI!rw39tNaWEn)!`cu5N=+yi1F&R&RTpf}D=Mx4eM)P_Ub zKU?qTQSRdwfai8CUJ|?UWD~hYQGgmCWyH0ZQvg?im-g2FFE{kpuUj;p#2mTu$bxOW zJ0fiu-1a$dB7n2-Jw?%BByZ{sV>Dx+KM?Cu9b7t^c)VPjo3$*X)xB%BHW|Z7QHXBxK#p92v^=NTVt#VYhdF}| z(_(u=#_dQW1^$j_0cpX{b;Gs=d&iL0(k(zqQB^CKeJa!2d^0b z&GAa?SV@w3n=wZIjxBBl3pnkJ$9zN9Zax0v6xDbpv^!?dPy?@;IOV^N6mOu0AzR!? z`;H+^(u$N!cCCGnXDv#c+|6eJW#R1Z{}{@)v6A+9#A35h%{=MG7Qqnby*(pP037!56&-<4_?OMqr<>cOnE)<# zibLJ0gY6FB=i4LOqlc%P)PlPWi>H)-iknV5e7`wM;v7q$ylnS9IwYbRq^%Ck{_hf& zw~_$0Y`jDBc&+MjWgP2JT`Mupdpp70dp7v574c8}J+#lCUTb}@pnG=dbOiTIL-jR3 zK^Kj2w%2!{zWW>mVPS>wi#uhNt##KuhL~sK2^q~SgSslgzj6B?uLDGrCTh6GzA{yE z4ya18?(ZA|K8LsNQFotQ;N{br75C8hG{-LFuJ#TieKs}C9VmX>&KvN^w*R*<{`)e$ zQm1w(nColZSM6CG_bo#V?$JH%{uc4Hin7ra1=WypK5kPib<|*=lMhT;n}cwlI2w94 zf^}X{`mwC0YHbet|FT7|VYB(Nb@6s{l884dDDJqR)pQC+x-{4i@vPM^kK>zh_j#G0 z^^5gPP2;mbN?{4b&M5rCy>4OL^!Pus3)IAsJ$H$JrA$J!wS3?YJfV1jex@GY-3;Su zFuiH=9497BZHgi<(&?Li2z;*&aYbFI!Clgv{AhaH)eOk*mD(j{h4(wms&O`RF$Ha! zgM+!U&gL*=Zkd@LVmCkbP!0?4tLPZ->4~#C?{}2{EA0)&{iA=IMf?xqdCF!R$$(9{ zd$X#G+nc*V8;wK!VK=)9BsfYLPgG*>bBO*`(mEy0uw$3fb`KC+#%n&{qb~JjmO5L+@v;{$+a;o!bJI@K7> zquHIukG-kAN$I>C4Te~_PNP?I4LFt%6jgw0#iaF&tUx`9Yx;Bzdq++Y1bUjG<(RP@ zW;cb8PCV4ODSj*33tPOk<#Dv6fsEmhcC41yUrOpV8zpX94R!H?fX0C{Eb34{SmA0t zizVlNZ_6zWY=noetk1;oQTDEgh;JP5N!s@~Qpl>RjYP)9CAv~V?z7)y-vhS6u{+A1 zVxx_22~-j?J+ZML+n}XegRqCvx~xT-%-c>E_7)BH z9n>@l)l50w?_qwWoJ{`m?`Ib5%1)IAbME})V`!2I(T_50G8K$b7`TE~1>X7K(GT(4 z4<}k~VSByqGJY4iK@@F0U<1v+w-ql4U2+ImBV4VNS0D6%OP~PzwXcB@8R5|Gnnu;1 zSZT`vdwWphaEPAEkRG|%lD2`^i*4uvRqCK05{PLR>SD|-6Mi}O4Rk2V#a!M~MKe0u zULJKdW|R;)?|24kxQEJ6hj&6}-jc{vVE35*CduI3@=oAH!)!6B@t%d}(&uSHy}Bu= z5zq|?Yl5U=FSjS`=m_u$4==1}!srZJ3|}|g*&185GHoqqdNkScK3`J8S8vJqYbD&& zi2uP0t4iRUKkG1fFQ9pIOgu)G#*oZYoUer?mnG+!_hvV}0xZ#Fv+<|y!Dyly-off0 zQYN;C(os=KpHAf!6ptTI%sgZ7lv`h#(=(k_u9++e4qVy$DV0WJd5A>YSG(h9)kI+> zl!`5O#*?6vYyzsC(>|6ZpRa6^OIOk89O&pT9{A>#Bov^f4%-+-KgIA& z?v;X`40|vi$~4>75@o9z63|O!%5kvKJC~JJ=BkBgK*lH$UQQjqZqwhzM0Rp^tvRfc z-Z!D5G-ZkB8|}{_%qRuLgy1Dw>oJT`qd~zj=-LPQeK(hCBDcwILkKAahOo+ITgf-J z;y~s`(*J=&a5n%RYQSzM+Y=OF)dfzI>mIDQ{NwtA?oUWlUX!s?g-qmQzu&K15HjeX zH!(QV5R=X>zr#W?^IAo>T@pw^#t;xyu1l5hjpbG{N$r4(L7;jHta+@+?4Z$F{7~KQ zpvvafvg%UmK&6erY<;%-cu@r zrjB}ZlmcGwvS~z2SFzQzHsxD6>>}v!C>O*(jA>Z?^nQdMXTzlf@>)4MPd8r@ll!ikB>K0aHM+^#1t+^|hG;iP_T<*trLE5pn+yh7~+C0Tp?a zylY7!`&gBJxx>mj)#1wil!Tp^O)~N_Q>oM?$`z*_(-wx5oqSHZ5 zT2-(+*$%P2D5tnQoKE*IZ zM18fUONePR$3B@?uD*OgvO3u^Nj8BNSyv0PeB?-9D6F*gI<8=S~Ha+D?s_7pAwRJJ)*a9h5|^Ms{Jw1}t|S{@L>#RfnqrL?!=f9bH9a(6fBz6 zJH3n&SLbH_;#{I7z)RGJgquk+{Z02sJ6nU~$F3hb1@_lOawq3K96AtUo685BLRf*` zvQ>fFH_+4MSu9_=ef^lsH2!NS$61ERq(s|1C+Rq?4GS5-c8_SNG80^OaX` zdiia-BVC5>DL&%+D$(mw1CDA4MfB=N7g`Ye(@bp?FE+%@g!ItqE?$%>rp4_Q-7J~J z2L?z*n9)J3TN2wL58t+Cg$+zFrYg>Q?=9I3ioC0P_}i?%KNuqoLE3lS4?qP|Ci5vX z!I{`~Bn{dC`rnu%POR^;DDLM1{e3`c%$l9X=l^j5M&$|JRQlr^(MxT>bKYrWD%>Pf zS75eX5i7wnqjItPdOxm!i)$5Pu}AQp!zO}klX%=-#OFumHTy>@&h$bYNmRGnuCo18 zMN7oGaCJ$8mg2=#?VN$8l_G~~;bHl?+3T8m9hS7S6>;)D#IgIbOjz9i?3FlX@d@>h z?ssYk4g4;v$vrIsb?O^ylv{5axe*-+4hZ@BL=z*IVTBJPqArkW%+mdiPW7m=(0CKL7PWo5Er-`G|uj#|nUEm6(V+9|z z5P{YZRzl3R-is60NiVt78YpvSuccr6eUY+(FvLW-_J0iqf@G(Y|H!F^6q*>poi{3D zIr!qgQn%~=2x$v1XDzBN)$0cVNp%|1EuKAt6{xu#vJkb6bIK_uD1kZghnpBFWxLPt zVL7UqHBC=~27Tw$V$gxX6yNrSNG6fNu6E7#e{brt6NXIkb3d#Uu%5#L^432ppU_{>SI0a{=e zO@Pj9on-P^q`clzxU_)&o7ZQs=EalN5dS((X}x{81DwDryGBMod@I4GZ1|SML5aYu z`g6EF{fk7#pL&ioiZ|ra0W}}l%N}v`qo5iUzp`zZrK2YnzlmSWqp)#hP=;YB%&MDC zY|60S;^~C~`mmykp7;aKzgF>A>#e!W5zNt1QX69fWD z5$ti#I<7_bArOhfnw`hg(R=T_TC>QD2cdU{LDG&WIb|3wmnz9vK9nq3a7l} zWR$e8E+MF`esilUq-;7}?G_Ai&ZM<-E@75S&Z^v}29vZ1gKrS+Dh4!|yt&D9OHD~I z0W*tIL)H_XC=@^|Y7TiHKAK$IM_!RQy9^D>pmU4Ew;kK{*u0$8PT^jcOi7yec+_8G zmrG#c%HCRw^LS6VQePkG3nRAAg(&XZ@>6N)o0}zz7({%vi4-yr#0=EnR5%{bfp@|% z#)CJ`7tO)n4!EPWQB;j9KxB>vU~JKvD)wOPN?nDOzw9W1`7p=6Zu9=ImLlyZH|k+F zqo7q`??ima(pAPWA)G?r@kHpB$S2Rw64I&~7PTzXG4VaxiC@4j5V{dwJJ}E&^FhI}-LjZ`vGEEG9kfmy zb8<;s-t5&9`J47SHUvvah?BD-sO`nny^)%dE)NrAo=+g8j6F@Acd?2zdo6ay!c-UF zK;tH>d3%RZHhpcOTT8*s6&s3Kf;wMm9!Y2Tgn{Hh<*dWoq~1KNpANcU&8%Jgc8+gN z5n6K$rt{@v+Pc3nOwB=+k)81vEW*yMu|vcmzCQBd150_1lG&3C)u@WaO@vW6S(o0sWXR%bfpg(bHIDIHW&NxBSQbh1ua-qFNF6gA@g>XP+sWfZ;s&%c@4*S3hMHj zTd{IXf25bmdX;fbvdl$#7UMLJ_8SXWV`{9IS(GM^kXBT7*>3I~X&Xw$$=>*+BTwYj zrETu=grTRh57yGAy~2~n=T6SbMGQ^DZdB1Hd3MzQv~5a{c4rq^%8+_e{sn9wN3R)cQAY4!DDdz4bBc-;a*)1y=jFYScBZkVF?YU0X*z{UE1-U zD*PtO1SFkGvSCvNJ|qE6v5Sj(h$`vJfr*Sh6Ds|cXBW#%B{K_reph0k;NXt!V`olH z4VFFMb`luTHh+t(!^OI53d99417nvLdgr#~J%&N|H;mQGRlZ*2>AjMrzIH+b59aT` z_7Wewn7dx@8wm0 zkUxYASWYdtPN;S;0HxqmNeA)nP?31caaA!ptAV=A;+DPY2{T2NjK)@D^}SC}27RE{ z!i@H-`|hJ-B{$oq{e=^XdtK6@9;(8dIe*IU&OQjZDCuM2QE}W>N#y9rs6Lx8f|72z z$w{xNZok9<&_FATbK6VHe#ACYR8^>+%jfntd)(kIqkijAwCx_1ab!nI>*k!tb9NqO zUxpL)&8wdd&_HHULAyq1Tu#_BA0&I1#&{@f8GmBm0hh-ZgvV~6(9>2`r zM};zd*5tX&TA^41q+xxyeWu~zq1NGxKu;nmkgQ8xtx(L{@uNTT^D^q;$QmP4jG1Ph z?*pb*XYX8GFO&3gQd^skrqp_zrEU!ysQ(Pvhm35pQ03sr95ujHqAn z>r5+5f?0j+)$&_^rxpHkMoT}GLg{NNrO!ajtJVXLh3HLCIJf^!=?hi3tQ)H-7Ivq! zEQH!}eQ`3lbX{!3`EH`Ug!P{NJsS&zRNR8JewNp8vjr|w%;e=X`|S=VhhwprN|m20KV*m@I;F_Axo-eX(lw1Z(=^Y6 zf)pn|ryijG-GYT3os_z*Rja1B1CxpSaLQ5Ey$M!K6)ROP0n80}xP#JP(+`oY@Mp<_ z+7NoroshZMlBXt4Sa`?tfkZ-HH;Gpb7?H8KN4)~u^!cc+c~!IQ4PybLPtVcu}j5NaIGA_qOx@k6cQGTqO{-C%GTfB zaNtzs_7IE1Jr+#Fe$-uKV3i&sP~|Q`Z&q9=Vh%+`+2z&8SgD44==~NE+3GUpN zrS5p3lgF23HqsNy%C<*p>D;zQN#H7C-icM!!D>x)`{Yd68gPAMnTzzRJ1on}w5JtN z(N&E~8YcZ<(vkNvyVq>TnvfX;dQBO6^*y30ix=exi1q-Lf|}Fij!Hw0Y&`$ySAhp} zHascf?T3T6*sv7g?#6fsaJ6J^#TAco#*^b@%Zk&Hw%$0GsLM>D26!s8;qghA?|MBA z$lux7w^wEY);`<$S0O)m{-fK5$)^jsNaFq6Gc4p%ok*Hii+0qLy*LXIgdE1p@-4bq zN{Te$zaOY$p8Bs*PWudH7*^)v#05pgpeiYaahWx^@ zOYKp6R-RM#fFX`Gud3$o*FU^W`}c&0po^wKkg}1F+8CzLCA4UmB!Jr>`rGmnz?9hw z@Y%Y3T6Z~1S>~tx+hctST&q2(QGC0XJq@B=njtYxSQ-h!67Fy)zMA7`+RawDLk^DM z5#@zeFB8G&>*u1(Y1^iNzLATGP?-SPf<9^H*K7~Q<<}>XN^*Aw>&~H#Nqom0)O!L3 zo7ze7pNp zbQL;xXdu;a_aCSSk2yV@;!Y!rZlm+_RugEsu%X|$GJ6SAMTm9IrBosl@bx{ z3zpJ*BXv$UpR$K4EiGO zjXE+XrW*_{gO&UR;c})dIcEeec9gIf;$~;5>{mU^6U`0DFp;3L7zpnN<8l+Ew4Qw1 z3=bsC_h&4LdPx{`)V|Tovt0GWF4C`SzHajss=Up9@k3G*#I-GgV?@aq$HsK(eE#{3 zKUtbpVycdGpDj(C`HTZ3nWK7>a0-#BDAY@P_It#$Ge&Y3b351O{0`AAMvrAq;`uq) zf_fvSgH)T6z`*I5OoVv*A+lQja5V==5f)icTVI$Fl~0FCaHHyYa;M3x86>J8a=0Qw zrc4LD-LPGoB0Cv_SJ_#k)llh)!NL5vIwC?bUk$nlutzh;nv`e>_^SS+IDKvsyA8jWyvvyxuBj zytNi+cq=OEj!>xE=~&%G5*cbHx(X#s&1!AzBN=I5adCcZ!?%$11k33D5vi}ho1zKa zON++0UapmBugr7}e~Ros(!E#(E_5+)cLzqZ}h1;c; z5Fs*JXfQu`?zr$1mhghpd!g~jd|-TxUDQn*+rOLh%c(hMS9l^fXLoUyL1-PUTpb6J z9nBeyNSyuURso^=qKU)akNVOXT3CAjWpFI&SZyop{^ck8-qH`>cgrN1mL~cK&vSz) zh)n9!F4`8TwN#(JPi!IQ=TTDp&MCdWFFP~+Sz8W21-ieYkU54}kg9Cpg3pX z4*U;mV+?Cx`as;{k>!Gupru#VcHCL5PAKXN9tszxP-8M6F+olz+@O8V-nMJ0eGFu$ zr^o912wiquPvx_b<-V|9kIDeAT(-jl-r3w1Wn??bmy+;YczO|R3{gofTlV%2NMeT% zhkXl7{{C9bN^DBAXI3p+7VM6KY1MU^O-!2j-i-*Y*f7TC0sGR$#)L)GcaipQtsL%3 zb)%rvDU#(+SyWnPnZ@nj2&CifV{?bu%-*l05UES$SOe=y&W|r^mdN$c@cfRxn3ZnE zc6$d-S|JuR+D*R@9g|H=#tbYbkI#xBBYsv3hPe|688Qd1El9k9V&VJe7asYTyZ;ws zz`pj7GABQub+5mxD=Wcu8XM`kO?6Ryk;!Lh-W5c)n{n~}cLl)w)tZiv_iyw00^shP zlA;JwEAsv1KD>rt zf_+m5Frwg@;4e?Gq&jBjJJ^e%(FoYwebILhCH5^mc(hLf12^<192uAr4atU4eyWDY zzEFA)+EDBhMEPCxbk<{)Rgw?Y_Ak=`KpzQ9NWp$u^4kr7=~)1$QHXgy@<2oe6}~<_ zdxylc&>+*K?o9WPraomk~2|ycYyCyP5J?2wh+1}j}n_QC(Y|VLswshZbX|0qR zx$#W(atr%=LBwIxCIs>S!`oX2#o2VSIDzNX9CspL@+{wK`ugOhTk<5)tQ|~z@^#3Qwqcbrh0{>X#bK-s za&-D;%c`Wog~2)%RR})JI5m^1JR*8gT`6n`VS14~qV#2Nhv3hfi^Eky#&Vu*P{et)TIZFcO>EyM}HLvJ+0l3GQjjhj1^BB6B zThd2%6kg`-zfawn_}J_U&m1YPmyJMjp!)kEOjwP z0q8|Aisxh@Pi88fRBj1LAnOZ_kwp4cgzR*ia-?@Q9f{DjDK9|mO?6>~{qM=ys|Ia~ zQ<9Lr_0|}qH^0D#LDp}_uzq8^->3!|34aLs=O%n$e%_etDl0GFXSD|AFB}u`JD_I% zJkkoYe8ajz)RG6?teH-KK_7F)V&Znj!CKR(&-g+khH35i*E?yf>KndN|Bo7EVk(%` zveW(%y4QW>ASQUI^{`dQ?qimARS=Ou+&pPTqE=qnWYS?B`nl z_}HvrMsk2hkf3p;4*nmtd^5%qw0sOXH2R=QSxmNCaM?Mr@y_Vu0z|wwza+kO$R+Jb z&i=OMn&9YQ#5+RFipe^!VwLM^^LS|E*)$ z33@fdFEr22iM=-bpJN1)K&?!%xzKbuUCnLqb|{w%&hA=!mxFl}nxNr}6*pIZb9k{_ z0ILI87z45zL86}7`wie9?HOD)fjo>|?m=%1P|PX2GCUP4OAT@B`&t84(?wBn{E zxerc$dEBwlBX*H$m(Vd+t5|2SSSu%UL$X(!k1Y<%T)TZqu{*0JjpKW*dvDh@B(f)I zBD+TRER6Y@nBx@{v!!`07%d@|oQeE=x~0{b<7#MvhTrg@({vfM$Rq04Vk|=S_k6Nt zhMLOgjN2QX97+A!f`}8Kxwcfd<^HhJI`^HHP0MxXzADDH^)CaLFXvQ43ZN#E5Vf8b zZOz{A?O(vYdBw+vV)Jc%^9PkIf4b5?G3?)jQt)K%MHHa6)x7;JH~2A?{t3sECF&&N zYNc;qG_I5vo9X_Qpbq=Ytem#M#l@ zHZa-q4Z>OGS|Z?LZ&(l~;f|5sh8zRhtz&k>X*@J_OZN_@I;B3g!8Riv=XC=wq*8YW zmBN2374%t3w8(e#-gC6_m0j`@_n3Oz@^=Brect^Zm^DMC-d~C{5w2%#qvZQ|W`aOf z>IgIU4`G`CQ;J6i4haP_L|m@;c;J1SEL6;1p?V#LpWiQrhK}ejAI!d7Z643Up&`U` z4BxId^qWa)O$6w&KFnY(k*H@FdKr z-_=1&7kg+*4$`*SXO2F}C-+rBrudqeP&v#8( zv4+tko{xg;$U)cH10@B=*){gajmMWgpUsfU|7rn_e_-7r#V!}~RfloM^1n>x(x`OA z8xD8QMLovxh<)Yqk7zGlQB`epM%ilz3U3hewTqmQ36p4AsrQ8hb0tW@u{gl@i}c3@ zaxAuJ!u5qf^1?+H_JNRim7pmHtmc|v)Pm(>Nd2E|&mLu!cs$Pw*_F+#mJ$lb)RcX~ z=;E#K@G77J((^R9p?I&Ji9Vw@y5~YPpNysJ?=U!qqs9g6l3qx|GU)GVryqw?Ygi)W zQRg%^M<0@ikq@eLQ_<1rRBMnetUyHQA~ONEh)Q@hay(|poD#4*PWBUAS{(HL{PMg? zBDB$K`P-);ZEg|Raha{F{@^KUrE+hwZz&sfT_t5jmM<^#?sOJ5SpFVFu1zT}ZnW-@ zxz+{RynBmUb{tkB)7=eglv9k$c9CTkQ@vL3S3kd8Wi=8i(w)Qh4 z*STjqdpxGQsZQ%)xeDh==*@A^-8W!H787UL+65MpfHdZo_{Lm@7Hf^qz8T13m6A80 z!G!7uYoowkDozJBfjb`7&Khtup|i(%3YF?Y8;c<~R@`SK-oD=uSq?2oMxO{H+cX99 zEsGm!SRYVmGNphWuV(PouhDTMXFopAUrx;fg1$zwv}pVRZH;ax^`$lO-9nDt%4Bc< z!L7sPM!a@x#!pnG@<8M#|(6*ITO%9XD@CTz-wf_VP-8R=f-Mq65$jRI-g2q3CFuEv_k!wyocC*QO+5Z6oBC%wvsY4e zLG?6J7xzu{pt)Ds-X>&pS@|1trY{|B_J|*vms%6L=wu9_?maqi#YKBARt&mTK^LDf zVc>3_M~Hv%N0YP5RQDXf$F#fx#|sUvGZpUF60jA&PL_n=F@89FSVyoxj`pIscp##% z@L8jVI4fdYCNw58Rc@fqX#zi2ghZR*3}T9mX?20>JX;b(r|oSB<_YxinoHw5ql*|m za*7itt|>lf$r?PvFYMFj;)k0j(r$Qv`oUt`BI8)<5h`?(F^>S@#hU3i&s<>h3wy!vwt?mWA>(kjz_Q=O00gP zwFZU@6QP!a8P$xqr5v8xZRn>Ecg?}Kd{W8wl{;GB-)aj!)W7*Y_a-p^-byPKv){|-Ua zCl@mS7r#EC!Cd_5~C(BD9Ho9@cL(4R`l(6Y@hPKz6&U~uf} zOL2UamWrNBrMbYTaNgDT1*hJ9COeK@dLv-P)U~We?)zEG03_0`9wobyf$Iov&? z*C8vB4=n?;*)`hyv)m~T2F%4`xm2_LD(2?GE7ke6e+*^TN6U+8&4!A|eQN@7-ljyF zJaTew%w=*N>8TZ@M7qn}gEl3j-oR7@Y?MW6pzIG_;?Wwi)&*(F_%-2@!_)g!!E*TXZ)dr2_?eM2iLUVq;sz0k33?_5g9ItRRKj{)A*tlgJb7S_3mL+ z{!&4WTwclRUjXaf%{k*`D5&N>(vf4z6o*}vX_Jvnn*#UWoK`Qw8~{Use6)fkr#m$O zrB?G6#{?F?!Z-2v&H|Dx9py3cIB!F9W0G~Jt23GapK|yd0$!J-bb6E6S2cnmO=*J1 zkr4hkg4$ApR_M70IQcHH$fvD>yGozHkYLVnYIlD%X{9-!zgT5}3xJ3HxyJRd!LMJH zd~}AlFR=%SNeJC+%7M-Z1O`)T^sR%3vZlNJD1)#s_#%WKXtMC7)6dFwHnK*d6pcsx zDKPw#7h-F$_(tA&VJ5^=-F86YCOOhIII06!79elel%>N|22%k*)Sg%~{*}FD!_7-J z%EH@o`AZfB10tn9B68SriVqkVnmbJRTi-@5w6$p15Byyr6=)imoj~m^kQZ`X12T0T!igy-mw_}quI@O2oZ z&&|V{z1nI5@A3_U{Lf=7UAt%m^2kgI2?}b=1TqpNf6KAlrXG=M5OlhrxLes#G=8fF z;%lE=2yIQ$S`1=>_N1S{*O{b+3hKEr?({Wv~Jv>O@8tq9v-0Rk;LqfiUp8V(l z9Y%=1E7%@f13(VceW?Gc+ho;kGTnHITn|gME(J*K*n?KN1tdm}&2Tbu?%IW(I8>1_ zF~<%begUC6aBXrh>g|fkrVMpz!VJm}xt5=p{SzcH`KuEi;g*SnvD@D2@^K7J135sHzsW4btU}ib=UH8XBeNI!rfdd zgP>I8wYZrzYekv+Cc*1POx$43pH!Od7St6#8&{P>Q@KTxKSe>qxPKA5BAfMVsCtXa zq}4mLY4Po0&O#H#u_BwX9rH3K+1$=l<{LRn$nHhZ`*Ad?)>m=OBjgpk0$#$=)4LY7 zFyGsP=|QnK2=`Ulfy$cv7Vqu+SWktONJe`-=&T(#)5Z{gyPq^HfS;}V`nE-JWP9Zj zX{@}g`OB;(yo5D-CUYy){OgNf$0SX;zWq@Jj#}me&RCz0U0fLC8hOTsoYA)^7Jh*5 z?2N?4Op>|ZG)hgBr;zU-9F#U~%L)iQL`NGO10wzA1kP3HO6$hZDNeZJZyiWe;9E`7 z^U_kt<-*QQOPbj1y&2lq-jHRSbQT5OegZ;5?)n%{&SSAjyl2{$=pMPt+0A-3V-TZT0}to1P=jSZA2qjFC&SI zaH#qdOjup=1}>FhYDWRGMk^SRr#&zWj~-E@H5GKDFHWVdJ95N%jCc8((sY~mn`sd` z7p(JduiiS>0Xvq;{jxOps3sC4;S2QadIcVO!Hlx9ql0Oc1-<1@MhAyw6&0S6Ud?7V z5|995yS~Y|(sf!IQ=h129DdDTv#n9{@2&c~+M@AQ$Lsmjr;_adUa7Fs-RJ@q8eMB< z85|d&t}Dlno-DN=x8Jdz%sWYGiq*p8B|Tl|QNK&npQJCqm1>69`Jm{P04|y?bMPs? zaFkajCJG@d&oGos8`N0ta`LWKqD(qV^a)15Oh9;NTJK#nIo<}oB@wfG z3Z>Ag4Gt&XG*{;=#lIE*V~lEFVl^#!9DLq84qIv6UL}QhX5N6twW#+#8QQ|voc zvMM4*V$f{VRBtaV39fXhpI|H*C)>HJA;+W3%evD3`Ein6$n|>FCF?!NzSobuwp4!H zgv8fnUzw4I5GbdX5v5f=Zz$^GTNy9YLg5kF0Pjv8Jq`z;JC|hB3Ei+i94okELLZN< z>Gy71^mxIs(XEYQ7gWe66~8WoK|eQ6J*Luwc8QWm=_rY3%+7L;Yr-?a8`b}*^Nz`< z0j9cAd#fADzK3cV{ezpNQ4p|xxHqtebWcg5ozC zcOGxK2PeQ97!80cmi`u?6!igTPtK0y=<*%IObBJTl;KiKnDq+48=!3KIRo0#va160 ziqG1j}Oq?nh!icNH9@rsfXwp&h&g^ zsg~~0)YiL}d%WZO8AiQsuO-aQp;W$Bx`g4gYin@#qIvAuO$z`;WF+TdZ3w)oZ%ff_ zscp*ZK*2w~4bXX9RI;e|SptI!Ko^`ec3~4GEu9`EAUe0Z6OA3!n^)$?eExj;h<ghvIlq)e(0*5_eOTn7ddX z^=tVIIb0la7qv_zhgik2ogEkwEJ_hUDP@hk&qyCIC8>;MqI+;BPMaXa_hV#2ifvul zo~`Q};^42P@5e}Tr(P19JzqByLNHD4tGv?9e}yykq`Lwzr$AXIpXfT7+QYsJ2^C{a z9HwHdL8xAx;|h~GMkuHIJIGy4B($_CwKuhG0O-!HF16Z|gN(4fmY{8JS5r^l*@ z!*yGH@WkluB%`??fbro>2veS`lAf+S!i}DP!p4f6Dg!DYtkN z*?d+3iDuXKprrUQup);89VNJ7{BWMx`AUKCHjz%}9$2=)AwLknYy< z9TUAQnl7R%>U`$MHw@uJD9GY=Z#RH`8m_6ZY*ngO}rMo z7oslo_t5V}i9n}Mg8QL|BR#Gt^q+@!Wu1Zx3Jndngpk+l;_U8Zjn2wCN3y+!i(hSv z)^mVO+Nwji;5P7oDfG{GI|zu}R6S$E?obB$ME|}1g?rF=U&kL zw>PYgq_ax=d!r{hdPH1rl=*&sUQVElKE0Atlo366fTTJQ$WV0QD9LR&gT}qq^KMaZ z4QRi97rC?UHo={llK@dHHr3eC-qr{Kx-GmH% zB{CO?wMFjO8qVwPPbBg+oDxJ*!@^h3BUPN(e2zg&5&jafKed3@e0H={TPedvc1Jf1 zEIa5Hjun)3Id4j=ApQ0CIe(2Bd$v__DPf07Y}M94V=ggYc7J!L&3k-sfLD9PNVS)a zDW4M!u`~1@#z*Q)8>*CcHNu%dMy@W3@bJ}E22%k6bhO(=`XSKX4&+W(#%36la5Z_Zt#Eb`VLu zmA?!0e-kQ1@hK4VKaGVJpHP`y^50Ph`K$MBwwT7>FVy9WPh@6fcu9X`uB9O(^Krb` z*23u~{X+hf4Cf0XM6 zM7BJCJNC2ae=>--ppZ=ZT~!rxd1<3i_`{=P4W}Hi-01kkmu85BohPn5_-1{JWdwj8 zL<1F`=98|`*wegtdSb_ygu13F^6m}Fq0!Ld>mg;WtBWrzq{gCAwvlOPn@<-Gs@?jf zVqj`Y!1!44T+Lwdm_NU^vQ4_0CVjjd~w4UXD^tQ{&L)qor8qUD9&dq80L>hSxPTF8%sgXTNAi8{iZ^8@B%4-7e- zA}vZVX0ABi7PUkreV~i;0RYHGn#a3_fJ;(o_vmeEosgA?g{7I*GnI5zIqut;T9hMI;>9jJTtsAfg4FOp2~lf7UXYEKwZPqisNGVI>o zUS?({lqL?0l9CcWhn2UAS>0BosP^-ylKICj7Q;slW4+d4u8VdZo%qSu%l3zih zDKI*xBO8s~E!Y(vP#C#HQ2kyAI~jU^pnOa$+@b~rQ zkjY{>F3OAj)RIhXb9j}RpX*SEa!B9#6u<2(Iu7FSHXr5Ki6D89*;}u$F^O^>^eD=8 zT`zUF-Y{IoRf6gx_emtVVT62-kO_)&VyMNMRRVinrwOurKU@qb`-yQ|`~zB@^GnY- z5_fekVf~pD@28ZjsJizG-mGaP&bfKGyMT{8lRmTTr^Zdb=B6GL!;U$O&l#_)36LO){xiJTTDO z690N^dWp~5klt0|mL2#rqoNeB zfYIjfxw^v`Wfe?+o4E4E=fMmMK})H>;OKi13VRrY$K;DcAc@%FU(d0}J?>qn%fi6` zc#HnQ0sj1$CWn+nq3h`5J(sHqU>7Z4`ECOV--t9$ruPn$5HZJt!k$NX8LGK^HE!6? zHZxF!F#q=&v-{_3w*HT5$v!<>oeTpK!$ozOk9|_BCIIJq8~5Q!^nSK&CV|igbn%2` zCn8`1Is{VehYIU`4Xmzhl-O|v*%yTxlw=q23*&M7CE4kZq{qIy&zV(T{>JevCGCt0BNQ3RT zmTS=AYCzVt1|OM~gR7H@nZm|zwu+)tQU^4Zp;^3r_J@&nN?=x>Z1CUwxUZc z1?{<$d+ve)}bZh%j$R9r}{7 zr{1$fF&nYF!Iw9Mm#4>RyX!C*NjK1#_<3dSrn-#SMBo#>NA<=x4~9Z-dRq*9iAB() z^M+kpTN$SNFaq34hr3~+hjEX>Rp)3u{U#<;vfPaB#rvCO_Uj&sRU7h%=r@{Z>~jHJ z9nNW=uqf0^f`)Z^$}BeUk6cLEzgl_fWTsB}aWUxE(!*pQ*kx|Zm1C8vXj1R6DNDKY z)8n38$=Ei8+BD{Axljm%#|z9>-fT9#tL7OKRy0SaL@1~H_=(iH*ehtc<4Z#`&eN=A z(jP807)$@Kph}A^nPY9ixf3y%$QHJ}y#5jPI%b8he=_D`HvVL z*WQ*z)H#qK@VdUDj|WG!2t?!*Q*i8O%c`y8GoK8N=sp~LfgKzo)<5RI5TfHynpxw* z?Cd7sQo3vo^F7Az2kDb{Gi#c$`V_c4)Ry^-CI|#y!z3JTExL**fSqyz;@^U7k&$}l zVf{{vn^OJw4mi+o`{uB&*_3rxVwO_9E5!?ibap2j&qQ$~5iSmKx>dr3oq)9acvh4{ z7po7!SjI*!QOLBNvQqNy2YC}lCwT_da92?K+J3Tu>JU|@VX=~^H z%Nz!q^Nq}SQ43aaZ2I&4rpF|xRCX>gdQV{6F*Ih)Er=gQBB^(=lv$X)^@D8LKyE z8|?VV+=L_HcFF_K@Lbm<`tlhLMHqKf9(>iniFvyVhl;3N`FQ@h89cD-i;R^T1cf}P z!@I9;n*KcQ^EY%9+Z+#oXJQ@1oR3f;B!MggvU&MTcv_?*4uzFS#zsobS8X zc4ZlgIbmM*`R~tX+b*(DPV;%UeItg5(4?zP8@#MbE_-6bAL>=|_zWT{KInV1804S_ zU1L+_9nolBn5K*+YIJ62?aSCTPiPP%mu}*5D{%UnRV+G;Q26NUM}X}`UjfPqR-C(Z zi*RUscq~m8LgQOmB%-#r^&razm0~fz>c}6@g*Ghm4^(0-)63Q*wHdeU_pOWls@ui& zwbsC%u?`6GAMawA2Yi>>LMAG<{kd3^-crtXbIzJ_w?U@8_qylG{=Aj%Eh-ffW+3iN zYi+d8`d=-8gf6iyZ0>@LsI@X>;*1mB_xurN`g)qd-RdT_xL+7L(_I~%>x0y~8z}H} zChYP(QBAbvYMO&}iT7AY(GQZ}_DkG}NG`szEC7|>E;d9YT?9=?UdUG7zED6Zj5><5 z#f8&&Z&MmtJ?9v$uU@o2Od71D8BZ?ML}inF;F+o0o$6L;0NBILm!jQDDSx@R;lzoI zg}u@P4d6MYA8U;m4Q0~$-EU{{dG$>;W?Os$zH^)*?IP`)q!5`J?)fWB@LUNWR0lo1 z1k?8SVFCgIC~CF(%XA~nT`733h6S>n3`c$pGX{=u^^=;OjdO9ZLX2l*g$zWIkaIWjPI@oG3O!a(00QzY)6w7)J@KbtrxZT z3LQyyJNt4)br@}WwCTsL1tz4u3Y+aoZu7>P@Y&TUy>#BiMio>%;yaLh-QIWUzMAar z3ZOXR^rU!Dbx zA`)tvnd>=AP4J*F^`1B2`dZ5LB9^KfG*(BoxzRs0R0Q2evVT@2PmaE)z(tdU)!>#YW sMhSs7s3V%A*srg0!mS6i>(xuL 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 XTvkr70k6UC?``mNHMt6z7a{)x!2=@& diff --git a/linked_md/modbus_icd.md b/linked_md/modbus_icd.md new file mode 100644 index 00000000..0e78ff64 --- /dev/null +++ b/linked_md/modbus_icd.md @@ -0,0 +1,231 @@ + + +# ICD +All the data is formatted according to this: +- byte order: Big endian +- word order: Little endian + +## Discrete inputs (read only) + +The following section lists a series of addresses to read ON/OFF statuses from robot + +Applicable Modbus function code: + +- Function Code 02 (Read Discrete Inputs) + +### Robot state + +| Type | Unit | Address | Description | Supported platform | +| ---- | ---- | ------- | ------------------------------------------------------------ | ------------------ | +| bool | N/A | 0 | Unspecified arm state. | ALL | +| bool | N/A | 1 | Cannot be reported as the Base initialisation must be completed before allowing user connection. | ALL | +| bool | N/A | 2 | Base initialisation succeeded. | ALL | +| bool | N/A | 3 | Arm is being initialised. | ALL | +| bool | N/A | 4 | Arm is in fault. | ALL | +| bool | N/A | 5 | Arm is in maintenance. | ALL | +| bool | N/A | 6 | Arm is in low-level servoing mode. | ALL | +| bool | N/A | 7 | Arm is ready to be controlled. | ALL | +| bool | N/A | 8 | Arm is currently being controlled via a sequence. | ALL | +| bool | N/A | 9 | Arm is currently being controlled manually. | ALL | + +### Robot fault flags + +| Type | Unit | Address | Description | Supported platform | +| ---- | ---- | ------- | -------------------------------------------- | ------------------ | +| bool | N/A | 32 | Firmware update failure. | ALL | +| bool | N/A | 34 | Maximum ambient temperature reached. | ALL | +| bool | N/A | 35 | Maximum core temperature reached. | ALL | +| bool | N/A | 36 | Joint fault. | ALL | +| bool | N/A | 40 | Above maximum DOF. | ALL | +| bool | N/A | 42 | Unable to reach pose. | ALL | +| bool | N/A | 43 | Joint detection error. | ALL | +| bool | N/A | 44 | Network initialisation error. | ALL | +| bool | N/A | 45 | Maximum current reached. | ALL | +| bool | N/A | 46 | Maximum voltage reached. | ALL | +| bool | N/A | 47 | Minimum voltage reached. | ALL | +| bool | N/A | 55 | Emergency stop activated. | ALL | +| bool | N/A | 56 | Emergency line activated. | ALL | +| bool | N/A | 57 | In rush current limiter fault. | ALL | +| bool | N/A | 58 | NVRAM corrupted (not implemented yet). | ALL | +| bool | N/A | 59 | Incompatible firmware version. | ALL | +| bool | N/A | 60 | Power on self test failure. | ALL | +| bool | N/A | 61 | Discrete Input stuck active. | ALL | +| bool | N/A | 62 | Arm is in an illegal position (singularity). | ALL | + +### Robot warning flags + +| Type | Unit | Address | Description | Supported platform | +| ---- | ---- | ------- | ------------------------------------------- | ------------------ | +| bool | N/A | 64 | Firmware update failure. | ALL | +| bool | N/A | 66 | Maximum ambient temperature reached. | ALL | +| bool | N/A | 67 | Maximum core temperature reached. | ALL | +| bool | N/A | 68 | Joint fault. | ALL | +| bool | N/A | 72 | Above maximum DOF. | ALL | +| bool | N/A | 74 | Unable to reach pose. | ALL | +| bool | N/A | 75 | Joint detection error. | ALL | +| bool | N/A | 76 | Network initialisation error. | ALL | +| bool | N/A | 77 | Maximum current reached. | ALL | +| bool | N/A | 78 | Maximum voltage reached. | ALL | +| bool | N/A | 79 | Minimum voltage reached. | ALL | +| bool | N/A | 87 | Emergency stop activated | ALL | +| bool | N/A | 88 | Emergency line activated | ALL | +| bool | N/A | 89 | In rush current limiter fault | ALL | +| bool | N/A | 91 | Incompatible firmware version | ALL | +| bool | N/A | 92 | Power on self test failure | ALL | +| bool | N/A | 93 | Discrete Input stuck active | ALL | +| bool | N/A | 94 | Arm is in an illegal position (singularity) | ALL | + +## Coils (read / write) + +The following section lists a series of addresses to drive ON/OFF output on robot + +Applicable Modbus function codes: + +- Function Code 01 (Read Coils) +- Function Code 05 (Write Single Coil) +- Function Code 15 (Write Multiple Coils) + +| Category | Unit | Address | Description | Supported platform | +| -------- | ---- | ------- | ------------------- | ------------------ | +| Control | N/A | 0 | Quick stop | ALL | +| Control | N/A | 1 | Abort / manual stop | ALL | +| Control | N/A | 2 | Fault reset | ALL | + +## Input registers (read only) + +The following section list a series of addresses to read 16-bit number from robot . + +Applicable Modbus function code: + +- Function Code 04 (Read Input Registers) + +### Robot + +| Category | Type | Unit | Address | Description | Supported platform | +| ----------------------- | ---------------- | ---- | ------- | ------------------------------------------------------------ | ------------------ | +| Robot state | uint16 (bitmask) | N/A | 0 | **0**: Unspecified arm state
**1**: Cannot be reported as the Base initialization must be completed before allowing user connectionBase initialisation succeeded.
**2**: Base initialization succeededArm is being initialised.
**3**: Arm is being initializedArm is in fault.
**4**: Arm is in faultArm is in maintenance.
**5**: Arm is in maintenanceArm is in low-level servoing mode.
**6**: Arm is in low-level servoing modeArm is ready to be controlled.
**7**: Arm is ready to be controlled.
**8**: Arm is currently being controlled via a sequenceArm.
**9**: Arm is currently being controlled manually. | ALL | +| Fault flags | uint32 (bitmask) | N/A | 2 - 3 | **0**: Firmware update failure
**2**: Maximum ambient temperature reached
**3**: Maximum core temperature reached
**4**: Joint fault
**8**: Above maximum DOF
**10**: Unable to reach pose
**11**: Joint detection error
**12**: Network initialisation error
**13**: Maximum current reached
**14**: Maximum voltage reached
**15**: Minimum voltage reached
**23**: Emergency stop activated
**24**: Emergency line activated
**25**: In rush current limiter fault
**27**: Incompatible firmware version
**28**: Power on self test failure
**29**: Discrete Input stuck active
**30**: Arm is in an illegal position (singularity) | ALL | +| Warning flags | uint32 (bitmask) | N/A | 4 - 5 | Same as **Fault flags** | ALL | +| Arm current | float | A | 6 - 7 | Arm current | ALL | +| Arm Voltage | float | V | 8 - 9 | Arm voltage | ALL | +| Arm CPU Temperature | float | °C | 10 - 11 | Arm CPU Temperature | ALL | +| Arm Ambient Temperature | float | °c | 12 - 13 | Arm Ambient Temperature | ALL | + +### Joints data + +| Type | Unit | Address | Description | Supported platform | +| ----- | ----- | --------- | ------------------ | ------------------ | +| float | ° | 34 - 35 | Joint 1 position | ALL | +| float | ° | 36 - 37 | Joint 2 position | ALL | +| float | ° | 38 - 39 | Joint 3 position | ALL | +| float | ° | 40 - 41 | Joint 4 position | ALL | +| float | ° | 42 - 43 | Joint 5 position | ALL | +| float | ° | 44 - 45 | Joint 6 position | ALL | +| float | ° | 46 - 47 | Joint 7 position | ALL | +| float | ° / s | 48 - 49 | Joint 1 velocity | ALL | +| float | ° / s | 50 - 51 | Joint 2 velocity | ALL | +| float | ° / s | 52 - 53 | Joint 3 velocity | ALL | +| float | ° / s | 54 - 55 | Joint 4 velocity | ALL | +| float | ° / s | 56 - 57 | Joint 5 velocity | ALL | +| float | ° / s | 58 - 59 | Joint 6 velocity | ALL | +| float | ° / s | 60 - 61 | Joint 7 velocity | ALL | +| float | Nm | 62 - 63 | Joint 1 torque | ALL | +| float | Nm | 64 - 65 | Joint 2 torque | ALL | +| float | Nm | 66 - 67 | Joint 3 torque | ALL | +| float | Nm | 68 - 69 | Joint 4 torque | ALL | +| float | Nm | 70 - 71 | Joint 5 torque | ALL | +| float | Nm | 72 - 73 | Joint 6 torque | ALL | +| float | Nm | 74 - 75 | Joint 7 torque | ALL | +| float | A | 76 - 77 | Joint 1 current | ALL | +| float | A | 78 - 79 | Joint 2 current | ALL | +| float | A | 80 - 81 | Joint 3 current | ALL | +| float | A | 82 - 83 | Joint 4 current | ALL | +| float | A | 84 - 85 | Joint 5 current | ALL | +| float | A | 86 - 87 | Joint 6 current | ALL | +| float | A | 88 - 89 | Joint 7 current | ALL | +| float | °C | 90 - 91 | Joint 1 motor temp | ALL | +| float | °C | 92 - 93 | Joint 2 motor temp | ALL | +| float | °C | 94 - 95 | Joint 3 motor temp | ALL | +| float | °C | 96 - 97 | Joint 4 motor temp | ALL | +| float | °C | 98 - 99 | Joint 5 motor temp | ALL | +| float | °C | 100 - 101 | Joint 6 motor temp | ALL | +| float | °C | 102 - 103 | Joint 7 motor temp | ALL | + +### Tool center point + +| Type | Unit | Address | Description | Supported platform | +| ----- | ---- | --------- | ---------------------------- | ------------------ | +| float | m | 104 - 105 | TCP Position X | ALL | +| float | m | 106 - 107 | TCP Position Y | ALL | +| float | m | 108 - 109 | TCP Position Z | ALL | +| float | ° | 110 - 111 | TCP Orientation Theta X | ALL | +| float | ° | 112 - 113 | TCP Orientation Theta Y | ALL | +| float | ° | 114 - 115 | TCP Orientation Theta Z | ALL | +| float | m/s | 116 - 117 | TCP Velocity X | ALL | +| float | m/s | 118 - 119 | TCP Velocity Y | ALL | +| float | m/s | 120 - 121 | TCP Velocity Z | ALL | +| float | °/s | 122 - 123 | TCP Angular Velocity Theta X | ALL | +| float | °/s | 124 - 125 | TCP Angular Velocity Theta Y | ALL | +| float | °/s | 126 - 127 | TCP Angular Velocity Theta Z | ALL | +| float | N | 128 - 129 | TCP Force X | ALL | +| float | N | 130 - 131 | TCP Force Y | ALL | +| float | N | 132 - 133 | TCP Force Z | ALL | +| float | Nm | 134 - 135 | TCP Torque X | ALL | +| float | Nm | 136 - 137 | TCP Torque Y | ALL | +| float | Nm | 138 - 139 | TCP Torque Z | ALL | + +## Holding registers + +The following section lists available addresses to use. Every address holds a 16 bits register. + +Applicable Modbus function codes: + +- Function Code 03 (Read Holding Registers) +- Function Code 06 (Write Single Register) +- Function Code 16 (Write Multiple Registers) + +### Control (read only) + +| Type | Address | Description | Supported platform | +| ------ | ------- | ------------------------------------------------------------ | ------------------ | +| uint16 | 0 | **0**: Quick stop
**1**: Abort / manual stop
**2**: Fault reset | ALL | + +### Action / Sequence (read only) + +| Type | Address | Description | Supported platform | +| ----------------- | ------- | ------------------------------------------------------------ | ------------------ | +| Bitmask (16 bits) | 100 | Status of executed Action or Sequence.
**0**: Started
**1**: Completed
**2**: Paused
**3**: Aborted | ALL | +| uint16 | 101 | Active Action/Sequence **ID**. | ALL | +| uint16 | 102 | Active move type.
**0**: Action
**1**: Sequence
**2**: Cartesian trajectory
**3**: Twist | ALL | + +### Speed limit (read only) + +| Type | Unit | Address | Description | Supported platform | +| ----- | ---- | --------- | ------------------------------------------- | ------------------ | +| float | m/s | 104 - 105 | Current Linear Cartesian Speed Limit | ALL | +| float | °/s | 106 - 107 | Current Angular Cartesian Speed Limit | ALL | + + +### Control (read / write) + +| Type | Unit | Address | Description | Supported platform | +| ----------------- | -------- | --------- | ------------------------------------------------------------ | ------------------ | +| Bitmask (16 bits) | N/A | 200 | Status of executed Action or Sequence.
**0**: No action
**1**: Action start
**2**: Action stop
| ALL | +| uint16 | N/A | 201 | Active Action/Sequence **ID**. | ALL | +| uint16 | N/A | 202 | Active move type.
**0**: Action
**1**: Sequence
**2**: Cartesian trajectory
**3**: Twist | ALL | +| uint16 | N/A | 203 | Cartesian reference frame.
**1**: Mixed
**2**: Tool
**3**: Base | ALL | +| float | m or m/s | 204 - 205 | Linear X position or velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m or m/s | 206 - 207 | Linear Y position or velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m or m/s | 208 - 209 | Linear Z position or velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m or °/s | 210 - 211 | Theta X Orientation or Angular X velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m or °/s | 212 - 213 | Theta Y Orientation or Angular Y velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m or °/s | 214 - 215 | Theta Z Orientation or Angular Z velocity
*Only used with Cartesian and Twist Move types* | ALL | +| float | m/s | 216 - 217 | Desired Linear Cartesian Speed Limit | ALL | +| float | °/s | 218 - 219 | Desired Angular Cartesian Speed Limit | ALL | + diff --git a/modbus/examples/000-Getting_Started/01-basic_functions.py b/modbus/examples/000-Getting_Started/01-basic_functions.py new file mode 100644 index 00000000..03d11332 --- /dev/null +++ b/modbus/examples/000-Getting_Started/01-basic_functions.py @@ -0,0 +1,299 @@ +#! /usr/bin/env python3 + +### +# KINOVA (R) KORTEX (TM) +# +# Copyright (c) 2021 Kinova inc. All rights reserved. +# +# This software may be modified and distributed +# under the under the terms of the BSD 3-Clause license. +# +# Refer to the LICENSE file for details. +# +### + +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadDecoder +from pymodbus.payload import BinaryPayloadBuilder +from pymodbus.client.sync import ModbusTcpClient + +from math import isclose + +# Default modbus port. +PORT = 502 + +# IP address of the robot that holds the modbus slave. +IP_ADDRESS = '192.168.1.10' + +# Holding registers address to set a Cartesian command. +X_COMMAND_ADDRESS = 204 +Y_COMMAND_ADDRESS = 206 +Z_COMMAND_ADDRESS = 208 +THETA_X_COMMAND_ADDRESS = 210 +THETA_Y_COMMAND_ADDRESS = 212 +THETA_Z_COMMAND_ADDRESS = 214 + +ACTION_CONTROL_ADDRESS = 200 +MOVE_TYPE_ADDRESS = 202 +MOVE_TYPE_CARTESIAN = 2 + +# Holding registers address to read the TCP(Tool Center Position) position. +TCP_X_ADDRESS = 104 +TCP_Y_ADDRESS = 106 +TCP_Z_ADDRESS = 108 +TCP_THETA_X_ADDRESS = 110 +TCP_THETA_Y_ADDRESS = 112 +TCP_THETA_Z_ADDRESS = 114 + +# Input register address for every joint's position. +JOINT_1_ADDRESS = 34 +JOINT_2_ADDRESS = 36 +JOINT_3_ADDRESS = 38 +JOINT_4_ADDRESS = 40 +JOINT_5_ADDRESS = 42 +JOINT_6_ADDRESS = 44 + +# Holding registers address to use the Action system. +NO_ACTION = 0 +ACTION_START = 1 +ACTION_STOP = 2 + +# Input register address to read the robot's current. +ARM_CURRENT_ADDRESS = 6 + +# Input register address to read the robot's voltage. +ARM_VOLTAGE_ADDRESS = 8 + + +def read_two_input_registers_to_one_float(client: ModbusTcpClient, address: int): + output = client.read_input_registers(address, 2) + registers = output.registers + + decoder = BinaryPayloadDecoder.fromRegisters(registers, + byteorder=Endian.Big, + wordorder=Endian.Little) + return decoder.decode_32bit_float() + + +def write_uint16_to_one_register(client: ModbusTcpClient, + number: float or int, + address: int): + builder = BinaryPayloadBuilder(byteorder=Endian.Big, + wordorder=Endian.Little) + builder.add_16bit_uint(number) + registers = builder.to_registers() + client.write_registers(address, registers) + + +def write_float_to_two_registers(client: ModbusTcpClient, + number: int or float, + address: int): + builder = BinaryPayloadBuilder(byteorder=Endian.Big, + wordorder=Endian.Little) + builder.add_32bit_float(number) + registers = builder.to_registers() + client.write_registers(address, registers) + + +def example_read_current_voltage(): + ''' + This function initiate a modbus connection with the robot and read the current and the voltage. + ''' + + # Set-up + # instantiate modbus client connection + client = ModbusTcpClient(IP_ADDRESS, PORT) + assert client.connect(), "Unable to connect to the slave" + + modbus_current = read_two_input_registers_to_one_float( + client, ARM_CURRENT_ADDRESS) + modbus_voltage = read_two_input_registers_to_one_float( + client, ARM_VOLTAGE_ADDRESS) + + print('Robot current: {} A'.format(modbus_current)) + print('Robot voltage: {} V'.format(modbus_voltage)) + + client.close() + + +def example_read_joints_position(): + ''' + This function initiate a modbus connection with the robot and read the position of every joint. + ''' + + # Set-up + # instantiate modbus client connection + client = ModbusTcpClient(IP_ADDRESS, PORT) + assert client.connect(), "Unable to connect to the slave" + + joint1_position = read_two_input_registers_to_one_float(client, JOINT_1_ADDRESS) + joint2_position = read_two_input_registers_to_one_float(client, JOINT_2_ADDRESS) + joint3_position = read_two_input_registers_to_one_float(client, JOINT_3_ADDRESS) + joint4_position = read_two_input_registers_to_one_float(client, JOINT_4_ADDRESS) + joint5_position = read_two_input_registers_to_one_float(client, JOINT_5_ADDRESS) + joint6_position = read_two_input_registers_to_one_float(client, JOINT_6_ADDRESS) + + print('Joint 1 position: {:.2f} degrees'.format(joint1_position)) + print('Joint 2 position: {:.2f} degrees'.format(joint2_position)) + print('Joint 3 position: {:.2f} degrees'.format(joint3_position)) + print('Joint 4 position: {:.2f} degrees'.format(joint4_position)) + print('Joint 5 position: {:.2f} degrees'.format(joint5_position)) + print('Joint 6 position: {:.2f} degrees'.format(joint6_position)) + + client.close() + + +def example_read_TCP(): + ''' + This function initiate a modbus connection with the robot and read the TCP(Tool Center Point) position. + ''' + + # Set-up + # instantiate modbus client connection + client = ModbusTcpClient(IP_ADDRESS, PORT) + assert client.connect(), "Unable to connect to the slave" + + tcp_x = read_two_input_registers_to_one_float(client, TCP_X_ADDRESS) + tcp_y = read_two_input_registers_to_one_float(client, TCP_Y_ADDRESS) + tcp_z = read_two_input_registers_to_one_float(client, TCP_Z_ADDRESS) + + tcp_theta_x = read_two_input_registers_to_one_float(client, TCP_THETA_X_ADDRESS) + tcp_theta_y = read_two_input_registers_to_one_float(client, TCP_THETA_Y_ADDRESS) + tcp_theta_z = read_two_input_registers_to_one_float(client, TCP_THETA_Z_ADDRESS) + + print('TCP x: {:.2f}m'.format(tcp_x)) + print('TCP y: {:.2f}m'.format(tcp_y)) + print('TCP z: {:.2f}m'.format(tcp_z)) + print('TCP theta x: {:.2f} degrees'.format(tcp_theta_x)) + print('TCP theta y: {:.2f} degrees'.format(tcp_theta_y)) + print('TCP theta z: {:.2f} degrees'.format(tcp_theta_z)) + + client.close() + + +def example_move(): + ''' + This function initiate a modbus connection with the robot and reach 2 Cartesian positions. + ''' + + # Set-up + # instantiate modbus client connection + client = ModbusTcpClient(IP_ADDRESS, PORT) + assert client.connect(), "Unable to connect to the slave" + + tcp_x = read_two_input_registers_to_one_float(client, TCP_X_ADDRESS) + tcp_y = read_two_input_registers_to_one_float(client, TCP_Y_ADDRESS) + tcp_z = read_two_input_registers_to_one_float(client, TCP_Z_ADDRESS) + + tcp_theta_x = read_two_input_registers_to_one_float(client, TCP_THETA_X_ADDRESS) + tcp_theta_y = read_two_input_registers_to_one_float(client, TCP_THETA_Y_ADDRESS) + tcp_theta_z = read_two_input_registers_to_one_float(client, TCP_THETA_Z_ADDRESS) + + # First position we want to reach. + TARGET_1_X = tcp_x + TARGET_1_Y = tcp_y + TARGET_1_Z = tcp_z + 0.2 + TARGET_1_THETA_X = tcp_theta_x + TARGET_1_THETA_Y = tcp_theta_y + TARGET_1_THETA_Z = tcp_theta_z + + # Second position we want to reach. + TARGET_2_X = tcp_x + TARGET_2_Y = tcp_y + TARGET_2_Z = tcp_z + TARGET_2_THETA_X = tcp_theta_x + TARGET_2_THETA_Y = tcp_theta_y + TARGET_2_THETA_Z = tcp_theta_z + + TRANSLATION_TOLERENCE = 0.02 + ORIENTATION_TOLERENCE = 1 + + # Initialize the control register. + write_uint16_to_one_register(client, NO_ACTION, ACTION_CONTROL_ADDRESS) + + # Set the type of action to Cartesian. + write_uint16_to_one_register(client, MOVE_TYPE_CARTESIAN, MOVE_TYPE_ADDRESS) + + # Send the Cartesian coordinates of the first position. + write_float_to_two_registers(client, TARGET_1_X, X_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_1_Y, Y_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_1_Z, Z_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_1_THETA_X, THETA_X_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_1_THETA_Y, THETA_Y_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_1_THETA_Z, THETA_Z_COMMAND_ADDRESS) + + # Start the action + print('Sending the first position') + write_uint16_to_one_register(client, ACTION_START, ACTION_CONTROL_ADDRESS) + + target_reached = False + + # While the target has not been reached we monitor the position + while(not target_reached): + tcp_x = read_two_input_registers_to_one_float(client, TCP_X_ADDRESS) + tcp_y = read_two_input_registers_to_one_float(client, TCP_Y_ADDRESS) + tcp_z = read_two_input_registers_to_one_float(client, TCP_Z_ADDRESS) + + tcp_theta_x = read_two_input_registers_to_one_float(client, TCP_THETA_X_ADDRESS) + tcp_theta_y = read_two_input_registers_to_one_float(client, TCP_THETA_Y_ADDRESS) + tcp_theta_z = read_two_input_registers_to_one_float(client, TCP_THETA_Z_ADDRESS) + + # If we have reached our target we stop the monitoring + if (isclose(tcp_x, TARGET_1_X, abs_tol = TRANSLATION_TOLERENCE) and isclose(tcp_y, TARGET_1_Y, abs_tol = TRANSLATION_TOLERENCE) and + isclose(tcp_z, TARGET_1_Z, abs_tol = TRANSLATION_TOLERENCE) and isclose(tcp_theta_x, TARGET_1_THETA_X, abs_tol = ORIENTATION_TOLERENCE) and + isclose(tcp_theta_y, TARGET_1_THETA_Y, abs_tol = ORIENTATION_TOLERENCE) and isclose(tcp_theta_z, TARGET_1_THETA_Z, abs_tol = ORIENTATION_TOLERENCE)): + target_reached = True + + # Stop the action + write_uint16_to_one_register(client, ACTION_STOP, ACTION_CONTROL_ADDRESS) + print('First position reached') + + target_reached = False + + # Send the Cartesian coordinates of the second position. The type of action has already been set + # above for the first position so we don't need to set it again. + write_float_to_two_registers(client, TARGET_2_X, X_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_2_Y, Y_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_2_Z, Z_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_2_THETA_X, THETA_X_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_2_THETA_Y, THETA_Y_COMMAND_ADDRESS) + write_float_to_two_registers(client, TARGET_2_THETA_Z, THETA_Z_COMMAND_ADDRESS) + + print('Sending the second position') + write_uint16_to_one_register(client, ACTION_START, ACTION_CONTROL_ADDRESS) + + # While the target has not been reached we monitor the position + while(not target_reached): + tcp_x = read_two_input_registers_to_one_float(client, TCP_X_ADDRESS) + tcp_y = read_two_input_registers_to_one_float(client, TCP_Y_ADDRESS) + tcp_z = read_two_input_registers_to_one_float(client, TCP_Z_ADDRESS) + + tcp_theta_x = read_two_input_registers_to_one_float(client, TCP_THETA_X_ADDRESS) + tcp_theta_y = read_two_input_registers_to_one_float(client, TCP_THETA_Y_ADDRESS) + tcp_theta_z = read_two_input_registers_to_one_float(client, TCP_THETA_Z_ADDRESS) + + # If we have reached our target + if (isclose(tcp_x, TARGET_2_X, abs_tol = TRANSLATION_TOLERENCE) and isclose(tcp_y, TARGET_2_Y, abs_tol = TRANSLATION_TOLERENCE) and + isclose(tcp_z, TARGET_2_Z, abs_tol = TRANSLATION_TOLERENCE) and isclose(tcp_theta_x, TARGET_2_THETA_X, abs_tol = ORIENTATION_TOLERENCE) and + isclose(tcp_theta_y, TARGET_2_THETA_Y, abs_tol = ORIENTATION_TOLERENCE) and isclose(tcp_theta_z, TARGET_2_THETA_Z, abs_tol = ORIENTATION_TOLERENCE)): + target_reached = True + + # Stop the action + write_uint16_to_one_register(client, ACTION_STOP, ACTION_CONTROL_ADDRESS) + print('Second position reached') + + + client.close() + + +def main(): + + # Call example + example_read_current_voltage() + example_read_joints_position() + example_read_TCP() + example_move() + + +if __name__ == "__main__": + main() diff --git a/modbus/examples/readme.md b/modbus/examples/readme.md new file mode 100644 index 00000000..d2bb35f8 --- /dev/null +++ b/modbus/examples/readme.md @@ -0,0 +1,82 @@ + + +# Modbus example + + + +- [Modbus example](#modbus-example) +- [Setup (pymodbus)](#setup-pymodbus) + - [Required Python version and module](#required-python-version-and-module) +- [How to use the examples](#how-to-use-the-examples) +- [Modbus ICD documentation](#modbus-icd-documentation) +- [Reference](#reference) + - [useful links](#useful-links) + - [Back to root topic: **readme.md**](#back-to-root-topic-readmemd) + + + +
+# Setup (pymodbus) + + + +## Required Python version and module + +- Python >= 3.5 +- pip +- pymodbus + +You can either install the modules manually or use the requirements.txt file that is inside the modbus example folder. + +```sh +python3 -m pip install -r requirements.txt +``` + +Refer to the main README for Python installation details: [parent readme](../../linked_md/python_quick_start.md) + + +# How to use the examples + +We assume the robot is using its default IP address: ``192.168.1.10`` + +Before starting, ensure that you run the test in a safe area with some examples that contain movement. Also, verify that your robot is correctly afixed to the working surface. + +Prerequisites: ++ The examples require a wired network connection to your computer ++ Configure a static IP address on your network interface (e.g. ``192.168.1.11/24``) + +Now you're ready to run the examples. Each Python example has its own ``__main__`` instruction. You need only to ``cd`` into the example directory and invoke the Python file using the command: + +- On Linux: +```sh +python3 .py +``` +- On Windows: +```sh +python .py +``` + + +# Modbus ICD documentation +Here's a link to the ICD documentation of the modbus slave. +[Modbus slave ICD](../../linked_md/modbus_icd.md) + + +# Reference + +#### useful links +| | | +| ---: | --- | +| Modbus technical resources | https://modbus.org/tech.php | +| Modbus Wikipedia: | [link](https://en.wikipedia.org/wiki/Modbus#:~:text=Modbus%20is%20a%20data%20communications,of%20connecting%20industrial%20electronic%20devices.) | + +__________________________ + + +## Back to root topic: **[readme.md](../../readme.md)** \ No newline at end of file diff --git a/modbus/examples/requirements.txt b/modbus/examples/requirements.txt new file mode 100644 index 00000000..fe031491 --- /dev/null +++ b/modbus/examples/requirements.txt @@ -0,0 +1 @@ +pymodbus==2.3.0 diff --git a/readme.md b/readme.md index e8c6183f..5fd28246 100644 --- a/readme.md +++ b/readme.md @@ -24,13 +24,14 @@ The repository has been tested on Windows 10, Ubuntu 16.04 and Ubuntu 18.04. - [Description](#description) - [Licensing](#licensing) -- [Role of Google Protocol Buffer in Kortex API](#role-of-google-protobuf-in-kortex-api) - - [Quick Start for Python users](#quick-start-howto-python) - - [Quick Start for C++ users](#quick-start-howto-cpp) -- [Download links](#api-download-links) -- [Build and run instructions](#build-and-run-instructions) +- [Role of Google Protocol Buffer in Kortex API](#role-of-google-protocol-buffer-in-kortex-api) + - [Quick Start for C++ users](#quick-start-for-c-users) + - [Quick Start for Python users](#quick-start-for-python-users) + - [Quick Start for modbus users](#quick-start-for-modbus-users) +- [Download links](#download-links) +- [Build and Run instructions](#build-and-run-instructions) - [Reference](#reference) - - [Useful Links](#useful-links) + - [Useful Links](#useful-links) @@ -50,6 +51,7 @@ Google Protocol Buffer offers structured data objects with standard methods for + iterators, dimension and appending methods on collections + many helpers (e.g. serialize/deserialize, I/O functions) + When using the Kortex API a developer will need to understand the Google Protocol Buffer feature set to maximize their efficiency. @@ -79,15 +81,28 @@ When using the Kortex API a developer will need to understand the Google Protoco - [Error management](./linked_md/python_error_management.md) - [Examples](./api_python/examples/readme.md) + +## Quick Start for modbus users +Since release 2.3.0, the Kortex API offers a modbus interface to communicate with the robot. + +All the data is formatted according to this: +- byte order: Big endian +- word order: Little endian + +- [Modbus ICD](./linked_md/modbus_icd.md) +- [Modbus examples](./modbus/examples/readme.md) + + + # Download links The latest download links for each arm type are reported in the table below: | Arm type | Firmware | Release notes | API | -| :------------- | :----------: | :-----------: | :-----------: -| Gen3 | [2.2.1](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-local-public&path=kortex%2Fgen3%2F2.2.1%2FGen3-2.2.1.swu) | [2.2.0](https://artifactory.kinovaapps.com/artifactory/generic-public/kortex/gen3/2.2.0/RN-001_KINOVA_Gen3_Ultra_lightweight_robot-Release_Notes_EN_R06.pdf) | [2.2.0](https://artifactory.kinovaapps.com/ui/repos/tree/General/generic-public%2Fkortex%2FAPI%2F2.2.0) -| Gen3 lite | [2.1.2](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-local-public&path=kortex%2Fgen3Lite%2F2.1.2%2FGen3Lite-2.1.2.swu) | [2.1.1](https://artifactory.kinovaapps.com/artifactory/generic-local-public/kortex/gen3Lite/2.1.1/RN-002_Gen3_lite_robot_Release_Notes_EN_R01.pdf) | [2.1.0](https://artifactory.kinovaapps.com/artifactory/generic-local-public/kortex/API/2.1.0/kortex_api_2.1.0.zip) +| :------------- | :----------: | :-----------: | :-----------:| +| Gen3 | [2.3.0](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-public&path=kortex%2Fgen3%2F2.3.0%2FGen3-2.3.0.swu) | [2.3.0](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-public&path=Documentation%2FGen3%2FTechnical%20documentation%2FRelease%20notes%2FRelease%20Notes%20-%20R07.pdf) | [2.3.0](https://artifactory.kinovaapps.com/ui/repos/tree/General/generic-public%2Fkortex%2FAPI%2F2.3.0)| +| Gen3 lite | [2.3.0](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-public&path=kortex%2Fgen3Lite%2F2.3.0%2FGen3-lite-2.3.0.swu) | [2.3.0](https://artifactory.kinovaapps.com/ui/api/v1/download?repoKey=generic-public&path=Documentation%2FGen3%20lite%2FTechnical%20documentation%2FRelease%20Notes%2FGen3_lite_robot_Release_Notes_2_3_0%20-%20R02.pdf) | [2.3.0](https://artifactory.kinovaapps.com/ui/repos/tree/General/generic-public%2Fkortex%2FAPI%2F2.3.0)| When following the link to Artifactory, to download the correct C++ API, you have to select the package for your architecture on the left-hand side tree view and then click Download on the right-hand side: @@ -97,6 +112,12 @@ When following the link to Artifactory, to download the correct C++ API, you hav

  • +Release 2.1.1 for Gen3 lite: Firmware, Release Notes, Kortex API +
  • +
  • +Release 2.2.0 for Gen3: Firmware, Release Notes, Kortex API +
  • +
  • Release 2.0.1 for Gen3: Firmware, Release Notes, Kortex API
  • @@ -105,8 +126,8 @@ Release 2.0.0 for Gen3: + # Build and Run instructions [C++ API](./api_cpp/examples/readme.md) @@ -116,7 +137,7 @@ Release 2.0.0 for Gen3: #### Useful Links -| | | -| ---: | --- | -| Kinova home page: | [https://www.kinovarobotics.com](https://www.kinovarobotics.com)| -| Google Protocol Buffers home page: | [https://developers.google.com/protocol-buffers](https://developers.google.com/protocol-buffers) | +| | | +| ---: | --- | +| Kinova home page: | [https://www.kinovarobotics.com](https://www.kinovarobotics.com)| +| Google Protocol Buffers home page: | [https://developers.google.com/protocol-buffers](https://developers.google.com/protocol-buffers) | \ No newline at end of file