MAL4X Научно-технический форум разработчиков симуляторов и автоматики


Симуляторы перегрузок. DIY электроника. ЭВМ. Компьютерные сети.
Up

Как получить данные из ИГР

Строим реалистичный симулятор перегрузок своими руками. Рекомендации. Советы.

Модераторы: Death_Morozz, null, Ale

Re: Как получить данные из ИГР

Сообщение kimoncar » 08 янв 2015, 18:29

С настройкой конфига игры я разобрался, делал прототип приборки для Dirt, но через X-Sim. А вот с приемом и разбором UDP-пакета пока сплошные вопросы.
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение kimoncar » 10 янв 2015, 17:08

Чтение памяти пока отложил на полку, сначала с более простым нужно разобраться.

Ale писал(а):По Dirt. Для извлечения данных из Dirt нет необходимости рыться в памяти. Дирт сам высылает UDP пакеты на указанный порт. Нужно их просто ловить. Структура пакета известна и описана в сети. Для настройки дирта на выдачу данных нужно ручками поправить конфигурационный файл. И такая возможность есть для целого ряда игр. Вот тут можно почитать, как настраивать игры на выдачу данных
http://www.fanaleds.com/readme
Ну а если есть сложности именно с приемом UDP пакетов, пиши в личку свой мэйл, вышлю мой рабочий пример на Delphi.


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

Принимает сообщения от вашей тестовой программы, которая лежала в архиве, и принимает пакеты из игры. С вашей тестовой программой все понятно: отправил слово "Вася", - его и получил. А игра шлет для меня пока непонятные вещи типа:

Код: Выделить всё
27d1 9ee2 809d 4324 21d0 8b43 77d0 87d0
a044 0c49 543f d0af 4629 43d0 811e c2a4
4038 71d1 8b42 6a16 e280 9a3a 317a 45d1
9400 c2ad 28d1 94d0 9809 79d1 912a 5b0e
3ed0 8230 18d1 98d0 93d0 827d 3f2f 797d
3f3e e280 b9d1 9c3c d19f 270e d195 3056
d0a2 d197 d0b3 d0b2 39d1 9725 d0b9 ...


Так и должно быть или я что-то не так сделал? :)
архив с приложением могу кинуть на почту, если интересно.
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение Ale » 10 янв 2015, 17:37

kimoncar писал(а):Так и должно быть или я что-то не так сделал?

Если ты читал эту ветку, то я приводил ссылку на документацию по структуре данных, которая высылается по UDP из Dirt (при настройке extradata = 0) В этом случае структура пакета полностью совпадает с данными из LFS
http://www.brunsware.de/insim/structOutSimPack.html
То есть игра тебе присылает набор чисел разного формата... Разве у меня в исходнике нет разбора этих данных?

При extradata = 1 пакет данных приобретает уже другой вид,
Скрытый текст
# offset type description
-----------------------------------
0 0 float time elapsed in seconds (since sending these packets started, not the race!)
1 4 float laptime in seconds
2 8 float position on track in metres from the start/finish line
3 12 float race progress, this - laps = lap progress
4 16 float world-Y position in metres
5 20 float world-Z position in metres
6 24 float world-X position in metres
7 28 float actual velocity in m/s
8 32 float world-Y velocity in m/s
9 36 float world-Z velocity in m/s
10 40 float world-X velocity in m/s

11 44 float ?
12 48 float ? roll *
13 52 float ?

14 56 float ?
15 60 float ? pitch *
16 64 float ?

17 68 float ? suspension travel front left?? *
18 72 float ? suspension travel front right?? *
19 76 float ? suspension travel rear left?? *
20 80 float ? suspension travel rear right?? *

21 84 float ?
22 88 float ?
23 92 float ?
24 96 float ?

25 100 float velocity rear left wheel in m/s
26 104 float velocity rear right wheel in m/s
27 108 float velocity front left wheel in m/s
28 112 float velocity front right wheel in m/s
29 116 float throttle 0 to 1
30 120 float steering in quarter turns (90°), -1.0 = 90° to the left, 1.0 = 90° to the right
31 124 float brakes 0 to 1
32 128 float clutch
33 132 float gear 0 Neutral, 9 Reverse, forwards speeds counting from 1
34 136 float lateral acceleration in g
35 140 float longitudinal acceleration in g
36 144 float lap counting from 0 (first lap = 0)
37 148 float Revolutions per 6 seconds, multiply by 10.0 to get RPM

вот тут народ его ковыряет
https://www.lfs.net/forum/thread/73997


ЗЫ: Коллеги вновь прибывшие. При всем уважении я больше не буду отвечать на вопросы типа "Вот данные, но я их не понимаю". Учитесь искать информацию в сети. Это первое. Второе - включайтесь в работу форума, делитесь идеями, конструкциями, готовыми продуктами.
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение kimoncar » 10 янв 2015, 18:22

Ale писал(а):Если ты читал эту ветку, то я приводил ссылку на документацию по структуре данных

Конечно читаю.. несколько раз в день. И документ видел, но пока ничего общего с моими данными из UDP не увидел. Хотя еще не вникал, пока только разбирался с приемом пакета.

Ale писал(а):при настройке extradata = 0

а у меня "extradata = 1"! Спасибо, буду дальше копать!

P.S.: ок
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Сим Тулс (Sim Tools) - новое ПО для симулятора

Сообщение Ale » 23 янв 2015, 13:55

Mezmeraiz писал(а):Нашел все что нужно - крен, тангаж, рыскание. Рассчитал продольную, поперечную и вертикальные скорости(или ускорения). Выглядит сейчас это так:
http://s019.radikal.ru/i606/1411/c7/0efc8ca4e63c.jpg
Теперь видимо нужно передать данные на SimTools? Как это сделать?

Что-то коллега Mezmeraiz пропал :? Хотелось бы узнать - есть ли дальнейшие сдвиги?
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение Mezmeraiz » 06 фев 2015, 12:37

Ale писал(а):Что-то коллега Mezmeraiz пропал Хотелось бы узнать - есть ли дальнейшие сдвиги?

Привет. Не осилил я Visual Basic=)
Mezmeraiz
Новичок
 
Сообщения: 13
Зарегистрирован: 31 окт 2014, 17:32
Благодарил (а): 5 раз.
Поблагодарили: 5 раз.
Баллы репутации: 15
Новичок

Re: Как получить данные из ИГР

Сообщение Ale » 06 фев 2015, 14:15

Mezmeraiz писал(а):
Ale писал(а):Что-то коллега Mezmeraiz пропал Хотелось бы узнать - есть ли дальнейшие сдвиги?

Привет. Не осилил я Visual Basic=)


Ну так давай вместе. Насколько я помню - надо писать спец-лончер для запуска и клиента? Напомни, плиз.. можно в личку пока...
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение kimoncar » 09 фев 2016, 18:04

Всем привет!
Нашел время и силы возобновить работу над извлечением данных из dirt2. Может я и "изобретаю велосипед", но уж очень хочется постичь данный вопрос.
Наткнулся на пост одного парня из Польши и по его примеру попытался в Delphi написать программку. При написании программы использовал Indy-компонент IdUDPServer для перехвата пакетов.

При формировании данных ориентировался на подсказки Ale:
Далее привожу смещение в буфере пакета и данные, находящиеся в этом месте
0х0000 - unsigned Time - время в милисекундах
0x0004 - float AngVelX - угловая скороть по оси X
0x0008 - float AngVelY - угловая скороть по оси Y
0x000C - float AngVelZ - угловая скороть по оси Z
0x0010 - float Heading - угол поворота вокруг оси Z в радианах против часовой стрелки
0x0014 - float Pitch - угол поворота вокруг оси X в радианах против часовой стрелки
0x0018 - float Roll - угол поворота вокруг оси Y в радианах против часовой стрелки
0x001C -float AccelX - ускорение вдоль оси X (поперечное)
0x0020 - float AccelY - ускорение вдоль оси Y (продольное)
0x0024 - float AccelZ - ускорение вдоль оси Z (вертикальное)
0x0028 - float VelX - скорость вдоль оси X (в метрах в секунду)
0x002С - float VelY - скорость вдоль оси Y (в метрах в секунду)
0x0030 - float VelZ - скорость вдоль оси Z (в метрах в секунду)
0x0034 - unsigned PosX - координата X (при делении на 65536 получим метры)
0x0038 - unsigned PosY - координата Y (при делении на 65536 получим метры)
0x003С - unsigned PosZ - координата Z (при делении на 65536 получим метры)
0x0040 - integer ID - идентификатор пакета (опционально)

Но не все так просто, как бы мне хотелось...

Код: Выделить всё
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle, StdCtrls,
  ComCtrls, ExtCtrls, Gauges;

type
   TPacket = record
   Time: Single;            // Общее время заезда, с
   LapTime: Single;       // Время круга, с
   AngVelX: Byte;        // ?
   AngVelY: Byte;        // ?
   AngVelZ: Byte;        // ?
   Heading: Single;      // Количество завершенных кругов
   Pitch: Single;        // ?
   Roll: Single;         // ?
   AccelX: Single;       // ?
   AccelY: Single;       // ?
   AccelZ: Single;       // ?
   VelX: Single;         // ?
   VelY: Single;         // Скорость машины по оси Y, м/с
   VelZ: Single;         // ?
   PosX: LongInt;        // ?
   PosY: LongInt;        // ?
   PosZ: LongInt;        // ?
   ID: Integer;          // ?

        end;

    TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    idpsrvr1: TIdUDPServer;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;

    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  DirtPack: Tpacket;

implementation

{$R *.dfm}

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
begin
      Adata.Read(DirtPack, sizeof(DirtPack));
      Label1.Caption := FloatToStr(trunc(DirtPack.Time)) + ' с';
      Label2.Caption := FloatToStr(trunc(DirtPack.LapTime)) + ' с';
      Label3.Caption := FloatToStr(trunc(DirtPack.AngVelX));
      Label4.Caption := FloatToStr(trunc(DirtPack.AngVelY));
      Label5.Caption := FloatToStr(trunc(DirtPack.AngVelZ));
      Label6.Caption := FloatToStr(trunc(DirtPack.Heading));
      Label7.Caption := FloatToStr(trunc(DirtPack.Pitch));
      Label8.Caption := FloatToStr(trunc(DirtPack.Roll));
      Label9.Caption := FloatToStr(trunc(DirtPack.AccelX));
      Label10.Caption := FloatToStr(trunc(DirtPack.AccelY));
      Label11.Caption := FloatToStr(trunc(DirtPack.AccelZ));
      Label12.Caption := FloatToStr(trunc(DirtPack.VelX));
      Label13.Caption := FloatToStr(trunc(Abs(DirtPack.VelY*3600/1000))) + ' км/ч';
      Label14.Caption := FloatToStr(trunc(DirtPack.VelZ));
      Label15.Caption := FloatToStr(trunc(DirtPack.ID));
    end;

end.


Скорее всего, я неверно следую подсказкам Ale.
Время заезда (1я "строка пакета") и время круга (2я "строка пакета") определил сразу, скорость машины по Y определял перебором (13я "строка пакета"), количество кругов (6я "строка пакета") увидел, после нескольких заездов.

Подскажите, пожалуйста, начинающему пограммисту :roll: , как без переборов определить что и в какой строке пришло? Ну и соответственно тип данных.
Я так понял, что копать нужно здесь http://www.brunsware.de/insim/ispackets_8h_source.html, но пользоваться этим я еще не научился.

Файлы Delphi7
My Sim.zip
(217.05 КБ) Скачиваний: 46

В программе IP 127.0.0.1, порт 20000.

P.S.: приношу извинения, за непрофессиональный язык изложения сути проблемы, я тут новичок.
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение SimAl » 09 фев 2016, 18:31

Не знаю, какой формат пакета ты пытаешься повторить, но если из цитаты в твоем сообщении, то у тебя неправильные типы: unsigned это Longword в паскале, а у тебя откуда-то Byte полезли.
Аватара пользователя
SimAl
SIMER
 
Сообщения: 379
Зарегистрирован: 22 ноя 2013, 20:03
Откуда: Кропивницкий
Благодарил (а): 58 раз.
Поблагодарили: 258 раз.
Баллы репутации: 128
ТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение Ale » 09 фев 2016, 19:07

kimoncar писал(а):Скорее всего, я неверно следую подсказкам Ale.
Время заезда (1я "строка пакета") и время круга (2я "строка пакета") определил сразу, скорость машины по Y определял перебором (13я "строка пакета"), количество кругов (6я "строка пакета") увидел, после нескольких заездов.


SimAl писал(а):Не знаю, какой формат пакета ты пытаешься повторить, но если из цитаты в твоем сообщении, то у тебя неправильные типы: unsigned это Longword в паскале, а у тебя откуда-то Byte полезли.


Согласен с SimAl... У тебя в приведенном фрагменте кода совершенно непонятная структура данных. При этом ты ссылаешься на мои подсказки :D
Еще раз внимательно прочитай структуру данных в пакетах UDP
http://mal4x.ru/post5374.html#p5374
И сравни с тем, что написано у тебя в коде...
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение kimoncar » 10 фев 2016, 15:23

Ale, SimAl, спасибо! Увидел ошибку, вчера весь вечер ковырялся и как-то упустил этот момент. Теперь если что-то путевое получится, то обязательно выложу на форум! :P
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение Ale » 10 фев 2016, 15:44

kimoncar писал(а):Ale, SimAl, спасибо! Увидел ошибку, вчера весь вечер ковырялся и как-то упустил этот момент. Теперь если что-то путевое получится, то обязательно выложу на форум! :P

И еще советую/рекомендую вместо

type
TPacket = record
Time: Single; ....


писать

type
TPacket =
packed record
Time: Single; ....


Delphi при компилировании имеет тенденцию выравнивать в памяти всякие рекорды до границы, кратной 8-и байтам. И если у тебя в одной структуре ( record ) данных будут данные разных типов, размер структуры в памяти будет отличаться от ожидаемого...
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Re: Как получить данные из ИГР

Сообщение kimoncar » 16 фев 2016, 16:28

Первые успехи!
На паскале написал простую программку Receiver.exe для перехвата пакета данных из Dirt2 при extradata=1 (127.0.0.1:20000).
Также программа отправляет данные на виджет Client.exe (127.0.0.1:20777), который визуализирует полученные данные. Виджет написал на processing.
Из данных пока только скорость, rpm и передача.
Если нужны исходники, скину или тут выложу.
Изображение
Вложения
Client.zip
(4.87 МБ) Скачиваний: 54
Receiver.zip
(217.71 КБ) Скачиваний: 44
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение kimoncar » 13 мар 2016, 14:21

Научил я этот клиент на processin'ге отправлять данные на ардуинку с тремя сервами. Из картона и проволоки соорудил макет (видео будет позже) и раскачал этот макет продольными и поперечными ускорениями из пакета при extradata=1. Все вроде неплохо, но не хватает ускорений по Z. Можно ли как-то из этого пакета вертикальную составляющую ускорений получить, например, зная скорость Vz и координату z? ((Vz^2)/z)

P.S.: Для тех, кто скачал Client.exe из предыдущего поста и не увидел его в работе: т.к. я - "ПОГРОМмист от Бога" то и клиент работает соответственно :oops: ... Чтобы он заработал на него нужно отправлять строку вида: SssRrrGgg, где ss, rr и gg значения скорости, оборотов и номера передачи из пакета при extradata=1.

А дальше клиент принимает строку и разбирает:
- после S до R - скорость;
- после R до G - обороты;
- после G до конца строки - номер передачи.

Вот такие костыли... :roll:
Аватара пользователя
kimoncar
Новичок
 
Сообщения: 14
Зарегистрирован: 08 янв 2015, 14:00
Благодарил (а): 8 раз.
Поблагодарили: 8 раз.
Баллы репутации: 5

Re: Как получить данные из ИГР

Сообщение Ale » 13 мар 2016, 15:31

kimoncar писал(а): Можно ли как-то из этого пакета вертикальную составляющую ускорений получить, например, зная скорость Vz и координату z? ((Vz^2)/z)

Ускорение есть изменение скорости в единицу времени. Вычитай из текущей скорости предыдущую (из предыдущего пакета данных) и дели на время, прошедшее от получения предыдущего пакета до получения текущего пакета. Az = (Vz - Vzпред)/(t-tпред)
Аватара пользователя
Ale
Разработчик
 
Сообщения: 1477
Зарегистрирован: 01 фев 2011, 20:48
Откуда: Дубна
Благодарил (а): 570 раз.
Поблагодарили: 595 раз.
Баллы репутации: 277
ТехнарьТехнарьТехнарь

Пред.След.

Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 196

cron
x

#{title}

#{text}