webots icon indicating copy to clipboard operation
webots copied to clipboard

Torque Feedback doesn't work properly for Ball Joints

Open ralphieraccoon opened this issue 9 months ago • 2 comments

Describe the Bug I've tried to add torque feedback to the BallJoint in the motor3 example like so:

#include <math.h>
#include <stdio.h>
#include <webots/motor.h>
#include <webots/robot.h>

int main(int argc, char **argv) {
  wb_robot_init();
  double time_step = wb_robot_get_basic_time_step();
  WbDeviceTag motor1 = wb_robot_get_device("motor 1");
  WbDeviceTag motor2 = wb_robot_get_device("motor 2");
  WbDeviceTag motor3 = wb_robot_get_device("motor 3");
  
  wb_motor_enable_torque_feedback(motor1, time_step);
  wb_motor_enable_torque_feedback(motor2, time_step);
  wb_motor_enable_torque_feedback(motor3, time_step);

  int counter = 0;
  while (wb_robot_step(time_step) != -1) {
    counter++;
    if (counter == 50)
      wb_motor_set_position(motor1, 1);
    else if (counter == 100)
      wb_motor_set_position(motor1, -1);
    else if (counter == 200)
      wb_motor_set_position(motor1, 0);
    else if (counter == 300)
      wb_motor_set_position(motor2, 1);
    else if (counter == 400)
      wb_motor_set_position(motor2, -1);
    else if (counter == 500)
      wb_motor_set_position(motor2, 0);
    else if (counter == 600)
      wb_motor_set_position(motor3, 1);
    else if (counter == 700)
      wb_motor_set_position(motor3, -1);
    else if (counter == 800)
      wb_motor_set_position(motor3, 0);
    else if (counter > 900) {
      wb_motor_set_position(motor1, cos(0.01 * counter));
      wb_motor_set_position(motor2, sin(0.012 * counter));
      wb_motor_set_position(motor3, cos(0.013 * counter));
    }
    printf("torques: [ x y z ] = [ %+.6f %+.6f %+.6f ]\n", 
    wb_motor_get_torque_feedback(motor1),
    wb_motor_get_torque_feedback(motor2),
    wb_motor_get_torque_feedback(motor3));
  }

  wb_robot_cleanup();
  return 0;
}

Expected behavior Something similar to the Hinge2Joint in the motor2 example set up in a similar fashion, with console output that has two different numbers that are proportional to the position of the joint:

torques: [ x y ] = [ -0.003593 -0.003932 ]
torques: [ x y ] = [ -0.003608 -0.003926 ]
torques: [ x y ] = [ -0.003623 -0.003920 ]
torques: [ x y ] = [ -0.003638 -0.003914 ]
torques: [ x y ] = [ -0.003653 -0.003908 ]
torques: [ x y ] = [ -0.003667 -0.003902 ]

Actual behaviour Console output which has two identical numbers and one axis that always remains at zero (would expect occasional spikes because of inertia):

torques: [ x y z ] = [ +0.001053 +0.001053 +0.000000 ]
torques: [ x y z ] = [ +0.000212 +0.000212 +0.000000 ]
torques: [ x y z ] = [ -0.000629 -0.000629 +0.000000 ]
torques: [ x y z ] = [ -0.001470 -0.001470 +0.000000 ]
torques: [ x y z ] = [ -0.002309 -0.002309 +0.000000 ]
torques: [ x y z ] = [ -0.003145 -0.003145 +0.000000 ]

System

  • Linux Ubuntu 24.04 (Noble Numbat)
  • Webots R2025a

ralphieraccoon avatar Feb 12 '25 22:02 ralphieraccoon

I would like to work on this bug. Please assign it to me. Thanks!

ms-10-us avatar May 10 '25 23:05 ms-10-us

I would like to work on this bug. Please assign it to me. Thanks!

I don't believe that's nessecary, if you've got a fix you can make a pull request and cite this issue.

ralphieraccoon avatar May 11 '25 00:05 ralphieraccoon