Skip to content

Commit e8a05ca

Browse files
committed
API change. Get/set matrix now requires/expects 4x4 numpy array.
1 parent 204a166 commit e8a05ca

File tree

4 files changed

+21
-20
lines changed

4 files changed

+21
-20
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jobs:
2727
# Runs a set of commands using the runners shell
2828
- name: Run a multi-line script
2929
run: |
30+
sudo apt-get update -qq
3031
sudo apt-get install -y xvfb qtbase5-dev qtdeclarative5-dev libqt5webkit5-dev libsqlite3-dev qt5-default qttools5-dev-tools
3132
# start xvfb in the background
3233
sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 &

pyrep/objects/object.py

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -287,39 +287,34 @@ def set_parent(self, parent_object: Union['Object', None],
287287
parent = -1 if parent_object is None else parent_object.get_handle()
288288
sim.simSetObjectParent(self._handle, parent, keep_in_place)
289289

290-
def get_matrix(self, relative_to=None) -> List[float]:
290+
def get_matrix(self, relative_to=None) -> np.ndarray:
291291
"""Retrieves the transformation matrix of this object.
292292
293293
:param relative_to: Indicates relative to which reference frame we want
294294
the matrix. Specify None to retrieve the absolute transformation
295295
matrix, or an Object relative to whose reference frame we want the
296296
transformation matrix.
297-
:return: A list of 12 float values (the last row of the 4x4 matrix (
298-
0,0,0,1) is not needed).
299-
The x-axis of the orientation component is (m[0], m[4], m[8])
300-
The y-axis of the orientation component is (m[1], m[5], m[9])
301-
The z-axis of the orientation component is (m[2], m[6], m[10])
302-
The translation component is (m[3], m[7], m[11])
297+
:return: A 4x4 transformation matrix.
303298
"""
304299
relto = -1 if relative_to is None else relative_to.get_handle()
305-
return sim.simGetObjectMatrix(self._handle, relto)
300+
m = sim.simGetObjectMatrix(self._handle, relto)
301+
m_np = np.array(m).reshape((3, 4))
302+
return np.concatenate([m_np, [np.array([0, 0, 0, 1])]])
306303

307-
def set_matrix(self, matrix: List[float], relative_to=None) -> None:
304+
def set_matrix(self, matrix: np.ndarray, relative_to=None) -> None:
308305
"""Sets the transformation matrix of this object.
309306
310307
:param relative_to: Indicates relative to which reference frame the
311308
matrix is specified. Specify None to set the absolute transformation
312309
matrix, or an Object relative to whose reference frame the
313310
transformation matrix is specified.
314-
:param matrix: A list of 12 float values (the last row of the 4x4 matrix
315-
(0,0,0,1) is not needed).
316-
The x-axis of the orientation component is (m[0], m[4], m[8])
317-
The y-axis of the orientation component is (m[1], m[5], m[9])
318-
The z-axis of the orientation component is (m[2], m[6], m[10])
319-
The translation component is (m[3], m[7], m[11])
311+
:param matrix: A 4x4 transformation matrix.
320312
"""
313+
if not isinstance(matrix, np.ndarray):
314+
raise ValueError('Expected Numpy 4x4 array.')
321315
relto = -1 if relative_to is None else relative_to.get_handle()
322-
sim.simSetObjectMatrix(self._handle, relto, matrix)
316+
sim.simSetObjectMatrix(
317+
self._handle, relto, matrix[:3, :4].reshape((12)).tolist())
323318

324319
def is_collidable(self) -> bool:
325320
"""Whether the object is collidable or not.

pyrep/sensors/gyroscope.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ def __init__(self, name):
1111
self._ref = '%s_reference' % (self.get_name())
1212

1313
self._last_time = sim.simGetSimulationTime()
14-
self._old_transformation_matrix = self.get_matrix()
14+
self._old_transformation_matrix = self.get_matrix()[:3, :4].reshape(
15+
(12, )).tolist()
1516

1617
def _get_requested_type(self) -> ObjectType:
1718
return ObjectType(sim.simGetObjectType(self.get_handle()))
@@ -26,7 +27,8 @@ def read(self):
2627
dt = current_time - self._last_time
2728

2829
inv_old_matrix = sim.simInvertMatrix(self._old_transformation_matrix)
29-
transformation_matrix = self.get_matrix()
30+
transformation_matrix = self.get_matrix()[:3, :4].reshape(
31+
(12, )).tolist()
3032
mat = sim.simMultiplyMatrices(inv_old_matrix, transformation_matrix)
3133
euler_angles = sim.simGetEulerAnglesFromMatrix(mat)
3234

tests/test_objects.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,11 @@ def test_get_parent_when_orphan(self):
131131
parent = self.dummy.get_parent()
132132
self.assertIsNone(parent)
133133

134-
def test_get_matrix(self):
135-
self.assertEqual(len(self.dynamic_cube.get_matrix()), 12)
134+
def test_get_set_matrix(self):
135+
m = self.dynamic_cube.get_matrix()
136+
self.assertEqual(m.shape, (4, 4))
137+
self.simple_model.set_matrix(m)
138+
self.assertListEqual(self.simple_model.get_matrix().tolist(), m.tolist())
136139

137140
def test_get_set_collidable(self):
138141
self.dynamic_cube.set_collidable(False)

0 commit comments

Comments
 (0)