urdf2webots
                                
                                
                                
                                    urdf2webots copied to clipboard
                            
                            
                            
                        add dummy physics for imu sensor to make gyro work
The gyro needs to be child to a Node with a a Physics element. Otherwise the following warning will pop up:
WARNING: DEF Robot <robotname> (PROTO) > HingeJoint > Solid > HingeJoint > Solid > Solid > Gyro: this node or its parents requires a 'physics' field to be functional.
In URDFs there is often an extra frame for an IMU which is attached by a fixed joint to the actual link the imu is attached to.
This PR adds a dummy physics node to the link holding the imu similar to the dummy physics added so tools don't fall off here: https://github.com/cyberbotics/urdf2webots/blob/aa6706adfc5c8039089aca0a330b54036d5386d4/urdf2webots/writeProto.py#L135
The relevant part of the generated proto:
Solid {
  translation -0.025450 0.053500 -0.023500
  rotation -1.000000 -0.000000 -0.000000 1.570800
  physics Physics {
  }
  boundingObject Box {
  size 0.01 0.01 0.01
  }
  children [
    Accelerometer {
      name "imu_head accelerometer"
    }
    Gyro {
      name "imu_head gyro"
    }
    Compass {
      name "imu_head compass"
    }
  ]
  name "imu_frame_2"
}
                                    
                                    
                                    
                                
I am not sure this is the best way to address the problem. Adding a dummy physics-enable object will cause other problems, including performance drop and instability due to this useless mass. Instead, we should remove the intermediate Solid so that the Gyro is a direct child of the upper parent Solid which has physics, so instead, the relevant part should look like that:
Accelerometer {
  translation -0.025450 0.053500 -0.023500
  rotation -1.000000 -0.000000 -0.000000 1.570800
  name "imu_head accelerometer"
}
Gyro {
  translation -0.025450 0.053500 -0.023500
  rotation -1.000000 -0.000000 -0.000000 1.570800
  name "imu_head gyro"
}
Compass {
  translation -0.025450 0.053500 -0.023500
  rotation -1.000000 -0.000000 -0.000000 1.570800
  name "imu_head compass"
}
                                    
                                    
                                    
                                
I agree and will work on it, a problem is if there are multiple fixed joints in series the first link/solid with physics when going up the kinematic chain towards the root should be used. The transforms would have to be multiplied.
Note: Webots has a mechanism called Solid merger that avoids to create fixed joints. Instead, it multiplies transforms to merge them together into a single Solid, adding masses of each part. So, you should not worry about this in the PROTO file.
I have tested the solution you proposed but it only works if there is a Physics node in the direct parent.
I think a better solution might be to make the following call recursive and adapt the transformation matrix. https://github.com/cyberbotics/webots/blob/a05248b57540c72651f7353dfd34718c8ffaceba/src/webots/nodes/WbGyro.cpp#L150
What do you think about this solution?
Or somethink like here could be done: https://github.com/cyberbotics/webots/blob/a05248b57540c72651f7353dfd34718c8ffaceba/src/webots/nodes/WbAccelerometer.cpp#L154
Or somethink like here could be done: https://github.com/cyberbotics/webots/blob/a05248b57540c72651f7353dfd34718c8ffaceba/src/webots/nodes/WbAccelerometer.cpp#L154
Yes, this is exactly what I meant. I believe this is way to go.
Any update on this? We're having the same problem and this PR is of great interest to us!
We currently just add a dummy physics node to the Solid which has the IMU as children but I would like to fix this in webots in the future, I just have not gotten to it. It is a bit more complicated than I thought though since the acceleration is not the same as the first parent node with physics if there is a transform in between.
@jgueldenstein: I am happy to help you if you have any question and to review your patch proposals.