예제 #1
0
 def test_get_symbol_map(self, keys_values):
     keys, values = keys_values
     gm = GodMap()
     for key, value in zip(keys, values):
         gm.set_data([key], value)
         gm.to_symbol([key])
     self.assertEqual(len(gm.get_values(keys)), len(keys))
예제 #2
0
 def test_list_double_index(self):
     key = 'asdf'
     value = np.array([[0, 1], [2, 3]])
     db = GodMap()
     db.set_data([key], value)
     for i in range(value.shape[0]):
         for j in range(value.shape[1]):
             self.assertEqual(db.get_data([key, i, j]), value[i, j])
예제 #3
0
 def test_dict2(self, key, key_values):
     d = {}
     db = GodMap()
     db.set_data([key], d)
     for k, v in zip(*key_values):
         db.set_data([key, k], v)
     for k, v in zip(*key_values):
         self.assertEqual(db.get_data([key, k]), v)
예제 #4
0
    def test_class3(self, class_names):
        db = GodMap()
        for i, name in enumerate(class_names):
            c = type(str(name), (object,), {})()
            db.set_data(class_names[:i + 1], c)

        for i, name in enumerate(class_names):
            c = db.get_data(class_names[:i + 1])
            self.assertEqual(type(c).__name__, name)
예제 #5
0
    def test_list_overwrite_entry(self, key, lists):
        first_values, second_values = lists
        db = GodMap()
        db.set_data([key], first_values)
        for i, v in enumerate(first_values):
            self.assertEqual(db.get_data([key, i]), v)
            db.set_data([key, i], second_values[i])

        for i, v in enumerate(second_values):
            self.assertEqual(db.get_data([key, i]), v)
예제 #6
0
    def test_clear_cache(self):
        db = GodMap()

        d = {'b': 'c'}
        db.set_data(['a'], d)
        self.assertEqual('c', db.get_data(['a', 'b']))
        db.clear_cache()
        class C(object):
            b = 'c'
        db.set_data(['a'], C())
        self.assertEqual('c', db.get_data(['a', 'b']))
예제 #7
0
    def test_function_no_param(self, key1, key2, key3):
        db = GodMap()

        class MUH(object):
            def __call__(self):
                return [key3]

        a = MUH()
        d = {key2: a}
        db.set_data([key1], d)
        self.assertEqual(key3, db.get_data([key1, key2, tuple(), 0]))
예제 #8
0
    def test_function2(self, key, dict_key, return_value):
        db = GodMap()

        class MUH(object):
            def __call__(self, god_map):
                return return_value

        a = MUH()
        d = {dict_key: a}
        db.set_data([key], d)
        self.assertEqual(db.get_data([key, dict_key]), return_value)
예제 #9
0
    def test_function_2param_call(self, key1, key2, key3, key4):
        db = GodMap()

        class MUH(object):
            def __call__(self, next_member, next_next_member):
                return next_next_member

        a = MUH()
        d = {key2: a}
        db.set_data([key1], d)
        self.assertEqual(db.get_data([key1, key2, (key3, key4)]), key4)
예제 #10
0
 def test_god_map_with_world(self):
     gm = GodMap()
     w = World()
     r = WorldObject(pr2_urdf())
     w.add_robot(robot=r,
                 base_pose=PoseStamped(),
                 controlled_joints=[],
                 ignored_pairs=set(),
                 added_pairs=set())
     gm.set_data([u'world'], w)
     gm_robot = gm.get_data(identifier.robot)
     assert 'pr2' == gm_robot.get_name()
예제 #11
0
    def test_function4(self, key1, key2, key3, key4, key5):
        db = GodMap()

        class MUH(object):
            def __call__(self, next_member, next_next_member):
                return [key5]

        a = MUH()
        d = {key2: a}
        db.set_data([key1], d)
        self.assertEqual(key5, db.get_data([key1, key2, (key3, key4), 0]))
        self.assertEqual(key5, db.get_data([key1, key2, (key3, key4), 0]))
        self.assertEqual(key5, db.get_data([key1, key2, (key3, key4), 0]))
예제 #12
0
    def test_class1(self, key, class_name, key_values):
        c = type(str(class_name), (object,), {})()
        for k, v in zip(*key_values):
            setattr(c, k, None)

        db = GodMap()
        db.set_data([key], c)

        for k, v in zip(*key_values):
            self.assertEqual(db.get_data([key, k]), None)
        for k, v in zip(*key_values):
            db.set_data([key, k], v)
        for k, v in zip(*key_values):
            self.assertEqual(db.get_data([key, k]), v)
예제 #13
0
    def test_function3(self, key1, key2, key3, key4, key5):
        db = GodMap()

        class MUH(object):
            def __call__(self, next_member):
                return [key5]

        a = MUH()
        d = {key2: a}
        db.set_data([key1], d)
        try:
            db.get_data([key1, key2, (key3, key4), 0])
            assert False
        except TypeError:
            assert True
예제 #14
0
 def test_to_symbol(self, key, value):
     gm = GodMap()
     gm.set_data([key], value)
     self.assertTrue(isinstance(gm.to_symbol([key]), sw.Symbol))
     self.assertTrue(key in str(gm.to_symbol([key])))
예제 #15
0
class Node(object):
    def __init__(self, urdf_path, base_link, eef_link, wrist_link, wps, projection_frame):
        self.vis = ROSVisualizer('force_test', base_frame=base_link, plot_topic='plot')
        self.wps = [Frame(Vector3(*wp[3:]), Quaternion(*list(quaternion_from_rpy(*wp[:3])))) for wp in wps]
        self.wpsIdx = 0
        self.base_link = base_link
        self.god_map = GodMap()

        self.js_prefix = 'joint_state'

        self.traj_pub = rospy.Publisher('~joint_trajectory', JointTrajectoryMsg, queue_size=1, tcp_nodelay=True)
        self.wrench_pub = rospy.Publisher('~wrist_force_transformed', WrenchMsg, queue_size=1, tcp_nodelay=True)

        # Giskard ----------------------------
        # Init controller, setup controlled joints
        self.controller = Controller(res_pkg_path(urdf_path), res_pkg_path('package://pbsbtest/.controllers/'), 0.6)
        self.robot = self.controller.robot

        self.js_input = JointStatesInput.prefix_constructor(self.god_map.get_expr, self.robot.get_joint_names(), self.js_prefix, 'position')

        self.robot.set_joint_symbol_map(self.js_input)
        self.controller.set_controlled_joints(self.robot.get_joint_names())

        # Get eef and sensor frame
        self.sensor_frame = self.robot.get_fk_expression(base_link, wrist_link)
        self.eef_frame    = self.robot.get_fk_expression(base_link, eef_link)
        self.eef_pos      = pos_of(self.eef_frame)

        # Construct motion frame
        mplate_pos = pos_of(self.robot.get_fk_expression(base_link, 'arm_mounting_plate'))
        self.motion_frame = frame3_rpy(pi, 0, pi * 0.5, mplate_pos)

        wp_frame = self.motion_frame * FrameInput.prefix_constructor('goal/position', 'goal/quaternion', self.god_map.get_expr).get_frame()
        wp_pos = pos_of(wp_frame)


        # Projection frame
        self.world_to_projection_frame = projection_frame

        # Pre init
        self.god_map.set_data(['goal'], self.wps[0])
        self.tick_rate = 50
        deltaT = 1.0 / self.tick_rate
        js = {j: SingleJointState(j) for j in self.robot.get_joint_names()}
        js['gripper_base_gripper_left_joint'] = SingleJointState('gripper_base_gripper_left_joint')

        self.god_map.set_data([self.js_prefix], js)

        err = norm(wp_pos - self.eef_pos)
        rot_err = dot(wp_frame * unitZ, self.eef_frame * unitZ)

        scons = position_conv(wp_pos, self.eef_pos) # {'align position': SoftConstraint(-err, -err, 1, err)}
        scons.update(rotation_conv(rot_of(wp_frame), rot_of(self.eef_frame), rot_of(self.eef_frame).subs(self.god_map.get_expr_values())))
        self.controller.init(scons, self.god_map.get_free_symbols())


        print('Solving for initial state...')
        # Go to initial configuration
        js = run_controller_until(self.god_map, self.controller, js, self.js_prefix, [(err, 0.01), (1 - rot_err, 0.001)], deltaT)[0]

        print('About to plan trajectory...')

        # Generate trajectory
        trajectory = OrderedDict()
        traj_stamp = rospy.Duration(0.0)
        section_stamps = []
        for x in range(1, len(self.wps)):
            print('Heading for point {}'.format(x))
            self.god_map.set_data(['goal'], self.wps[x])
            js, sub_traj = run_controller_until(self.god_map, self.controller, js, self.js_prefix, [(err, 0.01)], deltaT)
            for time_code, position in sub_traj.items():
                trajectory[traj_stamp + time_code] = position
            traj_stamp += sub_traj.keys()[-1]


        print('Trajectory planned! {} points over a duration of {} seconds.'.format(len(trajectory), len(trajectory) * deltaT))


        traj_msg = JointTrajectoryMsg()
        traj_msg.header.stamp = rospy.Time.now()
        traj_msg.joint_names  = trajectory.items()[0][1].keys()
        for t, v in trajectory.items():
            point = JointTrajectoryPointMsg()
            point.positions = [v[j].position for j in traj_msg.joint_names]
            point.time_from_start = t
            traj_msg.points.append(point)

        js_advertised = False
        print('Waiting for joint state topic to be published.')
        while not js_advertised and not rospy.is_shutdown():
            topics = [t for t, tt in rospy.get_published_topics()]
            if '/joint_states' in topics:
                js_advertised = True

        if not js_advertised:
            print('Robot does not seem to be started. Aborting...')
            return

        print('Joint state has been advertised. Waiting 2 seconds for the controller...')
        rospy.sleep(2.0)

        print('Sending trajectory.')
        self.traj_pub.publish(traj_msg)
        self.tfListener = tf.TransformListener()
        self.wrench_sub = rospy.Subscriber('~wrist_wrench', WrenchMsg, callback=self.transform_wrench, queue_size=1)


    def transform_wrench(self, wrench_msg):
        try:
            self.tfListener.waitForTransform(self.base_link, wrench_msg.header.frame_id, rospy.Time(0), rospy.Duration(0.1))
            (trans,rot) = self.tfListener.lookupTransform(self.base_link, wrench_msg.header.frame_id, rospy.Time(0))
        except:
            print('Failed to transform wrench from {} to {}'.format(wrench_msg.header.frame_id, self.base_link))
            return

        f = wrench_msg.wrench.force

        f = self.world_to_projection_frame * frame3_quaternion(trans[0], trans[1], trans[2], rot[0], rot[1], rot[2], rot[3]) * vector3(f.x, f.y, f.z)
        #t = self.projection_frame.subs(cvals) * vec3(*state.m)

        sensor_msg = WrenchMsg()
        sensor_msg.header.stamp = wrench_msg.header.stamp
        sensor_msg.header.frame_id = self.base_link
        sensor_msg.wrench.force.x  = f[0]
        sensor_msg.wrench.force.y  = f[1]
        sensor_msg.wrench.force.z  = f[2]
        # sensor_msg.wrench.torque.x = t[0]
        # sensor_msg.wrench.torque.y = t[1]
        # sensor_msg.wrench.torque.z = t[2]
        self.wrench_pub.publish(sensor_msg)
예제 #16
0
 def test_namedtuple(self, key, tuple_name, key_values):
     Frame = namedtuple(tuple_name, key_values[0])
     db = GodMap()
     db.set_data([key], Frame(*key_values[1]))
     for k, v in zip(*key_values):
         self.assertEqual(db.get_data([key, k]), v)
예제 #17
0
 def test_namedtuple1(self):
     Frame = namedtuple(u'Frame', [u'pos'])
     db = GodMap()
     db.set_data([u'f12'], Frame(pos=2))
     with self.assertRaises(AttributeError):
         db.set_data([u'f12', u'pos'], 42)
예제 #18
0
 def test_set_get_integer2(self, key, number):
     db = GodMap()
     db.set_data([key], number)
     self.assertEqual(db.get_data([key]), number, msg=u'key={}, number={}'.format(key, number))
     self.assertEqual(db.get_data([key]), number, msg=u'key={}, number={}'.format(key, number))
예제 #19
0
    def test_set_get_float(self, key, number):
        db = GodMap()
        db.set_data([key], number)
        db.set_data([key], number)

        self.assertEqual(db.get_data([key]), number)
예제 #20
0
 def test_dict3(self, key, tuple_key, value):
     tuple_key = tuple(tuple_key)
     d = {tuple_key: value}
     db = GodMap()
     db.set_data([key], d)
     self.assertEqual(db.get_data([key, tuple_key]), value)
예제 #21
0
def initialize_god_map():
    god_map = GodMap()
    blackboard = Blackboard
    blackboard.god_map = god_map

    load_config_file()

    god_map.set_data(identifier.rosparam, rospy.get_param(rospy.get_name()))
    god_map.set_data(identifier.robot_description, rospy.get_param(u'robot_description'))
    path_to_data_folder = god_map.get_data(identifier.data_folder)
    # fix path to data folder
    if not path_to_data_folder.endswith(u'/'):
        path_to_data_folder += u'/'
    god_map.set_data(identifier.data_folder, path_to_data_folder)

    # fix nWSR
    nWSR = god_map.get_data(identifier.nWSR)
    if nWSR == u'None':
        nWSR = None
    god_map.set_data(identifier.nWSR, nWSR)

    pbw.start_pybullet(god_map.get_data(identifier.gui))
    while not rospy.is_shutdown():
        try:
            controlled_joints = rospy.wait_for_message(u'/whole_body_controller/state',
                                                       JointTrajectoryControllerState,
                                                       timeout=5.0).joint_names
        except ROSException as e:
            logging.logerr(u'state topic not available')
            logging.logerr(str(e))
        else:
            break
        rospy.sleep(0.5)

    joint_weight_symbols = process_joint_specific_params(identifier.joint_weight,
                                                         identifier.joint_weight_default,
                                                         identifier.joint_weight_override,
                                                         god_map)

    process_joint_specific_params(identifier.self_collision_avoidance_distance,
                                  identifier.self_collision_avoidance_default_threshold,
                                  identifier.self_collision_avoidance_default_override,
                                  god_map)

    process_joint_specific_params(identifier.external_collision_avoidance_distance,
                                  identifier.external_collision_avoidance_default_threshold,
                                  identifier.external_collision_avoidance_default_override,
                                  god_map)

    # TODO add checks to test if joints listed as linear are actually linear
    joint_velocity_linear_limit_symbols = process_joint_specific_params(identifier.joint_velocity_linear_limit,
                                                                        identifier.joint_velocity_linear_limit_default,
                                                                        identifier.joint_velocity_linear_limit_override,
                                                                        god_map)
    joint_velocity_angular_limit_symbols = process_joint_specific_params(identifier.joint_velocity_angular_limit,
                                                                         identifier.joint_velocity_angular_limit_default,
                                                                         identifier.joint_velocity_angular_limit_override,
                                                                         god_map)

    joint_acceleration_linear_limit_symbols = process_joint_specific_params(identifier.joint_acceleration_linear_limit,
                                                                            identifier.joint_acceleration_linear_limit_default,
                                                                            identifier.joint_acceleration_linear_limit_override,
                                                                            god_map)
    joint_acceleration_angular_limit_symbols = process_joint_specific_params(
        identifier.joint_acceleration_angular_limit,
        identifier.joint_acceleration_angular_limit_default,
        identifier.joint_acceleration_angular_limit_override,
        god_map)

    world = PyBulletWorld(False, blackboard.god_map.get_data(identifier.data_folder))
    god_map.set_data(identifier.world, world)
    robot = WorldObject(god_map.get_data(identifier.robot_description),
                        None,
                        controlled_joints)
    world.add_robot(robot, None, controlled_joints,
                    ignored_pairs=god_map.get_data(identifier.ignored_self_collisions),
                    added_pairs=god_map.get_data(identifier.added_self_collisions))

    joint_position_symbols = JointStatesInput(blackboard.god_map.to_symbol, world.robot.get_movable_joints(),
                                              identifier.joint_states,
                                              suffix=[u'position'])
    joint_vel_symbols = JointStatesInput(blackboard.god_map.to_symbol, world.robot.get_movable_joints(),
                                         identifier.joint_states,
                                         suffix=[u'velocity'])
    world.robot.update_joint_symbols(joint_position_symbols.joint_map, joint_vel_symbols.joint_map,
                                     joint_weight_symbols,
                                     joint_velocity_linear_limit_symbols, joint_velocity_angular_limit_symbols,
                                     joint_acceleration_linear_limit_symbols, joint_acceleration_angular_limit_symbols)
    world.robot.init_self_collision_matrix()
    return god_map
예제 #22
0
 def test_tuple1(self, key, value):
     value = tuple(value)
     db = GodMap()
     db.set_data([key], value)
     for i, v in enumerate(value):
         self.assertEqual(db.get_data([key, i]), v)
예제 #23
0
 def test_to_symbol(self, key, value):
     gm = GodMap()
     gm.set_data([key], value)
     self.assertTrue(w.is_symbol(gm.to_symbol([key])))
     self.assertTrue(key in str(gm.to_symbol([key])))
예제 #24
0
 def test_list_index_error(self, key, l):
     db = GodMap()
     db.set_data([key], l)
     with self.assertRaises(IndexError):
         db.set_data([key, len(l) + 1], 0)
예제 #25
0
 def test_god_map_key_error(self, key, wrong_key, number, default_value):
     assume(key != wrong_key)
     db = GodMap(default_value)
     db.set_data([key], number)
     self.assertEqual(db.get_data([wrong_key]), default_value, msg=u'key={}, number={}'.format(key, number))
예제 #26
0
 def test_list_negative_index(self, key, l):
     db = GodMap()
     db.set_data([key], l)
     for i in range(len(l)):
         self.assertEqual(db.get_data([key, -i]), l[-i])
예제 #27
0
 def test_function1(self, key, value):
     # TODO not clean that i try to call every function
     db = GodMap()
     f = lambda gm: value
     db.set_data([key], f)
     self.assertEqual(db.get_data([key]), value)
예제 #28
0
 def test_function_1param_lambda(self, key, key2):
     db = GodMap()
     f = lambda x: x
     db.set_data([key], f)
     self.assertEqual(db.get_data([key, (key2,)]), key2)