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

if __name__ == '__main__':
    if len (sys.argv) < 2:
        print 'usage: %s <lcmlog-graph-manager>' % sys.argv[0]
        sys.exit (0)

    ilog = lcm.EventLog (sys.argv[1])
    olog = lcm.EventLog ('lcmlog-graph-manager-cooked', 'w', overwrite=True)

    DTOL = 2
    for e in ilog:
        if e.channel=='F_PRIOR2D':
            f = isam2_f_prior_t.decode (e.data)
            if f.node_id < 1e5: 
                f.node_id += DTOL
                olog.write_event (e.timestamp, e.channel, f.encode ())
                continue
        elif e.channel=='F_ODO2D':
            f = isam2_f_pose_pose_t.decode (e.data)
            if f.node_id1 < 1e5: 
                f.node_id1 += DTOL
            if f.node_id2 < 1e5: 
                f.node_id2 += DTOL
            olog.write_event (e.timestamp, e.channel, f.encode ())
            continue
        olog.write_event (e.timestamp, e.channel, e.data)

    sys.exit (0)
Example #2
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 #3
0
import lcm
from perls.lcmtypes.perllcm import isam2_f_prior_t
from perls.lcmtypes.perllcm import isam2_f_pose_pose_t

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print 'usage: %s <lcmlog-graph-manager>' % sys.argv[0]
        sys.exit(0)

    ilog = lcm.EventLog(sys.argv[1])
    olog = lcm.EventLog('lcmlog-graph-manager-cooked', 'w', overwrite=True)

    DTOL = 2
    for e in ilog:
        if e.channel == 'F_PRIOR2D':
            f = isam2_f_prior_t.decode(e.data)
            if f.node_id < 1e5:
                f.node_id += DTOL
                olog.write_event(e.timestamp, e.channel, f.encode())
                continue
        elif e.channel == 'F_ODO2D':
            f = isam2_f_pose_pose_t.decode(e.data)
            if f.node_id1 < 1e5:
                f.node_id1 += DTOL
            if f.node_id2 < 1e5:
                f.node_id2 += DTOL
            olog.write_event(e.timestamp, e.channel, f.encode())
            continue
        olog.write_event(e.timestamp, e.channel, e.data)

    sys.exit(0)
Example #4
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