c++ - Windows 中的 DJI OSDK
问题描述
我正在尝试让 DJI OSDK 从 Windows 环境中启动并运行,但在此过程中遇到了一些障碍。知道 SDK 已针对 Windows 10 发布,但尚未包括用于 M200 / 600 的 .Net API(我正在尝试接口)。
所以我首先想到让它在Windows上运行的最佳机会是尝试从 Windows 运行一个 linux 示例应用程序(通过 Visual Studio 2017)。一开始与 linux 依赖作斗争,但最终通过编写一个Windows Serial conn类并包括用于 Windows 的 pthread.dll 来解决这个问题(有一些小的额外改动并包括 #if _WIN32 等......)
经过相当多的编码和调试(也通过 VS 工具尝试了 Qt 示例应用程序 - 它自己的整个蠕虫罐头),我仍然在无人机 / RPA 的“Hello world”应用程序中苦苦挣扎。(即使其余的工作在我将其导出到 DLL 并在 c# 环境中实现,但除此之外)。
连接到平台后(基本上是初始化和串口打开),Activate 函数将您的应用 ID + 密钥发送到 RPA 并收到确认:这是我的代码:
bool threadSupport = true; //disable first so that able to debug
vehicle = new Vehicle(Port, baud, threadSupport, AdvancedSensing);
//test if connection works fine
if (!vehicle->protocolLayer->getDriver()->getDeviceStatus())
{
//not working, delete current instances
delete (vehicle);
vehicle = nullptr; //set back to null pointer
}
DJI::OSDK::Vehicle::ActivateData actData;
actData.ID = appID;
actData.encKey = new char[65];
strcpy(actData.encKey, key);
actData.version = getFWVersion();
ACK::ErrorCode ack = vehicle->activate(&actData, 1);
激活函数返回“无效反馈”:
STATUS/1 @ DJI::OSDK::Win_serial_device::init, L47: 尝试以波特率 230400 打开设备 COM21...
STATUS/1 @ DJI::OSDK::Win_serial_device::init, L75: ...串口启动成功。
ERRORLOG/1 @getDroneVersion,L1378:未获得无人机版本!请不要继续。可能原因: 串口连接:
SDK 未启用,请查看 DJI Assistant2 SDK -> [v] 启用 API 控制。
波特率不正确,请从 DJI Assistant2 -> SDK -> 波特率仔细检查。
TX 和 RX 引脚是反相的。
串口被另一个程序占用。* 需要许可。请执行“sudo usermod -a -G dialout $USER”(您不需要将 $USER 替换为您的用户名)。然后注销并再次登录
ERRORLOG/1 @activate,L1267:无法初始化某些车辆组件!STATUS/1 @ getErrorCodeMessage,L656:激活 STATUS/1 @ getCommonErrorCodeMessage,L722:ACK_NO_RESPONSE_ERROR
...已经检查了建议的问题,但无法找到任何明显的问题。此时不知道问题是硬件还是软件(代码和线程更改)。如果有人拥有 DJI 平台(M-range),或者在 DJI dev 上。团队可以帮忙吗?我迫不及待地想让这个工作!:(
我还在 Github DJI OSDK Win Console上分享了代码解决方案
解决方案
嗨,我和盛海一直在为基于非 GPS/LIDAR/视觉的自主研究运行 DJI 硬件 3 年。
这是 DJI 不会告诉您完整列表的典型问题。这是我想出的清单
(1) 先连接API线。然后运行 OSDK。然后连接模拟器电缆然后运行 DJI 助手。大疆觉得没有义务分享适当的序列狗屎。
(2) 确保您的电缆是 3.3,而不是 5
(3) Tx Rx 交换。常见问题。可以通过realterm检查
(4) 确保您的 DJI go 应用程序正在运行并且控制器已上电 b4 开始串行连接
(5) 确保app id 和enc key 正确。并且这个 id 和 key 关联的帐户也在你的平板电脑中运行。对于一些特殊的无罗盘固件,我们会遇到这个问题,如果你和 DJI 有密切的关系,他们会给你提供很多东西来测试。
(6) 确保您的序列号具有权限。在 ubuntu 中是 sudo chmod a+rw /dev/serial/by-id/usb-XXmanufactoridXX-port0。窗户忘记了。好多年没用了
(7) 确保您的 API 在 DJI 助手中启用。此外,为了快速检查、断开连接并连接到助手,请确保仍然检查 API。我们对此有不好的体验。无论我检查多少次,它都取消选中。我们花了一段时间才找到错误
(8) 确保您正在运行当前的助手 2。矩阵应为 DJI 矩阵助手。对于不同的无人机,有不同的版本。我知道它的复杂性。不知道他们为什么这样做。
(9) 确保您的 OSDK 构建完整且功能正常。没有缺少依赖或有趣的错误。新的 3.7 和 3.8 立体视觉系统经常发生这种情况
到目前为止,我能想到的几乎就是这些了。
推荐阅读
- gzip - 如何在 Kong 0.13 中为代理路由添加 gzip?
- python-3.x - Python:在 concurrent.futures.ProcessPoolExecutor() 的 executor.map 中获取多个返回值并提供多个参数
- java - HttpMessageConverter exception : RestClientException: Could not write request: no suitable HttpMessageConverter found
- c# - 派生类的 C# 验证属性
- reactjs - TypeError:无法读取未定义的“内容”属性
- amazon-web-services - 使用 DynamoDB 和 Amazon API Gateway 的验证异常
- java - 使用来自 android studio 应用程序的输入数据生成 3d 模型
- composer-php - 简单的作曲家缓存因 bitbucket 管道而失败
- javascript - 转换为画布时如何打开详细信息标签
- c - main.c 无法读取我在 .h 文件中声明并在另一个 .c 文件中定义的函数(在 C 中)