突然心血来潮,想在rk1808中跑ros,当前 rk1808跑的是buildroot编译的精简linux系统,也不想换debian9,就开始痛苦的过程…………
在rockchip_rk1808_defconfig文件中增加ros_kinetic.config(这个是按照官方的rk3399编译ros时一样的操作),然后就会遇到经典的问题:
error: option --single-version-externally-managed not recognized
很坑的问题,我卡在这两三天,网上说是安装setuptools,wheel什么的,都没啥用,这个问题是python-empy-3.3.3,在配置时使用setuptools进行安装,但是这个版本的setup.py文件,是使用distutils来安装的,所以要在配置文件python-empy.mk中修改安装方式:
################################################################################
#
# python-empy
#
################################################################################
PYTHON_EMPY_VERSION = 3.3.3
PYTHON_EMPY_SITE = http://www.alcyone.com/software/empy
PYTHON_EMPY_SOURCE = empy-$(PYTHON_EMPY_VERSION).tar.gz
PYTHON_EMPY_LICENSE = LGPL-3.0
PYTHON_EMPY_LICENSE_FILES = LICENSE.txt
#PYTHON_EMPY_SETUP_TYPE = setuptools
PYTHON_EMPY_SETUP_TYPE = distutils
$(eval $(host-python-package))
编译过程中,遇到tinyxml2问题:
[module] calib_xml
In file included from calibdb.cpp:26:0:
/files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/build/camera_engine_rkisp-1.0/rkisp/ia-engine/calib_xml/../include/calib_xml/calibdb.h:21:22: fatal error: tinyxml2.h: No such file or directory
#include <tinyxml2.h>
提示找不到tinyxml2.h头文件,是由于IS_NEED_COMPILE_TINYXML2为false,不编译tinyxml2组件导致,查找:camera_engine_rkisp.mk文件,
ifeq ($(BR2_PACKAGE_TINYXML2),y)
CAMERA_ENGINE_RKISP_CONF_OPTS = \
IS_NEED_COMPILE_TINYXML2=false
endif
改成:
ifeq ($(BR2_PACKAGE_TINYXML2),y)
CAMERA_ENGINE_RKISP_CONF_OPTS = \
IS_NEED_COMPILE_TINYXML2=true
endif
pyparsing问题,提示如下:
ImportError: "from catkin_pkg.package import parse_package" failed: No module named pyparsing!
Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
CMake Error at cmake/safe_execute_process.cmake:11 (message):
原因是没有安装pyparsing组件至host,解决方式是把pyparsing安装到host即可,修改的地方如下:
1.在package/python-pyparsing/中增加Config.in.host,文件内容为(我复制catkin_pkg的文件内容然后 修改的):
config BR2_PACKAGE_HOST_PYTHON_PYPARSING
bool "pyparsing host tool for ROS"
depends on BR2_PACKAGE_PYTHON_ROS_SET
select BR2_PACKAGE_HOST_PYTHON_CATKIN_PKG
help
A CMake-based build system that is used to build all packages in ROS
2.在 python-pyparsing.mk文件中增加:
$(eval $(host-python-package))
3.添加至列表文件Config.in.host,这个文件在buildroot/package/里,添加最后一行:
source "package/python-pyparsing/Config.in.host"
4.在package/rockchip/ros/catkin/文件夹,修改Config.in.host文件:
config BR2_PACKAGE_HOST_CATKIN
bool "catkin host tool for ROS"
depends on BR2_PACKAGE_PYTHON_ROS_SET
select BR2_PACKAGE_HOST_PYTHON_CATKIN_PKG
select BR2_PACKAGE_HOST_PYTHON_PYPARSING
select BR2_PACKAGE_HOST_PYTHON_EM
select BR2_PACKAGE_HOST_PYTHON_EMPY
help
A CMake-based build system that is used to build all packages in ROS
增加依赖:select BR2_PACKAGE_HOST_PYTHON_PYPARSING,当然,要的config/ros_kinetic.config里增加BR2_PACKAGE_HOST_PYTHON_PYPARSING=y
再build.sh就可以通过了。
catkin安装位置问题,catkin安装时,是直接安装到host/opt/ros中的,正确的应该是host/aarch……/sysroot/opt/ros中,修改catkin.mk:
#HOST_CATKIN_CONF_OPTS += -DCMAKE_INSTALL_PREFIX=$(HOST_DIR)$(CATKIN_ROS_DIR)
HOST_CATKIN_CONF_OPTS += -DCMAKE_INSTALL_PREFIX=$(STAGING_DIR)$(CATKIN_ROS_DIR)
em问题,提示如下:
output/rockchip_rk1808/host/bin/python: can't find '__main__' module in '/files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/lib/python2.7/site-packages/em'
CMake Error at cmake/safe_execute_process.cmake:11 (message):
原因是由于执行了em文件夹,没有执行对应的em.py文件,临时处理方式:
查找文件:empy.cmake,修改37行为:
#set(EMPY_SCRIPT "${EMPY_SCRIPT}" CACHE STRING "Empy script" FORCE)
set(EMPY_SCRIPT "${EMPY_SCRIPT}.py" CACHE STRING "Empy script" FORCE)
强制增加文件名,编译通过。
然后 ,错误又来了:
CMake Error at /files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/aarch64-buildroot-linux-gnu/sysroot/opt/ros/kinetic/share/cpp_common/cmake/cpp_commonConfig.cmake:148 (message):
Project 'rostime' tried to find library '-lpthread'. The library is
neither a target nor built/installed properly. Did you compile project
'cpp_common'? Did you find_package() it before the subdirectory containing
its code is included?
Call Stack (most recent call first):
/files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/aarch64-buildroot-linux-gnu/sysroot/opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package)
CMakeLists.txt:4 (find_package)
此类的错误,是由于cmake文件里使用find_package(catkin …… cpp_common)这样的字样,(两天后新发现,这个问题是cpp_commonConfig.cmake里的错误,找到:set(libraries "cpp_common;,里面应该 有个-l-lpthread的内容,把这里替换成libpthread.so所在的绝对路径,就OK了!),后面在class_loader里出现这个错误:
CMake Error at devel/share/class_loader/cmake/class_loaderConfig.cmake:148 (message):
Project 'class_loader' tried to find library '-lpthread'. The library is
neither a target nor built/installed properly. Did you compile project
'class_loader'? Did you find_package() it before the subdirectory
containing its code is included?
这里的class_loaderConfig.cmake为编译时自动生成,没办法修改后再编译(修改后编译时会重新生成),输出调试信息,发现是boost_libraries这个变量里包含了"-lpthread",现在就是想办法把boost中的“-lpthread"修改成"pthread"(因为cpp_common之类的库中都引用了boost,可能之前的这个问题就是由于boost引起的),但是boost没有 Config.cmake类的文件,然后就卡在这里……,晚上12点,找到FindBoost.cmake了,这个文件其实在本机/usr/local/share/cmake-{version}/Modules/里,对应的代码:
# Report Boost_LIBRARIES
set(Boost_LIBRARIES "")
foreach(_comp IN LISTS Boost_FIND_COMPONENTS)
string(TOUPPER ${_comp} _uppercomp)
if(Boost_${_uppercomp}_FOUND)
list(APPEND Boost_LIBRARIES ${Boost_${_uppercomp}_LIBRARY})
if(_comp STREQUAL "thread")
list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif()
endif()
endforeach()
看到这个if了不:
if(_comp STREQUAL "thread")
list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif()
在外部输出:CMAKE_THREAD_LIBS_INIT,值就是-lpthread。
来个粗暴的操作:
# Report Boost_LIBRARIES
set(Boost_LIBRARIES "")
foreach(_comp IN LISTS Boost_FIND_COMPONENTS)
string(TOUPPER ${_comp} _uppercomp)
if(Boost_${_uppercomp}_FOUND)
list(APPEND Boost_LIBRARIES ${Boost_${_uppercomp}_LIBRARY})
if(_comp STREQUAL "thread")
# list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
list(APPEND Boost_LIBRARIES "pthread")
endif()
endif()
endforeach()
编译通过……(这个问题应该是搞了三天,好久没这么苦逼了……)
ps:这个Boost的版本是1.66.0的,不知道是不是个bug,白天到公司,看了一下环境,cmake-3.10中的FindBoost.cmake,对应的代码是正确的:
# ------------------------------------------------------------------------
# Notification to end user about what was found
# ------------------------------------------------------------------------
set(Boost_LIBRARIES "")
if(Boost_FOUND)
if(NOT Boost_FIND_QUIETLY)
message(STATUS "Boost version: ${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
if(Boost_FIND_COMPONENTS)
message(STATUS "Found the following Boost libraries:")
endif()
endif()
foreach( COMPONENT ${Boost_FIND_COMPONENTS} )
string( TOUPPER ${COMPONENT} UPPERCOMPONENT )
if( Boost_${UPPERCOMPONENT}_FOUND )
if(NOT Boost_FIND_QUIETLY)
message (STATUS " ${COMPONENT}")
endif()
list(APPEND Boost_LIBRARIES ${Boost_${UPPERCOMPONENT}_LIBRARY})
endif()
endforeach()
还有错,编译 std-msgs时,提示错误:
interpreter = em.Interpreter(output=ofile, globals=g, options={em.RAW_OPT:True,em.BUFFERED_OPT:True})
AttributeError: 'module' object has no attribute 'Interpreter'
这个时候,到host/lib/python2.7/site-packages/下删除em相关的文件夹和egg.info,这里注意,em.py和em.pyc两个文件不要删除。如果这里还有问题,那就是可能 empy并没有安装成功,因为cat empy-3.3.3-py2.7.egg-info时,内容是错误的,是因为emlib.py不存在,要把setup.py中的emlib删除掉。再压缩成empy-3.3.3.tar.gz,./build.sh,然后 就是重新解压……安装。这样操作后,这个egg-info里就是正常的内容了。
好了,之前修改empy.cmake的后遗症来了,编译actionlib-msgs时出错:
/files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/aarch64-buildroot-linux-gnu/sysroot/opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:20 (include)
CMakeLists.txt:5 (find_package)
This warning is for project developers. Use -Wno-dev to suppress it.
-- Found PY_em: /files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/usr/lib/python2.7/site-packages/em.pyc
-- Using empy: /files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/host/usr/lib/python2.7/site-packages/em.pyc.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /files/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub/buildroot/output/rockchip_rk1808/build/actionlib-msgs-1.11.9/actionlib_msgs/test_results
-- Found gtest: gtests will be built
-- Using Python nosetests: /home/cubar/anaconda3/bin/nosetests
-- catkin 0.7.14
CMake Error at CMakeLists.txt:8 (add_message_files):
Unknown CMake command "add_message_files".
-- Configuring incomplete, errors occurred!
Using empy这里,多了.py,得到
sysroot/opt/ros/kinetic/share/catkin/cmake
里把empy.cmake改回来。
Image: image in rockdev is ready
Make image ok!
Make update.img
start to make update.img...
Android Firmware Package Tool v1.65
------ PACKAGE ------
Add file: ./package-file
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/parameter.txt
Add file: ./Image/trust.img
Add file: ./Image/uboot.img
Add file: ./Image/misc.img
Add file: ./Image/boot.img
Add file: ./Image/recovery.img
Add file: ./Image/rootfs.img
Add file: ./Image/oem.img
Add file: ./Image/userdata.img
Add CRC...
Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making update.img OK.
/tools/rk1808-tb-96aiot-sdk-codes20200605/rk1808gitgithub
Make update image ok!
终于搞定,花了大概一个星期的时间,后面就是刷机,写ROS程序的事了。