№2 / 2019 / статья 2

Определение местоположения с помощью BLE-чипов Texas Instruments

Александр Калачев (г. Барнаул)

Локальное позиционирование объектов – одна из наиболее интересных и непростых в плане реализации задач технологии Bluetooth Low Energy (BLE). Статья описывает технологию и особенности практической реализации этой задачи на базе систем-на-кристалле СС26хх производства Texas Instruments.

Технология Bluetooth Low Energy (BLE) позволяет разработчикам проектировать конкурентоспособные продукты, способные взаимодействовать практически с любой современной мобильной платформой, используя легкодоступные компоненты, инструменты и стандарты. Сферы и способы применения BLE весьма разнообразны и охватывают широкий спектр интеллектуальных устройств, значительная часть которых относится к портативной электронике.

Ключевые преимущества BLE – поддержка практически всеми производителями персональной электроники (ноутбуков, планшетов, смартфонов и прочего) и обеспечение малого энергопотребления за счет способности BLE-устройств переходить в спящий режим.

Находясь в спящем режиме, BLE-устройство периодически рассылает пакеты-объявления (advertisement, adv-пакеты). Adv-пакеты также могут быть использованы в прикладных целях – в так называемых устройствах-маячках – beacons.

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

Localization Toolbox

Многие компании предлагают различные технические решения для реализации функций локализации узлов. Localization Toolbox (Real Time Locating System Toolbox) от компании Texas Instruments представляет собой набор методов, позволяющих интегрировать опции определения местоположения в BLE-устройства на базе систем-на-кристалле (СнК) CC26хх. Благодаря техническим особенностям радиотракта СС26хх это не требует значительных затрат процессорного времени и энергии.

Выделяют два основных метода определения относительного местоположения мобильного узла: трилатерация и триангуляция (рисунок 1). При трилатерации определяется расстояние между опорными узлами и целевым узлом. Возможное местоположение целевого узла – на пересечении окружностей с радиусами, равными расстоянию до соответствующих узлов. Обычно требуются три опорных узла. При триангуляции определяется направление от опорных узлов до целевого, и положение целевого узла будет на пересечении лучей, проведенных от опорных узлов в направлении целевого. Для локализации целевого узла достаточно двух узлов опорных точек.

Рис. 1. Два основных метода для определения относительного местоположения мобильного узла: а) трилатерация; б) триангуляция

Рис. 1. Два основных метода для определения относительного местоположения мобильного узла: а) трилатерация; б) триангуляция

В беспроводных системах реализуются обычно два метода, помогающих определить местоположение узла: определение угла приема пришедшего пакета (Angle of Arrival, АоА) и определение времени доставки пакета (Time of Flight, ToF), дословно – определение «угла прибытия» и «времени полета» пакета.

Определение угла прибытия: теория

Методика Angle of Arrival (АоА) заключается в определении направления, с которого был принят Bluetooth-пакет относительно ориентации приемного узла. АоА обычно применяется при реализации метода триангуляции.

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

Эти различия в длине трассы будут зависеть от направления входящих радиочастотных волн относительно антенн в решетке. Чтобы облегчить измерение фазы, пакет Bluetooth должен иметь специфический вид: содержать участок непрерывного тона (CT), в котором нет фазовых сдвигов, вызванных модуляцией.

В АоА-пакетах в полезной нагрузке пакета (PDU) передается секция последовательных единиц, формирующая синусоиду на несущей частоте 250 кГц (рисунок 2). Это дает демодулятору время на синхронизацию, чтобы затем выбрать I- (реальная составляющая) и Q- (мнимая составляющая) компоненты сигнала, записать их в буфер и передать приложению для дальнейшего анализа.

Рис. 2. Структура АоА-пакета

Рис. 2. Структура АоА-пакета

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

Выборка и буферизация отсчетов происходят без участия основного ядра. Благодаря специальной предварительной обработке приложение на основном ядре может начинать определение сдвига фаз в сигнале без таких этапов как фильтрация постоянной составляющей и промежуточной частоты. Схема взаимодействия основного ядра и радиоядра представлена на рисунке 3.

Рис. 3. Схема взаимодействия основного ядра и радиоядра

Рис. 3. Схема взаимодействия основного ядра и радиоядра

I/Q-отсчеты могут выбираться с частотой до 4 МГц при разрешении 16 бит. При 32 битах на комплексный отсчет сигнала (пара I + Q) получается поток в 128 бит в секунду, в итоге буфер размером 1 кбайт хранит 64 микросекунды сигнала (при необходимости размер буфера может быть увеличен до 2 кбайт).

Радиоядро контролирует сигналы, управляющие переключением антенн посредством выводов CC2640, и тем самым разделяет общий принятый сигнал на слоты, относящиеся к каждой из антенн. Длительность слота (antenna dwell time) будет определять точность определения смещения фазы сигнала, по умолчанию эта длительность составляет 4 мкс.

Пример приложения: определение угла прибытия

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

Когда приемник получает АоА-пакет, радиоядро генерирует событие, направляемое DMA и запускающее таймер GPTimer. GPTimer отсчитывает 4 мкс, после чего инициирует событие для следующего канала DMA и переключает антенну (за это отвечает функция AoA_getRxIQ, описанная в файле AOACC26XX.c проекта):


void AoA_getRxIQ(uint8_t*packetId, AoA_IQSample**samples)
{
...
}

На каждый период 250 кГц сигнала получается 16 отсчетов комплексного сигнала – компоненты I и Q (рисунок 4). Из-за особенностей конструкции платы с антеннами возможно появление сдвига фазы сигнала даже при его реальном отсутствии, кроме того, при переключении антенн возможно появление искажений сигнала. Для минимизации подобных эффектов при вычислении фазы будут использованы с 8-го по 15-й отсчеты временных слотов каждой из антенн.

Рис. 4. Вычисление фазы сигнала по компонентам I и Q

Рис. 4. Вычисление фазы сигнала по компонентам I и Q

Листинг кода для вычисления сдвига фаз через функцию arctan(Za*complexconjugate(Zb)):


/* Ant_1 Sample_n */
double complex Za=sample[r][a][i].i+I*sample[r][a][i].q;
/* Ant_2 Sample_n */
double complex Zb=sample[r][b][i].i+I*sample[r][b][i].q;
double complex Zab_rel=Za*conj(Zb);
/* The phase difference between sample_n ant_1 and sample_n ant_2 */
int16_t Pab_rel= (int16_t)(carg(Zab_rel) *RadToDeg);

Надо учитывать также, что сигнал 250 кГц может быть неидеальным (к примеру, 245 или 255 кГц), вследствие чего могут иметься различия между отсчетами ant_1 sample_n и отсчетами следующего слота ant_1 sample_(n + 16 * 1). Таким образом, необходима компенсация:


/* Ant_1 Sample_n */
double complex Za=sample[r][a][i].i+I*sample[r][a][i].q;
/* Ant_1 Sample_[n-16] */
double complex Za_prev=sample[r-1][a][i].i+I*sample[r-1][a][i].q;
double complex Zaa_rel=Za*conj(Za_prev);
/* The phase difference between sample_n ant_1 and sample_n ant_2 */
int16_t Paa_rel= (int16_t)(carg(Zaa_rel) *RadToDeg);

Разность фаз агрегируется. К примеру, каждый период будет иметь задержки 45º. Затем при сравнении ant_1 sample_n и ant_1 sample_ (n + 16 * 1) суммарная разность фаз составит 90º. Следовательно, рассчитанная разность фаз должна делиться на количество используемых антенн, в данном случае – 2:


versus_avg[a][b] + = Pab_rel - ((Paa_rel*abs(a-b)) /numAnt);

Антенны и характеристики частотного канала также будут влиять на данные I/Q, поэтому после того как получено значение antenna_versus_avg, необходима дополнительная коррекция смещений и угла наклона. Корректирующие значения рассчитываются на основе данных, полученных в лабораторных условиях. Приемник фиксируется в определенном направлении, данные по смещению фаз собираются и сохраняются. Далее приемник поворачивается на угол 90º, повторяется процедура вычисления смещения фаз. Полученные значения разностей фаз сравниваются с реальным углом поворота.

Коэффициенты калибровочной прямой (на рисунке 5 оранжевая линия) корректируются таким образом, чтобы скомпенсировать смещение нуля (красная линия) и увеличить угол наклона кривой для повышения чувствительности (синяя линия – финальная калибровочная зависимость).

Рис. 5. Коррекция калибровки определения сдвига фаз

Рис. 5. Коррекция калибровки определения сдвига фаз

В зависимости от расстояния между антеннами и угла между ними, необходимо также корректировать следующие параметры:


// массив корректировочных коэффициентов для пар антенн 1-2, 2-3 и 3-4
// смещение фазы и корректировка усиления
AoA_AntennaPairpair_A2[] =
{
  {/* v12 */
    .a=0,
    .b=1,
    .sign=-1,
    .offset=-55,
    .gain=0.80,
  },
  {/* v23 */
    .a=1,
    .b=2,
    .sign=-1,
    .offset=-45,
    .gain=0.90,
  },
  {/* v13 */
    .a=0,
    .b=2,
    .sign=-1,
    .offset=-85,
    .gain=0.40,
  },
};
// массивы для хранения значений амплитуд и фаз
uint32_t signalAmplitude_A2[sizeof(pair_A2) /sizeof(pair_A2[0])];
int16_t pairAngle_A2[sizeof(pair_A2) /sizeof(pair_A2[0])];
// финальная структура с результатами
AoA_AntennaResultBOOSTXL_AoA_Result_ArrayA2=
{
    .signalStrength= (uint32_t*)&signalAmplitude_A2,
    .pairAngle= (int16_t*)&pairAngle_A2,
    .rssi=0,
    .updated=false,
};

Также требуется корректировка значения выделяемого тона в зависимости от частоты канала:


switch(antA1Result->ch)
{
     /* 2402 MHz */
     case37:
             AoA_A1_freqComp=-10;
     break;
     /* 2426 MHz */
     case38:
             AoA_A1_freqComp=-5;
     break;
     /* 2480 MHz */
     case39:
             AoA_A1_freqComp=15;
     break;
}

Время полета – Time of Flight

Методика Time-of-Flight (ToF) реализована в конфигурации «ведущий-ведомый» (“master-slave”). Ведущее устройство посылает пакет, который ведомое устройство возвращает обратно, и ведущее устройство вычисляет время его пути между узлами, вычитая время на обработку пакета (фиксированное и известное).

Из-за малой скорости работы радиомодуля Bluetooth относительно скорости света каждое отдельное измерение дает очень грубый результат. Но, выполняя множество измерений, обычно несколько сотен в течение нескольких миллисекунд, можно получить средний результат с приемлемой точностью.

Скорость распространения радиоволн постоянна, а это означает, что время, необходимое для их распространения, прямо пропорционально расстоянию. Чтобы найти расстояние до объекта, необходимо записать отметку времени, когда пакет передан, сравнить ее с меткой времени в возвращенном пакете (учесть время обработки пакета), разделить на два и умножить на скорость света. Принцип измерения сходен с принципом работы радара (рисунок 6) с тем исключением, что пакет не отражается физически, а принимается и отсылается обратно ведомым узлом.

Рис. 6. Иллюстрация принципа работы радара

Рис. 6. Иллюстрация принципа работы радара

Далее для отсылаемого сигнала будет использовано обозначение PING, для ответного сигнала – PONG или ACK.

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

  • время на прием и формирование ответного пакета ведомым устройством влияет на измерения;
  • для преодоления расстояния в один метр свету требуется всего лишь 3,3 нс, таким образом, для получения разрешения в 1 метр требуется частота работы таймера измерения времени как минимум 303 МГц.

Первое решается путем точного определения времени, которое ведомый узел затрачивает на формирование и отправку ответного пакета.

Вторая проблема несколько сложнее, но, тем не менее, может быть решена. Частота демодулятора в радиотракте в режиме ToF составляет 8 МГц, что дает временное разрешение 125 нс. Этот результат может быть улучшен за счет передискретизации при периодических замерах времен прохождения достаточно большого количества пакетов.

ToF-протокол

Для работы приложения требуются как минимум два устройства: ведущее, или мастер (Master), и ведомое (Slave). Оба устройства будут взаимодействовать в определенном диапазоне частот (точнее – частотных каналов) и работать с определенным приложением – списком синхрослов.

Первоначально ведомое устройство находится в состоянии приема на первой из заданных частот и ожидает передачи первого в списке синхрослова. Если ведомый получает соответствующий пакет, он отвечает пакетом ACK/PONG и меняет частотный канал и синхрослово по списку, заданному приложением.

Ведущее устройство передает пакет с первым синхрословом, после чего переходит в режим приема, ожидая ответа от ведомого со вторым синхрословом.

Аналогично этому, мастер, принявший пакет ACK/PONG в ответ на свой начальный PING, будет следовать той же схеме перестройки частоты (рисунок 7).

Рис. 7. Последовательность измерений ToF

Рис. 7. Последовательность измерений ToF

Схематично процесс обмена пакетами и этапы вычисления ToF представлены на рисунке 8. На этом рисунке:

  • TA – ведущий посылает пакет PING;
  • TB – ведущий переходит в режим приема;
  • TC – ведущий принимает ответный пакет;
  • TD – ведомый получает нужный пакет от ведомого;
  • TE – ведомый переходит в режим передачи;
  • TF – ведомый посылает ответ PONG.
Рис. 8. Схема обмена пакетами и этапы вычисления ToF

Рис. 8. Схема обмена пакетами и этапы вычисления ToF

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

Приложение должно согласовать с одноранговым устройством (устройствами), какие частоты следует использовать, каков должен быть порядок частот и что должен содержать список синхрослов.

Кроме того, оно должно вызывать ToF_run (…) в соответствующие моменты времени, чтобы инициализировать начальный поиск по синкловому сигналу, и пакет измерения времени.

Это также может быть показано в виде упрощенной диаграммы последовательности.

Временная диаграмма работы приложения – взаимодействие приложения, драйверов и радиочасти – представлена на рисунке 9.

Рис. 9. Временная диаграмма работы приложения

Рис. 9. Временная диаграмма работы приложения

Со стороны приложения последовательность действий выглядит довольно просто:

  1. инициализация;
  2. запуск;
  3. сбор результатов;
  4. калибровка.

Инициализация

Драйверу ToF требуется задание нескольких структур параметров с некоторой информацией, наиболее интересные параметры:

  • tofRole – роль устройства: ведущий/ведомый (Master/Slave);
  • pT1RSSIBuf – указатель на буфер пакетов;
  • pSyncWords – указатель на массив синхрослов;
  • numBurstSamples – количество синхрослов;
  • frequencies – указатель на массив частот;
  • numFreq – количество частот;
  • pfnTofApplicationCB – Callback-функция.

Очевидно, что списки и количество частот и синхрослов у ведущего и ведомого устройств должны быть идентичными. Размер буфера должен быть как минимум numBurstSamples/2.

Необходимо также выделить место для экземпляра класса драйвера ToF, структуры типа ToF_Struct, после этого вызывается функция инициализации/открытия драйвера: ToF_Handlehandle = TOFCC26XX_open (&tofStruct, &tofParams);.

Запуск приложения

После вызова функции TOFCC26XX_run (handle, tofEndTime), ее выполнение запускается немедленно. При активном Bluetooth функция вернет время в тиках таймера Radio Access Timer (RAT), задействованного в стеке BLE.

Сбор и обработка результатов 

Сбор и обработка результатов производятся callback-функцией, определяемой в параметрах инициализации. В данном случае она определена так:


ToF_BurstStattofBurstResults[TOF_MAX_NUM_FREQ] = {0};
void myCallback(uint8_t status) {
TOFCC26XX_getBurstStat(tofHandle, tofBurstResults);
// Dosomething
}

Необработанные выборки хранятся в одномерном списке вида, элементы которого – структуры типа ToF_BurstStat (таблица 1).

Таблица 1. Необработанные выборки

Freq 0 Freq 1 Freq 2 Freq 3 Freq 0 Freq N % max
RSSI: -67 RSSI: -59 RSSI: -63 RSSI: -61 RSSI: -63 RSSI: …
T1: 126720 T1: 127232 T1: 125952 T1: 125352 T1: 126952 T1: …

typedef struct
{
  uint16_t freq; // Frequency
  double tick; // Time of Flight in clock ticks, averaged over all valid samples for `freq`
  double tickVariance; // Variance of the tick values
  uint32_t numOk; // Number of packets received OK for `freq`
} ToF_BurstStat;

Значение в тиках переводится в метры путем вычитания количества тиков на нулевом расстоянии и умножения на коэффициент 6,25.

Калибровка

Из-за детерминированного, но ненулевого времени обработки и отправки ответного пакета оборота на ведомом устройстве необходимо записать среднее значение тиков (на каждой из частот) на известном расстоянии, а затем вычесть их из измеренного результата и добавить обратно калибровочное расстояние.

Устройство Bluetooth LE в режиме установленного соединения (рисунок 10) обязательно просыпается и передает или принимает в определенные моменты времени, известные как события соединения (Connection Events). Интервал между такими событиями называется интервалом соединения (Connection Interval).

Рис. 10. Временные диаграммы совместной работы BLE-устройств при установленном соединении

Рис. 10. Временные диаграммы совместной работы BLE-устройств при установленном соединении

В промежутках между окончанием одного события соединения и началом другого могут вызываться другие функции, связанные с работой радиочасти или стека протоколов. Время их работы также может варьироваться, для компенсации этого берется так называемый «временной штамп», значение которого учитывается при вычислениях.

ToF – суровая практика

Демонстрация работы инструментария Localization Toolbox доступна в последних версиях SDK, например, simplelink_cc2640r2_sdk_2_30_00_28. Проекты примеров находятся в папках:

  • C:\ti\simplelink_cc2640r2_sdk_2_30_00_28\examples\rtos\CC2640R2_LAUNCHXL\blestack\aoa_receiver;
  • C:\ti\simplelink_cc2640r2_sdk_2_30_00_28\examples\rtos\CC2640R2_LAUNCHXL\blestack\aoa_sender;
  • C:\ti\simplelink_cc2640r2_sdk_2_30_00_28\examples\rtos\CC2640R2_LAUNCHXL\blestack\tof_initiator;
  • C:\ti\simplelink_cc2640r2_sdk_2_30_00_28\examples\rtos\CC2640R2_LAUNCHXL\blestack\tof_responder.

Как следует из описания к проектам, реализующим методику AoA, минимальным набором аппаратного обеспечения будет пара отладочных плат CC2640R2 Launchpad и плата BOOSTXL-AOA с набором печатных антенн и средств их коммутации (рисунок 11).

Рис. 11. Внешний вид плат: а) CC2640R2 Launchpad; б) BOOSTXL-AOA с набором печатных антенн

Рис. 11. Внешний вид плат: а) CC2640R2 Launchpad; б) BOOSTXL-AOA с набором печатных антенн

Для запуска примеров ToF достаточно двух плат CC2640R2 Launchpad. На одной из них должна быть установлена прошивка TOF_initator, данный узел будет играть роль ведущего узла. На второй плате устанавливается прошивка TOF_responder – «ведомый узел».

При подключении подготовленных плат к ПК через программу-эмулятор терминала доступна информация, выводимая через последовательный порт (идеальным вариантом была бы плата расширения с UART-дисплеем). Посредством нажатий кнопок 1 или 2 на платах можно выбирать режим работы или осуществлять навигацию по аналогу меню. Вариант выбора отмечается символами «←» или «→» (кнопки BTN1 и BTN2 соответственно).

Демонстрационный проект может работать в двух режимах – с установлением соединения и без установления соединения.

В режиме с установлением соединения действия по запуску приложения производятся только на ведущем устройстве. Для этого надо инициировать поиск ведомых узлов (выбрать пункт меню “Discovery” и нажать кнопку на плате), в списке найденных устройств с запущенным приложением ToF найти нужный и выбрать подключение к данному узлу. По завершении подключения выбрать пункт “Toggle ToF Run” и снова нажать кнопку на отладочной плате. Ключевым требованием демонстрационного приложения является то, что перед непосредственным запуском “Toggle ToF Run” (началом измерения расстояния) ведущий и ведомый узлы должны находиться на расстоянии 1 метра (рисунок 12). Это связано с тем, что узлы (точнее – ведущий узел) проводят процедуру калибровки (рисунки 13 и 14)

Рис. 12. Подготовка плат с приложением ToF к запуску

Рис. 12. Подготовка плат с приложением ToF к запуску

Возможен вариант работы ToF без установки соединения. Для этого, опять же, необходимо установить отладочные платы на расстоянии 1 метр друг от друга. На ведомом узле надо запустить режим автоматического ответа на ToF-пакеты однократным нажатием кнопки BTN-2.

Рис. 13. Вывод на терминал стартовых сообщений ведущего и ведомого устройств (в качестве эмулятора терминала использовалась программа Hyper Terminal из набора сервисных программ WindowsXP)

Рис. 13. Вывод на терминал стартовых сообщений ведущего и ведомого устройств (в качестве эмулятора терминала использовалась программа Hyper Terminal из набора сервисных программ WindowsXP)

На ведущем узле в меню опций надо перейти в “Next Option”, появится пункт “Toggle ToF Run” вместо “Discovery”. Его выбор приводит к непосредственному запуску ToF.

Рис. 14. Вид консолей после запуска приложения в режиме соединения

Рис. 14. Вид консолей после запуска приложения в режиме соединения

Первые запуски приложения показали малую стабильность результатов измерений, особенно на расстояниях между узлами менее 4…5 метров. Несколько улучшить ситуацию удалось путем увеличения количества задействованных в алгоритме частот с четырех по умолчанию до восьми (файлы tof_initiator.c и tof_responder.c – так как изменения должны быть сделаны и у ведущего, и у ведомого устройств), строчка:


static uint8_t TOFInitiator_initTofParams(ToF_Params *params)
{
// uint16_t initialFreqList[] = {2402, 2420, 2460, 2480};
uint16_t initialFreqList[] = {2402, 2404, 2406, 2408, 2410, 2412, 2414, 2416, 2418, 2420, 2422, 2424, 2426};
…

Также некоторое улучшение стабильности показаний дает усреднение значений, полученных ToF по нескольким десяткам измерений (рисунок 15). Замеры энергопотребления узлов, даже в виде отладочных плат и без какой-либо дополнительной оптимизации энергопотребления, при постоянной активности алгоритма дали значение тока менее 1 мА (порядка 0,8 мА).

Рис. 15. Результаты тестирования ToF в здании (коридор)

Рис. 15. Результаты тестирования ToF в здании (коридор)

Заключение

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

Отличием последних версий СнК СС26хх от аналогичных конкурирующих решений является поддержка двух методик локального позиционирования – по углу на передатчик и по времени пролета пакетов. Как минимум, методика ToF демонстрирует приемлемые для ряда задач результаты, особенно на расстояниях между узлами более 6…8 метров.

Литература 

  1. Localization Toolbox;
  2. SimpleLink™ CC2640R2 SDK – Bluetooth® low energy.

Наши информационные каналы

Рубрики:
Группы товаров:

О компании Texas Instruments

В середине 2001 г. компании Texas Instruments и КОМПЭЛ заключили официальное дистрибьюторское соглашение, которое явилось результатом длительной и успешной работы КОМПЭЛ в качестве официального дистрибьютора фирмы Burr-Brown. (Как известно, Burr-Brown вошла в состав TI так же, как и компании Unitrode, Power Trend и Klixon). С этого времени компания КОМПЭЛ получила доступ к поставке всей номенклатуры производимых компанией TI компонентов, технологий и отладочных средств, а также ...читать далее