硬件环境:ARM A53内核 开发板 +ubuntu12.04 arm版本 +ROS hydro 系统更新博客时间: 2017-06-15
一、在开发板上安装ubuntu12.04操作系统
我的板子为s5p6818,当初找ubuntu12.04根文件系统很是困难,不过后来终于在一个论坛中找到了。
如果板子和我的一样,可以参考这个系统:
链接: https://pan.baidu.com/s/1miRxkZe 密码:2kke
切记,ubuoot一定要移植和自己板子合适的,否则无法启动。
我的做法是,先将整个系统移植到板子上,最后再把uboot替换为板子厂家给的 ubootpak.bin。
不同的开发板用的的系统一般都需要根据不同情况进行修改,一个系统不可能适合所有的板子,所以
我在这里就不再赘言了。
移植好系统之后,下一步就要安装ros系统了。
二、安装 ROS hydro 系统
0)首先应该确保你的系统名称为ubuntu,类似下面这样
命令行输入 cat /etc/lsb-release 查看系统版本信息
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=raring
DISTRIB_DESCRIPTION="Ubuntu 12.04"
1) 本地设置:
sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES=POSIX
2)设置sources.list
不同ubuntu版本的sources.list也不相同。
Ubuntu 13.04 (Raring armhf):
sudo sh -c 'echo "deb http://packages.namniart.com/repos/ros raring main" > /etc/apt/sources.list.d/ros-latest.list'
Ubuntu 12.10 (Quantal armhf):
sudo sh -c 'echo "deb http://packages.namniart.com/repos/ros quantal main" > /etc/apt/sources.list.d/ros-latest.list'
Ubuntu 12.04 (Precise armhf):
sudo sh -c 'echo "deb http://packages.namniart.com/repos/ros precise main" > /etc/apt/sources.list.d/ros-latest.list'
3) 设置Keys
wget http://packages.namniart.com/repos/namniart.key -O - | sudo apt-key add -
4) 安装ros hydro
首先应该保证你系统中的软件处于最新的版本
sudo apt-get update
sudo apt-get upgrade
然后安装:
sudo apt-get install ros-hydro-ros-base
安装rosdep:
sudo apt-get install python-rosdep
sudo rosdep init
rosdep update
安装 python-rosinstall:
sudo apt-get install python-rosinstall
5)设置环境变量
echo "source /opt/ros/hydro/setup.bash" >> ~/.bashrc
source ~/.bashrc
ROS官网有详细的教程,见:
http://wiki.ros.org/hydro/Installation/UbuntuARM (Hydro版本)
http://wiki.ros.org/indigo/Installation/UbuntuARM (Indigo版本)
三、编译源码rgbdslam
编译rdbdslam是一个重头活,在此过程中遇到的问题很多,各种失败和打击也是接踵而来。
前车之鉴,所以我将我遇到的问题一一列举出来,以供参考:
在ARM上编译的过程和在电脑上的基本一致,参见我的另一篇博文:
http://blog.csdn.net/hhrock/article/details/65629037
只需将文中的indigo改为hydro即可。
1) 执行catkin_make后出现:
c++: internal compiler error: Killed (program cc1plus)c++: internal compiler error: Killed (program cc1plus) c++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preprocessed source if appropriate. See
这说明你的板子没有足够的内存去开多个线程编译代码,解决办法:
catkin_make -j1
开一个线程慢慢编译。
2)
/opt/ros/hydro/include/opencv2/flann/logger.h:73:9: note: the mangling of 'va_list' has changed in GCC 4.4
/home/ninetripod/rgbdslam_catkin_ws/src/rgbdslam_v2-hydro/src/misc.cpp: In function
'QMatrix4x4 g2o2QMatrix(g2o::SE3Quat)':
/home/ninetripod/rgbdslam_catkin_ws/src/rgbdslam_v2-hydro/src/misc.cpp:100:52:
error: invalid static_cast from type 'Eigen::PlainObjectBase >:
:Scalar* {aka double*}' to type 'float*'
make[2]: *** [rgbdslam_v2-hydro/CMakeFiles/rgbdslam.dir/src/misc.o] Error 1
make[1]: *** [rgbdslam_v2-hydro/CMakeFiles/rgbdslam.dir/all] Error 2
make: *** [all] Error 2src/rgbdslam_v2-hydro/src/rgbdslam_v2-hydro/src/misc.h:44src/misc.h:44
出现此问题大概是qreal定义的问题,我猜想。
这个问题困扰了我很久,最后经过尝试,终于解决。
我的办法是:
在/usr/include/qt4/QtGui/qmatrix4x4.h 头文件中,添加一个QMatrix4x4(const double *values);的重载函数。
sudo vi /usr/include/qt4/QtGui/qmatrix4x4.h +68
class Q_GUI_EXPORT QMatrix4x4
{
public:
inline QMatrix4x4() { setToIdentity(); }
explicit QMatrix4x4(const qreal *values);
inline QMatrix4x4(const double *values);//2017-06-12 11:36
inline QMatrix4x4(qreal m11, qreal m12, qreal m13, qreal m14,
qreal m21, qreal m22, qreal m23, qreal m24,
qreal m31, qreal m32, qreal m33, qreal m34,
qreal m41, qreal m42, qreal m43, qreal m44);
template
explicit QMatrix4x4(const QGenericMatrix& matrix);
QMatrix4x4(const qreal *values, int cols, int rows);
QMatrix4x4(const QTransform& transform);
QMatrix4x4(const QMatrix& matrix);
.......
}
并在qmatrix4x4.h 中实现。
sudo vi /usr/include/qt4/QtGui/qmatrix4x4.h +212
//2017-06-12 11:39
QMatrix4x4::QMatrix4x4(const double *values)
{
for (int row = 0; row < 4; ++row)
for (int col = 0; col < 4; ++col)
m[col][row] = values[row * 4 + col];
flagBits = General;
}
vi rgbdslam_catkin_ws/src/rgbdslam_v2-hydro/src/misc.cpp +100
将 QMatrix4x4 qmat( static_cast<qreal*>( m.data() ) );
改为 QMatrix4x4 qmat( static_cast<double*>( m.data() ) );
同样
vi rgbdslam_catkin_ws/src/rgbdslam_v2-hydro/src/misc.h +43 +44
将 Eigen::Matrix<qreal, 4, 4, Eigen::RowMajor> m = transf.matrix();
QMatrix4x4 qmat( static_cast<qreal*>( m.data() ) );
改为Eigen::Matrix<double, 4, 4, Eigen::RowMajor> m = transf.matrix();
QMatrix4x4 qmat( static_cast<double*>( m.data() ) );
3)
CMakeFiles/rgbdslam.dir/src/moc_qt_gui.o:(.data.rel.ro+0xc0): undefined reference to `QWidget::qwsEvent(QWSEvent*)' CMakeFiles/rgbdslam.dir/src/moc_glviewer.o:(.data.rel.ro+0xc0): undefined reference to `QWidget::qwsEvent(QWSEvent*)' collect2: ld returned 1 exit status make[2]: *** [/home/ninetripod/rgbdslam_catkin_ws/devel/lib/rgbdslam/rgbdslam] Error 1 make[1]: *** [rgbdslam_v2-hydro/CMakeFiles/rgbdslam.dir/all] Error 2 make: *** [all] Error 2
对于这个错误,可以去搜索一下MOC_QT这个关键字。
“ moc 全称是 Meta-Object Compiler,也就是“元对象编译器”。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc 的执行是在预处理器之前。因为预处理器执行之后,Q_OBJECT 宏就不存在了。”
我尝试了很多办法都无法解决这个报错,并且在hydro中根本就搜不到qwsEvent这个关键字。
在qt头文件中倒是搜到了,这时我有一个大胆的想法:
sudo vi /usr/include/qt4/Qt/qwidget.h +703
sudo vi /usr/include/qt4/QtGui/qwidget.h +703
将这两行注释掉,于是问题得到解决。
总结:在ARM上编译这个代码一共花费了我将近一个月的时间,整体简直苦不堪言,
还好最后终于编译成功,结局倒不是很悲伤~
参考文章:
https://github.com/felixendres/rgbdslam_v2/issues/17
http://answers.ros.org/question/243448/qt4-errors-when-compiling-rgbdslam_v2-on-the-jetson-tk1/