Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MWV True wind != Theoretical wind #26

Open
lsoltero opened this issue Jun 24, 2021 · 2 comments
Open

MWV True wind != Theoretical wind #26

lsoltero opened this issue Jun 24, 2021 · 2 comments

Comments

@lsoltero
Copy link

http://caxapa.ru/thumbs/214299/NMEA0183_.pdf

MWV is referenced as Apparent wind OR Theoretical wind. I quote

When the reference field is set to T (Theoretical, calculated actual wind), data is provided giving the wind angle in relation to the vessel's bow/centerline and the wind speed as if the vessel was stationary. On a moving ship these data can be calculated by combining the measured relative wind with the vessel's own speed.

The code assumes that 'T' refers to True which is misleading. There is nothing wrong with the way things are written but an implementor might be mislead sending true wind values instead of Theoretical.

The library should probably be modified to change references to NMEA0183Wind_True to NMEA0183Wind_Theoretical

enum tNMEA0183WindReference {
                            NMEA0183Wind_True=0,
                            // Apparent Wind (relative to the vessel centerline)
                            NMEA0183Wind_Apparent=1
                          };


//*****************************************************************************
// MWV - Wind Speed and Angle
//$IIMWV,120.1,R,9.5,M,A,a*hh
bool NMEA0183ParseMWV_nc(const tNMEA0183Msg &NMEA0183Msg,double &WindAngle, tNMEA0183WindReference &Reference, double &WindSpeed) {
  bool result=( NMEA0183Msg.FieldCount()>=4 );

  if ( result ) {
    WindAngle=atof(NMEA0183Msg.Field(0))*degToRad;
    switch ( NMEA0183Msg.Field(1)[0] ) {
      case 'T' : Reference=NMEA0183Wind_True; break;
      case 'R' :
      default : Reference=NMEA0183Wind_Apparent; break;
    }
    WindSpeed=atof(NMEA0183Msg.Field(2));
    switch ( NMEA0183Msg.Field(3)[0] ) {
      case 'K' : WindSpeed*=kmhToms; break;
      case 'N' : WindSpeed*=knToms; break;
      case 'M' :
      default : ;
    }
  }

  return result;
}
@ttlappalainen
Copy link
Owner

Damn. https://gpsd.gitlab.io/gpsd/NMEA.html#_mwv_wind_speed_and_angle says True.

It is problematic, since it changes compatibility.

@lsoltero
Copy link
Author

Hi Temo,

I agree that this is very problematic. But the link I sent you is for the NMEA183 spec from NMEA. And it clearly states that "T" means Theoretical and not true. It then goes on to describe what that means.

I first ran into this when looking at output from the YD N2k to NMEA converter. They use the correct definition for "theoretical" as defined by NMEA.

Here is the link again..

http://caxapa.ru/thumbs/214299/NMEA0183_.pdf

and here is the title page for the guide.

NMEA 0183 Standard For Interfacing Marine Electronic Devices Version 3.01 January 1, 2002

I would say that the entry for this sentence at gpsd.gitlab.io is suspect and should be looked at more closely.

The question is what to do... Although changing True to Theoretical will break many applications the fact is that these applications are probably broken anyway. So... changing NMEA0183Wind_True to NMEA0183Wind_Theoretical will cause a compile error that will cause the developer to revisit this. I suggest putting a note in the include file that describes the issue with possibly a link to the NMEA0183 spec.

Take care.

--luis

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants