diff --git a/python/example_robot_data/__init__.py b/python/example_robot_data/__init__.py index b33e19fbdbe82bee4be43876c1dfef3e85c43573..af07e57346d2b68c22f51541e8fbcf20213b108b 100644 --- a/python/example_robot_data/__init__.py +++ b/python/example_robot_data/__init__.py @@ -1,4 +1,4 @@ # flake8: noqa -from .robots_loader import (getModelPath, loadANYmal, loadDoublePendulum, loadHector, loadHyQ, loadICub, loadIris, - loadKinova, loadPanda, loadRomeo, loadSolo, loadTalos, loadTalosArm, loadTalosLegs, - loadTiago, loadTiagoNoHand, loadUR, readParamsFromSrdf) +from .robots_loader import (ROBOTS, getModelPath, load, loadANYmal, loadDoublePendulum, loadHector, loadHyQ, loadICub, + loadIris, loadKinova, loadPanda, loadRomeo, loadSolo, loadTalos, loadTalosArm, + loadTalosLegs, loadTiago, loadTiagoNoHand, loadUR, readParamsFromSrdf) diff --git a/python/example_robot_data/__main__.py b/python/example_robot_data/__main__.py index ec45e7513e123f51c48d7190c0bba6ead91a7194..f3f87796087cc21701de636819c02f28e682c8f5 100644 --- a/python/example_robot_data/__main__.py +++ b/python/example_robot_data/__main__.py @@ -1,107 +1,13 @@ from argparse import ArgumentParser -import eigenpy +from .robots_loader import ROBOTS, load -from . import robots_loader +ROBOTS = sorted(ROBOTS.keys()) -eigenpy.switchToNumpyMatrix() - -ROBOTS = [ - 'anymal', 'anymal_kinova', 'hyq', 'solo', 'solo12', 'talos', 'talos_arm', 'talos_legs', 'kinova', 'tiago', - 'tiago_no_hand', 'icub', 'ur5', 'romeo', 'hector', 'double_pendulum', 'iris', 'panda' -] - -parser = ArgumentParser() +parser = ArgumentParser(description=load.__doc__) parser.add_argument('robot', nargs='?', default=ROBOTS[0], choices=ROBOTS) +parser.add_argument('--no-display', action='store_false') args = parser.parse_args() -if args.robot == 'anymal': - anymal = robots_loader.loadANYmal() - anymal.initViewer(loadModel=True) - anymal.display(anymal.q0) - -elif args.robot == 'anymal_kinova': - anymal = robots_loader.loadANYmal(withArm='kinova') - anymal.initViewer(loadModel=True) - anymal.display(anymal.q0) - -elif args.robot == 'hyq': - hyq = robots_loader.loadHyQ() - hyq.initViewer(loadModel=True) - hyq.display(hyq.q0) - -elif args.robot == 'solo': - solo = robots_loader.loadSolo() - solo.initViewer(loadModel=True) - solo.display(solo.q0) - -elif args.robot == 'solo12': - solo = robots_loader.loadSolo(False) - solo.initViewer(loadModel=True) - solo.display(solo.q0) - -elif args.robot == 'talos': - talos = robots_loader.loadTalos() - talos.initViewer(loadModel=True) - talos.display(talos.q0) - -elif args.robot == 'talos_arm': - talos_arm = robots_loader.loadTalosArm() - talos_arm.initViewer(loadModel=True) - talos_arm.display(talos_arm.q0) - -elif args.robot == 'talos_legs': - talos_legs = robots_loader.loadTalosLegs() - talos_legs.initViewer(loadModel=True) - talos_legs.display(talos_legs.q0) - -elif args.robot == 'kinova': - kinova = robots_loader.loadKinova() - kinova.initViewer(loadModel=True) - kinova.display(kinova.q0) - -elif args.robot == 'tiago': - tiago = robots_loader.loadTiago() - tiago.initViewer(loadModel=True) - tiago.display(tiago.q0) - -elif args.robot == 'tiago_no_hand': - tiago_no_hand = robots_loader.loadTiagoNoHand() - tiago_no_hand.initViewer(loadModel=True) - tiago_no_hand.display(tiago_no_hand.q0) - -elif args.robot == 'icub': - icub = robots_loader.loadICub() - icub.initViewer(loadModel=True) - icub.display(icub.q0) - -elif args.robot == 'ur5': - ur5 = robots_loader.loadUR() - ur5.initViewer(loadModel=True) - ur5.display(ur5.q0) - -elif args.robot == 'romeo': - romeo = robots_loader.loadRomeo() - romeo.initViewer(loadModel=True) - romeo.display(romeo.q0) - -if args.robot == 'hector': - hector = robots_loader.loadHector() - hector.initViewer(loadModel=True) - hector.display(hector.q0) - -if args.robot == 'double_pendulum': - pendulum = robots_loader.loadDoublePendulum() - pendulum.initViewer(loadModel=True) - pendulum.display(pendulum.q0) - -if args.robot == 'iris': - iris = robots_loader.loadIris() - iris.initViewer(loadModel=True) - iris.display(iris.q0) - -if args.robot == 'panda': - panda = robots_loader.loadPanda() - panda.initViewer(loadModel=True) - panda.display(panda.q0) +load(args.robot, display=not args.no_display) diff --git a/python/example_robot_data/robots_loader.py b/python/example_robot_data/robots_loader.py index 630fa9c0c62a9b7e4dda20bc05671c2060827cce..1df545ac25cb42c0854b75427267e11b48e257b7 100644 --- a/python/example_robot_data/robots_loader.py +++ b/python/example_robot_data/robots_loader.py @@ -227,3 +227,56 @@ def loadRomeo(): def loadIris(): return robot_loader('iris_description', "iris_simple.urdf", free_flyer=True) + + +ROBOTS = { + 'anymal': (loadANYmal, {}), + 'anymal_kinova': (loadANYmal, { + 'withArm': 'kinova' + }), + 'double_pendulum': (loadDoublePendulum, {}), + 'hector': (loadHector, {}), + 'hyq': (loadHyQ, {}), + 'icub': (loadICub, { + 'reduced': False + }), + 'icub_reduced': (loadICub, { + 'reduced': True + }), + 'iris': (loadIris, {}), + 'kinova': (loadKinova, {}), + 'panda': (loadPanda, {}), + 'romeo': (loadRomeo, {}), + 'solo': (loadSolo, {}), + 'solo12': (loadSolo, { + 'solo': False + }), + 'talos': (loadTalos, {}), + 'talos_arm': (loadTalos, { + 'arm': True + }), + 'talos_legs': (loadTalos, { + 'legs': True + }), + 'tiago': (loadTiago, {}), + 'tiago_no_hand': (loadTiago, { + 'hand': False + }), + 'ur5': (loadUR, {}), + 'ur5_gripper': (loadUR, { + 'gripper': True + }), + 'ur5_limited': (loadUR, { + 'limited': True + }), +} + + +def load(name, display=False): + """Load a robot by its name, and optionnaly display it in a viewer.""" + loader, kwargs = ROBOTS[name] + robot = loader(**kwargs) + if display: + robot.initViewer(loadModel=True) + robot.display(robot.q0) + return robot diff --git a/unittest/test_load.py b/unittest/test_load.py index 0b3c96eb1be70ca77490c1a988f344df2c2fe57c..75acaf6ca5624749b96371e8d7981a7394946cbe 100755 --- a/unittest/test_load.py +++ b/unittest/test_load.py @@ -1,148 +1,81 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python -import sys import unittest -import example_robot_data +from example_robot_data import load class RobotTestCase(unittest.TestCase): - ROBOT = None - NQ = None - NV = None + def check(self, name, expected_nq, expected_nv): + """Helper function for the real tests""" + robot = load(name, display=False) + self.assertEqual(robot.model.nq, expected_nq) + self.assertEqual(robot.model.nv, expected_nv) + self.assertTrue(hasattr(robot, "q0")) - def test_nq(self): - model = self.ROBOT.model - self.assertEqual(model.nq, self.NQ, "Wrong nq value.") + def test_anymal(self): + self.check('anymal', 19, 18) - def test_nv(self): - model = self.ROBOT.model - self.assertEqual(model.nv, self.NV, "Wrong nv value.") + def test_anymal_kinova(self): + self.check('anymal_kinova', 25, 24) - def test_q0(self): - self.assertTrue(hasattr(self.ROBOT, "q0"), "It doesn't have q0") + def test_double_pendulum(self): + self.check('double_pendulum', 2, 2) + # def test_hector(self): + # self.check('hector', 0, 0) -class ANYmalTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadANYmal() - RobotTestCase.NQ = 19 - RobotTestCase.NV = 18 + def test_hyq(self): + self.check('hyq', 19, 18) + def test_icub(self): + self.check('icub', 39, 38) -class ANYmalKinovaTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadANYmal(withArm="kinova") - RobotTestCase.NQ = 27 - RobotTestCase.NV = 24 + def test_icub_reduced(self): + self.check('icub_reduced', 36, 35) + def test_iris(self): + self.check('iris', 7, 6) -class HyQTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadHyQ() - RobotTestCase.NQ = 19 - RobotTestCase.NV = 18 + def test_kinova(self): + self.check('kinova', 9, 6) + def test_panda(self): + self.check('panda', 9, 9) -class TalosTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTalos() - RobotTestCase.NQ = 39 - RobotTestCase.NV = 38 + def test_romeo(self): + self.check('romeo', 62, 61) + def test_solo(self): + self.check('solo', 15, 14) -class TalosArmTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTalos(arm=True) - RobotTestCase.NQ = 7 - RobotTestCase.NV = 7 + def test_solo12(self): + self.check('solo12', 19, 18) + def test_talos(self): + self.check('talos', 39, 38) -class TalosArmFloatingTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTalos(arm=True) - RobotTestCase.NQ = 14 - RobotTestCase.NV = 13 + def test_talos_arm(self): + self.check('talos_arm', 7, 7) + def test_talos_legs(self): + self.check('talos_legs', 19, 18) -class TalosLegsTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTalos(legs=True) - RobotTestCase.NQ = 19 - RobotTestCase.NV = 18 + def test_tiago(self): + self.check('tiago', 50, 48) + def test_tiago_no_hand(self): + self.check('tiago_no_hand', 14, 12) -class ICubTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadICub(reduced=False) - RobotTestCase.NQ = 39 - RobotTestCase.NV = 38 + def test_ur5(self): + self.check('ur5', 6, 6) + def test_ur5_gripper(self): + self.check('ur5_gripper', 6, 6) -class SoloTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadSolo() - RobotTestCase.NQ = 15 - RobotTestCase.NV = 14 - - -class Solo12Test(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadSolo(False) - RobotTestCase.NQ = 19 - RobotTestCase.NV = 18 - - -class TiagoTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTiago() - RobotTestCase.NQ = 50 - RobotTestCase.NV = 48 - - -class TiagoNoHandTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadTiago(hand=False) - RobotTestCase.NQ = 14 - RobotTestCase.NV = 12 - - -class UR5Test(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadUR() - RobotTestCase.NQ = 6 - RobotTestCase.NV = 6 - - -class UR5LimitedTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadUR(limited=True) - RobotTestCase.NQ = 6 - RobotTestCase.NV = 6 - - -class UR5GripperTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadUR(gripper=True) - RobotTestCase.NQ = 6 - RobotTestCase.NV = 6 - - -class KinovaTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadKinova() - RobotTestCase.NQ = 9 - RobotTestCase.NV = 6 - - -class RomeoTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadRomeo() - RobotTestCase.NQ = 62 - RobotTestCase.NV = 61 - - -class PandaTest(RobotTestCase): - RobotTestCase.ROBOT = example_robot_data.loadPanda() - RobotTestCase.NQ = 9 - RobotTestCase.NV = 9 + def test_ur5_limited(self): + self.check('ur5_limited', 6, 6) if __name__ == '__main__': - test_classes_to_run = [ - ANYmalTest, ANYmalKinovaTest, HyQTest, TalosTest, TalosArmTest, TalosArmFloatingTest, TalosLegsTest, ICubTest, - SoloTest, Solo12Test, TiagoTest, TiagoNoHandTest, UR5Test, UR5LimitedTest, UR5GripperTest, KinovaTest, - RomeoTest, PandaTest - ] - loader = unittest.TestLoader() - suites_list = [] - for test_class in test_classes_to_run: - suite = loader.loadTestsFromTestCase(test_class) - suites_list.append(suite) - big_suite = unittest.TestSuite(suites_list) - runner = unittest.TextTestRunner() - results = runner.run(big_suite) - sys.exit(not results.wasSuccessful()) + unittest.main()