【大疆无人机OnboardSDK(三)妙算ssh远程控制台系统搭建】

目标:搭建一个大疆无人机OnboardSDK通过局域网内(联不联网均可)利用XShell软件ssh登录并建立远程控制台,实现类似与地面站的功能。

准备平台与硬件:

  1. Xshell+Xmanager功能很强大,可以通过ssh远程登录到妙算,xmanager可以将Linux的程序GUI可视化在windows中。(Xmanager Enterprise 其实就是一个程序文件夹,里面就带有xshell,xftp等等程序)下载链接:https://pan.baidu.com/s/19tSBHU4b3SZ5mpsAeyv49A 提取码:6bs5 解压执行Xme5.exe安装。
  2. 妙算2一台(用于Onboard板载控制无人机)
  3. win10一台(用于远程终端控制OnboardSDK内的飞行控制demo与mission)
  4. 无线功能路由器或手机热点或二者都用:):用于给上面两个电脑提供局域网络(路由器联不联网插不插网线均可)
  5. 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信息。

上述效果图如下:

 

 

 

 

实现Xshell断开连接情况下Linux命令继续执行

1、将原命令语句改为:nohup 命令语句 &

2、回车执行,再回车,窗口中会显示一个进程号

3、如果中途想关闭,可执行:kill -9 进程号。如果想查看命令执行情况,可执行:cat nohup.out

 

 

 

 

相关参考:

Linux 驱动编译报错:error: macro "__DATE__" https://ask.csdn.net/questions/719545

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
Python珠玑妙算是一道猜数字游戏,游戏规则如下:系统随机生成一个长度为4的字符串,字符串由RGBY四个字符组成,且字符可以重复。玩家需要在10次机会内猜出系统生成的字符串,每次猜测后系统会给出两个数字,分别表示猜对了几个字符且位置正确(称为A),以及猜对了几个字符但位置不正确(称为B)。玩家需要根据系统给出的A和B来推测系统生成的字符串。 以下是一个Python珠玑妙算的实现,其中引用和引用分别提供了两种不同的实现方式: ```python # 引入必要的库 import random from typing import List # 实现珠玑妙算游戏 class Solution: def masterMind(self, solution: str, guess: str) -> List[int]: # 初始化变量 j = 0 answer = [0, 0] # 遍历solution字符串 for _ in solution: # 如果当前字符与guess字符串中对应位置的字符相同 if _ == guess[j]: # A加1 answer[0] += 1 # 将guess和solution中对应位置的字符都替换为空 guess = guess.replace(_, "", 1) solution = solution.replace(_, "", 1) else: # 否则j加1 j += 1 # 遍历guess字符串 for _ in guess: # 如果当前字符不为空 if _ != "": # 计算guess和solution中当前字符的出现次数 count1 = guess.count(_) count2 = solution.count(_) # 如果guess中当前字符出现次数大于1,将guess中所有当前字符都替换为空 if count1 > 1: guess = list(filter(lambda x: x != _, guess)) # B加上guess和solution中当前字符出现次数的最小值 answer[1] += min(count2, count1) # 返回结果 return answer # 生成随机字符串 def generate_random_string(): colors = ['R', 'G', 'B', 'Y'] return ''.join(random.choices(colors, k=4)) # 主函数 if __name__ == '__main__': # 初始化变量 solution = generate_random_string() guess = '' count = 0 # 循环10次 while count < 10: # 获取用户输入 guess = input('请输入你猜测的字符串(由RGBY四个字符组成,且字符可以重复):') # 判断用户输入是否合法 if len(guess) != 4 or not all(c in 'RGBY' for c in guess): print('输入不合法,请重新输入!') continue # 调用珠玑妙算函数 result = Solution().masterMind(solution, guess) # 输出结果 print('A:{}, B:{}'.format(result[0], result[1])) # 如果猜对了,退出循环 if result[0] == 4: print('恭喜你猜对了!') break # 否则次数加1 count += 1 # 如果次数用完了,输出答案 if count == 10: print('很遗憾,你没有在规定次数内猜对,答案是:{}'.format(solution)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值