PiBoSo Official Forum

GP Bikes => Mods => Plugins => Topic started by: PiBoSo on July 18, 2018, 04:01:57 PM

Title: UDP Proxy
Post by: PiBoSo on July 18, 2018, 04:01:57 PM
Starting with Beta14, GP Bikes integrates a plugin that allows to receive UDP data from the simulated bike in realtime.

To enable it and set the parameters, edit the file "gpbikes/proxy_udp.ini" in the GP Bikes installation folder:
[params]
enable = 1
port = 30000
ip = 127.0.0.1:30001
delay = 1

port: outbound port
ip: inbound address and, optional, port ( if missing, the outbound port is used )
delay: hundredths of second between packets

The packet format:
"data": null-terminated string
"state": integer. 0: software running; 1: on-track, simulation paused; 2: on-track, simulation running
"time": integer, milliseconds.
The rest of the packet follows the "SPluginsBikeData_t" structure of the proxy plugin: https://www.gp-bikes.com/downloads/gpb_proxy.c


In the proxy_udp.ini file, add the line
info = 1
to enable the streaming of the event, session, lap and split data.

Data format of the event packet, sent every second:
"evnt": null-terminated string
The rest of the packet follows the "SPluginsEventData_t" structure of the proxy plugin.

Data format of the session packet, sent every second:
"sesn": null-terminated string
The rest of the packet follows the "SPluginsBikeSession_t" structure of the proxy plugin.

Data format of the lap packet, sent five times a second:
"lap ": null-terminated string
The rest of the packet follows the "SPluginsBikeLap_t" structure of the proxy plugin.

Data format of the split packet, sent five times a second:
"splt": null-terminated string
"split": integer. 0: the latest line crossed is the start / finish one; 1: the latest line crossed is a split one
The rest of the packet follows the "SPluginsBikeSplit_t" structure of the proxy plugin.
Title: Re: UDP Proxy
Post by: maggikk22 on October 26, 2018, 10:34:50 AM
Hi Piboso,
first of all I'm a big fan of your work.
i need some assistance concerning UDP proxy.

I wrote a small program in Processing (for Arduino) to read the bikes data that GPB send in UDP proxy.
it works, I get a packet with 218 values.

I was able to identify the gear (data[25]), and the fuel (data[30] and data[31]).
But i can't find the speed.

Below there's 5 output results for different speeds.
Can you help me to identify the speed??


   60km/h-70km/h-120km/h-140km/h-200km/h
               
Title: Re: UDP Proxy
Post by: Gibbon on October 26, 2018, 12:18:12 PM
Hi,

You can create an Excel table as I did, it will be easier to understand.

Keep in mind that each data is coded on 4 bytes.

So the variable m_iGear for example will be in [25],[26],[27] and [28].

Same for the variable m_fFuel --> [29],[30],[31] and [32] (If I recall correctly).

Following that logic, m_fSpeedometer should be [33],[34],[35] and [36]

Then you need to convert those bytes into a integer/float depending on the variable type.

Hope that it helped.

(I will try to post this Excel table.)
Title: Re: UDP Proxy
Post by: PiBoSo on October 26, 2018, 12:24:43 PM

The packets must be parsed as a series of little-endian integers and floats ( except for the first 5 bytes ).
There is a 13 bytes "header", followed by the data in the same order of the "SPluginsBikeData_t" structure: http://www.gp-bikes.com/downloads/gpb_example.c
Therefore, "gear" is a 4 bytes integer at position 25 to 28, and "speed" ( in meters per second ) is a 4 bytes float at position 33 to 36.
Title: Re: UDP Proxy
Post by: maggikk22 on October 27, 2018, 08:45:59 AM
Great! thank you so much for your help!

For those who are intersted in using Processing, this is the code I used:

import hypermedia.net.*;
int PORT_RX=30001;
String HOST_IP="127.0.0.1";
UDP udp;

int pos;

void setup() {
  udp= new UDP(this,PORT_RX,HOST_IP);
  //udp.log(true);
  udp.listen(true);
}


void draw() {
}


void receive(byte[] data, String HOST_IP, int PORT_RX) {
   
  pos = 25;
  int gear = (data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24);
 
  pos = 33;
  int speed = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24))*3.6);
   
  pos = 29;
  float fuel = Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24));
 
  pos = 13;
  int rpm = (data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24);
 
  pos = 133;
  int fsusp = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24))*1000);   

  pos = 137;
  int rsusp = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24))*1000);   

  pos = 157;
  int thro = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24))*100);   

  pos = 161;
  int fBrak = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24))*100);   

  pos = 17;
  int tempEng = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24)));   

  pos = 21;
  int tempWat = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24)));   

  pos = 113;
  int pitch = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24)));   

  pos = 117;
  int lean = int(Float.intBitsToFloat((data[pos] & 0xff) | ((data[pos+1] & 0xff) << 8) | ((data[pos+2] & 0xff) << 16) | ((data[pos+3] & 0xff) << 24)));   


  println("gear = " +gear);
  println("rpm = " +rpm +" rev/min");
  println("speed = " +speed +" km/h");
  println("fuel = " +fuel +" l");
  println("front suspension = " +fsusp +" mm");
  println("rear suspension = " +rsusp +" mm");
  println("throttle = " +thro +" %");
  println("front brake = " +fBrak +" %");
  println("pitch = " +pitch +" °");
  println("lean = " +lean +" °");
  println("engine temp = " +tempEng +" °C");
  println("water temp = " +tempWat +" °C"); 
  println("-----------");
}



and this is an example of the results I get:
gear = 5
rpm = 14633 rev/min
speed = 217 km/h
fuel = 21.85146 l
front suspension = 68 mm
rear suspension = 38 mm
throttle = 36 %
front brake = 0 %
pitch = 4 °
lean = 50 °
engine temp = 87 °C
water temp = 85 °C
-----------
Title: Re: UDP Proxy
Post by: maggikk22 on October 28, 2018, 07:55:14 PM
Hi,

Based on the previous messages, I made a simple dashboard for GP Bikes.
i just wanted to share it.
Thank you !
Title: Re: UDP Proxy
Post by: maggikk22 on October 28, 2018, 08:02:23 PM
printscreens...
Title: Re: UDP Proxy
Post by: h106frp on October 30, 2018, 06:47:00 PM
Very nice project, have you tried connecting to the UDP host from another computer on the same network to see if it still works?

Just thinking that I might finally have a use for the Raspberry PI that has been sitting on my shelf for a while
Title: Re: UDP Proxy
Post by: maggikk22 on October 30, 2018, 09:01:37 PM
I haven't tried to connect it to another computer, but I'm planning to buy a 5 inch display for Raspberry, and connect it to the pc with the hdmi cable (no Raspberry,). That way, I would expand the desktop: main screen for the game, 5 inch display for dash.
Title: Re: UDP Proxy
Post by: Manu on October 31, 2018, 08:25:13 AM
Amazing work maggikk.

Are you planning to launch it as an internal plugin?
Title: Re: UDP Proxy
Post by: maggikk22 on October 31, 2018, 05:03:59 PM
no, i will not include it as an internal plugin for the following reasons:
1. I'm not sure I'm able to
2. MaxHUD is a very nice and efficient plugin that already makes the job
3. my goal was to have an external dashboard so I can display it on a 2nd screen.
Title: Re: UDP Proxy
Post by: h106frp on October 31, 2018, 05:51:39 PM
You could compile the standalone so its just click and run from the desktop - I think this is what Manu is after
Title: Re: UDP Proxy
Post by: Manu on October 31, 2018, 07:38:04 PM
Quote from: h106frp on October 31, 2018, 05:51:39 PM
You could compile the standalone so its just click and run from the desktop - I think this is what Manu is after

I meant to use it together with MaxHud
Title: Re: UDP Proxy
Post by: h106frp on November 01, 2018, 09:13:20 PM
Got this working to read the data on a remote PC on my LAN via wireless  :)

edit proxy_udp

[params]
enable = 1
port = 30000
;ip = 127.0.0.1:30001; original localhost
ip = 192.168.1.20:30001  ;the IP of the client on the LAN
delay = 1

modify the line below in the original processing code
udp= new UDP(this,PORT_RX,HOST_IP);

to read
udp = new UDP (this,PORT_RX);

very cool  8)  Should be able to make an e-dash using the raspberry pi now

Title: Re: UDP Proxy
Post by: davidboda46 on November 02, 2018, 10:28:33 AM
Hi,

Any chance it's possible to get it to work on an Android with an app (sadly I'm not a programmer)? There is one I use for car games, https://www.apkmonk.com/app/de.barz.hud_dash/ (https://www.apkmonk.com/app/de.barz.hud_dash/), been in touch with the guy but he didn't seem to be interested to include GPB unfortunately.

Cheers,

/David "Gonzo" Boda #46
Title: Re: UDP Proxy
Post by: h106frp on November 02, 2018, 12:05:48 PM
I have just been looking into this and it does appear feasible as 'processing' has support for android and the code is consistent across platforms. I will give it a go and report results .......
Title: Re: UDP Proxy
Post by: davidboda46 on November 02, 2018, 02:40:35 PM
Awesome. Thanks man.

Cheers,

/David "Gonzo" Boda #46
Title: Re: UDP Proxy
Post by: h106frp on November 02, 2018, 11:57:29 PM
Well after a crash course in processing/android I have it running on my phone via wireless  :)   :o

Fixed up the code so that it handles the various game states without issues.

Iissue to resolve;
Scaling the display to fit the phone(s)
Deciding on configurable features

Working out how you can distribute the app.


My first android application  ::)

Many thanks to maggikk for pointing me towards processing - very useful language.
Title: Re: UDP Proxy
Post by: matty0l215 on November 03, 2018, 06:02:57 AM
Package the APK as an .apk. People can just download and install manually

Great work guys :D
Title: Re: UDP Proxy
Post by: maggikk22 on November 03, 2018, 10:46:49 PM
glad I could help!
I'm looking forward the android app!
Title: Re: UDP Proxy
Post by: matty0l215 on November 04, 2018, 08:29:02 AM
Quote from: maggikk22 on November 03, 2018, 10:46:49 PM
glad I could help!
I'm looking forward the android app!



Thank H106FRP he's the one doing all the work ;D
Title: Re: UDP Proxy
Post by: HornetMaX on November 04, 2018, 11:22:16 AM
That's some nice work h !

I feel bad for being lazy and never wanting to look into this stuff (dash on other device).
Title: Re: UDP Proxy
Post by: h106frp on November 04, 2018, 02:02:06 PM
Cheers MaX,
Getting close to something that can be released and to be honest, now the LAN communication framework are working the coding for an application is fairly simple and 'processing' already has very powerful graphical capabilites.

The biggest headache on android is making everything scale to the huge range of display sizes.

As far as further development it is probably best to wait for the next beta as Pib has already indicated additions to the UDP interface.
Title: Re: UDP Proxy
Post by: matty0l215 on November 04, 2018, 04:02:30 PM
I've just had a mad idea to hack apart an old phone and mount its sceen to the HS2 bars.... :o ;D
Title: Re: UDP Proxy
Post by: h106frp on November 04, 2018, 05:09:29 PM
Im sure some 'Blue Peter' type cardboard skills you could soon knock up something resembling a 2D or AIM dash.....

You will need 2 toilet roll centre, a cornflake packet and of course a washing up liquid bottle - just get an adult to help with the scissors  ;D
Title: Re: UDP Proxy
Post by: matty0l215 on November 04, 2018, 05:15:19 PM
I will get the "Stick Back Plastic" out ;) ;D
Title: Re: UDP Proxy
Post by: davidboda46 on November 07, 2018, 09:08:41 PM
@Piboso So it's not possible to copy the proxy_udp and use it with Beta 13? Along with the files in the plugin folder (I know it's 64, but I thought it was worth a query)?

Cheers,

/David "Gonzo" Boda #46
Title: Re: UDP Proxy
Post by: PiBoSo on February 06, 2019, 08:54:37 PM

First post updated to add information about the extra packets that it is possible to enable starting with Beta15.
Title: Re: UDP Proxy
Post by: D4rw1n on April 07, 2019, 07:34:56 AM
Hi,

I'm trying to figure out how to read/understand following data from UDP payload:

float m_aafRot[3][3]; /* rotation matrix of the chassis. It incorporates lean and wheeling */

When reading data at offsets 73,77,81,85,89,93,97,101,105, I get such matrix (motorcycle idle, perpendicular to ground, 0 km/h):

Rotation chassis matrix
[-0.53] [-0.05] [0.85]
[-0.04] [1.00] [0.03]
[-0.85] [-0.02] [-0.53]

I'm not an expert in algebra but I have some knowledge though. Reading through Wikipedia page (https://en.wikipedia.org/wiki/Rotation_matrix), I'm unsure whether I'm decoding the values in the wrong order (rows/columns) or whether it's a special matrix shape I don't see in wikipedia.

Could someone clarify how to:
1) read the 9 values in the correct order for display it in 3x3 matrix (like shown in wikipedia)
Does that reflect Ry in following picture?

If so, how could this be lean + wheeling? My current understanding is that lean would be one of the 3 R{x,y,z} and wheeling another one of them.

2) how to summarise the meaning of such values? I'm looking to know whether this can be handful for a motorcycle simulator platform (6DOF or something else) or is it just a different way to express values already gathered in a different shape, such as:
float m_fYaw,m_fPitch,m_fRoll;                           /* degrees, -180 to 180, offsets 109,113,117 */

Thanks in advance for any information!


FYI this is my python code that displays the matrix:

tm_rot_chassis = struct.unpack_from("fffffffff", data, offset=73)
print("Rotation chassis matrix\n"\
"[{v1:.2f}] [{v2:.2f}] [{v3:.2f}]\n"\
"[{v4:.2f}] [{v5:.2f}] [{v6:.2f}]\n"\
"[{v7:.2f}] [{v8:.2f}] [{v9:.2f}]\n"\
.format(\
v1=tm_rot_chassis[0], v2=tm_rot_chassis[1], v3=tm_rot_chassis[2],\
v4=tm_rot_chassis[3], v5=tm_rot_chassis[4], v6=tm_rot_chassis[5],\
v7=tm_rot_chassis[6], v8=tm_rot_chassis[7], v9=tm_rot_chassis[8]\
))
Title: Re: UDP Proxy
Post by: PiBoSo on April 16, 2019, 10:20:49 PM
The rotation matrix is made of three orthogonal axes:
x axis = [0][0], [1][0], [2][0] ( 73, 85, 97 )
y axis = [0][1], [1][1], [2][1] ( 77, 89, 101 )
z axis = [0][2], [1][2], [2][2] ( 81, 93, 105 )
Where X+ is right, Y+ is up and Z+ is forward.

It is a different way to represent the same chassis rotation in space as with m_fYaw, m_fPitch and m_fRoll.
Title: Re: UDP Proxy
Post by: poupou59890 on April 17, 2019, 08:24:00 AM
Quote from: h106frp on November 01, 2018, 09:13:20 PMGot this working to read the data on a remote PC on my LAN via wireless  :)

edit proxy_udp

[params]
enable = 1
port = 30000
;ip = 127.0.0.1:30001; original localhost
ip = 192.168.1.20:30001  ;the IP of the client on the LAN
delay = 1

modify the line below in the original processing code
udp= new UDP(this,PORT_RX,HOST_IP);

to read
udp = new UDP (this,PORT_RX);

very cool  8)  Should be able to make an e-dash using the raspberry pi now



Hi, I am making a simrig for GPbikes and I ave the idea to potentialy lean this rig ...But for now I would like to learn a little bit UDP and everything else in order to know how to read output data from GPbikes,

I have an arduino R3 that I will use, and for now I would like to create the code in order just to see values in realtime but I do not know well arduino and code for that and I do not know UDP protocole at all, so with your helps I understood the code to read values and extract values from matrix in an arduino language but What do I need in order to test that ? Is it possible to use arduino over USB to read UDP data, DO I need wifi or ethernet absolutly to perform that ? Because if the arduino is connected over USB it is good for me because I have in mind to read data from GPbikes thanks to the arduino and send the lean angle to my motor (thanks to arduino too and shields) but for now I just want to test if I can extract porper values from GPbikes....I am a little bit lost with that.

SO if someone can give a little tuto about what do I need to do to connect my arduino to GPbikes UDP data stream and be able to see it than I will be able to use those values and mix them in order to have a right variable for my rig.

Thakns a lot for your help.
Title: Re: UDP Proxy
Post by: D4rw1n on April 18, 2019, 07:24:22 AM
@poupou: For that, you will need to add an ethernet shield on your arduino and follow that example to capture UDP packets: https://www.arduino.cc/en/Reference/EthernetUDPRead

Another way (cheaper) would be to create a local program (for instance in python) that captures the telemetry data from UDP on the localhost and forward it straight away on the serial port to the arduino.

Keep in mind typical baud rate used on serial com port for arduino is 115200bps.
UDP payload of telemetry being 220bytes by default (more if you enable some options), it's 1760 bits per packet payload.

Dividing 115200 by 1760, you get a max rate of ~65x telemetry snapshots per second (it could even be less as you have some overhead on the serial bus).

So keep this in mind while setting up your proxy_udp.ini file.
I'd lower the frames per second to 50 max. That means 20ms, or 2 hundredths of a second.

Your proxy_udp.ini file should be set as followed:

[params]
(rest of the config as you want)
delay = 2

EDIT: There are higher baud rates values possible on arduino, you might need to check some of following links:
https://forum.arduino.cc/index.php?topic=98364.0
http://forum.arduino.cc/index.php/topic,61381.msg444421.html#msg44442
https://www.quora.com/What-is-the-baud-rate-and-why-does-Arduino-have-a-baud-rate-of-9-600


@Piboso: Thanks for the clarification. Will look at the result and come back if I have more questions.
Title: Re: UDP Proxy
Post by: poupou59890 on April 18, 2019, 09:27:36 AM
Thanks for the explaination :) All those words seems from another world to me but I will look into it and try to understand well the concept. SO the easier way is to add a ethernet shield to my arduino, right ? Because If I understood well  the data transfer will be slower (lower amount of data possible..)  due to the restriction of the adruino serial port ? Thanks again for your time. I am a mechanical guy..I dot not use a lot arduino and programation... but I will look into it and try to understand better.
Title: Re: UDP Proxy
Post by: D4rw1n on April 18, 2019, 10:20:51 AM
Yep ethernet shield will enable you to directly get UDP packets to your arduino.

Based on other experiments, you would get a ~3mbits limitation due to arduino's microcontroller. That is more than enough for your application.
Check https://www.reddit.com/r/arduino/comments/9qn2fx/max_transfer_speed_possible_for_the_ethernet_2/

You should find such shield around 5 dollars on aliexpress.

Also, check you private messages ;)
Title: Re: UDP Proxy
Post by: D4rw1n on April 18, 2019, 11:31:05 AM
@Piboso:
I have updated my code that is pulling matrix elements from the payload with offsets as you have shown in your last post, but I keep getting different angle values between what is given from m_fYaw, m_fPitch and m_fRoll offsets and what I calculate from the matrix.

Example:

Condition: Motorcycle at rest (vertical, stopped).

m_fYaw, m_fPitch & m_fRoll I get:
Yaw: -37.37
Pitch: 1.32
Roll: -2.51

Whilst matrix I get is:

[ 0.79   -0.04   0.61 ]
[ 1.00   0.04    1.32 ]
[ 0.79   -2.51   0.06 ]

Considering that following elements:
[ R11 R12 R13 ]
[ R21 R22 R23 ]
[ R31 R32 R33 ]

are mapped like so:

R11 @offset 73
R12 @offset 85
R13 @offset 97
R21 @offset 77
R22 @offset 89
R23 @offset 101
R31 @offset 81
R32 @offset 93
R33 @offset 105


I'm using these references to calculate angles from the matrix:

http://nghiaho.com/?page_id=846
http://planning.cs.uiuc.edu/node102.html
http://planning.cs.uiuc.edu/node101.html#fig:yawpitchroll

Taking for instance X (roll) with values from the example matrix above:



with R32 = -2.51 & R33 = 0.06, I get 178.63 degrees for Roll (used https://planetcalc.com/7954/).
That does not fit the -2.51 degrees I get from m_fRoll.


See also a screenshot attached with all other values.


I feel I'm missing something somewhere, but can't find what  :o  :-\

EDIT: don't pay attention to suspension length, forgot to multiply it by 1000 (i.e. right now it is displayed in meter unit)
Title: Re: UDP Proxy
Post by: HornetMaX on April 19, 2019, 04:15:55 PM
I really don't think using UDP for that is good idea.

If you want to send GPB data to some hardware it is fair to assume this hardware will be connected to the PC running GPB (e.g. via serial). If that's true, then you don't need to use UDP: just use an output plugin (from which you can directly send the data to the seriel port) or a proxy plugin (that will put the data in a shared memory area that an external program can read and send to the serial port). I'd probbaly use the 2nd approach (proxy pugin + external app).
Title: Re: UDP Proxy
Post by: D4rw1n on April 25, 2019, 06:16:21 PM
I was not expecting to use UDP on very long term, but it has been my easiest way to decode the data so far, compared to shared memory using the DLL/DLO method (I'm a very newbie with that in programming).
Ideally I'd like to read that through Python, and have read it seems doable as well, but haven't spent time enough on learning how to do it though.

However, my intent in last post was mostly to get how to read & understand the rotation matrix values.
Title: Re: UDP Proxy
Post by: HornetMaX on April 26, 2019, 08:18:05 AM
Quote from: D4rw1n on April 25, 2019, 06:16:21 PMHowever, my intent in last post was mostly to get how to read & understand the rotation matrix values.
The problem with rot matrices is always conventions.
So if your app needs to work with a rotation matrix,it's probably easier to create your own one (according to your own conventions) from the roll/pitch/yaw angles.
Title: Re: UDP Proxy
Post by: D4rw1n on April 28, 2019, 08:25:12 PM
At this point, I have honestly no particular purpose in using such matrix for now, but mostly curious to understand how the one given from the telemetry should be read and/or translated.
However, as seen on many websites, it seems a 3x3 rotation matrix should have the same spots for the same axis. I'm still wondering how this one is supposed to be read. but that won't be a blocking milestone in my case as hopefully all axis values are already given in alternative format.
Title: Re: UDP Proxy
Post by: PiBoSo on May 05, 2019, 09:57:18 PM
Quote from: D4rw1n on April 18, 2019, 11:31:05 AM@Piboso:
I have updated my code that is pulling matrix elements from the payload with offsets as you have shown in your last post, but I keep getting different angle values between what is given from m_fYaw, m_fPitch and m_fRoll offsets and what I calculate from the matrix.

Example:

Condition: Motorcycle at rest (vertical, stopped).

m_fYaw, m_fPitch & m_fRoll I get:
Yaw: -37.37
Pitch: 1.32
Roll: -2.51

Whilst matrix I get is:

[ 0.79   -0.04   0.61 ]
[ 1.00   0.04    1.32 ]
[ 0.79   -2.51   0.06 ]

Considering that following elements:
[ R11 R12 R13 ]
[ R21 R22 R23 ]
[ R31 R32 R33 ]

are mapped like so:

R11 @offset 73
R12 @offset 85
R13 @offset 97
R21 @offset 77
R22 @offset 89
R23 @offset 101
R31 @offset 81
R32 @offset 93
R33 @offset 105

Please note that the rotation matrix represents three orthogonal unit vectors.
Therefore, all absolute values should be lower or equal to 1.

Please check the offsets you are using to parse the matrix.
Title: Re: UDP Proxy
Post by: PiBoSo on September 07, 2019, 09:43:11 PM

The plugin output has been updated to the latest proxy interface: https://www.gp-bikes.com/downloads/gpb_proxy.c
Title: Re: UDP Proxy
Post by: PiBoSo on December 25, 2020, 10:30:45 PM
The plugin output has been updated to the latest proxy interface: https://www.gp-bikes.com/downloads/gpb_proxy.c
Title: Re: UDP Proxy
Post by: PiBoSo on December 19, 2021, 04:27:42 PM
The plugin output has been updated to the latest proxy interface: https://www.gp-bikes.com/downloads/gpb_proxy.c
Title: Re: UDP Proxy
Post by: PiBoSo on August 27, 2023, 01:37:00 PM
The plugin output has been updated to the latest proxy interface: https://www.gp-bikes.com/downloads/gpb_proxy.c