ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

PC端基于SpringBoot架构控制无人机(四):交互代码实现

PC端基于SpringBoot架构控制无人机(四):交互代码实现

一、引言

在之前的文章中,我们已经了解了如何与无人机的飞控系统进行交互。要实现对无人机的控制,关键是通过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 文件中添加以下依赖:

        <dependency><groupId>io.dronefleet.mavlink</groupId><artifactId>mavlink</artifactId><version>1.1.11</version></dependency>

三、连接飞控系统

为了与飞控系统进行通信,我们需要首先建立一个连接。可以通过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<Heartbeat> 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 类建立与飞控的TCP连接。

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

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

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

  5. 最后关闭连接。

四、实现控制命令

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

控制命令接口

@PostMapping("/takeoff")
public void takeoff(String sn, float altitude) throws Exception {mavlinkService.takeoff(sn, altitude);
}

Service 中的实现

public void takeoff(String sn, float altitude) throws Exception {isConnection(sn);  // 检查连接UavDataCacheManager cacheManager = UavDataCacheManager.getInstance();Map<String, Object> uavDataBySn = cacheManager.getUavDataBySn(sn);float alt = Convert.toFloat(uavDataBySn.get("alt"), 0f);float targetAlt = altitude + alt;// 发送起飞命令sendCommand(sn,MavCmd.MAV_CMD_NAV_TAKEOFF,0, 0, 0, 0, 0, 0, targetAlt);
}

发送命令

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

代码说明

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

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

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

  4. 通过 MavlinkConnection 发送命令。

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

五、总结

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

返回列表