pixhawk 编译的基本操作步骤:
1)下载固件仓
git clone https://github.com/PX4/Firmware.git
2)更新固件代码
cd Firmware
git submodule update –init –recursive
3)编译V2固件代码
make px4fmu-v2_default
4)烧录固件
make px4fmu-v2_default upload
每个人使用的编译环境不同,踩的坑也不尽相同。我这列举我遇到的坑和解决过程&方法。
编译环境:Fedora 25 (我个人比较喜欢fedora,可能从大学就开始用,习惯了。)
1.出现import serial错误
从编译错误信息看,是python脚步无法导入serial这个模块。
所以使用root账号安装对应的python模块:dnf install pyserial
2.提示需要删除ModemManager,避免冲突
dnf remove ModemManager删除,完事。
3.make px4fmu-v2_default upload 命令后一直卡在插拔USB的提示页面
首先怀疑USB没有上报设备,进入/dev/看,发现有serial设备上报。插拔USB口,serial设备消失并重新挂载。cat /dev/serial/by-id下的设备节点,发现没有权限。所以登陆root账号,再次使用命令 make px4fmu-v2_default upload,结果OK了。
事实证明懒,迟早要还的。果不其然,固件烧录后,使用Minicom打开串口,死活没有nsh的提示符出来,串口也没有响应。
先补充一下串口的配置:
1)先安装minicom
2)再使用minicom -s命令配置串口属性为57600 8N1 ,串口为/dev/ttyACM0 (如果不清楚是那个设备,可通过插拔USB 看看是哪个设备)
串口没有反应,第一直觉就是romfs是不是有问题:1.启动失败 2.没有编译进固件
使用make distclean后,再次编译固件,结果一直提示
Firmware/cmake/nuttx/bin_to_obj.py 65行AttributeError错误,NoneType object has no attribute ‘group’
打开 bin_to_obj.py
# get size of image
stdout = run_cmd("{nm:s} -p --radix=x {obj:s}.bin.o", locals())
re_string = r"^([0-9A-Fa-f]+) .*{sym:s}_size".format(**locals())
re_size = re.compile(re_string, re.MULTILINE)
size_match = re.search(re_size, stdout.decode())
try:
size = size_match.group(1)
except AttributeError as e:
raise RuntimeError("{:s}\nre:{:s}\n{:s}".format(
e, re_string, stdout))
except IndexError as e:
group0 = size_match.group(0)
raise RuntimeError("{:s}\ngroup 0:{:s}\n{:s}".format(
e, group0, stdout)) # get size of image
stdout = run_cmd("{nm:s} -p --radix=x {obj:s}.bin.o", locals())
re_string = r"^([0-9A-Fa-f]+) .*{sym:s}_size".format(**locals())
re_size = re.compile(re_string, re.MULTILINE)
size_match = re.search(re_size, stdout.decode())
try:
size = size_match.group(1)
except AttributeError as e:
raise RuntimeError("{:s}\nre:{:s}\n{:s}".format(
e, re_string, stdout))
except IndexError as e:
group0 = size_match.group(0)
raise RuntimeError("{:s}\ngroup 0:{:s}\n{:s}".format(
e, group0, stdout))
可以看到size = size_match.group(1)抛出异常,提示没有 group属性,但是group是python内置模块,不可能没有。只有一种可能,就是 size_match为空。再看看代码,只能是arm-none-eabi-nm命令结果有问题。
尝试在run_cmd函数中把编译命令打印出来,看看整个流程。
原来第一步就是用arm-none-eabi-gcc arm-none-eabi-ld arm-none-eabi-nm来计算romfs.bin的大小:
1)/usr/bin/arm-none-eabi-gcc -I/home/pixhawk/Firmware/src/include -g -std=gnu99 -fno-common -Wall -Werror -Wextra -Wno-sign-compare -Wshadow -Wfloat-equal -Wpointer-arith -Wmissing-declarations -Wno-unused-parameter -Werror=format-security -Werror=array-bounds -Wfatal-errors -Werror=unused-variable -Werror=reorder -Werror=uninitialized -Werror=init-self -Werror=unused-but-set-variable -Wformat=1 -Wdouble-promotion -Werror=double-promotion -Wbad-function-cast -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -fvisibility=hidden -include visibility.h -mcpu=cortex-m4 -mthumb -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard -nodefaultlibs -nostdlib -Os -fno-strict-aliasing -fomit-frame-pointer -funsafe-math-optimizations -ffunction-sections -fdata-sections -fno-strength-reduce -fno-builtin-printf -c romfs.o.c -o romfs.o.c.o
2)/usr/bin/arm-none-eabi-ld -r -o romfs.o.bin.o romfs.o.c.o -b binary romfs.bin
3)/usr/bin/arm-none-eabi-nm -p –radix=x romfs.o.bin.o
最后一步期望stdout输出romfs.bin的大小。实际却是在这里出错。
尝试手动把脚步的步骤执行一遍:
1)创建一个空的 romfs.o.c文件,对应脚步如下
2)调用以上命令
结果在执行arm-none-eabi-ld命令时出现Segmentation fault (核心已转储)错误!,查了一下 arm-none-eabi-gcc版本是6.2.0,比较新的阿!
接着使用PC的gcc ld nm命令替代 arm-none-eabi的,在PC上对比测试,发现没有问题。NND,不用想了,就是 arm-none-eabi编译器问题。上 arm-none-eabi官网下载最新的编译器(https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads),解压文件放到/usr/bin目录下,并把最新的 arm-none-eabi的命令路径放入PATH变量中(例如:PATH=$PATH:/usr/bin/gcc-arm-none-eabi-6-2017-q1-update/bin )
重新编译,解决OK了!
接着改变当前用户的权限:
sudo usermod -a -G dialout $USER
把固件再烧录一次,这次串口有输出了!但是乱码。。。。
修改rcS启动文件
Firmware/ROMFS/px4fmu_common/init.d/rcS
else
# Start MAVLink
#mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
# Start USB shell if no microSD present, MAVLink else
if [ $LOG_FILE == /dev/null ]
then
# Try to get an USB console
nshterm /dev/ttyACM0 &
else
mavlink start -r 800000 -d /dev/ttyACM0 -m config -x
fi
fi
再编译烧录,这次nsh提示符出现,输入ls命令响应正常。完美!