先看看装备,上节就说了,这树莓派的壳子我喜欢
历经九九八十一难,终于把树莓派和Pixhawk4飞控接通了,中间尝试了多种方法,四处碰壁,期间借鉴了微信公众号苍穹四轴中的大部分内容,结合Dronekit官网和Ardupilot官网的内容,还有知乎大佬李德杰的帖子、大佬DarrenChan陈驰的帖子,使得连接成功,记录一下,方便日后查看,也方便日后学习的老弟少走弯路。这里用的是一个相对简单一些的python写成的库dronekit,大家可以了解一下
还是上结果图看下,读取的状态
首先连接地面站,因为调试过程多个地面站也尝试了一遍,MP地面站的话就在配置调试->全部参数树->搜索serial2->baud改成921,PROTOCOL=2(这里我看其他帖子写改成1,但我看官方是改成2,都尝试了一下我这里是2)->写入参数->重启飞控即可
如果用QGC的话,在载具设置->参数->搜索serial2->设置baud=921600,protocol=MAVLINK2->保存重启飞控即可
树莓派要的东西很多,我这用的是最新的树莓派4,感觉还挺好,但不知道是不是太强大了造成的不稳定,经常崩机,系统重装了好几次,心累的不行。
系统安装的是官方提供的Raspbian Buster with desktop,大约1G左右,也尝试过400MB的Raspbian Buster Lite,但是后来不知道怎么连wifi而告终,不过用不带桌面的是真的快,后来发现,wifi应该可以通过sudo raspi-config 下的wifi来配置,还没尝试,以后有时间试一下。
装好系统后,初步设置我连到自家电视设置的,无屏幕教程网上有不少,有屏幕的远程操作看我上一篇的帖子。
首先进行树莓派系统的设置
sudo raspi-config
进入设置界面,选择5 interface options,选择P6 serial,先no在yes,保存重启。
还有一种方法是在树莓派桌面下run有个raspi设置,选择serial_login-disabled,serial_interface-enabled。
设置完成后进入终端:
配置如下:
sudo apt-get update
sudo apt-get upgrade
python应该是自带,也装一下,万一没有呢
sudo apt-get install python-pip python-dev
这一步要装一下,要不然提示报错
sudo apt-get install libxml2-dev libxslt1-dev zlib1g-dev python-py
安装dronekit
这一步可能会花费较长时间,需要耐心等待一下
sudo pip install dronekit
这样基本就完成了,然后就是连接问题
参照官网给的连接图
在树莓派有供电的情况下,5v不用连接,只需要一个地,一个T,一个R,树莓派引脚如下图,也可以使用ttl转usb进行配置,可以参考苍穹四轴中的内容,我用usb没有配置成功,
基本差不多了,我的连接图给大家参考一下
环境配置完成后,基本就是写代码进行通信了,我这里用linux使用ssh进行的控制,也尝试过用windows10的VNs进行控制,结果都是不错的,延时都不高,vns可以看到远程的桌面新手可以尝试一下,相关配置跟前面讲到的ssh一样,开启后,输入ip及密码就可以登录操作。
远程连接树莓派,上一章提到了详细过程
接下来写connect.py程序
cd
touch connect.py
sudo vim connet.py
这里vim是一个编辑器,没安装的话会提示安装即可,操作方法为 输入i开始写入,输入esc退出写入状态,:wq保存并退出,这就够了
复制以下内容进文本,尝试能否连接并输出文本:
from dronekit import connect
vehicle = connect('/dev/serial0', wait_ready=True, baud=921600)
print "Autopilot Firmware version: %s" % vehicle.version
运行程序
python connect.py
如果可以连接,就可以继续更改一下内容,进行飞控状态的监控了
from dronekit import connect
vehicle = connect('/dev/serial0', wait_ready=True, baud=921600)
print("\nGet all vehicle attribute values:")
print(" Autopilot Firmware version: %s" % vehicle.version)
print(" Major version number: %s" % vehicle.version.major)
print(" Minor version number: %s" % vehicle.version.minor)
print(" Patch version number: %s" % vehicle.version.patch)print(" Release type: %s" % vehicle.version.release_type())
print(" Release version: %s" % vehicle.version.release_version())
print(" Stable release?: %s" % vehicle.version.is_stable())
print(" Autopilot capabilities")
print(" Supports MISSION_FLOAT message type: %s"%vehicle.capabilities.mission_float)
print(" Supports PARAM_FLOAT message type: %s" % vehicle.capabilities.param_float)
print(" Supports MISSION_INT message type: %s" % vehicle.capabilities.mission_int)
print(" Supports COMMAND_INT message type: %s" % vehicle.capabilities.command_int)
print(" Supports PARAM_UNION message type: %s" % vehicle.capabilities.param_union)
print(" Supports ftp for file transfers: %s" % vehicle.capabilities.ftp)
print(" Supports commanding attitude offboard: %s" % vehicle.capabilities.set_attitude_target)
print(" Supports commanding position and velocity targets in local NED frame: %s" % vehicle.capabilities.set_attitude_target_local_ned)
print(" Supports set position + velocity targets in global scaled integers: %s" % vehicle.capabilities.set_altitude_target_global_int)
print(" Supports terrain protocol / data handling: %s" % vehicle.capabilities.terrain)
print(" Supports direct actuator control: %s" % vehicle.capabilities.set_actuator_target)
print(" Supports the flight termination command: %s" % vehicle.capabilities.flight_termination)
print(" Supports mission_float message type: %s" % vehicle.capabilities.mission_float)
print(" Supports onboard compass calibration: %s" % vehicle.capabilities.compass_calibration)
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)
print(" Attitude: %s" % vehicle.attitude)
print(" Velocity: %s" % vehicle.velocity)
print(" GPS: %s" % vehicle.gps_0)
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(" Groundspeed: %s" % vehicle.groundspeed)
vehicle.close()
总体来说,dronekit的配置比ros等更方便一些,配置过程发现,dronekit中好像包括了mavlink等插件,后面会继续进行学习,我这边也遇到了不少问题,树莓派开机就崩还没找到是哪里的问题,间歇性树莓派能搜到wifi却连接不上等问题, 慢慢学习,继续了解,今天没有学单片机,也没有学tensoflow,上午配了一遍环境,下午又重新配了一遍,对整个过程有了新的了解和体会。接下来准备就是控制程序的编写,加油吧,小老弟。