DJI OSDK自定义程序未执行main函数的问题求助(N3+树莓派)
排查DJI OSDK自定义程序在进入main逻辑前终止的问题
从你给出的程序输出来看,程序已经完成了设备串口初始化、无人机版本识别、激活验证、订阅验证,甚至处理了云台未挂载的情况,但后续没有进入你自定义的main逻辑就终止了。结合telemetry-sample能正常运行的情况,我给你几个针对性的排查方向:
1. 检查main函数的核心逻辑是否缺失持续运行的代码
telemetry-sample能一直运行,是因为它在初始化后有持续的循环逻辑(比如while(1)或者依赖OSDK的遥测回调线程保持进程存活)。你可以检查自己的代码:
- 是不是在完成OSDK初始化后没有写任何阻塞或循环的代码?比如初始化完就直接走到了main函数的结尾,导致进程自然退出?
- 是不是不小心在初始化流程后加了
return 0;之类的提前退出语句?
2. 对比CMake配置的细节差异
虽然你说用了和示例相同的CMAKE方式,但还是要仔细核对:
- 检查链接的库是否完全一致:示例的CMakeLists.txt里是不是链接了
djiosdk-core之外的其他库?比如pthread(OSDK依赖线程库),你有没有漏掉? - 检查编译选项:比如示例是不是加了
-pthread编译参数,你的配置里有没有?这类参数会影响线程的正常创建,导致进程无法维持运行。 - 检查可执行文件的输出路径和运行时的工作目录:比如示例运行时能正确读取
UserConfig.txt,你的程序是不是在不同的目录运行,导致某些隐性依赖加载失败?
3. 用GDB调试定位终止点
最直接的方式是用GDB调试你的程序,精准定位终止的位置:
- 在树莓派上安装GDB:
sudo apt-get install gdb - 启动调试:
gdb ./your_program_name - 运行程序:
run UserConfig.txt - 当程序终止时,用
bt命令查看调用栈,就能看到程序是在哪个函数里退出的——是OSDK的某个初始化函数返回了错误,还是你的代码提前退出?
4. 核对OSDK初始化流程的完整性
对比telemetry-sample的初始化步骤,确认你的代码有没有遗漏关键步骤:
- 是不是在激活后没有调用
vehicle->telemetry->startPackage()来启动遥测订阅?(虽然你的输出里有启动和移除package的日志,但要确认后续有没有重新启动正确的订阅包) - 是不是没有设置遥测回调函数?示例里通过回调来维持程序的事件循环,没有回调的话,进程可能在初始化完成后就退出。
- 是不是没有调用
vehicle->start()来启动OSDK的内部线程?有些版本的OSDK需要显式调用这个函数来维持后台线程运行。
5. 检查进程运行的权限和环境
虽然示例能运行,但还是要确认:
- 是不是用相同的用户权限运行你的程序?比如示例用
sudo运行,你的程序直接用普通用户运行?(不过从输出看串口已经成功打开,这个可能性较低,但可以排除) - 是不是树莓派的系统环境有差异?比如示例运行时加载了某些环境变量,你的程序没有?可以尝试在示例的相同目录下运行你的程序。
内容的提问来源于stack exchange,提问作者Mauricio
相关产品推荐
相关产品推荐

