请选择 进入手机版 | 继续访问电脑版

385

阿木币

2

精华

805 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2020-5-14 09:50:37 2451 浏览 0 回复

[教程] Pixhawk无人机扩展教程

       在前面的教程中,我们讲解了用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.碳纤维扩展板一块及配件螺丝:
购买链接:[color=var(--weui-LINK)]https://shop111333.cn/9MlVPK

4.自制树莓派电源线一根:树莓派需要5V稳压电源供电,可以自己制作一根类似的电源线。
没有配件的朋友可以点击购买链接:[color=var(--weui-LINK)]https://shop111333.cn/9MlVPK

5.自制树莓派与PIX连接线一根:树莓派与PIX通讯需要用到TTL转USB模块。
也可点击购买链接:[color=var(--weui-LINK)]https://shop111333.cn/9MlVPK

二、安装过程:

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),计算机名称,用户名,密码,系统就会自动安装。注意:计算机名称,用户名,密码尽量简单好记。因为以后要反复使用。

  • 安装好如下所示:


四、系统设置:

第一步:更新系统

  • 鼠标右键点击桌面,打开终端窗口:

  • 输入命令cd,切换到根目录下:
    注意:命令行有提示  lj@ras ,lj是我的用户名,ras是设置的树莓派名称。根据自己设置的不同,显示不一样。


再依次输入以下命令,更新系统:
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 lj@192.168.1.8  (你的用户名@计算机IP)

连接上以后,终端窗口的命令行会有变化,如下:

以后调试,就不用给树莓派连接鼠标键盘和显示器了,只需要保证树莓派和笔记本在同一路由网络下,用笔记本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

  • 飞行器接上电池,检查树莓派和飞控是否正常启动,树莓派和笔记本是否连接到同一个路由器。具体请参考前面两篇教程 [color=var(--weui-LINK)]树莓派在飞行器上的安装 和 [color=var(--weui-LINK)]ubuntu-mate系统的安装及基本设置
  • 笔记本端通过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

  • 保存代码并退出(如何保存编辑操作请参考《[color=var(--weui-LINK)]Pixhawk无人机扩展教程(2)》)
    以上代码涵盖了大部分的无人机状态,通过执行以上代码就能读取当前飞控状态参数。

    注意:不要急着执行以上脚本。可能提示权限不够出错。需要赋予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,最后返回出发点并降落。

  • 笔记本端通过ssh命令连接树莓派,在test文件夹下,新建example1.py文件:


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很大程度上是无法正常运行的,主要有以下几个原因:
  • 如果是在室内,GPS无法定位,也就无法切换到Guided模式(引导),起飞前的自检是不能通过的,就像如下这个样子,会一直等待解锁:
    结束进程请使用 CTRL+C。

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

如果按照网上教程,多半会遇到以下问题:
  • 运行命令 Tools/scripts/install-prereqs-ubuntu.sh-y会出错,提示没有这个文件。因为新版本sh文件目录有所改变,现在集中在/ardupilot/Tools/environment_install中,对应ubuntu安装文件依然是install-prereqs-ubuntu.sh。另外需要注意的是这个sh文件默认是没有运行权限的,需要通过chmod +x install-prereqs-ubuntu.sh增加运行权限才可以执行。
  • 在国内由于众所周知的原因,默认的安装源下载速度慢得让人怀疑人生。。。中途会报错无法安装。所以安装前需要将apt-get更换为国内安装源。具体可以参考这篇教程 [color=var(--weui-LINK)]ubuntu 执行apt-get update报错Failed to fetch
  • 脚本中使用pip2安装需要的包,同样需要更换为国内源,具体可以参考[color=var(--weui-LINK)]PIP 更换国内安装源
  • 在安装个过程中会安装ARM交叉编译工具链[color=var(--weui-LINK)]gcc-arm-none-eabi-6-2017-q2-update-linux,在脚本中默认使用wget下载,速度奇慢无比,可以事先下载并且自行解压到/opt目录下,这样安装的时候会跳过下载,节省很多时间。


当然,如果有用付费VPN,或则有能力翻Qiang的朋友,不受网速限制,以上问题基本可以忽略。

上述问题都注意到的话,整体安装过程应该是比较顺利的。之后就需要配置路径:
Tools/environment_install/install-prereqs-ubuntu.sh-y. ~/.profile

到此Ardupilot的开发环境就已经安装好,使用中还要注意以下问题:
  • ardupilot源码已经转向Waf工具编译,所以编译指令有所区别,并且需要注意一定在ardupilot安装的根目录执行,这点与make不同。
  • waf编译前需要配置飞控运行板卡,但是之前网上教程所提到px4-v1、px4-v3等板卡名称都已经被替换,可以使用./waf list_boards命令查询支持板卡对应的名字。


例子,编译支持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是直接控制飞控飞行。

笔记本端执行:

  • 再打开一个终端窗口,快捷键:Ctrl+Alt+T,在这个终端里启动仿真:cd ardupilot/ArduCoptersim_vehicle.py --console --map
  • 启动后通过output命令列出MAVProxy转发数据的接口,如下所示:
  • 使用output add命令增加树莓派IP接口:
    output add 192.168.1.7:14550

    其中地址为你的树莓派的IP,与example2.py代码中地址一致。

树莓派端执行:

  • 点击第一个终端窗口,运行example2.py代码
    python example2.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来编写代码。只有在多次操作以后才能熟练运用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x

评分

参与人数 3阿木币 +3 收起 理由
anglersking + 1
风帆 + 1
amov_msq + 1

查看全部评分


扫一扫浏览分享
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

Official store

Official store

 阿木实验室

Number

Number

028-87872048

扫一扫,快速加入

群号652692981

硬件评测

群号652692981

课程学习

快速回复 返回顶部 返回列表