roboticstoolbox-python 1.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- roboticstoolbox/__init__.py +107 -0
- roboticstoolbox/backends/Connector.py +113 -0
- roboticstoolbox/backends/Dynamixel/README.md +9 -0
- roboticstoolbox/backends/Dynamixel/dynamixel.json +581 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_io.py +450 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/LICENSE +201 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/README.md +28 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/ReleaseNote.md +181 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/__init__.py +27 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_bulk_read.py +163 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_bulk_write.py +109 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_sync_read.py +166 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/group_sync_write.py +99 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/packet_handler.py +33 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/port_handler.py +155 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/protocol1_packet_handler.py +548 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/protocol2_packet_handler.py +1080 -0
- roboticstoolbox/backends/Dynamixel/dynamixel_sdk/robotis_def.py +75 -0
- roboticstoolbox/backends/Dynamixel/dyndata.py +121 -0
- roboticstoolbox/backends/PyPlot/EllipsePlot.py +256 -0
- roboticstoolbox/backends/PyPlot/PyPlot.py +778 -0
- roboticstoolbox/backends/PyPlot/PyPlot2.py +537 -0
- roboticstoolbox/backends/PyPlot/README.md +67 -0
- roboticstoolbox/backends/PyPlot/RobotPlot.py +247 -0
- roboticstoolbox/backends/PyPlot/RobotPlot2.py +123 -0
- roboticstoolbox/backends/PyPlot/__init__.py +4 -0
- roboticstoolbox/backends/ROS/ROS.py +129 -0
- roboticstoolbox/backends/ROS/__init__.py +3 -0
- roboticstoolbox/backends/__init__.py +39 -0
- roboticstoolbox/backends/swift/__init__.py +165 -0
- roboticstoolbox/bin/__init__.py +0 -0
- roboticstoolbox/bin/_bintools.py +61 -0
- roboticstoolbox/bin/rtbtool.py +404 -0
- roboticstoolbox/blocks/Icons/250x250/armplot.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/bicycle.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/camera.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/circlepath.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/coriolis.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/ctraj.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/delta2tr.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/diffsteer.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/fdyn.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/fdynx.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/fkine.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/gravload.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/idyn.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/idynx.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/ikine.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/inertia.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/jacobian.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/jtraj.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/lspb.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/multirotor.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/multirotormixer.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/multirotorplot.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/point2tr.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/tr2delta.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/tr2t.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/unicycle.png +0 -0
- roboticstoolbox/blocks/Icons/250x250/vehicleplot.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/armplot.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/bicycle.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/camera.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/circlepath.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/coriolis.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/delta2tr.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/diffsteer.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/fdyn.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/fdynx.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/fkine.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/gravload.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/idyn.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/idynx.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/ikine.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/inertia.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/jacobian.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/jtraj.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/lspb.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/multirotor.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/multirotormixer.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/multirotorplot.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/point2tr.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/tr2delta.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/tr2t.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/unicycle.png +0 -0
- roboticstoolbox/blocks/Icons/50x50/vehicleplot.png +0 -0
- roboticstoolbox/blocks/Icons/armplot.png +0 -0
- roboticstoolbox/blocks/Icons/bicycle.png +0 -0
- roboticstoolbox/blocks/Icons/camera.png +0 -0
- roboticstoolbox/blocks/Icons/circlepath.png +0 -0
- roboticstoolbox/blocks/Icons/coriolis.png +0 -0
- roboticstoolbox/blocks/Icons/ctraj.png +0 -0
- roboticstoolbox/blocks/Icons/delta2tr.png +0 -0
- roboticstoolbox/blocks/Icons/diffsteer.png +0 -0
- roboticstoolbox/blocks/Icons/fdyn.png +0 -0
- roboticstoolbox/blocks/Icons/fdynx.png +0 -0
- roboticstoolbox/blocks/Icons/fkine.png +0 -0
- roboticstoolbox/blocks/Icons/gravload.png +0 -0
- roboticstoolbox/blocks/Icons/idyn.png +0 -0
- roboticstoolbox/blocks/Icons/idynx.png +0 -0
- roboticstoolbox/blocks/Icons/ikine.png +0 -0
- roboticstoolbox/blocks/Icons/inertia.png +0 -0
- roboticstoolbox/blocks/Icons/jacobian.png +0 -0
- roboticstoolbox/blocks/Icons/jtraj.png +0 -0
- roboticstoolbox/blocks/Icons/lspb.png +0 -0
- roboticstoolbox/blocks/Icons/multirotor.png +0 -0
- roboticstoolbox/blocks/Icons/multirotormixer.png +0 -0
- roboticstoolbox/blocks/Icons/multirotorplot.png +0 -0
- roboticstoolbox/blocks/Icons/point2tr.png +0 -0
- roboticstoolbox/blocks/Icons/tr2delta.png +0 -0
- roboticstoolbox/blocks/Icons/tr2t.png +0 -0
- roboticstoolbox/blocks/Icons/unicycle.png +0 -0
- roboticstoolbox/blocks/Icons/vehicleplot.png +0 -0
- roboticstoolbox/blocks/README.md +43 -0
- roboticstoolbox/blocks/__init__.py +6 -0
- roboticstoolbox/blocks/arm.py +1591 -0
- roboticstoolbox/blocks/mobile.py +522 -0
- roboticstoolbox/blocks/quad_model.py +132 -0
- roboticstoolbox/blocks/spatial.py +245 -0
- roboticstoolbox/blocks/uav.py +949 -0
- roboticstoolbox/demo/__init__.py +0 -0
- roboticstoolbox/demo/eigdemo.py +112 -0
- roboticstoolbox/demo/tripleangledemo.py +239 -0
- roboticstoolbox/demo/twistdemo.py +175 -0
- roboticstoolbox/ets/ET.py +439 -0
- roboticstoolbox/ets/ET2.py +179 -0
- roboticstoolbox/ets/ETS.py +2013 -0
- roboticstoolbox/ets/ETS2.py +449 -0
- roboticstoolbox/ets/_ET.py +668 -0
- roboticstoolbox/ets/_ETS.py +781 -0
- roboticstoolbox/ets/__init__.py +11 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Cholesky +45 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/CholmodSupport +48 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Core +384 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Dense +7 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Eigen +2 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Eigenvalues +60 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Geometry +59 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Householder +29 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/IterativeLinearSolvers +48 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Jacobi +32 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/KLUSupport +41 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/LU +47 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/MetisSupport +35 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/OrderingMethods +70 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/PaStiXSupport +49 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/PardisoSupport +35 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/QR +50 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/QtAlignedMalloc +39 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SPQRSupport +34 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SVD +50 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/Sparse +34 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SparseCholesky +37 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SparseCore +69 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SparseLU +50 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SparseQR +36 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/StdDeque +27 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/StdList +26 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/StdVector +27 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/SuperLUSupport +64 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/UmfPackSupport +40 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LDLT.h +688 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LLT.h +558 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/CholmodSupport/CholmodSupport.h +682 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArithmeticSequence.h +413 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Array.h +417 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArrayBase.h +226 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ArrayWrapper.h +209 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Assign.h +90 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/AssignEvaluator.h +1010 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Assign_MKL.h +178 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/BandMatrix.h +353 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Block.h +448 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/BooleanRedux.h +162 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CommaInitializer.h +164 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ConditionEstimator.h +175 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CoreEvaluators.h +1741 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CoreIterators.h +132 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseBinaryOp.h +183 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseNullaryOp.h +1001 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseTernaryOp.h +197 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseUnaryOp.h +103 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/CwiseUnaryView.h +132 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseBase.h +701 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseCoeffsBase.h +685 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DenseStorage.h +652 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Diagonal.h +258 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DiagonalMatrix.h +391 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/DiagonalProduct.h +28 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Dot.h +318 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/EigenBase.h +160 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ForceAlignedAccess.h +150 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Fuzzy.h +155 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GeneralProduct.h +465 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GenericPacketMath.h +1040 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/GlobalFunctions.h +194 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/IO.h +258 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/IndexedView.h +237 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Inverse.h +117 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Map.h +171 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MapBase.h +310 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MathFunctions.h +2057 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MathFunctionsImpl.h +200 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Matrix.h +565 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/MatrixBase.h +547 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NestByValue.h +85 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NoAlias.h +109 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/NumTraits.h +335 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PermutationMatrix.h +605 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/PlainObjectBase.h +1128 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Product.h +191 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ProductEvaluators.h +1179 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Random.h +218 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Redux.h +515 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Ref.h +381 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Replicate.h +142 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Reshaped.h +454 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/ReturnByValue.h +119 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Reverse.h +217 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Select.h +164 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SelfAdjointView.h +365 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Solve.h +188 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SolveTriangular.h +235 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/SolverBase.h +168 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/StableNorm.h +251 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/StlIterators.h +463 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Stride.h +116 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Swap.h +68 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Transpose.h +464 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Transpositions.h +386 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/TriangularMatrix.h +1001 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/VectorBlock.h +96 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/VectorwiseOp.h +784 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/Visitor.h +381 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/Complex.h +372 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/MathFunctions.h +228 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/PacketMath.h +1574 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX/TypeCasting.h +115 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/MathFunctions.h +362 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/PacketMath.h +2303 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/Complex.h +417 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MathFunctions.h +90 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/AltiVec/PacketMath.h +2711 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/CUDA/Complex.h +258 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/ConjHelper.h +117 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/Half.h +942 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/Settings.h +49 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/MathFunctions.h +103 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/Complex.h +584 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/MathFunctions.h +75 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/PacketMath.h +4587 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/Complex.h +351 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/MathFunctions.h +199 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/PacketMath.h +1505 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SSE/TypeCasting.h +142 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/Complex.h +426 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/MathFunctions.h +233 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/arch/ZVector/PacketMath.h +1060 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/AssignmentFunctors.h +177 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/BinaryFunctors.h +541 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/NullaryFunctors.h +189 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/StlFunctors.h +166 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/functors/UnaryFunctors.h +1131 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2645 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrix.h +517 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +317 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +124 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixVector.h +518 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/Parallelizer.h +180 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +544 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +295 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixVector.h +262 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/SelfadjointRank2Update.h +94 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixMatrix.h +472 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +317 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverMatrix.h +337 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +167 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/products/TriangularSolverVector.h +148 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/BlasUtil.h +583 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Constants.h +563 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/DisableStupidWarnings.h +106 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ForwardDeclarations.h +322 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/IntegralConstant.h +272 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/MKL_support.h +137 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Macros.h +1464 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Memory.h +1163 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/Meta.h +812 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/NonMPL2.h +3 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ReenableStupidWarnings.h +31 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/StaticAssert.h +221 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Core/util/XprHelper.h +856 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexSchur.h +462 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealQZ.h +657 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealSchur.h +558 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +904 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Eigenvalues/Tridiagonalization.h +561 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/AlignedBox.h +486 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/AngleAxis.h +247 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/EulerAngles.h +114 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Homogeneous.h +501 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Hyperplane.h +282 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/OrthoMethods.h +235 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/ParametrizedLine.h +232 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Quaternion.h +870 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Rotation2D.h +199 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/RotationBase.h +206 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Scaling.h +188 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Transform.h +1563 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Translation.h +202 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/Umeyama.h +166 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/BlockHouseholder.h +110 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/Householder.h +176 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Householder/HouseholderSequence.h +545 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +212 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +229 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +394 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +453 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +444 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +198 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +117 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/Jacobi/Jacobi.h +483 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/Determinant.h +117 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/FullPivLU.h +877 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/InverseImpl.h +432 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/PartialPivLU.h +624 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/LU/arch/InverseSize4.h +351 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/MetisSupport/MetisSupport.h +137 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Amd.h +435 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Eigen_Colamd.h +1863 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/OrderingMethods/Ordering.h +153 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/PardisoSupport/PardisoSupport.h +545 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/ColPivHouseholderQR.h +674 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/CompleteOrthogonalDecomposition.h +635 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/FullPivHouseholderQR.h +713 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/HouseholderQR.h +434 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +335 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/BDCSVD.h +1366 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/JacobiSVD.h +812 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/SVDBase.h +376 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCholesky/SimplicialCholesky.h +697 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +174 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/AmbiVector.h +378 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/CompressedStorage.h +274 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseAssign.h +270 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseBlock.h +571 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseColEtree.h +206 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCompressedBase.h +370 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +722 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +150 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDenseProduct.h +342 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseDot.h +98 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMap.h +305 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMatrix.h +1518 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseMatrixBase.h +398 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparsePermutation.h +178 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseProduct.h +181 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseRedux.h +49 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseRef.h +397 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSelfAdjointView.h +659 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseTranspose.h +92 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseUtil.h +186 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseVector.h +478 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/SparseView.h +254 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseCore/TriangularSolver.h +315 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU.h +923 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +375 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SparseQR/SparseQR.h +758 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdDeque.h +116 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdList.h +106 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/StdVector.h +131 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/StlSupport/details.h +84 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/SuperLUSupport/SuperLUSupport.h +1025 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/UmfPackSupport/UmfPackSupport.h +642 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/Image.h +82 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/Kernel.h +79 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/RealSvd2x2.h +55 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/blas.h +440 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapack.h +152 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapacke.h +16292 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/misc/lapacke_mangling.h +17 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ArrayCwiseBinaryOps.h +358 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ArrayCwiseUnaryOps.h +696 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/BlockMethods.h +1442 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/CommonCwiseUnaryOps.h +177 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/MatrixCwiseUnaryOps.h +95 -0
- roboticstoolbox/ets/cpp-extensions/Eigen/src/plugins/ReshapedMethods.h +149 -0
- roboticstoolbox/ets/cpp-extensions/README.md +73 -0
- roboticstoolbox/ets/cpp-extensions/fknm_nb.cpp +534 -0
- roboticstoolbox/ets/cpp-extensions/ik.cpp +301 -0
- roboticstoolbox/ets/cpp-extensions/ik.h +59 -0
- roboticstoolbox/ets/cpp-extensions/linalg.cpp +316 -0
- roboticstoolbox/ets/cpp-extensions/linalg.h +64 -0
- roboticstoolbox/ets/cpp-extensions/methods.cpp +372 -0
- roboticstoolbox/ets/cpp-extensions/methods.h +32 -0
- roboticstoolbox/ets/cpp-extensions/structs.cpp +24 -0
- roboticstoolbox/ets/cpp-extensions/structs.h +62 -0
- roboticstoolbox/ets/fknm.py +366 -0
- roboticstoolbox/mobile/Animations.py +485 -0
- roboticstoolbox/mobile/Bug2.py +455 -0
- roboticstoolbox/mobile/CurvaturePolyPlanner.py +179 -0
- roboticstoolbox/mobile/DistanceTransformPlanner.py +395 -0
- roboticstoolbox/mobile/DstarPlanner.py +591 -0
- roboticstoolbox/mobile/DubinsPlanner.py +474 -0
- roboticstoolbox/mobile/EKF.py +1617 -0
- roboticstoolbox/mobile/LatticePlanner.py +419 -0
- roboticstoolbox/mobile/OccGrid.py +613 -0
- roboticstoolbox/mobile/PRMPlanner.py +348 -0
- roboticstoolbox/mobile/ParticleFilter.py +706 -0
- roboticstoolbox/mobile/PlannerBase.py +1009 -0
- roboticstoolbox/mobile/PoseGraph.py +544 -0
- roboticstoolbox/mobile/QuinticPolyPlanner.py +349 -0
- roboticstoolbox/mobile/RRTPlanner.py +359 -0
- roboticstoolbox/mobile/ReedsSheppPlanner.py +545 -0
- roboticstoolbox/mobile/Vehicle.py +1909 -0
- roboticstoolbox/mobile/__init__.py +194 -0
- roboticstoolbox/mobile/drivers.py +397 -0
- roboticstoolbox/mobile/landmarkmap.py +181 -0
- roboticstoolbox/mobile/sensors.py +789 -0
- roboticstoolbox/models/DH/AL5D.py +121 -0
- roboticstoolbox/models/DH/Ball.py +87 -0
- roboticstoolbox/models/DH/Baxter.py +91 -0
- roboticstoolbox/models/DH/Cobra600.py +63 -0
- roboticstoolbox/models/DH/Coil.py +80 -0
- roboticstoolbox/models/DH/Hyper.py +81 -0
- roboticstoolbox/models/DH/Hyper3d.py +83 -0
- roboticstoolbox/models/DH/IRB140.py +159 -0
- roboticstoolbox/models/DH/Jaco.py +102 -0
- roboticstoolbox/models/DH/KR5.py +112 -0
- roboticstoolbox/models/DH/LWR4.py +80 -0
- roboticstoolbox/models/DH/Mico.py +102 -0
- roboticstoolbox/models/DH/Orion5.py +91 -0
- roboticstoolbox/models/DH/P8.py +80 -0
- roboticstoolbox/models/DH/Panda.py +213 -0
- roboticstoolbox/models/DH/Planar2.py +69 -0
- roboticstoolbox/models/DH/Planar3.py +51 -0
- roboticstoolbox/models/DH/Puma560.py +326 -0
- roboticstoolbox/models/DH/README.md +216 -0
- roboticstoolbox/models/DH/Sawyer.py +85 -0
- roboticstoolbox/models/DH/Stanford.py +147 -0
- roboticstoolbox/models/DH/TwoLink.py +153 -0
- roboticstoolbox/models/DH/UR10.py +124 -0
- roboticstoolbox/models/DH/UR3.py +98 -0
- roboticstoolbox/models/DH/UR5.py +98 -0
- roboticstoolbox/models/DH/Uprighttl.py +24 -0
- roboticstoolbox/models/DH/__init__.py +52 -0
- roboticstoolbox/models/ETS/Frankie.py +90 -0
- roboticstoolbox/models/ETS/GenericSeven.py +54 -0
- roboticstoolbox/models/ETS/Omni.py +74 -0
- roboticstoolbox/models/ETS/Panda.py +69 -0
- roboticstoolbox/models/ETS/Planar2.py +49 -0
- roboticstoolbox/models/ETS/Planar_Y.py +65 -0
- roboticstoolbox/models/ETS/Puma560.py +70 -0
- roboticstoolbox/models/ETS/XYPanda.py +84 -0
- roboticstoolbox/models/ETS/__init__.py +20 -0
- roboticstoolbox/models/README.md +9 -0
- roboticstoolbox/models/URDF/AL5D.py +45 -0
- roboticstoolbox/models/URDF/Fetch.py +96 -0
- roboticstoolbox/models/URDF/Frankie.py +67 -0
- roboticstoolbox/models/URDF/FrankieOmni.py +94 -0
- roboticstoolbox/models/URDF/Jaco.py +49 -0
- roboticstoolbox/models/URDF/KinovaGen3.py +63 -0
- roboticstoolbox/models/URDF/LBR.py +57 -0
- roboticstoolbox/models/URDF/PR2.py +66 -0
- roboticstoolbox/models/URDF/Panda.py +60 -0
- roboticstoolbox/models/URDF/Puma560.py +90 -0
- roboticstoolbox/models/URDF/UR10.py +43 -0
- roboticstoolbox/models/URDF/UR3.py +43 -0
- roboticstoolbox/models/URDF/UR5.py +64 -0
- roboticstoolbox/models/URDF/URDFRobot.py +402 -0
- roboticstoolbox/models/URDF/Valkyrie.py +110 -0
- roboticstoolbox/models/URDF/YuMi.py +107 -0
- roboticstoolbox/models/URDF/__init__.py +51 -0
- roboticstoolbox/models/URDF/px100.py +48 -0
- roboticstoolbox/models/URDF/px150.py +48 -0
- roboticstoolbox/models/URDF/rx150.py +48 -0
- roboticstoolbox/models/URDF/rx200.py +48 -0
- roboticstoolbox/models/URDF/vx300.py +48 -0
- roboticstoolbox/models/URDF/vx300s.py +48 -0
- roboticstoolbox/models/URDF/wx200.py +48 -0
- roboticstoolbox/models/URDF/wx250.py +48 -0
- roboticstoolbox/models/URDF/wx250s.py +48 -0
- roboticstoolbox/models/__init__.py +7 -0
- roboticstoolbox/models/catalog.py +226 -0
- roboticstoolbox/robot/BaseRobot.py +2589 -0
- roboticstoolbox/robot/DHFactor.py +522 -0
- roboticstoolbox/robot/DHLink.py +949 -0
- roboticstoolbox/robot/DHRobot.py +2591 -0
- roboticstoolbox/robot/Dynamics.py +1537 -0
- roboticstoolbox/robot/ELink.py +23 -0
- roboticstoolbox/robot/ERobot.py +25 -0
- roboticstoolbox/robot/Gripper.py +242 -0
- roboticstoolbox/robot/IK.py +1378 -0
- roboticstoolbox/robot/Link.py +1557 -0
- roboticstoolbox/robot/PoERobot.py +352 -0
- roboticstoolbox/robot/Robot.py +2157 -0
- roboticstoolbox/robot/RobotKinematics.py +1505 -0
- roboticstoolbox/robot/RobotPlottingMPL.py +355 -0
- roboticstoolbox/robot/RobotProto.py +156 -0
- roboticstoolbox/robot/__init__.py +57 -0
- roboticstoolbox/robot/cpp-extensions/README.md +29 -0
- roboticstoolbox/robot/cpp-extensions/frne.h +96 -0
- roboticstoolbox/robot/cpp-extensions/frne_nb.cpp +237 -0
- roboticstoolbox/robot/cpp-extensions/ne.c +495 -0
- roboticstoolbox/robot/cpp-extensions/vmath.c +163 -0
- roboticstoolbox/robot/cpp-extensions/vmath.h +32 -0
- roboticstoolbox/robot/frne.py +51 -0
- roboticstoolbox/tools/DHFactor.py +375 -0
- roboticstoolbox/tools/Ticker.py +53 -0
- roboticstoolbox/tools/__init__.py +54 -0
- roboticstoolbox/tools/data.py +187 -0
- roboticstoolbox/tools/jsingu.py +51 -0
- roboticstoolbox/tools/null.py +48 -0
- roboticstoolbox/tools/numerical.py +96 -0
- roboticstoolbox/tools/p_servo.py +108 -0
- roboticstoolbox/tools/params.py +11 -0
- roboticstoolbox/tools/plot.py +109 -0
- roboticstoolbox/tools/trajectory.py +1152 -0
- roboticstoolbox/tools/types.py +13 -0
- roboticstoolbox/tools/urdf/__init__.py +45 -0
- roboticstoolbox/tools/urdf/tests/data/ur5.urdf +341 -0
- roboticstoolbox/tools/urdf/tests/test_urdf.py +116 -0
- roboticstoolbox/tools/urdf/urdf.py +1930 -0
- roboticstoolbox/tools/urdf/utils.py +50 -0
- roboticstoolbox_python-1.4.0.dist-info/METADATA +664 -0
- roboticstoolbox_python-1.4.0.dist-info/RECORD +610 -0
- roboticstoolbox_python-1.4.0.dist-info/WHEEL +5 -0
- roboticstoolbox_python-1.4.0.dist-info/entry_points.txt +6 -0
- roboticstoolbox_python-1.4.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,1505 @@
|
|
|
1
|
+
"""
|
|
2
|
+
@author: Jesse Haviland
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from roboticstoolbox.robot.RobotProto import KinematicsProtocol
|
|
6
|
+
from roboticstoolbox.tools.types import ArrayLike, NDArray
|
|
7
|
+
from roboticstoolbox.robot.Link import Link
|
|
8
|
+
from roboticstoolbox.robot.Gripper import Gripper
|
|
9
|
+
from spatialmath import SE3
|
|
10
|
+
from typing import Literal as L, overload
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RobotKinematicsMixin:
|
|
14
|
+
"""
|
|
15
|
+
The Robot Kinematics Mixin class
|
|
16
|
+
|
|
17
|
+
This class contains kinematic methods for the ``robot`` class. All
|
|
18
|
+
methods contained within this class have a full implementation within the
|
|
19
|
+
``ETS`` class and are simply passed through to the ``ETS`` class.
|
|
20
|
+
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
# --------------------------------------------------------------------- #
|
|
24
|
+
# --------- Kinematic Methods ----------------------------------------- #
|
|
25
|
+
# --------------------------------------------------------------------- #
|
|
26
|
+
|
|
27
|
+
def fkine(
|
|
28
|
+
self: KinematicsProtocol,
|
|
29
|
+
q: ArrayLike,
|
|
30
|
+
end: str | Link | Gripper | None = None,
|
|
31
|
+
start: str | Link | Gripper | None = None,
|
|
32
|
+
tool: NDArray | SE3 | None = None,
|
|
33
|
+
include_base: bool = True,
|
|
34
|
+
) -> SE3:
|
|
35
|
+
"""
|
|
36
|
+
Forward kinematics
|
|
37
|
+
|
|
38
|
+
:param q: Joint coordinates
|
|
39
|
+
:param end: end-effector or gripper to compute forward kinematics to
|
|
40
|
+
:param start: the link to compute forward kinematics from
|
|
41
|
+
:param tool: tool transform, optional
|
|
42
|
+
:returns: The transformation matrix representing the pose of the end-effector
|
|
43
|
+
|
|
44
|
+
``T = robot.fkine(q)`` evaluates forward kinematics for the robot at
|
|
45
|
+
joint configuration ``q``.
|
|
46
|
+
|
|
47
|
+
**Trajectory operation**:
|
|
48
|
+
If ``q`` has multiple rows (mxn), it is considered a trajectory and the
|
|
49
|
+
result is an ``SE3`` instance with ``m`` values.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
The following example makes a ``panda`` robot object, and solves for the
|
|
54
|
+
forward kinematics at the listed configuration.
|
|
55
|
+
|
|
56
|
+
.. runblock:: pycon
|
|
57
|
+
>>> import roboticstoolbox as rtb
|
|
58
|
+
>>> panda = rtb.models.Panda()
|
|
59
|
+
>>> panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
60
|
+
|
|
61
|
+
.. rubric:: Notes
|
|
62
|
+
|
|
63
|
+
- For a robot with a single end-effector there is no need to
|
|
64
|
+
specify ``end``
|
|
65
|
+
- For a robot with multiple end-effectors, the ``end`` must
|
|
66
|
+
be specified.
|
|
67
|
+
- The robot's base tool transform, if set, is incorporated
|
|
68
|
+
into the result.
|
|
69
|
+
- A tool transform, if provided, is incorporated into the result.
|
|
70
|
+
- Works from the end-effector link to the base
|
|
71
|
+
|
|
72
|
+
.. rubric:: References
|
|
73
|
+
|
|
74
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
75
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
76
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
77
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
78
|
+
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
return SE3(
|
|
82
|
+
self.ets(start, end).fkine(
|
|
83
|
+
q, base=self._T, tool=tool, include_base=include_base
|
|
84
|
+
),
|
|
85
|
+
check=False,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
def jacob0(
|
|
89
|
+
self: KinematicsProtocol,
|
|
90
|
+
q: ArrayLike,
|
|
91
|
+
end: str | Link | Gripper | None = None,
|
|
92
|
+
start: str | Link | Gripper | None = None,
|
|
93
|
+
tool: NDArray | SE3 | None = None,
|
|
94
|
+
) -> NDArray:
|
|
95
|
+
r"""
|
|
96
|
+
Manipulator geometric Jacobian in the ``start`` frame
|
|
97
|
+
|
|
98
|
+
:param q: Joint coordinate vector
|
|
99
|
+
:param end: the particular link or gripper whose velocity the Jacobian
|
|
100
|
+
describes, defaults to the end-effector if only one is present
|
|
101
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
102
|
+
:param tool: a static tool transformation matrix to apply to the
|
|
103
|
+
end of end, defaults to None
|
|
104
|
+
:returns: Manipulator Jacobian in the ``start`` frame
|
|
105
|
+
|
|
106
|
+
``robot.jacobo(q)`` is the manipulator Jacobian matrix which maps
|
|
107
|
+
joint velocity to end-effector spatial velocity expressed in the
|
|
108
|
+
base frame.
|
|
109
|
+
|
|
110
|
+
End-effector spatial velocity :math:`\nu = (v_x, v_y, v_z, \omega_x, \omega_y, \omega_z)^T`
|
|
111
|
+
is related to joint velocity by :math:`{}^{E}\!\nu = \mathbf{J}_m(q) \dot{q}`.
|
|
112
|
+
|
|
113
|
+
Examples
|
|
114
|
+
--------
|
|
115
|
+
The following example makes a ``Puma560`` robot object, and solves for the
|
|
116
|
+
base-frame Jacobian at the zero joint angle configuration
|
|
117
|
+
|
|
118
|
+
.. runblock:: pycon
|
|
119
|
+
>>> import roboticstoolbox as rtb
|
|
120
|
+
>>> puma = rtb.models.Puma560()
|
|
121
|
+
>>> puma.jacob0([0, 0, 0, 0, 0, 0])
|
|
122
|
+
|
|
123
|
+
.. rubric:: Notes
|
|
124
|
+
|
|
125
|
+
- This is the geometric Jacobian as described in texts by
|
|
126
|
+
Corke, Spong etal., Siciliano etal. The end-effector velocity is
|
|
127
|
+
described in terms of translational and angular velocity, not a
|
|
128
|
+
velocity twist as per the text by Lynch & Park.
|
|
129
|
+
|
|
130
|
+
.. rubric:: References
|
|
131
|
+
|
|
132
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
133
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
134
|
+
|
|
135
|
+
"""
|
|
136
|
+
|
|
137
|
+
return self.ets(start, end).jacob0(q, tool=tool)
|
|
138
|
+
|
|
139
|
+
def jacobe(
|
|
140
|
+
self: KinematicsProtocol,
|
|
141
|
+
q: ArrayLike,
|
|
142
|
+
end: str | Link | Gripper | None = None,
|
|
143
|
+
start: str | Link | Gripper | None = None,
|
|
144
|
+
tool: NDArray | SE3 | None = None,
|
|
145
|
+
) -> NDArray:
|
|
146
|
+
r"""
|
|
147
|
+
Manipulator geometric Jacobian in the end-effector frame
|
|
148
|
+
|
|
149
|
+
:param q: Joint coordinate vector
|
|
150
|
+
:param end: the particular link or gripper whose velocity the Jacobian
|
|
151
|
+
describes, defaults to the end-effector if only one is present
|
|
152
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
153
|
+
:param tool: a static tool transformation matrix to apply to the
|
|
154
|
+
end of end, defaults to None
|
|
155
|
+
:returns: Manipulator Jacobian in the ``end`` frame
|
|
156
|
+
|
|
157
|
+
``robot.jacobe(q)`` is the manipulator Jacobian matrix which maps
|
|
158
|
+
joint velocity to end-effector spatial velocity expressed in the
|
|
159
|
+
``end`` frame.
|
|
160
|
+
|
|
161
|
+
End-effector spatial velocity :math:`\nu = (v_x, v_y, v_z, \omega_x, \omega_y, \omega_z)^T`
|
|
162
|
+
is related to joint velocity by :math:`{}^{E}\!\nu = \mathbf{J}_m(q) \dot{q}`.
|
|
163
|
+
|
|
164
|
+
Examples
|
|
165
|
+
--------
|
|
166
|
+
The following example makes a ``Puma560`` robot object, and solves for the
|
|
167
|
+
end-effector frame Jacobian at the zero joint angle configuration
|
|
168
|
+
|
|
169
|
+
.. runblock:: pycon
|
|
170
|
+
>>> import roboticstoolbox as rtb
|
|
171
|
+
>>> puma = rtb.models.Puma560()
|
|
172
|
+
>>> puma.jacobe([0, 0, 0, 0, 0, 0])
|
|
173
|
+
|
|
174
|
+
.. rubric:: Notes
|
|
175
|
+
|
|
176
|
+
- This is the geometric Jacobian as described in texts by
|
|
177
|
+
Corke, Spong etal., Siciliano etal. The end-effector velocity is
|
|
178
|
+
described in terms of translational and angular velocity, not a
|
|
179
|
+
velocity twist as per the text by Lynch & Park.
|
|
180
|
+
|
|
181
|
+
.. rubric:: References
|
|
182
|
+
|
|
183
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
184
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
185
|
+
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
return self.ets(start, end).jacobe(q, tool=tool)
|
|
189
|
+
|
|
190
|
+
@overload
|
|
191
|
+
def hessian0(
|
|
192
|
+
self: KinematicsProtocol,
|
|
193
|
+
q: ArrayLike = ...,
|
|
194
|
+
end: str | Link | Gripper | None = None,
|
|
195
|
+
start: str | Link | Gripper | None = None,
|
|
196
|
+
J0: None = None,
|
|
197
|
+
tool: NDArray | SE3 | None = None,
|
|
198
|
+
) -> NDArray: # pragma nocover
|
|
199
|
+
...
|
|
200
|
+
|
|
201
|
+
@overload
|
|
202
|
+
def hessian0(
|
|
203
|
+
self: KinematicsProtocol,
|
|
204
|
+
q: None = None,
|
|
205
|
+
end: str | Link | Gripper | None = None,
|
|
206
|
+
start: str | Link | Gripper | None = None,
|
|
207
|
+
J0: NDArray = ...,
|
|
208
|
+
tool: NDArray | SE3 | None = None,
|
|
209
|
+
) -> NDArray: # pragma nocover
|
|
210
|
+
...
|
|
211
|
+
|
|
212
|
+
def hessian0(
|
|
213
|
+
self: KinematicsProtocol,
|
|
214
|
+
q=None,
|
|
215
|
+
end: str | Link | Gripper | None = None,
|
|
216
|
+
start: str | Link | Gripper | None = None,
|
|
217
|
+
J0=None,
|
|
218
|
+
tool: NDArray | SE3 | None = None,
|
|
219
|
+
) -> NDArray:
|
|
220
|
+
r"""
|
|
221
|
+
Manipulator Hessian
|
|
222
|
+
|
|
223
|
+
:param q: The joint angles/configuration of the robot (Optional,
|
|
224
|
+
if not supplied will use the stored q values).
|
|
225
|
+
:param end: the final link/Gripper which the Hessian represents
|
|
226
|
+
:param start: the first link which the Hessian represents
|
|
227
|
+
:param J0: The manipulator Jacobian in the ``start`` frame
|
|
228
|
+
:param tool: a static tool transformation matrix to apply to the
|
|
229
|
+
end of end, defaults to None
|
|
230
|
+
:returns: The manipulator Hessian in the ``start`` frame
|
|
231
|
+
|
|
232
|
+
The manipulator Hessian tensor maps joint acceleration to end-effector
|
|
233
|
+
spatial acceleration, expressed in the ``start`` frame. This
|
|
234
|
+
function calulcates this based on the ETS of the robot. One of J0 or q
|
|
235
|
+
is required. Supply J0 if already calculated to save computation time
|
|
236
|
+
|
|
237
|
+
This method computes the manipulator Hessian in the ``start`` frame. If
|
|
238
|
+
we take the time derivative of the differential kinematic relationship
|
|
239
|
+
|
|
240
|
+
.. math::
|
|
241
|
+
|
|
242
|
+
\nu &= \mat{J}(\vec{q}) \dvec{q} \\
|
|
243
|
+
\alpha &= \dmat{J} \dvec{q} + \mat{J} \ddvec{q}
|
|
244
|
+
|
|
245
|
+
where
|
|
246
|
+
|
|
247
|
+
.. math::
|
|
248
|
+
|
|
249
|
+
\dmat{J} = \mat{H} \dvec{q}
|
|
250
|
+
|
|
251
|
+
and :math:`\mat{H} \in \mathbb{R}^{6\times n \times n}` is the
|
|
252
|
+
Hessian tensor.
|
|
253
|
+
|
|
254
|
+
The elements of the Hessian are
|
|
255
|
+
|
|
256
|
+
.. math::
|
|
257
|
+
|
|
258
|
+
\mat{H}_{i,j,k} = \frac{d^2 u_i}{d q_j d q_k}
|
|
259
|
+
|
|
260
|
+
where :math:`u = \{t_x, t_y, t_z, r_x, r_y, r_z\}` are the elements
|
|
261
|
+
of the spatial velocity vector.
|
|
262
|
+
|
|
263
|
+
Similarly, we can write
|
|
264
|
+
|
|
265
|
+
.. math::
|
|
266
|
+
|
|
267
|
+
\mat{J}_{i,j} = \frac{d u_i}{d q_j}
|
|
268
|
+
|
|
269
|
+
Examples
|
|
270
|
+
--------
|
|
271
|
+
The following example makes a ``Panda`` robot object, and solves for the
|
|
272
|
+
base frame Hessian at the given joint angle configuration
|
|
273
|
+
|
|
274
|
+
.. runblock:: pycon
|
|
275
|
+
>>> import roboticstoolbox as rtb
|
|
276
|
+
>>> panda = rtb.models.Panda()
|
|
277
|
+
>>> panda.hessian0([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
278
|
+
|
|
279
|
+
.. rubric:: References
|
|
280
|
+
|
|
281
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
282
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
283
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
284
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
285
|
+
|
|
286
|
+
"""
|
|
287
|
+
|
|
288
|
+
return self.ets(start, end).hessian0(q, J0=J0, tool=tool)
|
|
289
|
+
|
|
290
|
+
@overload
|
|
291
|
+
def hessiane(
|
|
292
|
+
self: KinematicsProtocol,
|
|
293
|
+
q: ArrayLike = ...,
|
|
294
|
+
end: str | Link | Gripper | None = None,
|
|
295
|
+
start: str | Link | Gripper | None = None,
|
|
296
|
+
Je: None = None,
|
|
297
|
+
tool: NDArray | SE3 | None = None,
|
|
298
|
+
) -> NDArray: # pragma nocover
|
|
299
|
+
...
|
|
300
|
+
|
|
301
|
+
@overload
|
|
302
|
+
def hessiane(
|
|
303
|
+
self: KinematicsProtocol,
|
|
304
|
+
q: None = None,
|
|
305
|
+
end: str | Link | Gripper | None = None,
|
|
306
|
+
start: str | Link | Gripper | None = None,
|
|
307
|
+
Je: NDArray = ...,
|
|
308
|
+
tool: NDArray | SE3 | None = None,
|
|
309
|
+
) -> NDArray: # pragma nocover
|
|
310
|
+
...
|
|
311
|
+
|
|
312
|
+
def hessiane(
|
|
313
|
+
self: KinematicsProtocol,
|
|
314
|
+
q=None,
|
|
315
|
+
end: str | Link | Gripper | None = None,
|
|
316
|
+
start: str | Link | Gripper | None = None,
|
|
317
|
+
Je=None,
|
|
318
|
+
tool: NDArray | SE3 | None = None,
|
|
319
|
+
) -> NDArray:
|
|
320
|
+
r"""
|
|
321
|
+
Manipulator Hessian
|
|
322
|
+
|
|
323
|
+
:param q: The joint angles/configuration of the robot (Optional,
|
|
324
|
+
if not supplied will use the stored q values).
|
|
325
|
+
:param end: the final link/Gripper which the Hessian represents
|
|
326
|
+
:param start: the first link which the Hessian represents
|
|
327
|
+
:param Je: The manipulator Jacobian in the ``end`` frame
|
|
328
|
+
:param tool: a static tool transformation matrix to apply to the
|
|
329
|
+
end of end, defaults to None
|
|
330
|
+
:returns: The manipulator Hessian in ``end`` frame
|
|
331
|
+
|
|
332
|
+
The manipulator Hessian tensor maps joint acceleration to end-effector
|
|
333
|
+
spatial acceleration, expressed in the ``end`` coordinate frame. This
|
|
334
|
+
function calulcates this based on the ETS of the robot. One of J0 or q
|
|
335
|
+
is required. Supply J0 if already calculated to save computation time
|
|
336
|
+
|
|
337
|
+
This method computes the manipulator Hessian in the ``end`` frame. If
|
|
338
|
+
we take the time derivative of the differential kinematic relationship
|
|
339
|
+
|
|
340
|
+
.. math::
|
|
341
|
+
|
|
342
|
+
\nu &= \mat{J}(\vec{q}) \dvec{q} \\
|
|
343
|
+
\alpha &= \dmat{J} \dvec{q} + \mat{J} \ddvec{q}
|
|
344
|
+
|
|
345
|
+
where
|
|
346
|
+
|
|
347
|
+
.. math::
|
|
348
|
+
|
|
349
|
+
\dmat{J} = \mat{H} \dvec{q}
|
|
350
|
+
|
|
351
|
+
and :math:`\mat{H} \in \mathbb{R}^{6\times n \times n}` is the
|
|
352
|
+
Hessian tensor.
|
|
353
|
+
|
|
354
|
+
The elements of the Hessian are
|
|
355
|
+
|
|
356
|
+
.. math::
|
|
357
|
+
|
|
358
|
+
\mat{H}_{i,j,k} = \frac{d^2 u_i}{d q_j d q_k}
|
|
359
|
+
|
|
360
|
+
where :math:`u = \{t_x, t_y, t_z, r_x, r_y, r_z\}` are the elements
|
|
361
|
+
of the spatial velocity vector.
|
|
362
|
+
|
|
363
|
+
Similarly, we can write
|
|
364
|
+
|
|
365
|
+
.. math::
|
|
366
|
+
|
|
367
|
+
\mat{J}_{i,j} = \frac{d u_i}{d q_j}
|
|
368
|
+
|
|
369
|
+
Examples
|
|
370
|
+
--------
|
|
371
|
+
The following example makes a ``Panda`` robot object, and solves for the
|
|
372
|
+
end-effector frame Hessian at the given joint angle configuration
|
|
373
|
+
|
|
374
|
+
.. runblock:: pycon
|
|
375
|
+
>>> import roboticstoolbox as rtb
|
|
376
|
+
>>> panda = rtb.models.Panda()
|
|
377
|
+
>>> panda.hessiane([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
378
|
+
|
|
379
|
+
.. rubric:: References
|
|
380
|
+
|
|
381
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
382
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
383
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
384
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
385
|
+
|
|
386
|
+
"""
|
|
387
|
+
|
|
388
|
+
return self.ets(start, end).hessiane(q, Je=Je, tool=tool)
|
|
389
|
+
|
|
390
|
+
def partial_fkine0(
|
|
391
|
+
self: KinematicsProtocol,
|
|
392
|
+
q: ArrayLike,
|
|
393
|
+
n: int = 3,
|
|
394
|
+
end: str | Link | Gripper | None = None,
|
|
395
|
+
start: str | Link | Gripper | None = None,
|
|
396
|
+
):
|
|
397
|
+
r"""
|
|
398
|
+
Manipulator Forward Kinematics nth Partial Derivative
|
|
399
|
+
|
|
400
|
+
:param q: The joint angles/configuration of the robot (Optional,
|
|
401
|
+
if not supplied will use the stored q values).
|
|
402
|
+
:param n: The derivative order, must be >= 3
|
|
403
|
+
:param end: the final link/Gripper which the Hessian represents
|
|
404
|
+
:param start: the first link which the Hessian represents
|
|
405
|
+
:returns: The nth Partial Derivative of the forward kinematics
|
|
406
|
+
|
|
407
|
+
This method computes the nth derivative of the forward kinematics where ``n`` is
|
|
408
|
+
greater than or equal to 3. This is an extension of the differential kinematics
|
|
409
|
+
where the Jacobian is the first partial derivative and the Hessian is the
|
|
410
|
+
second.
|
|
411
|
+
|
|
412
|
+
Examples
|
|
413
|
+
--------
|
|
414
|
+
The following example makes a ``Panda`` robot object, and solves for the
|
|
415
|
+
base-effector frame 4th defivative of the forward kinematics at the given
|
|
416
|
+
joint angle configuration
|
|
417
|
+
|
|
418
|
+
.. runblock:: pycon
|
|
419
|
+
>>> import roboticstoolbox as rtb
|
|
420
|
+
>>> panda = rtb.models.Panda()
|
|
421
|
+
>>> panda.partial_fkine0([0, -0.3, 0, -2.2, 0, 2, 0.7854], n=4)
|
|
422
|
+
|
|
423
|
+
.. rubric:: References
|
|
424
|
+
|
|
425
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
426
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
427
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
428
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
429
|
+
|
|
430
|
+
"""
|
|
431
|
+
|
|
432
|
+
return self.ets(start, end).partial_fkine0(q, n=n)
|
|
433
|
+
|
|
434
|
+
def jacob0_analytical(
|
|
435
|
+
self: KinematicsProtocol,
|
|
436
|
+
q: ArrayLike,
|
|
437
|
+
representation: L["rpy/xyz", "rpy/zyx", "eul", "exp"] = "rpy/xyz",
|
|
438
|
+
end: str | Link | Gripper | None = None,
|
|
439
|
+
start: str | Link | Gripper | None = None,
|
|
440
|
+
tool: NDArray | SE3 | None = None,
|
|
441
|
+
):
|
|
442
|
+
r"""
|
|
443
|
+
Manipulator analytical Jacobian in the ``start`` frame
|
|
444
|
+
|
|
445
|
+
:param q: Joint coordinate vector
|
|
446
|
+
:param representation: angular representation
|
|
447
|
+
:param end: the particular link or gripper whose velocity the Jacobian
|
|
448
|
+
describes, defaults to the base link
|
|
449
|
+
:param start: the link considered as the end-effector, defaults to the robots's end-effector
|
|
450
|
+
:param tool: a static tool transformation matrix to apply to the
|
|
451
|
+
end of end, defaults to None
|
|
452
|
+
:returns: Manipulator Jacobian in the ``start`` frame
|
|
453
|
+
|
|
454
|
+
``robot.jacob0_analytical(q)`` is the manipulator Jacobian matrix which maps
|
|
455
|
+
joint velocity to end-effector spatial velocity expressed in the
|
|
456
|
+
``start`` frame.
|
|
457
|
+
|
|
458
|
+
End-effector spatial velocity :math:`\nu = (v_x, v_y, v_z, \omega_x, \omega_y, \omega_z)^T`
|
|
459
|
+
is related to joint velocity by :math:`{}^{E}\!\nu = \mathbf{J}_m(q) \dot{q}`.
|
|
460
|
+
|
|
461
|
+
.. list-table::
|
|
462
|
+
:header-rows: 1
|
|
463
|
+
|
|
464
|
+
* - ``representation``
|
|
465
|
+
- Rotational representation
|
|
466
|
+
* - ``'rpy/xyz'``
|
|
467
|
+
- RPY angular rates in XYZ order
|
|
468
|
+
* - ``'rpy/zyx'``
|
|
469
|
+
- RPY angular rates in ZYX order
|
|
470
|
+
* - ``'eul'``
|
|
471
|
+
- Euler angular rates in ZYZ order
|
|
472
|
+
* - ``'exp'``
|
|
473
|
+
- exponential coordinate rates
|
|
474
|
+
|
|
475
|
+
Examples
|
|
476
|
+
--------
|
|
477
|
+
Makes a robot object and computes the analytic Jacobian for the given
|
|
478
|
+
joint configuration
|
|
479
|
+
|
|
480
|
+
.. runblock:: pycon
|
|
481
|
+
>>> import roboticstoolbox as rtb
|
|
482
|
+
>>> puma = rtb.models.ETS.Puma560()
|
|
483
|
+
>>> puma.jacob0_analytical([0, 0, 0, 0, 0, 0])
|
|
484
|
+
|
|
485
|
+
"""
|
|
486
|
+
|
|
487
|
+
return self.ets(start, end).jacob0_analytical(
|
|
488
|
+
q, tool=tool, representation=representation
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
# --------------------------------------------------------------------- #
|
|
492
|
+
# --------- IK Methods ------------------------------------------------ #
|
|
493
|
+
# --------------------------------------------------------------------- #
|
|
494
|
+
|
|
495
|
+
def ik_LM(
|
|
496
|
+
self: KinematicsProtocol,
|
|
497
|
+
Tep: NDArray | SE3,
|
|
498
|
+
end: str | Link | Gripper | None = None,
|
|
499
|
+
start: str | Link | Gripper | None = None,
|
|
500
|
+
q0: NDArray | None = None,
|
|
501
|
+
ilimit: int = 30,
|
|
502
|
+
slimit: int = 100,
|
|
503
|
+
tol: float = 1e-6,
|
|
504
|
+
mask: NDArray | None = None,
|
|
505
|
+
joint_limits: bool = True,
|
|
506
|
+
k: float = 1.0,
|
|
507
|
+
method: L["chan", "wampler", "sugihara"] = "chan",
|
|
508
|
+
) -> tuple[NDArray, int, int, int, float]:
|
|
509
|
+
r"""
|
|
510
|
+
Fast levenberg-Marquadt Numerical Inverse Kinematics Solver
|
|
511
|
+
|
|
512
|
+
:param Tep: The desired end-effector pose
|
|
513
|
+
:param end: the link considered as the end-effector
|
|
514
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
515
|
+
:param q0: The initial joint coordinate vector
|
|
516
|
+
:param ilimit: How many iterations are allowed within a search before a new search
|
|
517
|
+
is started
|
|
518
|
+
:param slimit: How many searches are allowed before being deemed unsuccessful
|
|
519
|
+
:param tol: Maximum allowed residual error E
|
|
520
|
+
:param mask: A 6 vector which assigns weights to Cartesian degrees-of-freedom
|
|
521
|
+
error priority
|
|
522
|
+
:param joint_limits: Reject solutions with joint limit violations
|
|
523
|
+
:param k: Sets the gain value for the damping matrix Wn in the next iteration
|
|
524
|
+
:param method: One of "chan", "sugihara" or "wampler". Defines which method is used
|
|
525
|
+
to calculate the damping matrix Wn in the ``step`` method
|
|
526
|
+
:returns: tuple (q, success, iterations, searches, residual)
|
|
527
|
+
|
|
528
|
+
A method which provides functionality to perform numerical inverse kinematics (IK)
|
|
529
|
+
using the Levemberg-Marquadt method. This
|
|
530
|
+
is a fast solver implemented in C++.
|
|
531
|
+
|
|
532
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
533
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
534
|
+
|
|
535
|
+
The operation is defined by the choice of the ``method`` kwarg.
|
|
536
|
+
|
|
537
|
+
The step is deined as
|
|
538
|
+
|
|
539
|
+
.. math::
|
|
540
|
+
|
|
541
|
+
\vec{q}_{k+1}
|
|
542
|
+
&=
|
|
543
|
+
\vec{q}_k +
|
|
544
|
+
\left(
|
|
545
|
+
\mat{A}_k
|
|
546
|
+
\right)^{-1}
|
|
547
|
+
\bf{g}_k \\
|
|
548
|
+
%
|
|
549
|
+
\mat{A}_k
|
|
550
|
+
&=
|
|
551
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
552
|
+
\mat{W}_e \
|
|
553
|
+
{\mat{J}(\vec{q}_k)}
|
|
554
|
+
+
|
|
555
|
+
\mat{W}_n
|
|
556
|
+
|
|
557
|
+
where :math:`\mat{W}_n = \text{diag}(\vec{w_n})(\vec{w_n} \in \mathbb{R}^n_{>0})` is a
|
|
558
|
+
diagonal damping matrix. The damping matrix ensures that :math:`\mat{A}_k` is
|
|
559
|
+
non-singular and positive definite. The performance of the LM method largely depends
|
|
560
|
+
on the choice of :math:`\mat{W}_n`.
|
|
561
|
+
|
|
562
|
+
*Chan's Method*
|
|
563
|
+
|
|
564
|
+
Chan proposed
|
|
565
|
+
|
|
566
|
+
.. math::
|
|
567
|
+
|
|
568
|
+
\mat{W}_n
|
|
569
|
+
=
|
|
570
|
+
λ E_k \mat{1}_n
|
|
571
|
+
|
|
572
|
+
where λ is a constant which reportedly does not have much influence on performance.
|
|
573
|
+
Use the kwarg `k` to adjust the weighting term λ.
|
|
574
|
+
|
|
575
|
+
*Sugihara's Method*
|
|
576
|
+
|
|
577
|
+
Sugihara proposed
|
|
578
|
+
|
|
579
|
+
.. math::
|
|
580
|
+
|
|
581
|
+
\mat{W}_n
|
|
582
|
+
=
|
|
583
|
+
E_k \mat{1}_n + \text{diag}(\hat{\vec{w}}_n)
|
|
584
|
+
|
|
585
|
+
where :math:`\hat{\vec{w}}_n \in \mathbb{R}^n`, :math:`\hat{w}_{n_i} = l^2 \sim 0.01 l^2`,
|
|
586
|
+
and :math:`l` is the length of a typical link within the manipulator. We provide the
|
|
587
|
+
variable `k` as a kwarg to adjust the value of :math:`w_n`.
|
|
588
|
+
|
|
589
|
+
*Wampler's Method*
|
|
590
|
+
|
|
591
|
+
Wampler proposed :math:`\vec{w_n}` to be a constant. This is set through the `k` kwarg.
|
|
592
|
+
|
|
593
|
+
Examples
|
|
594
|
+
--------
|
|
595
|
+
The following example makes a ``panda`` robot object, makes a goal
|
|
596
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
597
|
+
``Tep`` using the `ikine_LM` method.
|
|
598
|
+
|
|
599
|
+
.. runblock:: pycon
|
|
600
|
+
>>> import roboticstoolbox as rtb
|
|
601
|
+
>>> panda = rtb.models.Panda()
|
|
602
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
603
|
+
>>> panda.ikine_LM(Tep)
|
|
604
|
+
|
|
605
|
+
.. rubric:: Notes
|
|
606
|
+
|
|
607
|
+
The value for the ``k`` kwarg will depend on the ``method`` chosen and the arm you are
|
|
608
|
+
using. Use the following as a rough guide ``chan, k = 1.0 - 0.01``,
|
|
609
|
+
``wampler, k = 0.01 - 0.0001``, and ``sugihara, k = 0.1 - 0.0001``
|
|
610
|
+
|
|
611
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
612
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
613
|
+
|
|
614
|
+
This class supports null-space motion to assist with maximising manipulability and
|
|
615
|
+
avoiding joint limits. These are enabled by setting kq and km to non-zero values.
|
|
616
|
+
|
|
617
|
+
.. rubric:: References
|
|
618
|
+
|
|
619
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
620
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
621
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
622
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
623
|
+
|
|
624
|
+
See Also
|
|
625
|
+
--------
|
|
626
|
+
ik_NR
|
|
627
|
+
A fast numerical inverse kinematics solver using Newton-Raphson optimisation
|
|
628
|
+
ik_GN
|
|
629
|
+
A fast numerical inverse kinematics solver using Gauss-Newton optimisation
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
.. versionchanged:: 1.0.4
|
|
633
|
+
Merged the Levemberg-Marquadt IK solvers into the ik_LM method
|
|
634
|
+
|
|
635
|
+
"""
|
|
636
|
+
|
|
637
|
+
return self.ets(start, end).ik_LM(
|
|
638
|
+
Tep=Tep,
|
|
639
|
+
q0=q0,
|
|
640
|
+
ilimit=ilimit,
|
|
641
|
+
slimit=slimit,
|
|
642
|
+
tol=tol,
|
|
643
|
+
joint_limits=joint_limits,
|
|
644
|
+
mask=mask,
|
|
645
|
+
k=k,
|
|
646
|
+
method=method,
|
|
647
|
+
)
|
|
648
|
+
|
|
649
|
+
def ik_NR(
|
|
650
|
+
self: KinematicsProtocol,
|
|
651
|
+
Tep: NDArray | SE3,
|
|
652
|
+
end: str | Link | Gripper | None = None,
|
|
653
|
+
start: str | Link | Gripper | None = None,
|
|
654
|
+
q0: NDArray | None = None,
|
|
655
|
+
ilimit: int = 30,
|
|
656
|
+
slimit: int = 100,
|
|
657
|
+
tol: float = 1e-6,
|
|
658
|
+
mask: NDArray | None = None,
|
|
659
|
+
joint_limits: bool = True,
|
|
660
|
+
pinv: int = True,
|
|
661
|
+
pinv_damping: float = 0.0,
|
|
662
|
+
) -> tuple[NDArray, int, int, int, float]:
|
|
663
|
+
r"""
|
|
664
|
+
Fast numerical inverse kinematics using Newton-Raphson optimization
|
|
665
|
+
|
|
666
|
+
:param Tep: The desired end-effector pose or pose trajectory
|
|
667
|
+
:param end: the link considered as the end-effector
|
|
668
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
669
|
+
:param q0: initial joint configuration (default to random valid joint
|
|
670
|
+
configuration constrained by the joint limits of the robot)
|
|
671
|
+
:param ilimit: maximum number of iterations per search
|
|
672
|
+
:param slimit: maximum number of search attempts
|
|
673
|
+
:param tol: final error tolerance
|
|
674
|
+
:param mask: a mask vector which weights the end-effector error priority.
|
|
675
|
+
Corresponds to translation in X, Y and Z and rotation about X, Y and Z
|
|
676
|
+
respectively
|
|
677
|
+
:param joint_limits: constrain the solution to being within the joint limits of
|
|
678
|
+
the robot (reject solution with invalid joint configurations and perform
|
|
679
|
+
another search up to the slimit)
|
|
680
|
+
:param pinv: Use the pseudo-inverse instead of the normal matrix inverse
|
|
681
|
+
:param pinv_damping: Damping factor for the pseudo-inverse
|
|
682
|
+
:returns: tuple (q, success, iterations, searches, residual)
|
|
683
|
+
|
|
684
|
+
``sol = ets.ik_NR(Tep)`` are the joint coordinates (n) corresponding
|
|
685
|
+
to the robot end-effector pose ``Tep`` which is an ``SE3`` or ``ndarray`` object.
|
|
686
|
+
This method can be used for robots with any number of degrees of freedom. This
|
|
687
|
+
is a fast solver implemented in C++.
|
|
688
|
+
|
|
689
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
690
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
691
|
+
|
|
692
|
+
.. note::
|
|
693
|
+
|
|
694
|
+
When using this method with redundant robots (>6 DoF), ``pinv`` must be set to ``True``
|
|
695
|
+
|
|
696
|
+
The return value ``sol`` is a tuple with elements:
|
|
697
|
+
|
|
698
|
+
============== ========== ===============================================
|
|
699
|
+
Element Type Description
|
|
700
|
+
============== ========== ===============================================
|
|
701
|
+
``q`` ndarray(n) joint coordinates in units of radians or metres
|
|
702
|
+
``success`` int whether a solution was found
|
|
703
|
+
``iterations`` int total number of iterations
|
|
704
|
+
``searches`` int total number of searches
|
|
705
|
+
``residual`` float final value of cost function
|
|
706
|
+
============== ========== ===============================================
|
|
707
|
+
|
|
708
|
+
If ``success == 0`` the ``q`` values will be valid numbers, but the
|
|
709
|
+
solution will be in error. The amount of error is indicated by
|
|
710
|
+
the ``residual``.
|
|
711
|
+
|
|
712
|
+
Each iteration uses the Newton-Raphson optimisation method
|
|
713
|
+
|
|
714
|
+
.. math::
|
|
715
|
+
|
|
716
|
+
\vec{q}_{k+1} = \vec{q}_k + {^0\mat{J}(\vec{q}_k)}^{-1} \vec{e}_k
|
|
717
|
+
|
|
718
|
+
Examples
|
|
719
|
+
--------
|
|
720
|
+
The following example gets a ``panda`` robot object, makes a goal
|
|
721
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
722
|
+
``Tep`` using the `ikine_GN` method.
|
|
723
|
+
|
|
724
|
+
.. runblock:: pycon
|
|
725
|
+
>>> import roboticstoolbox as rtb
|
|
726
|
+
>>> panda = rtb.models.Panda()
|
|
727
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
728
|
+
>>> panda.ik_NR(Tep)
|
|
729
|
+
|
|
730
|
+
.. rubric:: Notes
|
|
731
|
+
|
|
732
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
733
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
734
|
+
|
|
735
|
+
.. rubric:: References
|
|
736
|
+
|
|
737
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
738
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
739
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
740
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
741
|
+
|
|
742
|
+
See Also
|
|
743
|
+
--------
|
|
744
|
+
ik_LM
|
|
745
|
+
A fast numerical inverse kinematics solver using Levenberg-Marquadt optimisation
|
|
746
|
+
ik_GN
|
|
747
|
+
A fast numerical inverse kinematics solver using Gauss-Newton optimisation
|
|
748
|
+
|
|
749
|
+
"""
|
|
750
|
+
|
|
751
|
+
return self.ets(start, end).ik_NR(
|
|
752
|
+
Tep=Tep,
|
|
753
|
+
q0=q0,
|
|
754
|
+
ilimit=ilimit,
|
|
755
|
+
slimit=slimit,
|
|
756
|
+
tol=tol,
|
|
757
|
+
joint_limits=joint_limits,
|
|
758
|
+
mask=mask,
|
|
759
|
+
pinv=pinv,
|
|
760
|
+
pinv_damping=pinv_damping,
|
|
761
|
+
)
|
|
762
|
+
|
|
763
|
+
def ik_GN(
|
|
764
|
+
self: KinematicsProtocol,
|
|
765
|
+
Tep: NDArray | SE3,
|
|
766
|
+
end: str | Link | Gripper | None = None,
|
|
767
|
+
start: str | Link | Gripper | None = None,
|
|
768
|
+
q0: NDArray | None = None,
|
|
769
|
+
ilimit: int = 30,
|
|
770
|
+
slimit: int = 100,
|
|
771
|
+
tol: float = 1e-6,
|
|
772
|
+
mask: NDArray | None = None,
|
|
773
|
+
joint_limits: bool = True,
|
|
774
|
+
pinv: int = True,
|
|
775
|
+
pinv_damping: float = 0.0,
|
|
776
|
+
) -> tuple[NDArray, int, int, int, float]:
|
|
777
|
+
r"""
|
|
778
|
+
Fast numerical inverse kinematics by Gauss-Newton optimization
|
|
779
|
+
|
|
780
|
+
:param Tep: The desired end-effector pose or pose trajectory
|
|
781
|
+
:param end: the link considered as the end-effector
|
|
782
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
783
|
+
:param q0: initial joint configuration (default to random valid joint
|
|
784
|
+
configuration constrained by the joint limits of the robot)
|
|
785
|
+
:param ilimit: maximum number of iterations per search
|
|
786
|
+
:param slimit: maximum number of search attempts
|
|
787
|
+
:param tol: final error tolerance
|
|
788
|
+
:param mask: a mask vector which weights the end-effector error priority.
|
|
789
|
+
Corresponds to translation in X, Y and Z and rotation about X, Y and Z
|
|
790
|
+
respectively
|
|
791
|
+
:param joint_limits: constrain the solution to being within the joint limits of
|
|
792
|
+
the robot (reject solution with invalid joint configurations and perform
|
|
793
|
+
another search up to the slimit)
|
|
794
|
+
:param pinv: Use the pseudo-inverse instead of the normal matrix inverse
|
|
795
|
+
:param pinv_damping: Damping factor for the pseudo-inverse
|
|
796
|
+
:returns: tuple (q, success, iterations, searches, residual)
|
|
797
|
+
|
|
798
|
+
``sol = ets.ik_GN(Tep)`` are the joint coordinates (n) corresponding
|
|
799
|
+
to the robot end-effector pose ``Tep`` which is an ``SE3`` or ``ndarray`` object.
|
|
800
|
+
This method can be used for robots with any number of degrees of freedom. This
|
|
801
|
+
is a fast solver implemented in C++.
|
|
802
|
+
|
|
803
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
804
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
805
|
+
|
|
806
|
+
.. note::
|
|
807
|
+
|
|
808
|
+
When using this method with redundant robots (>6 DoF), ``pinv`` must be set to ``True``
|
|
809
|
+
|
|
810
|
+
The return value ``sol`` is a tuple with elements:
|
|
811
|
+
|
|
812
|
+
============== ========== ===============================================
|
|
813
|
+
Element Type Description
|
|
814
|
+
============== ========== ===============================================
|
|
815
|
+
``q`` ndarray(n) joint coordinates in units of radians or metres
|
|
816
|
+
``success`` int whether a solution was found
|
|
817
|
+
``iterations`` int total number of iterations
|
|
818
|
+
``searches`` int total number of searches
|
|
819
|
+
``residual`` float final value of cost function
|
|
820
|
+
============== ========== ===============================================
|
|
821
|
+
|
|
822
|
+
If ``success == 0`` the ``q`` values will be valid numbers, but the
|
|
823
|
+
solution will be in error. The amount of error is indicated by
|
|
824
|
+
the ``residual``.
|
|
825
|
+
|
|
826
|
+
Each iteration uses the Gauss-Newton optimisation method
|
|
827
|
+
|
|
828
|
+
.. math::
|
|
829
|
+
|
|
830
|
+
\vec{q}_{k+1} &= \vec{q}_k +
|
|
831
|
+
\left(
|
|
832
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
833
|
+
\mat{W}_e \
|
|
834
|
+
{\mat{J}(\vec{q}_k)}
|
|
835
|
+
\right)^{-1}
|
|
836
|
+
\bf{g}_k \\
|
|
837
|
+
\bf{g}_k &=
|
|
838
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
839
|
+
\mat{W}_e
|
|
840
|
+
\vec{e}_k
|
|
841
|
+
|
|
842
|
+
where :math:`\mat{J} = {^0\mat{J}}` is the base-frame manipulator Jacobian. If
|
|
843
|
+
:math:`\mat{J}(\vec{q}_k)` is non-singular, and :math:`\mat{W}_e = \mat{1}_n`, then
|
|
844
|
+
the above provides the pseudoinverse solution. However, if :math:`\mat{J}(\vec{q}_k)`
|
|
845
|
+
is singular, the above can not be computed and the GN solution is infeasible.
|
|
846
|
+
|
|
847
|
+
Examples
|
|
848
|
+
--------
|
|
849
|
+
The following example gets a ``panda`` robot object, makes a goal
|
|
850
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
851
|
+
``Tep`` using the `ikine_GN` method.
|
|
852
|
+
|
|
853
|
+
.. runblock:: pycon
|
|
854
|
+
>>> import roboticstoolbox as rtb
|
|
855
|
+
>>> panda = rtb.models.Panda()
|
|
856
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
857
|
+
>>> panda.ik_GN(Tep)
|
|
858
|
+
|
|
859
|
+
.. rubric:: Notes
|
|
860
|
+
|
|
861
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
862
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
863
|
+
|
|
864
|
+
.. rubric:: References
|
|
865
|
+
|
|
866
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
867
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
868
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
869
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
870
|
+
|
|
871
|
+
See Also
|
|
872
|
+
--------
|
|
873
|
+
ik_NR
|
|
874
|
+
A fast numerical inverse kinematics solver using Newton-Raphson optimisation
|
|
875
|
+
ik_GN
|
|
876
|
+
A fast numerical inverse kinematics solver using Gauss-Newton optimisation
|
|
877
|
+
|
|
878
|
+
"""
|
|
879
|
+
|
|
880
|
+
return self.ets(start, end).ik_GN(
|
|
881
|
+
Tep=Tep,
|
|
882
|
+
q0=q0,
|
|
883
|
+
ilimit=ilimit,
|
|
884
|
+
slimit=slimit,
|
|
885
|
+
tol=tol,
|
|
886
|
+
joint_limits=joint_limits,
|
|
887
|
+
mask=mask,
|
|
888
|
+
pinv=pinv,
|
|
889
|
+
pinv_damping=pinv_damping,
|
|
890
|
+
)
|
|
891
|
+
|
|
892
|
+
def ikine_LM(
|
|
893
|
+
self: KinematicsProtocol,
|
|
894
|
+
Tep: NDArray | SE3,
|
|
895
|
+
end: str | Link | Gripper | None = None,
|
|
896
|
+
start: str | Link | Gripper | None = None,
|
|
897
|
+
q0: ArrayLike | None = None,
|
|
898
|
+
ilimit: int = 30,
|
|
899
|
+
slimit: int = 100,
|
|
900
|
+
tol: float = 1e-6,
|
|
901
|
+
mask: ArrayLike | None = None,
|
|
902
|
+
joint_limits: bool = True,
|
|
903
|
+
seed: int | None = None,
|
|
904
|
+
k: float = 1.0,
|
|
905
|
+
method: L["chan", "wampler", "sugihara"] = "chan",
|
|
906
|
+
kq: float = 0.0,
|
|
907
|
+
km: float = 0.0,
|
|
908
|
+
ps: float = 0.0,
|
|
909
|
+
pi: NDArray | float = 0.3,
|
|
910
|
+
**kwargs,
|
|
911
|
+
):
|
|
912
|
+
r"""
|
|
913
|
+
Levenberg-Marquadt Numerical Inverse Kinematics Solver
|
|
914
|
+
|
|
915
|
+
:param Tep: The desired end-effector pose
|
|
916
|
+
:param end: the link considered as the end-effector
|
|
917
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
918
|
+
:param q0: The initial joint coordinate vector
|
|
919
|
+
:param ilimit: How many iterations are allowed within a search before a new search
|
|
920
|
+
is started
|
|
921
|
+
:param slimit: How many searches are allowed before being deemed unsuccessful
|
|
922
|
+
:param tol: Maximum allowed residual error E
|
|
923
|
+
:param mask: A 6 vector which assigns weights to Cartesian degrees-of-freedom
|
|
924
|
+
error priority
|
|
925
|
+
:param joint_limits: Reject solutions with joint limit violations
|
|
926
|
+
:param seed: A seed for the private RNG used to generate random joint coordinate
|
|
927
|
+
vectors
|
|
928
|
+
:param k: Sets the gain value for the damping matrix Wn in the next iteration
|
|
929
|
+
:param method: One of "chan", "sugihara" or "wampler". Defines which method is used
|
|
930
|
+
to calculate the damping matrix Wn in the ``step`` method
|
|
931
|
+
:param kq: The gain for joint limit avoidance. Setting to 0.0 will remove this
|
|
932
|
+
completely from the solution
|
|
933
|
+
:param km: The gain for maximisation. Setting to 0.0 will remove this completely
|
|
934
|
+
from the solution
|
|
935
|
+
:param ps: The minimum angle/distance (in radians or metres) in which the joint is
|
|
936
|
+
allowed to approach to its limit
|
|
937
|
+
:param pi: The influence angle/distance (in radians or metres) in null space motion
|
|
938
|
+
becomes active
|
|
939
|
+
|
|
940
|
+
A method which provides functionality to perform numerical inverse kinematics (IK)
|
|
941
|
+
using the Levemberg-Marquadt method.
|
|
942
|
+
|
|
943
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
944
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
945
|
+
|
|
946
|
+
The operation is defined by the choice of the ``method`` kwarg.
|
|
947
|
+
|
|
948
|
+
The step is deined as
|
|
949
|
+
|
|
950
|
+
.. math::
|
|
951
|
+
|
|
952
|
+
\vec{q}_{k+1}
|
|
953
|
+
&=
|
|
954
|
+
\vec{q}_k +
|
|
955
|
+
\left(
|
|
956
|
+
\mat{A}_k
|
|
957
|
+
\right)^{-1}
|
|
958
|
+
\bf{g}_k \\
|
|
959
|
+
%
|
|
960
|
+
\mat{A}_k
|
|
961
|
+
&=
|
|
962
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
963
|
+
\mat{W}_e \
|
|
964
|
+
{\mat{J}(\vec{q}_k)}
|
|
965
|
+
+
|
|
966
|
+
\mat{W}_n
|
|
967
|
+
|
|
968
|
+
where :math:`\mat{W}_n = \text{diag}(\vec{w_n})(\vec{w_n} \in \mathbb{R}^n_{>0})` is a
|
|
969
|
+
diagonal damping matrix. The damping matrix ensures that :math:`\mat{A}_k` is
|
|
970
|
+
non-singular and positive definite. The performance of the LM method largely depends
|
|
971
|
+
on the choice of :math:`\mat{W}_n`.
|
|
972
|
+
|
|
973
|
+
*Chan's Method*
|
|
974
|
+
|
|
975
|
+
Chan proposed
|
|
976
|
+
|
|
977
|
+
.. math::
|
|
978
|
+
|
|
979
|
+
\mat{W}_n
|
|
980
|
+
=
|
|
981
|
+
λ E_k \mat{1}_n
|
|
982
|
+
|
|
983
|
+
where λ is a constant which reportedly does not have much influence on performance.
|
|
984
|
+
Use the kwarg `k` to adjust the weighting term λ.
|
|
985
|
+
|
|
986
|
+
*Sugihara's Method*
|
|
987
|
+
|
|
988
|
+
Sugihara proposed
|
|
989
|
+
|
|
990
|
+
.. math::
|
|
991
|
+
|
|
992
|
+
\mat{W}_n
|
|
993
|
+
=
|
|
994
|
+
E_k \mat{1}_n + \text{diag}(\hat{\vec{w}}_n)
|
|
995
|
+
|
|
996
|
+
where :math:`\hat{\vec{w}}_n \in \mathbb{R}^n`, :math:`\hat{w}_{n_i} = l^2 \sim 0.01 l^2`,
|
|
997
|
+
and :math:`l` is the length of a typical link within the manipulator. We provide the
|
|
998
|
+
variable `k` as a kwarg to adjust the value of :math:`w_n`.
|
|
999
|
+
|
|
1000
|
+
*Wampler's Method*
|
|
1001
|
+
|
|
1002
|
+
Wampler proposed :math:`\vec{w_n}` to be a constant. This is set through the `k` kwarg.
|
|
1003
|
+
|
|
1004
|
+
Examples
|
|
1005
|
+
--------
|
|
1006
|
+
The following example makes a ``panda`` robot object, makes a goal
|
|
1007
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
1008
|
+
``Tep`` using the `ikine_LM` method.
|
|
1009
|
+
|
|
1010
|
+
.. runblock:: pycon
|
|
1011
|
+
>>> import roboticstoolbox as rtb
|
|
1012
|
+
>>> panda = rtb.models.Panda()
|
|
1013
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
1014
|
+
>>> panda.ikine_LM(Tep)
|
|
1015
|
+
|
|
1016
|
+
.. rubric:: Notes
|
|
1017
|
+
|
|
1018
|
+
The value for the ``k`` kwarg will depend on the ``method`` chosen and the arm you are
|
|
1019
|
+
using. Use the following as a rough guide ``chan, k = 1.0 - 0.01``,
|
|
1020
|
+
``wampler, k = 0.01 - 0.0001``, and ``sugihara, k = 0.1 - 0.0001``
|
|
1021
|
+
|
|
1022
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
1023
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
1024
|
+
|
|
1025
|
+
This class supports null-space motion to assist with maximising manipulability and
|
|
1026
|
+
avoiding joint limits. These are enabled by setting kq and km to non-zero values.
|
|
1027
|
+
|
|
1028
|
+
.. rubric:: References
|
|
1029
|
+
|
|
1030
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
1031
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
1032
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
1033
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
1034
|
+
|
|
1035
|
+
See Also
|
|
1036
|
+
--------
|
|
1037
|
+
:py:class:`~roboticstoolbox.robot.IK.IK_LM`
|
|
1038
|
+
An IK Solver class which implements the Levemberg Marquadt optimisation technique
|
|
1039
|
+
ikine_NR
|
|
1040
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_NR` class as a method within the :py:class:`Robot` class
|
|
1041
|
+
ikine_GN
|
|
1042
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_GN` class as a method within the :py:class:`Robot` class
|
|
1043
|
+
ikine_QP
|
|
1044
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_QP` class as a method within the :py:class:`Robot` class
|
|
1045
|
+
|
|
1046
|
+
|
|
1047
|
+
.. versionchanged:: 1.0.4
|
|
1048
|
+
Added the Levemberg-Marquadt IK solver method on the `Robot` class
|
|
1049
|
+
|
|
1050
|
+
"""
|
|
1051
|
+
|
|
1052
|
+
return self.ets(start, end).ikine_LM(
|
|
1053
|
+
Tep=Tep,
|
|
1054
|
+
q0=q0,
|
|
1055
|
+
ilimit=ilimit,
|
|
1056
|
+
slimit=slimit,
|
|
1057
|
+
tol=tol,
|
|
1058
|
+
joint_limits=joint_limits,
|
|
1059
|
+
mask=mask,
|
|
1060
|
+
seed=seed,
|
|
1061
|
+
k=k,
|
|
1062
|
+
method=method,
|
|
1063
|
+
kq=kq,
|
|
1064
|
+
km=km,
|
|
1065
|
+
ps=ps,
|
|
1066
|
+
pi=pi,
|
|
1067
|
+
**kwargs,
|
|
1068
|
+
)
|
|
1069
|
+
|
|
1070
|
+
def ikine_NR(
|
|
1071
|
+
self: KinematicsProtocol,
|
|
1072
|
+
Tep: NDArray | SE3,
|
|
1073
|
+
end: str | Link | Gripper | None = None,
|
|
1074
|
+
start: str | Link | Gripper | None = None,
|
|
1075
|
+
q0: ArrayLike | None = None,
|
|
1076
|
+
ilimit: int = 30,
|
|
1077
|
+
slimit: int = 100,
|
|
1078
|
+
tol: float = 1e-6,
|
|
1079
|
+
mask: ArrayLike | None = None,
|
|
1080
|
+
joint_limits: bool = True,
|
|
1081
|
+
seed: int | None = None,
|
|
1082
|
+
pinv: bool = False,
|
|
1083
|
+
kq: float = 0.0,
|
|
1084
|
+
km: float = 0.0,
|
|
1085
|
+
ps: float = 0.0,
|
|
1086
|
+
pi: NDArray | float = 0.3,
|
|
1087
|
+
**kwargs,
|
|
1088
|
+
):
|
|
1089
|
+
r"""
|
|
1090
|
+
Newton-Raphson Numerical Inverse Kinematics Solver
|
|
1091
|
+
|
|
1092
|
+
:param Tep: The desired end-effector pose
|
|
1093
|
+
:param end: the link considered as the end-effector
|
|
1094
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
1095
|
+
:param q0: The initial joint coordinate vector
|
|
1096
|
+
:param ilimit: How many iterations are allowed within a search before a new search
|
|
1097
|
+
is started
|
|
1098
|
+
:param slimit: How many searches are allowed before being deemed unsuccessful
|
|
1099
|
+
:param tol: Maximum allowed residual error E
|
|
1100
|
+
:param mask: A 6 vector which assigns weights to Cartesian degrees-of-freedom
|
|
1101
|
+
error priority
|
|
1102
|
+
:param joint_limits: Reject solutions with joint limit violations
|
|
1103
|
+
:param seed: A seed for the private RNG used to generate random joint coordinate
|
|
1104
|
+
vectors
|
|
1105
|
+
:param pinv: If True, will use the pseudoinverse in the `step` method instead of
|
|
1106
|
+
the normal inverse
|
|
1107
|
+
:param kq: The gain for joint limit avoidance. Setting to 0.0 will remove this
|
|
1108
|
+
completely from the solution
|
|
1109
|
+
:param km: The gain for maximisation. Setting to 0.0 will remove this completely
|
|
1110
|
+
from the solution
|
|
1111
|
+
:param ps: The minimum angle/distance (in radians or metres) in which the joint is
|
|
1112
|
+
allowed to approach to its limit
|
|
1113
|
+
:param pi: The influence angle/distance (in radians or metres) in null space motion
|
|
1114
|
+
becomes active
|
|
1115
|
+
|
|
1116
|
+
A method which provides functionality to perform numerical inverse kinematics (IK)
|
|
1117
|
+
using the Newton-Raphson method.
|
|
1118
|
+
|
|
1119
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
1120
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
1121
|
+
|
|
1122
|
+
.. note::
|
|
1123
|
+
|
|
1124
|
+
When using this method with redundant robots (>6 DoF), ``pinv`` must be set to ``True``
|
|
1125
|
+
|
|
1126
|
+
Each iteration uses the Newton-Raphson optimisation method
|
|
1127
|
+
|
|
1128
|
+
.. math::
|
|
1129
|
+
|
|
1130
|
+
\vec{q}_{k+1} = \vec{q}_k + {^0\mat{J}(\vec{q}_k)}^{-1} \vec{e}_k
|
|
1131
|
+
|
|
1132
|
+
Examples
|
|
1133
|
+
--------
|
|
1134
|
+
The following example gets a ``panda`` robot object, makes a goal
|
|
1135
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
1136
|
+
``Tep`` using the `ikine_NR` method.
|
|
1137
|
+
|
|
1138
|
+
.. runblock:: pycon
|
|
1139
|
+
>>> import roboticstoolbox as rtb
|
|
1140
|
+
>>> panda = rtb.models.Panda()
|
|
1141
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
1142
|
+
>>> panda.ikine_NR(Tep)
|
|
1143
|
+
|
|
1144
|
+
.. rubric:: Notes
|
|
1145
|
+
|
|
1146
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
1147
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
1148
|
+
|
|
1149
|
+
This class supports null-space motion to assist with maximising manipulability and
|
|
1150
|
+
avoiding joint limits. These are enabled by setting kq and km to non-zero values.
|
|
1151
|
+
|
|
1152
|
+
.. rubric:: References
|
|
1153
|
+
|
|
1154
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
1155
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
1156
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
1157
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
1158
|
+
|
|
1159
|
+
See Also
|
|
1160
|
+
--------
|
|
1161
|
+
:py:class:`~roboticstoolbox.robot.IK.IK_NR`
|
|
1162
|
+
An IK Solver class which implements the Newton-Raphson optimisation technique
|
|
1163
|
+
ikine_LM
|
|
1164
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_LM` class as a method within the :py:class:`ETS` class
|
|
1165
|
+
ikine_GN
|
|
1166
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_GN` class as a method within the :py:class:`ETS` class
|
|
1167
|
+
ikine_QP
|
|
1168
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_QP` class as a method within the :py:class:`ETS` class
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
.. versionchanged:: 1.0.4
|
|
1172
|
+
Added the Newton-Raphson IK solver method on the `Robot` class
|
|
1173
|
+
|
|
1174
|
+
"""
|
|
1175
|
+
|
|
1176
|
+
return self.ets(start, end).ikine_NR(
|
|
1177
|
+
Tep=Tep,
|
|
1178
|
+
q0=q0,
|
|
1179
|
+
ilimit=ilimit,
|
|
1180
|
+
slimit=slimit,
|
|
1181
|
+
tol=tol,
|
|
1182
|
+
joint_limits=joint_limits,
|
|
1183
|
+
mask=mask,
|
|
1184
|
+
seed=seed,
|
|
1185
|
+
pinv=pinv,
|
|
1186
|
+
kq=kq,
|
|
1187
|
+
km=km,
|
|
1188
|
+
ps=ps,
|
|
1189
|
+
pi=pi,
|
|
1190
|
+
**kwargs,
|
|
1191
|
+
)
|
|
1192
|
+
|
|
1193
|
+
def ikine_GN(
|
|
1194
|
+
self: KinematicsProtocol,
|
|
1195
|
+
Tep: NDArray | SE3,
|
|
1196
|
+
end: str | Link | Gripper | None = None,
|
|
1197
|
+
start: str | Link | Gripper | None = None,
|
|
1198
|
+
q0: ArrayLike | None = None,
|
|
1199
|
+
ilimit: int = 30,
|
|
1200
|
+
slimit: int = 100,
|
|
1201
|
+
tol: float = 1e-6,
|
|
1202
|
+
mask: ArrayLike | None = None,
|
|
1203
|
+
joint_limits: bool = True,
|
|
1204
|
+
seed: int | None = None,
|
|
1205
|
+
pinv: bool = False,
|
|
1206
|
+
kq: float = 0.0,
|
|
1207
|
+
km: float = 0.0,
|
|
1208
|
+
ps: float = 0.0,
|
|
1209
|
+
pi: NDArray | float = 0.3,
|
|
1210
|
+
**kwargs,
|
|
1211
|
+
):
|
|
1212
|
+
r"""
|
|
1213
|
+
Gauss-Newton Numerical Inverse Kinematics Solver
|
|
1214
|
+
|
|
1215
|
+
:param Tep: The desired end-effector pose
|
|
1216
|
+
:param end: the link considered as the end-effector
|
|
1217
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
1218
|
+
:param q0: The initial joint coordinate vector
|
|
1219
|
+
:param ilimit: How many iterations are allowed within a search before a new search
|
|
1220
|
+
is started
|
|
1221
|
+
:param slimit: How many searches are allowed before being deemed unsuccessful
|
|
1222
|
+
:param tol: Maximum allowed residual error E
|
|
1223
|
+
:param mask: A 6 vector which assigns weights to Cartesian degrees-of-freedom
|
|
1224
|
+
error priority
|
|
1225
|
+
:param joint_limits: Reject solutions with joint limit violations
|
|
1226
|
+
:param seed: A seed for the private RNG used to generate random joint coordinate
|
|
1227
|
+
vectors
|
|
1228
|
+
:param pinv: If True, will use the pseudoinverse in the `step` method instead of
|
|
1229
|
+
the normal inverse
|
|
1230
|
+
:param kq: The gain for joint limit avoidance. Setting to 0.0 will remove this
|
|
1231
|
+
completely from the solution
|
|
1232
|
+
:param km: The gain for maximisation. Setting to 0.0 will remove this completely
|
|
1233
|
+
from the solution
|
|
1234
|
+
:param ps: The minimum angle/distance (in radians or metres) in which the joint is
|
|
1235
|
+
allowed to approach to its limit
|
|
1236
|
+
:param pi: The influence angle/distance (in radians or metres) in null space motion
|
|
1237
|
+
becomes active
|
|
1238
|
+
|
|
1239
|
+
A method which provides functionality to perform numerical inverse kinematics (IK)
|
|
1240
|
+
using the Gauss-Newton method.
|
|
1241
|
+
|
|
1242
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
1243
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
1244
|
+
|
|
1245
|
+
.. note::
|
|
1246
|
+
|
|
1247
|
+
When using this method with redundant robots (>6 DoF), ``pinv`` must be set to ``True``
|
|
1248
|
+
|
|
1249
|
+
Each iteration uses the Gauss-Newton optimisation method
|
|
1250
|
+
|
|
1251
|
+
.. math::
|
|
1252
|
+
|
|
1253
|
+
\vec{q}_{k+1} &= \vec{q}_k +
|
|
1254
|
+
\left(
|
|
1255
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
1256
|
+
\mat{W}_e \
|
|
1257
|
+
{\mat{J}(\vec{q}_k)}
|
|
1258
|
+
\right)^{-1}
|
|
1259
|
+
\bf{g}_k \\
|
|
1260
|
+
\bf{g}_k &=
|
|
1261
|
+
{\mat{J}(\vec{q}_k)}^\top
|
|
1262
|
+
\mat{W}_e
|
|
1263
|
+
\vec{e}_k
|
|
1264
|
+
|
|
1265
|
+
where :math:`\mat{J} = {^0\mat{J}}` is the base-frame manipulator Jacobian. If
|
|
1266
|
+
:math:`\mat{J}(\vec{q}_k)` is non-singular, and :math:`\mat{W}_e = \mat{1}_n`, then
|
|
1267
|
+
the above provides the pseudoinverse solution. However, if :math:`\mat{J}(\vec{q}_k)`
|
|
1268
|
+
is singular, the above can not be computed and the GN solution is infeasible.
|
|
1269
|
+
|
|
1270
|
+
Examples
|
|
1271
|
+
--------
|
|
1272
|
+
The following example gets a ``panda`` robot object, makes a goal
|
|
1273
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
1274
|
+
``Tep`` using the `ikine_GN` method.
|
|
1275
|
+
|
|
1276
|
+
.. runblock:: pycon
|
|
1277
|
+
>>> import roboticstoolbox as rtb
|
|
1278
|
+
>>> panda = rtb.models.Panda()
|
|
1279
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
1280
|
+
>>> panda.ikine_GN(Tep)
|
|
1281
|
+
|
|
1282
|
+
.. rubric:: Notes
|
|
1283
|
+
|
|
1284
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
1285
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
1286
|
+
|
|
1287
|
+
This class supports null-space motion to assist with maximising manipulability and
|
|
1288
|
+
avoiding joint limits. These are enabled by setting kq and km to non-zero values.
|
|
1289
|
+
|
|
1290
|
+
.. rubric:: References
|
|
1291
|
+
|
|
1292
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
1293
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
1294
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
1295
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
1296
|
+
|
|
1297
|
+
See Also
|
|
1298
|
+
--------
|
|
1299
|
+
:py:class:`~roboticstoolbox.robot.IK.IK_NR`
|
|
1300
|
+
An IK Solver class which implements the Newton-Raphson optimisation technique
|
|
1301
|
+
ikine_LM
|
|
1302
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_LM` class as a method within the :py:class:`ETS` class
|
|
1303
|
+
ikine_NR
|
|
1304
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_NR` class as a method within the :py:class:`ETS` class
|
|
1305
|
+
ikine_QP
|
|
1306
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_QP` class as a method within the :py:class:`ETS` class
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
.. versionchanged:: 1.0.4
|
|
1310
|
+
Added the Gauss-Newton IK solver method on the `Robot` class
|
|
1311
|
+
|
|
1312
|
+
"""
|
|
1313
|
+
|
|
1314
|
+
return self.ets(start, end).ikine_GN(
|
|
1315
|
+
Tep=Tep,
|
|
1316
|
+
q0=q0,
|
|
1317
|
+
ilimit=ilimit,
|
|
1318
|
+
slimit=slimit,
|
|
1319
|
+
tol=tol,
|
|
1320
|
+
joint_limits=joint_limits,
|
|
1321
|
+
mask=mask,
|
|
1322
|
+
seed=seed,
|
|
1323
|
+
pinv=pinv,
|
|
1324
|
+
kq=kq,
|
|
1325
|
+
km=km,
|
|
1326
|
+
ps=ps,
|
|
1327
|
+
pi=pi,
|
|
1328
|
+
**kwargs,
|
|
1329
|
+
)
|
|
1330
|
+
|
|
1331
|
+
def ikine_QP(
|
|
1332
|
+
self: KinematicsProtocol,
|
|
1333
|
+
Tep: NDArray | SE3,
|
|
1334
|
+
end: str | Link | Gripper | None = None,
|
|
1335
|
+
start: str | Link | Gripper | None = None,
|
|
1336
|
+
q0: ArrayLike | None = None,
|
|
1337
|
+
ilimit: int = 30,
|
|
1338
|
+
slimit: int = 100,
|
|
1339
|
+
tol: float = 1e-6,
|
|
1340
|
+
mask: ArrayLike | None = None,
|
|
1341
|
+
joint_limits: bool = True,
|
|
1342
|
+
seed: int | None = None,
|
|
1343
|
+
kj=1.0,
|
|
1344
|
+
ks=1.0,
|
|
1345
|
+
kq: float = 0.0,
|
|
1346
|
+
km: float = 0.0,
|
|
1347
|
+
ps: float = 0.0,
|
|
1348
|
+
pi: NDArray | float = 0.3,
|
|
1349
|
+
**kwargs,
|
|
1350
|
+
):
|
|
1351
|
+
r"""
|
|
1352
|
+
Quadratic Programming Numerical Inverse Kinematics Solver
|
|
1353
|
+
|
|
1354
|
+
:param Tep: The desired end-effector pose
|
|
1355
|
+
:param end: the link considered as the end-effector
|
|
1356
|
+
:param start: the link considered as the base frame, defaults to the robots's base frame
|
|
1357
|
+
:param q0: The initial joint coordinate vector
|
|
1358
|
+
:param ilimit: How many iterations are allowed within a search before a new search
|
|
1359
|
+
is started
|
|
1360
|
+
:param slimit: How many searches are allowed before being deemed unsuccessful
|
|
1361
|
+
:param tol: Maximum allowed residual error E
|
|
1362
|
+
:param mask: A 6 vector which assigns weights to Cartesian degrees-of-freedom
|
|
1363
|
+
error priority
|
|
1364
|
+
:param joint_limits: Reject solutions with joint limit violations
|
|
1365
|
+
:param seed: A seed for the private RNG used to generate random joint coordinate
|
|
1366
|
+
vectors
|
|
1367
|
+
:param kj: A gain for joint velocity norm minimisation
|
|
1368
|
+
:param ks: A gain which adjusts the cost of slack (intentional error)
|
|
1369
|
+
:param kq: The gain for joint limit avoidance. Setting to 0.0 will remove this
|
|
1370
|
+
completely from the solution
|
|
1371
|
+
:param km: The gain for maximisation. Setting to 0.0 will remove this completely
|
|
1372
|
+
from the solution
|
|
1373
|
+
:param ps: The minimum angle/distance (in radians or metres) in which the joint is
|
|
1374
|
+
allowed to approach to its limit
|
|
1375
|
+
:param pi: The influence angle/distance (in radians or metres) in null space motion
|
|
1376
|
+
becomes active
|
|
1377
|
+
:raises ImportError: If the package ``qpsolvers`` is not installed
|
|
1378
|
+
|
|
1379
|
+
A method that provides functionality to perform numerical inverse kinematics
|
|
1380
|
+
(IK) using a quadratic progamming approach.
|
|
1381
|
+
|
|
1382
|
+
See the :ref:`Inverse Kinematics Docs Page <IK>` for more details and for a
|
|
1383
|
+
**tutorial** on numerical IK, see `here <https://bit.ly/3ak5GDi>`_.
|
|
1384
|
+
|
|
1385
|
+
Each iteration uses the following approach
|
|
1386
|
+
|
|
1387
|
+
.. math::
|
|
1388
|
+
|
|
1389
|
+
\vec{q}_{k+1} = \vec{q}_{k} + \dot{\vec{q}}.
|
|
1390
|
+
|
|
1391
|
+
where the QP is defined as
|
|
1392
|
+
|
|
1393
|
+
.. math::
|
|
1394
|
+
|
|
1395
|
+
\min_x \quad f_o(\vec{x}) &= \frac{1}{2} \vec{x}^\top \mathcal{Q} \vec{x}+ \mathcal{C}^\top \vec{x}, \\
|
|
1396
|
+
\text{subject to} \quad \mathcal{J} \vec{x} &= \vec{\nu}, \\
|
|
1397
|
+
\mathcal{A} \vec{x} &\leq \mathcal{B}, \\
|
|
1398
|
+
\vec{x}^- &\leq \vec{x} \leq \vec{x}^+
|
|
1399
|
+
|
|
1400
|
+
with
|
|
1401
|
+
|
|
1402
|
+
.. math::
|
|
1403
|
+
|
|
1404
|
+
\vec{x} &=
|
|
1405
|
+
\begin{pmatrix}
|
|
1406
|
+
\dvec{q} \\ \vec{\delta}
|
|
1407
|
+
\end{pmatrix} \in \mathbb{R}^{(n+6)} \\
|
|
1408
|
+
\mathcal{Q} &=
|
|
1409
|
+
\begin{pmatrix}
|
|
1410
|
+
\lambda_q \mat{1}_{n} & \mathbf{0}_{6 \times 6} \\ \mathbf{0}_{n \times n} & \lambda_\delta \mat{1}_{6}
|
|
1411
|
+
\end{pmatrix} \in \mathbb{R}^{(n+6) \times (n+6)} \\
|
|
1412
|
+
\mathcal{J} &=
|
|
1413
|
+
\begin{pmatrix}
|
|
1414
|
+
\mat{J}(\vec{q}) & \mat{1}_{6}
|
|
1415
|
+
\end{pmatrix} \in \mathbb{R}^{6 \times (n+6)} \\
|
|
1416
|
+
\mathcal{C} &=
|
|
1417
|
+
\begin{pmatrix}
|
|
1418
|
+
\mat{J}_m \\ \bf{0}_{6 \times 1}
|
|
1419
|
+
\end{pmatrix} \in \mathbb{R}^{(n + 6)} \\
|
|
1420
|
+
\mathcal{A} &=
|
|
1421
|
+
\begin{pmatrix}
|
|
1422
|
+
\mat{1}_{n \times n + 6} \\
|
|
1423
|
+
\end{pmatrix} \in \mathbb{R}^{(l + n) \times (n + 6)} \\
|
|
1424
|
+
\mathcal{B} &=
|
|
1425
|
+
\eta
|
|
1426
|
+
\begin{pmatrix}
|
|
1427
|
+
\frac{\rho_0 - \rho_s}
|
|
1428
|
+
{\rho_i - \rho_s} \\
|
|
1429
|
+
\vdots \\
|
|
1430
|
+
\frac{\rho_n - \rho_s}
|
|
1431
|
+
{\rho_i - \rho_s}
|
|
1432
|
+
\end{pmatrix} \in \mathbb{R}^{n} \\
|
|
1433
|
+
\vec{x}^{-, +} &=
|
|
1434
|
+
\begin{pmatrix}
|
|
1435
|
+
\dvec{q}^{-, +} \\
|
|
1436
|
+
\vec{\delta}^{-, +}
|
|
1437
|
+
\end{pmatrix} \in \mathbb{R}^{(n+6)},
|
|
1438
|
+
|
|
1439
|
+
where :math:`\vec{\delta} \in \mathbb{R}^6` is the slack vector,
|
|
1440
|
+
:math:`\lambda_\delta \in \mathbb{R}^+` is a gain term which adjusts the
|
|
1441
|
+
cost of the norm of the slack vector in the optimiser,
|
|
1442
|
+
:math:`\dvec{q}^{-,+}` are the minimum and maximum joint velocities, and
|
|
1443
|
+
:math:`\dvec{\delta}^{-,+}` are the minimum and maximum slack velocities.
|
|
1444
|
+
|
|
1445
|
+
Examples
|
|
1446
|
+
--------
|
|
1447
|
+
The following example gets a ``panda`` robot object, makes a goal
|
|
1448
|
+
pose ``Tep``, and then solves for the joint coordinates which result in the pose
|
|
1449
|
+
``Tep`` using the `ikine_QP` method.
|
|
1450
|
+
|
|
1451
|
+
.. runblock:: pycon
|
|
1452
|
+
>>> import roboticstoolbox as rtb
|
|
1453
|
+
>>> panda = rtb.models.Panda()
|
|
1454
|
+
>>> Tep = panda.fkine([0, -0.3, 0, -2.2, 0, 2, 0.7854])
|
|
1455
|
+
>>> panda.ikine_QP(Tep)
|
|
1456
|
+
|
|
1457
|
+
.. rubric:: Notes
|
|
1458
|
+
|
|
1459
|
+
When using the this method, the initial joint coordinates :math:`q_0`, should correspond
|
|
1460
|
+
to a non-singular manipulator pose, since it uses the manipulator Jacobian.
|
|
1461
|
+
|
|
1462
|
+
This class supports null-space motion to assist with maximising manipulability and
|
|
1463
|
+
avoiding joint limits. These are enabled by setting kq and km to non-zero values.
|
|
1464
|
+
|
|
1465
|
+
.. rubric:: References
|
|
1466
|
+
|
|
1467
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part I:
|
|
1468
|
+
Kinematics, Velocity, and Applications." arXiv preprint arXiv:2207.01796 (2022).
|
|
1469
|
+
- J. Haviland, and P. Corke. "Manipulator Differential Kinematics Part II:
|
|
1470
|
+
Acceleration and Advanced Applications." arXiv preprint arXiv:2207.01794 (2022).
|
|
1471
|
+
|
|
1472
|
+
See Also
|
|
1473
|
+
--------
|
|
1474
|
+
:py:class:`~roboticstoolbox.robot.IK.IK_NR`
|
|
1475
|
+
An IK Solver class which implements the Newton-Raphson optimisation technique
|
|
1476
|
+
ikine_LM
|
|
1477
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_LM` class as a method within the :py:class:`ETS` class
|
|
1478
|
+
ikine_GN
|
|
1479
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_GN` class as a method within the :py:class:`ETS` class
|
|
1480
|
+
ikine_NR
|
|
1481
|
+
Implements the :py:class:`~roboticstoolbox.robot.IK.IK_NR` class as a method within the :py:class:`ETS` class
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
.. versionchanged:: 1.0.4
|
|
1485
|
+
Added the Quadratic Programming IK solver method on the `Robot` class
|
|
1486
|
+
|
|
1487
|
+
"""
|
|
1488
|
+
|
|
1489
|
+
return self.ets(start, end).ikine_QP(
|
|
1490
|
+
Tep=Tep,
|
|
1491
|
+
q0=q0,
|
|
1492
|
+
ilimit=ilimit,
|
|
1493
|
+
slimit=slimit,
|
|
1494
|
+
tol=tol,
|
|
1495
|
+
joint_limits=joint_limits,
|
|
1496
|
+
mask=mask,
|
|
1497
|
+
seed=seed,
|
|
1498
|
+
ks=ks,
|
|
1499
|
+
kj=kj,
|
|
1500
|
+
kq=kq,
|
|
1501
|
+
km=km,
|
|
1502
|
+
ps=ps,
|
|
1503
|
+
pi=pi,
|
|
1504
|
+
**kwargs,
|
|
1505
|
+
)
|