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 35ed5d9f..924c5734 100644 Binary files a/linked_md/artifactory.png and b/linked_md/artifactory.png differ 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