有幸来到西湖大学智能无人系统实验室进行访问学习
接下来的很长一段时间会与pixhawk与PX4这一套系统打交道啦,这里做一下最开始的记录,关于PX4环境搭建相关

首先下载源码和子模块

参考说明文档PX4 User Guidegithub地址
嘱咐一句网页页面千万要英文,不要切换到其它语言,我之前在User Guide里面勾选的中文去看的,有很多错误命令。
第一步也是最重要的一步,找个好网连接上,最好能上google的那种
安装依赖项和下载子模块的时候需要一个好网喔,不然会很慢或者直接下载失败。

实在不方便开手机热点,我之前有试过,可以。
我选定的版本是v1.11.3,理由就是看它比较顺眼罢了哈哈

git clone -b v1.11.3 https://github.com/PX4/PX4-Autopilot.git

进入源码目录

cd PX4-Autopilot

然后为了图个心安

sudo chmod 777 -R *

下载子模块

git submodule update --init --recursive


这里要少许时间耐心等待,我等了大概三四分钟的样子。
这个子模块对应源码目录下的.gitmodules文件,主要通过

git submodule add 仓库地址 路径

来添加子模块,我之前有见过把这里面的一些链接改了的,比如sitl_gazebo给改到了自己的某个码云地址方便下载的。

现在全部代码都下载完毕了
我把在个版本包含子模块的代码备份了一份,放到了百度网盘里面,以后都需要在这个上面改动学习,它现在相当于是我个人选择的长期维护版本啦,备份很重要。
链接:https://pan.baidu.com/s/1qTveIIzoHu1UjQ_HwiDJ_Q
提取码:nbxp
这东西有点儿大,整个放码云或者github上面不太合适,而且一些东西PX4团队一直在优化和更新,想了想还是自己先备份一个先,以后玩儿明白了自己剪裁出来再往仓库上面贴。

安装依赖项、编译测试

bash ./Tools/setup/ubuntu.sh

按照我自己的尿性是绝对不可能直接运行这个来安装它依赖的环境和软件的,我打开这个ubuntu.sh文件,看了看,在安装交叉编译器arm-none-eabi-gcc的时候觉得它太慢了就在脚本里面注释掉了自己去下载安装的,输入如下命令检查gcc安装状态 shell arm-none-eabi-gcc --version , 得到版本信息就说明安装成功了。

然后 运行编译命令看看是否成功,编译一下

make px4_fmu-v3_default

在官网User Guide里面说明了不同的板子对应不同的编译命令

下载QGC、使用

参见QGC的说明文档
按照上面的命令运行

然后,问题来了
我的QGC双击没得反应!!!
于是我通过终端

./QGroundControl.AppImage

运行一下看看会不会打印什么东西
果然报错这样子之类的:

/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found

问了一下这里的工程师哥哥,他说是因为我的QGC版本太高了
去QGC的github网页去看了看发行版本
慢慢试
试到v4.0.11,终于可以了
这个版本虽然老,界面不算很好看,但是据工程师哥哥说,在采集数据的时候它Inspector里的数据比新版本QGC的小数点后数据多一些
在源码目录下进入终端运行

make px4_sitl jmavsim

再打开QGC,QGC就会与jmavsim连接上啦,这时候最基本的的航点规划什么的也可以玩玩儿啦,但是不能切换到手动模式,会报错说没有摇杆输入,我又向实验室的哥哥借了一个XBOX接上,就可以了,就是XBOX遥控这个无人机的手感确实比不上航模遥控器,哈哈。

gazebo环境搭建和使用

作为一个ROS爱好者,当然要试试它的gazebo仿真啦,寻找可玩儿性。
安装和使用gazebo我就不说啦,在进行这个之前我的电脑是双系统,已经有ROS和gazebo环境了。
这里说几个要点

  • 这里下载gazebo模型,放到~/.gazebo/models/里,若没有.gazebo则运行一下gazebo,若没有models则新建一个
  • 更改python默认编码,sudo gedit /usr/lib/python2.7/site.py,找到setencoding()函数修改 encoding=”utf-8”
  • 如果出现报错Resource not found: gazebo_ros,运行sudo apt-get install ros-melodic-gazebo-ros*安装缺失的gazebo插件

先安装一下mavros相关包,看官方说明文档这里,我选择二进制安装运行下面这一步就行

其中kinetic我根据我的版本改为了melodic,再后面的是根据源码安装,看起来稍微有点麻烦,没管它了。


然后主要看到这里来开始使用gazebo仿真。
进入源码目录,运行

make px4_sitl gazebo

要的时间有点长,之后如果顺利会出现这样子的东西

但是我就不是很顺利,它报错了

/usr/include/gazebo-9/gazebo/msgs/quaternion.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
 #error This file was generated by a newer version of protoc which is

可以去查看/usr/include/gazebo-9/gazebo/msgs里的说明,看到

#if GOOGLE_PROTOBUF_VERSION < 3000000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3000000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

说明我的这个Protocol版本不对,这里我需要安装3.0.0
我去Protocol官网下载3.0.0版本后在其源码目录下依次执行

./configure
make
make check
sudo make install

就解决啦。


gazebo下的仿真同样可以连接到地面站,
单纯地从仿真上来看
gazebo与jmavsim一样它可以连接QGC地面站,玩法与jmavsim一样的
但是它可以选择更多的机型,加载不同的地图,多机仿真。主要看这里和它下面的说明。

但是这都是别人给的,虽然花样很多,但是按照我的尿性自然是玩儿的没意思。
我得知道怎么去自己搭建地图去把无人机和地图分开,能够写自己的ROS仿真应用。


然后我看到了这里

按照上面的操作,进入源码目录,依次执行

DONT_RUN=1 make px4_sitl_default gazebo
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo
roslaunch px4 posix_sitl.launch

熟悉的味道回来了,哈哈~
然后我再跟着文档的节奏去看到底做了哪些工作

说一下我自己的理解,比较粗犷
DONT_RUN=1 make px4_sitl_default gazebo这句话就是造飞机,按照之前的那个页面,这里可以换为DONT_RUN=1 make px4_sitl gazebo_plane等等
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo设置了许多变量,明确包的具体位置,类似于source工作空间里的setup.sh
打开roslaunch px4 posix_sitl.launch

看得懂,但似乎又不太懂……
这里大概是在这里运行了某个程序,跑起了PX4

<node name="sitl" pkg="px4" type="px4" output="screen"
        args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS $(arg px4_command_arg1)" required="true"/>

然后在这里加载环境文件

<include file="$(find gazebo_ros)/launch/empty_world.launch">

在这里加载飞机的外形模型文件

<node name="$(anon vehicle_spawn)" pkg="gazebo_ros" type="spawn_model" output="screen" args="-sdf -file $(arg sdf) -model $(arg vehicle) -x $(arg x) -y $(arg y) -z $(arg z) -R $(arg R) -P $(arg P) -Y $(arg Y)"/>

如果不在这里进行PX4源码研究,利用gazebo去搭建一个自己的环境,只是调用mavros接口去做一些东西,比如二维码识别并控制飞机转向,加一个激光雷达去尝试建图或者避障,应该是好修改的。
有机会我再尝试看怎么去耍耍,我发现这边搞科研的很少有用gazebo仿真帮助他们获得数据,转而是其他的仿真软件(具体名字我不记得了),我想了想确实是这样子,gazebo的物理环境可能没法达到他们研究的要求,但是gazebo对于做一些想法验证确实很棒,它可以快速搭建一个应用上的仿真环境,cool。