четверг, 8 января 2026 г.

Добавляем передачу данных из Opentrack для linux в игру ETS2 (steam версия).

Если у вас уже настроен Opentrack в linux системе (я использую Debian), вы столкнетесь с тем что он работает как эмулятор мышки.
Что приносит неудобство его использования, т.к. необходимо возвращать камеру сместив голову в противоположном направлении... ну совсем не то что хотелось бы увидеть в игре.

Настройка Opentrack.

Основные источники.

Источником данных использовался "PointTracker". Для обработки данных о расположении головы я использовал 3 ИК-диода расположенных по модели "Кепка".

В операционной системе windows в opentrack есть опция вывода эмулирующая аппаратное устройство - "трекер", к сожалению в операционных системах семейства linux данный вариант отсутствует. Для игры ETS2/ATS подходящим будет эмуляция геймпада/джойстика, таким образом за выходной интерфейс будет выступать "libevdev joystic reciever". Ниже приведен скриншот главного экрана opentrack с запущенной работой:

Горячие клавиши.

Нажимаем кнопку Настройки и в первой же вкладке назначаем клавишу или комбинацию клавиш для центрирования модели. Я использовал комбинацию клавиш Win+F11:

Выходной интерфейс.

На следующей вкладке настройка выходных данных которые будут поступать от программы в игру. Тут уже зависит от вашего желания и восприятия организма на изменение изображения. Мне достаточно использования 2-х осей - поворота головы влево/вправо и вверх/вниз. Эти оси и будут далее использоваться в настройке конфигурационного файла самой игры. Забегая вперед, у меня одна ось в игре обрабатывалась противоположно повороту головы, поэтому было добавлена опция инвертирования данных:

Tracker.

Следующая вкладка для настройки будет Tracker. Тут выставляем желаемые параметры для вашей вебкамеры и используемой модели. Доработку самой вебкамеры и создание физической модели я тут не рассматриваю.

На вложенной вкладке Камера произведем подстройку работы камеры. Главным критерием для нас это работа камеры с максимально возможной для нее скоростью передачи данных. Поэтому использовалось низкое разрешение и выставлялось желаемое количество FPS. Но на практике у меня максимально полученное соответствовало 15.

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

На вложенной вкладке Модель. Выбираем вложенную вкладку вашей модели. У меня используется модель Кепка и соответствующая ей вкладка. Укажите соответствующие размеры и проведите калибровку модели используя только две плоскости поворота головы - вверх/вниз и влево/вправо.

Кривые.

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


Настройка игры.

Необходимо найти конфигурационный файл controls.sii, он расположен в библиотеке steam в том месте где игра установлена, по умолчанию домашней папке ~/.steam/steam или если вы добавляли новую директорию то в ней. Переходим по следующему пути в директории библиотеки:

/steamapps/compatdata/227300/pfx/drive_c/users/steamuser/Documents/Euro Truck Simulator 2/steam_profiles/КОД_ПРОФИЛЯ

Где КОД_ПРОФИЛЯ - буквенно-цифровое наименование директории, возможно таких директорий будет несколько, если вы используете несколько аккаунтов steam на одном компьютере для игры.

В данной директории нас интересует файл  controls.sii. На всякий случай сделайте копию файла перед началом внесения правок, например сохраните с именем  controls.sii.bak.

Открываем в своем любимом редакторе этот файл. Внимание, номера строк могут отличаться от приведенных ниже!!! Не изменяйте эти номера.

Если вы настраивали например оси головы влево/вправо и вверх/вниз, то в строчке параметра input j_look_ud будет наименование необходимого устройства:

config_lines[14]: "input j_look_ud `joy2.ry`"

config_lines[15]: "input j_look_lr `joy2.rx`"

У меня это joy2.
Теперь очистим привязку к нашему устройству данных настроек. Приводим строки к такому виду, удалив содержимое в одиночных кавычках - значения параметра. Наименования в указанных строчках что вы удалите нам пригодятся чуть ниже, поэтому перепишите их себе хотя бы на листик или запомните:

config_lines[14]: "input j_look_ud ``"

config_lines[15]: "input j_look_lr ``"

Далее ищем строку с параметром mix headtron. Например вы найдете вот такие строчки:

config_lines[307]: "mix headtron `c_ht_on & (trackiron | hmdon | eyeposon)`"

config_lines[308]: "mix headtryaw `sel(trackiron, trackiryaw, 0) + sel(hmdon, hmdyaw, 0) + sel(eyeposon, eyeposyaw, 0)`"

config_lines[309]: "mix headtrpitch `sel(trackiron, trackirpitch, 0) + sel(hmdon, hmdpitch, 0) + sel(eyeposon, eyepospitch, 0)`"

Приступаем к корректировке. В первой строчке mix headtron мы оставим только одно значение параметра. В следующих строчках содержащие mix headtryaw и mix headtrpitch допишите ранее найденные значения параметров самое начало после одиночной кавычки. Получаем похожее на это:

config_lines[307]: "mix headtron `c_ht_on`"

config_lines[308]: "mix headtryaw `joy2.rx + sel(trackiron, trackiryaw, 0) + sel(hmdon, hmdyaw, 0) + sel(eyeposon, eyeposyaw, 0)`"

config_lines[309]: "mix headtrpitch `joy2.ry + sel(trackiron, trackirpitch, 0) + sel(hmdon, hmdpitch, 0) + sel(eyeposon, eyepospitch, 0)`"

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

Если все правильно выполнено - пользуемся.
Если после загрузки игры вы немного сместились и в игре расположение отрисовывает не по центру - используйте ранее назначенную в opentrack клавишу.

ПС. Если у вас перепутано влево/вправо с вверх/вниз - поменяйте в последних двух строчках дописанные значения параметров местами.

четверг, 18 декабря 2025 г.

Debian 12 + VirtualBox + QTech

Заметка на добавление репозитария в Debian 12 через новый формат deb822.

В каталоге /etc/apt/sources.list.d можно создавать отдельные файлы репозитория, воспользуемся этим.

Для VirtualBox cоздаём в каталоге файл с именем oracle-virtualbox.sources:

nano  /etc/apt/sources.list.d/oracle-virtualbox.sources

Содержимое файла:

# VirtualBox
#
Types:      deb
URIs:       https://download.virtualbox.org/virtualbox/debian/
Suites:     bookworm
Components: contrib
Enabled:    yes
Signed-By:  /etc/apt/keyrings/oracle_vbox_2016.asc
Architectures: amd64

Сохраняем. Теперь надо скачать файл верификации:

cd /etc/apt/keyrings/
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc

Выполняем аналогично для QElectroTech. Создаем файл qelectrotech.sources:

nano  /etc/apt/sources.list.d/qelectrotech.sources

Содержимое файла:

# draw electric diagrams with QElectroTech
#
Types:      deb
URIs:       https://debian.qelectrotech.org/qet/builds/debian/
Suites:     stable
Components: main
Enabled:    yes
Signed-By:  /etc/apt/keyrings/Qelectrotech_Repository.asc
Architectures: amd64

Сохраняем. Cкачиваем файл верификации:

cd /etc/apt/keyrings/
wget -q https://debian.qelectrotech.org/qet/builds/debian/Qelectrotech_Repository.asc

Можно приступить к установке: 

apt update
apt install virtualbox-7.1 qelectrotech

Пользуемся. 

пятница, 21 ноября 2025 г.

Debian + lightdm + xfce. Несколько мониторов в системе.

Имеется рабочее место с 3 мониторами + телевизор. Кода компьютер загружается и появляется окно ввода логина и пароля, оно расположено на не основном мониторе. Будем это исправлять.

Необходимо будет создать файл 99_user.conf в следующей директории:

/usr/share/lightdm/lightdm.conf.d

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

[Seat:*]
display-setup-script=xrandr --output DVI-D-0 --auto --primary --output HDMI-0 --same-as DVI-D-0 --output HDMI-1 --rotate right --left-of DVI-D-0 --output DP-2 --right-of DVI-D-0

Следующий файл 98_user.conf создаем директории:

/usr/share/lightdm/lightdm-gtk-greeter.conf.d

Этим укажем какой монитор сделать активным.Вот пример содержимого файла:

[greeter]
active-monitor=DVI-D-0

Перезагружаем компьютер и пользуемся с удовольствием)

ПС. Посмотреть на какие выходы видеокарты подключены мониторы поможет команда xrandr.

Debian multiseat. Компьютер на нескольких пользователей.

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

Приведу пример как я создал конфигурацию на 2 пользователя, но возможно и более, главное чтобы были необходимые компоненты и достаточно мощности компьютера. Для этого понадобиться 2 видеокарты, встроенная в процессор/материнскую плату и установленная в слот PCI Express (PCI-E), соответственно несколько мониторов и два комплекта периферии (мышь+клавиатура).

Для просмотра конфигурации текущего рабочего места нужно ввести команду, она выведет "дерево" устройств :

loginctl seat-status

Добавление устройств в новое рабочее место производим командой:

loginctl attach имя рабочего места полный путь к устройству

Вот пример добавления в рабочее место с именем seat1 видеокарты:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/drm/card1
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0/drm/renderD129
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.1/sound/card2

Следующим пунктом я добавил вторую звуковую карту, подключенную в слот PCI, таким образом звуки разных рабочих столов будут разделены:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:14.4/0000:06:06.0/sound/card3

Далее добавляю USB устройства, точнее USB порты куда подключены клавиатура, мышь и некоторые другие устройства, это не привязывает рабочее место к конкретной модели текущего USB устройства, и при замене например мышки, просто вставьте новую в тот же USB разъем где была старая:

loginctl attach seat1 /sys/devices/pci0000:00/0000:00:12.0/usb6/6-1
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:12.0/usb6/6-2
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:13.0/usb7/7-3
loginctl attach seat1 /sys/devices/pci0000:00/0000:00:16.0/usb9

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

udevadm monitor --environment --udev

Для этого достаем мышь, которой будет пользоваться второй пользователь, из порта USB, вводим вышеуказанную команду и затем вставляем мышь в порт. Остановить вывод команды просто нажав комбинацию клавиш "CTRL" + "C".
Интересующая строка будет содержать add, на пример:

UDEV  [8581.895083] add     /devices/pci0000:00/0000:00:12.0/usb6/6-1
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:12.0/usb6/6-1
SUBSYSTEM=usb
DEVNAME=/dev/bus/usb/006/004
DEVTYPE=usb_device
.....

Для вывода списка созданных рабочих мест вводим:

loginctl list-seats

Для просмотра конфигурации рабочего места seat1 вводим:

loginctl seat-status seat1

Тут должны отобразиться все устройства которые добавляли.

Теперь можно перезагрузить компьютер и войти в систему двумя разными учетными записями.

ПС. Если необходимо удалить все настройки рабочих мест, таким образом можно вернуть всё в начальное состояние, где все устройства "подключены" к рабочему месту по умолчанию seat0, вводим:

loginctl flush-devices

суббота, 16 августа 2025 г.

Conky + mdadm

 Решил выложить свой конфигурационный файл conky и вспомогательный файл для контроля состояния RAID массивов созданных через mdadm.
В данном варианте автоматизирован вывод дополнительной информации:

  • наименовании процессора AMD и его показателях;
  • наименовании видеокарты nVidia и её показателях;
  • о сетевых подключениях LAN (enp5s0) и Wi-Fi (wlp4s0) в зависимости от способа подключения к сети.

Содержимое conky.conf, расположенного по  следующему пути /home/$USER/.config/conky/:

--[[
Conky, a system monitor, based on torsmo
]]

conky.config = {
    alignment = 'top_right',
    background = true,
    border_width = 0,
    cpu_avg_samples = 2,
    default_color = 'white',
    default_outline_color = 'white',
    default_shade_color = 'black',
    double_buffer = true,
    draw_borders = false,
    draw_graph_borders = true,
    draw_outline = false,
    draw_shades = true,
    extra_newline = false,
    font = 'DejaVu Sans Mono:size=10',
    gap_x = 50,
    gap_y = 50,
    minimum_height = 50,
    minimum_width = 350,
    net_avg_samples = 2,
    no_buffers = true,
    out_to_console = false,
    out_to_ncurses = false,
    out_to_stderr = false,
    out_to_x = true,
    own_window = true,
    own_window_argb_value = 180,
    own_window_argb_visual = true,
    own_window_class = 'Conky',
    own_window_hints = 'sticky',
    own_window_type = 'normal',
    own_window_transparent = false,
    use_spacer = 'left',
    show_graph_range = false,
    show_graph_scale = false,
    stippled_borders = 0,
    update_interval = 1.0,
    uppercase = false,
    use_spacer = 'none',
    use_xft = true,
    xinerama_head = 1,
}

conky.text = [[
$nodename | $time
${scroll 40 $sysname $kernel on $machine}
${color green}Uptime:${alignr 1}$uptime
${color lightblue}${voffset -6}$hr$color
${color grey}CPU: ${color #FCAF3E}${execi 3600 cat /proc/cpuinfo | grep 'model name' | sed -e 's/model name.*: //' | uniq | awk '{print $0}'}
${color grey}CPU Temperature ${alignr 1}${color}${execi 10 sensors | grep 'k10|CPU' -E -A2 | grep '°C' | awk '{print $2}'}
${color grey}CPU Utilization ${alignr 1}${color}$cpu %
${color grey}CPU Frequency ${alignr 1}${color}$freq MHz
${color grey}GPU: ${color #FCAF3E}${execi 3600 nvidia-smi --query-gpu=gpu_name --format=csv,noheader,nounits} $color
${color grey}GPU Temperature ${alignr 1}${color}${execi 10 nvidia-settings -query [gpu:0]/GPUCoreTemp -t} °C
${color grey}GPU Utilization ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 71-73} %
${color grey}VRAM Utilization ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 47-64}
${color grey}GPU Power Draw ${alignr 1}${color}${exec nvidia-smi | grep % | cut -c 29-41}
${color grey}RAM Usage: ${alignr 1}${color}$mem / $memmax
$memperc% ${alignr 350}${color gold}${membar 10}
${color grey}Swap Usage: ${alignr 1}${color}$swap/$swapmax
$swapperc% ${alignr 350}${color gold}${swapbar 10}
${color lightblue}${voffset -6}$hr
${color grey}File systems:
${color lightblue}/ $color${fs_used /}/${fs_size /}
${color gold}${fs_bar 8 /}
${color lightblue}/home $color${fs_used /home}/${fs_size /home}
${color gold}${fs_bar 8 /home}
${color lightblue}/mnt/images[md121] $color${fs_used /mnt/images}/${fs_size /mnt/images}
${color gold}${fs_bar 8 /mnt/images}
${color lightblue}/mnt/multimedia[md122] $color${fs_used /mnt/multimedia}/${fs_size /mnt/multimedia}
${color gold}${fs_bar 8 /mnt/multimedia}
${color lightblue}${voffset -6}$hr
${color grey}   Name             __PID__ ${color 33E0FF}_CPU%_ ${color FF33E0}_MEM%_
${color 33E0FF}CPU% ${stippled_hr 1}
${color red}   ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color purple}   ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color orange}   ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color FF33E0}MEM% ${stippled_hr 1}
${color red}   ${top_mem name 1} ${top_mem pid 1} ${top_mem cpu 1} ${top_mem mem 1}
${color purple}   ${top_mem name 2} ${top_mem pid 2} ${top_mem cpu 2} ${top_mem mem 2}
${color orange}   ${top_mem name 3} ${top_mem pid 3} ${top_mem cpu 3} ${top_mem mem 3}
${color grey}${voffset -6}$hr
${color 33E0FF}${cpugraph cpu0 50,50 33E0FF FF0000 -tl} ${cpugraph cpu1 50,50 33E0FF FF0000 -tl} ${cpugraph cpu2 50,50 33E0FF FF0000 -tl} ${cpugraph cpu3 50,50 33E0FF FF0000 -tl} ${color FF33E0}${memgraph 50,120 FF33E0 FF0000 -tl}
${color grey}Processes:$color $processes  ${color grey}Running:$color $running_processes
${if_up enp5s0}${color lightblue}${voffset -6}$hr
${color grey}LAN up/down:${alignr 1}$color${upspeed enp5s0} / ${downspeed enp5s0}
$endif${if_up wlp4s0}${color lightblue}${voffset -6}$hr
${color grey}Wi-Fi up/down:${alignr 1}$color${upspeed wlp4s0} / ${downspeed wlp4s0}
$endif${color lightblue}${voffset -6}$hr
${color grey}md121 $color ${eval $${if_match "0" == "${execi 60 cat /proc/mdstat | grep md121 -A 1 | gawk -f ~/bin/conky4mdadm.sh --}"}$${color red}Warning!$${else}$${color green}[UU]$${endif}} ${color grey} ${diskio_read /dev/md121} ${color grey} ${diskio_write /dev/md121}
${color grey}md122 $color ${eval $${if_match "0" == "${execi 60 cat /proc/mdstat | grep md122 -A 1 | gawk -f ~/bin/conky4mdadm.sh --}"}$${color red}Warning!$${else}$${color green}[UU]$${endif}} ${color grey} ${diskio_read /dev/md122} ${color grey} ${diskio_write /dev/md122}
${color lightblue}${voffset -6}$hr
${color grey}ssd1 ${color grey} ${diskio_read /dev/sdd1} ${color grey} ${diskio_write /dev/sdd1}
${color grey}ssd2 ${color grey} ${diskio_read /dev/sdd2} ${color grey} ${diskio_write /dev/sdd2}
]]

Содержимое conky4mdadm.sh, расположенного по  следующему пути /home/$USER/bin/:

#!/bin/gawk -f
# This script checks the status of RAID arrays from /proc/mdstat
/_/ { state = 0; exit }
/blocks/ { state = 1 }
END { print state }

Файлу устанавливаем разрешение на исполнение.

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

вторник, 19 ноября 2024 г.

Debian + Arduino +ESP32 - фиксируем порты)

Столкнулся с необходимостью "закрепить" порт за микроконтроллером типа Arduino Nano/Uno и ESP32, особенно если кроме этих плат у вас есть другие usb устройства с виртуальным COM-портом, например такими как usb-ttl платы и др.

Создаем в каталоге /etc/udev/rules.d файл 99-usb-mk.rules со следующим содержимым:

# Fix Arduino (CH340) and ESP (CH9102)
ACTION!="add", SUBSYSTEMS!="usb", GOTO="END"
KERNEL=="ttyACM[0-9]*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", SYMLINK+="ttyESP", MODE:="0660", GROUP="dialout"
KERNEL=="ttyUSB[0-9]*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", SYMLINK+="ttyARD", MODE:="0660", GROUP="dialout"
LABEL="END"

 

Теперь можно перезагрузить компьютер или ввести команду в консоли:

udevadm control --reload

Готово. Теперь к Arduino и ESP можем обращаться через /dev/ttyARD и /dev/ttyESP соответственно.

Ну и проверьте входит ли ваш пользователь в группу dialout.

ПС. К сожалению те же платы usb-ttl могут встречаться на аналогичных микросхемах что приведет к ложной фиксации порта. 

ПСС. Добавление группы пользователю:

sudo usermod -a -G dialout $USER

среда, 20 апреля 2022 г.

x11vnc как демон

Создаем "Удаленный рабочий стол" как сервис в linux.


Создал файл следующего содержимого:

 cat > /etc/systemd/system/x11vnc.service <<\eof
[Unit]
Description=VNC Server for X11
Requires=display-manager.service
After=network-online.target ##optional for better performance
Wants=network-online.target ##optional for better performance
[Service]
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /etc/x11vnc.pwd -shared -forever -rfbport 5909 -o /var/log/x11vnc.log
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
eof
echo Zadajte parol dlja dostupa:
x11vnc -storepasswd /etc/x11vnc.pwd
echo Zapusk:
echo systemctl start x11vnc
systemctl daemon-reload

Опишу что делаем с помощью него:
- создаем файл /etc/systemd/system/x11vnc.service, который будет являться демоном системы;
- создаем пароль для доступа;
- обновляем в системе список демонов.

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

systemctl start x11vnc

Можно включить демон на постоянно:

systemctl enable x11vnc

Пробуем подключиться. Для Windows использовал UltraVNC Viewer,  а в Debian - Remmina.