dobot1_control.calibrate_accelerometers.positions_mode

dobot1_control.calibrate_accelerometers.positions_mode(driver, kinematics, positions)[source]

Calculates sensor offsets and conversion factors for the accelerometers based on measurements at specified cartesian positions. This function requires user interaction to move the arm to specified positions and confirm via prompts. The values for accelOffset and accelConversion are finally given for the Dobot() or DobotDriver() constructors.

For a given pair of positions, angles_1 and angles_2 are known. This gives four equations. The base equation is:

angle = math.asin((sensorVal - offset) / accelConv)

The four angle equations are:

(1)  angles1.rear  = np.pi * 0.5 - asin((sensorVal1.rear  - offset.rear)  / accelConv)
(2)  angles1.front = asin((sensorVal1.front - offset.front) / accelConv)
(3)  angles2.rear  = np.pi * 0.5 - asin((sensorVal2.rear  - offset.rear)  / accelConv)
(4)  angles2.front = asin((sensorVal2.front - offset.front) / accelConv)

Rearranging gives:

(5)  sin(np.pi * 0.5 - angles1.rear) = (sensorVal1.rear  - offset.rear)  / accelConv
(6)  sin(np.pi * 0.5 - angles2.rear) = (sensorVal2.rear  - offset.rear)  / accelConv
(7)  sin(angles1.front)              = (sensorVal1.front - offset.front) / accelConv
(8)  sin(angles2.front)              = (sensorVal2.front - offset.front) / accelConv

Multiplying by accelConv gives:

(9)   sin(np.pi * 0.5 - angles1.rear) * accelConv = sensorVal1.rear  - offset.rear
(10)  sin(np.pi * 0.5 - angles2.rear) * accelConv = sensorVal2.rear  - offset.rear
(11)  sin(angles1.front)              * accelConv = sensorVal1.front - offset.front
(12)  sin(angles2.front)              * accelConv = sensorVal2.front - offset.front

Combine equations (9) and (10), then eliminate offset.rear:

(13)  (sensorVal1.rear - offset.rear) / sin(np.pi * 0.5 - angles1.rear)
    = (sensorVal2.rear - offset.rear) / sin(np.pi * 0.5 - angles2.rear)
(14)  offset.rear =
    (
      sensorVal1.rear / sin(np.pi * 0.5 - angles1.rear)
    - sensorVal2.rear / sin(np.pi * 0.5 - angles2.rear)
    ) / (
      1 / sin(np.pi * 0.5 - angles1.rear)
    - 1 / sin(np.pi * 0.5 - angles2.rear)
    )

Using:

sin(np.pi * 0.5 - x) == cos(x)

Equation (14) simplifies to:

(15)  offset.rear =
    (
      sensorVal1.rear * np.cos(angles2.rear)
    - sensorVal2.rear * np.cos(angles1.rear)
    ) / (
      np.cos(angles2.rear)
    - np.cos(angles1.rear)
    )

Combine equations (11) and (12), then eliminate offset.front:

(16)  (sensorVal1.front - offset.front) / sin(angles1.front)
    = (sensorVal2.front - offset.front) / sin(angles2.front)

(17)  sensorVal1.front / sin(angles1.front) - offset.front / sin(angles1.front)
    = sensorVal2.front / sin(angles2.front) - offset.front / sin(angles2.front)

(18)  sensorVal2.front / sin(angles2.front) - sensorVal1.front / sin(angles1.front)
    = offset.front * ( 1 / sin(angles1.front) - 1 / sin(angles2.front) )

(19)  offset.front =
      (
          sensorVal2.front / sin(angles2.front) - sensorVal1.front / sin(angles1.front)
      ) / (
          1 / sin(angles1.front) - 1 / sin(angles2.front)
      )

(20)  offset.front =
      (
          sensorVal1.front * np.sin(angles2.front) - sensorVal2.front * np.sin(angles1.front)
      ) / (
          np.sin(angles2.front) - np.sin(angles1.front)
      )

Calculate accelConv using equations (9)–(12):

(21)  accelConv = (sensorVal1.rear  - offset.rear)  / sin(np.pi * 0.5 - angles1.rear)
(22)  accelConv = (sensorVal2.rear  - offset.rear)  / sin(np.pi * 0.5 - angles2.rear)
(23)  accelConv = (sensorVal1.front - offset.front) / sin(angles1.front)
(24)  accelConv = (sensorVal2.front - offset.front) / sin(angles2.front)
Parameters:
  • driver (Any) – The driver that is responsible for communicating with the robotic arm and retrieving sensor data.

  • kinematics (Any) – The kinematics module used to calculate angular positions from cartesian coordinates and perform related computations.

  • positions (tuple | list) – A pair of target cartesian positions to which the robotic arm should be moved. Each entry specifies 3D coordinates.

Returns:

None