加速下载ardupilot工程

本文是从Ardupilot移植经验分享(1)中拆分出来,因为原文的篇幅太长了。本文中有时会提到“前面的步骤”、“之前”,这指的都是前一篇文章。

目录

  • 下载ardupilot
  • 创建子模块的镜像仓库
  • install-prereqs-ubuntu.sh
  • 加速方法小结
  • 遗漏了一些子模块

在国内访问github的速度是受到限制的,下载大型工程时,容易失败。有加速通道的同学,就不必看了。

ardupilot是一个大型且复杂的工程,这使下载问题更加严重。为什么这么说呢,因为ardupilot除了其自身源码之外,还依赖很多子模块。

以3.5.7版本为列,先通过ardupilot源码根目录下的.gitmodules文件,查看其直接依赖的子模块。

$ cat .gitmodules 
[submodule "modules/PX4Firmware"]
	path = modules/PX4Firmware
	url = git://github.com/ArduPilot/PX4Firmware.git
[submodule "modules/PX4NuttX"]
	path = modules/PX4NuttX
	url = git://github.com/ArduPilot/PX4NuttX.git
[submodule "modules/uavcan"]
	path = modules/uavcan
	url = git://github.com/ArduPilot/uavcan.git
[submodule "modules/waf"]
	path = modules/waf
	url = git://github.com/ArduPilot/waf.git
[submodule "modules/gbenchmark"]
	path = modules/gbenchmark
	url = git://github.com/google/benchmark.git
[submodule "modules/mavlink"]
	path = modules/mavlink
	url = git://github.com/ArduPilot/mavlink
[submodule "gtest"]
	path = modules/gtest
	url = git://github.com/ArduPilot/googletest

看似不多,然而子模块也可能依赖一批模块,即孙子模块。比如PX4Firmware依赖的子模块:

$ cat modules/PX4Firmware/.gitmodules 
[submodule "mavlink/include/mavlink/v1.0"]
   path = mavlink/include/mavlink/v1.0
   url = git://github.com/mavlink/c_library.git
[submodule "src/modules/uavcan/libuavcan"]
   path = src/modules/uavcan/libuavcan
   url = git://github.com/UAVCAN/libuavcan.git
[submodule "Tools/genmsg"]
   path = Tools/genmsg
   url = https://github.com/ros/genmsg.git
[submodule "Tools/gencpp"]
   path = Tools/gencpp
   url = https://github.com/ros/gencpp.git
[submodule "src/lib/matrix"]
   path = src/lib/matrix
   url = https://github.com/PX4/Matrix.git
[submodule "src/lib/DriverFramework"]
   path = src/lib/DriverFramework
   url = https://github.com/PX4/DriverFramework.git
[submodule "src/lib/ecl"]
   path = src/lib/ecl
   url = https://github.com/PX4/ecl.git

这还没完,这些子模块还有依赖的模块,最多的套了4层,就不一一列举了。如果说每个工程下载成功的概率是90%,那20个工程(模块)一起成功的概率是12%。并且,当某个工程失败时,短时间内下载往往还是失败。
0. 9 20 = 0.12 0.9^{20}=0.12 0.920=0.12

为了让大家免受其苦,笔者分享当初下载的方法。再次提醒,这个方法虽然有效,但是很麻烦,有加速通道的同学可跳过本文

注:

  1. 笔者以3.5.7版本为例进行讲解,如果你想跟着笔者体验下操作,可使用下面提到的镜像仓库。若是想下载官方最新源码,请根据下面叙述的方法自行制作镜像。因为笔者制作的镜像是2年前的,后续并没有更新。
  2. 下面介绍的码云和github操作类似,这里只讲关键步骤。笔者下载时用的都是git协议而非https,需要配置ssh-key。这些都是git基础操作,不了解的自行搜索哈。

其实方法说来简单,从github下载源码慢且容易失败,那就使用国内的git网站建立镜像仓库,比如码云。它从github下载的速度会快一些,最关键的是,就算慢,也不容易失败。

下载ardupilot

首先,创建ardupilot的镜像仓库。在码云新建仓库,仓库的名称和路径可不填。
加速下载ardupilot工程_第1张图片

直接选择最底下的导入已有仓库,贴入ardupilot地址。
加速下载ardupilot工程_第2张图片
此时会自动填充仓库的名称和路径,点击创建即可。等其导入完毕,从仓库主页中获取地址。
加速下载ardupilot工程_第3张图片

git clone [email protected]:dbw-ardupilot/ardupilot.git

看看,这速度是不是要起飞了。
在这里插入图片描述
不要高兴的太早,这才刚刚开始,仅仅是下载了ardupilot自己的工程。还记得那20多个子模块吗,都得自己建立镜像。

创建子模块的镜像仓库

如果你要编译的不是master,则需要切换到目标分支。

git checkout -b Copter-3.5-test Copter-3.5.7

git工程跟踪子模块,是通过其根目录下的.gitmodules文件实现,之前贴出了ardupilot和PX4Firmware的.gitmodules,里面有很多submodule,每一个代表一个子模块,比如ardupilot跟踪了PX4Firmware。

[submodule "modules/PX4Firmware"]
	path = modules/PX4Firmware
	url = git://github.com/ArduPilot/PX4Firmware.git

path是一个相对路径,指明下载后存放的位置。url记录了子模块的git地址。使用之前的方法制作镜像仓库。

怎样让ardupilot工程下载我们的镜像而不是官方仓库呢?修改.gitmodules是下下之策,因为当你切换到别的分支时,.gitmodules又变为之前的内容。笔者推荐git config来添加配置项:

git config --global submodule.modules/PX4Firmware.url [email protected]:dbw-ardupilot/PX4Firmware.git

命令参数详解:

  • –global指明添加的是全局配置。与全局相对的是本地配置,就是记录在仓库里面的配置,在别的仓库就失效了。
  • 配置的名称是submodule.modules/PX4Firmware.url,格式为submodule. n a m e name name.url,这个 n a m e name name是[submodule “modules/PX4Firmware”]中双引号中的内容。
  • 配置的值为git地址。

将子模块,子模块的子模块,子模块的子模块的子模块。。。全部搞下来:

git config --global submodule.DbConnector.url PRIVATE_URL
git config --global submodule.modules/PX4Firmware.url [email protected]:dbw-ardupilot/PX4Firmware.git
git config --global submodule.modules/PX4NuttX.url [email protected]:dbw-ardupilot/PX4NuttX.git
git config --global submodule.modules/uavcan.url [email protected]:dbw-ardupilot/uavcan.git
git config --global submodule.modules/waf.url [email protected]:dbw-ardupilot/waf.git
git config --global submodule.modules/gbenchmark.url [email protected]:dbw-ardupilot/benchmark.git
git config --global submodule.modules/mavlink.url [email protected]:dbw-ardupilot/mavlink.git
git config --global submodule.gtest.url [email protected]:dbw-ardupilot/googletest.git
git config --global submodule.modules/ChibiOS.url [email protected]:dbw-ardupilot/ChibiOS.git
git config --global submodule.dsdl.url [email protected]:dbw-ardupilot/dsdl.git
git config --global submodule.libuavcan/dsdl_compiler/pyuavcan.url [email protected]:dbw-ardupilot/pyuavcan.git
git config --global submodule.mavlink/include/mavlink/v1.0.url [email protected]:dbw-ardupilot/c_library.git
git config --global submodule.src/modules/uavcan/libuavcan.url [email protected]:dbw-ardupilot/libuavcan.git
git config --global submodule.Tools/genmsg.url [email protected]:dbw-ardupilot/genmsg.git
git config --global submodule.Tools/gencpp.url [email protected]:dbw-ardupilot/gencpp.git
git config --global submodule.src/lib/matrix.url [email protected]:dbw-ardupilot/Matrix.git
git config --global submodule.src/lib/DriverFramework.url [email protected]:dbw-ardupilot/DriverFramework.git
git config --global submodule.src/lib/ecl.url [email protected]:dbw-ardupilot/ecl.git
git config --global submodule.pymavlink.url [email protected]:dbw-ardupilot/pymavlink.git
git config --global submodule.cmake_hexagon.url [email protected]:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.test/dspal_tester/cmake_hexagon.url [email protected]:dbw-ardupilot/cmake_hexagon.git
git config --global submodule.dspal.url [email protected]:dbw-ardupilot/dspal.git
git config --global submodule.matrix.url [email protected]:dbw-ardupilot/Matrix.git

现在可以同步子模块了

git submodule update --init --recursive

install-prereqs-ubuntu.sh

在前面的标准步骤中提到此脚本,它是官方为Debian/Ubuntu系统提供的一键安装编译调试环境的脚本,会下载一些python库和编译器。从官方的源下载会比较慢,比如下载编译器预计6个小时。。。
加速下载ardupilot工程_第4张图片
所以,我们要手工加个速。在执行install-prereqs-ubuntu.sh前,做两件事情。

修改pip源,即~/.pip/pip.conf,若文件不存在,则创建一个

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

下载编译器,详见“编译老版本“一节。

最后,别忘了install-prereqs-ubuntu.sh在3.5.7是不存在的,得切换回master再去执行。执行完,别忘记再切回来。

加速方法小结

接下来的操作与之前无异,总结下操作:

  1. 创建ardupilot镜像仓库,下载到本地。
  2. 切换到目标分支(如果需要的话),创建子模块镜像仓库,添加全局配置。
  3. git submodule update --init --recursive
  4. 修改pip源,下载编译器。
  5. 在master分支上运行安装脚本install-prereqs-ubuntu.sh
  6. 编译

遗漏了一些子模块

笔者在上面贴出了自己的镜像仓库,大家想编译3.5.7版本代码是没问题的。不过笔者并不推荐最终在3.5.7上开发,大家掌握了方法后,最好是在最新代码上进行移植。新的代码功能更多,性能更好。这也就意味着要自己去创建镜像仓库。在创建众多子模块的镜像仓库时,如果漏了几个,最终下载失败,补创镜像站后,有一个额外的操作。

比如下载时报错了:

fatal: clone of 'https://github.com/ATLFlight/cmake_hexagon.git' into submodule path '/mnt/g/ardupilot/src/ardupilot/modules/PX4Firmware/src/lib/DriverFramework/cmake/cmake_hexagon' failed

发现是DriverFramework所依赖的cmake_hexagon被遗漏了。
加速下载ardupilot工程_第5张图片
创建镜像并添加配置:

git config --global submodule.cmake_hexagon.url [email protected]:dbw-ardupilot/cmake_hexagon.git

若此时再次尝试下载,可能还是会失败。

git submodule update --init --recursive

进入到DriverFramework目录查看相关配置会发现,居然有两条配置,一条指向github,一条指向自己的镜像。

$ cd modules/PX4Firmware/src/lib/DriverFramework
$ git config --list | grep submodule.cmake_hexagon.url
submodule.cmake_hexagon.url=[email protected]:dbw-ardupilot/cmake_hexagon.git
submodule.cmake_hexagon.url=https://github.com/ATLFlight/cmake_hexagon.git

这是因为,在上次下载时,还没添加全局配置。git使用.gitmodules文件中的内容创建了局部配置,就如C语言一样,局部配置优先级更高。需要删除局部配置。保持在DriverFramework目录中:

$ git config --unset submodule.cmake_hexagon.url

再次检查,发现只有全局配置了。

$ git config --list | grep submodule.cmake_hexagon.url
submodule.cmake_hexagon.url=[email protected]:dbw-ardupilot/cmake_hexagon.git

你可能感兴趣的:(ardupilot移植经验分享,嵌入式,单片机,rtos,c语言,github)