Support compass readings
amotl opened this issue · 20 comments
Is this needed?
// enable the IMU to receive roll, pitch and eCompass
const characteristic = await device.writeCharacteristicWithResponseForService(
service, '0000a003-0000-1000-8000-00805f9b34fb', Buffer.from([0x01]).toString('base64')
);
Would be nice to get compass readings from calypso. Did you make some progress here?
Dear Simon,
thank you for writing in. Others also asked about compass
support recently. We will have to dive into a little recap to check the current state of the corresponding implementation.
Based on my findings shared below, I think compass
data should be decoded well already, and may already make it into the corresponding SignalK telemetry adapter correctly. Can you verify that? On the other hand, what others have asked about, I think compass data is not translated to NMEA0183 yet.
With kind regards,
Andreas.
Details
It looks like 8843346 added decoding the compass
data already:
calypso-anemometer/calypso_anemometer/model.py
Lines 84 to 89 in 1cca7ad
However, I discovered that within the backlog:
calypso-anemometer/doc/backlog.rst
Lines 107 to 109 in 1cca7ad
This is the current code responsible for translating compass
data to SignalK:
calypso-anemometer/calypso_anemometer/telemetry/signalk.py
Lines 49 to 50 in 1cca7ad
This is the current code responsible for translating compass
data to NMEA0183:
calypso-anemometer/calypso_anemometer/telemetry/nmea0183.py
Lines 174 to 183 in 1cca7ad
In order to add more information here...
Calypso UP10 FAQ
Manufacturer information about the compass can be found at https://calypsoinstruments.com/web/content/884.
Compass to NMEA0183
On the other hand, what others have asked about, I think compass data is not translated to NMEA0183 yet.
@UserMacUseface told us that the NMEA sentence for this is quite simple 1:
HDT - Heading - True
1 2 3
| | |
$--HDT,x.x,T*hh<CR><LF>
Field Number:
1) Heading Degrees, true
2) T = True
3) Checksum
Thank you already! We will consider implementing corresponding support on the next development iteration.
Footnotes
@UserMacUseface may have discovered a problem with decoded compass/heading data. Thank you so much for the report!
The value for heading is a bit funny.
While tracking the processing of this value through the code the other day, I already noticed the following snippet:
SignalKDeltaItem(path="navigation.attitude.yaw", value=reading.compass), SignalKDeltaItem(path="navigation.headingMagnetic", value=reading.compass)
reading.compass
is defined in the model ascompass=360 - compass
. However, while the documentation of Calypso claims degrees 1, the actual value seems to be radians though.
Is there a log where I can see the raw data being read from the device?
Footnotes
However, while the documentation of Calypso claims degrees, the actual value seems to be radians though.
Ah, wow!
But the device claims to be the same as before, and there is no updated documentation about it? Maybe there has been something within the release notes of the firmware update you installed recently? (#13 (comment))
Is there a log where I can see the raw data being read from the device?
The decoder implementation has been based on information from the Calypso Ultrasonic decoding cheat sheet by Fabian Tollenaar. Logging raw data would not make much sense because it is in binary format.
calypso-anemometer/calypso_anemometer/model.py
Lines 92 to 149 in 1cca7ad
But the device claims to be same as before, and there is no updated documentation about it? Maybe there has been something within the release notes of the firmware update you installed recently? (#13 (comment))
I cannot seem to find any release notes from calypso instruments :/
On a side note: roll
and pitch
also come from the gyro, don't they? Should we perhaps rename the reading.compass
field to reading.heading
for the sake of better "naming things"?
Regarding the "funny" readings, we discovered that all angle values should be submitted to SignalK using Radian (rad) unit, see also #14 (comment).
Regarding "reading the compass at all", we may have missed the corresponding method to enable it. Currently, I can only find methods to set "mode" and "datarate".
calypso-anemometer/calypso_anemometer/core.py
Lines 203 to 213 in 4361e68
Regarding "reading the compass at all", we may have missed the corresponding method to enable it.
The improvement GH-23 finally adds that, with a corresponding --compass=on
command line option.
Regarding the missing "Compass to NMEA0183" telemetry propagation (#12 (comment)), the values for pitch
and roll
shall apparently be propagated into XDR - Transducer Values
messages 1, as suggested by @UserMacUseface.
Within that message, I also spotted a slot to transmit air temperature. Does it make sense to propagate the temperature measured by the Calypso into this slot, or would it be wrong, because, mounted on the top of the mast, it will most probably not what meteorologists understand as "air temperature"?
1 2 3 4 n
| | | | |
* $--XDR,a,x.x,a,c--c, ..... *hh<CR><LF>
Measured Value | Transducer Type | Measured Data | Unit of measure | Transducer Name |
---|---|---|---|---|
air temperature | "C" temperature | 2 decimals | "C" celsius | "TempAir" or "ENV_OUTAIR_T" |
pitch | "A" angle | -180..0 nose down 0..180 nose up | "D" degrees | "PTCH" or "PITCH" |
rolling | "A" angle | -180..0 L 0..180 R | "D" degrees | "ROLL" |
Footnotes
Within that message, I also spotted a slot to transmit air temperature. Does it make sense to propagate the temperature measured by the Calypso into this slot, or would it be wrong, because, mounted on the top of the mast, it will most probably not what meteorologists understand as "air temperature"?
Its surely a good idea to transmit all the values that the calypso generates. that way any future implementation can use it if needed.
The temperature difference on top of the mast is very probably not too much different then on deck level.
Nice gimmick to have but probably not critical to any kind of sailing activities :)
Thanks for clarifying. I've created GH-21 to discuss the topic of NMEA0183 sentences for non-compass related values seperately.
Regarding the NMEA0183 talker identifier, thank you for sharing #21 (comment). On this page, I discovered another example for encoding a compass/heading value.
$HCHDM,238,M<CR><LF>
... where "HC" specifies the talker as being a magnetic compass, the "HDM" specifies the magnetic heading message follows.
In our case, it would be HCHDT
instead of HCHDM
, because we emit the "true heading" - is that correct? Or, following your suggestion at #21 (comment), MLHDT
would also be a feasable name, right?
Some examples of HDT
sentences are:
$GPHDT,123.456,T
$GPHDT,274.07,T
References
Proposal
Would those example sentences be feasible?
# Heading
$MLHDT,274.07,T
# Pitch
$MLXDR,A,-42.42,D,PITCH#CALYPSO
# Roll
$MLXDR,A,30.07,D,ROLL#CALYPSO
Optionally, "heading" could additionally be emitted as XDR
sentence as well?
# Heading
$MLXDR,A,274.07,D,HEADING#CALYPSO
P.S.: As we can see, there is apparently no way to tell XDR sentences apart, other than looking at the name field, here PITCH
vs. ROLL
vs. HEADING
. Does this make sense?
XDR sentences can also carry multiple values -- thanks, @UserMacUseface. When combining pitch and roll, and also omitting the CALYPSO
suffix, a corresponding sentence could look like that:
$MLXDR,A,-42.42,D,PTCH,A,30.07,D,ROLL
As seen at 12, the order of Pitch/Roll may also be important.
Footnotes
Dear @honigwald and @UserMacUseface,
we just released calypso-anemometer 0.6.0, including the corresponding improvements, and will be happy to hear back from you about its outcome on this matter.
You may be able to get a reading with compass turned on, using
# Get device reading(s), with compass data (roll, pitch, heading).
calypso-anemometer read --compass=on
calypso-anemometer read --compass=on --subscribe
Emitting this data to both telemetry variants NMEA-0183 and SignalK, may also work well now.
With kind regards,
Andreas.