Humanoids


Today, I finally managed to get a 22 DOF humanoid robot simulated in robotSim.  Man what a lot of work.  I really thought it would have taken a lot less time, but thats how it goes.  Most of the problems were with Unity’s lack of documentation on configurable joints.  I had to really understand the PhysX 6DOF joint and translate the parameters to Unity configurable joint parameters (same joint different names).   

Once I get the Ok, I will be able to post some nice screen shots and movies.

Ok,

So it looks like my assumption was correct that manipulating the individual segments directly, somehow bypasses the physics calculations.  

I actually managed to rig my model with configurable joints and make the joints stable ( no jitter ).  The biggest gotcha that I found is to make sure that the colliders that are attached to the rigid bodies do not intersect.  If they do then there will be joint instability (jitter).

Now that I have the joints working and the slip problem solved, it is on to finish the simulation.  I have a basic walk almost finished, still needs some tweaking.

I will post some screenshots when I can

Over the course of the last few weeks I have been developing a humanoid robot simulation for robotSim

This has not been a very easy task and I seriously thought that it would take a lot less time than it did.

After getting all of the kinks out of the 3d model we started to rig the model with the different physX joints that the Unity engine had available. We first tried hinge joints and then configurable joints ( not a lot of good documentation on these joints). After the model was rigged with the joints we found that there was some very large instability in the physics calculations and the joints started to jitter, come out of their sockets and magically move the robot across the floor. We tried different parameters, bumping up the solver iteration count, reducing the projections distance / angle values and setting configure in world space true. This did help but their was still lots of jitter.

At this point we had the bright idea to just manually rotate the joints around their respective pivot points using transforms. This worked great, the robot did not jitter it could stand up and do basic stationary moves. Now, if the world was fair everything would JUST work! But it is not and we now encountered the problem of the robot not being able to move. When we start the walking algorithm the joints move like they should, but the robot starts to move on the spot! The problem looked to be that the feet were slipping with the floor.

After changing the materials of the floor / feet to rubber and doing some major testing we found that using transforms to move the joints does not actually work. What looks to be happening is that when we manually move the joints we are actually bypassing the physics calculations which causes the feet to slip because legs are not being updated by the physic engine.  

Now it is back to using joints again.  I hope this time I can get them to work properly!!!

Simulating humanoid robots are not a simple task.  I have been working on simulating joints and discovered that the current PhysX engine does not implement certain functions and that this will change the way we simulate joints.

Currently PhysX cannot report back how much torque is being applied to a joint, so there is know way of knowing when a joint has exceeded its maximum load.  This torque information is critical when simulating a robot trying to standup or pushup when it is on the ground.

I will simulate the joint torque using a method similar to the one that I have come up with to simulate a pressure sensor.  Basically I will use the Center of Mass(COM) and position of joint(fulcrum).

Once I get the formulas worked out I will post them along with some data and screenshots of one of the simulated (real) robots that I am working with.

I have been working on simulating a pressure sensor for humanoid robots. Pressure sensors mounted on both feet of a humanoid can provide a measure of how the weight of the robot is distributed across its entire body. This information is useful for humanoid robot balancing and stable walking algorithms.

There are a couple of different methods to simulate a pressure sensor and I have been looking at two.  The first method is to measure or read the force that is acting on the sensor and the second is to calculate the force directly using center of mass (COM) and acceleration.

Depending on the physics or game engine that you are using, getting the force on an object might not be an easy task.    I am using the Unity engine with integrated Ageia PhysX so one would think that this force information is available to Unity developers, but it is not!  On to the second method!

Simulating pressure using COM.  If we ignore external forces( servo forces should be negligible for small humanoids, but I will have to experiment with standing and squatting to be sure  ) applied to the robot, the force on a pressure sensor should be directly related to the mass or weight applied and gravity.  So basically to calculate pressure I will:

1.) Calculate the COM
2.) Calculate the applied mass using COM and 3d position of the pressure sensor
3.) Force = M*G

I think this should work.  I have read Pratt’s dissertation on “Exploiting Inherent Robustness and Natural Dynamics in the Control of Bipedal Walking Robots” and have used this information before for implementing basic walking algorithms.

As a first pass I will be implementing this on a simulated Robonova.  Keep ya posted!

 

robonova balancing on one foot

robonova balancing on one foot

 

simulated RoboNova

simulated RoboNova