DJI OSDK开发实例篇(针对初学者, Linux C++)

关于大疆OSDK开发前,如何配置,官网或者其它博客都有比较详细的介绍,这里推荐一篇博文:DJI M210 RTK V2 + manifold2 Onboad-SDK开发流程及踩坑合集(一)
结合官网Doc看即可。
我这的目的是让初学者知道何为OSDK开发,然后能迅速进入角色。

  1. 什么是OSDK开发
    OSDK我们知道叫Onboard SDK,这个Onboard 就是搭载在无人机上一台微型电脑,跟普通的电脑基本没差别,就是体积小点,cpu/内存差点等,毕竟的它需要的功能单一,目的就是通过串口和usb口来控制无人机。其实更适合看成一台带SIM卡的平板电脑(SIM卡主要用来提供网络)。Onboard系统一般是ubuntu,OSDK开发其实就是linux上的网络开发,接收远端的命令或者数据,然后调用OSDK来将命令和数据传到无人机,以控制无人机操作。所以实际上的OSDK,就是要在这台微小的机载电脑上编程。

  2. 前期的开发其实可以在任何电脑上进行
    OSDK本身是Linux C++程序,因此,OSDK开发前期是可以在任意linux系统上开发的,同机载电脑上开发一样,它需要下载啥第三方,你就配置好相关第三方lib即可,然后下载OSDK到你的Linux系统上,按照DOC上的提示make && make install,你的代码就可以引用OSDK相关lib与头文件(需要在Cmake中配置好)。
    当然,在其它电脑上开发只能用来编译代码是否有问题,功能部分测试,只能测试与OSDK无法的部分。OSDK相关部分的调式还是需要机载电脑和链接无人机调试。

  3. 实例—无人机远程监控
    条件:监控服务器有固定IP(如果没有固定IP,需通过云转换,这样延迟毕竟大)
    lib:考虑实时性,这里考虑使用websocket,这里使用Linux C++库,websocketpp

  1. 首先新建一个cmake工程:Linux下新建一个目录然后配置好cmake
    2)将大疆OSDK与websocketpp都下载到该目录下,OSDK需要编译安装,注意将OSDK中的CMakeLists.txt中的sample编译部分注释掉,
#if (${CMAKE_SYSTEM_NAME} MATCHES Linux)
#  add_subdirectory(sample/platform/linux)
#endif()

然后对OSDK进行编译安装(参考官方文档)
3)重新配置项目的CMakeLists.txt,将OSDK与websocketpp包含进去。
OSDK部分,参考sample下的CMakeLists.txt修改即可,不过我发现部分link_libraries不起作用,得放到target_link_libraries中:

#link_libraries(dji-linker)
#link_libraries(advanced-sensing)
link_libraries(djiosdk-core)
link_libraries(${LIBUSB_1_LIBRARIES})
#link_libraries(${FFMPEG_LIBRARIES})

#src
file(GLOB SOURCE_FILES *.hpp *.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/linux/common/dji_linux_environment.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/linux/common/dji_linux_helpers.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/linux/hal/*.c
        ${CMAKE_CURRENT_SOURCE_DIR}/linux/osal/*.c
        ${LINKER_HEADER_SRC}
)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)


add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} pthread dji-linker advanced-sensing ${FFMPEG_LIBRARIES} swresample)

dji-linker、advanced-sensing、FFMPEG_LIBRARIES放到link_libraries编译不过,只能放到target_link_libraries中了。

4)注意将sample中得linux/common hal osal复制到项目根目录下。这些基本接口编程要用到。

5)对于websocketpp,由于都是头文件形式,不需要安装,但由于其依赖boost,必须安装boost,cmake 中也需要做一定修改:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread  -lboost_system -g -O0")


#websocket with boost
FIND_PACKAGE(Boost REQUIRED system filesystem)
if(Boost_FOUND)
    message(STATUS "boost include path is : ${Boost_INCLUDE_DIRS}")
    message(STATUS "boost library path is : ${Boost_LIBRARY_DIRS}")
    message(STATUS "boost libraries is : ${Boost_LIBRARIES}")
    include_directories(${Boost_INCLUDE_DIRS})
    link_directories(${Boost_LIBRARY_DIRS})
else()
    message(WARNING "boost not found.")
endif()

set(WEBSOCKET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/websocketpp)
include_directories(${WEBSOCKET_DIR})

6)然后就可以安心在我们得linux系统上进行前期开发了,main.cpp:

#include 
#include 
#include "dji_linux_helpers.hpp"
#include "MainWebSocket.hpp"


int main(int argc, char *argv[]) {
     
    // Setup OSDK.
    LinuxSetup linuxEnvironment(argc, argv);
    Vehicle* vehicle = linuxEnvironment.getVehicle();
    if (vehicle == NULL) {
     
        std::cout << "Vehicle not initialized, exiting.\n";
        //return -1;
    }
    else {
     
        const char* acm_dev = linuxEnvironment.getEnvironment()->getDeviceAcm().c_str();
        vehicle->advancedSensing->setAcmDevicePath(acm_dev);
    }

    DjiBridge bridge(vehicle);
    MainWebSocket main_socket(&bridge, linuxEnvironment.getEnvironment()->getServerUrl());
    main_socket.start_run();
    //keepalive
    while (true) {
     
        sleep(5000);
    }
    std::cout << "main exit with object:" << &main_socket << std::endl;
    return 0;
}

你可能感兴趣的:(Linux,无人机,linux,c++)