> 技术文档 > PC端基于SpringBoot架构控制无人机(四):交互代码实现_java开发无人机飞控系统怎么实现指令传达

PC端基于SpringBoot架构控制无人机(四):交互代码实现_java开发无人机飞控系统怎么实现指令传达


一、引言

在之前的文章中,我们已经了解了如何与无人机的飞控系统进行交互。要实现对无人机的控制,关键是通过MAVLink协议与飞控进行沟通。MAVLink协议是一种轻量级的通信协议,广泛应用于无人机的控制和数据传输。接下来,我们将深入探讨如何在Java中使用MAVLink协议进行无人机的操作。

二、Java开源库

要在Java环境下实现MAVLink协议,首先我们需要引入相关的开源库,这将大大简化我们的开发工作。以下是两个常用的MAVLink开源库:

  1. dronefleet/mavlink
    这是一个功能强大的MAVLink Java库,支持MAVLink 1.0和MAVLink 2.0协议。它提供了简洁的API,方便开发者进行消息的序列化和反序列化操作,并支持多种通信方式,如TCP、UDP和串口通信。

  2. mavlink-java
    该库同样实现了MAVLink协议的Java封装,具有良好的性能和稳定性。它提供了一些实用的工具类和方法,帮助开发者快速搭建MAVLink通信系统。

本文中,我们将使用 dronefleet/mavlink 库进行演示。

引入Maven依赖

在项目的 pom.xml 文件中添加以下依赖:

  io.dronefleet.mavlink mavlink 1.1.11 

三、连接飞控系统

为了与飞控系统进行通信,我们需要首先建立一个连接。可以通过USB线将飞控连接到电脑,基于串口读取数据或通过UDP进行远程连接。以下是一个基于TCP连接的简单示例,展示如何与飞控进行基于UDP连接并读取数据。

import io.dronefleet.mavlink.MavlinkConnection;import io.dronefleet.mavlink.MavlinkMessage;import io.dronefleet.mavlink.common.Heartbeat;import io.dronefleet.mavlink.util.EnumValue;import java.io.IOException;import java.net.Socket;public class MavlinkTcpConnectionExample { public static void main(String[] args) { try { // 建立TCP连接 Socket socket = new Socket(\"192.168.1.100\", 5760); MavlinkConnection connection = MavlinkConnection.create(  socket.getInputStream(), socket.getOutputStream()); // 发送心跳消息 Heartbeat heartbeat = Heartbeat.builder()  .type(EnumValue.of(1)) // 设置心跳类型  .autopilot(EnumValue.of(3)) // 设置自动驾驶仪类型  .baseMode(0)  // 设置基础模式  .customMode(0) // 设置自定义模式  .systemStatus(EnumValue.of(4)) // 设置系统状态  .mavlinkVersion(3) // 设置MAVLink版本  .build(); // 创建并发送Mavlink心跳消息 MavlinkMessage message = MavlinkMessage.create(1, 1, heartbeat); connection.send(message); // 接收消息并打印 MavlinkMessage receivedMessage; while ((receivedMessage = connection.receive()) != null) { System.out.println(\"Received message: \" + receivedMessage); } // 关闭连接 connection.close(); socket.close();  } catch (IOException e) { // 打印异常信息 e.printStackTrace(); } }}

代码说明

  1. 通过 Socket 类建立与飞控的UDP连接。

  2. 使用 MavlinkConnection 创建一个MAVLink通信连接。

  3. 发送心跳消息以验证连接。

  4. 通过 connection.receive() 接收无人机发送的消息,并打印输出。

  5. 最后关闭连接。

四、实现控制命令

接下来,我们将介绍如何实现无人机的控制命令,例如起飞命令。控制命令的发送通常是通过发送MAVLink消息来实现的。

Service 中的实现

public void takeoff(String sn, float altitude) throws Exception { // 发送起飞命令 sendCommand( sn, MavCmd.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, altitude );}

发送命令

private void sendCommand( String sn, MavCmd command, float param1, float param2, float param3, float param4, float param5, float param6, float param7) throws Exception { CommandLong cmd = new CommandLong.Builder() .command(command) .targetSystem(1) // 飞控系统ID .targetComponent(1) // 组件ID .param1(param1) .param2(param2) .param3(param3) .param4(param4) .param5(param5) .param6(param6) .param7(param7) .build(); logger.info(\"发送的指令为 {}\", cmd); // 发送命令 mavlinkConnection.send2( 1, 1, cmd );}

代码说明

  1. takeoff 方法首先检查无人机连接状态。

  2. 然后从缓存中获取当前高度,并计算目标起飞高度。

  3. 使用 sendCommand 方法发送起飞命令,指令类型为 MAV_CMD_NAV_TAKEOFF

  4. 通过 MavlinkConnection 发送命令。

部分细节需要注意,如起飞的时候,是需要绝对的高度,所以需要拿到飞控中的绝对高度和海拔高度来进行一个增加

五、总结

本文介绍了如何在Java中使用MAVLink协议来控制无人机。首先,我们通过引入开源库来简化开发过程,并通过TCP连接与飞控系统建立通信。接着,我们实现了一个简单的起飞命令的控制系统。通过这些示例,您可以更好地理解如何通过MAVLink协议与无人机进行交互,后续如果有需求可以进行更深一步的开发,参考MavLink官网。