Starts bullet server when testsuite is ran, uses pybullet_utils to manage clients.

This commit is contained in:
Tigran Gasparian
2018-06-04 19:40:16 +02:00
parent bb72a91080
commit c49e060e81

View File

@@ -1,141 +1,147 @@
import unittest import unittest
import pybullet import pybullet
from pybullet_utils import bullet_client
PLANE_PATH = "plane.urdf" PLANE_PATH = "plane.urdf"
ROBOT_PATH = "r2d2.urdf" ROBOT_PATH = "r2d2.urdf"
class TestUserDataMethods(unittest.TestCase): class TestUserDataMethods(unittest.TestCase):
@classmethod
def setUpClass(cls):
TestUserDataMethods.server = bullet_client.BulletClient(connection_mode=pybullet.GUI_SERVER)
@classmethod
def tearDownClass(cls):
del TestUserDataMethods.server
def setUp(self): def setUp(self):
self.client_id = pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
def tearDown(self): def tearDown(self):
pybullet.resetSimulation() self.client.resetSimulation()
pybullet.disconnect() del self.client
def testAddUserData(self): def testAddUserData(self):
plane_id = pybullet.loadURDF(PLANE_PATH) plane_id = self.client.loadURDF(PLANE_PATH)
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
# Retrieve user data and make sure it's correct. # Retrieve user data and make sure it's correct.
self.assertEqual(b"MyValue1", pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(b"MyValue2", pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(b"MyValue2", self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(b"MyValue3", pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(b"MyValue4", pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
# Disconnect/reconnect and make sure that the user data is synced back. # Disconnect/reconnect and make sure that the user data is synced back.
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(b"MyValue1", pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(b"MyValue2", pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(b"MyValue2", self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(b"MyValue3", pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(b"MyValue4", pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
pybullet.resetSimulation() self.client.resetSimulation()
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
def testGetNumUserData(self): def testGetNumUserData(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4")
self.assertEqual(4, pybullet.getNumUserData(plane_id, 0)) self.assertEqual(4, self.client.getNumUserData(plane_id, 0))
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(4, pybullet.getNumUserData(plane_id, 0)) self.assertEqual(4, self.client.getNumUserData(plane_id, 0))
def testReplaceUserData(self): def testReplaceUserData(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid = self.client.addUserData(plane_id, 0, "MyKey", "MyValue")
uid = pybullet.addUserData(plane_id, 0, "MyKey", "MyValue")
self.assertEqual(b"MyValue", pybullet.getUserData(plane_id, 0, uid)) self.assertEqual(b"MyValue", self.client.getUserData(plane_id, 0, uid))
new_uid = pybullet.addUserData(plane_id, 0, "MyKey", "MyNewValue") new_uid = self.client.addUserData(plane_id, 0, "MyKey", "MyNewValue")
self.assertEqual(uid, new_uid) self.assertEqual(uid, new_uid)
self.assertEqual(b"MyNewValue", pybullet.getUserData(plane_id, 0, uid)) self.assertEqual(b"MyNewValue", self.client.getUserData(plane_id, 0, uid))
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(b"MyNewValue", pybullet.getUserData(plane_id, 0, uid)) self.assertEqual(b"MyNewValue", self.client.getUserData(plane_id, 0, uid))
def testGetUserDataId(self): def testGetUserDataId(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4")
self.assertEqual(uid1, pybullet.getUserDataId(plane_id, 0, "MyKey1")) self.assertEqual(uid1, self.client.getUserDataId(plane_id, 0, "MyKey1"))
self.assertEqual(uid2, pybullet.getUserDataId(plane_id, 0, "MyKey2")) self.assertEqual(uid2, self.client.getUserDataId(plane_id, 0, "MyKey2"))
self.assertEqual(uid3, pybullet.getUserDataId(plane_id, 0, "MyKey3")) self.assertEqual(uid3, self.client.getUserDataId(plane_id, 0, "MyKey3"))
self.assertEqual(uid4, pybullet.getUserDataId(plane_id, 0, "MyKey4")) self.assertEqual(uid4, self.client.getUserDataId(plane_id, 0, "MyKey4"))
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(uid1, pybullet.getUserDataId(plane_id, 0, "MyKey1")) self.assertEqual(uid1, self.client.getUserDataId(plane_id, 0, "MyKey1"))
self.assertEqual(uid2, pybullet.getUserDataId(plane_id, 0, "MyKey2")) self.assertEqual(uid2, self.client.getUserDataId(plane_id, 0, "MyKey2"))
self.assertEqual(uid3, pybullet.getUserDataId(plane_id, 0, "MyKey3")) self.assertEqual(uid3, self.client.getUserDataId(plane_id, 0, "MyKey3"))
self.assertEqual(uid4, pybullet.getUserDataId(plane_id, 0, "MyKey4")) self.assertEqual(uid4, self.client.getUserDataId(plane_id, 0, "MyKey4"))
def testRemoveUserData(self): def testRemoveUserData(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4")
pybullet.removeUserData(plane_id, 0, uid2) self.client.removeUserData(plane_id, 0, uid2)
self.assertEqual(3, pybullet.getNumUserData(plane_id, 0)) self.assertEqual(3, self.client.getNumUserData(plane_id, 0))
self.assertEqual(-1, pybullet.getUserDataId(plane_id, 0, "MyKey2")) self.assertEqual(-1, self.client.getUserDataId(plane_id, 0, "MyKey2"))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(b"MyValue1", pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(b"MyValue3", pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(b"MyValue4", pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(3, pybullet.getNumUserData(plane_id, 0)) self.assertEqual(3, self.client.getNumUserData(plane_id, 0))
self.assertEqual(-1, pybullet.getUserDataId(plane_id, 0, "MyKey2")) self.assertEqual(-1, self.client.getUserDataId(plane_id, 0, "MyKey2"))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(b"MyValue1", pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(b"MyValue1", self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(b"MyValue3", pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(b"MyValue3", self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(b"MyValue4", pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(b"MyValue4", self.client.getUserData(plane_id, 0, uid4))
def testIterateAllUserData(self): def testIterateAllUserData(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4")
entries = set() entries = set()
for i in range(pybullet.getNumUserData(plane_id, 0)): for i in range(self.client.getNumUserData(plane_id, 0)):
userDataId, key = pybullet.getUserDataInfo(plane_id, 0, i) userDataId, key = self.client.getUserDataInfo(plane_id, 0, i)
value = pybullet.getUserData(plane_id, 0, userDataId); value = self.client.getUserData(plane_id, 0, userDataId);
entries.add((userDataId, key, value)) entries.add((userDataId, key, value))
self.assertTrue((uid1, b"MyKey1", b"MyValue1") in entries) self.assertTrue((uid1, b"MyKey1", b"MyValue1") in entries)
@@ -146,91 +152,87 @@ class TestUserDataMethods(unittest.TestCase):
def testRemoveBody(self): def testRemoveBody(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane_id = self.client.loadURDF(PLANE_PATH)
plane_id = pybullet.loadURDF(PLANE_PATH) uid1 = self.client.addUserData(plane_id, 0, "MyKey1", "MyValue1")
uid1 = pybullet.addUserData(plane_id, 0, "MyKey1", "MyValue1") uid2 = self.client.addUserData(plane_id, 0, "MyKey2", "MyValue2")
uid2 = pybullet.addUserData(plane_id, 0, "MyKey2", "MyValue2") uid3 = self.client.addUserData(plane_id, 0, "MyKey3", "MyValue3")
uid3 = pybullet.addUserData(plane_id, 0, "MyKey3", "MyValue3") uid4 = self.client.addUserData(plane_id, 0, "MyKey4", "MyValue4")
uid4 = pybullet.addUserData(plane_id, 0, "MyKey4", "MyValue4")
pybullet.removeBody(plane_id) self.client.removeBody(plane_id)
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
pybullet.disconnect() del self.client
pybullet.connect(pybullet.SHARED_MEMORY) self.client = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid1)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid1))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid2)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid2))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid3)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid3))
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid4)) self.assertEqual(None, self.client.getUserData(plane_id, 0, uid4))
def testMultipleBodies(self): def testMultipleBodies(self):
pybullet.connect(pybullet.SHARED_MEMORY) plane1 = self.client.loadURDF(PLANE_PATH)
plane1 = pybullet.loadURDF(PLANE_PATH) plane2 = self.client.loadURDF(PLANE_PATH)
plane2 = pybullet.loadURDF(PLANE_PATH)
uid1 = pybullet.addUserData(plane1, 0, "MyKey1", "This is plane 1 - 1") uid1 = self.client.addUserData(plane1, 0, "MyKey1", "This is plane 1 - 1")
uid2 = pybullet.addUserData(plane1, 0, "MyKey2", "This is plane 1 - 2") uid2 = self.client.addUserData(plane1, 0, "MyKey2", "This is plane 1 - 2")
uid3 = pybullet.addUserData(plane2, 0, "MyKey1", "This is plane 2 - 1") uid3 = self.client.addUserData(plane2, 0, "MyKey1", "This is plane 2 - 1")
uid4 = pybullet.addUserData(plane2, 0, "MyKey2", "This is plane 2 - 2") uid4 = self.client.addUserData(plane2, 0, "MyKey2", "This is plane 2 - 2")
uid5 = pybullet.addUserData(plane2, 0, "MyKey3", "This is plane 2 - 3") uid5 = self.client.addUserData(plane2, 0, "MyKey3", "This is plane 2 - 3")
self.assertEqual(b"This is plane 1 - 1", pybullet.getUserData(plane1, 0, pybullet.getUserDataId(plane1, 0, "MyKey1"))) self.assertEqual(b"This is plane 1 - 1", self.client.getUserData(plane1, 0, self.client.getUserDataId(plane1, 0, "MyKey1")))
self.assertEqual(b"This is plane 1 - 2", pybullet.getUserData(plane1, 0, pybullet.getUserDataId(plane1, 0, "MyKey2"))) self.assertEqual(b"This is plane 1 - 2", self.client.getUserData(plane1, 0, self.client.getUserDataId(plane1, 0, "MyKey2")))
self.assertEqual(b"This is plane 2 - 1", pybullet.getUserData(plane2, 0, pybullet.getUserDataId(plane2, 0, "MyKey1"))) self.assertEqual(b"This is plane 2 - 1", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey1")))
self.assertEqual(b"This is plane 2 - 2", pybullet.getUserData(plane2, 0, pybullet.getUserDataId(plane2, 0, "MyKey2"))) self.assertEqual(b"This is plane 2 - 2", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey2")))
self.assertEqual(b"This is plane 2 - 3", pybullet.getUserData(plane2, 0, pybullet.getUserDataId(plane2, 0, "MyKey3"))) self.assertEqual(b"This is plane 2 - 3", self.client.getUserData(plane2, 0, self.client.getUserDataId(plane2, 0, "MyKey3")))
def testMultipleLinks(self): def testMultipleLinks(self):
pybullet.connect(pybullet.SHARED_MEMORY) body_id = self.client.loadURDF(ROBOT_PATH)
num_links = self.client.getNumJoints(body_id)
body_id = pybullet.loadURDF(ROBOT_PATH)
num_links = pybullet.getNumJoints(body_id)
self.assertTrue(num_links > 1) self.assertTrue(num_links > 1)
for link_index in range(num_links): for link_index in range(num_links):
uid1 = pybullet.addUserData(body_id, link_index, "MyKey1", "Value1 for link %s" % link_index) uid1 = self.client.addUserData(body_id, link_index, "MyKey1", "Value1 for link %s" % link_index)
uid2 = pybullet.addUserData(body_id, link_index, "MyKey2", "Value2 for link %s" % link_index) uid2 = self.client.addUserData(body_id, link_index, "MyKey2", "Value2 for link %s" % link_index)
for link_index in range(num_links): for link_index in range(num_links):
uid1 = pybullet.getUserDataId(body_id, link_index, "MyKey1") uid1 = self.client.getUserDataId(body_id, link_index, "MyKey1")
uid2 = pybullet.getUserDataId(body_id, link_index, "MyKey2") uid2 = self.client.getUserDataId(body_id, link_index, "MyKey2")
self.assertEqual(("Value1 for link %s" % link_index).encode(), pybullet.getUserData(body_id, link_index, uid1)) self.assertEqual(("Value1 for link %s" % link_index).encode(), self.client.getUserData(body_id, link_index, uid1))
self.assertEqual(("Value2 for link %s" % link_index).encode(), pybullet.getUserData(body_id, link_index, uid2)) self.assertEqual(("Value2 for link %s" % link_index).encode(), self.client.getUserData(body_id, link_index, uid2))
def testMultipleClients(self): def testMultipleClients(self):
client1 = self.client_id client1 = self.client
client2 = pybullet.connect(pybullet.SHARED_MEMORY) client2 = bullet_client.BulletClient(pybullet.SHARED_MEMORY)
plane_id = pybullet.loadURDF(PLANE_PATH, physicsClientId=client1) plane_id = client1.loadURDF(PLANE_PATH)
pybullet.syncBodyInfo(physicsClientId=client2) client2.syncBodyInfo()
# Add user data on client 1, check on client 1 # Add user data on client 1, check on client 1
uid = pybullet.addUserData(plane_id, 0, "MyKey", "MyValue", physicsClientId=client1) uid = client1.addUserData(plane_id, 0, "MyKey", "MyValue")
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid, physicsClientId=client2)) self.assertEqual(None, client2.getUserData(plane_id, 0, uid))
pybullet.syncUserData(physicsClientId=client2) client2.syncUserData()
self.assertEqual(b"MyValue", pybullet.getUserData(plane_id, 0, uid, physicsClientId=client2)) self.assertEqual(b"MyValue", client2.getUserData(plane_id, 0, uid))
# Overwrite the value on client 2, check on client 1 # Overwrite the value on client 2, check on client 1
pybullet.addUserData(plane_id, 0, "MyKey", "MyNewValue", physicsClientId=client2) client2.addUserData(plane_id, 0, "MyKey", "MyNewValue")
self.assertEqual(b"MyValue", pybullet.getUserData(plane_id, 0, uid, physicsClientId=client1)) self.assertEqual(b"MyValue", client1.getUserData(plane_id, 0, uid))
pybullet.syncUserData(physicsClientId=client1) client1.syncUserData()
self.assertEqual(b"MyNewValue", pybullet.getUserData(plane_id, 0, uid, physicsClientId=client1)) self.assertEqual(b"MyNewValue", client1.getUserData(plane_id, 0, uid))
# Remove user data on client 1, check on client 2 # Remove user data on client 1, check on client 2
pybullet.removeUserData(plane_id, 0, uid, physicsClientId=client1) client1.removeUserData(plane_id, 0, uid)
self.assertEqual(b"MyNewValue", pybullet.getUserData(plane_id, 0, uid, physicsClientId=client2)) self.assertEqual(b"MyNewValue", client2.getUserData(plane_id, 0, uid))
pybullet.syncUserData(physicsClientId=client2) client2.syncUserData()
self.assertEqual(None, pybullet.getUserData(plane_id, 0, uid, physicsClientId=client2)) self.assertEqual(None, client2.getUserData(plane_id, 0, uid))
pybullet.disconnect(physicsClientId=client2) del client2
if __name__ == "__main__": if __name__ == "__main__":