les06 [ОрбиКрафт 3D]

Инструменты пользователя


Боковая панель

Назначение ОрбиКрафт 3D

Сборка ОрбиКрафт 3D

Интерфейсы конструктора ОрбиКрафт 3D

Работа с ОрбиКрафт 3D по УКВ

Работа с ОрбиКрафт 3D по Wi-Fi

Работа с ОрбиКрафт 3D через WEB-интерфейс

Полезная нагрузка на базе Arduino

ОрбиКрафт 3D (трехосный) на стенде полунатурного моделирования

Среда разработки

РЭ Houston Control Center

Лабораторная оснастка

Обратная связь

les06

06 Урок. Калибровка магнитометра

Получение сырых данных для калибровки магнитометра

По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения.

Более подробно ознакомиться с работой магнитометра вы можете по ссылке: 02 Урок. Знакомство с датчиками.

Сырые данные с магнитометра можно получить, выполнив код на языке С или Python, представленные ниже.

Код на С.

mag.calib.c
#include <stdio.h>
#include <stdint.h>
#include "libschsat.h"
 
int count = 400;     
float arrX[400];
float arrY[400];
int dt = 100;
float speed = 600;
 
void control(void){ 
 
    float mag_x = 0, mag_y = 0, mag_z = 0;
    uint16_t mag_num = 0;
 
    mSleep(1000);
    magnetometer_gyro_set_telemetry_period(mag_num, dt);
    magnetometer_set_offset(mag_num, 0, 0, 0);
    motor_set_speed(0, speed);
    for (int i = 0; i < count; i++){
        mSleep(dt);
        magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z);
        arrX[i] = mag_x;
        arrY[i] = mag_y;
        if (i == count / 2){
            motor_set_speed(0, -speed);
        }
    }
 
    float min, max;
    min=max=arrX[0];
    for(int j = 0; j < count; j++)
    {
        if(min>arrX[j])
	        min=arrX[j];   
	    if(max<arrX[j])
	        max=arrX[j];       
    }
    float xOffset = (max + min) / 2;
 
    min=max=arrY[0];
    for(int k = 0; k < count; k++)
    {
        if(min>arrY[k])
	        min=arrY[k];   
	    if(max<arrY[k])
	        max=arrY[k];       
    }
    float yOffset = (max + min) / 2;
 
    xOffset = xOffset / 14;
    yOffset = yOffset / 14;
    magnetometer_set_offset(mag_num, xOffset, yOffset, 0);
    printf("x: %f  y: %f", xOffset, yOffset);
    motor_set_speed(0, 0);
    uint8_t data[0];
    //saving
    send_unican_message(25, 2656, data, 0);
}

Код на Python.

mag.calib.py
from libschsat import Libschsat
import time
 
lib=Libschsat()
 
count = 400
arrX=[]
arrY=[]
dt=0.1
speed=600
time.sleep(1)
lib.magGyroSetTelemetryPeriod (100, 2)
lib.magSetOffset (0, 0, 0)
lib.motorSetSpeed('0xA', speed)
for i in range (count):
    time.sleep(dt)
    mag_x, mag_y, mag_z = lib.magRequestRaw (2)
    arrX.append(mag_x)
    arrY.append(mag_y)
 
    if i == count /2:
        lib.motorSetSpeed('0xA', -speed)
min=max=arrX[0]
for j in range (count):
    if min>arrX[j]:
        min=arrX[j]
    if max<arrX[j]:
        max=arrX[j]
xOffset=(max+min)/2
min=max=arrY[0]
for k in range (count):
    if min>arrY[k]:
       min=arrY[k]
    if max<arrY[k]:
        max=arrY[k]
yOffset=(max+min)/2
xOffset=xOffset/14
yOffset=yOffset/14
lib.magSetOffset(int(xOffset), int(yOffset), 0)
print('x: ' + str(xOffset) + '; y:' + str(yOffset))
lib.motorSetSpeed('0xA',0)
lib.sendMsgAndWaitAnswer('0xA60','0xF','0x19',0,[],'0x118')

Подвесьте ОрбиКрафт 3D в токовую рамку. При выполнении программы маховик будет вращать конструктор спутника самостоятельно. После калибровки данные будут отправлены в ПО Houston Application.

Анализ работы программы на С

В программе используются следующие функции работы с магнитометром.

magnetometer_gyro_set_telemetry_period(mag_num, dt)

- установка периода телеметрии магнитометра и ДУСа с номером магнитометра mag_num и периодом dt

magnetometer_set_offset(mag_num, mag_x, mag_y, mag_z)

- функция задает смещение нуля для магнитометра с номером mag_num в плоскостях x,y,z.

motor_set_speed(0, speed);

- функция устанавливает скорость вращения маховика с номером 0 и скоростью speed

В одноосном ОрбиКрафт 3D номер маховика соответствует 0, в трехосном - от 0 до 2 в зависимости от оси (ось X - 0, ось Y - 1, ось Z -2)
magnetometer_request_raw(mag_num, &mag_x, &mag_y, &mag_z) 

– функция, возвращающая сырые данные, измеренные магнитометром с номером mag_num, представляющие собой список из 4 числовых значений. Считанные данные мы помещаем в переменные mag_x, mag_y и mag_z.

В программе использован оператор цикла:

for (int i = 0; i < count; i++)

который будет выполнен n раз, соответственно будет собрано n значений с датчика.

Анализ работы программы на Python

magGyroSetTelemetryPeriod (100, 2)

- установка периода телеметрии магнитометра и ДУСа с номером магнитометра с периодом телеметрии 100 мс

magSetOffset (0, 0, 0)

- функция задает смещение нуля для магнитометра в плоскостях x,y,z.

motorSetSpeed('0xA', speed)

- функция устанавливает скорость вращения маховика 0хА и скоростью speed

mag_x, mag_y, mag_z = lib.magRequestRaw (2)
arrX.append(mag_x)
arrY.append(mag_y)

функция запрашивает регулярную телеметрию carrier и возвращает список значений магнетометра (x, y, z). Так как в одноосной конфигурации конструктора спутника вращается вокруг оси Z, то в mag_x и mag_y записываются данные по осям x и y.

les06.txt · Последние изменения: 2023/03/21 12:08 — maria.milkina

Инструменты страницы