コード例 #1
0
 def setup_full_controller(self):
     # create mvi and dsys:
     mvi = sd.trep.MidpointVI(self.system)
     dsys = op.discopt.DSystem(mvi, self.tvec)
     # get reference and initial guess:
     X0,U0 = op.calc_initial_guess(dsys, self.X0, self.Xref, self.Uref)
     cost = op.discopt.DCost(self.Xref, self.Uref, self.Qcost, self.Rcost)
     # build optimizer:
     optimizer = op.discopt.DOptimizer(dsys, cost)
     optimizer.optimize_ic = False
     optimizer.descent_tolerance = 1e-6
     optimizer.first_method_iterations = 2
     # optimize:
     finished, self.Xopt, self.Uopt = optimizer.optimize(X0, U0)
     Qk = lambda k: self.Qcost
     Rk = lambda k: self.Rcost
     self.Kstab = dsys.calc_feedback_controller(self.Xopt, self.Uopt, Qk, Rk)
     if not finished:
         rospy.logwarn("Could not complete full optimization!")
     return
コード例 #2
0
 def setup_full_controller(self):
     # create mvi and dsys:
     mvi = sd.trep.MidpointVI(self.system)
     dsys = op.discopt.DSystem(mvi, self.tvec)
     # get reference and initial guess:
     X0, U0 = op.calc_initial_guess(dsys, self.X0, self.Xref, self.Uref)
     cost = op.discopt.DCost(self.Xref, self.Uref, self.Qcost, self.Rcost)
     # build optimizer:
     optimizer = op.discopt.DOptimizer(dsys, cost)
     optimizer.optimize_ic = False
     optimizer.descent_tolerance = 1e-6
     optimizer.first_method_iterations = 2
     # optimize:
     finished, self.Xopt, self.Uopt = optimizer.optimize(X0, U0)
     Qk = lambda k: self.Qcost
     Rk = lambda k: self.Rcost
     self.Kstab = dsys.calc_feedback_controller(self.Xopt, self.Uopt, Qk,
                                                Rk)
     if not finished:
         rospy.logwarn("Could not complete full optimization!")
     return
コード例 #3
0
    def openloopcb(self, data):
        rospy.logdebug("openloop callback triggered")
        op_cond = self.operating_condition
        if op_cond is OperatingCondition.CALIBRATE:
            self.send_initial_config()
            # self.first_flag = False
            return
        elif op_cond is OperatingCondition.EMERGENCY:
            # we need to stop robots!:
            self.stop_robots()
            return
        elif op_cond is not OperatingCondition.RUN:
            # we are not running, keep setting initializations
            self.first_flag = True
            self.wait_flag = True
            self.callback_count = 0
            self.ekf.index = 0
            # clear trajectories:
            self.mass_ref_vec.clear()
            self.mass_filt_vec.clear()
            # reset 
            if self.interactive_bool:
                self.RM.reset_interps()
            return

        if self.first_flag:
            # let's enforce a few delays here to ensure that we build up enough
            # reference traj:
            if self.interactive_bool and self.wait_flag:
                if self.callback_count == 0:
                    # publish start time:
                    self.time_pub.publish(data.header.stamp)
                    self.send_initial_config()
                    self.tbase = data.header.stamp
                elif self.callback_count > self.n_win:
                    self.wait_flag = False
                self.callback_count += 1
                return
            rospy.loginfo("Beginning Trajectory")
            self.first_flag = False
            self.callback_count = 0
            # reset filter:
            self.ekf.index = 0
            self.ekf.xkk = self.ekf.X0
            self.ekf.est_cov = copy.deepcopy(self.ekf.proc_cov)
            # get reference traj after initial dt:
            r = self.RM.calc_reference_traj(self.dsys, [0, self.dt, 2*self.dt])
            if r:
                Xtmp,Utmp = r
            else:
                rospy.logwarn("waiting for more reference in first_flag of openloopcb")
                self.first_flag = True
                return
            # send reference traj U and store:
            self.convert_and_send_input(Xtmp[0][2:4], Xtmp[1][2:4])
            self.Uprev = Utmp[0]
            self.Ukey = Utmp[1]
            # publish filtered and reference:
            self.publish_state_and_config(data, self.ekf.xkk, self.X0)
        else:
            self.callback_count += 1
            zk = tools.config_to_array(self.system, data)
            # get updated estimate
            self.ekf.step_filter(zk, Winc=np.zeros(self.dsys.nX), u=self.Uprev)
            # send old value to robot:
            self.convert_and_send_input(self.ekf.xkk[2:4], self.Ukey)
            # publish filtered and reference:
            r = self.RM.calc_reference_traj(self.dsys, [self.callback_count*self.dt])
            if r:
                xref,uref = r
            else:
                rospy.logwarn("reference trajectory returned None for openloop initial condition!")
                return
            self.publish_state_and_config(data, self.ekf.xkk, xref[0])
            # get prediction of where we will be in +dt seconds
            self.dsyssim.set(self.ekf.xkk, self.Ukey, 0)
            Xstart = self.dsyssim.f()
            # get reference traj
            ttmp = self.twin + (self.callback_count + 1)*self.dt
            r = self.RM.calc_reference_traj(self.dsys, ttmp)
            if r:
                Xref, Uref = r
            else:
                rospy.logwarn("reference trajectory returned None for openloop traj !")
                return
            # get initial guess
            X0, U0 = op.calc_initial_guess(self.dsys, Xstart, Xref, Uref)
            # add path information:
            self.add_to_path_vectors(data, Xref[0], Xstart)
            # store data:
            self.Uprev = self.Ukey
            self.Ukey = U0[0]
            # check for the end of the trajectory:
            if self.callback_count >= len(self.tvec):
                rospy.loginfo("Trajectory complete!")
                try:
                    self.op_change_client(OperatingCondition(OperatingCondition.STOP))
                except rospy.ServiceException, e:
                    rospy.loginfo("Service did not process request: %s"%str(e))
                # now we can stop the robots
                self.stop_robots()
コード例 #4
0
    def openloopcb(self, data):
        rospy.logdebug("openloop callback triggered")
        op_cond = self.operating_condition
        if op_cond is OperatingCondition.CALIBRATE:
            self.send_initial_config()
            # self.first_flag = False
            return
        elif op_cond is OperatingCondition.EMERGENCY:
            # we need to stop robots!:
            self.stop_robots()
            return
        elif op_cond is not OperatingCondition.RUN:
            # we are not running, keep setting initializations
            self.first_flag = True
            self.wait_flag = True
            self.callback_count = 0
            self.ekf.index = 0
            # clear trajectories:
            self.mass_ref_vec.clear()
            self.mass_filt_vec.clear()
            # reset
            if self.interactive_bool:
                self.RM.reset_interps()
            return

        if self.first_flag:
            # let's enforce a few delays here to ensure that we build up enough
            # reference traj:
            if self.interactive_bool and self.wait_flag:
                if self.callback_count == 0:
                    # publish start time:
                    self.time_pub.publish(data.header.stamp)
                    self.send_initial_config()
                    self.tbase = data.header.stamp
                elif self.callback_count > self.n_win:
                    self.wait_flag = False
                self.callback_count += 1
                return
            rospy.loginfo("Beginning Trajectory")
            self.first_flag = False
            self.callback_count = 0
            # reset filter:
            self.ekf.index = 0
            self.ekf.xkk = self.ekf.X0
            self.ekf.est_cov = copy.deepcopy(self.ekf.proc_cov)
            # get reference traj after initial dt:
            r = self.RM.calc_reference_traj(self.dsys,
                                            [0, self.dt, 2 * self.dt])
            if r:
                Xtmp, Utmp = r
            else:
                rospy.logwarn(
                    "waiting for more reference in first_flag of openloopcb")
                self.first_flag = True
                return
            # send reference traj U and store:
            self.convert_and_send_input(Xtmp[0][2:4], Xtmp[1][2:4])
            self.Uprev = Utmp[0]
            self.Ukey = Utmp[1]
            # publish filtered and reference:
            self.publish_state_and_config(data, self.ekf.xkk, self.X0)
        else:
            self.callback_count += 1
            zk = tools.config_to_array(self.system, data)
            # get updated estimate
            self.ekf.step_filter(zk, Winc=np.zeros(self.dsys.nX), u=self.Uprev)
            # send old value to robot:
            self.convert_and_send_input(self.ekf.xkk[2:4], self.Ukey)
            # publish filtered and reference:
            r = self.RM.calc_reference_traj(self.dsys,
                                            [self.callback_count * self.dt])
            if r:
                xref, uref = r
            else:
                rospy.logwarn(
                    "reference trajectory returned None for openloop initial condition!"
                )
                return
            self.publish_state_and_config(data, self.ekf.xkk, xref[0])
            # get prediction of where we will be in +dt seconds
            self.dsyssim.set(self.ekf.xkk, self.Ukey, 0)
            Xstart = self.dsyssim.f()
            # get reference traj
            ttmp = self.twin + (self.callback_count + 1) * self.dt
            r = self.RM.calc_reference_traj(self.dsys, ttmp)
            if r:
                Xref, Uref = r
            else:
                rospy.logwarn(
                    "reference trajectory returned None for openloop traj !")
                return
            # get initial guess
            X0, U0 = op.calc_initial_guess(self.dsys, Xstart, Xref, Uref)
            # add path information:
            self.add_to_path_vectors(data, Xref[0], Xstart)
            # store data:
            self.Uprev = self.Ukey
            self.Ukey = U0[0]
            # check for the end of the trajectory:
            if self.callback_count >= len(self.tvec):
                rospy.loginfo("Trajectory complete!")
                try:
                    self.op_change_client(
                        OperatingCondition(OperatingCondition.STOP))
                except rospy.ServiceException, e:
                    rospy.loginfo("Service did not process request: %s" %
                                  str(e))
                # now we can stop the robots
                self.stop_robots()