Приветствую, уважаемые Хабравчане! Многие из нас живут в сейсмически нестабильных районах, и, полагаю, землетрясений не любит никто. Как технарю, да и вообще, данная тематика мне была всегда интересна: как и где землетрясения зарождаются, как определяют эпицентр и магнитуду, как производится мониторинг и т. д. И вот так получилось, что мне понадобилось сделать некую пилотную систему для мониторинга в реальном времени показателей нескольких сейсмодатчиков, расположенных достаточно далеко друг от друга и от центра, где эти данные и сохраняются, и обрабатываются. При возможности, хотелось также сделать WWW страничку, где можно было бы в реальном времени посмотреть показатели с датчиков. Задача оказалась достаточно нетривиальной, и после того, как был достигнут определённый успех в данном направлении, я решил, что было бы неплохо сделать обзорную статью/мануал по данному вопросу, что в дальнейшем может сильно облегчить кому-то жизнь, особенно учитывая, что информации в Рунете по данному вопросу я не нашёл вообще. А если так взять, в общем-то ни одного HowTo даже в англоязычном интернете я не смог найти, хотя общей и сильно разрозненной информации порядочно. Также я не знал ни одного человека (да их и не так много вообще оказывается), который бы мог направить в нужном направлении, потому до всего пришлось доходить самому, копая Гугл, мануалы и софт с железом.
Итак, эта статья — как настроить сейсмографы фирмы Guralp, снять с них данные и отрисовать в реальном режиме времени на WWW страничке показатели сейсмодатчиков. Также описывается, какой софт используется, где его взять и как настроить.


Сейсмометры:

В моем распоряжении находилось 2 сейсмометра немецкого производства — Guralp CMG-6TD. Данные девайсы представляют собой связку набора датчиков (гироскопов, массы и температуры), ADC, контроллера с определённым объёмом Flash памяти и упакованных в герметичный круглый корпус. С каждого датчика можно снимать данные как в реальном времени (через COM-порт или внутренний TCP сервер, который данный COM-порт делает удалённо доступным), так и просто зарыть его где-то поглубже, а потом скинуть данные на диск через FireWire со внутренней флэшки. Сейсмометры должны определять движение по 3 направлениям: 2 горизонтальным (E,N) и вертикальному (Z). Соответственно при установке на рабочую поверхность, эти датчики центрируются, а также выставляются по компасу. Время часов датчиков синхронизируется по GPS, который подключается непосредственно к самому датчику 15 метровым кабелем. Если GPS подключить нет возможности, то через терминал возможна корректировка встроенного RTC.
image

А это один из датчиков, установленный на специальном постаменте в подвале сейсмического инстутута в регионе, недалеко от Душанбе



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



Схема подключения системы:

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

Схема подключения одного датчика получилась следующая:

Датчик → (ethernet) → WiFi client box → (wifi link) → WiFi AccessPoint → Internet → Central server

Съём данных с датчиков:

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

SCREAM:

Универсальная программа от производителя для работы со всей линейкой сейсмологического оборудования Guralp. Предназначена для контроля оборудования приема и сохранения данных с сейсмометров в реальном времени. Скачать её можно бесплатно с сайта производителя, правда, ссылка на раздел закачек на сайте отсутствует, и её присылают после прохождения простой регистрации. Есть в 2-х вариантах — под Linux и под Win. Код закрыт, распространяются только бинарники. Из всего зоопарка (в хорошем смысле) дистрибутивов Линукс, я уже лет 15 в работе использую только один — это Debian Linux, соответственно, под ним я и настраивал работу данного программного продукта.

Debian Linux, 64 bit: scream имеется только в виде tar.gz или .rpm пакета (производитель рекомендует CentOS) — и только 32 bit сборка. Для того, чтобы запустить его под 64 битной инсталляцией, необходимо установить пакет ia32libs, который добавит поддержку 32 битных бинарников в 64 битной системе. После этого можно распаковать пакет scream в директорию, где вы планируете его использовать. Запускать его необходимо через прилагающийся .sh скрипт, поскольку он использует собственные библиотеки, и скрипт прописывает к ним путь.
SCREAM программа интерактивная, с GTK интерфейсом, поэтому запускать её нужно из Х-ов, либо под виртуальным Х сервером Xvfb — как это сделал я, если установка X на сервере не нужна.

SCREAM достаточно требователен к процессорным ресурсам, и я много времени и нервов потратил разбираясь с причинами его зависания, которые сильно уменьшились при переносе инсталляции с Dual-Core лаптопа Samsung на двух-ядерный XEON Dell. Хотя, кроме процессора на машинах, все остальное было почти одинаковым (2Г памяти, 250Г HDD), но ситуация изменилась очень чувствительно. Поэтому можно посоветовать, не и��пользуйте машину со слабым процессором в качестве сервера для SCREAM. Хотя кто знает, может он патологически Самсунг не переваривает?

Связываем SCREAM и Guralp CMG-6TD:
Чтобы получить данные с сейсмометра, нужно связать Guralp со SCREAM одним из доступных способов: Через COM порт или посредством TCP-IP. Я опишу процедуру связи только по TCP-IP, для краткости. В Guralp используется TCP-serial сервер производства Lantronix, и к нему имеется Telnet и WWW интерфейс для настройки параметров. По умолчанию Guralp (только при включении) пытается получить IP адрес по DHCP. Детально, как присвоить адрес и попасть на WWW интерфейс описывать не буду, поскольку это детально описано в руководстве. Сосредоточимся на тонкостях и настройке. Заходить на WWW интерфейс нужно исключительно через Internet Explorer, поскольку криво написанные Javascript скрипты и другая начинка интерфейса не работают ни в каком другом браузере, выдавая абсолютно неадекватное содержимое полей ввода, таких как IP адрес и т. д. Поскольку я Windows использую очень редко, то, что под Internet Exploiter можно нормально все настроить — понимание пришло не сразу. Другая тонкость: странички настроек кешируются, и при следующем входе, после применения настроек, показывают старую информацию, обновление не помогает. Поэтому эксплорер нужно закрывать, запускать заново (ну или сбрасывать кэш, что дольше), если нужно играться с настройками.
Поскольку по DHCP устройство пытается получить адрес только после включения, я настроил статический IP адрес.

Теперь, что нигде не описано: Меню Serial Connection
Поскольку данные забираются с устройства, даже если через TCP-IP все равно используя TCP-Serial сервер, тут у нас есть настройка BaudRate — По умолчанию она (обычно) 19200 — но при использовании более высокого SampleRate для съема данных с Guralp может быть смысл её увеличить. Просто так это делать нельзя, так как данная настройка должна соответствовать настройке выходного ком-порта устройства, которое конфигурируется из другого меню, другим способом. Если они не будут соответствовать друг-другу — WWW интерфейс перестанет функционировать, и будет необходимо восстановить работу, используя Telnet, порт 9999, и там вернуть скорость в соответствии со скоростью внутреннего ком-порта устройства.

Меню Connecion: Выбираете тип соединения. В руководстве это описано очень скудно, и только в общих чертах.
Выбираем протокол (TCP) и если локальный порт установлен в 10001, удалённый порт в 1567 и Remote Host в 0.0.0.0, то все нормально — подключиться можно с любого IP (в принципе это настройки по умолчанию)

Scream: Запускаем, затем правой кнопкой мыши щелкаем на Network → Configure, затем в открывшемся окне выбираем вкладку My Client и опять правой кнопкой щелкаем на пустое поле списка сереров → Add TCP Server → Добавляем IP нашего устройства:10001. Заметьте, что порт 10001 используется на самом Guralp. Нажимаем Ок, и выбрав только что добавленный сервер, нажимаем Ctrl+C (Connect).

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

На данном этапе первая часть эпопеи закончена. Мы имеем установленный софт SCREAM, и датчик, который с ним, собственно, связан, и отдает данные. Теперь с этими данными нужно что-то сделать. SCREAM умеет не только принимать данные с сейсмометров, но и передавать далее по TCP-IP. Главное, чтобы клиент поддерживал SCREAM протокол.

image

Потратив какое-то время в поисках открытого софта в интернете для обработки сейсмических данных, я остановился на системе «Earthworm» (Земляной червь), поскольку код системы открыт, и есть сотня институтов по всему миру, которые используют эту систему для сбора, автоматизированного анализа и представления сейсмических данных. Обратной стороной медали является то, что система довольно старая, слабо поддерживается, и многие компоненты откровенно кривые и падучие. Но поскольку бесплатной альтернативы не нашёл, пришлось разбираться с ней. Документация, исходный код и бинарники можно найти и скачать отсюда: folkworm.ceri.memphis.edu/ew-doc

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

EARTHWORM — «И еще земляным червяком!» ((с) шакал из Маугли)

Система построена по принципу многокомпонентости, ядром является бинарник «startstop», который создает необходимые регионы Shared Memory для обмена данными и производит запуск и мониторинг других бинарников. Но, я организовал запуск компонентов отдельно, поскольку в них плохо обрабатываются исключения (в некоторых проблема связи с сервером приводит к аварийному выходу). Соответственно, запускать их необходимо в цикле.

Компоненты:
Поскольку моей базовой целью является не анализ, а только отрисовка данных, я буду использовать только соответствующие этой задаче компоненты:
scream2ew: передача данных от сервера SCREAM во внутренний буфер EARTHWORM
wave_serverV: забор данных из внутреннего буфера, хранение на диске и отдача клиентам по сети
heli_ewII: отрисовка данных на манер helicorder (сейсмограф), и представлен в виде простой WWW страницы. Данные забираются из wave_server

Конфигурационные файлы хранятся в директории run/params и имеют вид daemon_name.d Все использованные мною конфигурационные файлы, можно скачать со странички проекта, которая дана в конце данного обзора. Это может быть очень полезно, поскольку описание параметров, часто, крайне недостаточно.

Итак, устанавливаем Earthworm:

Создаем пользователя earthworm:
adduser earthworm
su - earthworm


Распаковываем бинарную сборку — earthworm_7.4
создаем директории
 
run
run/datafiles
run/gifs
run/params
run/scripts


перемещаем все файлы из директории earthworm_7.4/params в run/params

редактируем earthworm_7.4/environment/ew_linux.bash
для простоты в секции # Or set your own values directly
добавим
export EW_HOME=/home/earthworm/                                                                                                                          
export EW_VERSION=earthworm_7.4                                                                                                                          
export EW_RUN_DIR=$EW_HOME/run


Затем создаем симлинку файла параметров:
ln -s /home/earthworm/earthworm_7.4/envoironment/earthworm.d /home/earthworm/run/params/earthworm.d

Это нужно потому, что разные компоненты ищут данный файл в разных директориях.

При запуске компоненты могут не запуститься с ошибкой «невозможно определить свой ID модуля» — модули и их ID прописаны в файле earthworm.d — просто посмотрите в конфигурации модуля как он себя называет (например MOD_SCREAM2EW) и добавьте его в список модулей со следующим ID — там все интуитивно.

После этого нужно создать скрипты запуска:

#param
#!/bin/bash
HOME=/home/earthworm
BIN=$HOME/earthworm_7.4/bin
EWE=$HOME/earthworm_7.4/environment
PARAM=$HOME/run/params
SLEEPTIME=2
. $EWE/ew_linux.bash
ulimit -c unlimited


#startstop.sh
#!/bin/bash
DIR=`dirname $0`
ME=`basename $0`
ST=/tmp/$ME.stop
EWENV=/home/earthworm/earthworm_7.4/environment
DAEMON=startstop
. $DIR/param
rm $ST
while true; do
    echo Starting $DAEMON . create $st to break cycle, and kill the daemon $DAEMON
    $BIN/$DAEMON
    if test -f "$ST"; then
	echo $ME exitting...
	rm $ST
	exit 0
    fi
    echo Restarting in $SLEEPTIME seconds...
    sleep $SLEEPTIME
done


#scream2ew.sh
#!/bin/bash
DIR=`dirname $0`
ME=`basename $0`
ST=/tmp/$ME.stop
EWENV=/home/earthworm/earthworm_7.4/environment
DAEMON=scream2ew
. $DIR/param
rm $ST
while true; do
    echo Starting $DAEMON . create $st to break cycle, and kill the daemon $DAEMON
    $BIN/$DAEMON $PARAM/$DAEMON.d
    if test -f "$ST"; then
	echo $ME exitting...
	rm $ST
	exit 0
    fi
    echo Restarting in $SLEEPTIME seconds...
    sleep $SLEEPTIME
done 


и еще wave_severV.sh и heli_ewII.sh — для них просто замените название программы в переменной DAEMON скрипта scream2ew.sh. Скрипты сделаны так, что цикл прерывается при обнаружении в /tmp файла имя_скрипта.stop и, соответственно, они последовательно запускаются из старт скрипта из init.d

Все скрипты можно скачать на страничке проекта, и приводить их здесь нет никакого смысла.

Теперь нужно уделить внимание конфигурационным файлам:

startstop — startstop_unix.d
 nRing               3                                                                                                                                   
 Ring   WAVE_RING 1024                                                                                                                                   
 Ring   PICK_RING 1024                                                                                                                                   
 Ring   HYPO_RING 1024                                                                                                                                   
 MyModuleId    MOD_STARTSTOP  # Module Id for this program                                                                                               
 HeartbeatInt  50             # Heartbeat interval in seconds                                                                                            
 MyClassName   OTHER             # For this program                                                                                                      
 MyPriority    0             # For this program                                                                                                          
 LogFile       1             # 1=write a log file to disk, 0=don't                                                                                       
 KillDelay     10            # seconds to wait before killing modules on                                                                                 
 HardKillDelay  5             # number of seconds to wait on hard shutdown                                                                               
 Process          "statmgr statmgr.d"                                                                                                                    
 Class/Priority    OTHER 0 


Строчка Process «name» и Class/Priority указывает, какой из бинарников запускать. Мы запускаем только статус. Остальное будет запущено извне, другими скриптами.

Scream2ew — scream2ew.d
MyModuleId         MOD_SCREAM2EW  # module id for this instance of scream2ew.                                                                            
RingName           WAVE_RING      # shared memory ring for input/output                                                                                  
LogFile            1              # 0 to turn off disk log file; if 1, do log.                                                                           
Verbose            1              # 1=> log every packet. 0=> don't                                                                                      
HeartBeatInterval  30             # seconds between heartbeats                                                                                           
PortNumber         1567                                                                                                                                  
Server             192.168.88.1  # If specified name or IP-number this module                                                                          
ChanInfo "DUSH0 6817Z0 TJ DYU -- BHZ 1"                                                                                                                  
ChanInfo "DUSH0 6817N0 TJ DYU -- BHN 2"                                                                                                                  
ChanInfo "DUSH0 6817E0 TJ DYU -- BHE 3"


Тут в chaninfo необходимо помнить, что осуществляется импорт данных из внешней системы, и данные устройства DUSH0 и потока 6817Z0 импортируются в earthworm как TJ DYU – BHZ 1
Называния каналов TJ DYU и т. д. Произвольные, но нужно соблюдать количество символов каждого компонента

wave_serverV — wave_serverV.d
MyModuleId    MOD_WAVESERVERV # wave_server's module id                                                                                                  
RingName      WAVE_RING        # name of transport ring to get data from                                                                                 
LogFile       1                # 1=write log file to disk; 0=don't                                                                                       
                               # 2=write to module log but not stderr/stdout                                                                             
HeartBeatInt  15               # seconds between heartbeats to statmgr                                                                                   
ServerIPAdr   192.168.88.1     # address of machine running wave_server: geops.geophys                                                                   
ServerPort    16022            # port for receiving requests & sending waves                                                                             
GapThresh     1.5              # threshhold for gap declaration.                                                                                         
SocketTimeout 11000  # Timeout length in MILLISECONDS for socket calls                                                                                   
ClientTimeout  60000 # Optional.  Not recommended feature but it does work.                                                                              
IndexUpdate   10                                                                                                                                         
TankStructUpdate 1                                                                                                                                       
TankStructFile  /home/earthworm/run/datafiles/p1000-1.str                                                                                                
#           SCNL      Record       Logo                  File Size   Index Size       File Name     New.......                                           
#          names       size  (TYPE_TRACEBUF2 only)         (megabytes) (max breaks)     (full path)      Tank......                                      
Tank    DYU BHZ TJ -- 4096   INST_UNKNOWN    MOD_WILDCARD       1         10000         /home/earthworm/run/datafiles/p1001.tnk                          
Tank    DYU BHN TJ -- 4096   INST_UNKNOWN    MOD_WILDCARD       1         10000         /home/earthworm/run/datafiles/p1002.tnk                          
Tank    DYU BHE TJ -- 4096   INST_UNKNOWN    MOD_WILDCARD       1         10000         /home/earthworm/run/datafiles/p1003.tnk                          
Tank    DYU BHM TJ -- 4096   INST_UNKNOWN    MOD_WILDCARD       1         10000         /home/earthworm/run/datafiles/p1004.tnk                          
RedundantTankStructFiles 1                                                                                                                               
RedundantIndexFiles      1                                                                                                                               
TankStructFile2  /home/earthworm/run/datafiles/p1000-2.str                                                                                               
InputQueueLen 4000                                                                                                                                       
MaxMsgSize 4096                                                                                                                                          
SocketDebug 0                                                                                                                                            
ReCreateBadTanks 1                                                                                                                                       
QueueReportInterval 5


Тут мы создаем так называемые танки (цистерны) — там хранятся данные, принятые с устройств. Они же могут быть запрошены по сети. Обратите внимание, что созданные каналы DY BHZ TJ — как раз идут в отдельные танки. Также параметр MaxMsgSize 4096 обязателен для работы со SCREAM. Необходимо добавить что wave_serverV не идеален для хранения данных, и в случае если блоки данных с датчика приходят в перемешку, т.е. не соблюдается их очередность по таймстампу, то он данные блоки отвергает. Есть альтернативная реализация wave_server на JAVA — Winston WaveServer — университета Аляски, ссылку на закачку удалось найти только в архивах почтовой переписки пользователей Earthworm, потому привожу ее в конце, в ссылках. Он реальзует некоторые (но не все) фичи и баги оригинального и хранит данные в MySQL базе.

heli_ewII — heli_ewII.d
LogSwitch 1                                                                                                                                              
MyModuleId MOD_HELI_EWII                                                                                                                                 
RingName WAVE_RING                                                                                                                                       
HeartBeatInt<-->10                                                                                                                                       
wsTimeout 30 # time limit (secs) for any one interaction with a wave server.                                                                             
WaveServer 192.168.88.1 16022      "Dushanbe"                                                                                                            
GifDir   /home/earthworm/run/gifs                                                                                                                        
#     S    C   N  L 04 05  06  07   08 09 10  11  12 13   14   15  Comment                                                                               
 Plot DYU BHN TJ -- 12 5   +5  TJT  1  1  20  20  15 0.1  0.05  1   "Dushanbe Center N"                                                                  
 Plot DYU BHZ TJ -- 12 5   +5  TJT  1  1  20  20  15 0.1  0.05  1   "Dushanbe Center Z"                                                                  
 Plot DYU BHE TJ -- 12 5   +5  TJT  1  1  20  20  15 0.1  0.05  1   "Dushanbe Center E"                                                                  
 Days2Save     365    # Number of days to display on web page; default=7                                                                                 
 UpdateInt     1    # Number of minutes between updates; default=2                                                                                       
 RetryCount    2    # Number of attempts to get a trace from server; default=2                                                                           
Clip 5                                                                                                                                                   
SaveDrifts                                                                                                                                               
Make_HTML                                                                                                                                                
IndexFile welcome.html                                                                                                                                   
Debug                                                                                                                                                    
WSDebug


Здесь указывается, какие потоки данных запрашивать у wave_serverV и как их отрисовывать. Все, достаточно, интуитивно. Параметр количества часов назад не работает, поэтому график при запуске будет пустой, и только через некоторое время (до 15 минут) начнут появляться данные. При запуске данный модуль округляет время и часто хочет продолжить со следующего 15-минутного интервала. Это видно в лог-выводе.

Теперь можно в ручном режиме запустить скрипты в следующей последовательности:
startstop.sh
scream2ew.sh
wave_serverV.sh
heli_ewII.sh


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

Чтобы у wave_server появилось достаточно данных, может пройти пару минут, только потом heli_ewII эти данные обнаружит и сможет их отрисовать.



Конечно, в мире есть большое количество и другого сейсмологического оборудования и программного обеспечения, например Nanometrics, канадского производства, делает очень хорошие, законченные системы, с подключением к спутниковому терминалу. Это означает, что в центре устанавливается HUB VSAT и в отдаленных горных районах, устанавливаются VSAT размером поменее, которые периодически отправляют данные со своих датчиков. Но это уже тема другого обзора.

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

Страничка проекта:
http://seismo.eastera.tj

Конфигурационные файлы и скрипты:
http://seismo.eastera.tj/downloads

Живой helicorder проекта:
http://seismo.eastera.tj/helicorder

Earthworm:
http://folkworm.ceri.memphis.edu/ew-doc/

Альтеративная реализация wave_server на JAVA: http://www.avo.alaska.edu/Software/winston/W_Manual_SR.html

Helicorder страничка Maryland:
http://www.ceri.memphis.edu/seismic/stations/index.html