用过上云api的小伙伴们知道,大疆上云api功能不少,并且可以本地部署,对于有实物实验要求的同学,是一个不错的选择。

上图的各种api功能都可以在cloud_api_sample_docker/cloud_api_sample/source/backend_service/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/PayloadControlMethodEnum.java文件里面找到对应的功能。

调用方法如下代码所示,简单易懂,java代码调用类,然后设置参数,当然,在此之前,要先获取飞行器控制权与负载控制权,代码里面已有体现。

IControlService controlService = context.getBean(IControlService.class);

        PayloadCommandsParam look_at = new PayloadCommandsParam();
        look_at.setCmd(PayloadCommandsEnum.CAMERA_AIM);
        look_at.setSn(gatewaySn);
        DronePayloadParam data1 = new DronePayloadParam();
                data1.setPayloadIndex("81-0-0");
        data1.setCameraType(CameraTypeEnum.ZOOM);
        data1.setX(0.5);
        data1.setY(0.1);
        data1.setLocked(false);
        data1.setPitchSpeed(20.0);
        data1.setYawSpeed(20.0);
        look_at.setData(data1);
        DronePayloadParam data = new DronePayloadParam();
        data.setPayloadIndex("81-0-0");
        // ✅ 调用云台复位
        HttpResultResponse result_flight = controlService.seizeAuthority(gatewaySn, DroneAuthorityEnum.FLIGHT, null);
        Thread.sleep(1000);
        HttpResultResponse result_payload = controlService.seizeAuthority(gatewaySn, DroneAuthorityEnum.PAYLOAD, data);
        Thread.sleep(1000);
//        HttpResultResponse result = controlService.payloadCommands(payloadCommandsParam);

        HttpResultResponse result_look_at = controlService.payloadCommands(look_at);

运行该代码,我们的mqttx里面对应的话题就会收到数据,控制无人机负载变焦,与上云官方文件对应

{"tid":"451882c2-98e6-4c49-92cc-fe11a793d1b4",
"bid":"77a13145-ff79-43e3-8e2c-ec8113282f93",
"timestamp":1764312583726,
"data":{"payload_index":"81-0-0",
"camera_type":"zoom",
"zoom_factor":2.0},
"method":"camera_focal_length_set"}

但是,如下图所示,cloud_api_sample_docker/cloud_api_sample/source/backend_service/sample/src/main/java/com/dji/sample/control/model/enums/PayloadCommandsEnum.java是大疆实际给出的实现方法,我们发现,最重要的云台控制方法,look_at函数没有给出实现,不只是一个,而是look_at之后的所有功能都没有实现。

那咋办?要么直接控制话题发布,要么注册一个呗。

先这样,写一个信息,告诉idea我们有这个函数,然后去找他这个函数需要的参数值,look_at函数的参数在这个文件里面cloud_api_sample_docker/cloud_api_sample/source/backend_service/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java,我们可以看到,一共五个参数

package com.dji.sdk.cloudapi.control;

import com.dji.sdk.cloudapi.device.PayloadIndex;
import com.dji.sdk.common.BaseModel;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

/**
 * @author sean
 * @version 1.7
 * @date 2023/10/12
 */
public class CameraLookAtRequest extends BaseModel {

    /**
     * Camera enumeration.
     * It is unofficial device_mode_key.
     * The format is *{type-subtype-gimbalindex}*.
     * Please read [Product Supported](https://developer.dji.com/doc/cloud-api-tutorial/en/overview/product-support.html)
     */
    @NotNull
    private PayloadIndex payloadIndex;

    /**
     * Whether the relative location of drone head and gimbal is locked
     */
    @NotNull
    private Boolean locked;

    /**
     * The latitude of target point is angular values.
     * Negative values for south latitude and positive values for north latitude.
     * It is accurate to six decimal places.
     */
    @Min(-90)
    @Max(90)
    @NotNull
    private Float latitude;

    /**
     * The latitude of target point is angular values.
     * Negative values for west longitude and positive values for east longitude.
     * It is accurate to six decimal places.
     */
    @NotNull
    @Min(-180)
    @Max(180)
    private Float longitude;

    /**
     * Ellipsoid height
     */
    @NotNull
    @Min(2)
    @Max(10000)
    private Float height;

    public CameraLookAtRequest() {
    }

    @Override
    public String toString() {
        return "CameraLookAtRequest{" +
                "payloadIndex=" + payloadIndex +
                ", locked=" + locked +
                ", latitude=" + latitude +
                ", longitude=" + longitude +
                ", height=" + height +
                '}';
    }
    public PayloadIndex getPayloadIndex() {return payloadIndex;}
    public CameraLookAtRequest setPayloadIndex(PayloadIndex payloadIndex) {
        this.payloadIndex = payloadIndex;
        return this;
    }
    public Boolean getLocked() {
        return locked;
    }
    public CameraLookAtRequest setLocked(Boolean locked) {
        this.locked = locked;
        return this;
    }
    public float getLatitude() { return latitude; }
    public CameraLookAtRequest setLatitude(Float latitude) {
        this.latitude = latitude;
        return this;
    }
    public float getLongitude() { return longitude; }
    public CameraLookAtRequest setLongitude(Float longitude) {
        this.longitude = longitude;
        return this;
    }
    public float getHeight() { return height; }
    public CameraLookAtRequest setHeight(Float height) {
        this.height = height;
        return this;
    }
}

于是我们来到cloud_api_sample_docker/cloud_api_sample/source/backend_service/sample/src/main/java/com/dji/sample/control/service/impl/CameraLookAtImpl.java下,当然这个文件是没有的,是要我们自己写的,创建应该就可以了,填入如下的代码

package com.dji.sample.control.service.impl;

import com.dji.sample.control.model.param.DronePayloadParam;
import com.dji.sdk.cloudapi.device.PayloadIndex;

import java.util.Objects;

/**
 * 相机注视命令处理器
 */
public class CameraLookAtImpl extends PayloadCommandsHandler {

    public CameraLookAtImpl(DronePayloadParam param) {
        super(param);
    }

    @Override
    public boolean valid() {
        // 验证必需的注视参数
//        return Objects.nonNull(param.getPayloadIndex()) &&
//                Objects.nonNull(param.getLocked()) &&
//                Objects.nonNull(param.getTarget_Latitude()) &&
//                Objects.nonNull(param.getTarget_Longitude()) &&
//                Objects.nonNull(param.getTarget_Height());




        return Objects.nonNull(param.getPayloadIndex()) &&
                Objects.nonNull(param.getLocked()) &&
                Objects.nonNull(param.getLatitude()) &&
                Objects.nonNull(param.getLongitude()) &&
                Objects.nonNull(param.getHeight());
    }
}

注册就成功了,现在就可以运行了,运行结果:mqttx如下

{"tid":"88471da9-f5b5-4c8f-bfd6-af0d31bb940a",
"bid":"e0f9c766-5e13-4362-b94f-a6746c35baeb",
"timestamp":1764313485846,
"data":{"payload_index":"81-0-0",
"locked":true,
"latitude":38.875904,
"longitude":115.49977,
"height":20.0},
"method":"camera_look_at"}

当然cloud_api_sample_docker/cloud_api_sample/source/backend_service/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/control/CameraLookAtRequest.java路径下的文件也不是只看看就行,还有添加一个返回参数的代码,就是下面的红字,原本文件里面是没有的,如果不加上这个代码,那么就无法返回数据

    public PayloadIndex getPayloadIndex() {return payloadIndex;}
    public CameraLookAtRequest setPayloadIndex(PayloadIndex payloadIndex) {
        this.payloadIndex = payloadIndex;
        return this;
    }
    public Boolean getLocked() {
        return locked;
    }

    public CameraLookAtRequest setLocked(Boolean locked) {
        this.locked = locked;
        return this;
    }
    public float getLatitude() { return latitude; }
    public CameraLookAtRequest setLatitude(Float latitude) {
        this.latitude = latitude;
        return this;
    }
    public float getLongitude() { return longitude; }
    public CameraLookAtRequest setLongitude(Float longitude) {
        this.longitude = longitude;
        return this;
    }
    public float getHeight() { return height; }
    public CameraLookAtRequest setHeight(Float height) {
        this.height = height;
        return this;
    }

结果就是下面这样,mqttx里面数据部分是空的
{"tid":"84344b79-d143-4b63-bd67-180389af7b12","bid":"5159c982-3277-4d8c-af56-1de838e4feb4","timestamp":1764313117009,"data":{},"method":"camera_look_at"}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐