Example #1
0
    def __init__ (self, logs):
        self.sols, self.rnodes = [], []
        self.utime = None

        self.nodes = []
        self.index = {}
        self.node_utime = []

        self._Ns = 2

        self._rows, self._cols, self._data = [],[],[]
        self._vector = []

        self.x = None
        self.cov = None

        self.nlogs = len (logs)
        self.lcmlogs = logs

        # find server node ids for range events---client log is 0th
        rfactors = [isam2_f_pose_pose_partial_t.decode (e.data) for e in logs[0] if e.channel=='F_RANGE2D']
        #rfactors = [isam2_f_glc_t.decode (e.data) for e in logs[0] if e.channel=='F_DS2D']
        logs[0].seek (0)
        self.range_ids = [f.node_id2 for f in rfactors]
        #self.range_ids = [f.node_id[1] for f in rfactors]
        self.rid = 0

        self.ids = {ii:[] for ii in range (self.nlogs)}
        self.events = [l.read_next_event () for l in self.lcmlogs]
        self.lid = self.nlogs-1 # active log id
Example #2
0
from perls.lcmtypes.perllcm import isam2_f_glc_t

if __name__ == '__main__':
    if len(sys.argv) < 4:
        print 'usage: %s <est_ceif.pkl> <est_deif.pkl> <lcmlog-client-gm>' % sys.argv[
            0]
        sys.exit(0)

    with open(sys.argv[1], 'rb') as f:
        estc = pickle.load(f)
    with open(sys.argv[2], 'rb') as f:
        estd = pickle.load(f)

    logc = lcm.EventLog(sys.argv[3])
    f_owtt = [
        isam2_f_pose_pose_partial_t.decode(e.data) for e in logc
        if e.channel == 'F_RANGE2D'
    ]
    t_ds = np.asarray([f.utime for f in f_owtt])
    #f_ds = [isam2_f_glc_t.decode (e.data) for e in logc if e.channel == 'F_DS2D']
    #t_ds = np.asarray ([f.utime for f in f_ds])

    # plot paths
    fig_path = plt.figure()
    ax_path = fig_path.add_subplot(111)

    estc.plot(ax_path, 'b.-', label='CEIF')
    estd.plot(ax_path, 'r.-', label='DEIF')

    ax_path.set_xlabel('east [m]')
    ax_path.set_ylabel('north [m]')
Example #3
0
import sys

import lcm
from perls.lcmtypes.perllcm import isam2_f_prior_t
from perls.lcmtypes.perllcm import isam2_f_pose_pose_t
from perls.lcmtypes.perllcm import isam2_f_pose_pose_partial_t

if __name__ == '__main__':
    log = lcm.EventLog (sys.argv[1])

    for e in log:
        if e.channel=='F_PRIOR2D':
            f = isam2_f_prior_t.decode (e.data)
            if f.node_id < 1e5:
                print f.utime, f.node_id
        elif e.channel=='F_ODO2D':
            f = isam2_f_pose_pose_t.decode (e.data)
            if f.node_id1 < 1e5:
                print f.utime, f.node_id1
            if f.node_id2 < 1e5:
                print f.utime, f.node_id2
        elif e.channel=='F_RANGE2D':
            f = isam2_f_pose_pose_partial_t.decode (e.data)
            if f.node_id1 < 1e5:
                print f.utime, f.node_id1
            if f.node_id2 < 1e5:
                print f.utime, f.node_id2

    sys.exit (0)
Example #4
0
from perls.lcmtypes.perllcm import isam2_f_pose_pose_partial_t
from perls.lcmtypes.perllcm import isam2_f_glc_t

if __name__ == '__main__':
    if len (sys.argv) < 4:
        print 'usage: %s <est_ceif.pkl> <est_deif.pkl> <lcmlog-client-gm>' % sys.argv[0]
        sys.exit (0)

    with open (sys.argv[1], 'rb') as f:
        estc = pickle.load (f)
    with open (sys.argv[2], 'rb') as f:
        estd = pickle.load (f)

    logc = lcm.EventLog (sys.argv[3])
    f_owtt = [isam2_f_pose_pose_partial_t.decode (e.data) for e in logc if e.channel == 'F_RANGE2D']
    t_ds = np.asarray ([f.utime for f in f_owtt])
    #f_ds = [isam2_f_glc_t.decode (e.data) for e in logc if e.channel == 'F_DS2D']
    #t_ds = np.asarray ([f.utime for f in f_ds])

    # plot paths
    fig_path = plt.figure ()
    ax_path = fig_path.add_subplot (111)

    estc.plot (ax_path, 'b.-', label='CEIF')
    estd.plot (ax_path, 'r.-', label='DEIF')

    ax_path.set_xlabel ('east [m]')
    ax_path.set_ylabel ('north [m]')

    ax_path.legend ()
Example #5
0
    def run (self, log):
        """
        basic idea is to process all other logs up to the next tol node id,
        then process client through the range measurement, then lather rinse
        and repeat until all range measurements have been reached.
        """
        if self.nlogs==1: logname = 'lcmlog-decentralized'
        else: logname = 'lcmlog-centralized'
        est_log = lcm.EventLog (logname, 'w', overwrite=True)

        li,e = self.next_event ()
        while not e is None:
            if e.channel=='F_PRIOR2D':
                f = isam2_f_prior_t.decode (e.data)
                self.add_prior_factor (f,li)
                if li==0 and f.utime > self.utime and f.node_id > 1e5: 
                    self.publish (est_log)
                    self.utime = f.utime
            elif e.channel=='F_ODO2D':
                f = isam2_f_pose_pose_t.decode (e.data)
                self.add_odo_factor (f,li)
                if li==0 and f.utime > self.utime and f.node_id1 > 1e5: 
                    self.publish (est_log)
                    self.utime = f.utime
                #if li==0 and f.node_id2 < 1e5:
                #    self.solve ()
                #    sol = Centralized_solution (self.ids, self.nodes, self.x, self.cov)
                #    self.sols.append (sol)
            elif e.channel=='F_DS2D' and self.nlogs==1:
                f = isam2_f_glc_t.decode (e.data)
                self.add_ds_factor (f, li)
                if li==0 and f.utime > self.utime: 
                    self.publish (est_log)
                    self.utime = f.utime
                self.solve ()
                sol = Centralized_solution (self.ids, self.nodes, self.x, self.cov)
                self.sols.append (sol)
            elif e.channel=='F_RANGE2D':
                f = isam2_f_pose_pose_partial_t.decode (e.data)
                if li==0 and f.utime > self.utime: 
                    self.publish (est_log)
                    self.utime = f.utime
                self.add_range_factor (f)
                self.rnodes.append ((f.node_id1, f.node_id2))
                #self.solve ()
                #sol = Centralized_solution (self.ids, self.nodes, self.x, self.cov)
                #self.sols.append (sol)
            li,e = self.next_event ()

        # save list of solutions
        with open ('solutions.pkl', 'wb') as f:
            pickle.dump (self.sols, f)
        with open ('rangenodes.pkl', 'wb') as f:
            pickle.dump (self.rnodes, f)

        # recover state at conclusion
        if len (self.nodes) < 6.8e3:
            print '{Centralized} recovering mean AND cov'
            self.solve (recover_cov=True)
        else:
            print '{Centralized} recovering mean NOT cov'
            self.solve (recover_cov=False)
        print '{Centralized} added %d nodes' % (len (self.nodes))
Example #6
0
    def next_event (self):
        """
        first return all events in server log up until next tol, then return
        all client events through range measurement.
        """
        #utime = [e.timestamp for e in self.events]
        ##ii = np.argmin (utime)
        #iisort = np.argsort (utime)
        ##not1,not2 = False,False
        ##if 1103 in self.nodes:
        ##    not1 = True
        ##    print 'finished 28'
        ##if 10094 in self.nodes:
        ##    not2 = True
        ##    print 'finished 31'
        #ii = iisort[0]
        ##if ii==1 and not1:
        ##    if not2:
        ##        ii = 0
        ##    else:
        ##        ii = iisort[1]
        ##if ii==2 and not2:
        ##    if not1:
        ##        ii = 0
        ##    else:
        ##        ii = iisort[1]

        #e = self.events[ii]
        #ne = self.lcmlogs[ii].read_next_event ()
        #while not ne is None and (ne.channel=='REQUEST_STATE' or ne.channel=='CMD'):
        #    ne = self.lcmlogs[ii].read_next_event ()

        #self.events[ii] = ne
        #if not ne is None: return ii,e
        #else: return 0,None
        
        ii = self.lid
        e = self.events[ii]
        ne = self.lcmlogs[ii].read_next_event ()
        while not ne is None and (ne.channel=='REQUEST_STATE' or ne.channel=='CMD'):
            ne = self.lcmlogs[ii].read_next_event ()
        self.events[ii] = ne

        if e is None: return 0,e
        #if self.rid > len (self.range_ids)-1: return 0,None
        if self.lid==0:
            if e.channel=='F_RANGE2D':
                f = isam2_f_pose_pose_partial_t.decode (e.data)
                if f.node_id2==self.range_ids[self.rid]:
                    self.rid+=1
                    self.lid=self.nlogs-1
        else:
            if e.channel=='F_PRIOR2D':
                f = isam2_f_prior_t.decode (e.data)
                if f.node_id==self.range_ids[self.rid]:
                    self.lid=0
            elif e.channel=='F_ODO2D':
                f = isam2_f_pose_pose_t.decode (e.data)
                if f.node_id2==self.range_ids[self.rid]:
                    self.lid=0
        return ii, e