This library includes a mix task that generates code from a MAVLink xml definition files and an application that enables communication with other systems using the MAVLink 1.0 or 2.0 protocol over serial, UDP and TCP connections.
MAVLink is a Micro Air Vehicle communication protocol used by Pixhawk, Ardupilot and other leading autopilot platforms. For more information on MAVLink see https://mavlink.io.
If available in Hex, the package can be installed
by adding mavlink
to your list of dependencies in mix.exs
:
def deps do
[
{:mavlink, "~> 0.9.0"}
]
end
This library is not officially recognised or supported by MAVLink at this time. We aim over time to achieve complete compliance with the MAVLink 2.0 specification, but our initial focus is on using this library on companion computers and ground stations for our team entry in the 2020 UAV Outback Challenge.
MAVLink message definition files for popular dialects can be found here. To generate an Elixir source file containing the modules we need to speak a MAVLink dialect (for example ardupilotmega):
> mix mavlink test/input/ardupilotmega.xml lib/apm.ex APM
* creating lib/apm.ex
Generated APM in 'lib/apm.ex'.
>
Add MAVLink.Application
with no start arguments to your mix.exs
. You need to point the application at the dialect you just generated
and list the connections to other vehicles in config.exs
:
config :mavlink, dialect: APM, connections: ["serial:/dev/cu.usbserial-A603KH3Y:57600", "udpout:127.0.0.1:14550", "tcpout:127.0.0.1:5760"]
The above config specifies the APM dialect we generated and connects to a a vehicle on a radio modem, a ground station listening for UDP packets on 14550 and a SITL vehicle listening for TCP connections on 5760. Remember 'out' means client, 'in' means server.
With the configured MAVLink application running you can subscribe to particular MAVLink messages:
alias MAVLink.Router, as: MAV
defmodule Echo do
def run() do
receive do
msg ->
IO.inspect msg
end
run()
end
end
MAV.subscribe source_system: 1, message: APM.Message.Heartbeat
Echo.run()
or send a MAVLink message:
alias MAVLink.Router, as: MAV
alias APM.Message.RcChannelsOverride
MAV.pack_and_send(
%RcChannelsOverride{
target_system: 1,
target_component: 1,
chan1_raw: 1500,
chan2_raw: 1500,
chan3_raw: 1500,
chan4_raw: 1500,
chan5_raw: 1500,
chan6_raw: 1500,
chan7_raw: 1500,
chan8_raw: 1500,
chan9_raw: 0,
chan10_raw: 0,
chan11_raw: 0,
chan12_raw: 0,
chan13_raw: 0,
chan14_raw: 0,
chan15_raw: 0,
chan16_raw: 0,
chan17_raw: 0,
chan18_raw: 0
}
)
The MAVLink application is to Elixir/Erlang code what MAVProxy is to its Python modules: a router that sits alongside them and gives them access to other MAVLink systems over its connections. Unlike MAVProxy it is not responsible for starting/stopping/scheduling Elixir/Erlang code.
The router is supervised. On a failure the configured connections and previous subscriptions are restored immediately. If a connection fails or is not available at startup the router will attempt to reconnect each second and continue routing frames on the remaining connections. If a subscriber fails it will be automatically unsubscribed and any new subscriber will be responsible for reconnection.
- MAVLink microservice/protocol helpers (see elixir_mavlink_util)
- Signed MAVLink v2 messages