Beispiel #1
0
    def __init__(self):
        # Adjustable Parameters
        self.path_directory = rospy.get_param("~path_directory")
        self.mission_sound = rospy.get_param("~mission_sound")
        self.default_sound = rospy.get_param("~default_sound")
        self.battery_threshold = int(rospy.get_param("~battery_threshold",
                                                     50))  #[%]

        # Define Paths' File Name
        self.path_dict = [
            "HOME_A", "HOME_B", "HOME_1", "HOME_2", "HOME_3", "HOME_4",
            "HOME_5", "A_1", "A_2", "A_3", "A_4", "A_5", "B_1", "B_2", "B_3",
            "B_4", "B_5", "1_A", "2_A", "3_A", "4_A", "5_A", "1_B", "2_B",
            "3_B", "4_B", "5_B", "A_HOME", "B_HOME", "1_HOME", "2_HOME",
            "3_HOME", "4_HOME", "5_HOME", "HOME_CHARGE", "CHARGE_HOME",
            "rotate_HOME"
        ]

        # Define Actions Type
        self.action_dict = {0: "None", 1: "Table_Picking", 2: "Table_Dropping"}

        # Internal USE Variables - Modify with consultation
        self.rate = rospy.Rate(5)  # 5 [hz] <--> 0.2 [sec]
        self.tf2Buffer = tf2_ros.Buffer()
        self.tf2Listener = tf2_ros.TransformListener(self.tf2Buffer)
        # - Charging
        self.battery_level = 100
        self.battery_safe = True
        self.battery_full = False
        self.go_charge = False
        self.start_charge = False
        self.go_home = False
        # - Point to Point
        self.route_list = []
        self.route_seq = 0
        self.action_list = []
        self.action_seq = 0
        self.waypoint_list = []
        self.waypoint_seq = 0
        # - Status for Web
        self.delivery_status = ""
        self.action_status = True
        self.last_msg = None
        self.route_once = True
        self.XYZ = Point32()
        self.location = "HOME"
        self.speed = 0
        self.delivery_id = "0"
        self.delivery_mission = ""
        self.mission_activity = "NO ACTION"
        # - Others
        self.fsm_state = "STANDBY"
        self.restore = False

        # Publisher
        self.all_pub = rospy.Publisher("/web/all_status", String, queue_size=1)

        # Subscribers
        self.battery_sub = rospy.Subscriber("/battery/percent",
                                            String,
                                            self.batteryCB,
                                            queue_size=1)
        self.mission_sub = rospy.Subscriber("/web/mission",
                                            String,
                                            self.missionCB,
                                            queue_size=1)
        self.fsm_sub = rospy.Subscriber("/fsm_node/state",
                                        FSMState,
                                        self.fsmCB,
                                        queue_size=1)
        self.odom_sub = rospy.Subscriber("/gyro/odom",
                                         Odometry,
                                         self.odomCB,
                                         queue_size=1)

        # Service Servers
        self.route_done_srv = rospy.Service("/route/done", Empty,
                                            self.route_doneSRV)
        self.charging_done_srv = rospy.Service("/charging/done", Empty,
                                               self.charging_doneSRV)
        self.pick_table_done_srv = rospy.Service("/pick_table/done", Empty,
                                                 self.action_doneSRV)
        self.drop_table_done_srv = rospy.Service("/drop_table/done", Empty,
                                                 self.action_doneSRV)
        self.restore_srv = rospy.Service("/restore/call", Empty,
                                         self.restoreSRV)
        self.cancel_srv = rospy.Service("/mission/cancel", Empty,
                                        self.cancelSRV)

        # Service Clients
        self.path_call = rospy.ServiceProxy("/change_path", ChangePath)
        self.charging_call = rospy.ServiceProxy("charging/call", Empty)
        self.pick_table_call = rospy.ServiceProxy("/pick_table/call", Empty)
        self.drop_table_call = rospy.ServiceProxy("/drop_table/call", Empty)
        self.rosbag_start_call = rospy.ServiceProxy("/rosbag/start",
                                                    SetFileName)
        self.rosbag_stop_call = rospy.ServiceProxy("/rosbag/stop", Empty)
        self.fsm_call = rospy.ServiceProxy("/fsm_node/set_state", SetFSMState)
        self.sound_call = rospy.ServiceProxy("/sound/call", SetFileLocation)
        self.path_cancel_call = rospy.ServiceProxy("/path/cancel", Empty)

        # Startup
        self.sound_call(self.default_sound)
        # Main Loop()
        self.main_loop()
Beispiel #2
0
    def run(self):
        try:
            vision = VisionProxy()

            tf_buffer = tf2_ros.Buffer(
                rospy.Duration(1200.0))  #tf buffer length
            tf_listener = tf2_ros.TransformListener(tf_buffer)

            i = raw_input("Enter the number of the part to be picked up:")
            i = int(i)
            if i > 0:
                rospy.logdebug("find object")
                expected_position = geometry_msgs.msg.PoseStamped()
                object_id = str(
                    i
                )  # The part number (see the definition in o2as_parts_description)
                item_pose = vision.find_object(expected_position,
                                               position_tolerance=0.2,
                                               object_id=object_id,
                                               camera="b_bot_camera")
                if item_pose != None:
                    # Transform pose from camera to workspace frame, so we can set the orientation more easily
                    target_frame = "workspace_center"
                    source_frame = item_pose.header.frame_id
                    transform = tf_buffer.lookup_transform(
                        target_frame, source_frame, rospy.Time(0),
                        rospy.Duration(1.0))
                    pick_pose = tf2_geometry_msgs.do_transform_pose(
                        item_pose, transform)

                    downward_orientation = geometry_msgs.msg.Quaternion(
                        *tf_conversions.transformations.quaternion_from_euler(
                            0, pi / 2, 0))
                    pick_pose.pose.orientation = downward_orientation

                    rospy.logdebug("pick object")
                    self.publish_marker(pick_pose, "pick_pose")  # debug
                    self.pick("b_bot",
                              pick_pose,
                              grasp_height=0.1,
                              approach_height=0.1,
                              speed_fast=0.2,
                              speed_slow=0.02,
                              gripper_command="easy_pick_only_inner")

                    # place_pose = pick_pose
                    # rospy.logdebug("place object")
                    # self.place("b_bot", place_pose, place_height = 0.03, approach_height = 0.05,
                    #                         speed_fast = 0.2, speed_slow = 0.02, gripper_command="easy_pick_only_inner",
                    #                         lift_up_after_place = False)

            else:
                rospy.loginfo("No valid entry. Skipping.")

            # rospy.logdebug("Go to home position")
            # self.go_to_named_pose("home_c", "c_bot")
            # self.go_to_named_pose("home_b", "b_bot")
            # self.go_to_named_pose("home_a", "a_bot")
            rospy.loginfo("============ Done!")

        except rospy.ROSInterruptException:
            pass
 except KeyError:
     logger.logwarn('No parameters found on the parameter server')
     exit(0)
 expected_keys = ['parent', 'child', 'rotation', 'translation']
 params_list = []
 for key, data in params.items():
     if cu.misc.has_keys(data, expected_keys):
         params_list.append(data)
 if len(params_list) == 0:
     logger.logwarn('No transformations found on the parameter server')
     exit(0)
 # Publish tf data
 num_tfs = len(params_list)
 rospy.loginfo('Publishing {0} transformation(s) to /tf'.format(num_tfs))
 tf_broadcaster = tf2_ros.TransformBroadcaster()
 tf_buffer = tf2_ros.Buffer()
 tf_listener = tf2_ros.TransformListener(tf_buffer)
 rate = rospy.Rate(publish_rate)
 tf_msg = TransformStamped()
 while not rospy.is_shutdown():
     for params in params_list:
         trans = np.array(params['translation'])
         rot = np.array(params['rotation'])
         child = params['child']
         parent = params['parent']
         tf_msg.header.stamp = rospy.Time.now()
         if invert:
             T = br.quaternion.to_transform(rot)
             T[:3, 3] = trans
             Tinv = br.transform.inverse(T)
             tf_msg.transform = cu.conversions.to_transform(Tinv)
#!/usr/bin/env python3

import rospy
import tf2_ros
from gazebo_msgs.msg import ModelStates
from geometry_msgs.msg import TransformStamped
import transforms3d
import numpy as np

rospy.init_node("localization_faker")

tf_buffer = tf2_ros.Buffer(cache_time=rospy.Duration(10.0))
tf_listener = tf2_ros.TransformListener(tf_buffer)
br = tf2_ros.TransformBroadcaster()


def model_state_to_tf(model_state_msg):
    t = TransformStamped()
    t.header.stamp = rospy.Time.now()
    for i, name in enumerate(model_state_msg.name):
        t.header.frame_id = name + "/map"
        t.child_frame_id = name + "/odom"
        try:
            robot_in_odom = tf_buffer.lookup_transform(
                name + "/odom",
                name + "/base_link",
                t.header.stamp,
                timeout=rospy.Duration(0.1))
        except tf2_ros.LookupException as ex:
            rospy.logwarn_throttle(5.0, rospy.get_name() + ": " + str(ex))
            return
def mover():
    global laser_range
    rospy.init_node('mover', anonymous=True)

    tfBuffer = tf2_ros.Buffer()
    tfListener = tf2_ros.TransformListener(tfBuffer)
    rospy.sleep(1.0)

    # subscribe to odometry data
    rospy.Subscriber('odom', Odometry, get_odom_dir)
    # subscribe to LaserScan data
    rospy.Subscriber('scan', LaserScan, get_laserscan)
    # subscribe to map occupancy data
    rospy.Subscriber('map', OccupancyGrid, callback, tfBuffer)

    rospy.on_shutdown(stopbot)

    rate = rospy.Rate(5)  # 5 Hz

    # save start time to file
    start_time = time.time()
    # initialize variable to write elapsed time to file
    timeWritten = 0

    # find direction with the largest distance from the Lidar,
    # rotate to that direction, and start moving
    rotatebot(0)
    rospy.loginfo(['len laser range', len(laser_range)])
    rospy.loginfo(['finished turning 0'])
    while laser_range[0] > stop_distance:
        movebot()
    stopbot()

    while not rospy.is_shutdown():
        if laser_range.size != 0:
            # check distances in front of TurtleBot and find values less
            # than stop_distance
            lri = (laser_range[front_angles] < float(stop_distance)).nonzero()
            rospy.loginfo('Distancessssssss: %s', str(lri))
            rospy.loginfo(['move!'])
            move()
        else:
            lri[0] = []

        # if the list is not empty
        if (len(lri[0]) > 0):
            rospy.loginfo(['Stop!'])
            # find direction with the largest distance from the Lidar
            # rotate to that direction
            # start moving
            rospy.loginfo(['running our function'])
            move()

        # check if SLAM map is complete
        if timeWritten:
            if closure(occdata):
                # map is complete, so save current time into file
                with open("maptime.txt", "w") as f:
                    f.write("Elapsed Time: " + str(time.time() - start_time))
                timeWritten = 1
                # play a sound
                # soundhandle = SoundClient()
                # rospy.sleep(1)
                # soundhandle.stopAll()
                # soundhandle.play(SoundRequest.NEEDS_UNPLUGGING)
                # rospy.sleep(2)
                # save the map
                cv2.imwrite('mazemap.png', occdata)

        rate.sleep()
Beispiel #6
0
    def __init__(self, inertial_frame_id='world'):
        """Class constructor."""
        #assert inertial_frame_id in ['world', 'world_ned']
        # Reading current namespace
        self._namespace = rospy.get_namespace()
        self._logger = logging.getLogger('vehicle_model')

        self._inertial_frame_id = inertial_frame_id
        self._body_frame_id = None

        if self._inertial_frame_id == 'world_ned':
            self._body_frame_id = 'anahita/base_link'
        else:
            self._body_frame_id = 'base_link_ned'

        tf_buffer = tf2_ros.Buffer()
        listener = tf2_ros.TransformListener(tf_buffer)
        tf_trans_ned_to_enu = None
        try:
            tf_trans_ned_to_enu = tf_buffer.lookup_transform(
                'world', 'world_ned', rospy.Time(), rospy.Duration(1))
        except Exception as e:
            self._logger.error('No transform found between world and the '
                               'world_ned ' + self.namespace)
            self._logger.error(str(e))
            self.transform_ned_to_enu = None

        if tf_trans_ned_to_enu is not None:
            self.transform_ned_to_enu = quaternion_matrix(
                (tf_trans_ned_to_enu.transform.rotation.x,
                 tf_trans_ned_to_enu.transform.rotation.y,
                 tf_trans_ned_to_enu.transform.rotation.z,
                 tf_trans_ned_to_enu.transform.rotation.w))[0:3, 0:3]

        print('Transform world_ned (NED) to world (ENU)=\n' +
              str(self.transform_ned_to_enu))

        self._mass = 0
        if rospy.has_param('~mass'):
            self._mass = rospy.get_param('~mass')
            if self._mass <= 0:
                raise rospy.ROSException('Mass has to be positive')
        else:
            self._mass = 862.87

        self._inertial = dict(ixx=0, iyy=0, izz=0, ixy=0, ixz=0, iyz=0)
        if rospy.has_param('~inertial'):
            print('has inertial')
            inertial = rospy.get_param('~inertial')
            for key in self._inertial:
                if key not in inertial:
                    raise rospy.ROSException('Invalid moments of inertia')
            self._inertial = inertial
        else:
            self._inertial['ixx'] = 243.39
            self._inertial['iyy'] = 367.20
            self._inertial['izz'] = 319.23
            self._inertial['ixy'] = 1.44
            self._inertial['ixz'] = 33.41
            self._inertial['iyz'] = 2.6

        self._cog = [0, 0, 0]
        if rospy.has_param('~cog'):
            self._cog = rospy.get_param('~cog')
            if len(self._cog) != 3:
                raise rospy.ROSException('Invalid center of gravity vector')

        self._cob = [0, 0, 0]
        if rospy.has_param('~cob'):
            self._cob = rospy.get_param('~cob')
            if len(self._cob) != 3:
                raise rospy.ROSException('Invalid center of buoyancy vector')
        else:
            self._cob = [0, 0, 0.05]

        self._body_frame = 'base_link'
        if rospy.has_param('~base_link'):
            self._body_frame = rospy.get_param('~base_link')

        self._volume = 0.0
        if rospy.has_param('~volume'):
            self._volume = rospy.get_param('~volume')
            if self._volume <= 0:
                raise rospy.ROSException('Invalid volume')
        else:
            self._volume = 0.5

        # Fluid density
        self._density = 1028.0
        if rospy.has_param('~density'):
            self._density = rospy.get_param('~density')
            if self._density <= 0:
                raise rospy.ROSException('Invalid fluid density')

        # Bounding box
        self._height = 0.4
        self._length = 1.0
        self._width = 0.5

        if rospy.has_param('~height'):
            self._height = rospy.get_param('~height')
            if self._height <= 0:
                raise rospy.ROSException('Invalid height')

        if rospy.has_param('~length'):
            self._length = rospy.get_param('~length')
            if self._length <= 0:
                raise rospy.ROSException('Invalid length')

        if rospy.has_param('~width'):
            self._width = rospy.get_param('~width')
            if self._width <= 0:
                raise rospy.ROSException('Invalid width')

        # Calculating the rigid-body mass matrix
        self._M = np.zeros(shape=(6, 6), dtype=float)
        self._M[0:3, 0:3] = self._mass * np.eye(3)
        self._M[0:3, 3:6] = - self._mass * \
            cross_product_operator(self._cog)
        self._M[3:6, 0:3] = self._mass * \
            cross_product_operator(self._cog)
        self._M[3:6, 3:6] = self._calc_inertial_tensor()

        # Loading the added-mass matrix
        self._Ma = np.zeros((6, 6))
        if rospy.has_param('~Ma'):
            self._Ma = np.array(rospy.get_param('~Ma'))
            if self._Ma.shape != (6, 6):
                raise rospy.ROSException('Invalid added mass matrix')
        else:
            self._Ma[0][0] = 379.79
            self._Ma[0][1] = -3.8773
            self._Ma[0][2] = -53.32
            self._Ma[0][3] = 4.5426
            self._Ma[0][4] = -85.54
            self._Ma[0][5] = -3.8033
            self._Ma[1][0] = -3.8773
            self._Ma[1][1] = 622
            self._Ma[1][2] = 25.29
            self._Ma[1][3] = 209.44
            self._Ma[1][4] = -2.8488
            self._Ma[1][5] = 32.726
            self._Ma[2][0] = -53.32
            self._Ma[2][1] = 25.29
            self._Ma[2][2] = 1959.9
            self._Ma[2][3] = 3.1112
            self._Ma[2][4] = -196.42
            self._Ma[2][5] = 5.774
            self._Ma[3][0] = 4.5426
            self._Ma[3][1] = 209.44
            self._Ma[3][2] = 3.1112
            self._Ma[3][3] = 264.9
            self._Ma[3][4] = -5.027
            self._Ma[3][5] = 11.019
            self._Ma[4][0] = -85.54
            self._Ma[4][1] = -2.8488
            self._Ma[4][2] = -196.42
            self._Ma[4][3] = -5.027
            self._Ma[4][4] = 442.69
            self._Ma[4][5] = -1.1162
            self._Ma[5][0] = -3.8033
            self._Ma[5][1] = 32.726
            self._Ma[5][2] = 5.775
            self._Ma[5][3] = 11.019
            self._Ma[5][4] = -1.1162
            self._Ma[5][5] = 114.32

        # Sum rigid-body and added-mass matrices
        self._Mtotal = np.zeros(shape=(6, 6))
        self._calc_mass_matrix()

        # Acceleration of gravity
        self._gravity = 9.81

        # Initialize the Coriolis and centripetal matrix
        self._C = np.zeros((6, 6))

        # Vector of restoring forces
        self._g = np.zeros(6)

        # Loading the linear damping coefficients
        self._linear_damping = np.zeros(shape=(6, 6))
        if rospy.has_param('~linear_damping'):
            self._linear_damping = np.array(rospy.get_param('~linear_damping'))
            if self._linear_damping.shape == (6, ):
                self._linear_damping = np.diag(self._linear_damping)
            if self._linear_damping.shape != (6, 6):
                raise rospy.ROSException(
                    'Linear damping must be given as a 6x6 matrix or the diagonal coefficients'
                )
        else:
            self._linear_damping[0][0] = -34.82
            self._linear_damping[1][1] = -39.48
            self._linear_damping[2][2] = -368.4
            self._linear_damping[3][3] = -138.8
            self._linear_damping[4][4] = -159.77
            self._linear_damping[5][5] = -55

        # Loading the nonlinear damping coefficients
        self._quad_damping = np.zeros(shape=(6, ))
        if rospy.has_param('~quad_damping'):
            self._quad_damping = np.array(rospy.get_param('~quad_damping'))
            if self._quad_damping.shape != (6, ):
                raise rospy.ROSException(
                    'Quadratic damping must be given defined with 6 coefficients'
                )
        else:
            self._quad_damping[0] = -378.22
            self._quad_damping[1] = -502.53
            self._quad_damping[2] = -921.01
            self._quad_damping[3] = -342
            self._quad_damping[4] = -394.44
            self._quad_damping[5] = -263.27

        # Loading the linear damping coefficients proportional to the forward speed
        self._linear_damping_forward_speed = np.zeros(shape=(6, 6))
        if rospy.has_param('~linear_damping_forward_speed'):
            self._linear_damping_forward_speed = np.array(
                rospy.get_param('~linear_damping_forward_speed'))
            if self._linear_damping_forward_speed.shape == (6, ):
                self._linear_damping_forward_speed = np.diag(
                    self._linear_damping_forward_speed)
            if self._linear_damping_forward_speed.shape != (6, 6):
                raise rospy.ROSException(
                    'Linear damping proportional to the forward speed must be given as a 6x6 '
                    'matrix or the diagonal coefficients')

        # Initialize damping matrix
        self._D = np.zeros((6, 6))

        # Vehicle states
        self._pose = dict(pos=np.zeros(3), rot=quaternion_from_euler(0, 0, 0))
        # Velocity in the body frame
        self._vel = np.zeros(6)
        # Acceleration in the body frame
        self._acc = np.zeros(6)
        # Generalized forces
        self._gen_forces = np.zeros(6)
Beispiel #7
0
    def __init__(self,rate):
        """
        
        Constructor of the CrackMap class. 
        
        
        ------
        
        Input : 
            
            rate : the rate associated to rospy.
        
        Parameters : 
            
            PicID : int, associated with the ID of the last depth message
            recorded.
            
            cur_PicID : int, associated with the ID of the currently processed
            depth message (by the checkCracks function)
            
            CIFrontColor : Camera Info object, containing all the intrinsic parameters
            of the camera.
            
            depthMsg : Image Message : ROS message containing the last message published by 
            the topic /phantomx/crack_image (a depth picture containing the depth of 
            all the detected cracks on a picture).
            
            depthPic : OpenCV Matrix, containing the last depth picture published by
            the topic /phantomx/crack_image.
            
            allCracksInCave : list, containing all the cracks detected since the beginning
            of the simulation.
            
            nb_cracks : int, containing the number of cracks detected since the beginning of the
            simulation.
            
            dist_center_cracks : float, indicating the minimum 3D distance between the barycenters
            of the cracks.
            
            R_rpic2rcam : rotationnal matrix from the picture frame to the camera sensor frame
            
            R_rcam2rpic : rotationnal matrix from the camera sensor frame to the picture frame
            
            buffer : BufferInterface object, stores the last transformation matrices between frames for
            a certain time (60 seconds here).
            
            listener : TransformListener object, used to express the coordinates of a pixel from the 
            camera sensor frame into the cave frame.
            
        """
        
        self.bridge = CvBridge()
        self.PicID = 0
        self.cur_PicID = 0
        self.CIFrontDepth = None
        self.CIFrontColor = None
        self.depthMsg = None
        self.depthPic = None
        self.allCracksInCave = []
        self.nb_cracks = len(self.allCracksInCave)
        
        self.dist_center_cracks = 0.5
        self.dist_close_cracks = 4.0
        #self.current_depthPic = None
        
        self.buffer = tf2.Buffer(rospy.Duration(60)) # prend 60s de tf 
        self.listener = tf2.TransformListener(self.buffer)
        
    
        self.CIDtopic = rospy.Subscriber("/phantomx/camera_front/depth/camera_info", CamInfoMSG,self.callbackCIFrontDepth)
        self.CIPtopic = rospy.Subscriber("/phantomx/camera_front/color/camera_info", CamInfoMSG,self.callbackCIFrontColor)
        rospy.Subscriber("/phantomx/crack_image", ImageMSG,self.callbackDepthPic)

    
        self.rate = rospy.Rate(rate)
        
        self.markerPub = rospy.Publisher('/phantomx/crack_markers', MarkerArray, queue_size=10)

        
        time.sleep(3)
        
        self.cameraModel = image_geometry.PinholeCameraModel()

        self.R_rcam2rpic = np.array([[0.0,-1.0,0.0],[0.,0.,-1.0],[1.0,0.0,0.0]])
        self.R_rpic2rcam = np.linalg.inv(self.R_rcam2rpic)
        

        
        while not rospy.is_shutdown():
            if (self.depthMsg is not None):
                self.checkCracks()
            self.displayCracks()
            self.rate.sleep()
Beispiel #8
0
 def __init__(self):
     rospy.init_node('robot')
     self.tfBuffer = tf2_ros.Buffer()
     self.listener = tf2_ros.TransformListener(self.tfBuffer)
     self.pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)
     self.zeroTime = rospy.Time()
def main(unused_argv):
    vrb = ViveRobotBridge()
    #    vrb.__init__()

    rospy.init_node('vive_listener')

    tfBuffer = tf2_ros.Buffer()
    listener = tf2_ros.TransformListener(tfBuffer)

    #    pub = rospy.Publisher('tarpos_pub', geometry_msgs.msg.Transform, queue_size=1)
    #    _joy_sub = rospy.Subscriber('/vive/controller_LHR_FFFF3F47/joy', Joy, vive_controller_button_callback, queue_size=1)

    temp_flag = 0

    pre_position = [0, 0, 0]
    pre_pose = [1, 0, 0, 0]
    temp = [1, 0, 0, 0]

    rate = rospy.Rate(100.0)

    limits = 0.02

    env = Environment(FLAGS.assets_root,
                      disp=FLAGS.disp,
                      shared_memory=FLAGS.shared_memory,
                      hz=480)
    task = tasks.names[FLAGS.task]()
    task.mode = FLAGS.mode
    agent = task.oracle(env)
    env.set_task(task)
    obs = env.reset()
    info = None
    ee_pose = ((0.46562498807907104, -0.375, 0.3599780201911926), (0.0, 0.0,
                                                                   0.0, 1.0))
    while not rospy.is_shutdown():
        #act = agent.act(obs, info)

        #obs, reward, done, info = env.step(act)

        env.movep(ee_pose)
        if vrb.grasp == 1:
            env.ee.activate()
        else:
            env.ee.release()

        try:
            trans = tfBuffer.lookup_transform('world',
                                              'controller_LHR_FF777F05',
                                              rospy.Time())
#            rospy.loginfo(trans)
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException,
                tf2_ros.ExtrapolationException):
            rospy.loginfo("error")
            rate.sleep()
            continue

        if vrb.offset_flag == 1:
            if temp_flag == 0:
                #                vrb.offset[0] = trans.transform.translation.x
                #                vrb.offset[1] = trans.transform.translation.y
                #                vrb.offset[2] = trans.transform.translation.z
                #                print(vrb.offset)
                pre_position[0] = trans.transform.translation.x
                pre_position[1] = trans.transform.translation.y
                pre_position[2] = trans.transform.translation.z

                pre_pose[0] = trans.transform.rotation.x
                pre_pose[1] = trans.transform.rotation.y
                pre_pose[2] = trans.transform.rotation.z
                pre_pose[3] = trans.transform.rotation.w
            else:
                msg = geometry_msgs.msg.Transform()
                #                msg.translation.x = (trans.transform.translation.x-pre_position[0])/10
                #                msg.translation.y = (trans.transform.translation.y-pre_position[1])/10
                #                msg.translation.z = (trans.transform.translation.z-pre_position[2])/10

                #                compute delta distance
                msg.translation.x = trans.transform.translation.x - pre_position[
                    0]
                msg.translation.y = trans.transform.translation.y - pre_position[
                    1]
                msg.translation.z = trans.transform.translation.z - pre_position[
                    2]

                #                if msg.translation.x >0.02:
                #                    msg.translation.x = 0.02
                #                if msg.translation.y >0.02:
                #                    msg.translation.y = 0.02
                #                if msg.translation.z >0.02:
                #                    msg.translation.z = 0.02
                #                if msg.translation.x <-0.02:
                #                    msg.translation.x = -0.02
                #                if msg.translation.y <-0.02:
                #                    msg.translation.y = -0.02
                #                if msg.translation.z <-0.02:
                #                    msg.translation.z = -0.02

                if msg.translation.x > limits:
                    msg.translation.x = limits
                if msg.translation.y > limits:
                    msg.translation.y = limits
                if msg.translation.z > limits:
                    msg.translation.z = limits
                if msg.translation.x < -limits:
                    msg.translation.x = -limits
                if msg.translation.y < -limits:
                    msg.translation.y = -limits
                if msg.translation.z < -limits:
                    msg.translation.z = -limits

                print(msg.translation)

                #                temp[0] = trans.transform.rotation.x
                #                temp[1] = trans.transform.rotation.y
                #                temp[2] = trans.transform.rotation.z
                #                temp[3] = trans.transform.rotation.w
                #
                #
                #
                #                q = Quaternion(pre_pose) * Quaternion(temp).inverse
                #
                #
                #                msg.rotation.x = q.x
                #                msg.rotation.y = q.y
                #                msg.rotation.z = q.z
                #                msg.rotation.w = q.w#

                msg.rotation.x = trans.transform.rotation.x
                msg.rotation.y = trans.transform.rotation.y
                msg.rotation.z = trans.transform.rotation.z
                msg.rotation.w = trans.transform.rotation.w

                ee_position = list(p.getLinkState(env.ur5, env.ee_tip)[4])
                #ee_orientation = p.getLinkState(self.ur5, self.ee_tip)[5]
                ee_orientation = (0, 0, 0, 1)
                ee_position[0] = ee_position[0] + msg.translation.y
                ee_position[1] = ee_position[1] - msg.translation.x
                # z axis limit
                z_control = ee_position[2] + msg.translation.z
                if z_control < 0.02:
                    z_control = 0.02
                ee_position[2] = z_control

                ee_pose = (tuple(ee_position), ee_orientation)

                # rectified quaternion

                #                theta_x = np.arcsin(2*(trans.transform.rotation.w*trans.transform.rotation.y
                #                                       - trans.transform.rotation.z*trans.transform.rotation.x))
                #                temp = (trans.transform.rotation.x**2 + trans.transform.rotation.z**2)**0.5
                #                z_v = trans.transform.rotation.z / temp
                #                x_v = trans.transform.rotation.x / temp
                #                msg.rotation.x = x_v * np.sin(theta_x)#0#np.sin(0.5*theta_x)
                #                msg.rotation.y = 0#y_v * np.sin(theta_x)#0
                #                msg.rotation.z = z_v * np.sin(theta_x)
                #                msg.rotation.w = trans.transform.rotation.w
                #
                #                msg.translation.x = 0
                #                msg.translation.y = 0
                #                msg.translation.z = 0
                #
                #                msg.rotation.x = 0
                #                msg.rotation.y = 0
                #                msg.rotation.z = 0
                #                msg.rotation.w = 1

                print(msg.rotation)

                vrb.pub.publish(msg)

                pre_position[0] = trans.transform.translation.x
                pre_position[1] = trans.transform.translation.y
                pre_position[2] = trans.transform.translation.z

        temp_flag = vrb.offset_flag
        rate.sleep()
def controller(turtlebot_frame, goal_frame):
    """
  Controls a turtlebot whose position is denoted by turtlebot_frame,
  to go to a position denoted by target_frame
  Inputs:
  - turtlebot_frame: the tf frame of the AR tag on your turtlebot
  - target_frame: the tf frame of the target AR tag
  """

    ################################### YOUR CODE HERE ##############

    #Create a publisher and a tf buffer, which is primed with a tf listener
    pub = rospy.Publisher("/yellow/mobile_base/commands/velocity",
                          Twist,
                          queue_size=10)
    tfBuffer = tf2_ros.Buffer()
    tfListener = tf2_ros.TransformListener(tfBuffer)
    br = tf2_ros.TransformBroadcaster()

    # Create a timer object that will sleep long enough to result in
    # a 10Hz publishing rate
    r = rospy.Rate(10)  # 10hz

    K1 = 0.3
    K2 = 1
    Ks = [K1, K2]
    # Loop until the node is killed with Ctrl-C
    while not rospy.is_shutdown():
        try:
            #print("Before")
            rospy.sleep(0.1)
            t = TransformStamped()
            t.header.stamp = rospy.Time.now()
            t.transform.translation.x = 0
            t.transform.translation.y = 0
            t.transform.translation.z = 0

            t.transform.rotation.x = 0
            t.transform.rotation.y = 0
            t.transform.rotation.z = -0.707
            t.transform.rotation.w = 0.707
            t.header.frame_id = "left"
            t.child_frame_id = "ball"

            br.sendTransform(t)

            #t.header.frame_id = "test"
            trans = tfBuffer.lookup_transform(turtlebot_frame, "left",
                                              rospy.Time())

            #print("After")
            # Process trans to get your state error
            # Generate a control command to send to the robot
            #print(trans)
            x = trans.transform.translation.x * Ks[0]
            theta = trans.transform.translation.y * Ks[1]
            #print(turtlebot_frame)
            control_command = Twist(Vector3(x, 0, 0), Vector3(0, 0, theta))

            #################################### end your code ###############

            pub.publish(control_command)
            print(control_command)
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException,
                tf2_ros.ExtrapolationException) as e:
            print(e)
            pass
        # Use our rate object to sleep until it is time to publish again
        r.sleep()
    def depthImageCallback(self, data):

        time_start = time.time()

        # neck_rad = self.whole_body.joint_positions['head_tilt_joint']
        # if neck_rad != -np.radians(45.0):
        #     self.whole_body.move_to_joint_positions({'head_tilt_joint':-np.radians(45.0)})

        try:
            tf_buffer = tf2_ros.Buffer()
            tf_listener = tf2_ros.TransformListener(tf_buffer)
            trans = tf_buffer.lookup_transform("map",
                                               "head_rgbd_sensor_rgb_frame",
                                               rospy.Time(0),
                                               rospy.Duration(1.0))
        except Exception as e:
            rospy.loginfo("%s", e)
            return

        depthImage = CvBridge().imgmsg_to_cv2(data, '16UC1')
        heightImage = trans.transform.translation.z - np.array(
            depthImage) * np.sin(np.radians(45.0)) * 0.001 - self.floor_adjust
        heightImage[depthImage < 10.0] = 0.0

        if self.use_color:
            colorImage = CvBridge().imgmsg_to_cv2(self.colorImageData, 'rgb8')
            colorImage[heightImage < self.heightThreshold] = [0, 0, 0]
            grayImage = cv2.cvtColor(colorImage, cv2.COLOR_BGR2GRAY)
            retval, bw = cv2.threshold(grayImage, 50, 225,
                                       cv2.THRESH_BINARY | cv2.THRESH_OTSU)
        else:
            depthImage[heightImage < self.heightThreshold] = 0.0
            grayImage = np.uint8(depthImage)
            retval, bw = cv2.threshold(grayImage, 1, 225, cv2.THRESH_BINARY)

        image, contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST,
                                                      cv2.CHAIN_APPROX_NONE)

        # s = cv2.cvtColor(colorImage, cv2.COLOR_BGR2RGBA)
        # s[heightImage<self.heightThreshold] = [0,0,0,0]
        # cv2.imwrite("hoge.png", s)

        print "depth time : ", time.time() - time_start

        br = tf.TransformBroadcaster()
        xywh = np.array([
            cv2.boundingRect(c) for c in contours
            if 200 < cv2.contourArea(c) < 2000 and len(c) > 0
        ])
        if len(xywh) < 1:
            return
        if self.use_color:
            for x, y, w, h in xywh:
                cv2.rectangle(colorImage, (x, y), (x + w, y + h), (0, 255, 0),
                              2)
        elif self.output_flag:
            for x, y, w, h in xywh:
                cv2.rectangle(depthImage, (x, y), (x + w, y + h), 255, 2)
        x_pixel_uncheck = xywh[:, 0] + xywh[:, 2] / 2
        y_pixel_uncheck = xywh[:, 1] + xywh[:, 3] / 2
        dist_uncheck = depthImage[y_pixel_uncheck, x_pixel_uncheck] * 0.001

        check_array = (0.8 < dist_uncheck)
        x_pixel = x_pixel_uncheck[check_array]
        y_pixel = y_pixel_uncheck[check_array]
        dist = dist_uncheck[check_array]

        x_deg = width_pixel_deg * (x_pixel - image_width / 2)
        y_deg = height_pixel_deg * (y_pixel - image_height / 2)
        tf_x = np.sin(np.radians(x_deg)) * dist
        tf_y = np.cos(np.radians(y_deg)) * dist

        for count, (tf_xi, tf_yi) in enumerate(zip(tf_x, tf_y)):
            name = "followeme_" + str(count)
            br.sendTransform((tf_xi, 0.0, tf_yi), (0.0, 0.0, 0.0, 1.0),
                             rospy.Time.now(), name,
                             "head_rgbd_sensor_rgb_frame")

        print "fin time : ", time.time() - time_start

        if self.use_color:
            self.image_pub.publish(CvBridge().cv2_to_imgmsg(
                colorImage, "rgb8"))
        elif self.output_flag:
            self.image_pub.publish(CvBridge().cv2_to_imgmsg(
                depthImage, "16UC1"))
Beispiel #12
0
 def __init__(self):
     rospy.init_node('node_tf_echo')
     self._tfBuffer = tf2_ros.Buffer()
     self._listener = tf2_ros.TransformListener(self._tfBuffer)
    def __init__(self):
        action_ns = rospy.get_param('~action_ns', '')
        robot_name = rospy.get_param('~robot_name')
        self.lock = threading.RLock()

        self.publish_rate = rospy.get_param('~publish_rate', 50)

        sec = rospy.get_param('~tf_exp_time', 90.0)
        self.tf_exp_time = rospy.Duration(sec)

        self.human_frame = rospy.get_param('~human_frame_id',
                                           'human_footprint')
        self.robot_root_frame = rospy.get_param('~robot_root_frame',
                                                robot_name + '/odom')
        drone_goto_action_ns = rospy.get_param(
            '~drone_goto_action_ns', '/' + robot_name + '/goto_action')
        drone_shape_action_ns = rospy.get_param(
            '~drone_followpath_action_ns',
            '/' + robot_name + '/followshape_action')
        drone_followme_action_ns = rospy.get_param(
            '~drone_followme_action_ns', '/' + robot_name + '/followme_action')

        self.ray_origin_frame = rospy.get_param('~ray_origin_frame', 'eyes')
        self.ray_direction_frame = rospy.get_param('~ray_direction_frame',
                                                   'pointer')
        self.ray_inverse = rospy.get_param('~ray_inverse', False)

        pose_topic = rospy.get_param('~robot_pose_topic',
                                     '/' + robot_name + '/odom/pose/pose')
        pose_topic_class, pose_real_topic, pose_eval_func = rostopic.get_topic_class(
            pose_topic)
        self.robot_pose_msg_eval = pose_eval_func

        ############ FIXME ############
        trigger_topic = rospy.get_param('~trigger_topic',
                                        '/' + robot_name + '/joy/buttons[6]')
        trigger_topic_class, trigger_real_topic, trigger_eval_func = rostopic.get_topic_class(
            trigger_topic)
        self.trigger_msg_eval = trigger_eval_func
        # self.trigger_sub = rospy.Subscriber(trigger_real_topic, trigger_topic_class, self.trigger_cb)
        self.trigger_val = None
        self.last_trigger_val = None
        ###############################

        self.timewindow = rospy.get_param('~timewindow', 5.0)
        self.sync_freq = rospy.get_param('~freq', 20.0)
        self.sample_size = rospy.get_param('~sample_size',
                                           self.sync_freq * 3.0)

        self.residual_threshold = np.radians(
            rospy.get_param('~residual_threshold_deg', 3.0))

        self.robot_motion_span_min = rospy.get_param('~robot_motion_span_min',
                                                     0.20)  # 20 cm

        if self.timewindow and self.sync_freq:
            self.queue_size = int(self.timewindow * self.sync_freq)
            # 5.0 seconds at 5 Hz
            rospy.loginfo('Max queue size: {}'.format(self.queue_size))
            if self.sample_size > self.queue_size:
                rospy.loginfo(
                    'sample_size [{}] is bigger than queue_size [{}]. Setting sample_size = queue_size'
                    .format(self.sample_size, self.queue_size))
                self.sample_size = self.queue_size
        else:
            rospy.logwarn(
                'Either timewindow or queue_size is set to 0. Using unbound queue.'
            )
            self.queue_size = None
        self.deque = collections.deque(maxlen=self.queue_size)

        self.relloc_deque = collections.deque(
            maxlen=self.sync_freq *
            1.0)  # Use 1s of relloc data to trigger selection

        self.robot_pose_msg = None
        self.robot_sub = rospy.Subscriber(pose_real_topic, pose_topic_class,
                                          self.robot_pose_cb)

        self.is_valid_pub = rospy.Publisher('is_relloc_valid',
                                            Bool,
                                            queue_size=10)

        self.initial_guess = np.array([0, 0, 0, 0])
        self.reset_state()

        self.tf_buff = tf2_ros.Buffer()
        self.tf_ls = tf2_ros.TransformListener(self.tf_buff)
        self.tf_br = tf2_ros.TransformBroadcaster()

        self.drone_goto_client = actionlib.SimpleActionClient(
            drone_goto_action_ns, GoToAction)
        rospy.loginfo('Waiting for ' + drone_goto_action_ns)
        self.drone_goto_client.wait_for_server()

        # self.drone_shape_client = actionlib.SimpleActionClient(drone_shape_action_ns, FollowShapeAction)
        # rospy.loginfo('Waiting for ' + drone_shape_action_ns)
        # self.drone_shape_client.wait_for_server()

        self.drone_followme_client = actionlib.SimpleActionClient(
            drone_followme_action_ns, FollowMeAction)
        rospy.loginfo('Waiting for ' + drone_followme_action_ns)
        self.drone_followme_client.wait_for_server()

        self.relloc_server = actionlib.SimpleActionServer(
            action_ns + '/relloc_action', MotionRellocContAction,
            self.execute_relloc, False)
        self.relloc_server.start()

        self.relloc_cont_server = actionlib.SimpleActionServer(
            action_ns + '/relloc_cont_action', MotionRellocContAction,
            self.execute_relloc_cont, False)
        self.relloc_cont_server.start()
Beispiel #14
0
    if not os.path.isdir(os.path.join(save_dir, str(i)+'_npy')):
        os.makedirs(os.path.join(save_dir, str(i)+'_npy', 'data'))
        os.makedirs(os.path.join(save_dir, str(i)+'_npy', 'gt'))

exit()
'''

origin_tag = '0'
all_tags = [
    '0', '1', '2', '3', '4', '5', '16', '7', '8', '9', '10', '11', '17', '14',
    '15'
]

rospy.init_node("data_node", anonymous=True)

buf = tf.Buffer()
ls = tf.TransformListener(buf)

gt_dict = dict()
data_dict = dict()


def data_synced(tag, tag_odom):
    global origin_tag, data_dict, gt_dict

    if len(tag.detections) > 0:
        if len(tag.detections) > 1:
            detected_tag = sort_l2(tag.detections)
        else:
            detected_tag = tag.detections[0]
    def __init__(self):
        rospy.init_node("show_world_model_objects")
        self.marker_publisher = rospy.Publisher(
            "visualization_world_model_markers", Marker, queue_size=10)

        # object properties
        self.ball_diameter = 0.17
        self.lifetime_ball = rospy.get_param('behavior/body/ball_lost_time')
        self.lifetime_goal = rospy.get_param('behavior/body/goal_lost_time')
        self.lifetime_ball_kick_area = 1
        self.post_diameter = 0.15
        self.post_height = 1.10
        position = Pose()
        position.position.x = 1.0
        position.position.y = 1.0
        position.position.z = 0.0
        position.orientation.w = 1.0
        position.orientation.x = 0.0
        position.orientation.y = 0.0
        position.orientation.z = 0.0

        self.base_footprint_frame = rospy.get_param('~base_footprint_frame',
                                                    'base_footprint')

        # init ball marker
        self.marker_ball = Marker()  # type: Marker
        self.marker_ball.id = 0
        self.marker_ball.type = Marker.SPHERE
        self.ball_pose = Pose()
        scale = Vector3(self.ball_diameter, self.ball_diameter,
                        self.ball_diameter)
        self.marker_ball.scale = scale
        self.ball_color = ColorRGBA()
        self.ball_color.a = 0.0
        self.ball_color.g = 1.0
        self.marker_ball.color = self.ball_color
        self.marker_ball.pose = position
        self.marker_ball.lifetime = rospy.Duration(self.lifetime_ball)

        # init goal markers
        self.marker_goal_first_post = Marker()  # type:Marker
        self.marker_goal_first_post.id = 1
        self.marker_goal_first_post.type = Marker.CYLINDER
        self.goal_post_pose = Pose()
        scale = Vector3(self.post_diameter, self.post_diameter,
                        self.post_height)
        self.marker_goal_first_post.scale = scale
        self.post_left_color = ColorRGBA()
        self.post_left_color.a = 0.0
        self.post_left_color.g = 1.0
        self.marker_goal_first_post.color = self.post_left_color
        self.marker_goal_first_post.pose = position
        self.marker_goal_first_post.lifetime = rospy.Duration(
            self.lifetime_goal)

        self.marker_goal_second_post = Marker()  # type:Marker
        self.marker_goal_second_post.id = 2
        self.marker_goal_second_post.type = Marker.CYLINDER
        self.goal_post_pose = Pose()
        scale = Vector3(self.post_diameter, self.post_diameter,
                        self.post_height)
        self.marker_goal_second_post.scale = scale
        self.post_right_color = ColorRGBA()
        self.post_right_color.a = 0.0
        self.post_right_color.b = 1.0
        self.marker_goal_second_post.color = self.post_right_color
        self.marker_goal_second_post.pose = position
        self.marker_goal_second_post.lifetime = rospy.Duration(
            self.lifetime_goal)

        # init ball kick area markers
        self.marker_kick_area = Marker()
        self.marker_kick_area.id = 3
        self.marker_kick_area.type = Marker.LINE_STRIP
        self.marker_kick_area.scale.x = 0.01
        self.kick_area_color = ColorRGBA()
        self.kick_area_color.a = 0.5
        self.kick_area_color.r = 0.8
        self.kick_area_color.g = 0.8
        self.kick_area_color.b = 0.8
        self.marker_kick_area.color = self.kick_area_color
        self.marker_kick_area.lifetime = rospy.Duration(
            self.lifetime_ball_kick_area)
        self.marker_kick_area.pose.orientation.w = 1.0

        # init subscribers
        rospy.Subscriber("debug/viz_ball",
                         PointStamped,
                         self.ball_cb,
                         queue_size=10)
        rospy.Subscriber("debug/viz_goal",
                         PoseWithCertaintyArray,
                         self.goal_cb,
                         queue_size=10)
        rospy.Subscriber("debug/viz_ball_kick_area",
                         String,
                         self.kick_area_cb,
                         queue_size=10)

        # load kick area info
        kick_max_x = rospy.get_param('behavior/body/kick_max_x')
        kick_max_y = rospy.get_param('behavior/body/kick_max_y')
        kick_min_x = rospy.get_param('behavior/body/kick_min_x')
        kick_min_y = rospy.get_param('behavior/body/kick_min_y')
        self.kick_area_info = [kick_max_x, kick_max_y, kick_min_x, kick_min_y]

        # init tf listener for ball_kick_area_viz
        self.tfBuffer = tf2_ros.Buffer()
        listener = tf2_ros.TransformListener(self.tfBuffer)

        self.last_received_kick_info = rospy.Time.now()

        self.kick_area()
        rospy.spin()
def compute_grasps_handle(req):
    tf_buffer = tf2_ros.Buffer(rospy.Duration(1200.0))
    tf_listener = tf2_ros.TransformListener(tf_buffer)
    print("Request for Grasp compute recieved by graspnet!!")
    #return AddTwoIntsResponse(req.a + req.b)

    ## Subscribers ##
    #camera_info_topic = '/panda/camera/depth/camera_info'
    #depth_img_topic = '/panda/camera/depth/image_raw'
    #rgb_img_topic ='/panda/camera/color/image_raw'
    cloud_topic = '/transformed_cloud_camLink'

    cloud_msg = rospy.wait_for_message(cloud_topic, PointCloud2)
    pc = ros_numpy.point_cloud2.pointcloud2_to_xyz_array(cloud_msg)
    pc_colors=100*np.ones((pc.shape[0],3))

## output data info ##
    print('Total number of points: %s', pc.shape)
    print('HighestPoint %s', np.nanmax(pc[:,2]))
    print('LowestPoint %s', np.nanmin(pc[:,2]))
    print('Farthest Point %s', np.nanmax(pc[:,0]))
    print('Nearest Point %s', np.nanmin(pc[:,0]))
    #print('Total number of points above the table: %s', pc.shape)

    # Smoothed pc comes from averaging the depth for 10 frames and removing
    # the pixels with jittery depth between those 10 frames.
    #object_pc = data['smoothed_object_pc']

    #points_obj = xyzrgb_array_to_pointcloud2(object_pc, pc_colors, stamp = rospy.Time.now(), frame_id = 'world')
    #pub2.publish(points_obj)
    ## Segment out the points that fit the table plane
    cloud_seg = pcl_helper.plane_seg(pc)
    #cloud_arr = cloud_seg.to_array()
    #cloud_colors_arr =100*np.ones((cloud_arr.shape[0],3))

    clc = cloud_clustering(cloud_seg)
    clc.euclid_cluster()
    cloud = clc.clusters[0]     # Run grasp-detection only on the closest cloud cluster

    points = cloud.to_array()
    cloud_colors =100*np.ones((points.shape[0],3))
    ## Grasp-Estimation ##

    latents = estimator.sample_latents()
    generated_grasps, generated_scores, _ = estimator.predict_grasps(
        sess,
        points,
        latents,
        num_refine_steps=cfg.num_refine_steps,
    )


    ## Sorting grasps ##
    scores_np = np.asarray(generated_scores)
    sorting = np.argsort(-scores_np)    #Negative sign is for descending-order sorting
    sorted_scores = scores_np[sorting]

    grasps_np = np.asarray(generated_grasps)
    sorted_grasps = grasps_np[sorting]
    print('Total generated grasps '+str(len(sorted_grasps.tolist())))
    filtered_grasps, filtered_scores, grasp_msgs = filter_grasps(sorted_grasps)
    print('Filtered grasps '+str(len(filtered_grasps.tolist())))
    try:
        tf_stamped = tf_buffer.lookup_transform('world', 'panda_camera_link' , rospy.Time(0))

    except Exception as inst:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        print('exception: '+str(inst)+' in '+ str(exc_tb.tb_lineno))

    # Transform the grasps to world frame - which is the ref. frame for Panda robot
    transformed_grasps = transform_poses(filtered_grasps.tolist(),tf_stamped)

    for i, grasp in enumerate(transformed_grasps):
        if grasp.position.z < 0.45: #predefined table height
            transformed_grasps.pop(i)

    print('Transformed grasps above the table '+str(len(transformed_grasps)))
    points_obj = pcl_helper.xyzrgb_array_to_pointcloud2(points, cloud_colors, stamp = rospy.Time.now(), frame_id = 'panda_camera_link')
    pub2.publish(points_obj)
    pub.publish(PoseArray(header=Header(stamp=rospy.Time.now(), frame_id='world'), poses = transformed_grasps))
    return PoseArray(header=Header(stamp=rospy.Time.now(), frame_id='world'), poses = transformed_grasps)
Beispiel #17
0
    def __init__(self):
        # self.br = tf2_ros.TransformBroadcaster()
        self.tf_buffer = tf2_ros.Buffer()
        self.tf_listener = tf2_ros.TransformListener(self.tf_buffer)

        rospy.wait_for_service('add_compound')
        self.add_compound = rospy.ServiceProxy('add_compound', AddCompound)

        self.spawn_frame = rospy.get_param("~frame", "spawn_frame")
        self.ts = TransformStamped()
        self.ts.header.frame_id = "map"
        self.ts.child_frame_id = self.spawn_frame
        self.ts.transform.rotation.w = 1.0
        self.timer = rospy.Timer(rospy.Duration(0.1), self.update)

        self.count = 0
        self.server = InteractiveMarkerServer("body_spawn")
        self.im = InteractiveMarker()
        self.im.header.frame_id = self.spawn_frame
        self.im.name = "body_spawner"
        self.im.description = "Spawn a new body"

        self.menu_handler = MenuHandler()

        # TODO(lucasw) click and drag resizing will be best served
        # by and interactive marker child that has a frame tf defined
        # by the parent.

        menu = InteractiveMarkerControl()
        menu.interaction_mode = InteractiveMarkerControl.MENU
        menu.description = "spawn"
        menu.name = "spawn_menu"

        box = Marker()
        box.header.frame_id = self.spawn_frame
        box.type = Marker.CUBE
        box.scale.x = 0.5
        box.scale.y = 0.5
        box.scale.z = 0.5
        box.color.r = 0.8
        box.color.g = 0.8
        box.color.b = 0.8
        box.color.a = 1.0
        box.frame_locked = True
        menu.markers.append(box)
        self.im.controls.append(menu)

        self.menu_handler.insert("spawn", callback=self.process_feedback)
        # TODO(lucasw) have a submenu that is updated with a list
        # of all tf frames, and selecting one will cause that tf to
        # be the parent of this marker.

        self.server.insert(self.im, self.process_feedback)
        self.server.applyChanges()
        # TODO(lucasw) what does this do?
        self.menu_handler.apply(self.server, self.im.name)

        # resize x
        self.resize_x_server = InteractiveMarkerServer("body_spawn/resize_x")
        self.resize_x_im = InteractiveMarker()
        self.resize_x_im.header.frame_id = self.spawn_frame
        self.resize_x_im.name = "body_spawner_resize_x"
        self.resize_x_im.description = "resize x of new body"

        self.resize_x = InteractiveMarkerControl()
        self.resize_x.interaction_mode = InteractiveMarkerControl.MOVE_AXIS
        self.resize_x.name = "resize_x"
        self.resize_x.orientation.w = 1
        self.resize_x.orientation.x = 1
        self.resize_x.orientation.y = 0
        self.resize_x.orientation.z = 0

        arrow = Marker()
        arrow.type = Marker.ARROW
        # arrow.pose.position.x = box.scale.x * 0.5
        arrow.scale.x = 0.8
        arrow.scale.y = 0.3
        arrow.scale.z = 0.3
        arrow.color.r = 1.0
        arrow.color.g = 0.2
        arrow.color.b = 0.15
        arrow.color.a = 1.0
        arrow.frame_locked = True
        self.resize_x.markers.append(arrow)

        self.resize_x_im.controls.append(self.resize_x)
        self.resize_x_server.insert(self.resize_x_im, self.process_resize_feedback)
        self.resize_x_server.applyChanges()

        # resize y
        self.resize_y_server = InteractiveMarkerServer("body_spawn/resize_y")
        self.resize_y_im = InteractiveMarker()
        self.resize_y_im.header.frame_id = self.spawn_frame
        self.resize_y_im.name = "body_spawner_resize_y"
        self.resize_y_im.description = "resize y of new body"

        self.resize_y = InteractiveMarkerControl()
        self.resize_y.interaction_mode = InteractiveMarkerControl.MOVE_AXIS
        self.resize_y.name = "resize_y"
        self.resize_y.orientation.w = 1
        self.resize_y.orientation.x = 0
        self.resize_y.orientation.y = 0
        self.resize_y.orientation.z = 1

        arrow_y = copy.deepcopy(arrow)
        arrow_y.color.r = 0.2
        arrow_y.color.g = 1.0
        arrow_y.color.b = 0.15
        arrow_y.pose.orientation = self.resize_y.orientation
        self.resize_y.markers.append(arrow_y)
        self.resize_y_im.controls.append(self.resize_y)
        self.resize_y_server.insert(self.resize_y_im, self.process_resize_feedback)
        self.resize_y_server.applyChanges()

        # resize y
        self.resize_z_server = InteractiveMarkerServer("body_spawn/resize_z")
        self.resize_z_im = InteractiveMarker()
        self.resize_z_im.header.frame_id = self.spawn_frame
        self.resize_z_im.name = "body_spawner_resize_z"
        self.resize_z_im.description = "resize z of new body"

        self.resize_z = InteractiveMarkerControl()
        self.resize_z.interaction_mode = InteractiveMarkerControl.MOVE_AXIS
        self.resize_z.name = "resize_z"
        self.resize_z.orientation.w = 1
        self.resize_z.orientation.x = 0
        self.resize_z.orientation.y = 1
        self.resize_z.orientation.z = 0

        arrow_z = copy.deepcopy(arrow)
        arrow_z.color.r = 0.2
        arrow_z.color.g = 0.04
        arrow_z.color.b = 1.0
        arrow_z.pose.orientation = self.resize_z.orientation
        self.resize_z.markers.append(arrow_z)
        self.resize_z_im.controls.append(self.resize_z)
        self.resize_z_server.insert(self.resize_z_im, self.process_resize_feedback)
        self.resize_z_server.applyChanges()

        # add linear impulse
        self.linear_vel_server = InteractiveMarkerServer("body_spawn/linear_vel")
        self.linear_vel_im = InteractiveMarker()
        self.linear_vel_im.header.frame_id = self.spawn_frame
        self.linear_vel_im.name = "body_spawner_linear_vel"
        self.linear_vel_im.description = "add impulse to body"

        self.linear_vel_pt = [0, 0, 0, 0]
        self.linear_vel_control = InteractiveMarkerControl()
        self.linear_vel_control.interaction_mode = InteractiveMarkerControl.MOVE_3D
        self.linear_vel_control.name = "linear_vel"
        self.linear_vel_control.orientation.w = 1
        self.linear_vel_control.orientation.x = 0
        self.linear_vel_control.orientation.y = 1
        self.linear_vel_control.orientation.z = 0

        box = Marker()
        box.header.frame_id = self.spawn_frame
        box.type = Marker.CUBE
        box.scale.x = 0.1
        box.scale.y = 0.1
        box.scale.z = 0.1
        box.color.r = 0.8
        box.color.g = 0.8
        box.color.b = 0.2
        box.color.a = 1.0
        box.frame_locked = True
        self.linear_vel_control.markers.append(box)

        self.linear_vel_im.controls.append(self.linear_vel_control)
        self.linear_vel_server.insert(self.linear_vel_im, self.process_vel_feedback)
        self.linear_vel_server.applyChanges()

        self.marker_pub = rospy.Publisher("/body_spawn/misc_markers", Marker, queue_size=1)
        self.linear_vel_marker = Marker()
        self.linear_vel_marker.header.frame_id = self.spawn_frame
        self.linear_vel_marker.type = Marker.LINE_LIST
        self.linear_vel_marker.scale.x = 0.07
        self.linear_vel_marker.scale.y = 0.07
        self.linear_vel_marker.scale.z = 0.07
        self.linear_vel_marker.color.r = 0.8
        self.linear_vel_marker.color.g = 0.8
        self.linear_vel_marker.color.b = 0.2
        self.linear_vel_marker.color.a = 1.0
        self.linear_vel_marker.frame_locked = True
        pt = Point()
        self.linear_vel_marker.points.append(pt)
        pt = Point()
        self.linear_vel_marker.points.append(pt)
        self.marker_pub.publish(self.linear_vel_marker)
Beispiel #18
0
    def __init__(self, yaml_config_file="turtlebot3_world_mapping.yaml"):
        """
        This Task Env is designed for having two TurtleBot3 robots in the turtlebot3 world closed room with columns.

        It will learn how to move around without crashing.
        """
        # This is the path where the simulation files, the Task and the Robot gits will be downloaded if not there
        ros_ws_abspath = rospy.get_param("/turtlebot3/ros_ws_abspath", None)
        if os.environ.get('ROS_WS') != None:
            ros_ws_abspath = os.environ.get('ROS_WS')

        assert ros_ws_abspath is not None, "You forgot to set ros_ws_abspath in your yaml file of your main RL script. Set ros_ws_abspath: \'YOUR/SIM_WS/PATH\'"
        assert os.path.exists(ros_ws_abspath), "The Simulation ROS Workspace path " + ros_ws_abspath + \
                                               " DOESNT exist, execute: mkdir -p " + ros_ws_abspath + \
                                               "/src;cd " + ros_ws_abspath + ";catkin_make"

        # Load Params from the desired Yaml file
        LoadYamlFileParamsTest(rospackage_name="openai_ros",
                               rel_path_from_package_to_file="src/openai_ros/task_envs/turtlebot3_my_envs/config",
                               yaml_file_name=yaml_config_file)


        # Depending on which environment we're in, decide to launch Gazebo with or without GUI.
        gazebo_launch_file = "start_empty_tb3_world.launch"

        if os.environ.get('ENV') == 'deploy' or os.environ.get('ENV') == 'dev-no-gazebo':
            gazebo_launch_file = "start_empty_tb3_world_no_gui.launch"

        ROSLauncher(rospackage_name="coop_mapping",
                    launch_file_name=gazebo_launch_file,
                    ros_ws_abspath=ros_ws_abspath)

        # Here we will add any init functions prior to starting the MyRobotEnv
        super(TurtleBot3WorldMapping2RobotsEnv, self).__init__(ros_ws_abspath,
                                                               ros_launch_file_package="coop_mapping",
                                                               ros_launch_file_name="spawn_2_robots.launch")

        ### ACTIONS
        # Only variable needed to be set here
        self.number_actions = rospy.get_param('/turtlebot3/n_actions')
        self.number_robots = len(self.robot_namespaces)  # should be 2

        # 3x3 possible actions (a % 3 -> robot 1 action, a / 3 -> robot 2 action)
        self.action_space = spaces.Discrete(
            pow(self.number_actions, self.number_robots))

        # We set the reward range, which is not compulsory but here we do it.
        self.reward_range = (-np.inf, np.inf)

        ### OBSERVATIONS
        self.linear_forward_speed = rospy.get_param(
            '/turtlebot3/linear_forward_speed')
        self.linear_turn_speed = rospy.get_param(
            '/turtlebot3/linear_turn_speed')
        self.angular_speed = rospy.get_param('/turtlebot3/angular_speed')
        self.init_linear_forward_speed = rospy.get_param(
            '/turtlebot3/init_linear_forward_speed')
        self.init_linear_turn_speed = rospy.get_param(
            '/turtlebot3/init_linear_turn_speed')

        self.new_ranges = rospy.get_param('/turtlebot3/new_ranges')
        self.min_range = rospy.get_param('/turtlebot3/min_range')
        self.max_laser_value = rospy.get_param('/turtlebot3/max_laser_value')
        self.min_laser_value = rospy.get_param('/turtlebot3/min_laser_value')

        """
        An observation is a MultiDiscrete element, with 4 components.
        
        1. LaserScan rays component with R integers, where R is the number of laser scan 
        rays we are using for observation (one for each robot).
            - Each value represents the distance to an obstacle rounded to the nearest integer (in meteres).
            
        2. Position information with 2 integers (x, y) (one for each robot).
            - Each value represents the position of the robot along a normalized axis, rouned to the nearest integer.

        3. Rotation information with 1 integer (rotation along the z axis) (one for each robot).
            - Each value represents the orientation in a normalized scale, rounded to the nearest integer.

        4. Simplified map exploration with NxN integers, where N is the dimension of the matrix 
        that portrays the level of exploration in the map (one for BOTH robots).
            - Each value represents the average number of pixels explored (-1 is unexplored, 1 is explored). 
            The value is normalized and then rounded to the nearest integer.
        """

        # We create two arrays based on the binary values that will be assigned
        # In the discretization method.
        laser_scan = self.laser_scan[self.robot_namespaces[0]]
        num_laser_readings = len(laser_scan.ranges)/self.new_ranges
        high = np.full((num_laser_readings), self.max_laser_value)
        low = np.full((num_laser_readings), self.min_laser_value)

        self.position_num_discrete_values = 40

        self.rotation_num_discrete_values = 6

        self.simplified_grid_dimension = 4
        self.simplified_grid_num_discrete_values = 40

        laser_scan_component_shape = [
            round(self.max_laser_value)] * (self.new_ranges * self.number_robots)

        position_component_shape = [
            self.position_num_discrete_values] * (2 * self.number_robots)

        rotation_component_shape = [
            self.rotation_num_discrete_values] * (1 * self.number_robots)

        map_exploration_component_shape = [
            self.simplified_grid_num_discrete_values] * self.simplified_grid_dimension * self.simplified_grid_dimension

        multi_discrete_shape = list(itertools.chain(laser_scan_component_shape,
                                                    position_component_shape,
                                                    rotation_component_shape,
                                                    map_exploration_component_shape))

        self.observation_space = spaces.MultiDiscrete(
            multi_discrete_shape)

        rospy.loginfo("ACTION SPACES TYPE===>"+str(self.action_space))
        rospy.loginfo("OBSERVATION SPACES TYPE===>" +
                      str(self.observation_space))

        # Rewards

        self.no_crash_reward_points = rospy.get_param(
            "/turtlebot3/no_crash_reward_points")
        self.crash_reward_points = rospy.get_param(
            "/turtlebot3/crash_reward_points")
        self.exploration_multi_factor = rospy.get_param(
            "/turtlebot3/exploration_multi_factor")

        self.cumulated_steps = 0.0

        # Init dictionary for both robots actions
        self.last_action = {}

        # Set the logging system
        rospack = rospkg.RosPack()
        pkg_path = rospack.get_path('coop_mapping')

        # Control variables for launching nodes from .launch files
        self._gmapping_launch_file = pkg_path + os.path.sep + \
            'launch' + os.path.sep + 'init_2_robots_mapping.launch'
        self._gmapping_running = False
        self._gmapping_launch = None

        self._map_merge_launch_file = pkg_path + os.path.sep + \
            'launch' + os.path.sep + 'init_2_robots_multi_map_merge.launch'
        self._map_merge_running = False
        self._map_merge_launch = None

        self._hector_saver_launch_file = pkg_path + os.path.sep + \
            'launch' + os.path.sep + 'init_2_robots_hector_saver.launch'
        self._hector_saver_running = False
        self._hector_saver_launch = None

        # Variables for map comparison
        self.map_data = None
        self._num_white_pixels_to_explore = get_number_of_almost_white_pixels(self.actual_map_file)

        # The minimum difference that has been observed
        self.current_min_map_difference = None

        # The thresholds to calculate map exploration
        self.threshold_occupied = 65
        self.threshold_free = 25

        # The area in pixels that has been explored
        self.previous_max_explored_area = None
        self.current_max_explored_area = None

        # Start subscriber to /map to save it to file
        self._map_file_name = "/tmp/ros_merge_map"
        self._map_updated_after_action = False
        rospy.Subscriber('map', OccupancyGrid, self._map_callback)

        # Logging episode information
        self._first_episode = True

        # TF listener to get robots position
        self.tf_buffer = tf2_ros.Buffer()
        self.tf_listener = tf2_ros.TransformListener(self.tf_buffer)
    def __init__(self, node_name):

        self.debug = False

        # Initialize DTROS Parent Class
        super(EncoderLocalization, self).__init__(node_name=node_name,
                                                  node_type=NodeType.GENERIC)

        self.veh_name = rospy.get_namespace().strip("/")
        self.log(f"Using vehicle name {self.veh_name}")

        # Get Baseline and Radius
        self.baseline, self.radius = self.get_calib_params()
        self.log(
            f'Parameters: baseline = {self.baseline}, radius = {self.radius}')

        # Initialize Encoder Variables
        self.encoder_received = False
        self.encoder_resolution = 135

        self.initialised_ticks_left = False
        self.total_ticks_left = 0
        self.initial_ticks_left = 0
        self.wheel_distance_left = 0.0

        self.initialised_ticks_right = False
        self.total_ticks_right = 0
        self.initial_ticks_right = 0
        self.wheel_distance_right = 0.0

        # Initialize Estimation Variables (in map reference frame)
        self.theta = np.pi
        self.x = 1.0
        self.y = 0.0

        # Initialize Transform Message
        self.transform_msg = TransformStamped()  #published in self.run()
        self.transform_msg.header.frame_id = "map"  #parent frame
        self.transform_msg.child_frame_id = "encoder_baselink"
        self.transform_msg.transform.translation.z = 0.0  # project to ground

        # Initialize TF Broadcaster
        self.broadcaster = tf2_ros.TransformBroadcaster()

        # Initialize TF Listener
        self.tfBuffer = tf2_ros.Buffer()
        self.listener = tf2_ros.TransformListener(self.tfBuffer)

        # Initialize Publishers
        pub_topic = f'/{self.veh_name}/encoder_localization/transform'
        self.pub_transform = rospy.Publisher(pub_topic,
                                             TransformStamped,
                                             queue_size=10)

        # Initialize Subscribers
        left_encoder_topic = f'/{self.veh_name}/left_wheel_encoder_node/tick'
        right_encoder_topic = f'/{self.veh_name}/right_wheel_encoder_node/tick'
        self.sub_encoder_ticks_left = rospy.Subscriber(
            left_encoder_topic,
            WheelEncoderStamped,
            self.cb_encoder_to_transform,
            callback_args="left")
        self.sub_encoder_ticks_right = rospy.Subscriber(
            right_encoder_topic,
            WheelEncoderStamped,
            self.cb_encoder_to_transform,
            callback_args="right")

        # Initialize Services
        self.serv_reset = rospy.Service(
            f'/{self.veh_name}/encoder_localization/reset', Trigger,
            self.reset)
        self.serv_update_map_frame = rospy.Service(
            f'/{self.veh_name}/encoder_localization/update_map_frame', Trigger,
            self.update_map_frame)

        # Broadcast and publish initial transform
        self.latest_timestamp = rospy.Time.now()
        self.update_transform()
        self.broadcaster.sendTransform(self.transform_msg)
        self.pub_transform.publish(self.transform_msg)

        self.log("Initialized.")
def main():
    # init node
    rospy.init_node("grasp_commander")

    # ========== publisher to jamming gripper ========== #
    grasp_pub = rospy.Publisher('/jamming_grasp', Int32, queue_size=1)
    
    # ========== Moveit init ========== #
    # moveit_commander init
    robot = moveit_commander.RobotCommander()
    arm = moveit_commander.MoveGroupCommander("arm")
    arm_initial_pose = arm.get_current_pose().pose
    target_pose = geometry_msgs.msg.Pose()

    # ========== TF Lister ========== #
    tf_buffer = tf2_ros.Buffer()
    tf_listner = tf2_ros.TransformListener(tf_buffer)
    get_tf_flg = False
    # Get target TF
    while not get_tf_flg :
        try :
            trans = tf_buffer.lookup_transform('world', 'ar_marker', rospy.Time(0),rospy.Duration(10))
            print "world -> ar_marker"
            print trans.transform
            print "Target Place & Pose"
            # Go to up from target
            target_pose.position.x = trans.transform.translation.x
            target_pose.position.y = trans.transform.translation.y + 0.03
            target_pose.position.z = trans.transform.translation.z + 0.42
            q = (trans.transform.rotation.x,
                 trans.transform.rotation.y,
                 trans.transform.rotation.z,
                 trans.transform.rotation.w)
            (roll,pitch,yaw) = tf.transformations.euler_from_quaternion(q)
            # roll -= math.pi/6.0
            pitch += math.pi/2.0
            # yaw += math.pi/4.0
            tar_q = tf.transformations.quaternion_from_euler(roll, pitch, yaw)
            target_pose.orientation.x = tar_q[0]
            target_pose.orientation.y = tar_q[1]
            target_pose.orientation.z = tar_q[2]
            target_pose.orientation.w = tar_q[3]
            print target_pose
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()
            # rospy.sleep(1)
            
            # Get Grasp
            # waypoints = []
            
            # waypoints.append(arm.get_current_pose().pose)

            # wpose = geometry_msgs.msg.Pose()
            # wpose.orientation.w = 1.0
            # wpose.position.x = waypoints[0].position.x
            # wpose.position.y = waypoints[0].position.y - 0.085
            # wpose.position.z = waypoints[0].position.z
            # waypoints.append(copy.deepcopy(wpose))
            # (plan, fraction) = arm.compute_cartesian_path(waypoints, 0.005, 0.0, False)

            
            target_pose.position.x = trans.transform.translation.x
            target_pose.position.y = trans.transform.translation.y + 0.03
            target_pose.position.z = trans.transform.translation.z + 0.283
            target_pose.orientation = target_pose.orientation
            print target_pose
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()

            # Grasp
            grasp_pub.publish(1)
            print "!! Grasping !!"
            rospy.sleep(1.0)

            # Start Return
            # waypoints = []
            
            # waypoints.append(arm.get_current_pose().pose)
            
            # wpose = geometry_msgs.msg.Pose()
            # wpose.orientation.w = 1.0
            # wpose.position.x = waypoints[0].position.x
            # wpose.position.y = waypoints[0].position.y + 0.085
            # wpose.position.z = waypoints[0].position.z
            # waypoints.append(copy.deepcopy(wpose))
            # (plan, fraction) = arm.compute_cartesian_path(waypoints, 0.005, 0.0, False)
            target_pose.position.x = trans.transform.translation.x
            target_pose.position.y = trans.transform.translation.y + 0.03
            target_pose.position.z = trans.transform.translation.z + 0.42
            target_pose.orientation = target_pose.orientation
            print target_pose
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()
            

            # Go to Home Position
            target_pose.position.x = trans.transform.translation.x
            target_pose.position.y = -trans.transform.translation.y
            target_pose.position.z = trans.transform.translation.z + 0.42
            target_pose.orientation = target_pose.orientation
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()

            
            target_pose.position.x = trans.transform.translation.x
            target_pose.position.y = -trans.transform.translation.y
            target_pose.position.z = trans.transform.translation.z + 0.30
            target_pose.orientation = target_pose.orientation
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()
            
            
            # Release
            print " !! Release !!"
            grasp_pub.publish(0)
            rospy.sleep(2)
            get_tf_flg = True

            target_pose.position.x = 0.503
            target_pose.position.y = 0
            target_pose.position.z = 0.6563
            target_pose.orientation.x = 0
            target_pose.orientation.y = 0
            target_pose.orientation.z = 0
            target_pose.orientation.w = 1
            arm.set_pose_target(target_pose)
            arm.go()
            arm.clear_pose_targets()
            
        except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) :
            continue
Beispiel #21
0
    def __init__(self):

        map_frame = rospy.get_param('~map_frame', 'map')  # map frame_id
        odom_frame = rospy.get_param('~odom_frame', 'odom')
        meas_model_as = rospy.get_param('~mbes_as',
                                        '/mbes_sim_server')  # map frame_id
        auv_odom_top = rospy.get_param("~odometry_topic", '/odom')
        auv_mbes_top = rospy.get_param("~mbes_pings_topic", '/mbes')
        auv_exp_mbes_top = rospy.get_param("~expected_mbes_topic",
                                           '/expected_mbes')
        pf_pose_top = rospy.get_param("~average_pose_topic", '/avg_pose')

        self.auv_mbes = message_filters.Subscriber(auv_mbes_top, PointCloud2)
        self.exp_mbes = message_filters.Subscriber(auv_exp_mbes_top,
                                                   PointCloud2)
        self.auv_pose = message_filters.Subscriber(auv_odom_top, Odometry)
        #  self.pf_pose = message_filters.Subscriber(pf_pose_top, PoseWithCovarianceStamped)
        self.ts = message_filters.ApproximateTimeSynchronizer(
            [self.auv_mbes, self.exp_mbes, self.auv_pose],
            10,
            slop=10.0,
            allow_headerless=False)

        # Initialize tf listener
        tfBuffer = tf2_ros.Buffer()
        tf2_ros.TransformListener(tfBuffer)
        try:
            rospy.loginfo("Waiting for transforms")
            mbes_tf = tfBuffer.lookup_transform('hugin/base_link',
                                                'hugin/mbes_link',
                                                rospy.Time(0),
                                                rospy.Duration(20.))
            self.base2mbes_mat = self.matrix_from_tf(mbes_tf)

            m2o_tf = tfBuffer.lookup_transform(map_frame, odom_frame,
                                               rospy.Time(0),
                                               rospy.Duration(20.))
            self.m2o_mat = self.matrix_from_tf(m2o_tf)

            rospy.loginfo("Transforms locked - Car detector node")
        except:
            rospy.loginfo(
                "ERROR: Could not lookup transform from base_link to mbes_link"
            )

        # Register cb after tf is locked
        self.ts.registerCallback(self.pingCB)

        plt.ion()
        plt.show()
        self.scale = 1
        self.max_height = 100  # TODO: this should equal the n beams in ping
        self.new_msg = False
        first_msg = True
        self.waterfall = []

        while not rospy.is_shutdown():
            if self.new_msg:
                # Blob detection to find the car on waterfall image
                #Visualize
                if len(self.waterfall) == self.max_height:
                    waterfall_detect = self.car_detection(
                        np.array(self.waterfall), self.scale)
                    plt.imshow(np.array(waterfall_detect),
                               norm=plt.Normalize(0., 60.),
                               cmap='gray',
                               aspect='equal')
                else:
                    plt.imshow(np.array(self.waterfall),
                               norm=plt.Normalize(0., 60.),
                               cmap='gray',
                               aspect='equal')
                if first_msg:
                    first_msg = False
                    plt.colorbar()
                    plt.title("Bathymetry difference (m)")

                plt.pause(0.01)

            self.new_msg = False
    def __init__(self):
        self.pose_cam_1_sub = message_filters.Subscriber(
            POSE_CAM_1_TOPIC, CustomMarkerArray)
        self.pose_cam_2_sub = message_filters.Subscriber(
            POSE_CAM_2_TOPIC, CustomMarkerArray)
        self.pose_cam_4_sub = message_filters.Subscriber(
            POSE_CAM_4_TOPIC, CustomMarkerArray)

        self.tfBuffer = tf2_ros.Buffer()
        self.listener = tf2_ros.TransformListener(self.tfBuffer)

        self.pub = rospy.Publisher(FUSION_POSES_TOPIC,
                                   MarkerArray,
                                   queue_size=10)

        self.check_cam_1_pub = rospy.Publisher(FUSION_CHECK_CAM_1_POSES_TOPIC,
                                               MarkerArray,
                                               queue_size=10)
        self.check_cam_2_pub = rospy.Publisher(FUSION_CHECK_CAM_2_POSES_TOPIC,
                                               MarkerArray,
                                               queue_size=10)
        self.check_cam_4_pub = rospy.Publisher(FUSION_CHECK_CAM_4_POSES_TOPIC,
                                               MarkerArray,
                                               queue_size=10)

        self.sync = message_filters.ApproximateTimeSynchronizer(
            [self.pose_cam_1_sub, self.pose_cam_2_sub, self.pose_cam_4_sub],
            10, 0.1)
        self.sync.registerCallback(self.poses_callback)

        self.occluded_points_cam_2 = [4, 6, 8]
        self.occluded_points_cam_4 = [3, 5, 7]
        # Kalman filter parameters
        f = KalmanFilter(dim_x=6, dim_z=3)
        self.keypoints = 13
        self.initialized = [False for k in range(self.keypoints)]
        self.dt = 1 / 15.0  #15 fps

        f.inv = np.linalg.pinv
        # State transition matrix
        f.F = np.array([[1., 0., 0., self.dt, 0., 0.],
                        [0., 1., 0., 0., self.dt, 0.],
                        [0., 0., 1., 0., 0., self.dt],
                        [0., 0., 0., 1., 0., 0.], [0., 0., 0., 0., 1., 0.],
                        [0., 0., 0., 0., 0., 1.]])
        # Measurement function
        f.H = np.array([[1., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0.],
                        [0., 0., 1., 0., 0., 0.]])
        # Process uncertainty/noise
        f.Q = np.identity(6) * 1e-4

        # Measurement uncertainty/noise
        self.min_cov = 0.0025
        self.max_cov = 0.04
        self.steepness = 20
        self.steep_point = 0.6
        f.R = np.identity(3) * (self.min_cov + self.max_cov) / 2
        f.R[2, 2] = 0.05

        # Distance threshold
        if USE_MAHALANOBIS:
            self.distance_threshold = 60
        else:
            self.distance_threshold = 0.4
        # Covariance matrix
        f.P = np.identity(6) * 100

        # Create the KalmanFilter array
        self.kf_array = [copy.deepcopy(f) for kp in range(self.keypoints)]

        # Last-update time array
        self.time_since_update = [time.time() for kp in range(self.keypoints)]

        self.time_threshold = 0.25  # in secs

        # Auxiliar variables (for visualization)
        self.cam_1_check_covariances = [
            np.zeros((3, 3)) for kp in range(self.keypoints)
        ]
        self.cam_2_check_covariances = [
            np.zeros((3, 3)) for kp in range(self.keypoints)
        ]
        self.cam_4_check_covariances = [
            np.zeros((3, 3)) for kp in range(self.keypoints)
        ]
Beispiel #23
0
 def setup(self):
     self.tfBuffer = tf2_ros.Buffer()
     self.tfListener = tf2_ros.TransformListener(self.tfBuffer)
    def __init__(self):
        action_ns = rospy.get_param('~action_ns', '')

        # Monitor manual control and cancel any actions if user presses any button
        joy_safety_topic = rospy.get_param('~joy_safety_topic', '/drone/joy')

        self.distance_threshold = rospy.get_param('~distance_threshold', 0.10)
        self.yaw_threshold = rospy.get_param('~yaw_threshold',
                                             math.pi / 180.0 * 10.0)

        self.robot_desired_pose_topic = rospy.get_param(
            '~robot_desired_pose_topic', 'desired_pose')
        robot_odom_topic = rospy.get_param('~robot_odom_topic', '/drone/odom')

        robot_state_topic = rospy.get_param('~robot_state_topic',
                                            '/drone/flight_state')

        takeoff_service = rospy.get_param('~takeoff_service',
                                          '/drone/safe_takeoff')
        land_service = rospy.get_param('~land_service', '/drone/safe_land')
        feedback_service = rospy.get_param('~feedback_service',
                                           '/drone/give_feedback')

        target_source_topic = rospy.get_param('~target_source_topic',
                                              '/drone/target_source')
        set_pose_topic = rospy.get_param('~set_pose_topic', '/drone/set_pose')
        set_xy_service = rospy.get_param('~set_xy_service', '/drone/set_xy')

        self.robot_desired_pose = PoseStamped()
        self.robot_current_pose = PoseStamped()

        self.tf_buff = tf2_ros.Buffer()
        self.tf_ls = tf2_ros.TransformListener(self.tf_buff)

        # Action client to self, see below
        self.goto_client = actionlib.SimpleActionClient(
            action_ns + '/goto_action', GoToAction)

        # Action servers
        self.goto_server = ActionHub.add_server(action_ns + '/goto_action',
                                                GoToAction, self.execute_goto,
                                                False)
        self.goto_server.start()
        # self.shape_server = ActionHub.add_server(action_ns + '/followshape_action', FollowShapeAction, self.execute_shape, False)
        # self.shape_server.start()
        self.precise_shape_server = ActionHub.add_server(
            action_ns + '/precise_shape_action', FollowShapeAction,
            self.execute_precise_shape, False)
        self.precise_shape_server.start()

        self.takeoff_server = ActionHub.add_server(
            action_ns + '/takeoff_action', EmptyAction, self.execute_takeoff,
            False)
        self.takeoff_server.start()
        self.land_server = ActionHub.add_server(action_ns + '/land_action',
                                                EmptyAction, self.execute_land,
                                                False)
        self.land_server.start()

        self.feedback_server = ActionHub.add_server(
            action_ns + '/feedback_action', EmptyAction, self.execute_feedback,
            False)
        self.feedback_server.start()

        self.followme_server = ActionHub.add_server(
            action_ns + '/followme_action', FollowMeAction,
            self.execute_followme, False)
        self.followme_server.start()

        self.waypoints_server = ActionHub.add_server(
            action_ns + '/waypoints_action', WaypointsAction,
            self.execute_waypoints, False)
        self.waypoints_server.start()

        self.reset_odom_server = ActionHub.add_server(
            action_ns + '/reset_odom_action', EmptyAction,
            self.execute_reset_odom, False)
        self.reset_odom_server.start()

        self.pub_desired_pose = rospy.Publisher(self.robot_desired_pose_topic,
                                                PoseStamped,
                                                queue_size=10)
        self.sub_odom = rospy.Subscriber(robot_odom_topic, Odometry,
                                         self.robot_odom_cb)

        self.takeoff_svc = rospy.ServiceProxy(takeoff_service,
                                              std_srvs.srv.Trigger)
        self.land_svc = rospy.ServiceProxy(land_service, std_srvs.srv.Trigger)
        self.feedback_svc = rospy.ServiceProxy(feedback_service,
                                               std_srvs.srv.Trigger)

        self.pub_target_source = rospy.Publisher(target_source_topic,
                                                 TargetSource,
                                                 queue_size=1)
        self.pub_set_pose = rospy.Publisher(set_pose_topic, Pose, queue_size=1)
        self.set_xy_service = rospy.ServiceProxy(set_xy_service, SetXY)

        self.last_known_flight_state = FlightState.Landed  #None
        self.sub_flight_state = rospy.Subscriber(robot_state_topic,
                                                 FlightState,
                                                 self.flight_state_cb)

        self.sub_joy_safety = rospy.Subscriber(joy_safety_topic, Joy,
                                               self.joy_safety_cb)

        # self.ros_thread = threading.Thread(target=self.run)
        # self.ros_thread.start()

        rospy.wait_for_service(takeoff_service)
        rospy.wait_for_service(land_service)
        rospy.wait_for_service(feedback_service)
#!/usr/bin/env python

import rospy
import math
from geometry_msgs.msg import Point,PointStamped,PoseStamped
from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
from actionlib_msgs.msg import *
import actionlib
import tf2_ros
import tf2_geometry_msgs
import utm

rospy.init_node('GPS_goals')

tf_buffer = tf2_ros.Buffer(rospy.Duration(10))
tf_listener = tf2_ros.TransformListener(tf_buffer)

client = actionlib.SimpleActionClient("move_base", MoveBaseAction)
client.wait_for_server()

gps_pub = rospy.Publisher('/GPS_odom_point', PointStamped, queue_size=10, latch=True)

utm_point = PointStamped()
utm_point.header.frame_id = "utm"
odom_point = PointStamped()

goal = MoveBaseGoal()
goal.target_pose.header.frame_id = "odom"
goal.target_pose.pose.orientation.x = 0
goal.target_pose.pose.orientation.y = 0
goal.target_pose.pose.orientation.z = 0
Beispiel #26
0
def main():
  global tfBuffer, tfListener, stepCounter
  global ROBOT_NAME, RIGHT_FOOT_FRAME_NAME, LEFT_FOOT_FRAME_NAME

  global web
  web = addasteppages.Pages()
  thread.start_new_thread(web.run, ())

  try:
    rospy.init_node('AddAStep')

    if not rospy.has_param('/ihmc_ros/robot_name'):
      rospy.logerr("Missing parameter '/ihmc_ros/robot_name'")
    else:
      ROBOT_NAME = rospy.get_param('/ihmc_ros/robot_name')
      right_foot_frame_parameter_name = "/ihmc_ros/{0}/right_foot_frame_name".format(ROBOT_NAME)
      left_foot_frame_parameter_name = "/ihmc_ros/{0}/left_foot_frame_name".format(ROBOT_NAME)
      fss_name = "/ihmc_ros/{0}/output/footstep_status".format(ROBOT_NAME)
      fsp_name = "/ihmc_ros/{0}/control/footstep_list".format(ROBOT_NAME)
      atp_name = "/ihmc_ros/{0}/control/arm_trajectory".format(ROBOT_NAME)
      ctp_name = "/ihmc_ros/{0}/control/chest_trajectory".format(ROBOT_NAME)
      pose_name = "/ihmc_ros/{0}/output/robot_pose".format(ROBOT_NAME)

    if rospy.has_param(right_foot_frame_parameter_name) and rospy.has_param(left_foot_frame_parameter_name):
      RIGHT_FOOT_FRAME_NAME = rospy.get_param(right_foot_frame_parameter_name)
      LEFT_FOOT_FRAME_NAME = rospy.get_param(left_foot_frame_parameter_name)

    footStepStatusSubscriber = rospy.Subscriber( fss_name, FootstepStatusRosMessage, recievedFootStepStatus)
    robotPoseSubscriber = rospy.Subscriber( pose_name, Odometry, recievedRobotPose )
    footStepListPublisher = rospy.Publisher( fsp_name, FootstepDataListRosMessage, queue_size=1)
    armTrajectoryPublisher = rospy.Publisher( atp_name, ArmTrajectoryRosMessage, queue_size=1)
    chestTrajectoryPublisher = rospy.Publisher( ctp_name, ChestTrajectoryRosMessage, queue_size=1)

    tfBuffer = tf2_ros.Buffer()
    tfListener = tf2_ros.TransformListener(tfBuffer)

    rate = rospy.Rate(10) # 10hz
    time.sleep(1)

    # make sure the simulation is running otherwise wait
    if footStepListPublisher.get_num_connections() == 0:
      rospy.loginfo('waiting for subsciber...')
      while footStepListPublisher.get_num_connections() == 0:
        rate.sleep()

    stepCounter = 0
    backsent = armsent = footsent = False
    backnote = armnote = footnote = 'Wait '
    while not rospy.is_shutdown():
      done, curtim = monitor()
      print(backnote,footnote,armnote)
      if curtim > 28.0 and not backsent:
        footStepMsg,backnote = createBackStepCmd()
        footStepListPublisher.publish(footStepMsg)
        backsent = True
        print('\a')
      if curtim > 35.0 and not armsent:
        footStepMsg,footnote = createFootStepCmd()
        armMsgL, armMsgR, armnote = createArmCmd()
        armTrajectoryPublisher.publish(armMsgL)
        rospy.sleep(rospy.Duration(0,10000000))
        armTrajectoryPublisher.publish(armMsgR)
        chestMsg, _ = createChestCmd()
        chestTrajectoryPublisher.publish(chestMsg)
        #armTrajectoryPublisher.publish(armMsgR)
        armsent = True
        print('\a')
      if curtim > 40.0 and not footsent:
        footStepListPublisher.publish(footStepMsg)
        footsent = True
        print('\a')
        print('\a')
      if (done):
        print('\a')
        print('\a')
        return
      rate.sleep()

  except rospy.ROSInterruptException:
        pass
import tf2_geometry_msgs

import tf2_ros

moveit_commander.roscpp_initialize(sys.argv)

rospy.init_node('points_to_xyz_with_moveit_node')

robot = moveit_commander.RobotCommander()

scene = moveit_commander.PlanningSceneInterface()

group = moveit_commander.MoveGroupCommander("manipulator")

tf_buffer = tf2_ros.Buffer(rospy.Duration(1200.0))  # tf buffer length
tf_listener = tf2_ros.TransformListener(tf_buffer)

display_trajectory_publisher = rospy.Publisher(
    '/move_group/display_planned_path',
    moveit_msgs.msg.DisplayTrajectory,
    queue_size=20)

rospy.sleep(1)

group.set_planning_time(10)

group.set_joint_value_target([0, 0, 0, 0, -pi / 2, 0])

group.go()
Beispiel #28
0
    def __init__(self):
        rospy.init_node("logger", anonymous=True)

        # if true -> show plots on shutdown
        self.show_plots = rospy.get_param("~show_plots", False)
        # if true -> save data with the start time in the name
        self.track_time = rospy.get_param("~track_time", False)
        # path to the output data folder
        self.module_path = rospy.get_param("~output_file")
        # output folder name
        self.output_folder = rospy.get_param("~output_folder")

        self.parent_frame = rospy.get_param("~parent_frame", 'odom')
        self.robot_frame = rospy.get_param("~robot_frame", 'base_link')
        self.kinetic_model_frame = rospy.get_param("~kinetic_model_frame",
                                                   'model_link')
        self.nn_model_frame = rospy.get_param("~nn_model_frame",
                                              'nn_model_link')

        self.timeout = int(rospy.get_param("~timeout", 0))

        self.module_path = self.module_path + self.output_folder
        if self.track_time:
            self.module_path += '/' + str(
                datetime.now().strftime('%Y-%m-%d-%H:%M:%S'))

        # declare tf buffer and listener for working with TF transformations
        self.tf_buffer = tf2_ros.Buffer()
        self.tf_listener = tf2_ros.TransformListener(self.tf_buffer)

        # node init time
        self.init_time = None
        #
        self.prev_time = None
        # flag for the first callback (used in Tf callback)
        self.first_tick = True
        self.fisrt_fill_state = True
        # container for trajectory (/path) fron path_publisher node
        self.trajectory = {'x': [], 'y': []}
        # container for /cmd_vel (input control) from path_follower node
        self.control = {'x': [], 'yaw': []}
        # container for robot state
        self.robot_state = {'x': [], 'y': [], 'yaw': [], 'v': [], 'w': []}
        # container for kinetic model state
        self.kinetic_model_state = {
            'x': [],
            'y': [],
            'yaw': [],
            'v': [],
            'w': []
        }
        # container for nn model state
        self.nn_model_state = {'x': [], 'y': [], 'yaw': [], 'v': [], 'w': []}
        # time spent running the simulator (for automated tests)
        self.delta_time = {'dt': []}
        self.time = {'t': []}
        self.time_spent = 0
        self.current_control = list()
        # declare subscribers
        self.trajectory_sub = rospy.Subscriber("/path", Path,
                                               self.path_callback)
        self.control_sub = rospy.Subscriber('/cmd_vel', Twist,
                                            self.cmd_vel_callback)
        # self.timer_ = rospy.Timer(rospy.Duration(0.033), self.timer_callback)
        self.tf_sub = rospy.Subscriber('/tf', Twist, self.tf_callback)
        if self.timeout > 0:
            rospy.Timer(rospy.Duration(1), self.timeout_callback)

        # set the function that will be executed when shutdown
        rospy.on_shutdown(self.on_shutdown)
#!/usr/bin/env python
import math
import rospy
from clever import srv
from mavros_msgs.srv import CommandBool
from std_srvs.srv import Trigger
from geometry_msgs.msg import Point, PoseStamped, Quaternion, TransformStamped
from tf.transformations import quaternion_from_euler, euler_from_quaternion, quaternion_multiply
import tf2_ros

rospy.init_node('cow_despasturer_helper')

tfBuffer = tf2_ros.Buffer()
listener = tf2_ros.TransformListener(tfBuffer)
rate = rospy.Rate(10.0)
aruco_frame = 'aruco_0'
frame = 'map'

destination_pose = rospy.Publisher('~/destination_pose',
                                   PoseStamped,
                                   queue_size=40)
pose = PoseStamped()
pose.header.frame_id = "map"
trans = TransformStamped()
trans2 = TransformStamped()
trans3 = TransformStamped()
#trans.header.frame_id = "map"
broadcaster = tf2_ros.TransformBroadcaster()
static_bloadcaster = tf2_ros.StaticTransformBroadcaster()

while not rospy.is_shutdown():
Beispiel #30
0
    def __init__(self, init_trans, update_freq):
        rospy.Subscriber('aruco/markers', MarkerArray, self.update_callback)
        rospy.Subscriber('sign_pose', MarkerArray, self.update_callback)
        #rospy.Subscriber('marker_measurements', MarkerArray, self.update_callback)

        rospy.Subscriber("cf1/pose", PoseStamped, self.cf1_pose_callback)
        rospy.Subscriber("cf1/velocity", TwistStamped, self.cf1_vel_callback)
        self.cf1_pose_cov_pub = rospy.Publisher("cf1/localizatiton/pose_cov",
                                                PoseWithCovarianceStamped,
                                                queue_size=1)

        init_trans.header.frame_id = "map"
        init_trans.child_frame_id = "cf1/odom"
        self.init_trans = init_trans  # remove?
        self.last_transform = init_trans

        self.cf1_pose = None
        self.cf1_vel = None

        self.old_msg = None
        self.measurement_msg = None
        # what translation/rotation variables to use in filtering
        self.filter_config = rospy.get_param("localization/measurement_config")

        self.tf_buf = tf2_ros.Buffer()
        self.tf_lstn = tf2_ros.TransformListener(
            self.tf_buf, queue_size=1)  # should there be a queue_size?
        self.broadcaster = tf2_ros.TransformBroadcaster()
        self.static_broadcaster = tf2_ros.StaticTransformBroadcaster()

        self.update_freq = update_freq
        self.kf = KalmanFilter(
            initial_cov=np.diag(rospy.get_param("localization/initial_cov")),
            R=np.diag(rospy.get_param("localization/process_noise")),
            maha_dist_thres=rospy.get_param("localization/maha_dist_thres"),
            cov_norm_thres=rospy.get_param("localization/cov_norm_thres"),
            delta_t=1.0 / self.update_freq)

        self.maha_dist_thres = rospy.get_param("localization/maha_dist_thres")
        self.cov_norm_thres = rospy.get_param("localization/cov_norm_thres")

        self.converged_pub = rospy.Publisher("cf1/localization/converged",
                                             Bool,
                                             queue_size=1)
        self.measurement_fb_pub = rospy.Publisher(
            "cf1/localization/measurement_feedback",
            Int32MultiArray,
            queue_size=1)

        self.odom_new_pub = rospy.Publisher("cf1/pose/odom_new",
                                            PoseStamped,
                                            queue_size=1)
        self.believed_pub = rospy.Publisher("cf1/pose/believed",
                                            PoseStamped,
                                            queue_size=1)
        self.measured_valid_pub = rospy.Publisher("cf1/pose/measured_valid",
                                                  PoseArray,
                                                  queue_size=1)
        self.measured_invalid_pub = rospy.Publisher(
            "cf1/pose/measured_invalid", PoseArray, queue_size=1)
        self.filtered_pub = rospy.Publisher("cf1/pose/filtered",
                                            PoseStamped,
                                            queue_size=1)

        rospy.Service("cf1/localization/reset_kalman_filter",
                      ResetKalmanFilter, self.reset_kalman_filter)