[vos-d] thought problem 1: physics

chris dragonmagi at gmail.com
Fri Feb 2 02:42:06 EST 2007


On 2/2/07, Sebastian Hoffmann <0shoffma at informatik.uni-hamburg.de> wrote:
> On Fri, Feb 02, 2007 at 04:06:08PM +0900, chris wrote:
> > for time, with the python-ode example, i did not see much diversion
> > until about 8000.
>
> Thank you, at which stepsize?
atached are two of the programs - the second having time=8000. I used
a VIAO noebook, pentium 770, running windoze.
The software I used was according to these instructions by Miriam English:
Here are the 7 steps to success (at least on a Win98 machine):

1. installed python 2.4
       python-2.4.3.msi
       http://www.python.org/ftp/python/2.4.3/

2. edited autoexec.bat to add:
       SET PATH=%PATH%;C:\python
       SET PYTHON=C:\PYTHON\

3. installed pyOpenGL
       PyOpenGL-2.0.2.01.py2.4-numpy23.exe
       http://pyopengl.sourceforge.net

4. Copied glut32.dll to the C:\python\Lib\site-packages\OpenGL
directory. (This is a *crucial* step.)
       glut32.dll
       http://www.xmission.com/%7Enate/glut.html

5. installed OpenGLContext
       OpenGLContext-2.0.0c1.win32-py2.4.exe
       http://pyopengl.sourceforge.net/context/
       (downloaded from http://pyopengl.sourceforge.net/ )

6. installed PIL (python Image Library)
       PIL-1.1.5.win32-py2.4.exe
       http://www.pythonware.com/products/pil/

7. installed pyODE
       PyODE-1.1.0.win32-py2.4.exe
       http://pyode.sourceforge.net/


Now I can double-click on the tutorial3.py from
http://pyode.sourceforge.net/ and it simply runs!

>
> > to me, the scary thing is that people tend to assume
>
> When people start to assume, bad things always start to happen. :)
>
> > that a computer
> > simulation, programmed with high precision and all, is going to be
> > accurate and reliable. Consider the case when  a military simulation
> > is used to generate images that they expect a sensor should "see".
> > These images are compared to "ground truth" images and the result is
> > used to calibrate a sensor - which is then used in a craft or weapon.
> > If there is unknown positional error affecting the simulated image
> > (and most practitioners are unaware of the effect of
> > spatial/positional error on rendered images) then the sensor gets
> > miss-calibrated.
>
> There's an anecdote in university cycles about an AI trained to find
> camouflaged tanks. It used a neural net which could classify pictures shown
> to it into "tank present" or "no tank present" and was trained by being fed
> images and the information wether a tank was present. In the lab it worked
> great. In the wild, it was completely useless, Never worked.
> In the postmortem analysis, someone found that all the pictures of tankless
> wild had been done when light was best (day), but the tanks pictures where
> taken when camouflage was best (dawn and dusk). Meditate on what what the
> AIs mind was like. :)

<chuckle> poor AI! Nice example, reminds me of the Ai used to
translate English/Russian. It was asked to translate "The spirit is
willing but the flesh is weak" and came back with :
"The wine is good but the meat is rotten"!

chris
>
> Liebe Grüße,
> Sebastian Hoffmann
> --
> "Glücklich zu sein ist oberste Bürgerpflicht."
>   -- Paranoia, West End Games
> "Oh, look at the time, 1984 already."
>   -- Daria (MTV)
>
> _______________________________________________
> vos-d mailing list
> vos-d at interreality.org
> http://www.interreality.org/cgi-bin/mailman/listinfo/vos-d
>
-------------- next part --------------
# pyODE example 3: Collision detection
# origin

# Originally by Matthias Baas.
# Updated by Pierre Gay to work without pygame or cgkit.

import sys, os, random, time
from math import *
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

import ode

# geometric utility functions
def scalp (vec, scal):
    vec[0] *= scal
    vec[1] *= scal
    vec[2] *= scal

def length (vec):
    return sqrt (vec[0]**2 + vec[1]**2 + vec[2]**2)

# prepare_GL
def prepare_GL():
    """Prepare drawing.
    """

    # Viewport
    glViewport(0,0,640,480)

    # Initialize
    glClearColor(0.8,0.8,0.9,0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST)
    glDisable(GL_LIGHTING)
    glEnable(GL_LIGHTING)
    glEnable(GL_NORMALIZE)
    glShadeModel(GL_FLAT)

    # Projection
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective (45,1.3333,0.2,20)

    # Initialize ModelView matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    # Light source
    glLightfv(GL_LIGHT0,GL_POSITION,[0,0,1,0])
    glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])
    glLightfv(GL_LIGHT0,GL_SPECULAR,[1,1,1,1])
    glEnable(GL_LIGHT0)

    # View transformation
    gluLookAt (2.4, 3.6, 4.8, 0.5, 0.5, 0, 0, 1, 0)

# draw_body
def draw_body(body):
    """Draw an ODE body.
    """

    x,y,z = body.getPosition()
    R = body.getRotation()
    #rot = [R[0], R[3], R[6], 0.,
    #       R[1], R[4], R[7], 0.,
    #       R[2], R[5], R[8], 0.,
    #       x, y, z, 1.0]
    rot = [1, 0.0, 0.0, 0.0,
           0.0, 1, 0.0, 0.0,
           0.0, 0.0, 1.0, 0.0,
           x, y, z, 1.0]
    glPushMatrix()
    glMultMatrixd(rot)
    if body.shape=="box":
        sx,sy,sz = body.boxsize
        glScale(sx, sy, sz)
        glutSolidCube(1)
    glPopMatrix()


# create_box
def create_box(world, space, density, lx, ly, lz):
    """Create a box body and its corresponding geom."""

    # Create body
    body = ode.Body(world)
    M = ode.Mass()
    M.setBox(density, lx, ly, lz)
    body.setMass(M)

    # Set parameters for drawing the body
    body.shape = "box"
    body.boxsize = (lx, ly, lz)

    # Create a box geom for collision detection
    geom = ode.GeomBox(space, lengths=body.boxsize)
    geom.setBody(body)

    return body

# create box object
def create_object(posx, posy, posz):
    """create one box at a given position."""

    global bodies, counter, objcount

    body = create_box(world, space, 1000, 1.0,1.0,1.0)
    body.setPosition((posx, posy, posz))
    bodies.append(body)
    #counter=0
    objcount+=1
	

# drop_object
def drop_object(posx, posy, posz):
    """Drop an object into the scene."""

    global bodies, counter, objcount

    body = create_box(world, space, 1000, 1.0,1.0,1.0)
    body.setPosition((posx, posy, posz))
    bodies.append(body)
    #counter=0
    objcount+=1

# Collision callback
def near_callback(args, geom1, geom2):
    """Callback function for the collide() method.

    This function checks if the given geoms do collide and
    creates contact joints if they do.
    """

    # Check if the objects do collide
    contacts = ode.collide(geom1, geom2)

    # Create contact joints
    world,contactgroup = args
    for c in contacts:
        c.setBounce(0.2)
        c.setMu(5000)
        j = ode.ContactJoint(world, contactgroup, c)
        j.attach(geom1.getBody(), geom2.getBody())



######################################################################

# Initialize Glut
glutInit ([])

# Open a window
glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE)

x = 0
y = 0
width = 640
height = 480
glutInitWindowPosition (x, y);
glutInitWindowSize (width, height);
glutCreateWindow ("(0,0,0)")

# Create a world object
world = ode.World()
world.setGravity( (0,-9.81,0) )
world.setERP(0.8)
world.setCFM(1E-5)

# Create a space object
space = ode.Space()

# Create a plane geom which prevent the objects from falling forever
floor = ode.GeomPlane(space, (0,1,0), 0)

# A list with ODE bodies
bodies = []

# A joint group for the contact joints that are generated whenever
# two bodies collide
contactgroup = ode.JointGroup()

# Some variables used inside the simulation loop
fps = 50
dt = 1.0/fps
running = True
state = 0
counter = 0
objcount = 0
lasttime = time.time()


# keyboard callback
def _keyfunc (c, x, y):
    sys.exit (0)

glutKeyboardFunc (_keyfunc)

# draw callback
def _drawfunc ():
    # Draw the scene
    prepare_GL()
    for b in bodies:
        draw_body(b)

    glutSwapBuffers ()

glutDisplayFunc (_drawfunc)

# idle callback
def _idlefunc ():
    global counter, state, lasttime

    t = dt - (time.time() - lasttime)
    if (t > 0):
        time.sleep(t)

    counter += 1
    
    if state==0:
        create_object(0.0,0.5,0.0)
	state = 1

    if state==1:
        if counter==20:
            drop_object(1.29,5.0,0.0)
	    state = 2
    #    if objcount==30:
    #        state=1
    #        counter=0
    # State 1: Explosion and pulling back the objects
    #elif state==1:
    #    if counter==100:
    #        explosion()
    #    if counter>300:
    #        pull()
    #    if counter==500:
    #        counter=20

    glutPostRedisplay ()

    # Simulate
    n = 2

    for i in range(n):
        # Detect collisions and create contact joints
        space.collide((world,contactgroup), near_callback)

        # Simulation step
        world.step(dt/n)

        # Remove all contact joints
        contactgroup.empty()

    lasttime = time.time()

glutIdleFunc (_idlefunc)

glutMainLoop ()
-------------- next part --------------
# pyODE: Time Sensitivity
# At origin, start time +8000

# Originally by Matthias Baas.
# Updated by Pierre Gay to work without pygame or cgkit.
# modified by Chris THorne to test time error sensitivity

import sys, os, random, time
from math import *
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

import ode

# prepare_GL
def prepare_GL():
    """Prepare drawing.
    """

    # Viewport
    glViewport(0,0,640,480)

    # Initialize
    glClearColor(0.8,0.8,0.9,0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST)
    glDisable(GL_LIGHTING)
    glEnable(GL_LIGHTING)
    glEnable(GL_NORMALIZE)
    glShadeModel(GL_FLAT)

    # Projection
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective (45,1.3333,0.2,20)

    # Initialize ModelView matrix
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    # Light source
    glLightfv(GL_LIGHT0,GL_POSITION,[0,0,1,0])
    glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])
    glLightfv(GL_LIGHT0,GL_SPECULAR,[1,1,1,1])
    glEnable(GL_LIGHT0)

    # View transformation
    gluLookAt (2.4, 3.6, 4.8, 0.5, 0.5, 0, 0, 1, 0)

# draw_body
def draw_body(body):
    """Draw an ODE body.
    """

    x,y,z = body.getPosition()
    R = body.getRotation()
    #rot = [R[0], R[3], R[6], 0.,
    #       R[1], R[4], R[7], 0.,
    #       R[2], R[5], R[8], 0.,
    #       x, y, z, 1.0]
    rot = [1, 0.0, 0.0, 0.0,
           0.0, 1, 0.0, 0.0,
           0.0, 0.0, 1.0, 0.0,
           x, y, z, 1.0]
    glPushMatrix()
    glMultMatrixd(rot)
    if body.shape=="box":
        sx,sy,sz = body.boxsize
        glScale(sx, sy, sz)
        glutSolidCube(1)
    glPopMatrix()


# create_box
def create_box(world, space, density, lx, ly, lz):
    """Create a box body and its corresponding geom."""

    # Create body
    body = ode.Body(world)
    M = ode.Mass()
    M.setBox(density, lx, ly, lz)
    body.setMass(M)

    # Set parameters for drawing the body
    body.shape = "box"
    body.boxsize = (lx, ly, lz)

    # Create a box geom for collision detection
    geom = ode.GeomBox(space, lengths=body.boxsize)
    geom.setBody(body)

    return body

# create box object
def create_object(posx, posy, posz):
    """create one box at a given position."""

    global bodies, counter, objcount

    body = create_box(world, space, 1000, 1.0,1.0,1.0)
    body.setPosition((posx, posy, posz))
    bodies.append(body)
    #counter=0
    objcount+=1
	

# drop_object
def drop_object(posx, posy, posz):
    """Drop an object into the scene."""

    global bodies, counter, objcount

    body = create_box(world, space, 1000, 1.0,1.0,1.0)
    body.setPosition((posx, posy, posz))
    bodies.append(body)
    #counter=0
    objcount+=1

# Collision callback
def near_callback(args, geom1, geom2):
    """Callback function for the collide() method.

    This function checks if the given geoms do collide and
    creates contact joints if they do.
    """

    # Check if the objects do collide
    contacts = ode.collide(geom1, geom2)

    # Create contact joints
    world,contactgroup = args
    for c in contacts:
        c.setBounce(0.2)
        c.setMu(5000)
        j = ode.ContactJoint(world, contactgroup, c)
        j.attach(geom1.getBody(), geom2.getBody())



######################################################################

# Initialize Glut
glutInit ([])

# Open a window
glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE)

x = 0
y = 0
width = 640
height = 480
glutInitWindowPosition (x, y);
glutInitWindowSize (width, height);
glutCreateWindow ("(0,0,0), startTime=8000")

# Create a world object
world = ode.World()
world.setGravity( (0,-9.81,0) )
world.setERP(0.8)
world.setCFM(1E-5)

# Create a space object
space = ode.Space()

# Create a plane geom which prevent the objects from falling forever
floor = ode.GeomPlane(space, (0,1,0), 0)

# A list with ODE bodies
bodies = []

# A joint group for the contact joints that are generated whenever
# two bodies collide
contactgroup = ode.JointGroup()

# Some variables used inside the simulation loop
fps = 50
dt = 1.0/fps
running = True
state = 0
counter = 0
objcount = 0
lasttime = time.time()


# keyboard callback
def _keyfunc (c, x, y):
    sys.exit (0)

glutKeyboardFunc (_keyfunc)

# draw callback
def _drawfunc ():
    # Draw the scene
    prepare_GL()
    for b in bodies:
        draw_body(b)

    glutSwapBuffers ()

glutDisplayFunc (_drawfunc)

# idle callback
def _idlefunc ():
    global counter, state, lasttime

    t = dt - (time.time() - lasttime)
    if (t > 0):
        time.sleep(t)

    counter += 1
    
    if state==0:
        create_object(0.0,0.5,0.0)
	state = 1

    if state==1:
		#20000 is different
		#10000 is different a little less
		#7000 no diff from 0 time
		#5000 no diff from 0 time
        if counter==8000:
            drop_object(1.29,5.0,0.0)
	    state = 2
    #    if objcount==30:
    #        state=1
    #        counter=0
    # State 1: Explosion and pulling back the objects
    #elif state==1:
    #    if counter==100:
    #        explosion()
    #    if counter>300:
    #        pull()
    #    if counter==500:
    #        counter=20

    glutPostRedisplay ()

    # Simulate
    n = 2

    for i in range(n):
        # Detect collisions and create contact joints
        space.collide((world,contactgroup), near_callback)

        # Simulation step
        world.step(dt/n)

        # Remove all contact joints
        contactgroup.empty()

    lasttime = time.time()

glutIdleFunc (_idlefunc)

glutMainLoop ()


More information about the vos-d mailing list