Source code for forcedimension_core.dhd.direct

from ctypes import c_double

import forcedimension_core.runtime as _runtime
from forcedimension_core.typing import (
    SupportsPtr, SupportsPtrs3
)


[docs]def getPosition(out: SupportsPtrs3[c_double], ID: int = -1) -> int: """ Retrieve the position of the end-effector about the X, Y, and Z axes. Please refer to your device user manual for more information on your device coordinate system. :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the position of the end-effector (in [m]). :param int ID: Device ID (see :ref:`multiple_devices` section for details). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.dhd.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationRad()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationDeg()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationFrame()` """ return _runtime._libdhd.dhdGetPosition(*out.ptrs, ID)
[docs]def getForce(out: SupportsPtrs3[c_double], ID: int = -1) -> int: """ Retrieve the force vector applied to the end-effector (in [N]) about the X, Y, and Z axes Please refer to your device user manual for more information on your device coordinate system. :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the applied forces on the end-effector (in [N]). :param int ID: Device ID (see :ref:`multiple_devices` section for details). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out`` does not support item assignment either because its immutable or not subscriptable. :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.setForce()` | :func:`forcedimension_core.dhd.direct.setForceAndTorque()` | :func:`forcedimension_core.dhd.direct.setForceAndTorqueAndGripperForce()` | :func:`forcedimension_core.dhd.direct.getForceAndTorque()` | :func:`forcedimension_core.dhd.direct.getForceAndTorqueAndGripperForce()` """ return _runtime._libdhd.dhdGetForce(*out.ptrs, ID)
[docs]def getOrientationRad( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ For devices with a wrist structure, retrieve individual angle (in [rad]) of each joint, starting with the one located nearest to the wrist base plate. Note ---- This feature only applies to devices with a wrist. See the :ref:`device_types` section for more details. Note ---- :data:`forcedimension_core.constants.DeviceType.OMEGA6_RIGHT` and :data:`forcedimension_core.constants.DeviceType.OMEGA6_LEFT` have angles that are instead computed with respect to their internal reference frame, which is rotated π/4 radians around the Y axis. Please refer to your device user manual for more information on your device coordinate system. :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the joint angles (in [rad]). :param int ID: Device ID (see :ref:`multiple_devices` section for details). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out`` does not support item assignment either because its immutable or not subscriptable. :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getOrientationDeg()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationRad()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationDeg()` """ return _runtime._libdhd.dhdGetOrientationRad(*out.ptrs, ID)
[docs]def getOrientationDeg( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ For devices with a wrist structure, retrieve individual angle (in [deg]) of each joint, starting with the one located nearest to the wrist base plate. Note ---- This feature only applies to devices with a wrist. See the :ref:`device_types` section for more details. Note ---- :data:`forcedimension_core.constants.DeviceType.OMEGA6_RIGHT` and :data:`forcedimension_core.constants.DeviceType.OMEGA6_LEFT` have angles that are instead computed with respect to their internal reference frame, which is rotated π/4 radians around the Y axis. Please refer to your device user manual for more information on your device coordinate system. :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the joint angles (in [deg]). :param int ID: Device ID (see :ref:`multiple_devices` section for details). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out`` does not support item assignment either because its immutable or not subscriptable. :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getOrientationRad()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationRad()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationDeg()` """ return _runtime._libdhd.dhdGetOrientationDeg(*out.ptrs, ID)
[docs]def getPositionAndOrientationRad( p_out: SupportsPtrs3[c_double], o_out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Retrieve the position (in [m]) and for devices with a wrist structure, retrieve individual angle of each joint (in [rad]), starting with the one located nearest to the wrist base plate. Note ---- This feature only applies to devices with a wrist. See the :ref:`device_types` section for more details. Note ---- :data:`forcedimension_core.constants.DeviceType.OMEGA6_RIGHT` and :data:`forcedimension_core.constants.DeviceType.OMEGA6_LEFT` have angles that are instead computed with respect to their internal reference frame, which is rotated π/4 radians around the Y axis. Please refer to your device user manual for more information on your device coordinate system. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] p_out: An output buffer to store the position (in [m]). :param SupportsPtrs3[ctypes.c_double] o_out: An output buffer to store the joint angles (in [rad]). :raises AttributeError: If ``p_out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``p_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``p_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``o_out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``o_out`` does not support item assignment either because its immutable or not subscriptable. :raises TypeError: If ``o_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``o_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getOrientationRad()` | :func:`forcedimension_core.dhd.direct.getOrientationDeeg()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationDeg()` """ return _runtime._libdhd.dhdGetPositionAndOrientationRad( *p_out.ptrs, *o_out.ptrs, ID )
[docs]def getPositionAndOrientationDeg( p_out: SupportsPtrs3[c_double], o_out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Retrieve the position (in [m]) and for devices with a wrist structure, retrieve individual angle of each joint (in [deg]), starting with the one located nearest to the wrist base plate. Note ---- This feature only applies to devices with a wrist. See the :ref:`device_types` section for more details. Note ---- :data:`forcedimension_core.constants.DeviceType.OMEGA6_RIGHT` and :data:`forcedimension_core.constants.DeviceType.OMEGA6_LEFT` have angles that are instead computed with respect to their internal reference frame, which is rotated π/4 radians around the Y axis. Please refer to your device user manual for more information on your device coordinate system. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] p_out: An output buffer to store the position (in [m]). :param SupportsPtrs3[ctypes.c_double] o_out: An output buffer to store the joint angles (in [rad]). :raises AttributeError: If ``p_out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``p_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``p_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``o_out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``o_out`` does not support item assignment either because its immutable or not subscriptable. :raises TypeError: If ``o_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``o_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getOrientationRad()` | :func:`forcedimension_core.dhd.direct.getOrientationDeg()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationRad()` """ return _runtime._libdhd.dhdGetPositionAndOrientationDeg( *p_out.ptrs, *o_out.ptrs, ID )
[docs]def getPositionAndOrientationFrame( p_out: SupportsPtrs3[c_double], matrix_out: SupportsPtr[c_double], ID: int = -1 ) -> int: """ Retrieve the position (in [m]) and orientation matrix of the end-effector about the X, Y, and Z axes. Please refer to your device user manual for more information on your device coordinate system. Note ---- This feature only applies to devices with a wrist. See the :ref:`device_types` section for more details. Note ---- :data:`forcedimension_core.constants.DeviceType.OMEGA6_RIGHT` and :data:`forcedimension_core.constants.DeviceType.OMEGA6_LEFT` have angles that are instead computed with respect to their internal reference frame, which is rotated π/4 radians around the Y axis. Please refer to your device user manual for more information on your device coordinate system. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :raises AttributeError: If ``p_out.ptrs`` is not a valid attribute of ``p_out`` :raises TypeError: If ``p_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``p_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``matrix_out.ptr`` is not a valid attribute of ``matrix_out``. :raises ctypes.ArgumentError: If ``p_out.ptr`` is not a ``Pointer[c_double]`` type. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getOrientationRad()` | :func:`forcedimension_core.dhd.direct.getOrientationDeg()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationRad()` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationDeg()` """ return _runtime._libdhd.dhdGetPositionAndOrientationFrame( *p_out.ptrs, matrix_out.ptr, ID )
[docs]def getForceAndTorque( f_out: SupportsPtrs3[c_double], t_out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Retrieve the forces (in [N]) and torques (in [Nm]) applied to the device end-effector about the X, Y, and Z axes. Please refer to your device user manual for more information on your device coordinate system. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] f_out: An output buffer to store the applied forces on the end-effector (in [N]). :param SupportsPtrs3[ctypes.c_double] t_out: An output buffer to store the applied torques on the end-effector (in [Nm]). :raises AttributeError: If ``f_out.ptrs`` is not a valid attribute of ``f_out`` :raises TypeError: If ``f_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``f_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``t_out.ptrs`` is not a valid attribute of ``t_out`` :raises TypeError: If ``t_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``t_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0, on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.setForce()` | :func:`forcedimension_core.dhd.direct.setForceAndTorque()` | :func:`forcedimension_core.dhd.direct.setForceAndTorqueAndGripperForce()` | :func:`forcedimension_core.dhd.direct.getForce()` | :func:`forcedimension_core.dhd.direct.getForceAndTorque()` | :func:`forcedimension_core.dhd.direct.getForceAndTorqueAndGripperForce()` """ return _runtime._libdhd.dhdGetForceAndTorque(*f_out.ptrs, *t_out.ptrs, ID)
[docs]def getOrientationFrame(out: SupportsPtr[c_double], ID: int = -1) -> int: """ Retrieve the rotation matrix of the wrist structure. The identity matrix is returned for devices that do not support orientations. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtr[ctypes.c_double] out: An output buffer to store the orientation frame. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :raises AttributeError: If ``out.ptr`` is not a valid attribute of ``p_out`` :raises ctypes.ArgumentError: If ``out.ptr`` is not a ``Pointer[c_double]`` type. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Mat3x3` | :class:`forcedimension_core.containers.numpy.Mat3x3` | :func:`forcedimension_core.dhd.direct.getPositionAndOrientationFrame()` """ return _runtime._libdhd.dhdGetOrientationFrame(out.ptr, ID)
[docs]def getGripperThumbPos( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Read the position (in [m]) of thumb rest location about the X, Y, and Z axes of the force gripper structure if present. Note ---- This feature only applies to devices with a gripper. See the :ref:`device_types` section for more details. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the grippper thumb position (in [m]). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getGripperFingerPos()` """ return _runtime._libdhd.dhdGetGripperThumbPos(*out.ptrs, ID)
[docs]def getGripperFingerPos( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Read the position (in [m]) of forefinger rest location about the X, Y, and Z axes of the force gripper structure if present. Note ---- This feature only applies to devices with a gripper. See the :ref:`device_types` section for more details. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] out: An output buffer to store the gripper finger position (in [m]). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 or :data:`forcedimension_core.constants.TIMEGUARD` on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getGripperFingerPos()` """ return _runtime._libdhd.dhdGetGripperFingerPos(*out.ptrs, ID)
[docs]def getForceAndTorqueAndGripperForce( f_out: SupportsPtrs3[c_double], t_out: SupportsPtrs3[c_double], fg_out: c_double, ID: int = -1 ) -> int: """ Retrieve the forces (in [N]) and torques (in [Nm]) applied to the device end-effector as well as the gripper force (in [N]). Forces and torques are about the X, Y, and Z axes. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtrs3[ctypes.c_double] f_out: An output buffer to store the applied forces on the end-effector (in [N]). :param SupportsPtrs3[ctypes.c_double] t_out: An output buffer to store the applied torques on the end-effector (in [Nm]). :raises AttributeError: If ``f_out.ptrs`` is not a valid attribute of ``f_out`` :raises TypeError: If ``f_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``f_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``t_out.ptrs`` is not a valid attribute of ``t_out`` :raises TypeError: If ``t_out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``t_out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises AttributeError: If ``fg_out.ptr`` is not a valid attribute of ``fg_out`` :raises ctypes.ArgumentError: If ``fg_out.ptr`` is not a ``Pointer[c_double]``. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0, on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.getForce()` | :func:`forcedimension_core.dhd.direct.getForceAndTorque()` """ err = _runtime._libdhd.dhdGetForceAndTorqueAndGripperForce( *f_out.ptrs, *t_out.ptrs, fg_out, ID ) return err
[docs]def getLinearVelocity(out: SupportsPtrs3[c_double], ID: int = -1) -> int: """ Retrieve the estimated instanteous linear velocity (in [m/s]). Note ---- The velocity estimator requires at least 2 position updates during the time interval defined in :func:`forcedimension_core.dhd.configLinearVelocity()` in order to be able to compute the estimate. Otherwise, if there are no calls to :func:`forcedimension_core.dhd.getPosition()` or :func:`forcedimension_core.dhd.getLinearVelocity()`, this function will error with :data:`forcedimension_core.constants.ErrorNum.TIMEOUT`. For more information refer to :ref:`velocity_estimator`. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param SupportsPtr[ctypes.c_double] out: An output buffer to store the linear velocity (in [m/s]). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.configLinearVelocity()` """ return _runtime._libdhd.dhdGetLinearVelocity(*out.ptrs, ID)
[docs]def getAngularVelocityRad( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Retrieve the estimated angular velocity (in [rad/s]). Note ---- The velocity estimator requires at least 2 position updates during the time interval defined in :func:`forcedimension_core.dhd.configAngularVelocity()` in order to be able to compute the estimate. Otherwise, if there are no calls to:func:`forcedimension_core.dhd.getPosition()` or :func:`forcedimension_core.dhd.getAngularVelocityRad()`, this function will return error with :data:`forcedimension_core.constants.ErrorNum.TIMEOUT`. For more information refer to :ref:`velocity_estimator`. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param out: An output buffer to store the angular velocity (in [rad/s]). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.configAngularVelocity()` | :func:`forcedimension_core.dhd.direct.getAngularVelocityDeg()` """ return _runtime._libdhd.dhdGetAngularVelocityRad(*out.ptrs, ID)
[docs]def getAngularVelocityDeg( out: SupportsPtrs3[c_double], ID: int = -1 ) -> int: """ Retrieve the estimated angular velocity (in [deg/s]). Note ---- The velocity estimator requires at least 2 position updates during the time interval defined in :func:`forcedimension_core.dhd.configAngularVelocity()` in order to be able to compute the estimate. Otherwise, if there are no calls to:func:`forcedimension_core.dhd.getPosition()` or :func:`forcedimension_core.dhd.getAngularVelocityDeg()`, this function will error with :data:`forcedimension_core.constants.ErrorNum.TIMEOUT`. For more information refer to :ref:`velocity_estimator`. :param int ID: Device ID (see :ref:`multiple_devices` section for details). :param out: An output buffer to store the angular velocity (in [deg/s]). :raises AttributeError: If ``out.ptrs`` is not a valid attribute of ``out`` :raises TypeError: If ``out.ptrs`` is not iterable. :raises ctypes.ArgumentError: If ``out.ptrs`` does not expand into a tuple of 3 ``Pointer[c_double]`` types. :raises ctypes.ArgumentError: If ``ID`` is not implicitly convertible to C char. :returns: 0 on success, -1 otherwise. See Also -------- | :class:`forcedimension_core.containers.Vec3` | :class:`forcedimension_core.containers.numpy.Vec3` | :func:`forcedimension_core.dhd.direct.configAngularVelocity()` | :func:`forcedimension_core.dhd.direct.getAngularVelocityRad()` """ return _runtime._libdhd.dhdGetAngularVelocityDeg(*out.ptrs, ID)