Skip to content

asmyasnikov/go-mavlink

Repository files navigation

Go Report Card

go-mavlink

a Go package for reading/writing mavlink 1.0 and 2.0 messages.

installation

  • install mavgen tool: go get github.com/asmyasnikov/go-mavlink/mavgen
  • generate code from mavlink xml definitions: go generate or mavgen -f ardupilotmega.xml -1 -c

xml definitions can be updated from https://github.com/mavlink/mavlink

usage

package go-mavlink/mavgen is used only for generating classes from mavlink xml definitions, it is not generally intended to be used by anything other than the go generate command.

Usage: mavgen [-c "github.com/my/project/mavlink/path"] [-p] [-f ./ardupilotmega.xml] [-v "ardupilotmega-v1.2.3"]
  -c string
        common mavlink package path used for import from go code. For example "github.com/asmyasnikov/go-mavlink/generated/mavlink1"
  -f string
        mavlink xml-definition file input
  -p    generate common mavlink package
  -v string
        custom version of mavlink dialect (default "devel")

packages go-mavlink/generated/mavlink1 and is the main package used for encoding/decoding mavlink messages.

mavlink.Packet is the struct that gets sent over the wire, and mavlink.Message is an interface implemented by all mavlink classes generated by mavgen.

dialects

Several mavlink dialects define messages for overlapping msg ids, so it is required to specify which dialects you'd like to use with default imports.

import (
    mavlink "github.com/asmyasnikov/go-mavlink/generated/mavlink1" // mavlink common package
    _ "github.com/asmyasnikov/go-mavlink/generated/mavlink1/ardupilotmega" // init support ardupilotmega dialect
)

Existing dialects (pre-generated) are:

  • ardupilotmega
  • asluav
  • common
  • minimal
  • matrixpilot
  • ualberta

marshall and unmarshall packet

Marshalling:

var packet Packet // make packet outside this code
bytes, err := mavlink.Marshal(&packet)
if err != nil {
    // catch error on marshal
}

Unmarshalling for reliable transport protocol for transfer bytes:

var packet Packet
if err := mavlink.Unmarshal([]byte{0xfe, 0x4, 0x0, 0x0, 0x0, 0xde, 0xf, 0x27, 0x0, 0x0, 0xf4, 0xe2}, &packet); err != nil {
    // catch error on marshal
}
// enjoy packet

decode stream

a typical decode loop might look like:

reader := SomeIoReader() // any io.Reader: UDP, serial port, bytes.Buffer, etc
dec := mavlink.NewDecoder(reader)

var packet mavlink.Packet
for {
    if err := dec.Decode(&packet); err != nil {
        // catch error on decode
    }

    // handle packet types you're interested in...
    // you can two ways to get message from packet
    switch packet.MsgID {
    case common.MSG_ID_PARAM_VALUE:
        var pv mavlink.ParamValue
        if err := pv.Unpack(&packet); err == nil {
            // handle param value
        }
    case common.MSG_ID_HEARTBEAT:
        heartbeat, ok := packet.Message().(*common.Heartbeat)
        if ok {
            // handle param value
        }
    }
}

encode stream

the most convenient way to encode is to use Encoder.Encode():

writer := SomeIoWriter() // any io.Writer: UDP, serial port, bytes.Buffer, etc
enc := mavlink.NewEncoder(writer)

packet := mavlink.Packet{
    SysID: 1,
    CompID: 2
}

if err := packet.Encode(&common.Ping{
    Seq: 12345,
}); err != nil {
    // catch error on encode message to packet
}

if err := enc.Encode(&packet); err != nil {
    // catch error on encode packet to encoder (write to writer)
}

About

mavlink support for Go

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 100.0%