Calibration Package

Calibration subscriber

  • Publish Topic

    • /imu/data (sensor_msgs/msg/Imu)

    • /wheel/odometry (nav_msgs/msg/Odometry)

  • Subscribe Topic

    • /imu_stm32 (xicro_interfaces/msg/Imu)

  • Number of samples: 500

  • Data: [msg.linear_acceleration.x, msg.linear_acceleration.y, msg.linear_acceleration.z, msg.angular_velocity.x, msg.angular_velocity.y, msg.angular_velocity.z]

class Calibration(Node):
    def __init__(self,action_server):
        super().__init__('calibration_subscriber')
        self.sensor_sub = self.create_subscription(Imu,'/imu_stm32',self.sensor_callback,10)
        self.action_server = action_server
        self.isEnable = False
        self.counter = 0
        self.num_sample = 100
    def sensor_callback(self,msg:Imu):
        temp = [msg.linear_acceleration.x, msg.linear_acceleration.y, msg.linear_acceleration.z, msg.angular_velocity.x, msg.angular_velocity.y, msg.angular_velocity.z]
        self.action_server.sensor_data = temp

Calibration server

  • Action Server

    • /calibrate

  • Output Yaml file

    • calibration/config/sensor_properties.yaml

  • Sampling duration per action + Calibration process: 5-10 s

class CalibrationActionServer(Node):
    def __init__(self):
        super().__init__('calibration_server')
        self.rate = self.create_rate(10)
        self.action_server = ActionServer(self,Calibrate,'/calibrate',self.execute_callback)
        self.sensor_data = Float64MultiArray()
        self.collected_data = []

    def execute_callback(self,goal_handle):
        self.get_logger().info(f'Executing action...')
        self.collected_data = []
        feedback_msg = Calibrate.Feedback()
        num = goal_handle.request.num
        for i in range(num):
            self.collected_data.append(self.sensor_data)
            feedback_msg.data = self.sensor_data
            goal_handle.publish_feedback(feedback_msg)
            self.rate.sleep()
        # get result to succeed
        goal_handle.succeed()
        data_array = np.array(self.collected_data)

        # return absolute distance as result
        result = Calibrate.Result()
        result.mean = np.mean(data_array,0).tolist()
        shape = np.cov(data_array.T).shape
        result.covariance = np.reshape(np.cov(data_array.T),(shape[0]*shape[1])).tolist()
        calibration_path = get_package_share_directory('calibration')
        file = os.path.join(calibration_path,'config','sensor_properties.yaml')
        with open(file,'w') as f:
            yaml.dump({'mean': result.mean, 'covariance': result.covariance},f)
        os.system("gedit "+file)
        return result