From 4c8a0d407e72a19f960fd562525ef667108f24cf Mon Sep 17 00:00:00 2001 From: Gabriel St-Laurent Date: Wed, 26 Feb 2020 16:17:34 -0500 Subject: [PATCH] Add release 2.2 documentation --- simplified_api/README.md | 24 +- .../documentation/data_structure.md | 40 +++- .../documentation/images/Build&Run.PNG | Bin 0 -> 16638 bytes .../documentation/images/JetsonParameters.PNG | Bin 0 -> 4941 bytes simplified_api/documentation/images/Run.png | Bin 0 -> 23245 bytes .../documentation/images/kortexConfig.PNG | Bin 0 -> 20132 bytes simplified_api/documentation/mex_interface.md | 79 +++---- .../precomputed_joint_trajectories.md | 2 +- simplified_api/documentation/setup.md | 40 ++++ simplified_api/documentation/system_object.md | 219 ++++++++++++++++++ 10 files changed, 328 insertions(+), 76 deletions(-) create mode 100644 simplified_api/documentation/images/Build&Run.PNG create mode 100644 simplified_api/documentation/images/JetsonParameters.PNG create mode 100644 simplified_api/documentation/images/Run.png create mode 100644 simplified_api/documentation/images/kortexConfig.PNG create mode 100644 simplified_api/documentation/setup.md diff --git a/simplified_api/README.md b/simplified_api/README.md index 782fd96..f48b910 100644 --- a/simplified_api/README.md +++ b/simplified_api/README.md @@ -19,14 +19,17 @@ This software has been tested on **Ubuntu 16.04 (64-bit)** and **Windows 10** ## Download instructions -You can download the latest firmware package for the Gen3 from [here](https://artifactory.kinovaapps.com/artifactory/generic-local-public/kortex/gen3/2.0.0/Gen3-2.0.0.swu). - -You can download the latest Gen3 release notes from [here](https://artifactory.kinovaapps.com/artifactory/generic-local-public/kortex/gen3/2.0.0/RN-001_KINOVA_Gen3_Ultra_lightweight_robot-Release_Notes_EN_R04.pdf). - ## Installation Instructions -You can access the latest release of the MATLAB adaptor [here](https://artifactory.kinovaapps.com/artifactory/generic-local-public/kortex/matlab/simplified_API/2.0.0/matlab_simplified_api_2.0.0.zip) on the Kinova Artifactory. +You can access the latest release of the MATLAB adaptor [here](https://artifactory.kinovaapps.com/artifactory/webapp/#/artifacts/browse/tree/General/generic-local-public/kortex/matlab/simplified_api/) on the Kinova Artifactory. -Uncompress the MATLAB adaptor folders from the downloaded archive. +### Windows Operating System +From the Kinova Artifactory: +* Expand `kortex/matlab/simplified_api` to see the release folders +* Right-click on the desired release folder +* Select `Download` in the context menu +* Choose the desired Archive Type +* Click on `Download` +* Extract the MATLAB adaptor folders from the downloaded archive. ## Build instructions @@ -48,11 +51,8 @@ sudo apt install build-essential pkg-config ``` ### How to build -- Open MATLAB and navigate to the `mex-wrapper` folder. -- Add the current folder and all of its subfolders to the MATLAB path. -- Run the script `compileKortexMex.m` and wait until its completion. -You are now ready to use the KORTEX™ MEX (MATLAB executable) interface. +Refer to the dedicated page for [Setup](documentation/setup.md) ## Usage @@ -62,11 +62,13 @@ There are two ways to interact with the robot via MATLAB. 2. Using the MATLAB System object `kortex` (which itself uses the KORTEX™ API MEX interface) The KORTEX™ API MEX interface is the best option for controlling the arm via a MATLAB script. -The `kortex` System object on the other hand is intended for dynamical simulations of the robot as part of a system in [Simulink](https://www.mathworks.com/help/simulink/define-new-system-objects.html). +The `kortex` System object on the other hand is intended for dynamical simulations of the robot as part of a system in [Simulink](https://www.mathworks.com/help/simulink/define-new-system-objects.html). For more information on both options: * [MEX interface](documentation/mex_interface.md) * [System object](documentation/system_object.md) +In addtion, MATLAB Code Generation support for generating a ROS2 node and deploying the `kortex` System Object node directly on a NVidia Jetson Xavier platform is available. For more information, refer to the [ROS2 Code Generation on Jetson Target](documentation/setup.md#ROS2-Code-Generation-on-Jetson-Target) section in the Setup page. +For more information on MATLAB code generation, see this [Mathworks documentation page](https://www.mathworks.com/help/mpc/code-generation.html). diff --git a/simplified_api/documentation/data_structure.md b/simplified_api/documentation/data_structure.md index 23636ed..83f97cf 100644 --- a/simplified_api/documentation/data_structure.md +++ b/simplified_api/documentation/data_structure.md @@ -114,6 +114,22 @@ This is a data structure returned by most of the functions of the MEX interface. | uint32_t | code | A general [error code](#error-code-list) associated with this error. Most users will not need to work with this value because it does not tell much and is used internally in the Kortex API. | | uint32_t | sub_code | An [error sub code](#sub-error-code-list) that gives more information about the error. Most users will prefer to use this value instead of the general code. + +## MotorFeedback + +| Type | Name | Description | +|:-----:|:----:|:-----------:| +| uint32_t | motor_id | MessageId | +| uint32_t | status_flags | Status flags | +| uint32_t | jitter_comm | Jitter from the communication (in microsecond) | +| double | position | Position of the gripper motor (in Percentage 0-100%) | +| double | velocity | Velocity of the gripper motor (in Percentage 0-100%) | +| double | force | Force of the gripper motor | +| double | current_motor | Electric current of the gripper motor (in mA) | +| double | voltage | Voltage of the gripper motor (in V) | +| double | temperature_core | temparature of the core (in Celsius) | +| double | temperature_motor | temparature of the gripper motor (in Celsius) | + ## GripperFeedback @@ -126,13 +142,7 @@ This is a data structure returned by most of the functions of the MEX interface. | uint32_t | warning_bank_a | Warning bank A (see `GripperConfig.SafetyIdentifier`) | | uint32_t | warning_bank_b | Warning bank B (see `GripperConfig.SafetyIdentifier`) | | uint32_t | motor_count | Motor count on the gripper. | -| uint32_t\[GRIPPER_MAX_MOTOR_COUNT\] | motor_id | Motor ID | -| double\[GRIPPER_MAX_MOTOR_COUNT\] | motor_position | Position of the gripper fingers in percentage (0-100%) | -| double\[GRIPPER_MAX_MOTOR_COUNT\] | motor_velocity | Velocity of the gripper fingers in percentage (0-100%) | -| double\[GRIPPER_MAX_MOTOR_COUNT\] | motor_current_motor | Current comsumed by the gripper motor (mA) | -| double\[GRIPPER_MAX_MOTOR_COUNT\] | motor_voltage | Motor Voltage (V) | -| double\[GRIPPER_MAX_MOTOR_COUNT\] | motor_temperature_motor | Motor temperature. (degrees Celsius) | - +| [MotorFeedback](#motorfeedback)\[GRIPPER_MAX_MOTOR_COUNT\] | motor | Feedback of all gripper motors | ## InterconnectFeedback @@ -158,6 +168,16 @@ This is a data structure returned by most of the functions of the MEX interface. | double | difference_count_b | | | [GripperFeedback](#gripperfeedback) | gripper_feedback | Feedback data from gripper (if attached) | + +## DistortionCoefficients + +| Type | Name | Description | +|:-----:|:----:|:-----------:| +| double | k1 | First radial distortion coefficient | +| double | k2 | Second radial distortion coefficient | +| double | k3 | Third radial distortion coefficient | +| double | p1 | First tangential distortion coefficient | +| double | p2 | Second tangential distortion coefficient | ## IntrinsicParameters @@ -170,11 +190,7 @@ This is a data structure returned by most of the functions of the MEX interface. | double | principal_point_y | Vertical coordinate of the principal point of the image, as a pixel offset from the top edge | | double | focal_length_x | Focal length of the image plane, as a multiple of pixel width | | double | focal_length_y | Focal length of the image plane, as a multiple of pixel height | -| double | k1 | First radial distortion coefficient | -| double | k2 | Second radial distortion coefficient | -| double | k3 | Third radial distortion coefficient | -| double | p1 | First tangential distortion coefficient | -| double | p2 | Second tangential distortion coefficient | +| [DistortionCoefficients](#distortioncoefficients) | distortion_coeffs | Distortion Coefficients | diff --git a/simplified_api/documentation/images/Build&Run.PNG b/simplified_api/documentation/images/Build&Run.PNG new file mode 100644 index 0000000000000000000000000000000000000000..02ad53646622e2102817b8df13352570c96f6246 GIT binary patch literal 16638 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 LB3310=>LBJ!H{Ef literal 0 HcmV?d00001 diff --git a/simplified_api/documentation/images/JetsonParameters.PNG b/simplified_api/documentation/images/JetsonParameters.PNG new file mode 100644 index 0000000000000000000000000000000000000000..5fb41233d59a9c60acc67ab083e7842b0eb8bcd0 GIT binary patch literal 4941 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 Zz3jMt4VkTc`rAcEXQ*qYQ>Jx4>OU5knp^+? literal 0 HcmV?d00001 diff --git a/simplified_api/documentation/images/Run.png b/simplified_api/documentation/images/Run.png new file mode 100644 index 0000000000000000000000000000000000000000..8a87e1add337c7cf60c5b577f3b49f5cc21f1f42 GIT binary patch literal 23245 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 Z9I>Un8cyqafG5i_c)I$ztaD0e0stm^ZwLSY literal 0 HcmV?d00001 diff --git a/simplified_api/documentation/mex_interface.md b/simplified_api/documentation/mex_interface.md index 40da944..9e73041 100644 --- a/simplified_api/documentation/mex_interface.md +++ b/simplified_api/documentation/mex_interface.md @@ -43,9 +43,8 @@ This function initializes the KORTEX™ API that operates underneath the MEX int | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | -| uint32_t | An handle to the API. this handle will be needed by most of the function of this MEX interface.| +| uint32_t | An error code (`0` for success or non-zero for failure). | +| uint32_t | An handle to the API. This handle will be needed by most of the function of this MEX interface.| | uint32_t | The device ID of the vision module attached to the robot. | #### DestroyRobotApisWrapper @@ -61,8 +60,7 @@ This function closes the connection with the KORTEX™ API cleanly. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### SetAdmittance @@ -79,8 +77,7 @@ Set the robot into admittance mode. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### SetServoingMode Set the robot servoing mode. @@ -96,8 +93,7 @@ Set the robot servoing mode. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success(true) or not(false). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | --- @@ -116,8 +112,7 @@ Apply the emergency stop on the robot. The robot should stop moving and go to th | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### ClearFaults Try to clear the faults on the robot. If the robot is in a fault state, you should see a red LED on the robot's base. @@ -132,8 +127,7 @@ Try to clear the faults on the robot. If the robot is in a fault state, you shou | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### Reboot @@ -149,8 +143,7 @@ Reboot the robot. Warning: the robot may fall slowly for a short time because du | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### StopAction @@ -166,8 +159,7 @@ Stop the current trajectory. | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### PauseAction Pause the current trajectory. @@ -182,8 +174,7 @@ Pause the current trajectory. | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### ResumeAction Resume the current trajectory. @@ -198,8 +189,7 @@ Resume the current trajectory. | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | --- @@ -219,8 +209,7 @@ Returns the joint count of the robot. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | uint32_t | The joint count. | @@ -237,8 +226,7 @@ Returns the status of the robot. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | int32_t | Status of the robot. This value is described [here](data_structure.md#movementstatus). | @@ -255,8 +243,7 @@ It returns the feedback data from the base, the joints and tool. | C++ Type | Description | |:-------------:|:-------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | [BaseFeedback](data_structure.md#basefeedback) | Feedback data for the base. | | [ActuatorsFeedback](data_structure.md#actuatorsfeedback) | Feedback data for each joint. | | [InterconnectFeedback](data_structure.md#interconnectfeedback) | Feedback data for the interface module, including gripper. | @@ -275,7 +262,7 @@ Move the robot to a specific Cartesian pose. The orientation is represented with |:-------------:|:----------------------------------------------------------------------------------------------------------------:| | uint32_t | API Handle. | | int32_t | The [CartesianConstraintType](data_structure.md#cartesianconstrainttype) applied on the movement. | -| double\[2\] | Speed limitation that will be applied on the trajectory if the constraint has been set to CARTESIAN_CONSTRAINT_SPEED. The first value is the translation velocity and the second value is not used for now. | +| double\[2\] | Speed limitation that will be applied on the trajectory if the constraint has been set to CARTESIAN_CONSTRAINT_SPEED. The first value is the translation velocity and the second value is the orientation velocity. | | double | Not supported for now. | | double\[3\] | Translation (X, Y, Z) in meters. | | double\[3\] | Orientation. (X(gamma), Y(beta), Z(alpha)) in degrees. (**Tait-Bryan, extrinsic ZYX**) | @@ -284,8 +271,7 @@ Move the robot to a specific Cartesian pose. The orientation is represented with | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### ReachJointAngles Move the robot to a specific joint pose. @@ -305,8 +291,7 @@ Move the robot to a specific joint pose. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### SendJointSpeedCommand Move the robot using a speed command. @@ -324,8 +309,7 @@ Move the robot using a speed command. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### SendToolCommand Move the robot tool. For now, our gripper is considered as one tool so only one command (first index) is needed to move the tool. @@ -344,8 +328,7 @@ Move the robot tool. For now, our gripper is considered as one tool so only one | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### PlayPreComputedTrajectory @@ -366,8 +349,7 @@ Send a Precomputed Joint Trajectory to the robot. A Precomputed Joint Trajectory | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | --- @@ -392,8 +374,7 @@ Configure one of the sensors (either 2D or 3D) of the vision module. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### SetOptionValue Configure a specific option out of the options available on the vision module. @@ -411,8 +392,7 @@ Configure a specific option out of the options available on the vision module. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### InitVision Initialize the vision module API. @@ -427,8 +407,7 @@ Initialize the vision module API. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | #### GetSensorSettings Get the configuration of a specific sensor(2D or 3D) of the vision module. @@ -444,8 +423,7 @@ Get the configuration of a specific sensor(2D or 3D) of the vision module. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | uint32_t | The resolution of the sensor. See [Resolution](data_structure.md#resolution). | | uint32_t | The frame rate of the sensor. See [FrameRate](data_structure.md#framerate). | | uint32_t | The bit rate of the sensor. See [BitRate](data_structure.md#bitrate). | @@ -465,8 +443,7 @@ Get the value of a specific option from a specific sensor (eitrher 2D or 3D) of | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | uint32_t | The resolution of the sensor. This value is described [here](data_structure.md#resolution). | | uint32_t | The frame rate of the sensor. This value is described [here](data_structure.md#framerate). | | uint32_t | The bit rate of the sensor. This value is described [here](data_structure.md#bitrate). | @@ -525,8 +502,7 @@ Returns the last error that occurred in the API. | C++ Type | Description | |:--------------:|:-------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | uint32_t | The error code of the last error triggered by the Kortex API. | #### GetErrorName @@ -543,8 +519,7 @@ Returns a string that describe the error code provided as an input. | C++ Type | Description | |:-------------:|:----------------------------------------------------------------------------------------------------------------:| -| bool | A flag that tells if the operation was a success (`true`) or not (`false`). | -| [ErrorStructMatrix](data_structure.md#errorstructmatrix) | A data structure that contains the error code if the operation was not a success. | +| uint32_t | An error code (`0` for success or non-zero for failure). | | char * | The name that describe the error code. | diff --git a/simplified_api/documentation/precomputed_joint_trajectories.md b/simplified_api/documentation/precomputed_joint_trajectories.md index 0cb00c1..0994625 100644 --- a/simplified_api/documentation/precomputed_joint_trajectories.md +++ b/simplified_api/documentation/precomputed_joint_trajectories.md @@ -7,7 +7,7 @@ The Precomputed Joint Trajectories is the way to send the arm through joint-spac ### kObjTrajectoryFeeder object -The kObjTrajectoryFeeder object in the example Simulink model (`mex-wrapper/example_model.slx`) reads a Precomputed Joint Trajectory (computed offline with a motion planner) from a CSV file(`mex-wrapper/testpoints.csv`) and sends it to the kortex System Object. You will most likely create your own object to send your trajectories to the kortex System object. +The kObjTrajectoryFeeder object in the [example Simulink model](../mex-wrapper/example_model.slx) reads a Precomputed Joint Trajectory (computed offline with a motion planner) from a [CSV file](../mex-wrapper/testpoints.csv) and sends it to the kortex System Object. You will most likely create your own object to send your trajectories to the kortex System object. ### Structure of the input arrays diff --git a/simplified_api/documentation/setup.md b/simplified_api/documentation/setup.md new file mode 100644 index 0000000..82f9f4f --- /dev/null +++ b/simplified_api/documentation/setup.md @@ -0,0 +1,40 @@ +# Kortex System Object Setup Guide + +## Overview + +## Matlab Setup + +1. Open the `mex-wrapper` sub-folder in Matlab +2. Add the `matlab_api` folder and its sub-folders to the Matlab path +3. Open the `example_model.slx` Simulink model + +## Interpreted Execution + +1. Run `compileKortexMex.m` +2. Edit both `kortex` and `kObjTrajectoryFeeder` Simulink objects with Kinova Robot information +3. In Simulink, click on `Run` in the Simulate tab + + ![alt text](images/Run.png) + +## ROS2 Code Generation on Jetson Target + +1. Edit the `rosTargetPreferences.m` file with Jetson parameters + + ![Jetson Parameters](images/JetsonParameters.PNG) + +2. Run `configKortexModelROS2.m` +3. Edit both `kortex` and `kObjTrajectoryFeeder` Simulink objects with Kinova Robot information + + ![Configuration](images/kortexConfig.PNG) + +4. Open the Robot tab in Simulink +5. Select the ROS2 framework +6. Click on `Build & Run` + + ![Build & Run](images/Build&Run.PNG) + +The `Build & Run` will additionally do the following: + +1. Transfer the generated ROS2 package directly on the Jetson target +2. Compile on the Jetson target (using Colcon tools) +3. Run the compiled ROS2 package on the Jetson Target diff --git a/simplified_api/documentation/system_object.md b/simplified_api/documentation/system_object.md index fae6141..8c1a8ce 100644 --- a/simplified_api/documentation/system_object.md +++ b/simplified_api/documentation/system_object.md @@ -142,3 +142,222 @@ The configuration data of the vision system. This consists of several fields whi #### is_moving A Boolean flag that tells if the robot is moving (`true`) or not (`false`). + +### Functions + +#### SendCmd_Reboot +This function performs a software reboot on the gen3 robot. +**WARNING** Make sure the robot is in a secure position because all the joints will stop servoing and the robot will fall. + +##### Function Inputs +No input + +##### Function Outputs +| Name | Type | Description | +|:--------:|:------:|---------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + +#### GetExtrinsic +This function returns the extrinsic parameters of the camera. + +##### Function Inputs +No input + +##### Function Outputs +| Name | Type | Description | +|:---------:|:------------------:|---------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| extrinsic | Bus_ExtrinsicParam | A struct that contains all the cameras's extrinsic parameters. | + +#### GetIntrinsic +This function returns the intrinsic parameters of the camera. + +##### Function Inputs +| Name | Type | Description | +|:---------:|:------------------:|--------------------------------------------------------------------------| +| sensor | uint32 | ID of the target sensor that the intrinsic parameters will be read from. | + +##### Function Outputs +| Name | Type | Description | +|:---------:|:------------------:|---------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| intrinsic | Bus_IntrinsicParam | A struct that contains all the cameras's extrinsic parameters. | + +#### GetMovementStatus +This function returns the current movement status of the gen3 robot. + +##### Function Inputs +No input + +##### Function Outputs +| Name | Type | Description | +|:--------:|:-------|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| status | uint32 | Current movement status. Based on C enum MovementStatus from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +#### GetOptionValue +This function returns the value of an option on a specific sensor. + +##### Function Inputs +| Name | Type | Description | +|:---------:|:-------:|-----------------------------------------------------------------------------------------------------------| +| sensor | uint32 | Target sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| option | uint32 | Target option. Based on C enum **Option** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +##### Function Outputs +| Name | Type | Description | +|:---------:|:------------------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| value | uint32 | Value of the targeted option. | + +#### GetSensorSettings +This function returns the configured settings of a specific sensor. + +##### Function Inputs +| Name | Type | Description | +|:---------:|:-------:|-----------------------------------------------------------------------------------------------------------| +| sensor | uint32 | Target sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| resolution | uint32 | Resolution of the targeted sensor. Based on the C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| frame_rate | uint32 | Frame rate of the targeted sensor. Resolution of the targeted sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| bit_rate | uint32 | Bit rate of the targeted sensor. Resolution of the targeted sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +#### GetSensorSettings +This function returns the configured settings of a specific sensor. + +##### Function Inputs +| Name | Type | Description | +|:---------:|:-------:|-----------------------------------------------------------------------------------------------------------| +| sensor | uint32 | Target sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + | +| resolution | uint32 | Resolution of the targeted sensor. Based on the C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| frame_rate | uint32 | Frame rate of the targeted sensor. Resolution of the targeted sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| bit_rate | uint32 | Bit rate of the targeted sensor. Resolution of the targeted sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +#### DoSensorFocusAction +Execute a focus action on the camera. You can find a C++ example [here](https://github.com/Kinovarobotics/kortex/blob/master/api_cpp/examples/500-Vision/03_vision_sensor_focus_action.cpp) that explains how to use this function. + +##### Function Inputs +| Name | Type | Description | +|:-------------:|:-------:|-----------------------------------------------------------------------------------------------------------| +| sensor | uint32 | Target sensor. Based on C enum **Sensor** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | +| focus_action | uint32 | Target sensor. Based on C enum **FocusAction** from [kortex_wrapper_data.h](../mex-wrapper/include/kortex_wrapper_data.h). | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + | + +#### SendCartesianPose +Send a Cartesian pose to the robot. The orientation is represented with Euler angles and the convention used is the **Tait-Bryan, extrinsic ZYX**. + +##### Function Inputs +| Name | Type | Description | +|:----------------:|:----------------------------:|-----------------------------------------------------------------------------------------------------------| +| cartesian_cmd | double[6] | Cartesian command. [X, Y, Z, THETA_X, THETA_Y, THETA_Z] Translation in meters and orientation in degrees.| +| constraint_type | enum CartesianConstraintType | Type of constraint. Based on [CartesianConstraintType](data_structure.md). | +| speeds | double[2] | Translation and orientation speed. [TRANSLATION_SPEED, ORIENTATION_SPEED]. Translation in m / s and orientation in °/s| +| duration | uint32 | Not supported for now. | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + +#### SendJointAngles +Send a joint pose to the robot. All angles are in degrees. + +##### Function Inputs +| Name | Type | Description | +|:---------------:|:------------------------:|-----------------------------------------------------------------------------------------------------------| +| joint_cmd | double[ACTUATOR_COUNT] | Joint command, in degrees, where ACTUATOR_COUNT is the actual actuator count. The first index is the nearest joint to the base and the last index is the nearest joint to the gripper. | +| constraintType | enum JointConstraintType | Type of constraint. Based on [CartesianConstraintType](data_structure.md). | +| speed | double | Speed limitation, in degrees / second, that will be applied on the trajectory if the constraint has been set to JOINT_CONSTRAINT_SPEED.| +| duration | uint32 | Time limitation, in second, that will be applied on the trajectory if the constraint has been set to JOINT_CONSTRAINT_DURATION. | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + +#### SendPreComputedTrajectory +Send a Precomputed Joint Trajectory to the robot. A Precomputed Joint Trajectory is a set of (timestamp, angular position, angular velocity, angular acceleration) for each joint at each increment of the trajectory. Together, this represents a trajectory. For more information on the Precomputed Joint Trajectories, you can read [the documentation on Precomputed Joint Trajectories](./precomputed_joint_trajectories.md). + +##### Function Inputs +| Name | Type | Description | +|:--------------:|:------------------------:|-----------------------------------------------------------------------------------------------------------| +| position | double[ACTUATOR_COUNT][] | A matrix that contains a list of angular positions (degrees) for each joint at each increment. | +| velocity | double[ACTUATOR_COUNT][] | A matrix that contains a list of angular velocities (degrees / second) for each joint at each increment. | +| acceleration | double[ACTUATOR_COUNT][] | A matrix that contains a list of angular accelerations (degrees / second ^ squared) for each joint at each increment. | +| timestamp_sec | double[ACTUATOR_COUNT][] | A matrix that contains a list of timestamps for each joint at each increment. | + +##### Function Outputs +| Name | Type | Description | +|:----------:|:------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + +#### SendRefreshFeedback +It returns the feedback data from the base, the joints and tool. + +##### Function Inputs +No input + +##### Function Outputs +| Name | Type | Description | +|:--------------------:|:------------------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | +| baseFeedback | Bus_BaseFeedback | Feedback data from the Base. See [BaseFeedBack](data_structure.md#basefeedback). | +| jointsFeedback | Bus_JointsFeedback | Feedback data from each joint. See [ActuatorsFeedback](data_structure.md#actuatorsfeedback). | +| interconnectFeedback | Bus_ToolFeedback | Feedback data from the Base. See [InterconnectFeedBack](data_structure.md#interconnectfeedback). | + +#### SendToolCommand +A command to control the gripper movement + +##### Function Inputs +| Name | Type | Description | +|:--------------:|:------------------------:|-----------------------------------------------------------------------------------------------------------| +| tool_cmd_mode | uint32 | Command mode. Based on [ToolMode](data_structure.md). | +| duration | double | Duration constraint. If not 0, allows to set a limit (in seconds) to the tool_cmd. | +| tool_cmd | double[TOOL_COUNT] | Gripper movement values for each tool. (Most of the time you only have 1 tool.) In position, admissible values for each finger is between 0 and 1.0, where 0 is fully open and 1.0 is fully closed. In speed, admissible values for each finger is between -1.0 and 1.0, where 1.0 corresponds to maximum opening speed and -1.0 corresponds to maximum closing speed.| + +##### Function Outputs +| Name | Type | Description | +|:--------------------:|:------------------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + + +#### SetAdmittance +Activate the admittance mode. + +##### Function Inputs +| Name | Type | Description | +|:---------------:|:------:|-----------------------------------------------------------------------------------------------------------| +| admittanceMode | uint32 | Admittance mode. Based on [AdmittanceMode](data_structure.md). | + +##### Function Outputs +| Name | Type | Description | +|:--------------------:|:------------------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. | + +#### SetServoingMode +Set the robot's servoing mode. + +##### Function Inputs +| Name | Type | Description | +|:---------------:|:------:|-----------------------------------------------------------------------------------------------------------| +| servoingMode | uint32 | Servoing mode. Based on [ServoingMode](data_structure.md). | + +##### Function Outputs +| Name | Type | Description | +|:--------------------:|:------------------:|-----------------------------------------------------------------------------------------------------------| +| isOk | bool | A flag that indicates if the function has been executed correctly. |