Модераторы: Death_Morozz, null, Ale
Ale писал(а):По Dirt. Для извлечения данных из Dirt нет необходимости рыться в памяти. Дирт сам высылает UDP пакеты на указанный порт. Нужно их просто ловить. Структура пакета известна и описана в сети. Для настройки дирта на выдачу данных нужно ручками поправить конфигурационный файл. И такая возможность есть для целого ряда игр. Вот тут можно почитать, как настраивать игры на выдачу данных
http://www.fanaleds.com/readme
Ну а если есть сложности именно с приемом UDP пакетов, пиши в личку свой мэйл, вышлю мой рабочий пример на Delphi.
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 писал(а):Так и должно быть или я что-то не так сделал?
Ale писал(а):Если ты читал эту ветку, то я приводил ссылку на документацию по структуре данных
Ale писал(а):при настройке extradata = 0
Mezmeraiz писал(а):Нашел все что нужно - крен, тангаж, рыскание. Рассчитал продольную, поперечную и вертикальные скорости(или ускорения). Выглядит сейчас это так:
http://s019.radikal.ru/i606/1411/c7/0efc8ca4e63c.jpg
Теперь видимо нужно передать данные на SimTools? Как это сделать?
Ale писал(а):Что-то коллега Mezmeraiz пропал Хотелось бы узнать - есть ли дальнейшие сдвиги?
Mezmeraiz писал(а):Ale писал(а):Что-то коллега Mezmeraiz пропал Хотелось бы узнать - есть ли дальнейшие сдвиги?
Привет. Не осилил я Visual Basic=)
Далее привожу смещение в буфере пакета и данные, находящиеся в этом месте
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.
kimoncar писал(а):Скорее всего, я неверно следую подсказкам Ale.
Время заезда (1я "строка пакета") и время круга (2я "строка пакета") определил сразу, скорость машины по Y определял перебором (13я "строка пакета"), количество кругов (6я "строка пакета") увидел, после нескольких заездов.
SimAl писал(а):Не знаю, какой формат пакета ты пытаешься повторить, но если из цитаты в твоем сообщении, то у тебя неправильные типы: unsigned это Longword в паскале, а у тебя откуда-то Byte полезли.
kimoncar писал(а):Ale, SimAl, спасибо! Увидел ошибку, вчера весь вечер ковырялся и как-то упустил этот момент. Теперь если что-то путевое получится, то обязательно выложу на форум!
kimoncar писал(а): Можно ли как-то из этого пакета вертикальную составляющую ускорений получить, например, зная скорость Vz и координату z? ((Vz^2)/z)
Вернуться в X-SIMULATOR и RU-SIMULATOR & SimTools
Сейчас этот форум просматривают: Google [Bot] и гости: 209