PC端基于SpringBoot架构控制无人机(四):交互代码实现_java开发无人机飞控系统怎么实现指令传达
一、引言
在之前的文章中,我们已经了解了如何与无人机的飞控系统进行交互。要实现对无人机的控制,关键是通过MAVLink协议与飞控进行沟通。MAVLink协议是一种轻量级的通信协议,广泛应用于无人机的控制和数据传输。接下来,我们将深入探讨如何在Java中使用MAVLink协议进行无人机的操作。
二、Java开源库
要在Java环境下实现MAVLink协议,首先我们需要引入相关的开源库,这将大大简化我们的开发工作。以下是两个常用的MAVLink开源库:
-
dronefleet/mavlink
这是一个功能强大的MAVLink Java库,支持MAVLink 1.0和MAVLink 2.0协议。它提供了简洁的API,方便开发者进行消息的序列化和反序列化操作,并支持多种通信方式,如TCP、UDP和串口通信。 -
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(); } }}
代码说明
-
通过
Socket
类建立与飞控的UDP连接。 -
使用
MavlinkConnection
创建一个MAVLink通信连接。 -
发送心跳消息以验证连接。
-
通过
connection.receive()
接收无人机发送的消息,并打印输出。 -
最后关闭连接。
四、实现控制命令
接下来,我们将介绍如何实现无人机的控制命令,例如起飞命令。控制命令的发送通常是通过发送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 );}
代码说明
-
takeoff
方法首先检查无人机连接状态。 -
然后从缓存中获取当前高度,并计算目标起飞高度。
-
使用
sendCommand
方法发送起飞命令,指令类型为MAV_CMD_NAV_TAKEOFF
。 -
通过
MavlinkConnection
发送命令。
部分细节需要注意,如起飞的时候,是需要绝对的高度,所以需要拿到飞控中的绝对高度和海拔高度来进行一个增加
五、总结
本文介绍了如何在Java中使用MAVLink协议来控制无人机。首先,我们通过引入开源库来简化开发过程,并通过TCP连接与飞控系统建立通信。接着,我们实现了一个简单的起飞命令的控制系统。通过这些示例,您可以更好地理解如何通过MAVLink协议与无人机进行交互,后续如果有需求可以进行更深一步的开发,参考MavLink官网。