目标:搭建一个大疆无人机OnboardSDK通过局域网内(联不联网均可)利用XShell软件ssh登录并建立远程控制台,实现类似与地面站的功能。
准备平台与硬件:
- Xshell+Xmanager功能很强大,可以通过ssh远程登录到妙算,xmanager可以将Linux的程序GUI可视化在windows中。(Xmanager Enterprise 其实就是一个程序文件夹,里面就带有xshell,xftp等等程序)下载链接:https://pan.baidu.com/s/19tSBHU4b3SZ5mpsAeyv49A 提取码:6bs5 解压执行Xme5.exe安装。
- 妙算2一台(用于Onboard板载控制无人机)
- win10一台(用于远程终端控制OnboardSDK内的飞行控制demo与mission)
- 无线功能路由器或手机热点或二者都用:):用于给上面两个电脑提供局域网络(路由器联不联网插不插网线均可)
- USB无线网卡:Tenda 的U12产品:https://www.tenda.com.cn/faq/8220.html
【关于无线网卡,是因为妙算2-c没有无线网卡模块,我在JD上找了好些无线网卡,TP-link问客服直接说不支持linux。而且我问客服它的芯片组型号是多少自己去找对应的驱动,结果客服说不知道(ps:不想吐槽了).......所以我就直接去Tenda买了U12,而且在Tenda官网人家都给出了各种产品系列的linux驱动:)注意:linux内核版本要在2-4之间才能安装。因此在JD自行购买一个USB无线网卡给其提供局域网络。】
一、ubuntu16.04的USB无线网卡驱动编译安装:
工欲善其事必先利其器,为了能够给妙算2-C找一个linux下能用的Usb无线网卡和驱动也是费了一些时间,最后选择了U12,因为Tenda官网给出了其linux版本的一些产品的驱动,去官网下载U12其产品驱动,官网显示支持2.6.18~4.4内核(高版本里面内核编译会缺失一些头文件,Linux内核更新后一些硬件方面头文件做了相应删除简化)。产品包装里面附赠光盘里面有Linux,Mac,Windows版本驱动,自行选择安装即可。(Ps:如果不嫌麻烦可以自己去github找可用驱动)
下面是最终成功编译ubuntu16.04的USB无线网卡驱动(Tenda的U12产品)
下面是编译中遇到的部分问题:
更换妙算2内核:
妙算2自带内核版本为4.13.0-36-generic,高于4.4.0,因此直接编译USB无线网卡驱动会报错提示缺少一些linux内核的一些函数头文件,可能是高版本的内核对一些函数头文件内容等进行了删除和修改,因此,我把妙算2内核降级为4.4.0-53-generic。
需要知道的是,内核映像文件主要包括以下类型:
linux-image-版本号:内核映像文件
linux-headers-版本号:内核头文件
linux-image-extra-版本号:内核扩展文件
1.查看现有内核版本:
uname -r
2.妙算插上网线后,打开终端执行:
sudo apt-get install linux-image-4.4.0.53-generic
3.查看内核是否安装成功:
dpkg -l | grep 4.4.0.53-generic
4.用编辑器打开 grub启动项引导配置文件:
sudo vim /etc/default/grub
找到第一行:
GRUB_DEFAULT=0
修改为:
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-53-generic"
5.保存退出,然后执行以下命令更新 Grub 引导
sudo update-grub
6.更新完成后重启系统
sudo reboot
7. 不出意外的话重启系统后启用的就是新的内核了,执行以下命令查看一下
uname -r
- (可选)将其他版本的内核删除,如(对deinstall的需要用dpkg卸载):
a)$ sudo apt-get remove linux-image-x.x.x-xx
b)$ sudo dpkg -P linux-image-x.x.x-xx-generic
以为换了内核之后就完事了,结果还遇到了下面问题:
①make: *** /lib/modules/4.4.0-53-generic/build: 没有那个文件或目录。 停止
遇到这个错误,主要是没安装内核开发包(类似于kernel-devel的名字),结果我就按照:sudo apt-get install kernel-devel
结果发现根本找不到该开发包:E: Unable to locate package kernel-devel
于是我就查看原装内核(妙算2原装内核版本为4.13.0-generic)的/usr/src下面目录:
发现名字不是kernel-devel,而是headers:
于是安装linux-headers-4.4.0-53-generic :
sudo apt-get install linux-headers-4.4.0-53-generic
下面是安装完成headers后的截图:
安装完内核头文件下面又报第②个错了...
②Linux 驱动编译报错:error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
编译驱动时遇到这个错误提示,表示当前编译环境中将关于 DATE 以及 TIME 的警告也作为错误来进行处理的。
解决方法:
1. 在编译驱动的相应 Makefile 中增加一行:EXTRA_FLAGS += -Wno-error=date-time,然后保存重新 make;
2. 若 EXTRA_FLAGS不生效,将关键字替换为CFLAGS;有的是前者,有的是后者;
3. 修改 /lib/modules/'uname -r'/build/Makefile 文件(其中uname -r表示内核版本号,若没有这个文件的话,我这里因为安装的是headers文件,所以是修改/usr/src/linux-headers-4.4.0-53-generic/Makefile),找到包含 “-Werror=date-time” 这一行注释掉,然后保存退出。之后重新 make 即可;
然后终于编译成功。插上Usb无线网卡指示灯亮起。
二、大疆A3平台远程终端OnboardSDK飞行模拟试验:
1.搭建局域网远程终端:
创建局域网并确认ubuntu中ssh服务开启:
确定windows和ubuntu可以互相ping通。
我这里用的是路由器(路由器不联网),插电之后设置静态IP,网关,子网掩码,设置wifi密码之后。windows和ubuntu都连接其wifi。
windows打开cmd:ipconfig查看Ip地址与子网掩码。
ubuntu打开终端:ifconfig(不一样哦,差了个字母),查看Ip地址与子网掩码。
确定二者位于同一IP段之后,互相Ping一下,能Ping通即可,若ping不通,关闭windows和ubuntu防火墙。
ubuntu关闭防火墙并打开22端口(下面xshell通过ssh登录从22端口进去):
- 开启/关闭防火墙 (默认设置是’disable’)
- sudo ufw enable|disable
- 查看防火墙状态:
- sudo ufw status
- 打开或关闭某个端口,例如:
- sudo ufw allow smtp 允许所有的外部IP访问本机的25/tcp (smtp)端口
- sudo ufw allow 22/tcp 允许所有的外部IP访问本机的22/tcp (ssh)端口
2.ubuntu开启ssh服务:
①.查看ssh文件是否存在:
ps -aux |grep "ssh"
②.开启ssh服务
service ssh start
若报错,Unit ssh.service not found,说明ssh服务未安装。
③.安装ssh服务
sudo apt-get install openssh-server
④.查看ssh服务是否开启:
sudo ps -e | grep ssh
若找不到命令则执行第5步。
⑤.开启ssh服务:
sudo /etc/init.d/ssh start
出现 00:00:00 sshd
表示成功开启ssh服务。
⑥.查看ssh服务状态:
sudo service ssh status
之后的操作均在windows10一台电脑中完成:
3.下载完Xmanager Enterprise 5后打开文件:
可以都打开看一下,打开xbrowser浏览一下程序集内容,打开xmanager-passive用于显示远程gui,打开xshell用于ssh远程登录ubuntu(妙算2)。
4.打开Xshell创建ssh远程登录:
- 要填的只有两个:主机IP和用户名及密码。端口号默认22。
其实通过上面互相Ping 可以发现连接同一wifi的局域网,若路由器不连网情况下自动给二者win10和ubuntu分配的IP地址就最后一位不一样。win10的ip为192.168.0.101,ubuntu的为192.168.0.100。子网掩码都是255.255.255.0(自己前面设的)网关应该都是192.168.0.1。
(若ping不通可以参考我前面一个博客,说不定可以收到启发。)
若连接失败,检查ubuntu端口22是否是开启状态,防护墙是否是关闭状态。
5.远程终端操作验证
切换~/Pictures文件夹下:cd ~/Pictures
查看内容:ls
ubuntu自带查看图片工具eye of gnome:eog kinobiao2.jpeg
于是查看了我放在下面的奇诺比奥的图片:打开xmanager-passive用于显示远程gui,即可看到下面效果:
而且右键直接可以在win10下打开ubuntu中的firefox浏览器来查看该照片。
文件共享:xshell通过ssh登录后,支持xftp下从ubuntu复制文件到windows,反之也可以。不用再下载网上所谓的其他任何程序!
直接在上面终端窗口按下:CTRL+ALT+F
发现会打开一个xftp,直接可以任意两者之间文件拖拽复制移动(xshell真实方便啊。。。)
至此,Windows和ubuntu远程建立完成,下面开始验证dji_onboardSDK中的demo。
6.OnboardSDK_ROS版本验证
普通版本就不验证了,就和平时终端执行一样,一个终端窗口即可完成。
问题就在于ROS版本,我们知道要启动一个ros程序结点,首先要打开一个终端执行roscore核心程序,才能完成ros后面工作。
即ros需要在远程终端中打开多个终端窗口。实现下面效果:
我们知道在ubuntu中ROS执行时需要打开多个终端,需要我们CTRL+Shift+T在当前窗口打开一个终端,或者CTRL+ALT+T打开新终端窗口。
所以类似的在xshell中快捷键:CTRL+Shift+T
可以发现下面这个加号会出现:然后点击加号对同一个ubuntu的ip进行连接即可。自行选择点几个加号就建立几个终端。只不过是我们之前的终端都是显示在了ubuntu中,而建立了局域网后远程登录后将其显示在了我们windows电脑的xshell中。
或者直接下面这个红色圈起来的直接打开已连过的IP:
后面就没什么可以注意的了,依次执行:
source devel/setup.bash
roslaunch dji_sdk sdk.launch
新终端中执行:
source devel/setup.bash
rosrun dji_sdk_demo demo_flightcontrol
更方便地是可以ros中的所有gui,xmanager都能显示在win10窗口。
例如:
rosrun rqt_plot rqt_plot看一下无人机gps信息。
上述效果图如下:
1、将原命令语句改为:nohup 命令语句 &
2、回车执行,再回车,窗口中会显示一个进程号
3、如果中途想关闭,可执行:kill -9 进程号。如果想查看命令执行情况,可执行:cat nohup.out
相关参考:
Linux 驱动编译报错:error: macro "__DATE__" https://ask.csdn.net/questions/719545