【树莓派学习笔记】树莓派安装Dronekit并连接Pixhawk飞控

上一节中我们在树莓派上配置了基本的开发环境,可以用PC上的Ubuntu系统远程ssh访问树莓派。
接下来需要配置Dronekit库,这是一个控制无人机和获取无人机参数的Python库。

原文链接

0. 连接登陆树莓派

在Ubuntu系统命令行窗口输入:(切记此时PC与树莓派必须连在同一个路由器下,注意变更路由器后IP也会改变)。

树莓派的IP地址有可能是动态分配的,所以你必须每次都连好wifi后都确定树莓派IP后再ssh

ssh "树莓派上用户名"@"树莓派IP"

1. 此时需要确保在根目录下,输入”cd”

确保在根目录下
确保在根目录下

2. 安装pip和python-dev

sudo apt-get install python-pip python-dev

这一步中可能是树莓派中安装但是最新系统,提示需要安装python3版本对应的两个软件


提示安装python3版本库

因此改为:

sudo apt-get install python3-pip python-dev-is-python3

3. 接下来安装DroneKit库

sudo pip install dronekit

可是结果externally-managed-environment报错如下

BD后发现了此问题的 三个解法,选择了其中最麻烦但是最稳妥的方法——使用pipx代替pip

先安装pipx,这一步会花点时间

sudo apt install pipx

再把pipx加入路径中

pipx ensurepath

然后需要重启树莓派,重新ssh登陆

### 一些主要的sudo命令
sudo halt                                   #清除进程并关机
sudo reboot                                 #重启
sudo shut down -h 14:30                     #定时关机
clear                                       #清屏
cd /folder1/folder2/...                     #打开路径
ls                                          #显示当前文件夹的目录
sudo find / -name opps.txt                  #寻找opps.txt文件
sudo mv ~/file /folder1/folder2/            #把folder1里的file移动到folder2
sudo raspi-config                           #打开配置页面
sudo ifconfig -a                            #树莓派网络配置信息

重新启动后输入

sudo pipx install dronekit

但是还是没法安装,可能是公众号上的方法因为版本更新有些不一致,所以接下来使用了 官方Dronekit的方法

3.1 官方方法安装DroneKit-Python

sudo apt-get install python-pip python-dev

上一行命令无法运行,于是在提示下换用下面的命令行

sudo apt-get install python3-pip python-dev-is-python3

可是安装了无数次,试了无数办法,依旧无法正常安装Dronekit,只要按照教程不用树莓派的官方镜像系统,因此需要重刷系统镜像

(1)下载安装最新的 Ubuntu-mate树莓派镜像

步骤后之前刷树莓派官方的方法一样,只不过这次我们需要安装的镜像文件换成了链接里的文件,balenaEtcherh或者树莓派官方的镜像安装其均可,开机后完成基本的初始设置

(2) 更新系统

sudo apt-get update
sudo apt-get upgrade

这一步很重要,后一步一般会花费很长时间,我就是这一步没有完成好导致后面安装时频频出错

(3)安装必要的软件和开启ssh服务

sudo apt-get install vim
sudo apt-get install xrdp

sudo apt-get install openssh-server
sudo ps -e | grep ssh
sudo /etc/init.d/ssh start
sudo systemctl enable ssh

然后你可以使用ifconfig查看树莓派的IP,就可以远程ssh了

(4)安装Dronekit

sudo apt-get install python2-dev
sudo apt-get install python3-pip

sudo apt-get install libxml2-dev
sudo apt-get install libxslt1-dev
sudo apt-get install zlib1g-dev

sudo pip install dronekit

最后的安装成功结果:

4. 测试DroneKit

回到根目录,创建一个名为“test”的文件夹

mkdir -p ~/test

然后在test里新建connect.py脚本测试树莓派是否能连接到Pixhawk飞控板

cd test
touch connect.py

再使用vim来编写这个connect.py脚本(我选择直接在树莓派里编辑)

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    #无人机朝向:roll,pitch,yaw单位弧度(-π~π)
print "Velocity: %s" % vehicle.velocity    #三维速度(m/s)
print "GPS: %s" % vehicle.gps_0            #GPS信息
print "Groundspeed: %s" % vehicle.groundspeed         #地速(m/s)
print "Airspeed: %s" % vehicle.airspeed               #空速(m/s)
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解锁状态

5. 定义USB口

到这里就涉及到树莓派和飞控的通信问题,树莓派使用USB口与飞控通信,这里需要给端口权限,首先需要确认树莓派的USB与飞控的telem2口相连了

查看端口

ls /dev/ttyUSB*

在执行上一步时,系统提示找不到对应的ttyUSB0,后来 查询资料 发现是这个端口被brltty占用,于是直接卸载了这个软件

sudo apt remove brltty

重启后可以找到ttyUSB0了

接下来,给这个USB口赋予权限:

sudo chmod 666 /dev/ttyUSB0

以上只是暂时的,下面来永久地改写USB口读写权限的方法

ls usb -vvv

可是系统提示上一步中的usb无法确认,所以找了一个 别的方法

首先获取dmesg权限

sudo sysctl kernel.dmesg_restrict=0

然后系统会返回ttyUSB0对应的usb序号,如下图中的1-1.3

然后我们需要获取对应USB的idVendor和idProduct,输入

udevadm info --name=/dev/ttyUSB0 --attribute-walk

命令行会输出许多文本,需要获取的两个值在1-1.3下如图,记录idVendor和idProduct对应的编码

创建新的udev规则

sudo vim /etc/udev/rules.d/myusb0.rules

在新建的文件中输入:

SUBSYSTEMS=="usb",ATTRS{idVendor}=="1a86",
ATTRS{idProduct}=="7523",GROUP="users", MODE="0666"

其中的idVendor和idProduct用上图中对应的编码代替,接着重新加载udev规则

sudo udevadm control --reload

6. 测试连接

连接好树莓派和飞控后,运行connect.py

cd test
python3 connect.py

这时候一般会有个问题,在脚本的__init__.py的2689行,把这一行改为

class Parameter(collections.abc.MutuableMapping,HasObservers):