DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1

一.关于Manifold有一些东西要写在前面:

1.Manifold的核心是英伟达TK1开发板。Manifold为arm7架构,搭载Ubuntu 14.04系统,所以在使用时要注意对于一些只能运行在x86_64或者arm8v架构的处理器上的东西,都不能在Manifold上进行使用。例如Onboard-SDK-3.7里的ADVANCED SENSING的例程。在开发手册中只说该例程仅在Ubuntu 16.04下才可以运行,并未阐述关于架构的问题。因而可能会误导大家去将系统更新至16.04。网上有这样贸然更新系统导致Manifold系统崩溃的例子。
2.在涉及Manifold系统或者其它底层问题时,建议先发邮件给[email protected] 咨询相关事项。发邮件给dev是最为有效的获取帮助的途径,不过由于咨询人数过多,回复不算及时而且仅在工作日进行回复。如果在没有经验的情况下,贸然操作很有可能导致Manifold的系统崩溃(切身体会过,操作不谨慎,刷机两行泪)。
3.在向Manifold中装软件时首先一定要注意更新源的问题,如果更新的源不合适就按照其他博主的路子走就有可能导致系统崩溃,这一点千万小心。说到这里,在使用Manifold,往里面装软件时要按需,不用遵照某个博主的博客一以贯之,需要哪些就装哪些(还是要注意架构问题,所装的软件必须支持arm架构否则不能安装成功)。
4.关于Manifold的联网问题,这对于我来说是个老大难的问题。咨询客服,客服告诉我Manifold里是没有无线网卡的,要想连接网络需要找一个路由器直接拉线接入。由于学校是深澜拨号上网的方式,所以特意在网上找过很多次pppoe拨号上网的方法。但是pppoe始终不能在Manifold上成功使用,有些甚至安装包都不能打开。现在来看问题可能仍然出在arm架构的上。如果哪位大侠成功解决了这个问题,请在评论区留下您的方法。

二.DJI-OSDK开发部分的一些经历

Manifold的作用就是用来进行二次开发,所以相信各位入手也都是为了进行开发。那么进行开发绕不过的就是OSDK了,关于什么是OSDK,OSDK里都有什么,OSDK是干什么用的,这些都可以在大疆官方开发者指南
里了解。作为小白在实际开发中遇到任何问题都要首先查阅这个指南。看指南里是否有相关问题的描述及解决方案。这份指南以及OSDK可以说是进行二次开发的基石。

1.Manifold与无人机的硬件连接

此处感觉可能官方指南中的一些连接方法可能有些问题。
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第1张图片
对于这种连接方式我尝试了好多次,可能Tx Rx接反等等原因都试过了还是没能成功。因为可能涉及接反等问题,所以在此推荐采用的连接方式为用Manifold自带的连接线按照官方的Manifold安装视频的连接方式连接到UART2。在此连接方式发生转换之后需要特别注意在运行例程时要用文本编辑器在UserConfig.txt中写入port名称,此时一定要注意将port名称修改为UART2 对应的名称。该名称可在Manifold的用户手册中查询到,如下图:
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第2张图片
在port处要输入的就是:/dev/ttyTHS1
妙算与无人机的连接就是这一条数据传输线(供电建议不用无人机电池供电),剩下的连接方式按照上图连接就好。

2.DJI ASSISTANT 2的使用

该辅助模拟软件可在大疆官网下载。下载完成后首先需要通过USB连接线与无人机连接进行固件更新(这里有一个大坑)。会多次提示固件更新失败。之后再次尝试,更新进程可能会卡在中途,这时候千万不要!千万不要!千万不要!断电关机,否则无人机就会出现严重错误!开机自检测时会一直滴滴滴滴滴的响。个人感觉,可能是这款软件本身有些问题导致的。一旦出现这个问题就只能跟客服沟通解决了。如果各位看到这的时候已经出现了这个问题,那不用太急,问题不大,不用咨询dev,普通客服就可以帮你解决问题。不过时间可能稍微长一些。所以我建议一旦出现固件更新失败的问题,就跟普通客服联系,看如何解决,这样没有风险。
升级完固件之后就可以按开发指南中的软件设置部分按部就班地来操作了。这里还要在说明一些在官方指南中说的并不明白的一些顺序问题。因为这个连接是这样的:无人机连接妙算连接一个搭载有ASSISTANT 2软件的Windows电脑,然后妙算也就是Manifold还有连接一个显示器,键盘,鼠标等外设,方便进行命令操作。所以部件较多,如果操作顺序不对也可能导致仿真器中出现不了官方指南中的效果图。
正确的操作顺序为(前提是在各个部件连接没有问题,例程已经可以正常运行):将遥控器拨到F档–>打开ASSISTANT 2中的仿真模拟–>再在妙算上键入执行例程的命令–>检测连接成功之后飞行指示灯会亮,模拟器中的飞机开始运动。

3.例程控制无人机实飞需要解决的问题

首先就是在使用妙算实时控制无人机的话,是不可能有外设辅助进行命令输入的,那么就需要有既定的脚本来实现指令输入。
解决该问题分两步首先写好脚本,其次将该脚本设置为开机自启动。下面就这两步具体阐述编写开机自启动脚本的编写方法。
在sh中编写脚本的命令格式在深藏功与名博主的博客中有写很详细大家可以借鉴学习。在此我们并不需要很复杂脚本,其功能主要就是将路径转换到编制好的程序路径下,并将其启动。以例程djiosdk-flightcontrol-sample的启动为例。我在/home路径下创建了一个名为myshell的文件。用gedit或者vim对其进行编辑(在终端中cd到该文件的路径下然后输入:gedit 你文件的名字 即可对其进行编辑)具体命令如下图
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第3张图片
其中第一行为脚本文件的标志,作用也是让系统识别出它是脚本文件可以说仅此而已吧(可能不严谨)。再往下为注释,在sh中注释没有同时多行注释的命令只能像上图那样加#单行注释。再往下echo为输入文本命令,运行之后会在terminal中出现”What are you doing”的字符串。注意!此处echo应与后面要输出的字符串之间有一个空格,不然系统识别不出echo是保留字会报错,这里就很不智能。单一个cd是返回最原始的/home路径下,建议加上可能在此处并不需要,但是如果你的脚本文件并没有在/home路径下那么执行接下来的cd时会在脚本文件当前路径下继续向下寻找,多数情况下是找不到的会报错。第四行就是执行例程的命令语句。完成后将脚本文件保存退出即可。
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第4张图片
接下来就是运行脚本了。到这里我又遇到了一个问题就是cd失效的问题,网上解决办法千奇百怪我尝试了好多,在这里给大家介绍我成功实现的方法:就是不用命令: ./myshell 而改为source myshell 命令中的myshell为所写的脚本文件的name。这么做的原因在于在shell在执行脚本的时候,会创建一个子shell,并在子shell中逐条执行脚本中的指令。子shell会从父shell中继承了环境变量,但是执行后不会改变父shell的环境变量在子shell中的操作和环境变量不会影响父进程,在执行完shell后又回到了父进程。运行过程如上图,秒启动例程堪称完美。由于我的Manifold并未与M100连接所以会有如上的串口通信和无人机未识别的报错。
完成了脚本编写之后问题来到了如何将已完成的脚本文件加入开机启动项。在网上找了很多资料之后大多数为两种方法:
1.在/etc路径下有一个开机自启动的脚本rc.local,第一种方法就是将需要开机自启动的命令加入rc.local中exit 0 的上方。但是这种方法我尝试了很多次并没有成功(可能是一开始尝试的时候对在sh里写脚本的命令不熟悉,命令格式不对)。
2.新建一个脚本文件,将所需要开机自动执行的命令写进脚本文件xxxx.sh,相较第一种方法而言。这种方法需要设置脚本文件运行的优先级。
3.第三种方法是我实验成功的一种方法,实施比较简便。步骤如下:首先在如图位置搜索应用,将Startup Applications打开,进入如下界面可见此时的系统设置的要开机启动的程序,在右侧点选Add即可添加开机启动项。点开之后如下图Name为开机启动的程序名称随便设置。第二块命令行则是开机要运行的命令。可点右侧Browse来选择开机要打开的文件或者应用,还可以在command框内输入可在终端terminal内执行的命令语句。(在这里要注意编写的脚本文件是不能直接打开的,只能选择后者执行命令语句的方法。具体为啥相信也不用解释过多)例如我要执行一个脚本文件myshell。则我在此填入的命令为:gnome-terminal -x bash -c “source myshell;exec bash;”语句末的exec bash;是用来让打开的终端在运行完脚本之后不会自动关闭。需要注意的还有myshell这个脚本文件的位置。建议直接放在/home路径下省的给自己找更换路径的麻烦。Comment里可以不填写东西无伤大雅。这时候点保存关闭重新启动就可以实现脚本的开机自启动了。
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第5张图片
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第6张图片
在这里还想说一下,在搜索上面那条命令语句之前我尝试自己写。命令如下:gnome-terminal&&source myshell 但是经过反复重启尝试之后并没有成功出现我想要的脚本运行。为了找到原因所在,我开机之后在terminal输入了该命令。结果是命令格式没有错误,运行之后结果偏差在于:该命令是先运行&&号前面的命令,如果其为1或者理解为前者运行成功才会运行符号后面的命令。该命令中前者是打开一个新的terminal,后者为运行脚本文件。但是运行脚本文件的命令仍旧是在旧的terminal中运行的,所以子终端中自然没有命令执行。这是对该条命令的一点说明,大家今后在使用这条命令时要格外小心。
DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1_第7张图片
未完待续……

你可能感兴趣的:(DJI Manifold使用经验及DJI-OnboardSDK开发血泪史1)