Esempio n. 1
0
  def run(self):

    counter = 0;

    # set default Q and mu values to eye(6) and zero
    Q = np.eye(6)
    mu = np.zeros(6)

    # Initial sensor calibration
    Q, mu = self.calibrateSensors()

    # Initialize Kalman filter
    self.P_lin = np.diag([1.,0.,1.,0.])*pow(self.initial_position_uncertainty,2)
    self.Q_lin = self.G_lin.dot(Q[:2,:2]).dot(self.G_lin.T)
    self.P_ang = pow(self.initial_orientation_uncertainty,2)
    self.Q_ang = self.G_ang*Q[5,5]*self.G_ang
    self.R_lin = np.eye(2)*self.camera_position_error
    self.R_ang = self.camera_orientation_error
    self.acc_bias = mu[:2]
    self.gyro_bias = mu[5]
    self.x_lin = np.array([self.z.translation.x, self.z.translation.y])
    self.v_lin = np.array([0.,0.])
    self.psi = 2*np.arccos(self.z.rotation.w)*np.sign(self.z.rotation.z) # Assume we have a quaternion with vertical axis

    # Run Kalman filter
    while not rospy.is_shutdown():
      # Obtain IMU measurement
      rospy.wait_for_service('last_imu')
      try:
        get_imu = rospy.ServiceProxy('last_imu', ImuSrv)
        self.u = get_imu()
      except rospy.ServiceException, e:
        #print "Service call to IMU Server failed: %s"%e
        print "No IMU update this time step"
        # Assume previous measured u (Zero-Order Hold)

      # Perform time and measurement updates as appropriate
      self.timeUpdate(self.u)
      if self.updateFlag:
        self.measurementUpdate(self.z)

      # Publish state estimate in topic
      state = Transform()
      state.translation.x = self.x_lin[0]
      state.translation.y = self.x_lin[1]
      state.rotation.z = 1 
      state.rotation.w = self.psi # Quaternion form
      self.state_pub.publish(state)

      state_tf = TFMessage()
      state_tf.transforms = [TransformStamped()]
      state_tf.transforms[0].header.seq = counter
      state_tf.transforms[0].header.frame_id = self.origin_tag
      state_tf.transforms[0].child_frame_id = self.mname
      state_tf.transforms[0].transform = state
      self.state_pub_tf.publish(state_tf)

      counter = counter + 1
            # Finish cycle and loop
      self.rate.sleep()
Esempio n. 2
0
def tf_listener():
    global all_static_transforms
    rospy.init_node('static_tf2_listener', anonymous=True)
    sub = rospy.Subscriber("tf_static", TFMessage, tf_msg_callback)
    pub = rospy.Publisher('tf_static', TFMessage, latch=True, queue_size=1)

    # check what transforms we've heart
    while not rospy.is_shutdown():
        print("Num. of TFs received so far: " +
              str(len(all_static_transforms)))
        control_char = raw_input(
            "c: clear, p: publish latched (and un-suscribe), q: quit: ")

        if control_char == "c":
            all_static_transforms = []

        elif control_char == "p":
            sub.unregister()
            time.sleep(2)
            newTFMessage = TFMessage()
            newTFMessage.transforms = all_static_transforms
            pub.publish(newTFMessage)
            print(
                "Publishing the latched tf_static thing and waiting for the final CTRL+C..."
            )
            break

        elif control_char == "q":
            return

        else:
            print("Input c, p, or q. Not " + control_char + ". Facepalm.")

    rospy.spin()
    def drone_att_callback(self, rcv):
        print("POSE: " + str(rcv))
        self.lastPose = rcv

        rcv.x *= math.pi / 180.0
        rcv.y *= math.pi / 180.0
        rcv.z *= math.pi / 180.0

        # Publish pose for rviz
        msg = TransformStamped()
        msg.header.frame_id = "/map"
        msg.header.stamp = Clock().now().to_msg()
        msg.child_frame_id = "/base_footprint_drone_attitude"

        quat = self.euler_to_quaternion(rcv.y, rcv.x, rcv.z)
        orientation = Quaternion()
        orientation.x = quat[0]
        orientation.y = quat[1]
        orientation.z = quat[2]
        orientation.w = quat[3]
        msg.transform.rotation = orientation
        tfmsg = TFMessage()
        tfmsg.transforms = [msg]
        self.pub_tf.publish(tfmsg)

        # Publish velocity
        msg = Twist()
        msg.linear.x = rcv.x
        msg.angular.z = rcv.y
        self.pub_vel.publish(msg)
  def save_known_poses(self, req):
    print self.known_poses.values()
    with rosbag.Bag('bundle.bag','w') as bag:
      tf_msg = TFMessage()
      tf_msg.transforms = self.known_poses.values()
      bag.write('/tf',tf_msg,rospy.Time.now())
      bag.close()

    return SaveKnownPosesResponse()
 def tf_timer_callback(self):
     msg = TransformStamped()
     msg.header.frame_id = "/map"
     msg.header.stamp = Clock().now().to_msg()
     msg.child_frame_id = "/base_footprint"
     msg.transform.translation = self.last_position
     msg.transform.rotation = self.last_orientation
     tfmsg = TFMessage()
     tfmsg.transforms = [msg]
     self.pub_tf.publish(tfmsg)
Esempio n. 6
0
    def get_tfmessage(self, sample, current_pose=None, next_pose=None):
        # get transforms for the current sample
        tf_array = TFMessage()
        tf_array.transforms = self.get_tfs(sample, current_pose)

        # add transforms from the next sample to enable interpolation
        next_sample = self.nusc.get(
            'sample', sample['next']) if sample.get('next') != '' else None
        if next_sample is not None:
            tf_array.transforms += self.get_tfs(next_sample, next_pose)

        return tf_array
def callback(pub, odom, robot, data):
    da_tf = TFMessage()
    base_transform = TransformStamped()
    base_transform.header.stamp = rospy.get_rostime()
    base_transform.header.frame_id = odom
    base_transform.child_frame_id = robot
    base_transform.transform.translation.x = data.pose.position.x
    base_transform.transform.translation.y = data.pose.position.y
    base_transform.transform.translation.z = data.pose.position.z
    # Some weird things happening with rotations in Unity, so do some rearrangement
    base_transform.transform.rotation.x = data.pose.orientation.y
    base_transform.transform.rotation.y = data.pose.orientation.x
    base_transform.transform.rotation.z = data.pose.orientation.z
    base_transform.transform.rotation.w = -data.pose.orientation.w
    da_tf.transforms = [base_transform]
    pub.publish(da_tf)
    def drone_odom_callback(self, rcv):
        print("ODOM: " + str(rcv))

        # Publish pose for rviz
        msg = TransformStamped()
        msg.header.frame_id = "/map"
        msg.header.stamp = Clock().now().to_msg()
        msg.child_frame_id = "/base_footprint_drone"

        quat = self.euler_to_quaternion(self.lastPose.x, self.lastPose.y,
                                        self.lastPose.z)
        orientation = Quaternion()
        orientation.x = quat[0]
        orientation.y = quat[1]
        orientation.z = quat[2]
        orientation.w = quat[3]
        msg.transform.rotation = orientation

        position = Vector3()
        position.x = rcv.x
        position.y = rcv.y
        position.z = rcv.z
        msg.transform.translation = position

        tfmsg = TFMessage()
        tfmsg.transforms = [msg]
        self.pub_tf.publish(tfmsg)

        # Publish Rviz Path
        msgpath = Path()
        msgpath.header.frame_id = "/map"
        msgpath.header.stamp = Clock().now().to_msg()

        pose = PoseStamped()
        pose.header.frame_id = "/map"
        pose.header.stamp = Clock().now().to_msg()

        pose.pose.position.x = rcv.x
        pose.pose.position.y = rcv.y
        pose.pose.position.z = rcv.z

        self.posearray.append(pose)
        if len(self.posearray) > 50:
            self.posearray = self.posearray[1:]

        msgpath.poses = self.posearray
        self.pub_posearray.publish(msgpath)
Esempio n. 9
0
    def base_info_cb(self, msg):
        self._odom.header.stamp = msg.stamp
        self._odom.pose.pose.position.x = msg.x
        self._odom.pose.pose.position.y = msg.y
        self._odom.pose.pose.orientation.z = math.sin(msg.orientation / 2.0)
        self._odom.pose.pose.orientation.w = math.cos(msg.orientation / 2.0)
        self._odom.twist.twist.linear.x = msg.forward_velocity
        self._odom.twist.twist.angular.z = msg.rotational_velocity
        self.pub_odom.publish(self._odom)

        self._transform.header.stamp = msg.stamp
        pos = self._odom.pose.pose.position
        self._transform.transform.translation = Vector3(x=pos.x,
                                                        y=pos.y,
                                                        z=pos.z)
        self._transform.transform.rotation = self._odom.pose.pose.orientation
        tfmsg = TFMessage()
        tfmsg.transforms = [self._transform]
        self.pub_tf.publish(tfmsg)
Esempio n. 10
0
    def tf_static_cb(self, tf_msg):
        """Callback for messages from /tf_static.
        Add all transforms to the cache and then publish a TF message with all the transforms.
        :param TFMessage tf_msg: A /tf_static message.
        """

        # Protect against reacting to this node's own published messages, otherwise it'd end up in an infinite loop.
        callerid = tf_msg._connection_header['callerid']
        if callerid == rospy.get_name() or \
                (self._forbidden_callerid_prefix is not None and callerid.startswith(self._forbidden_callerid_prefix)):
            return

        # Process the incoming transforms, merge them with our cache.
        for transform in tf_msg.transforms:
            key = transform.child_frame_id
            if key not in self._transforms or not self._update_only_with_newer or \
                    self._transforms[key].header.stamp < transform.header.stamp:
                rospy.logdebug("Updated transform %s->%s. Old timestamp was %s, new timestamp is %s." % (
                    transform.header.frame_id, transform.child_frame_id,
                    str(self._transforms[key].header.stamp if key in self._transforms else "None"),
                    str(transform.header.stamp)))

                self._transforms[key] = transform

        # Publish the cached messages.
        msg = TFMessage()
        msg.transforms = self._transforms.values()
        self._tf_publisher.publish(msg)

        rospy.logdebug("Sent %i transforms: %s" % (len(self._transforms), str(self._transforms.keys())))

        # After publishing the first message, send also this ~/ready message, so that nodes that rely on this node's
        # operation know that it has been brought up.
        if not self._ready:
            self._ready = True
            ready_msg = Bool()
            ready_msg.data = True
            self._ready_publisher.publish(ready_msg)
            rospy.logdebug("Sent ready message")
Esempio n. 11
0
def main(args=None):
    rclpy.init(args=args)

    node = rclpy.create_node("tf2_example_pub")

    pub = node.create_publisher(TFMessage, "/tf")

    t1 = TransformStamped()
    t1.header.frame_id = "base_link"
    t1.child_frame_id = "arm1"
    t2 = TransformStamped()
    t2.header.frame_id = "base_link"
    t2.child_frame_id = "arm2"

    msg = TFMessage()
    msg.transforms = [t1, t2]

    while rclpy.ok():
        pub.publish(msg)
        sleep(0.9)

    node.destroy_node()
    rclpy.shutdown()
    q = euler_to_quaternion(euler)


    

    rate = rospy.Rate(10)
    for i in range(len(path)):
        tf_msg = TFMessage()
        tf_stamp = TransformStamped()
        tf_stamp.header.stamp = rospy.Time.now()
        tf_stamp.header.frame_id = 'map'
        tf_stamp.child_frame_id = 'load_base_link'
        tf_stamp.transform.rotation.w = 1
        tf_stamp.transform.translation = path[i].pose.position
        tf_stamp.transform.rotation.x = q[i,0]
        tf_stamp.transform.rotation.y = q[i,1]
        tf_stamp.transform.rotation.z = q[i,2]
        tf_stamp.transform.rotation.w = q[i,3]





        tf_msg.transforms = [tf_stamp]

        tf_pub.publish(tf_msg)


        rate.sleep()
Esempio n. 13
0
    avg_tf = TransformStamped()
    avg_tf.header.frame_id = tf_group[0].header.frame_id
    avg_tf.child_frame_id = tf_group[0].child_frame_id
    avg_tf.transform = numpy_to_tf_msg(avg_trans, avg_rot)

    avgs.append(avg_tf)
  
  return avgs

# Pass bagfile name as first argument
if __name__ == '__main__':
  tf_groups = get_tf_groups(sys.argv[1])
  avgs = avg_transforms(tf_groups)
  
  """
  for tfg, avg in zip(tf_groups,avgs):
    print '%d transforms from \'%s\' to \'%s\'' % (
      len(tfg), tfg[0].header.frame_id, tfg[0].child_frame_id
    )
    print 'Average Transform:'
    print avg.transform
  """
  
  if len(sys.argv) > 2:
    with rosbag.Bag(sys.argv[2],'w') as outbag:
      tf_msg = TFMessage()
      tf_msg.transforms = avgs
      outbag.write("/tf", tf_msg, rospy.Time.from_sec(time.time()))
      outbag.close()
 def drone_tf_callback(self, tf):
     # Wrap and publish TF
     tfmsg = TFMessage()
     tfmsg.transforms = [tf]
     self.pub_tf.publish(tfmsg)
Esempio n. 15
0
  def run(self):

    counter = 0;

    # set default Q and mu values to eye(6) and zero
    Q = np.eye(6)
    mu = np.zeros(6)

    # Initial sensor calibration
    Q, mu = self.calibrateSensors()

    # Initialize Kalman filter
    self.P_lin = np.diag([1.,0.,1.,0.])*pow(self.initial_position_uncertainty,2)
    self.Q_lin = self.G_lin.dot(Q[:2,:2]).dot(self.G_lin.T)
    self.P_ang = pow(self.initial_orientation_uncertainty,2)
    self.Q_ang = self.G_ang*Q[5,5]*self.G_ang
    self.R_lin = np.eye(2)*pow(self.camera_position_error,2)
    self.R_ang = pow(self.camera_orientation_error,2)
    self.acc_bias = mu[:2]
    self.gyro_bias = mu[5]
    self.x_lin = np.array([self.z.translation.x, self.z.translation.y])
    self.z_position = 0.
    self.v_lin = np.array([0.,0.])
    self.psi = 2*np.arccos(self.z.rotation.w)*np.sign(self.z.rotation.z) # Assume we have a quaternion with vertical axis

    # Run Kalman filter
    while not rospy.is_shutdown() and not self.needs_to_calibrate:
      # Obtain IMU measurement
      rospy.wait_for_service('last_imu')
      try:
        get_imu = rospy.ServiceProxy('last_imu', ImuSrv)
        self.u = get_imu()
        # update bias estimate for accelerometer IMU update this time step: 1, trying aga
        self.updateAccelBias()
      except rospy.ServiceException, e:
        #print "Service call to IMU Server failed: %s"%e
        print "No IMU update this time step"
        # Only runs if self.u is unitialized
        while not self.u:
            try:
                self.u = get_imu()
            except:
                print 'Trying to initialize'
        # Assume previous measured u (Zero-Order Hold)

      # Perform time and measurement updates as appropriate
      self.timeUpdate(self.u)
      if self.updateFlag:
        self.measurementUpdate(self.z)

      # Publish state estimate in topic
      state = Transform()
      state.translation.x = self.x_lin[0]
      state.translation.y = self.x_lin[1]
      state.translation.z = self.z_position
      state.rotation.z = np.sin(self.psi/2)
      state.rotation.w = np.cos(self.psi/2) # Quaternion form
      self.state_pub.publish(state)
      self.psi_pub.publish(self.psi)

      state_tf = TFMessage()
      state_tf.transforms = [TransformStamped()]
      state_tf.transforms[0].header.seq = counter
      state_tf.transforms[0].header.frame_id = self.origin_tag
      state_tf.transforms[0].child_frame_id = self.mname
      state_tf.transforms[0].transform = state
      self.state_pub_tf.publish(state_tf)

      counter = counter + 1
      # Finish cycle and loop
      self.rate.sleep()
Esempio n. 16
0
    """
    out = TransformStamped()
    out.header.frame_id = parent_frame
    out.child_frame_id = child_frame
    # some random data
    out.transform.rotation.w = 1
    out.transform.translation.x = 0.1

    return out


if __name__ == '__main__':
    rospy.init_node("publisher")
    # setup some static transforms

    pub = rospy.Publisher("/tf", TFMessage, queue_size=10)
    msg = TFMessage()

    delay = rospy.Duration(rospy.get_param("delay", 0.0))
    source = rospy.get_param("source", 3)
    msg.transforms = [
        make_transform(str(ii), str(ii + 1)) for ii in range(source)
    ]

    while not rospy.is_shutdown():
        rospy.sleep(rospy.Duration(0.05))
        for m in msg.transforms:
            m.header.stamp = rospy.Time.now() - delay

        pub.publish(msg)