基于RK3308的ROS运行环境搭建和交叉编译

固件编译环境

准备工作

除了系统要求外,还有其他软硬方面的要求。

64 位系统
硬盘空间大于 40G,如果您进行多个构建,将需要更大的硬盘空间。
推荐使用Ubuntu 16.04 的系统进行编译。其他版本没有具体测试,可能需要对软件包做相应调整。
(此处使用的是Ubuntu14.04,因为ROS的indigo版本需要运行在Ubuntu14.04环境下)

软件包安装

·操作系统安装好后,且用户已自行配置好网络环境,则可继续如下步骤完成相关软件包的安装。

$ sudo apt-get update

·安装 Kernel 及 U-Boot 编译需要依赖的软件包

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev \
libxml2-utils xsltproc unzip device-tree-compiler

·安装 Buildroot 编译需要依赖的软件包

sudo apt-get install libfile-which-perl sed make binutils gcc g++ bash \
patch gzip bzip2 perl tar cpio python unzip rsync file bc libmpc3 \
git repo texinfo pkg-config cmake tree

/**************************************************************************************************/
(注意:在ubuntu18.04版本可以直接下载repo软件包,但是在ubuntu14.04版本下无法下载,下面是解决办法)
Ubuntu14.04之后,repo安装在这里:sudo apt-get install phablet-tools

但是安装完之后,还是提示没有安装repo,接下来进行下面的操作

mkdir ~/bin
PATH=~/bin:$PATH
git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
git-repo/repo ~/bin/

编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:

REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'

建立一个名为android_source的工作目录:(可以跳过此步骤,工作目录直接是home目录)

mkdir android_source
cd android_source/

设置git邮箱和用户名:(随便填)

git config --global user.email "这里填你的邮箱"
git config --global user.name "这里填你的用户名"

如果没有设置git用户邮箱和用户名,运行下面初始化仓库的命令是会出现错误提示
初始化仓库

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest 

出现下面画面表示前面的步骤成功(也有可能步骤没错,但还是出了问题,下面说到):
在这里插入图片描述
如果出现下面的提示,导致初始化失败:
在这里插入图片描述
这大概是网络的原因,把上面那条初始化命令再跑几次试一下,就成功了。就我的经验而言,有时候没有出现上面的网络问题,有时候把repo init初始化命令再跑一遍就行,还试过跑几次才成功的。

同步源码树:(此处占用内存非常大,经过验证,对于本项目来说没用,可以不进行此步操作,只用repo init 就可以了)
repo sync
/**************************************************************************************************/
·必要工具安装

sudo apt install genext2fs

注意:编译若遇到报错,可以视报错信息,安装对应的软件包。

交叉编译工具链介绍

鉴于 Rockchip Buildroot SDK 目前只在 Linux 下编译,我们也仅提供了 Linux 下的交叉编译工具链。其中 U-Boot 及 Kernel 使用的编译工具链预置目录在 prebuilt/gcc下,buildroot 使用该开源软件中编译出来的工具链。

U-Boot 及 Kernel 编译工具链
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

对应版本
gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)

Buildroot 编译工具链
buildroot/output/rockchip_rk3308_release/host/bin/aarch64-rockchip-linux-gnu-

对应版本
gcc version 6.4.0 (Buildroot 2018.02-rc3-00017-g9c68ede)

如果需要其他平台或版本的工具链,需自行编译。

下载 SDK

由于 SDK 比较大,我们提供了一个打包好的.git以供下载:
Firefly-RK3308_Linux_SDK
下载完成后先验证一下 MD5 码:

md5sum Firefly-RK3308_Linux_SDK_git_20181008.7z
3800278cc016d117eec8c0381ba66769  Firefly-RK3308_Linux_SDK_git_20181008.7z

确认无误后,就可以解压:

mkdir -p ~/prj/Firefly-RK3308
cd ~/prj/Firefly-RK3308
7zr x Firefly-RK3308_Linux_SDK_git_20181008.7z
git reset --hard

解压出来的SDK,已经默认添加远程仓库

git remote -v
gitlab	https://gitlab.com/TeeFirefly/rk3308-linux.git (fetch)
gitlab	https://gitlab.com/TeeFirefly/rk3308-linux.git (push)

以后就可以直接从 gitlab 处更新:

git pull gitlab firefly:firefly

SDK 目录结构

在这里插入图片描述
在这里插入图片描述

全自动编译脚本

为了提高编译的效率,降低人工编译可能出现的误操作,该 SDK 中集成了全自动化编译脚本,方便固件编译、备份。
该全自动化编译脚本原始文件存放于:

device/rockchip/common/build.sh

在SDK根目录创建了相应软链接build.sh。
可通过修改 device/rockchip/rk3308/BoardConfig.mk 脚本中的特定变量,以编出对应产品固件
在这里插入图片描述
执行自动编译脚本:

./build.sh

该脚本会自动配置环境变量,并自动编译 U-Boot,编译 Kernel,编译Buildroot,编译 Recovery 继而生成固件。
(关于编译的详细教程,请参考RK3308官方wiki教程
http://wiki.t-firefly.com/ROC-RK3308-CC/sdkbuilding.html#kai-fa-huan-jing-da-jian
注意:
此处一直编译失败,官网教程推荐ubuntu16.04及以上版本。可能是版本不同,功能包不同,无论如何也无法编译通过,经过大量尝试与在线搜索,偶然间安装了conda(开源软件包管理系统和环境)发现可以编译通过了。
后续有时间再详细验证,反正现在能用了,就接着往下走,不浪费时间。
注意:
在这里插入图片描述
执行该命令后,重新编译又编译不过,重复编译了好多次,又编译通过了,暂时不知道什么原因,暂时只能不停重新编译,直到通过为止。

注意:注意交换分区,不添加交换分区会导致出错

烧写镜像文件

请参照《升级固件》来烧写分区映像文件。

问题:后来又重新编译了一次,但是怎么也检测不到ADB设备,很奇怪
无奈只能用ubuntu18.04重新编译了一个固件使用

第一步,编译固件(ubuntu18.04环境)

编译流程:参考RK3308wiki教程

编译前需要做的其他工作:
1、更换根文件系统,默认的根文件系统是只读的
2、加载开发板SSH驱动
3、添加关于ROS的python支持包
4、加载adb驱动
5,可以删除一些不必要的驱动,以减小固件大小,不知道可以省略此步骤。

更换根文件系统,默认的根文件系统只读的

fs-overlay
默认编译出来根文件系统,有些配置文件可能不能满足客制化需求,这时候 fs-overlay 就能排上用场,fs-overlay 目录会在编译的最后阶段替换到文件系统目录,打包进根文件系统。 fs-overlay路径由默认配置文件指定:
BR2_ROOTFS_OVERLAY=“board/rockchip/rk3308/fs-overlay”
Rootfs 切换为 ext2
Rootfs 可配置为可读写 ext2 文件系统,方便系统调试使用。
修改 Kernel 中 bootargs 配置:
在这里插入图片描述
在这里插入图片描述
如图所示,替换bootargs。

bootargs = "earlycon=uart8250,mmio32,0xff0c0000 swiotlb=1 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rootfstype=ext2 rootwait";

修改 device/rockchip/rk3308/rockimg/对应的 parameter 文件,确保 rootfs 分区大小足够存放分区镜像。
(此处我不知道怎么修改,暂时没修改,但是没影响运行,就没管,哈哈哈,希望能遇到大神指点)
修改 device\rockchip\rk3308\BoardConfig.mk 中 rootfs 文件系统类型:
在这里插入图片描述
rootfs 分区 ext2 文件系统镜像会自动打包生成,也可以直接在以下路径获取:
buildroot/output/firefly_rk3308_release/images/rootfs.ext2

加载开发板SSH驱动

开发板通过串口调试,无法打开多个终端,可以使用SSH服务,能够同时打开多个窗口,方便调试。而且可以在电脑和开发板之间上传和下载文件。
一、SSH原理:
自己百度
二、PC端SSH客户端安装(3种方法)
1,可以使用putty
2,可以直接使用windows终端窗口
3,ubuntu下需要安装ssh :sudo apt-get install openssh-client
三、开发板安装ssh服务器(dropbear)
一般默认安装了。
本人使用的板子没有安装,需要从新编译系统
打开RK3308wiki教程,进入Buildroot开发,根据步骤打开根目录下的menuconfig,然后全局搜索dropbear,勾选上
然后回到主目录,进行编译,打包,然后升级固件

开发板连接上串口助手,显示下面的消息,代表安装成功
在这里插入图片描述
四、启动dropbear,默认后台运行
在这里插入图片描述
五、客户端
在这里插入图片描述
在这里插入图片描述
六、可能出现的错误
一、文件系统只读权限,无法修改root密码
第一步,进入kernal,打开menuconfig,在file system里面找到openfly的支持,勾选上。
第二步,参考更换根文件系统教程
二、无法登陆

#ssh root@192.168.188.55
root@192.168.188.55's password: (这里输入密码)

如果输入正确的密码,但总是登录不成功(在目标板上的终端提示:user ‘root’ has invalid shell, rejected),可能是由于 root 帐号没有设置正确的登录shell。各大多数程序一样,Dropbear 只允许 /etc/passwd 中列举的用户登录,并且在/etc/passwd中该用户需要设置正确的shell(/bin/sh 或 /bin/csh)。有些busybox用的是/bin/bash,所以被Dropbear拒绝了。这里我们使用 /bin/sh 以后,就可以正常登录了。
(本开发板默认是/bin/sh,改为/bin/bash就好了,具体的修改根据不同的开发板,可能不一样,自己尝试)
然后输出passwd 修改密码

开发板打开SSH服务器
Dropbear -E -R -p 2222
PC主机SSH远程登陆Ubuntu开发板
Ssh username@192.168.43.252 -p 2222
下面的操作不需要登陆SSH服务器
PC主机将文件/文件夹从远程ubuntu开发板拷贝至本地
Scp -r username@192.168.43.252:/home/username/1.txt ./
将文件/文件夹从本地拷贝至远程ubuntu开发板
Scp -r localfile.txt username@192.168.43.252:/home/username

添加关于ROS的python包

默然编译不带ROS支持的相关python包,运行的时候报错:找不到python
在这里插入图片描述
打开虚拟机,先source一下环境,否则无法打开 make menuconfig
在这里插入图片描述
然后打开menuconfig
在这里插入图片描述
搜索ros
在这里插入图片描述
找到 … for ros 选项,随便点一个进去
在这里插入图片描述
选中catkin_pkg for ros ,编译的时候编译进去
在这里插入图片描述
然后保存,点击save按钮,也可以输入命令make savedefconfig 进行保存

加载adb驱动

优先使用Windows下的ADB调试。尽量不要使用Ubuntu下的ADB调试。因为ubuntu下会运行很多东西,很容易出现端口被占用的情况,导致adb无法打开

ADB,全称 Android Debug Bridge,是 Android 的命令行调试工具,可以完成多种功能,主要有:
运行设备的 shell(命令行)
管理模拟器或设备的端口映射
计算机和设备之间上传/下载文件
将本地 apk 软件安装至模拟器或硬件设备

ADB 是一个“客户端-服务器端”程序,其中客户端主要是指 PC,服务器端是 Android 设备的实体机器或者虚拟机。根据 PC 连接 Box 机器的方式不同,ADB 可以分为两类:

网络 ADB:主机通过有线/无线网络(同一局域网)连接到硬件设备
USB ADB:主机通过 USB 线连接到硬件设备

为了在ROC-RK3308-CC也能使用ADB工具进行调试,我们移植了adb服务。但由于并非Android设备,很多adb命令类似adb logcat、adb install等不能使用,仅作为普通的调试辅助工具,可以进行shell交互、上传下载文件等操作。同样,网络远程ADB调试不能使用。
/************************************************************************************************************/
Buildroot 配置
Buildroot配置:BR2_PACKAGE_DUERCLIENTSDK
$ make menuconfig
进入图形选择界面,输入 /,跳出搜索界面如下,输入BR2_PACKAGE_DUERCLIENTSDK,按回车进行搜索
在这里插入图片描述
在这里插入图片描述
选择[1],然后按空格选择上 dueros_client_sdk
在这里插入图片描述
前面有 [ * ] 号,表示已经选上,然后< Save >保存,并< Exit >退出图形界面,输入配置保存命令:

$ make savedefconfig

保存配置,不保存的话,会在一键编译脚本中被重置
准备连接
ROC-RK3308-CC 只能使用USB ADB功能,使用USB ADB有以下限制:

只支持 USB OTG 口
不支持多个客户端同时使用(如 cmd 窗口,eclipse 等)
只支持主机连接一个设备,不支持连接多个设备

用 USB Type-C 线连接设备和主机,运行adb devices命令,如果显示机器的序列号,表示连接成功。

Windows下的 ADB 安装

首先参照安装 RK USB 驱动一节安装好驱动。然后下载 adb.zip,解压到 C:\adb 以方便调用。
打开命令行窗口,输入:

cd C:\adb
adb shell

如果一切正常,就可以进入adb shell,在设备上面运行命令。
常用 ADB 命令
连接管理

列出所有连接设备及其序列号 $ adb devices

如果有多个连接设备,通过以下命令,使用序列号来区分: $ export ANDROID_SERIAL=<序列号> $ adb shell
ls

进入设备的 shell $ adb shell $ eixt 退出

从电脑上传文件到设备 $ adb push <本地路径> <远程路径>

从设备下载文件到电脑 $ adb pull <远程路径> <本地路径> 暂不支持网络 adb 调试。

获取详细运行信息 adb bugreport adb bugreport 用于错误报告,里面包含大量有用的信息。 示例: $ adb
bugreport 保存到本地,方便用编辑器查看 $ adb bugreport >bugreport.txt

命令行帮助信息 adb help
注意:并不是所有命令都能使用,帮助信息只做参考

可以删除一些不必要的驱动,以减小固件大小,不知道可以省略此步骤。

搜索audio带Y的都取消了
在这里插入图片描述
取消不必要的模块编译
在这里插入图片描述
这个页面下的东西我全取消了

第二步,搭建交叉编译环境(ubuntu14.04环境)

1、PC端安装ROS
2、开发板刷入官方给的ROS固件
3、安装nfs服务,用于传输文件
4、开发板升级固件后,将indigo文件夹和usr/lib文件夹拷贝出来
5、将setup.sh和wifi.sh拷贝出来
6、将PC端/opt/ros/indigo 替换为丁工发给我的indigo-64,并改名字为indigo
7、替换交叉编译工具链
8、编译的时候会报错sysroot文件夹下缺少东西,将丁工发给我的sysroot放到报错的目录下就好了

PC 端(Ubunut主机)安装 ROS

查看ROS所有的发行版本。目前 ROS 最新的版本,也是官方推荐的版本是 ROS Melodic Morenia 。其安装教程官方有很详细的介绍,需要注意的是,不同的Ubuntu版本,对应安装不同的 ROS 版本,例如 ROS Melodic Morenia 主要针对 Ubuntu 18.04 (Bionic) release,而 ROS Indigo Igloo 则针对 Ubuntu 14.04 LTS (Trusty) release。

由于 ROC-RK3308-CC 的 ROS 系统使用的是 ROS Indigo Igloo 版本,所以我们主机这里也安装 ROS Indigo Igloo 版本进行测试,下面的简要安装教程也是主要针对 Ubuntu 14.04 (ROS Indigo),其他版本的安装教程可到官网维基查询。

平台说明

ROS Indigo 仅仅只支持Ubuntu 13.10 (Saucy) 和 Ubuntu 14.04 (Trusty)。这里在 Ubuntu 14.04 系统上安装ROS。
安装步骤

配置Ubuntu仓库
允许”restricted”,”universe”,”multiverse.”。
在这里插入图片描述
设置软件源(可以用)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

或者来自中国的源:(经测试,不能用)

sudo sh -c '. /etc/lsb-release && echo "deb http://ros.exbot.net/rospackage/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

可根据UbuntuMirrors自己选。
添加key

Sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 
--recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

安装
1、更新软件索引:

sudo apt-get update

2、安装:
这里推荐 Desktop-Full 安装: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators and 2D/3D perception。

sudo apt-get install ros-indigo-desktop-full

3、初始化 rosdep:
使用ROS之前,需要初始化rosdep,以解决一些系统依赖问题。

sudo rosdep init
rosdep update

4、环境配置

echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

5、推荐安装 rosinstall,一个非常好用的命令行工具

sudo apt-get install python-rosinstall

开发板刷入官方给的ROS固件

固件地址: ROC-RK3308-CC_Yocto_ROS下载完固件以后解压
在这里插入图片描述
打开开发工具,选中对应的景象进行升级
在这里插入图片描述

安装nfs服务,用于传输文件

Pc端安装nfs服务

1、安装NFS相关组件
Sudo apt-get install nfs-kernel-server
安装完nfs服务器之后,我们需要建立一个与下位机挂接的共享文件夹
2、建立NFS共享文件夹
Sudo mkdir -R /mnt/nfs
3、设置共享目录 修改主机/etc/exports 文件,添加如下代码
/mnt/nfs *(rw,sync,no_root_squash)
Rw : 可读写的权限 ro :只读权限
No_root_squash :NFS客户端分享目录使用者的权限,即如果客户端使用的是root用户,那么对于这个共享目录而言,改客户端就具有root的权限,若是以NFS挂载根文件系统时 ,必须设置此项
Sync :资料同步写入到内存与硬盘
Async:资料会先暂存于内存当中,而非直接写入硬盘设置完共享文件夹之后需要重启NFS服务器
4、服务器操作命令
Sudo service portmap restart / sudo service rpcbind restart
Sudo service nfs-kernel-server restart
5、测试
首先,我们可以使用如下命令查看所建立的共享文件夹 showmount -e 如果看到显示:Export list for ubuntu:/mnt/nfs * 则表示主机设置成功

开发板安装nfs服务

幸运的是,官方提供的ROS固件,已经默认安装了NFS服务,只需要启动就可以
Mount -t nfs -o nolock 192.168.43.64:/mnt/nfs/ /mnt/nfs
说明:这里的ip地址是PC主机的IP地址。第一个/mnt/nfs是PC主机上设置的共享文件夹目录吧,第二个/mnt/nfs是我在ARM开发板上设置的共享文件夹目录.
这条命令执行过以后就实现了ARM开发板和P C机之间的NFS网络文件系统挂接。

开发板升级固件后,将indigo文件夹和usr/lib文件夹拷贝出来

将indigo文件夹拷贝出来,将来要放进自己编译的固件里面,用于运行自己编译出来的程序。
自己编译出来的固件会缺少一些库文件,有一些库文件可能在usr/lib下面,所以需要拷贝出来,以备后用

将setup.sh和wifi.sh拷贝出来

Setup.sh需要复制到自己编译的板子里,用于配置ROS环境。
Wifi.sh 用于连接网络

将PC端/opt/ros/indigo 替换为丁工发给我的indigo-64,并改名字为indigo

因为编译的程序要放到开发板上运行,而PC机是X86系统,所以需要替换一些文件。替换前一定记得保存.
进入/opt/ros/目录下,将indigo-64文件夹替换原本的indigo文件夹,名字修改为indigo.
在这里插入图片描述

替换交叉编译工具链

没有指定交叉编译工具链的时候,默认使用x86编译工具链,所以需要指定适用于板子的交叉编译工具链
在这里插入图片描述
因为我是用ubuntu18.04编译的固件,而ros用的是ubuntu14.04.所以我将ubuntu18.04环境下的交叉编译工具链所在的文件夹gcc,压缩后,复制出来,然后拷贝到ubuntu14.04环境下。解压出来。
但是我自己根据官网教程弄出来的交叉编译工具链编译的时候出错,最后丁工给我发了一个交叉编译工具链,可以正常编译。
然后进入到自己创建的ROS功能包里面,
在这里插入图片描述
打开CMakeLists.txt文件,添加指定的交叉编译工具链
在这里插入图片描述
然后保存,Catkin_make 编译
在这里插入图片描述
编译完成,会在/home/yzy/catkin_ws/devel/lib/beginner_tutorials目录下面生成对应的可执行文件,然后拷贝到开发板运行就可以
在这里插入图片描述

编译的时候会报错sysroot文件夹下缺少东西,将丁工发给我的sysroot放到报错的目录下就好了

在这里插入图片描述

第三步,在开发板上运行程序

1、开发板上电,先通过ADB将wifi.sh文件复制到开发板,连接wifi,其他连接方式请查看wifi连接wiki教程
Chmod 777 wifi,sh
./wifi.sh xiaoyuer 123456789
2、在/opt目录下建立ros/indigo文件夹
Mkdir /opt/ros/indigo
Chmod 777 -R /opt/ros (不修改权限无法运行程序)
3、查看/usr/lib文件夹下有没有python2.7文件夹,没有的话创建一个
4、通过ADB,将setup.sh 可执行文件,复制到开发板,将从ROS固件里面拷贝出来的indigo文件夹里面的内容拷贝到/opt/ros/indigo文件夹下。

运行程序的时候如果报错如下图,说明usr/lib/下的python2.7文件夹里面缺少文件,或者没有这个文件夹
将丁工发给我的sysroot文件夹下/usr/lib/下的python2.7拷贝到开发板的usr/lib下的python2.7文件夹里面
在这里插入图片描述
然后再运行程序,会出现下面的错误
在这里插入图片描述
这是因为编译的时候,/opt/ros/indigo/lib 和 /usr/lib 下面缺少一些依赖的库文件,缺少的东西可以在下面的文件夹里面找到
1、从ROS固件里面拷贝出来的usr/lib/下找到
2、从丁工发给我的sysroot/usr/lib下找到
3、从丁工发给我的indigo-64/lib/下找到
4、从indigo-pc/lib/下面找到(indigo-pc是电脑原本indigo替换前的备份)

然后运行(roscore需要至少1GB空间,这里用rosmaster代替)
Rosmaster --core & ./talker & ./listener
但是这里又出现新的问题,./talker & 代表是在后台运行,这个时候ctrl+c无法终止程序,只能使用kill

为了能够打开多个终端,运行多个程序,这里使用ssh服务,在pc机上操作,具体操作步骤请查看ssh血泪教程

/*****************************/
本教程需要用到的文件
后续会上传到百度云盘

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值