关键词:OSDK串口通信,OSDK激活
使用DJI无人机来进行OSDK二次开发,串口是个必不可少的通信链路。在开发使用中,或多或少会遇到一些串口问题,这些问题在刚开始玩DJI 无人机和OSDK时,总会带来一些不必要的麻烦,在此记录一下,方便查阅。
一、首先,谈一下串口连接
关于串口连接,建议参考官方详细的介绍
1、官方介绍链接:设备连接
2、官方主要是以妙算2G介绍与无人机的连接,采用妙算2G的UART1接口与飞机连接,查看妙算2G的用户手册,介绍921600波特率为标称值,通信可能会有异常
使用中可以使用1M波特率。
除了manifold 2G,官方还有一个推荐机载平台manifold 2C,问题是2C只有一个uart0接口,查看妙算2用户手册,该串口用于终端调试,波特率固定为115200。
所以2C上,最好还是找一个USB-TTL线来连接妙算和无人机。
正好,本人习惯于用PC(Linux)来玩OSDK,USB-TTL连接线会更方便一点。
3、既然是入门介绍,顺便谈一下配置文件UserConfig.txt,毕竟里面有串口的配置设备。如果不正确,也会直接影响使用。
copy一下4.0.1版本OSDK中的UserConfig.txt内容:顺便记录一下,相比之前的配置文件,官方给出的东西好像少了一点 acm_port .... (但是代码依旧会检测该配置,ACM设备暂不在此讨论,有啥见解欢迎去USB通信部分讨论)
app_id : your_app_id_here
app_key : your_key_here
device : /dev/ttyUSB0
baudrate : 230400
a、app_id 和app_key 按照官网教程去官方申请即可,至于激活使用,稍后可以一起探讨一下。
b、device,貌似和串口有点关系了。
这个配置文件带的是系统识别的串口设备,Linux系统查看 ls -l | grep tty*
关于设备名,manifold 2G uart1口为ttyTHS2
使用USB-TTL Manifold 2 中的设备号为ttyUSBn,n为0、1、2.....
c、baudrate 显然是配置本段串口波特率,需要与无人机波特率设置一致(DJI Assistant2中设置)
二、跟代码,了解怎么根据SDK代码进行问题排查
运行3.9和4.0发现这部分使用上有点差异,4.0底层看起来有一些变动,但是使用起来依旧一样,毕竟协议是SDK的东西。查代码是为了方便我们二次开发中,进行排障或规避不正当使用导致一些问题。
首先关于3.9版本,串口初始化部分
void LinuxSerialDevice::init()
{
DSTATUS("Attempting to open device %s with baudrate %u...\n", m_device,
m_baudrate);
if (_serialStart(m_device, m_baudrate) < 0)
{
_serialClose();
DERROR("...Failed to start serial\n");
deviceStatus = false;
}
else
{
DSTATUS("...Serial started successfully.\n");
deviceStatus = true;
}
}
4.0应用端通过回调方式接入
static T_OsdkHalUartHandler halUartHandler = {
.UartInit = OsdkLinux_UartInit,
.UartWriteData = OsdkLinux_UartSendData,
.UartReadData = OsdkLinux_UartReadData,
.UartClose = OsdkLinux_UartClose,
};
三、问题排障
开始使用时,可能会遇到一些错误,了解了上述信息,或许我们就可以自行对运行错误进行自主排查或规避。
1、运行demo时跟串口相关的报错
[876585.377]ERRORLOG/1 @ getDroneVersion, L1676: Drone version not obtained! Please do not proceed.
Possible reasons:
Serial port connection:
* SDK is not enabled, please check DJI Assistant2 -> SDK -> [v] Enable API Control.
Baudrate is not correct, please double-check from DJI Assistant2 -> SDK -> baudrate.
* TX and RX pins are invert
[876585.377]STATUS/1 @ functionalSetUp, L282: Shake hand with drone Fail ! Cannot get drone version. (1/20)
[876585.377]STATUS/1 @ functionalSetUp, L284: Try again after 1 second ......
demo提示串口通信异常,根据上面了解信息,可以简单列个排查步骤:
a、这个是启动初始化的问题,根据上面代码接口,就可以在halUartHandler回调中进行debug。(提示信息为4.0版本,3.9版本可以在上面贴出代码也可以看到部分信息,如打开设备失败)
b、如果是open失败,就可以先查硬件连接、配置文件中设备名
设备名可以根据上面所述:ls -l | grep tty* 查看
c、如果open成功,但是依旧会有错误,也可以根据需要继续在上述代码中进行debug。原因可能是波特率的问题,也可能是TX、RX反了。也有可能是配置设备名系统中有,但并不是与飞机接入的串口。
针对上述原因,逐一排查确认即可。
2、关于波特率设置及故障
a、通过上述了解,波特率需要两端保持一致,OSDK通过配置文件完成对串口设备的波特率设置,无人机端通过DJI Assistant2 Onboard SDK界面来设置。
无人机设置波特率后,本人实际使用过程中可能出现不生效的情况,有试过通过切换使能SDK勾选貌似可以,如果实在不行就重启一下无人机。
b、我在使用过程中会遇到偶现串口通信异常的情况,既然偶现,跟硬件连接和波特率设置肯定就没什么关系了。也通过官方查找和咨询,发现使用的波特率太高了,本人使用的USB-TTL线会出现不稳定,
降低波特率去使用稳定性还可以。
所以理解了官方说明:
USB 转TTL 线(FT232BL)和双头USB 线,同时连接机载计算机和Matrice 210 V2 系列无人机,
推荐转接线,如果可以,还是按官方推荐的来吧。
四、串口功能使用
具体的串口功能可能查阅官方相关资料,当前了解到,OSDK与无人机串口是必须的通信功能,所以该问题可能不复杂,但是出现问题会直接影响使用。
最后简单记录一下一个简单功能--激活功能
激活功能是OSDK APP(app_id与app_key)在飞机上第一次使用时需要进行的动作,否则会报错:NEW_DEVICE_ERROR
所以再遇到NEW_DEVICE_ERROR, 不要着急,简单步骤激活一下
官方介绍;
用户首次使用开发者基于OSDK 开发的应用程序时,需在DJI Assistant 2 联网的状态下,登录开发者账号,使基于OSDK 开发的应用程序获取DJI 的授权许可,以此激活应用程序。
激活应用程序:使用DJI Assistant 2
激活故障排查
请对照设备连接 中的内容正确地连接无人机和第三方开发平台;请确认UART 线的电压为3.3V。
请检查运行了DJI GO 等其他移动端APP 的设备能够正常访问互联网。
请确认已在DJI Assistant 2 中开启 API Control 功能。
请对照用户中心应用程序的信息检查代码中应用程序的ID、密钥及开发者账号等信息。
请确认已正确设置了应用程序中的波特率、安装了指定的驱动并开通相关权限。
大胆猜测一下(其实都能找到说明),OSDK使用的app_id和app_key是通过官网授权使用,激活即验证该ID和KEY的合法性。校验工作需要联网访问服务器的,妙算联网没用,飞机不能直接联网。请保证DJI Assistant2一定要联网。
怎么校验,app_id和app_key是关联开发者账号申请,DJI Assistant2登录账号要与申请ID的开发者账号对应起来。
总结一下:
1、采用连接DJI Assistant2的同时运行OSDK应用程序激活,DJI Assistant2登录账号,
2、确保上述介绍配置文件中UserConfig.txt文件中app_id和app_key,为DJI Assistant2登录同账号申请的可用ID和KEY
3、运行demo或自己的应用两次。第一次需要校验,还是会报NEW_DEVICE_ERROR,再次运行一次即可。
注:
ROS配置文件需要修改(源自官方开发者网站)
编辑配置文件XXXX.launch,替换应用的ID、Key和波特率等信息。
配置OSDK 4.0.0 接口的节点:
$rosed dji_osdk_ros dji_vehicle_node.launch
配置OSDK 3.8.0 接口的节点:
$rosed dji_osdk_ros dji_sdk_node.launch
2020-08-31补充一下,使用DJI Assistant2进行激活,设置界面需要开启使能相关功能
最后抛段小代码,虽然这个功能查不查代码没什么用,但是作为玩SDK的开发者,有问题就要先查代码(比如实际使用的ID和KEY),简单记录一下,方便后续查阅
bool LinuxSetup::initVehicle()
{
...
// Activate
activateData.ID = environment->getApp_id();
char app_key[65];
activateData.encKey = app_key;
strcpy(activateData.encKey, environment->getEnc_key().c_str());
activateData.version = vehicle->getFwVersion();
ack = vehicle->activate(&activateData, functionTimeout);
if (ACK::getError(ack))
{
ACK::getErrorCodeMessage(ack, __func__);
goto err;
}
...
}
飞机第一次使用新的app_id和app_key时,就会报这个错,如果激活一次就不需要再次激活,除非换ID和key。结合代码也许容易理解多了
评论
0 条评论
请登录写评论。