最近完成了对DJI无人机代码的重构工作,这里记录一下重构过程中遇到的问题。
重构之后代码如下:
client.cpp是节点文件,也是主文件,位于/home/ubuntu/sdk/src/dji_sdk_demo/src目录下。
CMakeLists.txt是编译文件,位于/home/sdk/src/dji_sdk_demo/目录下,如果增加库函数要修改该文件中add_executable中的内容。
userlib是库文件的文件夹,位于/home/sdk/src/dji_sdk/include/目录下。
usercpp是库文件对应的cpp文件,位于/home/ubuntu/sdk/src/dji_sdk_demo/src目录下。
每个文件说明如下:
config.h
定义所需要的所有库函数和全局变量,以及函数Config相关的宏定义。该头文件中定义的函数是所有代码中可以共用的计算性的函数。
flycontrol.h
定义关于无人机飞行控制相关的函数,例如距离差计算,高度差计算,GPS差计算,集体坐标系移动的速度控制,无人机拍照函数等等。
imagealign.h
图像对准有关的函数,定义了视觉处理函数。
infocallback.h
信息回传相关函数的定义,接受无人机传递的message。
protocol.h
通信协议相关的函数,如发送指令,增加航点等等。
simulator.h
使用模拟器仿真时相关的函数,如接受按键,按键控制状态机切换等等。
在函数编译的过程中,出现了一些问题,现在具体说一下解决方法:
问题一:编译时出现multiple definition of问题如何解决
具体参考链接:http://blog.csdn.net/wu070815/article/details/8781762
用其中的第二种方法,即在config.h文件中的全局变脸先加extern申明,并且在此文件中不能赋值,而在config.cpp文件中进行申明以及赋值操作。
因此今后增加全局变量也需要在config.h中加上申明,config.cpp加上真正的定义和初始化,不然会报错。
问题二:
VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
使用方法参考以下链接:http://blog.csdn.net/yang_xian521/article/details/7440190
以上指令可以生成视频流,如何把它分解成先定义,然后再赋值的形式。
具体参考以下链接:http://docs.opencv.org/trunk/dd/d9e/classcv_1_1VideoWriter.html
即
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> using namespace cv; using namespace std; int main(int, char**) { Mat src; // use default camera as video source VideoCapture cap(0); // check if we succeeded if (!cap.isOpened()) { cerr << "ERROR! Unable to open camera\n"; return -1; } // get one frame from camera to know frame size and type cap >> src; // check if we succeeded if (src.empty()) { cerr << "ERROR! blank frame grabbed\n"; return -1; } bool isColor = (src.type() == CV_8UC3); //--- INITIALIZE VIDEOWRITER VideoWriter writer; int codec = CV_FOURCC('M', 'J', 'P', 'G'); // select desired codec (must be available at runtime) double fps = 25.0; // framerate of the created video stream string filename = "./live.avi"; // name of the output video file writer.open(filename, codec, fps, src.size(), isColor); // check if we succeeded if (!writer.isOpened()) { cerr << "Could not open the output video file for write\n"; return -1; } //--- GRAB AND WRITE LOOP cout << "Writing videofile: " << filename << endl << "Press any key to terminate" << endl; for (;;) { // check if we succeeded if (!cap.read(src)) { cerr << "ERROR! blank frame grabbed\n"; break; } // encode the frame into the videofile stream writer.write(src); // show live and wait for a key with timeout long enough to show images imshow("Live", src); if (waitKey(5) >= 0) break; } // the videofile will be closed and released automatically in VideoWriter destructor return 0; } |