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

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


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

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

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

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

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

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

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

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

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

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

РЭ Houston Control Center

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

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

les06

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

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

По умолчанию магнитометр не откалиброван, т.е. выдает неточные значения. Уточненные значения можно получить из сырых данных путем калибровки, которая заключается в нахождении матрицы преобразования и вектора смещения. Сырые данные с магнитометра можно получить, выполнив код на языке С или 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

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 < 400; i++)

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

Анализ работы программы на 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 · Последние изменения: 2022/11/25 19:30 — ekaterina.manucharova

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