Как стать автором
Обновить

Системы сейсмического мониторинга: обзор, установка, настройка

Время на прочтение13 мин
Количество просмотров7.9K
Приветствую, уважаемые Хабравчане! Многие из нас живут в сейсмически нестабильных районах, и, полагаю, землетрясений не любит никто. Как технарю, да и вообще, данная тематика мне была всегда интересна: как и где землетрясения зарождаются, как определяют эпицентр и магнитуду, как производится мониторинг и т. д. И вот так получилось, что мне понадобилось сделать некую пилотную систему для мониторинга в реальном времени показателей нескольких сейсмодатчиков, расположенных достаточно далеко друг от друга и от центра, где эти данные и сохраняются, и обрабатываются. При возможности, хотелось также сделать 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
Теги:
Хабы:
Всего голосов 9: ↑9 и ↓0+9
Комментарии3

Публикации