前言
其实应该有个序章对fprime这个玩意进行介绍,但是我现在还不知道fprime到底怎么部署,能干啥,所以先从安装和tutorials开始写,记录下一些坑
安装过程
官方教程
官方教程是使用python的venv进行虚拟环境管理的,具体按照官方教程操作应该就可以了(虽然我没有试过),官方安装教程在docs/install.md下。我自己安装的环境比较特殊,因此记录下几个坑。
安装的依赖如下:
- Linux or Mac OS X operating system (or Windows Subsystem for Linux on Windows)
- CMake 3.5 or newer https://cmake.org/download/. CLI tool must be available on system path.
- Bash or Bash compatible shell
- CLang or GCC compiler
- Python 3.5+ and PIP https://www.python.org/downloads/
- Python Virtual Environment * (pip install venv or pip install virtualenv)
如果想要在系统路径下进行安装的话,需要确保系统的/usr/bin/python的软链接是指向python3.x的。
安装过程
我自己的安装环境如下,比较特殊,主要还是conda和ros的问题
- kubuntu 18.04(x64)
- cmake 3.10
- ros1 melodic 和 ros2
- anaconda(用于配置虚拟环境)
conda和ros冲突问题
conda和ros会出现冲突,我个人遇到的问题有以下几个:
- 如果在bashrc中有conda环境变量的初始化,那么你初始的python是指向conda的base的
- 在conda中调用opencv,会指向ros的opencv
使用conda创建虚拟环境并安装
安装conda的操作就略过了,首先创建一个虚拟环境
conda create -n fprime python=3.7
conda activate fprime
然后对必要包进行升级
pip install --upgrade wheel setuptools pip
然后就直接pip安装fprime包即可,我这里和官方的稍有不同
cd fprime
cd Fw/Python
python setup.py install
cd ../Gds
python setup.py install
先转到你clone的根目录,然后转到Fw/Python,然后再转到Gds安装
一个坑点
这个坑我现在也不知道为什么,但硬是通过强制方式使其编译成功了
原文如下:
Testing F Autocoder Installation Via Building Ref Application:
cd Ref
fprime-util generate
fprime-util build --jobs "$(nproc ||printf '%s\n' 1)"
就是通过cmake生成可执行文件测试是否安装成功,就这三行代码,我硬是装了半天
- 首先第一个问题:fprime-util generate失败
这个问题的具体输出我忘记了,应该是缺某些包,好像是flask,解决措施如下:
rm -rf build-fprime-xxxxx
conda install Flask
fprime-util generate
首先要删除cmake产生的build文件夹,否则会提示你clean-up,然后安装必要包
但使用pip install的话有些包的依赖没法安装,会报错,所以用conda直接安装
最后generate即可
- 第二个问题:encode报错
这个问题就比较迷了,因为python3默认的编码方式是utf-8,理论上不应该出现这个问题,但它还是出现了,错误描述如下:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1156-1157: ordinal not in rang
这里我按照网上教程去设置python的默认编码方式仍然是这个错误,也设置了环境变量为utf-8,但还是一样,因此不应该是这个的问题。
我的语言设置如下
(fprime) lin@lin-SVP1122A1J:~/桌面/FPrime/Ref$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:zh
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8
所以我一行行找问题,问题最后定位在Cheetah3这个包的某个文件,文件名为:
envs/fprime/lib/python3.7/site-packages/Cheetah3-3.2.6.post1-py3.7-linux-x86_64.egg/Cheetah/Template.py
最后直接修改了Cheetah3的源文件,强制设置utf-8编码,大概在779行左右,源码如下:
outputEncoding = 'ascii'
compiler = None
if useCache and cacheHash and cacheHash in klass._CHEETAH_compileCache:
cacheItem = klass._CHEETAH_compileCache[cacheHash]
generatedModuleCode = cacheItem.code
else:
compiler = compilerClass(source, file,
moduleName=moduleName,
mainClassName=className,
baseclassName=baseclassName,
mainMethodName=mainMethodName,
settings=(compilerSettings or {}))
if commandlineopts:
compiler.setShBang(commandlineopts.shbang)
compiler.compile()
generatedModuleCode = compiler.getModuleCode()
outputEncoding = compiler.getModuleEncoding()
#--------------------------加入强制设置编码方式-----------------#
outputEncoding = 'utf8'
#-------------------------end of update---------------------------#
if not returnAClass:
# This is a bit of a hackish solution to make sure
# we're setting the proper encoding on generated code
# that is destined to be written to a file.
if not outputEncoding == 'ascii':
generatedModuleCode = generatedModuleCode.split('\n')
generatedModuleCode.insert(
1, '# -*- coding: %s -*-' % outputEncoding)
generatedModuleCode = '\n'.join(generatedModuleCode)
return generatedModuleCode.encode(outputEncoding)
估计问题就是在cheetah3调用时设置的编码方式默认为ascii导致的问题,所以我直接强制设置了,设置完成后build就很顺利到100%
- 第三个问题:flask报错
nmd,又是flask,这个是在执行最后一个命令发生的,命令为:
fprime-gds -g html -r build-artifacts
错误为:
ImportError: cannot import name 'secure_filename' from 'werkzeug' (/home/lin/anaconda3/envs/fprime/lib/python3.7/site-packages/werkzeug/__init__.py)
这个是可以搜到解决方案的,解决方案如下:
https://blog.csdn.net/sinat_28521487/article/details/105727870
如果找不到flask_uploads.py,可以在虚拟环境的dist-package下键入:
find . -name "flask*.py"
然后编辑即可
最后的效果如图:
总结
md,一行命令一个bug,我现在都不知道是不是因为是我的环境太奇葩还是nasa这帮人压根当这个是beta版,麻了