2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MAVLinkのCRCチェックサム(Checksum)計算

Last updated at Posted at 2021-09-01

MAVLinkのCRCチェックサム(Checksum)は、MAVLinkの送信と受信で使っています。

MAVLinkの送信側と受信側で、MAVLink XML定義ファイルを変更した場合、メッセージ名前、フィルード名前、フィルードタイプ、フィルード長さ等差異よりChecksumが不一致で、MAVLink受信失敗になります。

Checksum の概要

Checksumは、uint16_tのデータでMAVLinkの送信側と受信側のメッセージ内容が一致するかをチャックします。

MAVLink送信側、head、payloadとCRC_EXTRAからChecksumを計算してメッセージに2バイトChecksumを追加して送信します。
MAVLink受信側、送信側と同じでhead、payloadとCRC_EXTRAからChecksumを計算して受信したメッセージの2バイトChecksumと比較して同じプロトコルのメッセージかどうかをチャックします。

MAVLinkのデータ構造は、MAVLinkの入門を参考してください。

image.png

CRC_EXTRA の計算

CRC_EXTRAは、uint8_tのデータでMAVLinkの送信側と受信側のメッセージ定義が一致するかをチャックします。

CRC_EXTRAは、メッセージ定義XMLファイル(メッセージ名前、フィルード名前、フィルードタイプ、フィルード長さ)を基づいて1バイトのデータを計算します。

CRC_EXTRA 計算詳細は、公式サイトを参考してください。

Checksum の計算

Checksum 計算詳細は、MAVLink source codeを参考してください。

	uint16_t checksum = crc_calculate(&buf[1], header_len-1);
	crc_accumulate_buffer(&checksum, _MAV_PAYLOAD(msg), msg->len);
	crc_accumulate(crc_extra, &checksum);

Step1 Checksumを初期化

# define X25_INIT_CRC 0xffff
static inline void crc_init(uint16_t* crcAccum)
{
        *crcAccum = X25_INIT_CRC;
}

Step2 メッセージのHeadからChecksumを計算

uint16_t checksum = crc_calculate(&buf[1], header_len-1);

MAVLinkメッセージのHeadからChecksumを計算するイメージ
image.png

Step3 メッセージのpayloadからChecksumを計算

crc_accumulate_buffer(&checksum, _MAV_PAYLOAD(msg), msg->len);

MAVLinkメッセージのpayloadからChecksumを計算するイメージ
image.png

Step4 メッセージのCRC_EXTRAからChecksumを計算

crc_accumulate(crc_extra, &checksum);

Step5 受信側でChecksumを比較

MAVLink受信側で、受信したメッセージから計算したChecksumと受信したChecksumを比較します。
Checksumが不一致場合、MAVLink受信失敗になります。

image.png

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?