|
12 | 12 | # See the License for the specific language governing permissions and |
13 | 13 | # limitations under the License. |
14 | 14 |
|
| 15 | +import math |
15 | 16 | import time |
16 | 17 |
|
17 | 18 | import numpy as np |
@@ -331,6 +332,38 @@ def test_transform_from_pose(): |
331 | 332 | assert transform.child_frame_id == "base_link" # passed as first argument |
332 | 333 |
|
333 | 334 |
|
| 335 | +# validating results from example @ |
| 336 | +# https://foxglove.dev/blog/understanding-ros-transforms |
| 337 | +def test_transform_from_ros(): |
| 338 | + """Test converting PoseStamped to Transform""" |
| 339 | + test_time = time.time() |
| 340 | + pose_stamped = PoseStamped( |
| 341 | + ts=test_time, |
| 342 | + frame_id="base_link", |
| 343 | + position=Vector3(1, -1, 0), |
| 344 | + orientation=Quaternion.from_euler(Vector3(0, 0, math.pi / 6)), |
| 345 | + ) |
| 346 | + transform_base_link_to_arm = Transform.from_pose("arm_base_link", pose_stamped) |
| 347 | + |
| 348 | + transform_arm_to_end = Transform.from_pose( |
| 349 | + "end", |
| 350 | + PoseStamped( |
| 351 | + ts=test_time, |
| 352 | + frame_id="arm_base_link", |
| 353 | + position=Vector3(1, 1, 0), |
| 354 | + orientation=Quaternion.from_euler(Vector3(0, 0, math.pi / 6)), |
| 355 | + ), |
| 356 | + ) |
| 357 | + |
| 358 | + print(transform_base_link_to_arm) |
| 359 | + print(transform_arm_to_end) |
| 360 | + |
| 361 | + end_effector_global_pose = transform_base_link_to_arm + transform_arm_to_end |
| 362 | + |
| 363 | + assert end_effector_global_pose.translation.x == pytest.approx(1.366, abs=1e-3) |
| 364 | + assert end_effector_global_pose.translation.y == pytest.approx(0.366, abs=1e-3) |
| 365 | + |
| 366 | + |
334 | 367 | def test_transform_from_pose_stamped(): |
335 | 368 | """Test converting PoseStamped to Transform""" |
336 | 369 | # Create a PoseStamped with position, orientation, timestamp and frame |
|
0 commit comments