Shows how to enable physics.
Description
When simulations are turned on, an internal timer starts and the SimulationStep functions of all classes are called. Note that simulations extend beyond physics. That’s why there’s the distinction between simulation and physics and both are set separately. To start the internal simulation with a timestep of 0.001 seconds do
env = Environment()
env.StartSimulation(timestep=0.001)
To stop it do
In a plugin, every state is accessible directly through memory. In scripting (Octave/Matlab), there’s a thread safe loop that serializes information to the socket. KinBody/Robot information can be accessed from any thread as long as EvironmentBase::LockPhysics is called. In a SimulationStep call, this is not necessary as OpenRAVE locks physics before calling it.
To set the physics engine to ODE, use
env.SetPhysicsEngine(env.CreatePhysicsEngine('ode'))
octave:
orEnvSetOptions(‘physics ODE’);
To set gravity:
env.GetPhysicsEngine().SetGravity([0,0,-9.81])
Make sure that whatever object you don’t want moving (like floors) are declared static. Setting Properites through XML Files
It is possible to create and setup a physics engine in the <environment> tag in the XML file description. The ode physics engine uses a custom XML reader to define a special odeproperties tag that can be used to specify friction, gravity, etc. For example:
<environment>
<!-- ... other definitions ... -->
<physicsengine type="ode">
<odeproperties>
<friction>0.5</friction>
<gravity>0 0 -9.8</gravity>
<selfcollision>1</selfcollision>
</odeproperties>
</physicsengine>
</environment>
Take a look at the share/openrave/data/testphysics.env.xml for a working example.
Command-line
Usage: openrave.py [options]
test physics
Options:
-h, --help show this help message and exit
--scene=SCENE Scene file to load (default=data/hanoi.env.xml)
--timestep=TIMESTEP The physics simulation time step size (default=0.001)
OpenRAVE Environment Options:
--loadplugin=_LOADPLUGINS
List all plugins and the interfaces they provide.
--collision=_COLLISION
Default collision checker to use
--physics=_PHYSICS physics engine to use (default=none)
--viewer=_VIEWER viewer to use (default=qtcoin)
--server=_SERVER server to use (default=None).
--serverport=_SERVERPORT
port to load server on (default=4765).
--module=_MODULES module to load, can specify multiple modules. Two
arguments are required: "name" "args".
-l _LEVEL, --level=_LEVEL, --log_level=_LEVEL
Debug level, one of
(fatal,error,warn,info,debug,verbose,verifyplans)
--testmode if set, will run the program in a finite amount of
time and spend computation time validating results.
Used for testing
Main Python Code
def main(env,options):
"Main example code."
env.Load(options.scene)
if options._physics is None:
# no physics engine set, so set one
physics = RaveCreatePhysicsEngine(env,'ode')
env.SetPhysicsEngine(physics)
with env:
env.GetPhysicsEngine().SetGravity([0,0,-1])
env.StopSimulation()
env.StartSimulation(timestep=options.timestep)
starttime = time.time()
while True:
bodynames = ['data/lego2.kinbody.xml', 'data/lego4.kinbody.xml', 'data/mug1.kinbody.xml']
numbodies = 0
if numbodies < 40:
with env:
body = env.ReadKinBodyXMLFile(bodynames[random.randint(len(bodynames))])
body.SetName('body%d'%numbodies)
numbodies += 1
env.Add(body,True)
T = eye(4)
T[0:3,3] = array((-0.5,-0.5,2))+0.4*random.rand(3)
body.SetTransform(T)
time.sleep(0.4)
simtime = env.GetSimulationTime()*1e-6
realtime = time.time()-starttime
print 'sim time: %fs, real time: %fs, diff = %fs'%(simtime,realtime,simtime-realtime)
Class Definitions
-
openravepy.examples.testphysics.main(env, options)[ソース]
Main example code.
-
openravepy.examples.testphysics.run(*args, **kwargs)[ソース]
Command-line execution of the example.
パラメタ: | args – arguments for script to parse, if not specified will use sys.argv |