diff --git a/aruco_pose/package.xml b/aruco_pose/package.xml index 8d41b70d..3d0fb50a 100644 --- a/aruco_pose/package.xml +++ b/aruco_pose/package.xml @@ -30,6 +30,7 @@ rostest image_publisher + ros_pytest diff --git a/aruco_pose/test/basic.py b/aruco_pose/test/basic.py index 7b32f75a..6d3f29af 100755 --- a/aruco_pose/test/basic.py +++ b/aruco_pose/test/basic.py @@ -1,9 +1,5 @@ -#!/usr/bin/env python -import sys -import unittest -import json import rospy -import rostest +import pytest from geometry_msgs.msg import PoseWithCovarianceStamped from sensor_msgs.msg import Image @@ -11,91 +7,88 @@ from aruco_pose.msg import MarkerArray from visualization_msgs.msg import MarkerArray as VisMarkerArray -class TestArucoPose(unittest.TestCase): - def setUp(self): - rospy.init_node('test_aruco_detect', anonymous=True) +@pytest.fixture +def node(): + return rospy.init_node('aruco_pose_test', anonymous=True) - def test_markers(self): - markers = rospy.wait_for_message('aruco_detect/markers', MarkerArray, timeout=5) - self.assertEqual(len(markers.markers), 4) - self.assertEqual(markers.header.frame_id, 'main_camera_optical') +def approx(expected): + return pytest.approx(expected, abs=1e-4) # compare floats more roughly - self.assertEqual(markers.markers[0].id, 2) - self.assertAlmostEqual(markers.markers[0].length, 0.33, places=4) - self.assertAlmostEqual(markers.markers[0].pose.position.x, 0.36706567854, places=4) - self.assertAlmostEqual(markers.markers[0].pose.position.y, 0.290484516644, places=4) - self.assertAlmostEqual(markers.markers[0].pose.position.z, 2.18787602301, places=4) - self.assertAlmostEqual(markers.markers[0].pose.orientation.x, 0.993997406299, places=4) - self.assertAlmostEqual(markers.markers[0].pose.orientation.y, -0.00532003481626, places=4) - self.assertAlmostEqual(markers.markers[0].pose.orientation.z, -0.107390951553, places=4) - self.assertAlmostEqual(markers.markers[0].pose.orientation.w, 0.0201999263402, places=4) - self.assertAlmostEqual(markers.markers[0].c1.x, 415.557739258, places=4) - self.assertAlmostEqual(markers.markers[0].c1.y, 335.557739258, places=4) - self.assertAlmostEqual(markers.markers[0].c2.x, 509.442260742, places=4) - self.assertAlmostEqual(markers.markers[0].c2.y, 335.557739258, places=4) - self.assertAlmostEqual(markers.markers[0].c3.x, 509.442260742, places=4) - self.assertAlmostEqual(markers.markers[0].c3.y, 429.442260742, places=4) - self.assertAlmostEqual(markers.markers[0].c4.x, 415.557739258, places=4) - self.assertAlmostEqual(markers.markers[0].c4.y, 429.442260742, places=4) +def test_markers(node): + markers = rospy.wait_for_message('aruco_detect/markers', MarkerArray, timeout=5) + assert len(markers.markers) == 4 + assert markers.header.frame_id == 'main_camera_optical' - self.assertEqual(markers.markers[3].id, 3) - self.assertAlmostEqual(markers.markers[3].length, 0.1, places=4) - self.assertAlmostEqual(markers.markers[3].pose.position.x, -0.1805169666, places=4) - self.assertAlmostEqual(markers.markers[3].pose.position.y, -0.200697302327, places=4) - self.assertAlmostEqual(markers.markers[3].pose.position.z, 0.585767514823, places=4) - self.assertAlmostEqual(markers.markers[3].pose.orientation.x, -0.961738074009, places=4) - self.assertAlmostEqual(markers.markers[3].pose.orientation.y, -0.0375180244707, places=4) - self.assertAlmostEqual(markers.markers[3].pose.orientation.z, -0.0115387773672, places=4) - self.assertAlmostEqual(markers.markers[3].pose.orientation.w, 0.271144115664, places=4) - self.assertAlmostEqual(markers.markers[3].c1.x, 129.557723999, places=4) - self.assertAlmostEqual(markers.markers[3].c1.y, 49.557723999, places=4) - self.assertAlmostEqual(markers.markers[3].c2.x, 223.442276001, places=4) - self.assertAlmostEqual(markers.markers[3].c2.y, 49.557723999, places=4) - self.assertAlmostEqual(markers.markers[3].c3.x, 223.442276001, places=4) - self.assertAlmostEqual(markers.markers[3].c3.y, 143.442276001, places=4) - self.assertAlmostEqual(markers.markers[3].c4.x, 129.557723999, places=4) - self.assertAlmostEqual(markers.markers[3].c4.y, 143.442276001, places=4) + assert markers.markers[0].id == 2 + assert markers.markers[0].length == approx(0.33) + assert markers.markers[0].pose.position.x == approx(0.36706567854) + assert markers.markers[0].pose.position.y == approx(0.290484516644) + assert markers.markers[0].pose.position.z == approx(2.18787602301) + assert markers.markers[0].pose.orientation.x == approx(0.993997406299) + assert markers.markers[0].pose.orientation.y == approx(-0.00532003481626) + assert markers.markers[0].pose.orientation.z == approx(-0.107390951553) + assert markers.markers[0].pose.orientation.w == approx(0.0201999263402) + assert markers.markers[0].c1.x == approx(415.557739258) + assert markers.markers[0].c1.y == approx(335.557739258) + assert markers.markers[0].c2.x == approx(509.442260742) + assert markers.markers[0].c2.y == approx(335.557739258) + assert markers.markers[0].c3.x == approx(509.442260742) + assert markers.markers[0].c3.y == approx(429.442260742) + assert markers.markers[0].c4.x == approx(415.557739258) + assert markers.markers[0].c4.y == approx(429.442260742) - self.assertEqual(markers.markers[1].id, 1) - self.assertAlmostEqual(markers.markers[1].length, 0.33, places=4) - self.assertEqual(markers.markers[2].id, 4) - self.assertAlmostEqual(markers.markers[2].length, 0.33, places=4) + assert markers.markers[3].id == 3 + assert markers.markers[3].length == approx(0.1) + assert markers.markers[3].pose.position.x == approx(-0.1805169666) + assert markers.markers[3].pose.position.y == approx(-0.200697302327) + assert markers.markers[3].pose.position.z == approx(0.585767514823) + assert markers.markers[3].pose.orientation.x == approx(-0.961738074009) + assert markers.markers[3].pose.orientation.y == approx(-0.0375180244707) + assert markers.markers[3].pose.orientation.z == approx(-0.0115387773672) + assert markers.markers[3].pose.orientation.w == approx(0.271144115664) + assert markers.markers[3].c1.x == approx(129.557723999) + assert markers.markers[3].c1.y == approx(49.557723999) + assert markers.markers[3].c2.x == approx(223.442276001) + assert markers.markers[3].c2.y == approx(49.557723999) + assert markers.markers[3].c3.x == approx(223.442276001) + assert markers.markers[3].c3.y == approx(143.442276001) + assert markers.markers[3].c4.x == approx(129.557723999) + assert markers.markers[3].c4.y == approx(143.442276001) - def test_visualization(self): - vis = rospy.wait_for_message('aruco_detect/visualization', VisMarkerArray, timeout=5) - self.assertEqual(len(vis.markers), 9) + assert markers.markers[1].id == 1 + assert markers.markers[1].length == approx(0.33) + assert markers.markers[2].id == 4 + assert markers.markers[2].length == approx(0.33) - def test_debug(self): - img = rospy.wait_for_message('aruco_detect/debug', Image, timeout=5) - self.assertEqual(img.width, 640) - self.assertEqual(img.height, 480) - self.assertEqual(img.header.frame_id, 'main_camera_optical') +def test_visualization(node): + vis = rospy.wait_for_message('aruco_detect/visualization', VisMarkerArray, timeout=5) + assert len(vis.markers) == 9 - def test_map(self): - pose = rospy.wait_for_message('aruco_map/pose', PoseWithCovarianceStamped, timeout=5) - self.assertEqual(pose.header.frame_id, 'main_camera_optical') - self.assertAlmostEqual(pose.pose.pose.position.x, -0.629167753342, places=4) - self.assertAlmostEqual(pose.pose.pose.position.y, 0.293822650809, places=4) - self.assertAlmostEqual(pose.pose.pose.position.z, 2.12641343155, places=4) - self.assertAlmostEqual(pose.pose.pose.orientation.x, -0.998383794799, places=4) - self.assertAlmostEqual(pose.pose.pose.orientation.y, -5.20919098575e-06, places=4) - self.assertAlmostEqual(pose.pose.pose.orientation.z, -0.0300861070302, places=4) - self.assertAlmostEqual(pose.pose.pose.orientation.w, 0.0482143590507, places=4) +def test_debug(node): + img = rospy.wait_for_message('aruco_detect/debug', Image, timeout=5) + assert img.width == 640 + assert img.height == 480 + assert img.header.frame_id == 'main_camera_optical' - def test_map_image(self): - img = rospy.wait_for_message('aruco_map/image', Image, timeout=5) - self.assertEqual(img.width, 2000) - self.assertEqual(img.height, 2000) - self.assertEqual(img.encoding, 'mono8') +def test_map(node): + pose = rospy.wait_for_message('aruco_map/pose', PoseWithCovarianceStamped, timeout=5) + assert pose.header.frame_id == 'main_camera_optical' + assert pose.pose.pose.position.x == approx(-0.629167753342) + assert pose.pose.pose.position.y == approx(0.293822650809) + assert pose.pose.pose.position.z == approx(2.12641343155) + assert pose.pose.pose.orientation.x == approx(-0.998383794799) + assert pose.pose.pose.orientation.y == approx(-5.20919098575e-06) + assert pose.pose.pose.orientation.z == approx(-0.0300861070302) + assert pose.pose.pose.orientation.w == approx(0.0482143590507) - def test_map_visualization(self): - vis = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) +def test_map_image(node): + img = rospy.wait_for_message('aruco_map/image', Image, timeout=5) + assert img.width == 2000 + assert img.height == 2000 + assert img.encoding == 'mono8' - def test_map_debug(self): - img = rospy.wait_for_message('aruco_map/debug', Image, timeout=5) +def test_map_visualization(node): + vis = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) - # def test_transforms(self): - # pass - - -rostest.rosrun('aruco_pose', 'test_aruco_detect', TestArucoPose, sys.argv) +def test_map_debug(node): + img = rospy.wait_for_message('aruco_map/debug', Image, timeout=5) diff --git a/aruco_pose/test/basic.test b/aruco_pose/test/basic.test index dd308358..46950d85 100644 --- a/aruco_pose/test/basic.test +++ b/aruco_pose/test/basic.test @@ -23,5 +23,6 @@ - + + diff --git a/aruco_pose/test/test_node_failure.py b/aruco_pose/test/test_node_failure.py index 5a669884..e0d8b2e9 100755 --- a/aruco_pose/test/test_node_failure.py +++ b/aruco_pose/test/test_node_failure.py @@ -1,27 +1,13 @@ -#!/usr/bin/env python -import sys -import unittest -import json import rospy -import rostest +import pytest -from geometry_msgs.msg import PoseWithCovarianceStamped -from sensor_msgs.msg import Image -from aruco_pose.msg import MarkerArray from visualization_msgs.msg import MarkerArray as VisMarkerArray -class TestArucoMapPass(unittest.TestCase): - def setUp(self): - rospy.init_node('test_parser_fail', anonymous=True) +@pytest.fixture +def node(): + return rospy.init_node('aruco_pose_test', anonymous=True) - def test_node_failure(self): - try: - markers = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) - did_post_message = True - except rospy.exceptions.ROSException: - did_post_message = False - self.assertFalse(did_post_message) - - -rostest.rosrun('aruco_pose', 'test_aruco_map', TestArucoMapPass, sys.argv) +def test_node_failure(node): + with pytest.raises(rospy.exceptions.ROSException): + rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) diff --git a/aruco_pose/test/test_node_failure.test b/aruco_pose/test/test_node_failure.test index e2e24af9..f616f039 100644 --- a/aruco_pose/test/test_node_failure.test +++ b/aruco_pose/test/test_node_failure.test @@ -9,5 +9,6 @@ - + + diff --git a/aruco_pose/test/test_parser_empty_map.py b/aruco_pose/test/test_parser_empty_map.py index ad562abd..6b8c9292 100755 --- a/aruco_pose/test/test_parser_empty_map.py +++ b/aruco_pose/test/test_parser_empty_map.py @@ -1,24 +1,13 @@ -#!/usr/bin/env python -import sys -import unittest -import json import rospy -import rostest +import pytest -from geometry_msgs.msg import PoseWithCovarianceStamped -from sensor_msgs.msg import Image -from aruco_pose.msg import MarkerArray from visualization_msgs.msg import MarkerArray as VisMarkerArray -class TestArucoMapPass(unittest.TestCase): - def setUp(self): - rospy.init_node('test_parser_fail', anonymous=True) +@pytest.fixture +def node(): + return rospy.init_node('aruco_pose_test_empty_map', anonymous=True) - - def test_node_failure(self): - markers = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) - self.assertEquals(len(markers.markers), 0) - - -rostest.rosrun('aruco_pose', 'test_aruco_map', TestArucoMapPass, sys.argv) +def test_empty_map(node): + markers = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) + assert len(markers.markers) == 0 diff --git a/aruco_pose/test/test_parser_empty_map.test b/aruco_pose/test/test_parser_empty_map.test index 17d17796..b67e1acd 100644 --- a/aruco_pose/test/test_parser_empty_map.test +++ b/aruco_pose/test/test_parser_empty_map.test @@ -9,5 +9,6 @@ - + + diff --git a/aruco_pose/test/test_parser_pass.py b/aruco_pose/test/test_parser_pass.py index 43d7667f..a504544a 100755 --- a/aruco_pose/test/test_parser_pass.py +++ b/aruco_pose/test/test_parser_pass.py @@ -1,75 +1,61 @@ -#!/usr/bin/env python -import sys -import unittest -import json import rospy -import rostest +import pytest -from geometry_msgs.msg import PoseWithCovarianceStamped from sensor_msgs.msg import Image from aruco_pose.msg import MarkerArray from visualization_msgs.msg import MarkerArray as VisMarkerArray -class TestArucoMapPass(unittest.TestCase): - def setUp(self): - rospy.init_node('test_parser_pass', anonymous=True) +@pytest.fixture +def node(): + return rospy.init_node('aruco_pose_test', anonymous=True) - def test_markers(self): - markers = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) - - self.assertEqual(len(markers.markers), 6) -# FIXME: visual marker id is not ArUco marker id -# self.assertEqual(markers.markers[0].id, 1) -# self.assertEqual(markers.markers[1].id, 2) -# self.assertEqual(markers.markers[2].id, 3) -# self.assertEqual(markers.markers[3].id, 4) +def approx(expected): + return pytest.approx(expected, abs=1e-4) # compare floats more roughly - self.assertAlmostEqual(markers.markers[0].pose.position.x, 0, places=7) - self.assertAlmostEqual(markers.markers[0].pose.position.y, 0, places=7) - self.assertAlmostEqual(markers.markers[0].pose.position.z, 0, places=7) - - self.assertAlmostEqual(markers.markers[1].pose.position.x, 1, places=7) - self.assertAlmostEqual(markers.markers[1].pose.position.y, 1, places=7) - self.assertAlmostEqual(markers.markers[1].pose.position.z, 1, places=7) - - self.assertAlmostEqual(markers.markers[2].pose.position.x, 1, places=7) - self.assertAlmostEqual(markers.markers[2].pose.position.y, 0, places=7) - self.assertAlmostEqual(markers.markers[2].pose.position.z, 0.5, places=7) - - self.assertAlmostEqual(markers.markers[3].pose.position.x, 0, places=7) - self.assertAlmostEqual(markers.markers[3].pose.position.y, 1, places=7) - self.assertAlmostEqual(markers.markers[3].pose.position.z, 0, places=7) - - self.assertAlmostEqual(markers.markers[4].pose.position.x, 1, places=7) - self.assertAlmostEqual(markers.markers[4].pose.position.y, 0.5, places=7) - self.assertAlmostEqual(markers.markers[4].pose.position.z, 0, places=7) - - self.assertAlmostEqual(markers.markers[5].pose.position.x, 2.2, places=7) - self.assertAlmostEqual(markers.markers[5].pose.position.y, 0.2, places=7) - self.assertAlmostEqual(markers.markers[5].pose.position.z, 0, places=7) +def test_markers(node): + markers = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5) + assert len(markers.markers) == 6 - self.assertAlmostEqual(markers.markers[0].scale.x, 0.33, places=7) - self.assertAlmostEqual(markers.markers[0].scale.y, 0.33, places=7) - self.assertAlmostEqual(markers.markers[1].scale.x, 0.225, places=7) - self.assertAlmostEqual(markers.markers[1].scale.y, 0.225, places=7) - self.assertAlmostEqual(markers.markers[2].scale.x, 0.45, places=7) - self.assertAlmostEqual(markers.markers[2].scale.y, 0.45, places=7) - self.assertAlmostEqual(markers.markers[3].scale.x, 0.15, places=7) - self.assertAlmostEqual(markers.markers[3].scale.y, 0.15, places=7) - self.assertAlmostEqual(markers.markers[4].scale.x, 0.25, places=7) - self.assertAlmostEqual(markers.markers[4].scale.y, 0.25, places=7) - self.assertAlmostEqual(markers.markers[5].scale.x, 0.35, places=7) - self.assertAlmostEqual(markers.markers[5].scale.y, 0.35, places=7) + assert markers.markers[0].pose.position.x == approx(0) + assert markers.markers[0].pose.position.y == approx(0) + assert markers.markers[0].pose.position.z == approx(0) - def test_map_image(self): - img = rospy.wait_for_message('aruco_map/image', Image, timeout=5) - self.assertEqual(img.width, 2000) - self.assertEqual(img.height, 2000) - self.assertEqual(img.encoding, 'mono8') + assert markers.markers[1].pose.position.x == approx(1) + assert markers.markers[1].pose.position.y == approx(1) + assert markers.markers[1].pose.position.z == approx(1) - # def test_transforms(self): - # pass + assert markers.markers[2].pose.position.x == approx(1) + assert markers.markers[2].pose.position.y == approx(0) + assert markers.markers[2].pose.position.z == approx(0.5) + assert markers.markers[3].pose.position.x == approx(0) + assert markers.markers[3].pose.position.y == approx(1) + assert markers.markers[3].pose.position.z == approx(0) -rostest.rosrun('aruco_pose', 'test_aruco_map', TestArucoMapPass, sys.argv) + assert markers.markers[4].pose.position.x == approx(1) + assert markers.markers[4].pose.position.y == approx(0.5) + assert markers.markers[4].pose.position.z == approx(0) + + assert markers.markers[5].pose.position.x == approx(2.2) + assert markers.markers[5].pose.position.y == approx(0.2) + assert markers.markers[5].pose.position.z == approx(0) + + assert markers.markers[0].scale.x == approx(0.33) + assert markers.markers[0].scale.y == approx(0.33) + assert markers.markers[1].scale.x == approx(0.225) + assert markers.markers[1].scale.y == approx(0.225) + assert markers.markers[2].scale.x == approx(0.45) + assert markers.markers[2].scale.y == approx(0.45) + assert markers.markers[3].scale.x == approx(0.15) + assert markers.markers[3].scale.y == approx(0.15) + assert markers.markers[4].scale.x == approx(0.25) + assert markers.markers[4].scale.y == approx(0.25) + assert markers.markers[5].scale.x == approx(0.35) + assert markers.markers[5].scale.y == approx(0.35) + +def test_map_image(node): + img = rospy.wait_for_message('aruco_map/image', Image, timeout=5) + assert img.width == 2000 + assert img.height == 2000 + assert img.encoding == 'mono8' diff --git a/aruco_pose/test/test_parser_pass.test b/aruco_pose/test/test_parser_pass.test index a92cdde6..8d54d326 100644 --- a/aruco_pose/test/test_parser_pass.test +++ b/aruco_pose/test/test_parser_pass.test @@ -9,5 +9,6 @@ - + + diff --git a/builder/assets/kinetic-rosdep-clever.yaml b/builder/assets/kinetic-rosdep-clever.yaml index cff3f7e9..3bcbc817 100644 --- a/builder/assets/kinetic-rosdep-clever.yaml +++ b/builder/assets/kinetic-rosdep-clever.yaml @@ -550,3 +550,6 @@ ddynamic_reconfigure: realsense2_camera: debian: stretch: [ros-kinetic-realsense2-camera] +ros_pytest: + debian: + stretch: [ros-kinetic-ros-pytest]