Releases: flexivrobotics/flexiv_rdk
Releases · flexivrobotics/flexiv_rdk
v1.8
COMPATIBILITY
- Flexiv software package v3.10
ADD
- Support creating lite instances of
rdk::Robotvia a constructor parameter. AddRobot::lite()to check if this instance is a lite instance. - Add new member
has_FT_sensortoRobotInfostruct. - Add new members
timestamp,tau_interact, andtemperature(#128) toRobotStatesstruct. - Add
Model::T()to compute the forward kinematics of a specified robot link (#121). - Add new methods
SetTimelinessFailureLimit(),StopPlan(),SetMaxContactTorque(),SetJointInertiaScale(), andSyncWithPositioner()tordk::Robot. - Add new methods
projects_list(),UploadProject()(#124), andDownloadProject()tordk::FileIO. - Add input parameter
velocitytoRobot::SendCartesianMotionForce()(#135). - Add new test
test_repeated_instantiation. - Add new build type
MinSizeRel. - Add building on Ubuntu 24.04 to github workflow.
CHANGE
- Upgrade the online trajectory generator used by non-real-time joint control modes, resulting in the removal of input parameter
accelerationsofRobot::SendJointPosition(). - Upgrade linked Eigen version to v3.4.0, update the QNX patch accordingly.
- Upgrade linked Fast-DDS version to v2.6.10.
- Change exception type of
Model::J()andModel::dJ()fromstd::out_of_rangetostd::invalid_argument. - Remove deprecated
Robot::SetDigitalOutputs()overloading. - Check if the input parameters
max_velandmax_accofRobot::SendJointPosition()are positive numbers. - Increase file transfer max size to 1 MB.
- Improve API docs.
- Add Important Notice section to README.
- Update thirdparty build scripts to clone into a branch directly.
- Remove git-tracked static libraries. The library is now downloaded when configuring CMake.
- Add reference hash values to check the downloaded library.
- Add CMake option to support ROS2 Jazzy.
FIX
v1.7
COMPATIBILITY
- Flexiv software package v3.9
ADD
- Add constructor parameter
verbosetordk::Robotto enable or disable info and warning prints globally for the class. - Add
rdk::RobotEventstruct todata.hppthat contains information about a robot event. - Add
RobotInfo::DoF_eandDoF_mto represent the joint-space degrees of freedom of the external axes and the robot manipulator respectively. - Add
Robot::LockExternalAxes()to lock or unlock external axes (if any) during primitive execution, direct joint control, and direct Cartesian control modes. - Add
FileIO::traj_files_list()andFileIO::DownloadTrajFile(). - Add new control mode
NRT_SUPER_PRIMITIVEto run super primitives, i.e. composite tasks that consist of various components like motion, force, vision, planning, etc. - Add
Model::configuration_score()to get the score of the robot's current configuration (posture), calculated from the manipulability measurements and can be used to indicate singularity. - Add
Tool::CalibratePayloadParams()to calibrate the payload parameters (mass, CoM, and inertia) of a tool. - Add warning notes to
rdk::Safetyfunctions. - Define
DeviceParamDataTypesalias indevice.hpp. - Add URDF and mesh files for Rizon 4M (medical version).
- Add URDF and mesh files for Rizon 4R (mirrored version).
CHANGE
RobotInfo::DoFnow represents the total degrees of freedom of the whole system, including external axes (if any) and the robot manipulator.- Remove
RobotStates::q_e,dq_e, andtau_e. They are now merged intoq,dq, andtau. - Remove IDLE mode requirement for functions in
rdk::FileIO. - Remove the optional input parameter
propertiesfromRobot::ExecutePrimitive(), update examples accordingly. If you are using the propertylockExternalAxes, please change to use the newly addedRobot::LockExternalAxes(). - Remove
constspecifier from the value copy returned by any function. This helps with semantics-based compiler optimization. - Replace
Robot::mu_log()withRobot::event_log(). - Remove the optional input parameter
verbosefromRobot::operational(), the printed information is already included inRobot::operational_status(). - Remove warning print from
Robot::RunAutoRecovery()if the robot is currently not in recovery mode. - Change
std::logic_errortostd::invalid_argumentforrdk::Devicefunctions if the specified device does not exist. - Change
std::logic_errortostd::invalid_argumentforrdk::Gripperfunctions if the specified gripper does not exist. - Change
std::logic_errortostd::invalid_argumentforrdk::Toolfunctions if the specified tool does not exist. - Change
std::logic_errortostd::invalid_argumentforrdk::WorkCoordfunctions if the specified work coordinate does not exist. - Change
std::logic_errortostd::invalid_argumentforRobot::SetGlobalVariables()if any of the specified global variables does not exist. - Change the default values of input parameter
Z_qofRobot::SetJointImpedance()from a vector of 0.7 to an empty vector. - Change
Robot::Enable()to throw exception instead of print warning message if E-stop is not released yet. - Change
Gripper::Grasp()andGripper::Move()to throw exception instead of quietly saturate if any input parameter is outside its valid range. - Change the input parameter
force_limitofGripper::Move()from optional to mandatory. - Overload
Robot::SetDigitalOutputs()with a new version that takes in anstd::mapinput parameter. Also mark the old version as deprecated. - Rename members in
rdk::JPosandrdk::Coord. - Update and rename URDF of Rizon 4, Rizon 4s, Rizon 10, and Rizon 10s, removed fields.
- Update usage of the
ZeroFTSensorprimitive in examples.
FIX
- Fix bug where the kinematic calibration result is not included when calling
Model::SyncURDF()(#82). - Add missing
.mtlmaterial files corresponding to the.objmesh files. - Fix various corrupted
link7.objmesh files. - Fix occasional error "[flexiv::rdk::Robot::SwitchMode] Failed to transit the robot into specified control mode".
v1.6
COMPATIBILITY
- Flexiv software package v3.8
ADD
- Add new API
rdk::Maintenance(#62). - Add new API
rdk::Safety(#85). - Add
GripperStates::is_moving. - Add
Gripper::Enable()andGripper::Disable(). - Add
Gripper::params()andrdk::GripperParamsstruct accordingly. - Add
Device::params(). - Add bool type to the input variant of
Device::Command(). - Overload
utility::Rad2Deg().
CHANGE
- Remove Python libs and related contents from CMakeLists.txt,
flexivrdkcan now be installed directly usingpip: https://pypi.org/project/flexivrdk/ (#88). - Remove
Gripper::moving(), replaced byGripperStates::is_moving. - Remove
GripperStates::max_width, replaced byGripperParams::max_width. - Remove deprecated functions that were marked to be removed in this release.
- Remove
RobotStates::tcp_pose_des, this data is now covered by Flexiv DDK. - Update gripper control examples with new API usage.
- Update program arguments documentation in all examples.
- Move definition of
rdk::ToolParamsstruct fromdata.hpptotool.hpp, the scope is not changed. - Move definition of
rdk::GripperParamsstruct andrdk::GripperStatesstruct fromdata.hpptogripper.hpp. - Update README.
FIX
v1.5.1
COMPATIBILITY
- Flexiv software package v3.7.1
ADD
- Expose read/write of the two pairs of digital input/output ports inside the robot's wrist connector.
- Add input parameter
network_interface_whitelisttordk::Robotconstructor to allow limiting the network interface(s) that can be used for establishing connection with the robot. - Add input parameter
propertiestoRobot::ExecutePrimitive(). - Add struct
JPosto represent the customized data type JPOS in Flexiv Elements. Update examples accordingly.
CHANGE
- Remove linking to
fastcdr, not needed. - Use shared steps in GitHub workflow.
- Use GitHub-hosted runner for macOS workflow jobs.
- Improve resource efficiency of background communication services.
- Update README.
FIX
- Fix definition for member of
rdk::Coordstruct. - Fix a bug that causes occasional "Failed to sync server version" error when trying to establish connection with the robot.
v1.5
COMPATIBILITY
- Flexiv software package v3.7
ADD
- Add support to use Cartesian motion-force control modes with the Moonlight delta robot.
- Add an overload of
Robot::SetGlobalVariables()that takes in anstd::mapinstead of a long string. The old version will be deprecated. - Add an overload of
Robot::global_variables()that returns anstd::mapinstead of a string list. The old version will be deprecated. - Add an overload of
Robot::ExecutePrimitive()that takes in anstd::mapinstead of long sting. The old version will be deprecated. - Add an overload of
Robot::primitive_states()that returns anstd::mapinstead of a string list. The old version will be deprecated. - Add type alias
FlexivDataTypesto represent a variant that holds all possible types of data exchanged with Flexiv robots using the new overloaded functions above. - Add
utility::FlexivTypes2Str()to convert data held inFlexivDataTypesto a single string. - Add
rdk::Coordstruct to be used withFlexivDataTypesvariant. - Add function
Robot::SetNullSpaceObjectives()to set weights of the three optimization objectives while computing the robot's null-space posture. - Add API
flexiv::rdk::WorkCoordto online update and interact with the robot's work coordinates (#58, #66). - Add enum
rdk::CoordTypeto represent commonly-used reference coordinates. - Add
Robot::operational_status()with enum return type (#67, #81). - Add
Robot::reduced()to check for safety system's reduced state (#67). - Add new input parameter block_until_started to
Robot::ExecutePlan()andRobot::ExecutePrimitive()(#76). - Add input parameter
velocitytoRobot::StreamCartesianMotionForce()so users have the option to improve the robot's tracking performance at the cost of reduced robustness or vice versa. - Add
Device::exist()to check if the specified device exists. - Add
Model::SyncURDF()to cync the actual kinematic parameters of the connected robot into the template URDF (#82). - Add
RobotInfo::license_type. - Add external axes states to
RobotStates. - Add
RobotStates::ext_wrench_in_tcp_rawandRobotStates::ext_wrench_in_world_rawthat contain unfiltered external wrench data. - Add C++ and Python examples for global variable functions.
- Add urgency scale to feature request template.
CHANGE
- Allow
Robot::SetGlobalVariables()to be called in any control mode instead of only inNRT_PLAN_EXECUTIONmode. - Change
Robot::SetCartesianImpedance()to blocking, and the robot will not reset to nominal Cartesian impedance upon re-entering the applicable control modes; the setting will persist. - Remove
Robot::ResetCartesianImpedance(), the user has enough info to reset the impedance usingRobot::SetCartesianImpedance(). - Change
Robot::SetJointImpedance()to blocking, and the robot will not reset to nominal joint impedance upon re-entering the applicable control modes; the setting will persist. - Remove
Robot::ResetJointImpedance(), the user has enough info to reset the impedance usingRobot::SetJointImpedance(). - Change
Robot::SetMaxContactWrench()to blocking, and the robot will not reset to disable contact wrench regulation upon re-entering the applicable control modes; the setting will persist. - Remove
Robot::ResetMaxContactWrench(), the user has enough info to disable contact wrench regulation usingRobot::SetMaxContactWrench(). - Change
Robot::SetNullSpacePosture()to blocking. - Remove
Robot::ResetNullSpacePosture(), the user has enough info to reset to initial reference positions usingRobot::SetNullSpacePosture(). - Change
Robot::SetForceControlAxis()to blocking, and allow it to be called when in motion force-control modes. - Change
Robot::SetForceControlFrame()to blocking, and allow it to be called when in motion force-control modes. - Support setting a user-defined arbitrary force control frame with regard to either WORLD or TCP frame using
Robot::SetForceControlFrame()(#78). - Change
Robot::SetPassiveForceControl()to blocking. - Flip the force command direction in motion-force control modes to make the behavior consistent with Flexiv Elements.
- Throw exception in
Tool::Add(),Tool::Switch(),Tool::Update(),Tool::Remove(), andTool::params()if the specified tool does not exist. - Throw exception in
Device::Enable(),Device::Disable(), andDevice::Command()if the specified device does not exist. - Throw exception in
Device::Command()if the commanded device is not enabled. Device::Command()uses variant to represent command values.- Remove mandatory blocking of
Gripper::Init(), user needs to implement the wait accordingly. - Change
enum Modeto scopedenum class Mode. - Use
Robot::SetDigitalOutputs()to deprecateWriteDigitalOutput(). - Use
Robot::digital_inputs()to deprecateReadDigitalInput(). - Remove
utility::ParsePtStates(), no longer needed. - The "Home" primitive now does not terminate by itself, thus change termination check condition from
busy() == falsetoreachedTarget == true. - Update warning doc of
Robot::ExecutePrimitive()about primitives' self-termination. - Internal plans (those not created by user) now cannot be resumed from pause due to safety concerns.
- Remove input parameter
trailing_spacefromutility::Vec2Str()andArr2Str(). - Change the term "preferred positions" to "reference positions" to be consistent with Flexiv Elements.
- Decrease the nominal rotation stiffness from 3000 to 1500 Nm/rad for Rizon 4 variants and from 6000 to 3000 Nm/rad for Rizon 10 varients due to stability concerns.
- Remove excessive prints.
- Update API usages in examples.
- Update website links.
FIX
- Fix
cmake/FlexivInstallLibrary.cmakethat exports the wrong project version. - Specify
-DCMAKE_PREFIX_PATHin thirdparty build scripts so they don't accidentally link to existing dependencies in system path. - Fix connection loss with the robot when network condition is bad.
- Fix the issue where spdlog's log level is not reset when the construction of
rdk::Robotis incomplete.
v1.4
NOTE
This release note is based on changes since v1.3. If you are switching from v0.x to v1.x for the first time, you might want to review all release notes since the v1.0 pre-release,
COMPATIBILITY
- Flexiv software package v3.6
ADD
- Add sub-namespace:
flexiv::now becomesflexiv::rdk::. - Add support for Rizon medical model
Rizon4M. - Add support for the force-controlled delta robot
Moonlight. - Add support of
flexiv::rdk::ModelAPI for Python RDK. Addintermediate5_robot_dynamics.pyexample accordingly. - Add installation of Python RDK libraries to the user site packages path, using CMake. Remove
sys.path.insert()from Python examples accordingly. - Add
RobotInfo::K_q_nom, nominal motion stiffness of the joint impedance control modes of the connected robot. - Add
RobotInfo::model_name, model name of the connected robot, e.g. Rizon4, Rizon10, Moonlight, etc. - Add
RobotInfo::DoF, joint-space degrees of freedom of the connected robot. RemovekJointDOFconstant accordingly. The joint DoF now varies according to the model of the connected robot. Update examples accordingly. - Add real-time joint impedance (
RT_JOINT_IMPEDANCE) and non-real-time joint impedance (NRT_JOINT_IMPEDANCE) control modes. Addintermediate2_realtime_joint_impedance_control.cppandintermediate2_non_realtime_joint_impedance_control.pyexamples accordingly. - Add
Robot::SetJointImpedance()andRobot::ResetJointImpedance()that sets and resets stiffness and damping ratio of the robot's joint motion controller used in the joint impedance control modes. - Add
Robot::Brake()to force engaging or releasing robot brakes during normal operation. Only available to the medical model. - Add
Model::reachable()to check reachability of a given Cartesian pose and return the corresponding IK solution if reachable. - Add error code prefix to Robot Log messages.
- Add new dependency
spdlogto replace theflexiv::LogAPI. Update examples and tests accordingly. - Add new C++ example to show how to change logging behavior of RDK client, as well as how to log to file.
- Add input parameter
separatortoutility::Arr2Str(). - Add
utility::Vec2Str().
CHANGE
- Change header file extension from
.hto.hppto prevent C++ IntelliSense tool from mistaking certain system headers for RDK headers. - To accommodate the newly added support of the Moonlight delta robot, change joint-space variables in
RobotInfoandRobotStatesdata structures from fixed-size arrays to dynamic-size vectors. Also change input arrays ofRobot::StreamJointTorque(),Robot::StreamJointPosition(),Robot::SendJointPosition(),Robot::SetJointImpedance(),Robot::SetNullSpacePosture(), andModel::Update()to vectors. Update examples accordingly. - Rename
RobotInfo::nominal_KtoRobotInfo::K_x_nom. - Update function documentation of
Robot::StreamJointPosition()andRobot::SendJointPosition()to include joint impedance control modes. - Change
Robot::SetCartesianStiffness()toRobot::SetCartesianImpedance()andRobot::ResetCartesianStiffness()toRobot::ResetCartesianImpedance(). Cartesian motion damping ratio is added as a new input parameter. Update examples accordingly. - Rename
kCartDOFtokCartDoF. Update examples accordingly. - Update
Robot::ClearFault()to support clearing critical robot faults, if the hardware for hot-reset is installed. - Increase nominal Cartesian stiffness of Rizon 4 series from [10000-1000] to [10000-2500], and Rizon 10 series from [20000-2000] to [20000-6000].
- Greatly reduce blocking time of
Robot::ExecutePrimitive(),Robot::ExecutePlan(),Robot::SwitchMode(), andTool::functions. - Use pip installed
spdlogin Python examples. - Merge
PrintDescription()tomain()in all examples. - Change
maxVel=tovel=in primitive execution examples. - Use f-string formatting in Python examples.
- Upgrade
doc/Doxyfile.in. - Improve function documentations.
- Improve README.
- Improve dependencies build script.
FIX
- Fix
Robot::global_variables()does not return updated values if called immediately afterRobot::SetGlobalVariables(). - Fix a bug where re-switching control mode before sending commands is not enforced after disconnected then reconnected with the robot.
- Fix a bug in
test/test_dynamics_engine.cpp. - Fix keyboard interruption handling for Python examples.
- Fix compatibility issue with Eigen for Python 3.12 libraries.
v0.10
COMPATIBILITY
- Flexiv software package v2.11.5
ADD
(None)
CHANGE
- Change the behavior of
Robot::setNullSpacePosture(). Before: null-space posture will be reset to default upon entering the applicable control modes. Now: null-space posture will maintain the current posture upon entering the applicable control modes (#45). - Provide explicit safe values for the input parameters of
Robot::sendCartesianMotionForce(). - Increase nominal Cartesian stiffness of Rizon 4 and its variants from [linear: 6000 N/m, angular: 400 Nm/rad] to [linear: 10000 N/m, angular: 1000 Nm/rad].
- Increase nominal Cartesian stiffness of Rizon 10 and its variants from [linear: 12000 N/m, angular: 1200 Nm/rad] to [linear: 20000 N/m, angular: 2000 Nm/rad].
- Use MSVC 14.1 (VS 2017) to compile Windows libraries (#46).
- Improve code documentation.
FIX
- Fix a bug in
Robot::getPrimitiveStates()that has a chance to cause program crash (#47). - Fix a bug in
Robot::switchTcp()that causes this function unable to deliver the command.
v1.3
COMPATIBILITY
- Internal pre-release
ADD
- Add new API
flexiv::Devicefor general device control over RDK. - Add
Robot::mu_log()to access the multilingual log messages of the connected robot; removeRobot::getErrorMessage()accordingly. - Add
Robot::SetVelocityScale()as a standalone function to change velocity scale during plan/primitive execution; removevelocity_scaleinput parameter fromRobot::ExecutePlan()andRobot::ExecutePrimitive()accordingly. - Add input parameter
accelerationtoRobot::StreamCartesianMotionForce()to feed-forward target TCP acceleration. - Add input parameters
max_linear_accandmax_angular_acctoRobot::SendCartesianMotionForce(). - Provide explicit default values to input parameters of
Robot::SendCartesianMotionForce(). - Add bool return to
Robot::ClearFault()to indicate whether the fault is cleared successfully; update usage in examples accordingly. - Add
Gripper::moving()to replaceGripperStates::isMoving. - Add
Gripper::Init()to manually trigger gripper initialization; update gripper control examples accordingly. - Add string names array
kModeNamesfor robot control modes. - Add more supported formats for robot SN input when constructing
flexiv::Robot.
CHANGE
- Update format requirement of input parameter with ARRAY_COORD type for
Robot::ExecutePrimitive(). - Adopt the Google C++ Style Guide globally.
- Increase nominal Cartesian stiffness of Rizon 4/4s from 6000/400 to 10000/1000, Rizon 10/10s from 12000/1200 to 20000/2000.
- Replace
Robot::getRobotStates()withRobot::states()direct accessor. - Replace
Robot::getMode()withRobot::mode()direct accessor. - Replace
Robot::getPlanNameList()withRobot::plan_list()direct accessor. - Replace
Robot::getPlanInfo()withRobot::plan_info()direct accessor. - Replace
Robot::getGlobalVariables()withRobot::global_variables()direct accessor. - Replace
Robot::getPrimitiveStates()withRobot::primitive_states()direct accessor. - Rename
Gripper::getGripperStates()toGripper::states(). - Rename
Tool::switchTo()toTool::Switch(). - Rename
Tool::getToolList()toTool::list(). - Rename
Tool::getCurrentToolName()toTool::name(). - Rename
Tool::getToolParams()toTool::params(); add function overload forTool::getCurrentToolParams(). - Rename functions in
flexiv::Modelto math symbol representations. - Revert Windows action runner version to 2022 as the MSVC compatibility issue is fixed. Remove temporary warning from README accordingly.
- Remove
RobotInfo::qHome. - Improve API docs.
- Update examples and tests with new function naming.
- Bump supported Python version from 3.8/3.10 to 3.10/3.12.
- Update
.gitignore. - Update Windows compilation toolkit requirement in README.
FIX
- Fix singularity bug under
NRT_CARTESIAN_MOTION_FORCEcontrol mode (#42). - Fix data corruption when requesting primitive states (#47).
- Fix discontinuous null-space posture transition (#45).
- Fix robot tool update examples.
- Fix control mode mismatch bug in real-time control modes.
- Upgrade Fast-DDS version to v2.6.7, this fixed the compatibility issue with MSVC v143 (Visual Studio 2022).
- Remove incorrect comment from
basics3_primitive_execution.py.
v0.9.1
COMPATIBILITY
- Flexiv software package v2.11.3
ADD
(None)
CHANGE
(None)
FIX
- Fix a bug where the second consecutive plan execution command won't execute.
v1.2
COMPATIBILITY
- Internal pre-release
ADD
- Add API access of
flexiv::Modelto Windows. - Add new API
flexiv::Toolto online update the robot tools. Add C++ and Python examples. - Add
ToolParamsdata struct toData.hpp. - Add new API
flexiv::FileIOto do file transfer with the robot. - Add
Robot::setBreakpointMode()andRobot::stepBreakpoint()to do breakpoint control when executing plans. - Add
PlanInfo::waitingForStepvariable to indicate breakpoint status. - Add more generic Cartesian motion-force control modes
RT/NRT_CARTESIAN_MOTION_FORCEto replace the old ones which areRT/NRT_CARTESIAN_MOTION_FORCE_TCPandRT/NRT_CARTESIAN_MOTION_FORCE_BASE. - Add functions to configure force control parameters for the new Cartesian motion-force control modes:
Robot::setForceControlAxis(),Robot::setForceControlFrame(), andRobot::setPassiveForceControl(). - Add behavior description to the function doc of
Robot::sendJointPosition(). - Add input parameter
continueExectoRobot::executePlan()to specify whether to continue executing the plan when the RDK program is closed or the connection is lost. Set this parameter to true in the plan execution examples. - Add
Robot::isEnablingButtonPressed()to check if the enabling button on the robot motion bar is pressed. - Add
Robot::getErrorMessage()to get error message if the robot is in fault state. - Add
Model::reload()to sync the latest robot model and tool model data from the connected robot. - Add
Scheduler::minPriority()to get the OS' minimum available priority for user tasks. - Add check on user-specified task priority against the OS' minimum available priority to
Scheduler::addTask(). - Add [Blocking] or [Non-blocking] tag to function doc.
- Overload
Gripper::getGripperStates()with a variant that directly returnsGripperStatesdata struct. - Overload
Robot::getRobotStates()with a variant that directly returnsRobotStatesdata struct. - Add GitHub workflow for macOS build.
CHANGE
- Split RDK license to Standard license and Professional license. The standard license provides access to essential and non-real-time functionalities such as reading robot states, sending plan/primitive commands, etc. The professional license provides access to everything included with the standard license, plus robot dynamics and real-time functionalities such as joint torque/position streaming, Cartesian motion/force streaming, etc.
- Change
Robot::streamCartesianMotionForce()andRobot::sendCartesianMotionForce()to use the same controller asMoveHybridprimitive. Update Cartesian motion-force control examples accordingly. - Change
Robot::getPlanInfo()to returnPlanInfodata struct directly. - Change the term "base" to "world" when referring to the robot's global coordinate.
- Change
RobotStates::extWrenchInBasetoRobotStates::extWrenchInWorld. - Make the effect of
Robot::setNullSpacePosture()persistent: not resetting preferred joint positions to nominal when switching modes. - Remove input parameter
isBlockingfromScheduler::start(), the user should implement their own blocking from the calling thread if needed. Update examples accordingly. - Remove check on elapsed waiting time of
Robot::isOperational()from the examples. - Remove
RobotStates::camPose: the ownership of camera pose is transferred to Noema AI system. - Merge
test_dynamics_with_toolintotest_dynamics_engine. - Improve function docs.
- Remove Ubuntu 18.04 from supported OS list.
- Rename C++ libs to the same pattern as the Python libs.
- Format Python examples using Black Formatter.
- Update MSVC compatible version in README.
FIX
- Fix a root link bug in
flexiv::Model. - Fix memory leak of
flexiv::Scheduler. - Fix initial timer fluctuation of
flexiv::Scheduler. - Fix
Robot::runAutoRecovery().