在前面的教程中,我们讲解了用pixhawk飞控组装的无人机飞行器S500机型。飞行器的组装调试过程大同小异,主要目的是要学会飞控和地面站的使用。在无人机的飞行操作熟悉后,我们接下来讲解一些pixhawk飞控扩展的使用,为后期开发更多功能做准备工作。 初次接触pixhawk无人机的朋友可以看看以前的S500组装教程。
第一个教程主要讲树莓派与pixhawk连接
树莓派是一款基于ARM的微型电脑主板,以SD/MicroSD卡为内存硬盘。是一款入门级的机载电脑。树莓派可以与pixhawk飞控进行通讯,扩展外部Dronekit-python控制、SITL仿真、视觉识别、ROS、SLAM等诸多应用。对入门开发来说比较适合。
一、硬件准备:
1.pixhawk无人机一台(前面已经组装调试好的,并且测试能正常飞行),F450或则S500均可。本文是以F450为例。 2.自备树莓派2B、3B或则3B+主板一个;树莓派最好使用3B+,自带WIFI模块。因为外部控制无人机,操作电脑(笔记本)与树莓派要在同一个网段(连接到同一个路由器)。如果使用的是2B,它自身没有WIFI模块,需要接一根网线进行调试。但是可以用外置WIFI模块解决这个问题。树莓派2B价格便宜,3B+目前普遍缺货。 3.碳纤维扩展板一块及配件螺丝:
4.自制树莓派电源线一根:树莓派需要5V稳压电源供电,可以自己制作一根类似的电源线。
5.自制树莓派与PIX连接线一根:树莓派与PIX通讯需要用到TTL转USB模块。
二、安装过程:
1.将GPS支架安装位置调整到如图所示那样,留出扩展板安装位置(注:一定记得重新粘贴GPS模块,保证GPS箭头前向与飞控箭头前向一致!!!)。然后将长条铜柱分别固定在飞控的左右两端:
2.将连接线接到PIX飞控的telem2口(不能接到telem1)。以前有接乐迪回传模块的,将回传模块接到telem1口。如下所示:
3.将碳纤维扩展板安装上4个小铜柱,注意安装孔位置,如图所示。然后再把扩展板固定在之前的铜柱上:
4.然后再固定树莓派。树莓派安装孔比螺丝稍小一些,可以先把树莓派的安装孔扩一下。注意不要损坏电路。
5.连接树莓派电源线,接底板预留的JST口,如下所示:
6.将TTL转USB口接到树莓派任意一个USB口都可以,绑扎整理好如下所示:
三、修改飞控接口参数:
将飞控连接missionplanner地面站,配置调试==>全部参数树,在查找中输入serial,找到如下参数: 1. SERIAL2_BAUD 设置成 921 2. SERIAL2_PROTOCOL 设置成 1
设置好以后记得点写入参数 才能保存!
做完以上3步,树莓派的安装就完成了。树莓派是一个机载电脑,需要安装系统,才能进行工作。 第二个教程介绍如何给树莓派刷ubuntu-mate系统以及一些基本配置。
一、硬件准备:
1.8G或则16G高速SD卡一张,读卡器一个;
2.HDMI接口显示器一台; 3.有线鼠标、键盘各一个。
二、软件准备:
三、系统安装:
启动 Balena Etcher,选择镜像文件和 SD 卡 耐心等待一段时间,进度完成 SD 卡就准备好了。 将SD卡插入树莓派卡槽。树莓派连接好网线,电源线。第一次使用请将外设鼠标,键盘,HDMI显示器连接树莓派,方便安装系统。 树莓派接通电源,显示器上会显示Ubuntu安装界面,设置好语言(简体中文),时区(shanghai),计算机名称,用户名,密码,系统就会自动安装。注意:计算机名称,用户名,密码尽量简单好记。因为以后要反复使用。
安装好如下所示:
四、系统设置:
第一步:更新系统
再依次输入以下命令,更新系统: sudo apt-get update sudo apt-get upgrade
第二条命令需要花较长时间进行更新,请保证树莓派网络正常。
3.注意命令回车后会要求输入密码,即系统安装时设置的密码。ubuntu系统下输入密码是不可见的,只管正确输入后回车即可。
第二步:安装vim编辑器
更新完以后,安装vim编辑器,方便以后修改文件及代码内容。系统自带的vi编辑器太难用。。。 sudo apt-get install vim 关于 vim编辑器初步的使用,后面有介绍。
第三步:安装xrdp远程桌面
安装xrdp远程桌面后,我们就可以通过windows电脑的远程桌面连接到树莓派进行操作,不需要树莓派单独连接显示器和键盘鼠标了。对前期不熟悉情况下调试操作很有用。你肯定不希望随时带个键盘鼠标显示器对树莓派进行调试吧。 输入以下命令:
sudo apt-get install xrdp
第四步:开启ssh远程服务
开启ssh远程服务后,可以通过笔记本ubuntu系统命令行远程连接到树莓派,是以后调试操作的主要方式。
1.查看是否开启了ssh服务是否安装,使用命令: sudo ps -e | grep ssh 如果返回的结果是“xxxx? 00:00:00 sshd”,代表服务开启。那个四个x代表四位数字,每台机数字不一样的,如图: 2.如果没有反应或者其他结果,再试着开启ssh服务。使用命令: sudo /etc/init.d/ssh start 来开启服务,如图: 如果是图中结果,说明没有安装ssh服务,此时需要安装ssh服务,输入以下命令: sudo apt-get install openssh-server 如图: 等待安装结束即可。然后再次查看服务有没有启动: sudo ps -e | grep ssh 有sshd,说明服务启动了。如果需要再次确认或者没有图中的结果,使用命令来启动: sudo /etc/init.d/ssh start 看到服务starting了,服务成功开启。
3.添加开机自启ssh服务
输入以下命令,在下次树莓派启动后自动开启ssh,以便进行远程连接:
sudo systemctl enable ssh
第五步:通过ssh远程连接树莓派
注:请提前在笔记本上安装好ubuntu16.04系统。
1.分别查看笔记本和树莓派的名称及IP地址:
方法一:分别在笔记本的终端和树莓派终端输入以下命令:
ifconfig 如下所示:
笔记本端:我的笔记本IP为:192.168.1.6
树莓派端:我的树莓派IP为192.168.1.8
方法二:在同网络中的windows电脑上,打开浏览器,地址栏输入192.168.1.1(具体路由器厂家不同,地址不一样)进入路由器设置页面,可以看到对应的网络下设备IP地址分配情况。
2.修改笔记本端hosts文件
笔记本端:终端输入以下命令
sudo vim /etc/hosts
然后会进入hosts文件编辑模式,将树莓派的IP及名称加进去。如下所示:
这里会涉及到一些vim编辑器的使用,ubuntu系统下vim的使用比较广泛,涉及内容也比较多。这里不做过多介绍,大家可自行百度学习。简单的编辑要用到以下这些:
1.编辑前要先按字母 i 键,才能进入编辑状态输入内容; 2.编辑好以后,要先按ESC键退出编辑状态; 3.保存退出输入冒号 :wq 4.不保存退出输入冒号 :q 5.强制退出输入冒号 :!q 如果提示找不到vim,是因为没有安装vim编辑器,可能是前面第二步没有做。需要先输入以下命令安装vim: sudo apt-get install vim 安装好vim以后,再修改hosts文件。
3.笔记本ubuntu终端远程连接树莓派:
做完以上准备就可以在笔记本端用 ssh命令连接到树莓派
在笔记本的终端中输入以下命令 ssh lj@ras (你的用户名@计算机名) 或则
连接上以后,终端窗口的命令行会有变化,如下:
以后调试,就不用给树莓派连接鼠标键盘和显示器了,只需要保证树莓派和笔记本在同一路由网络下,用笔记本ssh连接树莓派操作即可。
另外还需要经常用到树莓派的关机命令: sudo halt
做完以上几步,笔记本就能正常ssh远程连接到树莓派。 第三个教程介绍dronekit的安装,有了dronekit,树莓派就能与pixhawk飞控进行通讯。这样我们就能通过dronekit-python编写代码控制飞控了。
先了解一下Dronekit是什么?
[color=var(--weui-LINK)]Dronekit也叫DroneKit-Python,是一个用于控制无人机的Python库。允许开发人员创建在机载电脑上运行的应用程序,并使用低延迟链接与ArduPilot飞控通信。可以显着增强自动驾驶性能,为飞行器增加更多智能,以及执行计算密集或时间敏感的任务(例如,计算机视觉,路径规划或3D建模)。除了DroneKit-Python以外,还有[color=var(--weui-LINK)]DroneKit-Android以及[color=var(--weui-LINK)]DroneKit-Cloud的API供不同的开发者使用。API通过MAVLink与飞控通信。它提供对连接飞控的遥测,状态和参数信息的编程访问,并实现任务管理和对飞行器运动和操作的直接控制。 相比之下,Dronekit比搭建ros来控制无人机更容易上手一些。 对于Dronekit,PX4(原生固件)被支持的较少,目前不可以进行模式切换。而对Ardupilot(APM固件)支持的比较多,可调用的函数也比较多。
一、安装Dronekit
笔记本端通过ssh命令连接树莓派;
输入cd切换到根目录;
首先安装pip和python-dev: sudo apt-get install python-pip python-dev 输入以下命令安装DroneKit: sudo pip install dronekit
官方文档上,就是以上两个简单命令就能安装。但实际安装时,会出现以下错误: Running setup.py install for lxml ... error Compile failed: command 'arm-linux-gnueabihf-gcc' failed with exit status 1 错误内容是ARM交叉编译工具无法安装。
如果你也遇到相同的警报,执行下面的命令: sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev python-py
顺利的话,Dronrkit就能安装成功了,如下所示: 二、编写测试代码
安装好Dronekit,接下来我们需要测试树莓派与飞控是否能正常通讯获取浮空数据。 首先在树莓派根目录下新建一个名为test的文件夹用于存放测试代码文件。和使用windows系统存放文件一样,不过这是用命令操作,新手可能不太习惯,命令:mkdir ,输入以下命令:
mkdir -p ~/test 可以输入 ls 命令,查看是否新建好这个文件夹,如下所示: 通过cd命令切换到test文件夹下,创建名为connect.py的文件,测试树莓派能否连接飞控: cd test touch connect.py
可以输入 ls 命令,查看是否新建好这个文件,如下所示: 用 vim编辑文件: sudo vim connect.py 将以下代码复制到文件中:
from dronekit import connect # Connect to the Vehicle (in this case a UDP endpoint) vehicle = connect('/dev/ttyUSB0', wait_ready=True, baud=921600) # vehicle is an instance of the Vehicle class print "Autopilot Firmware version: %s" % vehicle.version print "Autopilot capabilities (supports ftp): %s" % vehicle.capabilities.ftp print "Global Location: %s" % vehicle.location.global_frame print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame print "Local Location: %s" % vehicle.location.local_frame #NED print "Attitude: %s" % vehicle.attitude print "Velocity: %s" % vehicle.velocity print "GPS: %s" % vehicle.gps_0 print "Groundspeed: %s" % vehicle.groundspeed print "Airspeed: %s" % vehicle.airspeed print "Gimbal status: %s" % vehicle.gimbal print "Battery: %s" % vehicle.battery print "EKF OK?: %s" % vehicle.ekf_ok print "Last Heartbeat: %s" % vehicle.last_heartbeat print "Rangefinder: %s" % vehicle.rangefinder print "Rangefinder distance: %s" % vehicle.rangefinder.distance print "Rangefinder voltage: %s" % vehicle.rangefinder.voltage print "Heading: %s" % vehicle.heading print "Is Armable?: %s" % vehicle.is_armable print "System status: %s" % vehicle.system_status.state print "Mode: %s" % vehicle.mode.name # settable print "Armed: %s" % vehicle.armed # settable
以上代码涵盖了大部分的无人机状态,通过执行以上代码就能读取当前飞控状态参数。
注意:不要急着执行以上脚本。可能提示权限不够出错。需要赋予USB0端口权限,以下逐步介绍。
三、赋予端口权限
确认树莓派与飞控已经通过数据线连接好,输入以下命令查看端口:
ls /dev/ttyUSB*
如果显示:/dev/ttyUSB0说明树莓派已经有USB0端口连接
然后输入以下命令,赋予端口权限sudo chmod 666 /dev/ttyUSB0(注意:此命令是暂时的,每次系统,重启以后,又得重新运行这个命令,下面介绍一下永久改写USB口读写权限的方法。)
永久改写USB口读写权限的方法 1.运行命令,如下图所示:ls usb -vvv
记录"idVendor"和"idProduct"后面的两个编码。 2.创建新的udev规则:sudo vim /etc/udev/rules.d/myusb0.rules 3.在文件中输入以下代码:SUBSYSTEMS=="usb",ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523",GROUP="users", MODE="0666" 其中idVendor和idProduct改成上图中得到的编码。 4.重新加载udev规则,运行以下命令:sudo udevadm control --reload
四、测试连接
输入以下命令:
cd test
python connect.py
(注意:执行python语句脚本,请将路径切换到脚本所在文件夹以下,否则会报错。)
成功运行后,会显示如下信息:
说明树莓派通过Dronekit读取到了目前飞控的数据:系统警报、固件版本、姿态数据、电池电量、解锁状态、当前飞行模式等等。这样就成功运行了第一个DroneKit-Python脚本。
连接到多个飞控
通过多次使用connect函数连接到不同的地址,即可在同一个代码文件内连接到多个飞控。 每次调用connect,都会返回一个Vehicle类的对象。通过控制这些对象,即可在同一份代码中控制多架无人机。 DroneKit-Python API参考
注意:新手进行ubuntu系统下操作命令,因系统及使用习惯的不同,或多或少都会遇到一些问题,不同的安装方式,遇到的问题不尽相同。大家在遇到错误提示后,可根据错误提示百度或则谷歌一下相关信息,或则到相关网站及论坛,基本都会找到处理问题的方法。
总结:通过以上操作,我们成功安装了Dronekit,并编写了代码测试了树莓派与飞控能够正常通讯。
第四个教程:使用Dronekit编写一个控制程序。
有同学留言不太清楚每行脚本的意思,这节有必要先做个注释补充解释一下:
# 飞控软件版本
print "Autopilot Firmware version: %s" % vehicle.version
# 全球定位信息(经纬度,高度相对于平均海平面) print "Global Location: %s" % vehicle.location.global_frame
# 全球定位信息(经纬度,高度相对于home点) print "Global Location (relative altitude): %s" % vehicle.location.global_relative_frame
# 相对home点的位置信息(向北、向东、向下);解锁之前返回None print "Local Location: %s" % vehicle.location.local_frame
# 无人机朝向(欧拉角:roll,pitch,yaw,单位为rad,范围-π到+π) print "Attitude: %s" % vehicle.attitude
# 三维速度(m/s) print "Velocity: %s" % vehicle.velocity
# GPS信息 print "GPS: %s" % vehicle.gps_0
# 地速(m/s) print "Groundspeed: %s" % vehicle.groundspeed
# 空速(m/s) print "Airspeed: %s" % vehicle.airspeed
# 云台信息(得到的为当前目标的roll, pitch, yaw,而非测量值。单位为度) print "Gimbal status: %s" % vehicle.gimbal
# 电池信息 print "Battery: %s" % vehicle.battery
# EKF(拓展卡曼滤波器)状态 print "EKF OK?: %s" % vehicle.ekf_ok
# 超声波或激光雷达传感器状态 print "Rangefinder: %s" % vehicle.rangefinder
# 无人机朝向(度) print "Heading: %s" % vehicle.heading
# 是否可以解锁 print "Is Armable?: %s" % vehicle.is_armable
# 系统状态 print "System status: %s" % vehicle.system_status.state
# 当前飞行模式 print "Mode: %s" % vehicle.mode.name
# 解锁状态 print "Armed: %s" % vehicle.armed
设置属性
少数的属性变量可以被设置,通过设置这些属性变量,可以控制无人机的运行状态。可设置的属性变量如下: Vehicle.home_location Vehicle.gimbal Vehicle.airspeed Vehicle.groundspeed Vehicle.mode Vehicle.armed vehicle.disarmed
设置示例: 1.锁定无人机: vehicle.disarmed = False
2.切换到GUIDED模式: vehicle.mode = VehicleMode("GUIDED")
3.设置航点模式下,无人机飞行的地速为3.2m/s(注意:读、写groundspeed的意义不同) vehicle.groundspeed = 3.2
读取参数
参数以字典(dictionary)的形式,存储在vehicle.parameters变量中。具体参数的名称即为相应的键值(key)。
例如,在屏幕上显示THR_MIN参数(THR_MIN代表油门处于最低时的电机怠速,以PWM值表示): print "Param: %s" % vehicle.parameters['THR_MIN']
显示全部参数: print "\nPrint all parameters (iterate `vehicle.parameters`):"
for key, value in vehicle.parameters.iteritems(): print " Key:%s Value:%s" % (key,value)
设置参数
使用读取参数类似的方法,即可设置参数: vehicle.parameters['THR_MIN']=100
以上只是截取了部分使用较多的知识点进行介绍,大家可以到官网查看详细的[color=var(--weui-LINK)]Dronekit教程。
下面我们根据官方示例编写一个程序,展示如何连接到无人机,控制无人机解锁后升空到10m,依次朝两个方向飞行30s,最后返回出发点并降落。
cd testtouch example1.py
可以输入 ls 命令,查看是否新建好这个文件,如下所示: 2.用 vim编辑文件:sudo vim example1.py
将以下代码复制到文件中,中文注释也可一并复制: #!/usr/bin/envpython # -*- coding: utf-8-*- """© Copyright2015-2016, 3D Robotics.simple_goto.py:GUIDED mode "simple goto" example (Copter Only)Demonstrates how toarm and takeoff in Copter and how to navigate to points usingVehicle.simple_goto.""" from __future__import print_function import time from dronekitimport connect, VehicleMode, LocationGlobalRelative # 改为当前连接的pixhawk飞控的端口 connection_string ='/dev/ttyUSB0' print('Connectingto vehicle on: %s' % connection_string) # connect函数将会返回一个Vehicle类型的对象,即此处的vehicle # 即可认为是无人机的主体,通过vehicle对象,我们可以直接控制无人机 vehicle =connect(connection_string, wait_ready=True,baud=921600) # 定义arm_and_takeoff函数,使无人机解锁并起飞到目标高度 # 参数aTargetAltitude即为目标高度,单位为米 defarm_and_takeoff(aTargetAltitude): # 进行起飞前检查 print("Basic pre-armchecks") # vehicle.is_armable会检查飞控是否启动完成、有无GPS fix、卡曼滤波器 # 是否初始化完毕。若以上检查通过,则会返回True while not vehicle.is_armable: print(" Waiting for vehicle toinitialise...") time.sleep(1) # 解锁无人机(电机将开始旋转) print("Arming motors") # 将无人机的飞行模式切换成"GUIDED"(一般建议在GUIDED模式下控制无人机) vehicle.mode =VehicleMode("GUIDED") # 通过设置vehicle.armed状态变量为True,解锁无人机 vehicle.armed = True # 在无人机起飞之前,确认电机已经解锁 while not vehicle.armed: print(" Waiting forarming...") time.sleep(1) # 发送起飞指令 print("Taking off!") # simple_takeoff将发送指令,使无人机起飞并上升到目标高度 vehicle.simple_takeoff(aTargetAltitude) # 在无人机上升到目标高度之前,阻塞程序 while True: print(" Altitude: ",vehicle.location.global_relative_frame.alt) # 当高度上升到目标高度的0.95倍时,即认为达到了目标高度,退出循环 #vehicle.location.global_relative_frame.alt为相对于home点的高度 if vehicle.location.global_relative_frame.alt>= aTargetAltitude * 0.95: print("Reached targetaltitude") break # 等待1s time.sleep(1) # 调用上面声明的arm_and_takeoff函数,目标高度10m arm_and_takeoff(10) # 设置在运动时,默认的空速为3m/s print("Setdefault/target airspeed to 3") # vehicle.airspeed变量可读可写,且读、写时的含义不同。 # 读取时,为无人机的当前空速;写入时,设定无人机在执行航点任务时的默认速度 vehicle.airspeed =3 # 发送指令,让无人机前往第一个航点 print("Goingtowards first point for 30 seconds ...") #LocationGlobalRelative是一个类,它由经纬度(WGS84)和相对于home点的高度组成 # 这条语句将创建一个位于南纬35.361354,东经149.165218,相对home点高20m的位置 .注意:如要实际测试,此处的经纬度需要改成你当前测试位置的经纬度,不然飞机飞跑了!!!point1 =LocationGlobalRelative(-35.361354, 149.165218, 20) # simple_goto函数将位置发送给无人机,生成一个目标航点 vehicle.simple_goto(point1) # simple_goto函数只发送指令,不判断有没有到达目标航点 # 它可以被其他后续指令打断,此处延时30s,即让无人机朝向point1飞行30s time.sleep(30) # 发送指令,让无人机前往第二个航点 print("Goingtowards second point for 30 seconds (groundspeed set to 10 m/s) ...") # 与之前类似,这条语句创建了另一个相对home高20m的点。 注意:同理,如要实际测试,此处的经纬度也需要改成你当前测试位置的经纬度!!!point2 =LocationGlobalRelative(-35.363244, 149.168801, 20) # simple_goto将目标航点发送给无人机,groundspeed=10设置飞行时的地速为10m/s vehicle.simple_goto(point2,groundspeed=10) # 与之前一样,延时30s time.sleep(30) # 发送"返航"指令 print("Returningto Launch") # 返航,只需将无人机的飞行模式切换成"RTL(Return to Launch)" # 无人机会自动返回home点的正上方,之后自动降落 vehicle.mode =VehicleMode("RTL") # 退出之前,清除vehicle对象 print("Closevehicle object") vehicle.close()
以上代码编辑保存好以后,执行 python example1.py很大程度上是无法正常运行的,主要有以下几个原因:2.注意:如果要在室外测试,请务必修改航点1和航点2的经纬度数据,示例里面的经纬度在堪培拉,否则飞机一去不复返。。。
做到这里肯定有同学会问:既然在室内又不能测试,那怎么知道执行效果如何?无人机执行动作是否和设计的初衷一致?怎样安全的验证代码的正确性?要解决这些实际问题,就需要用到SITL在环仿真。
第五个教程就是讲SITL仿真模拟飞行:开发环境搭建
前面安装好了[color=var(--weui-LINK)]Dronrkit-Pyhton,并且测试飞控连接成功后,肯定会迫不及待的想通过编写python程序控制pixhawk飞行。但是,心急吃不了热豆腐!如果直接真机试飞,多数情况下都会以失败炸机告终!因为你没有验证自己代码的合理和正确性,怎么办呢?这里就涉及到我们接下来几节教程介绍的仿真问题。
仿真的目的就是在电脑上模拟出一个环境,验证编辑或则修改后的代码确实有我们所期望的那样。 网上的多数教程,都是直接安装Dronekit-SITL开始进行仿真,这是因为很多作者都是在笔记本上验证,没有在真正的树莓派上实施。然而事实确是:DroneKit-SITL目前仅为Mac,Linux和Windows提供x86二进制文件。不能在树莓派这样的ARM平台上运行它。那树莓派上的代码如何在SITL运行呢?别急,下面逐步介绍一种测试树莓派里面的代码仿真的方法:因为树莓派不能安装SITL仿真软件,我们还是需要在自己的笔记本 Ubuntu系统上安装SITL,然后在树莓派上执行Dronekit示例,在笔记本SITL上看到运行模拟器效果。仿真结束,修改连接地址,树莓派即可控制飞控进行飞行。
要进行SITL仿真飞行,需要分以下几步进行:
第一步:搭建Ardupilot开发环境; 第二步:ArduPilot 软件在环仿真SITL(SITL+MAVProxy);第三步:ArduPilot 软件在环仿真SITL(SITL+Mission Planner或则SITL+QGC); 第四步:ArduPilot 软件在环仿真SITL(SITL+Gazebo三维仿真)
其中第一步和第二步是必须做的,后面两步有兴趣可以研究研究。
这节教程做第一步:搭建Ardupilot开发环境
我们使用的系统是Ubuntu16.04,搭建过程如下,其他Ubuntu系统没有一一测试,想必都是一样的。
首先更新系统,安装git: sudo apt-get update
sudo apt-get install git
sudo apt-get install gitk git-gui
然后输入以下命令: git clone https://github.com/ArduPilot/ardupilotcd ardupilotgit submodule update --init --recursive
之后,大部分网上教程都是运行对应的sh执行脚本开始安装所需的各种依赖包。 Tools/scripts/install-prereqs-ubuntu.sh-y
如果按照网上教程,多半会遇到以下问题:
当然,如果有用付费VPN,或则有能力翻Qiang的朋友,不受网速限制,以上问题基本可以忽略。
上述问题都注意到的话,整体安装过程应该是比较顺利的。之后就需要配置路径: Tools/environment_install/install-prereqs-ubuntu.sh-y. ~/.profile
到此Ardupilot的开发环境就已经安装好,使用中还要注意以下问题:
例子,编译支持pixhawk1飞控板的多旋翼飞控的流程: cd ardupilot ./waf configure--board Pixhawk1 ./waf copter 当然直接使用./waf --targets bin/arducopter --upload就可以完成编译和下载。 ./waf --targets bin/arducopter --upload
关于ubuntu系统搭建开发环境,可以查看[color=var(--weui-LINK)]官网链接。还可参考我们公众号上另外一篇文章 在Linux/Ubuntu系统下设置Ardupilot构建环境
第六个教程就是Ardupilot在环仿真:启动SITL+MAVProxy
一、启动仿真环境
开发环境安装好,启动仿真就比较简单了
1.首先要进入需要仿真的多旋翼无人机的目录下: cd ardupilot/ArduCopter
2.如果是第一次运行仿真,需要运行以下命令进行初始化: sim_vehicle.py -w
或则是模拟器参数被改的乱七八糟的时候,也可用这个命令恢复初始参数。
启动完毕,使用 Ctrl+C 终止正在运行的sim_vehicle.py -w
3.接下来就可以启动模拟器了: sim_vehicle.py --console --map
正常启动后,就会看到三个窗口:Terminal, Console, Map,这样最基本的软件在环仿真程序就运行起来了。
注意:如果没有看到窗口,可能是由于MAVProxy,pymavlink,future,lxml这几个python包没有安装好,运行下面的命令安装: sudo -H pip2 install --upgrade MAVProxy pymavlink future lxml
二、树莓派的代码如何连接SITL仿真运行? 前面的教程我们在树莓派中编辑了一个脚本控制无人机。当时只是编辑好,并没有运行。下面我们就在仿真中运行这个脚本,看看是无人机具体是如何飞行的。
树莓派无人机接上电池,确保无人机和笔记本电脑都能正常连接到同一个局域网 (注意:每次电脑和树莓派连接到路由器的IP可能会变动,没有绑定IP的话,建议每次连接前查看一下路由器IP分配是否和以前一样,否则ssh连接会报错。)
树莓派端执行:
笔记本开启一个终端窗口,通过 ssh命令连接树莓派;
在test文件夹下,新建example2.py文件: cd test touch example2.py
用vim编辑文件: sudo vim example2.py
将example1.py中的内容复制到example2.py中,但是需要修改连接部分,如下所示:
其中connection_string = '192.168.1.7:14550' IP地址为你的树莓派IP
没有在example1示例中直接修改是便于大家对照改动的地方。主要是连接的地址不一样。如果要运行仿真演示则运行example2.py;运行example1.py是直接控制飞控飞行。
笔记本端执行:
树莓派端执行:
这样我们就很直观的看到代码控制飞机飞行的状态了。这是一个很简单的程序,飞机分别飞到2个航点,最后自动返航。以后大家可以在这个基础上进行扩展,编写符合自己项目的python程序。
第七个教程就是介绍SITL仿真如何结合Missionplanner和QGC地面站运行。
并且在上次代码的基础上增加部分内容,让无人机按照我们的要求来飞行。
Missionplanner是Ardupilot固件(APM固件)使用的地面站;QGC是PX4固件使用的地面站,目前已经支持Ardupilot固件的运行。我们使用的是Ardupilot(APM)固件,因此两个地面站都可以结合SITL仿真观察飞行情况。
本节教程中,QGC地面站是安装在与SITL仿真软件一起的笔记本电脑上的,而MP地面站是安装在另外一台笔记本电脑上的。因此要注意连接IP地址的区别。
首先,将树莓派无人机接上电池,确保笔记本,MP地面站电脑和树莓派都在同一个局域网内,然后使用ssh命令连接树莓派。
一、SITL仿真+MP运行
笔记本端:
启动SITL仿真
cd ~/ardupilot/ArduCopter sim_vehicle.py --console --map
使用output add命令,增加树莓派的IP: output add 192.168.1.7:14550
再使用output add命令,增加MP地面站的IP: output add 192.168.1.5:14551
树莓派端: 运行示例代码: cd test python example2.py
二、SITL仿真+QGC运行 运行前,请先安装好QGC地面站。QGC可以在Windows,Linux,Mac等系统上安装运行。仿真启动后,QGC默认情况下会自动连接,比较简单。
三、在example2代码的基础上,增加部分功能 前面教程中编写的example2代码,飞行路径是指定的GPS航点。如果我们在不知道到GPS经纬度情况下,或则在室内GPS无法定位的情况下,想让无人机按我们的要求进行前、后、左、右方向的控制飞行,怎么办呢?那就需要使用下面的函数:
Dronekit通过调用函数send_body_ned_velocity方法,可以实现不同方向的指定运动。
def send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration=0):
msg = vehicle.message_factory.set_position_target_local_ned_encode( 0, # time_boot_ms (not used) 0, 0, # target system, target component mavutil.mavlink.MAV_FRAME_BODY_NED, # frame Needs to be MAV_FRAME_BODY_NED for forward/back left/right control. 0b0000111111000111, # type_mask 0, 0, 0, # x, y, z positions (not used) velocity_x, velocity_y, velocity_z, # m/s 0, 0, 0, # x, y, z acceleration 0, 0) for x in range(0,duration): vehicle.send_mavlink(msg) time.sleep(1) # 让无人机向左飞行,速度10m/s,飞行时间10秒,延迟(duration)10秒这样拐角更方正. # x表示前后方向,y表示左右方向,z表示垂直高度方向 velocity_x = 0 velocity_y = -10 velocity_z = 0 duration = 10 send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration) time.sleep(10) #让无人机向前飞行,速度10m/s,飞行时间10秒 velocity_x = 10 velocity_y = 0 velocity_z = 0 duration = 10 send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration) time.sleep(10) #也可以用下面这种格式:让无人机向右飞行,速度10m/s,飞行时间10秒 send_body_ned_velocity(0,10,0,10) time.sleep(10) #最后让无人机向后飞行,速度10m/s,飞行时间10秒,这样无人机就飞出一个正方形 send_body_ned_velocity(-10,0,0,10) time.sleep(10)
将以上代码加入,如下图所示:
以后我们就可以通过这个函数,控制无人机在任何方向上的运动。
至此我们基本了解了使用Dronekit外部控制无人机飞行的方法,并结合SITL仿真查看到运行效果。在实际使用中,大家还需要根据项目的具体要求,结合官网的API来编写代码。只有在多次操作以后才能熟练运用。
|