def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    global num_step
    global entropy
    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    local_img_data = image_data
    t = 0
    # indicate camera model
    #     PINHOLE = 0
    #     FISHEYE = 1
    #cam_model = 0

    if req.reset == 1:
        #clear all the record data

        del image_data[:]
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        obs_n = 0
        num_step = 0
        last_frame_corners = None
        goodenough = False

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0, 0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0
        return res

    if not req.reset == 1:
        num_step += 1
        if len(image_data) == 0:
            res = estimateSrvResponse()
            res.par_upd = [0, 0, 0, 0, 0, 0, 0, 0]
            res.obs = 0
            res.coverage = 0

            return res
        # estimation
        # camera intrinsic calibration

        # imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        reproj_err = 1
        try:
            best_mtx, ipts, opts, progress, reproj_err = camera_intrinsic_calibration2(
                req, image_data)
            rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
                          best_mtx[0, 0])
        except:
            pass

        if num_step >= 4:
            spawn_model(0)  # remove old
            time.sleep(2)
            spawn_model(1)  # generate new
            time.sleep(5)

        # compute the coverage
        rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
                      len(good_corners))

        if len(good_corners) > 0:
            res = estimateSrvResponse()
            for c, b in good_corners:
                imgpoints.append(c)  # just for coverage calculation.
            rospy.loginfo(rospy.get_caller_id() + 'I get corners %s',
                          len(imgpoints))

            ####progress measures camera coverage
            res.coverage = np.sum(progress) - cov_n
            cov_n = np.sum(progress)
            # get parameter update
            # compute the observation
            res = compute_obsevation(res, imu_data)
            res.par_upd = [0, 0, 0, 0]

            res.obs = 1.0 * len(db) / 2.0 - obs_n

            if num_step == 4:
                res.par_upd = [
                    best_mtx[0, 0], best_mtx[1, 1], best_mtx[0, 2], best_mtx[1,
                                                                             2]
                ]
                #add reproj
                #res.obs+=5*(1-reproj_err)

            res.par_upd += list(progress)

            obs_n = 1.0 * len(db) / 2.0
            rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))

            rospy.loginfo(rospy.get_caller_id() + 'I get par_upd shape %s',
                          len(res.par_upd))
            rospy.loginfo(rospy.get_caller_id() + 'I get total cov %s',
                          np.sum(progress))
            rospy.loginfo(rospy.get_caller_id() + 'I get reproj err %s',
                          reproj_err)
            return res
        else:
            res = estimateSrvResponse()
            res.obs = 0
            res.coverage = 0
            res.par_upd = [0, 0, 0, 0, 0, 0, 0, 0]
            return res
示例#2
0
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    global num_step
    global last_frame_corners
    global opts
    global ipts
    global record
    global entropy
    global img_cov

    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    record = 0

    #stop record

    if req.reset == 1:
        #stop record
        #stop_recording()

        #remove history data
        os.chdir(kalibr_path[:-1])
        os.system("rm data.bag")
        os.system("rm data_copy.bag")
        os.system("rm data_tmp.bag")
        # bag = rosbag.Bag('data_tmp.bag', 'w')
        # bag.close()

        #clear all the record data
        image_data[:] = []
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        del opts[:]
        del ipts[:]
        obs_n = 0
        last_frame_corners = None
        goodenough = False
        num_step = 0
        entropy = 0
        img_cov = 0

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0

        #start recording
        #start_recording()
        return res

    if not req.reset == 1:
        num_step += 1
        rospy.loginfo(rospy.get_caller_id() + 'start estimate')
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0

        # estimation
        # camera intrinsic calibration

        #imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        best_mtx, ipts, opts, progress = camera_intrinsic_calibration2(
            req, image_data)
        rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
                      best_mtx[0, 0])

        #merge bags
        #stop_recording()
        rospy.loginfo(rospy.get_caller_id() + 'before waiting')
        time.sleep(2)
        merge_bag(num_step)

        #cam imu calibration
        reproj_err = 1
        extrinsic = np.identity(4)
        H_Aopt = 0
        H_eig = np.zeros((6, ))

        if num_step == 3 and len(ipts) > 0:
            #call kalibr
            os.chdir(kalibr_path[:-1])
            try_kalibr_total()
            reproj_err, extrinsic = get_kalibr_results()
            extrinsic = np.asarray(extrinsic)
            H_Aopt, H_Dopt, H_Eopt, H_eig = read_H()
        #
        #
        # start = time.time()
        # if num_step<3:
        #     #get reprojection error and extrinsics
        #     os.chdir(kalibr_path[:-1])
        #     try_kalibr()
        #     reproj_err, extrinsic = get_kalibr_results()
        #     extrinsic = np.asarray(extrinsic)
        #     # compute observability
        #     H_Aopt, H_Dopt, H_Eopt, H_eig = read_H()
        # rospy.loginfo(rospy.get_caller_id() + 'time taken: '+str(time.time()-start))
        ########not calculate observability
        # else:
        #     os.system(k_command)

        ##check for leakage
        all_objects = muppy.get_objects()
        sum1 = summary.summarize(all_objects)
        # Prints out a summary of the large objects
        summary.print_(sum1)
        gc.collect()
        #os.system("sudo sysctl -w vm.drop_caches=3")

        rospy.loginfo(rospy.get_caller_id() + ' ' + 'get kalibr reproj err %s',
                      reproj_err)

        #process extrinsic
        e_flat = extrinsic[0:3, 0:3].flatten()
        rotation = PyKDL.Rotation(e_flat[0], e_flat[1], e_flat[2], e_flat[3],
                                  e_flat[4], e_flat[5], e_flat[6], e_flat[7],
                                  e_flat[8])
        rpy = np.asarray(rotation.GetRPY())
        position = extrinsic[0:3, 3]
        state = np.concatenate([position.reshape(3, ), rpy.reshape(3, )])

        rospy.loginfo(rospy.get_caller_id() + ' ' + 'get kalibr extrinsic %s',
                      state)

        # compute entropy
        orientation_x_en, orientation_y_en, orientation_z_en, orientation_w_en, angular_velocity_x_en, angular_velocity_y_en, angular_velocity_z_en, linear_acceleration_x_en, linear_acceleration_y_en, linear_acceleration_z_en = compute_imu_entropy(
            req, imu_data)

        # # compute the coverage
        # if len(good_corners) > 0:
        res = estimateSrvResponse()

        for c, b in good_corners:
            imgpoints.append(c)  # just for coverage calculation.
        rospy.loginfo(rospy.get_caller_id() + 'I get corners %s', len(ipts))

        # ####progress measures camera coverage
        # res.coverage = np.sum(progress) - cov_n
        # cov_n = np.sum(progress)
        res.obs = (len(ipts) - obs_n) / float(max([len(image_data), 1.0]))
        obs_n = len(ipts)
        img_cov += res.obs

        # res.obs = 1.0 * len(db) / 10.0 - obs_n
        # obs_n = 1.0 * len(db) / 10.0
        # get parameter update
        # compute the observation
        rospy.loginfo(rospy.get_caller_id() + 'I get image coverage %s',
                      img_cov)
        res.obs += -H_Aopt * 10000000
        #add reproj
        res.obs += (1 - reproj_err) * 2
        res.par_upd = np.concatenate([state, np.asarray(H_eig) * 10000000])
        res.coverage = (orientation_x_en + orientation_w_en +
                        orientation_y_en + orientation_z_en) * 0.1
        rospy.loginfo(rospy.get_caller_id() + 'I get par_upd %s', res.par_upd)
        rospy.loginfo(rospy.get_caller_id() + 'I get obs %s', res.obs)
        rospy.loginfo(rospy.get_caller_id() + 'I get coverage %s',
                      res.coverage)

        entropy += res.coverage
        rospy.loginfo(rospy.get_caller_id() + 'I get total entropy %s',
                      entropy)
        rospy.loginfo(rospy.get_caller_id() + 'I get reproj err %s',
                      reproj_err)

        # res.obs = 1.0 * len(db) / 20.0 - obs_n
        # obs_n = 1.0 * len(db) / 20.0
        # rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))
        # rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
        #               len(good_corners))

        #start_recording()

        # if num_step >=3:
        #     spawn_model(0) # remove old
        #     spawn_model(1) # generate new

        return res
示例#3
0
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    global num_step
    global last_frame_corners
    global opts
    global ipts
    global record

    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    record = 0

    #stop record

    if req.reset == 1:
        #stop record
        #stop_recording()

        #remove history data
        os.chdir(kalibr_path[:-1])
        os.system("rm data.bag")
        os.system("rm data_copy.bag")
        os.system("rm data_tmp.bag")
        # bag = rosbag.Bag('data_tmp.bag', 'w')
        # bag.close()

        #clear all the record data
        image_data[:] = []
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        del opts[:]
        del ipts[:]
        obs_n = 0
        last_frame_corners = None
        goodenough = False
        num_step = 0

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd = np.zeros(20)
        res.obs = 0
        res.coverage = 0

        #start recording
        #start_recording()
        return res

    if not req.reset == 1:
        num_step += 1
        rospy.loginfo(rospy.get_caller_id() + 'start estimate')
        res = estimateSrvResponse()
        res.par_upd = np.zeros((20, ))
        res.obs = 0
        res.coverage = 0

        # estimation
        # camera intrinsic calibration

        # imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        best_mtx, ipts, opts, cam_progress = camera_intrinsic_calibration2(
            req, image_data)
        # rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
        #               best_mtx[0, 0])

        #distance from ground truth
        cam_int_truth = rospy.get_param("/rl_client/cam_ground_truth")
        cal_int = [
            best_mtx[0, 0], best_mtx[1, 1], best_mtx[0, 2], best_mtx[1, 2]
        ]
        cam_err = np.linalg.norm(
            np.asarray(cam_int_truth) - np.asarray(cal_int)) / 100

        #camera update response:
        cam_par_upd = np.zeros((4, ))
        cam_obs = 0
        cam_coverage = 0
        if len(good_corners) > 0:
            for c, b in good_corners:
                imgpoints.append(c)  # just for coverage calculation.
            rospy.loginfo(rospy.get_caller_id() + 'I get corners %s',
                          len(imgpoints))
            cam_par_upd = np.asarray(cal_int)
            cam_obs = 1.0 * len(db) / 5.0 - obs_n
            obs_n = 1.0 * len(db) / 5.0
            cam_coverage = (np.sum(cam_progress) - cov_n) * 2
            cov_n = np.sum(cam_progress)
            cam_progress = cam_progress[-4:]

        #merge bags
        time.sleep(2)
        merge_bag(num_step)

        #if camera calibration good, do imu_calibration
        imu_par_upd = np.zeros((6, ))
        imu_obs = 0
        imu_coverage = 0
        imu_progress = np.zeros((6, ))
        if cam_err < 0.05:
            imu_par_upd, imu_progress, imu_obs, imu_coverage = imu_calibration(
                num_step)

        # # compute the coverage
        # if len(good_corners) > 0:
        res = estimateSrvResponse()

        # get parameter update
        # compute the observation
        res.obs = cam_obs + imu_obs
        res.par_upd = np.concatenate(
            [imu_par_upd, cam_par_upd, imu_progress, cam_progress])
        #add camera err here
        res.coverage = imu_coverage + cam_coverage
        rospy.loginfo(rospy.get_caller_id() + 'I get par_upd %s', res.par_upd)
        rospy.loginfo(rospy.get_caller_id() + 'I get cam obs %s', cam_obs)
        rospy.loginfo(rospy.get_caller_id() + 'I get cam coverage %s',
                      cam_coverage)
        rospy.loginfo(rospy.get_caller_id() + 'I get imu obs %s', imu_obs)
        rospy.loginfo(rospy.get_caller_id() + 'I get imu coverage %s',
                      imu_coverage)

        # res.obs = 1.0 * len(db) / 20.0 - obs_n
        # obs_n = 1.0 * len(db) / 20.0
        rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))
        rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
                      len(good_corners))

        #start_recording()
        return res
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    local_img_data = image_data
    t = 0

    if req.reset == 1:
        #clear all the record data

        del image_data[:]
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        obs_n = 0
        last_frame_corners = None
        goodenough = False

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0
        return res

    if not req.reset == 1:
        if len(image_data) == 0:
            res = estimateSrvResponse()
            res.par_upd = [0, 0, 0, 0]
            res.obs = 0
            res.coverage = 0

            return res
        # estimation
        # camera intrinsic calibration

        # imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        best_mtx, ipts, opts, progress = camera_intrinsic_calibration2(
            req, image_data)
        rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
                      best_mtx[0, 0])

        # compute the coverage
        if len(good_corners) > 0:
            res = estimateSrvResponse()
            for c, b in good_corners:
                imgpoints.append(c)  # just for coverage calculation.
            rospy.loginfo(rospy.get_caller_id() + 'I get corners %s',
                          len(imgpoints))

            ####progress measures camera coverage
            res.coverage = np.sum(progress) - cov_n
            cov_n = np.sum(progress)
            # get parameter update
            # compute the observation
            res = compute_obsevation(res, imu_data)
            res.par_upd = [
                best_mtx[0, 0], best_mtx[1, 1], best_mtx[0, 2], best_mtx[1, 2]
            ]

            res.obs = 1.0 * len(db) / 2.0 - obs_n
            obs_n = 1.0 * len(db) / 2.0
            rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))
            rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
                          len(good_corners))
            return res
        else:
            res = estimateSrvResponse()
            res.obs = 0
            res.coverage = 0
            res.par_upd = [0, 0, 0, 0]

            return res
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    global num_step

    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    local_img_data = image_data
    t = 0

    #stop record

    if req.reset == 1:
        #remove history data
        os.chdir(kalibr_path[:-1])
        os.system("rm data.bag")
        os.system("rm data_copy.bag")
        #os.system("rm data_tmp.bag")

        #start record
        #stop record
        rospy.wait_for_service('record_topics')
        stop_bag_record = rospy.ServiceProxy('stop_recording', StopRecording)
        resp1 = stop_bag_record("data.bag")
        rospy.wait_for_service('record_topics')
        bag_record = rospy.ServiceProxy('record_topics', RecordTopics)
        resp1 = bag_record("data.bag",
                           ["/simple_camera/image_raw", "/imu_real"])
        #clear all the record data
        del image_data[:]
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        obs_n = 0
        last_frame_corners = None
        goodenough = False
        num_step = 0

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0
        return res

    if not req.reset == 1:
        num_step += 1
        rospy.loginfo(rospy.get_caller_id() + 'start estimate')
        res = estimateSrvResponse()
        res.par_upd = [0, 0, 0, 0, 0, 0]
        res.obs = 0
        res.coverage = 0


        # estimation
        # camera intrinsic calibration

        # imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        # best_mtx, ipts, opts, progress = camera_intrinsic_calibration2(
        #     req, image_data)
        # rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
        #               best_mtx[0, 0])


        #cam_imu calibration
        # rospy.wait_for_service('stop_recording')
        # stop_bag_record = rospy.ServiceProxy('stop_recording', StopRecording)
        # #resp1 = stop_bag_record("data_tmp.bag")
        # #merge bags
        # for root, dirs, files in os.walk(kalibr_path):
        #     if "data.bag" in files:
        #         break
        #     bag = rosbag.Bag('data.bag', 'w')
        #     bag.close()
        #
        # for root, dirs, files in os.walk(kalibr_path):
        #     if "data_tmp.bag" in files:
        #         break
        #     bag = rosbag.Bag('data_tmp.bag', 'w')
        #     bag.close()
        #
        # #copy current data
        # os.chdir(kalibr_path[:-1])
        # print(kalibr_path[:-1])
        # os.system("cp data.bag data_copy.bag")
        # #merge bag
        # with rosbag.Bag(kalibr_path + 'data.bag', 'w') as outbag:
        #     for topic, msg, t in rosbag.Bag(kalibr_path +
        #                                     'data_copy.bag').read_messages():
        #         outbag.write(topic, msg, t)
        #     for topic, msg, t in rosbag.Bag(kalibr_path +
        #                                     'data_tmp.bag').read_messages():
        #         outbag.write(topic, msg, t)

        reproj_err = 1
        extrinsic = np.identity(4)
        if num_step == 5:
            #stop record
            rospy.wait_for_service('stop_recording')
            stop_bag_record = rospy.ServiceProxy('stop_recording', StopRecording)
            resp1 = stop_bag_record("data.bag")
            #call kalibr
            os.system(k_command_total)
            #start again
            rospy.wait_for_service('record_topics')
            bag_record = rospy.ServiceProxy('record_topics', RecordTopics)
            resp1 = bag_record("data.bag",
                               ["/simple_camera/image_raw", "/imu_real"])
            #get reprojection error and extrinsics
            reproj_err, extrinsic = get_kalibr_results()
            extrinsic = np.asarray(extrinsic)

        ########not calculate observability
        # else:
        #     os.system(k_command)
        rospy.loginfo(
            rospy.get_caller_id() + ' ' + 'get kalibr reproj err %s',
            reproj_err)
        rospy.loginfo(
            rospy.get_caller_id() + ' ' + 'get kalibr extrinsic %s',
            extrinsic)

        e_flat = extrinsic[0:3,0:3].flatten()
        rotation = PyKDL.Rotation(e_flat[0],e_flat[1],e_flat[2],e_flat[3],e_flat[4],e_flat[5],e_flat[6],e_flat[7],e_flat[8])
        rpy = np.asarray(rotation.GetRPY())
        position = extrinsic[0:3,3]
        state = np.concatenate([position.reshape(3,),rpy.reshape(3,)])



        # compute observability
        H_txt_path = kalibr_path+'H.txt'
        H_Aopt, H_Dopt, H_Eopt, H_eig = compute_optimality(H_txt_path)
        # compute entropy
        orientation_x_en, orientation_y_en, orientation_z_en, orientation_w_en, angular_velocity_x_en, angular_velocity_y_en, angular_velocity_z_en, linear_acceleration_x_en, linear_acceleration_y_en, linear_acceleration_z_en = compute_imu_entropy(
            req, imu_data)

        # # compute the coverage
        # if len(good_corners) > 0:
        res = estimateSrvResponse()

        # for c, b in good_corners:
        #     imgpoints.append(c)  # just for coverage calculation.
        # rospy.loginfo(rospy.get_caller_id() + 'I get corners %s',
        #               len(imgpoints))

        # ####progress measures camera coverage
        # res.coverage = np.sum(progress) - cov_n
        # cov_n = np.sum(progress)

        # get parameter update
        # compute the observation
        res.obs = H_Aopt*100000000
        res.par_upd = np.concatenate([state,np.asarray(H_eig)*100000000])
        res.coverage = (orientation_x_en+orientation_w_en+orientation_y_en+orientation_z_en)*0.1
        rospy.loginfo(rospy.get_caller_id() + 'I get par_upd %s', res.par_upd)
        rospy.loginfo(rospy.get_caller_id() + 'I get obs %s',
                      res.obs)
        rospy.loginfo(rospy.get_caller_id() + 'I get coverage %s',
                      res.coverage)

        # res.obs = 1.0 * len(db) / 20.0 - obs_n
        # obs_n = 1.0 * len(db) / 20.0
        # rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))
        # rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
        #               len(good_corners))
        return res
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    global db
    global obs_n
    global cov_n
    global good_corners
    global last_frame_corners
    global goodenough
    global num_step

    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    local_img_data = image_data
    t = 0

    #stop record

    if req.reset == 1:
        #remove history data
        os.chdir(kalibr_path[:-1])
        os.system("rm data.bag")
        os.system("rm data_copy.bag")

        rospy.wait_for_service('record_topics')
        stop_bag_record = rospy.ServiceProxy('stop_recording', StopRecording)
        resp1 = stop_bag_record("data_tmp.bag")
        #start rosbag record
        rospy.wait_for_service('record_topics')
        bag_record = rospy.ServiceProxy('record_topics', RecordTopics)
        resp1 = bag_record("data_tmp.bag",
                           ["/simple_camera/image_raw", "/imu_real"])

        #clear all the record data
        del image_data[:]
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        del good_corners[:]
        del db[:]
        obs_n = 0
        last_frame_corners = None
        goodenough = False
        num_step = 0

        #feed back the updateros
        res = estimateSrvResponse()
        res.par_upd = np.zeros((18, ))
        res.obs = 0
        res.coverage = 0
        return res

    if not req.reset == 1:
        num_step += 1
        rospy.loginfo(rospy.get_caller_id() + 'start estimate')
        res = estimateSrvResponse()
        res.par_upd = np.zeros((18, ))
        res.obs = 0
        res.coverage = 0

        # estimation
        # camera intrinsic calibration

        # imgpoints, best_mtx = camera_intrinsic_calibration(req, image_data)
        # best_mtx, ipts, opts, progress = camera_intrinsic_calibration2(
        #     req, image_data)
        # rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s',
        #               best_mtx[0, 0])

        #stop record tmp
        rospy.wait_for_service('record_topics')
        stop_bag_record = rospy.ServiceProxy('stop_recording', StopRecording)
        resp1 = stop_bag_record("data_tmp.bag")
        rospy.loginfo(rospy.get_caller_id() + 'finish recording')
        for root, dirs, files in os.walk(kalibr_path):
            if "data.bag" in files:
                break
            bag = rosbag.Bag('data.bag', 'w')
            bag.close()

        #copy current data
        os.chdir(kalibr_path[:-1])
        print(kalibr_path[:-1])
        os.system("cp data.bag data_copy.bag")
        #merge bag
        with rosbag.Bag(kalibr_path + 'data.bag', 'w') as outbag:
            for topic, msg, t in rosbag.Bag(kalibr_path +
                                            'data_copy.bag').read_messages():
                outbag.write(topic, msg, t)
            for topic, msg, t in rosbag.Bag(kalibr_path +
                                            'data_tmp.bag').read_messages():
                outbag.write(topic, msg, t)
        #start tmp again
        rospy.wait_for_service('record_topics')
        bag_record = rospy.ServiceProxy('record_topics', RecordTopics)
        resp1 = bag_record("data_tmp.bag",
                           ["/simple_camera/image_raw", "/imu_real"])
        #cam_imu calibration
        extrinsic = np.zeros((6, ))
        reproj_err = 1
        if num_step == 3:

            #call kalibr
            os.system(k_command_total)
            #get reprojection error and extrinsics
            reproj_err, extrinsic = get_kalibr_results()
        else:
            os.system(k_command)

        rospy.loginfo(rospy.get_caller_id() + ' ' + 'get kalibr reproj err %s',
                      reproj_err)
        rospy.loginfo(rospy.get_caller_id() + ' ' + 'get kalibr extrinsic %s',
                      extrinsic)

        # compute observability
        H_txt_path = '/home/felix/panda_ws/src/franka_cal_sim/python/kalibr/H.txt'
        H_Aopt, H_Dopt, H_Eopt, H_eig = compute_optimality(H_txt_path)
        # compute entropy
        orientation_x_en, orientation_y_en, orientation_z_en, orientation_w_en, angular_velocity_x_en, angular_velocity_y_en, angular_velocity_z_en, linear_acceleration_x_en, linear_acceleration_y_en, linear_acceleration_z_en = compute_imu_entropy(
            req, imu_data)

        # # compute the coverage
        # if len(good_corners) > 0:
        res = estimateSrvResponse()

        # for c, b in good_corners:
        #     imgpoints.append(c)  # just for coverage calculation.
        # rospy.loginfo(rospy.get_caller_id() + 'I get corners %s',
        #               len(imgpoints))

        # ####progress measures camera coverage
        # res.coverage = np.sum(progress) - cov_n
        # cov_n = np.sum(progress)

        # get parameter update
        # compute the observation
        res.obs = H_Aopt * 100000000
        res.par_upd = np.concatenate([
            np.asarray(extrinsic).reshape((12, )),
            np.asarray(H_eig * 100000000)
        ])
        res.coverage = (orientation_x_en + orientation_w_en +
                        orientation_y_en + orientation_z_en) * 0.01
        rospy.loginfo(rospy.get_caller_id() + 'I get par_upd %s', res.par_upd)
        rospy.loginfo(rospy.get_caller_id() + 'I get obs %s', res.obs)
        rospy.loginfo(rospy.get_caller_id() + 'I get coverage %s',
                      res.coverage)

        # res.obs = 1.0 * len(db) / 20.0 - obs_n
        # obs_n = 1.0 * len(db) / 20.0
        # rospy.loginfo(rospy.get_caller_id() + 'I get db %s', len(db))
        # rospy.loginfo(rospy.get_caller_id() + 'I get good corners %s',
        #               len(good_corners))
        return res
示例#7
0
def estimate_callback(req):
    global image_data
    global state_data
    global imu_data
    global objpoints
    global imgpoints
    rospy.loginfo(rospy.get_caller_id() + 'I heard image %s', len(image_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard imu %s', len(imu_data))
    rospy.loginfo(rospy.get_caller_id() + 'I heard state %s', len(state_data))
    local_img_data = image_data
    t = 0
    if req.reset==1:
        #clear all the record data

        global obs_n
        del image_data[:]
        del imu_data[:]
        del state_data[:]
        del objpoints[:]
        del imgpoints[:]
        max_x = 0
        max_y = 0
        min_x = 0
        min_y = 0
        obs_n = 0

        #feed back the update
        res = estimateSrvResponse()
        res.par_upd=[]
        res.obs = 0
        res.coverage = 0
        return res


    if not req.reset==1:
        if len(image_data)==0:
            res = estimateSrvResponse()
            res.par_upd=[0,0,0,0]
            res.obs = 0
            res.coverage = 0

            return res

        ##estimation
        # termination criteria
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
        criteria_cal = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
        # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
        objp = np.zeros((6*7,3), np.float32)
        objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

        rospy.loginfo(rospy.get_caller_id() + 'get corner')

        for img in local_img_data:
            gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

            # Find the chess board corners
            ret, corners = cv2.findChessboardCorners(gray, (7,6),flags=cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK)

            # If found, add object points, image points (after refining them)
            if ret == True and len(corners)<50 and len(local_img_data)>30:
                objpoints.append(objp)

                corners2 = cv2.cornerSubPix(gray,corners,(9,9),(-1,-1),criteria)
                imgpoints.append(corners2)

        rospy.loginfo(rospy.get_caller_id() + 'compute intrinsics')

        list1 = np.arange(0,len(imgpoints),1)
        mtx = np.zeros((3,3))
        if len(req.params)>3:
            mtx[0,0] = req.params[0]
            mtx[1,1] = req.params[1]
            mtx[0,2] = req.params[2]
            mtx[1,2] = req.params[3]
        mtx[2,2] = 1

        #optimize data step by step based on sampled imgs, get best one
        min_error = 1000
        best_mtx = mtx
        if len(imgpoints)<200 and len(local_img_data)>30:
            for i in range(1):
                cur_data = list1
                if len(imgpoints)>40:
                    cur_data = sample(list1,40)
                cur_obj = list(objpoints[i] for i in cur_data)
                cur_img = list(imgpoints[i] for i in cur_data)
                try:
                    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(cur_obj, cur_img, gray.shape[::-1],cameraMatrix=mtx, distCoeffs=None, rvecs=None, tvecs=None, flags=0, criteria=criteria_cal)

                except:
                    rvecs = np.asarray([1.0,0,0])
                    tvecs = np.asarray([0,0,0])
                    dist = np.asarray([0,0,0,0,0])
                    rospy.loginfo(rospy.get_caller_id() + 'No image')

            # #evaluate
            # tot_error = 0
            # mean_error = 0
            # for j in range(len(cur_obj)):
            #     imgpoints2, _ = cv2.projectPoints(cur_obj[j], rvecs[j], tvecs[j], mtx, dist)
            #     error = cv2.norm(cur_img[j],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
            #     tot_error += error
            # mean_error = tot_error/max([len(cur_obj),1])
            # if mean_error<min_error:
            #     min_error = mean_error
            #     best_mtx = mtx
        best_mtx = mtx


        rospy.loginfo(rospy.get_caller_id() + 'I get corners %s', len(imgpoints))
        rospy.loginfo(rospy.get_caller_id() + 'I get parameters %s', best_mtx)

        ##compute the results
        #compute the coverage
        rospy.loginfo(rospy.get_caller_id() + 'send back')
        if len(imgpoints)>0:
            res = estimateSrvResponse()
            global max_x
            global max_y
            global min_x
            global min_y
            global obs_n
            img_flat = np.reshape(np.asarray(imgpoints),(-1,3))
            res.coverage = np.max(img_flat,axis = 0)[0]-max_x-np.min(img_flat,axis = 0)[0]+min_x
            res.coverage = res.coverage+np.max(img_flat,axis = 0)[1]-max_y-np.min(img_flat,axis = 0)[0]+min_y
            res.obs = 0
            if(len(imgpoints)<100):
                res.obs = 1.0*len(imgpoints)/len(local_img_data)
            max_x = np.max(img_flat,axis = 0)[0]
            max_y = np.max(img_flat,axis = 0)[1]
            min_x = np.min(img_flat,axis = 0)[0]
            min_y = np.min(img_flat,axis = 0)[1]
            obs_n = res.obs

            #get parameter update
            res.par_upd = [best_mtx[0,0],best_mtx[1,1],best_mtx[0,2],best_mtx[1,2]]
            return res
        else:
            res = estimateSrvResponse()
            res.obs = 0
            res.coverage = 0
            res.par_upd = [0,0,0,0]
            return res