FlyDangerous
FlyDangerous copied to clipboard
Telemetry for motion simulators
I have a Yaw VR motion simulator and would love to see motion support.. I even bet you could beat Frontier to adding official telemetry output! 😆
Some ways to add telemetry output: https://www.xsimulator.net/community/threads/how-to-add-telemetry-output-into-a-game-simple-example.11080/ https://gitlab.com/simracingstudio/srsap
If you need me to put you in contact with SRS or Yaw VR team let me know.
Damn that sounds fun, I'll look into it as long as you promise to record a video of it ;D
@jukibom 100% will do that! I already have some videos in the simulator on my channel if you want to look https://youtube.com/ItsVRK
Implement as a UDP Server firing a CSV or JSON
- [x] Simple server output
- [ ] User-defined output string in config with defaults (and documentation in the README)
- [x] Ensure we include Checksum and Sequence ID (UDP is out of order packets)
- [x] Configurable tick rate (up to 50, the physics step)
Include: Three axes of lateral motion as -1 to 1 range (% of maximum) in terms of both current velocity and force Three axes of rotational motion as -1 to 1 range (% of maximum) in terms of both current angular velocity and torque Ship indicator data as sent to the Ship rendering interface for external displays (GForce, assists enabled, throttle value, ship lights etc)
@jukibom Some information has come to light that may change the preferred implementation method:
SRS offer 2 options for Indie games to be implemented
- API In this option, the developer implements the telemetry support using the SRS API (https://gitlab.com/simracingstudio/srsapi). Developer is responsible for supporting the integration.
Cost: Free of charge
- Native Integration In this option SRS will add the game to our list and support the same way we support all current native games. SRS supports the game and the telemetry capturing coding. We will promote the game for our 25k users, in our email list and social media channels.
Cost: $1000 per game
The Yaw SDK for Unreal or Unity is available at https://www.yawvr.com/downloads
I'm seeking clarification from YawVR if end users can create plugins for their GameEngine, or if that's only possible by their development team like is the case with SimeRacingStudio
@jukibom GameEngine does allow user created plugins, the GameEngine developer gave me this link: https://youtu.be/86AvHMFQx0c
@jukibom GameEngine does allow user created plugins, the GameEngine developer gave me this link: https://youtu.be/86AvHMFQx0c
I think some wires might have gotten crossed there as that looks like creating a dll injection plugin - but we have the source code here :P
My current thinking for this, and what I've been working on, is an agnostic UDP data firehose which vomits out everything I have (I'll post the full interfaces at the bottom) from the ship physics object. AFAIK that would need rigging up with SimTools to interface with other hardware by someone, but so far I haven't been planning a direct YawVR integration. That said, I have been building a subscription system into the ship physics object (called FeedbackEngine) which makes writing these kinds of third party integrations much easier and well-contained (currently adding bHaptics support, #194).
If their Unity SDK is reasonable and handles VR yaw-correction and all that jazz then it should be easy enough for me to add it - if not I'll have to rely on someone doing a SimTools integration as it'd take a lot of time away from other things.
Physics Interfaces exposed:
using UnityEngine;
namespace Core.ShipModel.Feedback.interfaces {
// Typically used to provide feedback data to integrations like rumble / haptics.
// Most values are provided normalised (-1:1 or 0:1) for ease of integration.
public interface IShipFeedbackData {
// True if collision occured on this frame, and the collision data is valid to read.
bool CollisionThisFrame { get; }
// True if a collision has BEGUN this frame (rather than a continuation of a previous collision)
bool CollisionStartedThisFrame { get; }
// The normalised force of the impact as calculated from the dot product of the normalised velocity
// and the collision normal multiplied by normalised velocity. ~0 = light graze, 1 = full speed head-on
float CollisionImpactNormalised { get; }
// The direction from the users' perspective in which the collision occured
Vector3 CollisionDirection { get; }
// True if the boost is currently firing but not yet active (the charge-up period)
bool IsBoostSpooling { get; }
// True if the boost spooling was initiated on this physics frame
bool BoostSpoolStartThisFrame { get; }
// True if the boost is currently firing
bool IsBoostThrustActive { get; }
// True if the boost effect after spooling was initiated this frame
bool BoostThrustStartThisFrame { get; }
// The time in seconds it takes for a boost to spool
public float BoostSpoolTotalDurationSeconds { get; }
// The time in seconds the boost is set to last
public float BoostThrustTotalDurationSeconds { get; }
// Amount of spooling occured as a normalised value
float BoostSpoolProgressNormalised { get; }
// The progress through the boost effect as a normalised value
float BoostThrustProgressNormalised { get; }
// The amount of ship shake currently occurring as a normalised value
float ShipShakeNormalised { get; }
}
}
namespace Core.ShipModel.ShipIndicator {
// Typically used for displaying instrumentation in both the in-game ship and third party integrations
// e.g. a custom display in a sim pit.
// Many values are exposed as normalised (-1:1 or 0:1) for ease of integration.
public interface IShipInstrumentData {
// The raw velocity in m/s
public float VelocityMagnitude { get; }
// The amount of acceleration applied as a normalised value.
public float AccelerationMagnitudeNormalised { get; }
// The raw GForce currently applied to the seat of the ship in Gs
public float GForce { get; }
// The amount of pitch applied as input as a normalised value
public float PitchPositionNormalised { get; }
// The amount of roll applied as input as a normalised value
public float RollPositionNormalised { get; }
// The amount of yaw applied as input as a normalised value
public float YawPositionNormalised { get; }
// The position of the throttle as a normalised value (where -1 is reverse)
public float ThrottlePositionNormalised { get; }
// The value of the boost / engine capacitor as a percentage
public float BoostCapacitorPercent { get; }
// True if the boost has completed its cycle
public bool BoostTimerReady { get; }
// True if the boost is ready to fire
public bool BoostChargeReady { get; }
// True if ship lights are enabled
public bool LightsActive { get; }
// True if velocity limiter is enabled
public bool VelocityLimiterActive { get; }
// True if Vector Flight Assist is enabled
public bool VectorFlightAssistActive { get; }
// True if Rotational Flight Assist is enabled
public bool RotationalFlightAssistActive { get; }
// True if the Proximity Warning has detected a potential collision
public bool ProximityWarning { get; }
// The number of seconds before a potential collision will occur if no vector change is made
public float ProximityWarningSeconds { get; }
}
}
using UnityEngine;
namespace Core.ShipModel.Feedback.interfaces {
// Typically used to provide physics data to integrations like motion rigs.
// Most values are provided normalised (-1:1 or 0:1) using the maximums for ease of integration.
public interface IShipMotionData {
// The raw velocity in m/s
public float VelocityMagnitude { get; }
// The amount of acceleration applied as a normalised value.
public float AccelerationMagnitudeNormalised { get; }
// The raw GForce currently applied to the seat of the ship in Gs
public float GForce { get; }
// The raw lateral velocity in ship local space m/s
Vector3 CurrentLateralVelocity { get; }
// The raw lateral acceleration force in ship local space N
Vector3 CurrentLateralForce { get; }
// The raw angular velocity in ship local space radians per second
Vector3 CurrentAngularVelocity { get; }
// The raw angular torque in ship local space Newton Meters
Vector3 CurrentAngularTorque { get; }
// The lateral velocity as a normalised value from the maximum
Vector3 CurrentLateralVelocityNormalised { get; }
// The lateral acceleration force in ship local space normalised values
Vector3 CurrentLateralForceNormalised { get; }
// The angular velocity in ship local space normalised values
Vector3 CurrentAngularVelocityNormalised { get; }
// The raw angular torque in ship local space normalised values
Vector3 CurrentAngularTorqueNormalised { get; }
// The raw maximum lateral velocity magnitude in m/s permitted by the ship configuration
float MaxLateralVelocity { get; }
}
}
Currently trying to build a solution open-ended enough to specify csv, json or custom line strings from those variable names but 🤷♀️
@jukibom I agree that open ended is better.
Unlike SRS, GameEngine allows GameEngine game plugins to be created by anyone.
The developer of GameEngine made me aware of https://youtu.be/86AvHMFQx0c
And another member of the Yaw community sent me YawPluginSample.zip
This should work with the UDP stream approach you were proposing
@jukibom You can find an example of how to integrate the SRS with your game directly from Unity: https://gitlab.com/simracingstudio/srsapi/-/tree/master/api/Unity3D
@BrianGilbert
@jukibom I agree that open ended is better.
Unlike SRS, GameEngine allows GameEngine game plugins to be created by anyone.
that's an incorrect statement, you can integrate any game with SRS, a plugin is not required, the SRS API is open. A good example is Epic Roller Coasters that Oculus Quest 2 sends the telemetry wireless directly to SRS.
@simracingstudio sorry I mean that you do not allow end user plugin creation if the game is sending UDP stream and not implementing the SRS API directly. At least thats my understanding based on what you emailled to Evochron developer?
@jukibom possibly relevant (sent to me by @simracingstudio ) https://github.com/gt7coder/grandturismo-srs-proxy

No idea if this will work as I have nothing that integrates with this but 🤷♀️ guess we'll see!
@jukibom thanks a lot, we will test this week or early next week and make a big announcement in the next release.
@BrianGilbert thanks for getting the teams together and make this happen!
@marcelomanzo @BrianGilbert cheers! I've pushed the 0.6.0-dev3 build to the public_beta branch on steam (windows only, lemme know if you need a linux build), there's a sim racing studio toggle (alongside a more generic telemetry implementation) in options > integrations which outputs to 127.0.0.1 on port 33001 (this can be changed in the preferences.json at %USERPROFILE%\AppData\LocalLow\StarGoat\FlyDangerous\Save\Preferences.json), let me know how you get on.


Hello there, we have tested and it's working fine, there is a motion profile for it:

User also can find instructions how to enable the telemetry in the Games -> PC Page:


Amazing, thanks for letting me know! ❤️
We will announce shortly.
A little late to the party, but I created a plugin for Game Engine which is used with the Yaw and Yaw2. If anyone is interested here is the file: FlyDangerous.zip
Unpack the dll into the Gameplugins directory of Game Engine and youre good to go.
A little late to the party, but I created a plugin for Game Engine which is used with the Yaw and Yaw2. If anyone is interested here is the file: FlyDangerous.zip
Unpack the dll into the Gameplugins directory of Game Engine and youre good to go.
Hey, that's awesome! I have no idea how that works as I've never used it, is it using the raw telemetry in FD?
Yes, you need to select "Raw Telemetry" and "Bytes" in the game options to be able to use it. Regarding to the Game Engine developer, I think he will add it directly to the next update of Game Engine. So its in there from the start and you dont need to add it yourself. :)
Yes, you need to select "Raw Telemetry" and "Bytes" in the game options to be able to use it. Regarding to the Game Engine developer, I think he will add it directly to the next update of Game Engine. So its in there from the start and you dont need to add it yourself. :)
That would be amazing, have you submitted it already?
Yes, I'm in contact with him right now anyway via doscord and I already sent him the dll.
absolute star, thank you!