Secondary development of UAV SDK based on Dajiang
In the near future, the company needs to develop a mobile APP based on the Dajiang UAV SDK to cooperate with the background to realize the management of UAV. Of course, Dajiang itself also provides us with a management platform --- Dajiang Sikong. Through the official APP of Dajiang and the background management system of Dajiang Sikong, the management of UAV can be realized. However, the cost of Sikong is too high. The advanced version costs 19999 for one year. Therefore, we need to develop our own mobile APP to transmit information about UAV to the background.
The following is a summary of some points that need to be paid attention to in the development process to avoid future generations stepping on the pit.
Links to related materials
Here is a link to the materials used:
Through the download center, we can download the UAV operation manual, quick start manual and different app versions to provide us with convenient software tools and so on.
There are many demos here. Different demos are used to introduce different function points. Remember to follow the code in the demo when developing, not the official documents. You may not be able to run the program according to the official documents.
In the mall, you can understand the characteristics of relevant products and develop them better
The document is still to be looked at, especially for novices who have not been exposed to drones. The documents are all in English, which is easy to understand. I really don't know how to translate documents into Chinese through Google browser's translation function. It is suggested to check the original text with Chinese.
API can be used as a supplement in the development process. If you don't know that method, you can search directly here. The search function of API is very powerful. You only need to enter different method names or class names. The explanations in API are relatively detailed.
Enter text
First of all, if you want to develop Dajiang UAV APP, you need to meet the following conditions:
- First, you need to have an UAV (you need this UAV to support the SDK View supported UAV models)
- Developer account
If the above conditions are met, you can start development. Just like using the third-party SDK, you need to create an APP in the developer account. Here, you need to note that the package name of the APP must be the same as the real package name, or it will not run successfully!
The basic contents about how to import dependency and how to create APP will not be repeated here. The documents are all used. It should be noted that the dependency in the documents is not complete. What you need to do is download the demo, and then copy all the dependencies in the demo to your project
To be more specific, this part of the document is incomplete. You need to add:
packagingOptions { doNotStrip "*/*/libdjivideo.so" doNotStrip "*/*/libSDKRelativeJNI.so" doNotStrip "*/*/libFlyForbid.so" doNotStrip "*/*/libduml_vision_bokeh.so" doNotStrip "*/*/libyuv2.so" doNotStrip "*/*/libGroudStation.so" doNotStrip "*/*/libFRCorkscrew.so" doNotStrip "*/*/libUpgradeVerify.so" doNotStrip "*/*/libFR.so" doNotStrip "*/*/libDJIFlySafeCore.so" doNotStrip "*/*/libdjifs_jni.so" doNotStrip "*/*/libsfjni.so" doNotStrip "*/*/libDJICommonJNI.so" doNotStrip "*/*/libDJICSDKCommon.so" doNotStrip "*/*/libDJIUpgradeCore.so" doNotStrip "*/*/libDJIUpgradeJNI.so" exclude 'META-INF/rxjava.properties' } //To replace those written in the document
OK, dependency has also been introduced successfully, so we can develop it.
Here is a brief introduction to the steps of using the sdk, with the emphasis on the areas that need special attention for acceptance.
First of all, you need to register the sdk, and then call login in the successful callback
if (isRegistrationInProgress.compareAndSet(false, true)) { AsyncTask.execute(() -> DJISDKManager.getInstance() .registerApp(MainActivity.this.getApplicationContext(), new DJISDKManager.SDKManagerCallback() { @Override public void onRegister(DJIError djiError) { // If there is no problem with the configured package name and API key, then the registration is successful if (djiError == DJISDKError.REGISTRATION_SUCCESS) { DJISDKManager.getInstance().startConnectionToProduct(); // Log in loginAccount(); } } @Override public void onProductDisconnect() { Log.e(TAG, "onProductDisconnect"); notifyStatusChange(); } @Override public void onProductConnect(BaseProduct baseProduct) { Log.e(TAG, String.format("onProductConnect newProduct:%s", baseProduct)); notifyStatusChange(); } @Override public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent oldComponent, BaseComponent newComponent) { } @Override public void onInitProcess(DJISDKInitEvent djisdkInitEvent, int i) { } @Override public void onDatabaseDownloadProgress(long l, long l1) { } })); }
The above step is a necessary step for the APP to start, otherwise you will not be able to control the UAV.
This step requires attention:
- The above callback content is not in the main thread, so if you want to operate the interface content, you need to operate in the main thread
- You need network support to register SDK and login account for the first time, and then you don't need network.
- Login must be called after successful registration of SDK, otherwise the login interface will not be loaded.
OK, after the above steps are completed, we are waiting for the UAV to connect. When the UAV is connected, it will trigger a callback. When the UAV is connected, we can carry out real development.
During the development, I mainly used several classes in the SDK, and their methods are well understood.
DJISDKManager
This class is very critical. It is the entry to use SDK and Dajiang UAV.
This class is used to register SDK and obtain UAV objects.
After acquiring the UAV object (Aircraft) through SJISDKManager, you can use the Aircraft to obtain the corresponding objects of each component of the UAV, such as: flight controller (this is the core component of the UAV, which controls the flight of the UAV, the position information and status information of the UAV), Battery, Camera, cloud platform Gimbal, etc , RemoteController, and so on. See COMPONENT CLASSES for details
At the same time, we can also introduce UX SDK address To help us develop quickly.
The UX SDK mainly provides some thread controls that we can use when we put them in the UI, and they are not static UI, they have data, and we do not need to do any processing.
For example: dji.ux.widget.FPVWidget component, you just need to put it in the layout to display the picture of UAV camera.
Attention content
Live broadcast:
if (!DJISDKManager.getInstance().getLiveStreamManager().isStreaming()) { new Thread() { @Override public void run() { fpv.registerLiveVideo(VideoFeeder.getInstance() .getSecondaryVideoFeed(), true); DJISDKManager.getInstance().getLiveStreamManager().setLiveUrl( "rtmp://x.x.x.x/x"); DJISDKManager.getInstance().getLiveStreamManager() .setVideoEncodingEnabled(true); int result = DJISDKManager.getInstance().getLiveStreamManager() .startStream(); L.e("startLive:" + result + DJISDKManager.getInstance() .getLiveStreamManager().isStreaming() + "\n isVideoStreamSpeedConfigurable:" + DJISDKManager .getInstance().getLiveStreamManager() .isVideoStreamSpeedConfigurable() + "\n isLiveAudioEnabled:" + DJISDKManager.getInstance() .getLiveStreamManager().isLiveAudioEnabled()); } }.start(); }
A simple setLiveUrl() and then start live broadcasting will not succeed. You need to register the live video in the previous step. The fpv in the code is the dji.ux.widget.FPVWidget control.
The method of acquiring UAV position
// Active acquisition Aircraft aircraft1 = (Aircraft) DJISDKManager.getInstance().getProduct(); FlightControllerState state = aircraft1.getFlightController().getState(); L.e("==altitude:" + state.getAircraftLocation().getAltitude() + "latitude:" + state.getAircraftLocation().getLatitude() + "longitude:"); // Of course, you can register the callback function void setStateCallback(@Nullable FlightControllerState.Callback callback);
Layout name pit
Do not display the dialog login name in the layout, because it already exists in the SDK of Dajiang. When you are adding a dialog login name, calling the login API will report a null pointer error.
If there is an unexplained layout null pointer exception, it is likely that our own layout and the layout name in the Dajiang SDK are duplicate.
Most callbacks are not in the main thread
Most of the callbacks in the Dajiang SDK are not in the main thread, which needs to be noted