[ODE] Energy Status

Bill Sellers wis at mac.com
Mon Mar 20 08:24:27 MST 2006


Which would give (allowing for matrix associativity):

dReal Body::GetRotationalKineticEnergy()
{
     dMass mass;
     dBodyGetMass(m_BodyID, &mass);

     const dReal *ow = dBodyGetAngularVel(m_BodyID);
     dVector3 o;
     dBodyVectorFromWorld (m_BodyID, ow[0], ow[1], ow[2], o);
     dVector3 o1;
     dMULTIPLYOP0_331(o1, =, mass.I, o);
     dReal rotationalKE = 0.5 * (o[0]*o1[0] + o[1]*o1[1] + o[2]*o1[2]);

     return rotationalKE;
}

Cheers
Bill

On 20 Mar 2006, at 09:28, Jaroslav Sinecky wrote:

> Just from top of my head ....
> isn't rotational energy something more like:
>
> er = 0.5 * o(t) * I * o
>
> where o is rotational velocity vector and o(t) is the same but  
> transposed
> which I think is not the same as 0.5 * I * (o * o). I and o should  
> be in the
> same coordinate system, so I think it's correct to transform to  
> body local
> system.
>
> Cheers,
> Jaroslav
>
>
>> -----Original Message-----
>> From: ode-bounces at q12.org [mailto:ode-bounces at q12.org]On Behalf
>> Of Bill Sellers
>> Sent: Sunday, March 19, 2006 10:07 PM
>> To: ode-list
>> Subject: [ODE] Energy Status
>>
>>
>> Dear All,
>>
>> I want to calculate the energy status of the bodies in my simulation
>> and whilst I think the following is right I'd really appreciate it if
>> someone who's 3D physics wasn't as rusty as mine could take a look at
>> the following (very straightforward) code.
>>
>> I'm pretty damn certain that linear kinetic is right, and I think
>> that gravitational potential energy is OK too but the rotational
>> kinetic energy could easily be wrong (I'm getting the rotational
>> velocity in body local coordinates, squaring the individual values,
>> multiplying it by the inertial tensor, summing the values and halving
>> the whole thing). I've checked that it gives sensible results in
>> simple test cases (i.e. effectively 2D) but I've no idea whether I
>> get the right answer when I'm not using the principle moments of
>> inertia and I'm a bit worried that there are interaction terms with
>> linear and kinetic velocity that I might have to deal with (although
>> I have always though they were independent when the centre of mass
>> was used as the origin).
>>
>> If the code happens to be right then these might make useful
>> functions...
>>
>> Cheers
>> Bill
>>
>> dReal Body::GetRotationalKineticEnergy()
>> {
>>
>>      // rotational KE = 0.5 I omega^2
>>      dMass mass;
>>      dBodyGetMass(m_BodyID, &mass);
>>
>>      const dReal *ow = dBodyGetAngularVel(m_BodyID);
>>      dVector3 o;
>>      dBodyVectorFromWorld (m_BodyID, ow[0], ow[1], ow[2], o);
>>
>>      dVector3 oo;
>>      oo[0] = o[0] * o[0]; oo[1] = o[1] * o[1]; oo[2] = o[2] * o[2];
>>      dVector3 rke;
>>      dMULTIPLYOP0_331(rke, =, mass.I, oo);
>>      dReal rotationalKE = 0.5 * (rke[0] + rke[1] + rke[2]);
>>
>>      return rotationalKE;
>> }
>>
>> dReal Body::GetLinearKineticEnergy()
>> {
>>      // linear KE = 0.5 m v^2
>>      dMass mass;
>>      dBodyGetMass(m_BodyID, &mass);
>>
>>      const dReal *v = dBodyGetLinearVel(m_BodyID);
>>      dReal linearKE = 0.5 * mass.mass * (v[0]*v[0] + v[1]*v[1] + v[2]
>> *v[2]);
>>
>>      return linearKE;
>> }
>>
>> dReal Body::GetGravitationalPotentialEnergy()
>> {
>>      dMass mass;
>>      dBodyGetMass(m_BodyID, &mass);
>>      dVector3 g;
>>      dWorldGetGravity (m_WorldID, g);
>>      const dReal *p = dBodyGetPosition(m_BodyID);
>>
>>      // gravitational PE = mgh
>>      dReal gravitationalPotentialEnergy = - mass.mass * (g[0]*p[0]  
>> + g
>> [1]*p[1] + g[2]*p[2]);
>>
>>      return gravitationalPotentialEnergy;
>> }
>>
>> _______________________________________________
>> ODE mailing list
>> ODE at q12.org
>> http://q12.org/mailman/listinfo/ode
>



More information about the ODE mailing list