add pybullet.getBasePositionAndOrientation
add missing file to pybullet CMakeLists.txt
This commit is contained in:
@@ -48,6 +48,7 @@ SET(pybullet_SRCS
|
|||||||
../../examples/Importers/ImportURDFDemo/URDF2Bullet.cpp
|
../../examples/Importers/ImportURDFDemo/URDF2Bullet.cpp
|
||||||
../../examples/Importers/ImportURDFDemo/UrdfParser.cpp
|
../../examples/Importers/ImportURDFDemo/UrdfParser.cpp
|
||||||
../../examples/Importers/ImportURDFDemo/urdfStringSplit.cpp
|
../../examples/Importers/ImportURDFDemo/urdfStringSplit.cpp
|
||||||
|
../../examples/Importers/ImportURDFDemo/DefaultVisualShapeConverter.cpp
|
||||||
../../examples/MultiThreading/b3PosixThreadSupport.cpp
|
../../examples/MultiThreading/b3PosixThreadSupport.cpp
|
||||||
../../examples/MultiThreading/b3Win32ThreadSupport.cpp
|
../../examples/MultiThreading/b3Win32ThreadSupport.cpp
|
||||||
../../examples/MultiThreading/b3ThreadSupportInterface.cpp
|
../../examples/MultiThreading/b3ThreadSupportInterface.cpp
|
||||||
|
|||||||
@@ -224,25 +224,114 @@ pybullet_setGravity(PyObject* self, PyObject* args)
|
|||||||
//ASSERT_EQ(b3GetStatusType(statusHandle), CMD_CLIENT_COMMAND_COMPLETED);
|
//ASSERT_EQ(b3GetStatusType(statusHandle), CMD_CLIENT_COMMAND_COMPLETED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (1)
|
|
||||||
{
|
|
||||||
PyObject *pylist;
|
|
||||||
PyObject *item;
|
|
||||||
int i;
|
|
||||||
int num=3;
|
|
||||||
pylist = PyTuple_New(num);
|
|
||||||
for (i = 0; i < num; i++)
|
|
||||||
{
|
|
||||||
item = PyFloat_FromDouble(i);
|
|
||||||
PyTuple_SetItem(pylist, i, item);
|
|
||||||
}
|
|
||||||
return pylist;
|
|
||||||
}
|
|
||||||
|
|
||||||
Py_INCREF(Py_None);
|
Py_INCREF(Py_None);
|
||||||
return Py_None;
|
return Py_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void pybullet_internalGetBasePositionAndOrientation(int bodyIndex, double basePosition[3],double baseOrientation[3])
|
||||||
|
{
|
||||||
|
basePosition[0] = 0.;
|
||||||
|
basePosition[1] = 0.;
|
||||||
|
basePosition[2] = 0.;
|
||||||
|
|
||||||
|
baseOrientation[0] = 0.;
|
||||||
|
baseOrientation[1] = 0.;
|
||||||
|
baseOrientation[2] = 0.;
|
||||||
|
baseOrientation[3] = 1.;
|
||||||
|
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
b3SharedMemoryCommandHandle cmd_handle =
|
||||||
|
b3RequestActualStateCommandInit(sm, bodyIndex);
|
||||||
|
b3SharedMemoryStatusHandle status_handle =
|
||||||
|
b3SubmitClientCommandAndWaitStatus(sm, cmd_handle);
|
||||||
|
|
||||||
|
const int status_type = b3GetStatusType(status_handle);
|
||||||
|
|
||||||
|
const double* actualStateQ;
|
||||||
|
b3GetStatusActualState(status_handle, 0/* body_unique_id */,
|
||||||
|
0/* num_degree_of_freedom_q */,
|
||||||
|
0/* num_degree_of_freedom_u */, 0 /*root_local_inertial_frame*/,
|
||||||
|
&actualStateQ , 0 /* actual_state_q_dot */,
|
||||||
|
0 /* joint_reaction_forces */);
|
||||||
|
|
||||||
|
//now, position x,y,z = actualStateQ[0],actualStateQ[1],actualStateQ[2]
|
||||||
|
//and orientation x,y,z,w = actualStateQ[3],actualStateQ[4],actualStateQ[5],actualStateQ[6]
|
||||||
|
basePosition[0] = actualStateQ[0];
|
||||||
|
basePosition[1] = actualStateQ[1];
|
||||||
|
basePosition[2] = actualStateQ[2];
|
||||||
|
|
||||||
|
baseOrientation[0] = actualStateQ[3];
|
||||||
|
baseOrientation[1] = actualStateQ[4];
|
||||||
|
baseOrientation[2] = actualStateQ[5];
|
||||||
|
baseOrientation[3] = actualStateQ[6];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
pybullet_getBasePositionAndOrientation(PyObject* self, PyObject* args)
|
||||||
|
{
|
||||||
|
if (0==sm)
|
||||||
|
{
|
||||||
|
PyErr_SetString(SpamError, "Not connected to physics server.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bodyIndex = -1;
|
||||||
|
if (!PyArg_ParseTuple(args, "i", &bodyIndex ))
|
||||||
|
{
|
||||||
|
PyErr_SetString(SpamError, "Expected a body index (integer).");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
double basePosition[3];
|
||||||
|
double baseOrientation[4];
|
||||||
|
|
||||||
|
pybullet_internalGetBasePositionAndOrientation(bodyIndex,basePosition,baseOrientation);
|
||||||
|
PyObject *pylistPos;
|
||||||
|
{
|
||||||
|
|
||||||
|
PyObject *item;
|
||||||
|
int i;
|
||||||
|
int num=3;
|
||||||
|
pylistPos = PyTuple_New(num);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
item = PyFloat_FromDouble(basePosition[i]);
|
||||||
|
PyTuple_SetItem(pylistPos, i, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
PyObject *pylistOrientation;
|
||||||
|
{
|
||||||
|
|
||||||
|
PyObject *item;
|
||||||
|
int i;
|
||||||
|
int num=4;
|
||||||
|
pylistOrientation = PyTuple_New(num);
|
||||||
|
for (i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
item = PyFloat_FromDouble(baseOrientation[i]);
|
||||||
|
PyTuple_SetItem(pylistOrientation, i, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
PyObject *pylist;
|
||||||
|
pylist = PyTuple_New(2);
|
||||||
|
PyTuple_SetItem(pylist,0,pylistPos);
|
||||||
|
PyTuple_SetItem(pylist,1,pylistOrientation);
|
||||||
|
return pylist;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
pybullet_getNumJoints(PyObject* self, PyObject* args)
|
pybullet_getNumJoints(PyObject* self, PyObject* args)
|
||||||
{
|
{
|
||||||
@@ -290,6 +379,9 @@ static PyMethodDef SpamMethods[] = {
|
|||||||
{"setGravity", pybullet_setGravity, METH_VARARGS,
|
{"setGravity", pybullet_setGravity, METH_VARARGS,
|
||||||
"Set the gravity acceleration (x,y,z)."},
|
"Set the gravity acceleration (x,y,z)."},
|
||||||
|
|
||||||
|
{"getBasePositionAndOrientation", pybullet_getBasePositionAndOrientation, METH_VARARGS,
|
||||||
|
"Get the world position and orientation of the base of the object. (x,y,z) position vector and (x,y,z,w) quaternion orientation."},
|
||||||
|
|
||||||
{"getNumsetGravity", pybullet_setGravity, METH_VARARGS,
|
{"getNumsetGravity", pybullet_setGravity, METH_VARARGS,
|
||||||
"Set the gravity acceleration (x,y,z)."},
|
"Set the gravity acceleration (x,y,z)."},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import pybullet
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
#choose connection method: GUI, DIRECT, SHARED_MEMORY
|
#choose connection method: GUI, DIRECT, SHARED_MEMORY
|
||||||
pybullet.connect(pybullet.SHARED_MEMORY)
|
pybullet.connect(pybullet.GUI)
|
||||||
|
|
||||||
#load URDF, given a relative or absolute file+path
|
#load URDF, given a relative or absolute file+path
|
||||||
obj = pybullet.loadURDF("r2d2.urdf")
|
obj = pybullet.loadURDF("r2d2.urdf")
|
||||||
@@ -24,6 +24,8 @@ pybullet.setGravity(0,0,-9.8)
|
|||||||
t_end = time.time() + 5
|
t_end = time.time() + 5
|
||||||
while time.time() < t_end:
|
while time.time() < t_end:
|
||||||
pybullet.stepSimulation()
|
pybullet.stepSimulation()
|
||||||
|
posAndOrn = pybullet.getBasePositionAndOrientation(obj)
|
||||||
|
print (posAndOrn)
|
||||||
|
|
||||||
print ("finished")
|
print ("finished")
|
||||||
#remove all objects
|
#remove all objects
|
||||||
|
|||||||
Reference in New Issue
Block a user