除了系统要求外,还有其他软硬方面的要求。
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 比较大,我们提供了一个打包好的.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 中集成了全自动化编译脚本,方便固件编译、备份。
该全自动化编译脚本原始文件存放于:
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重新编译了一个固件使用
编译流程:参考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原理:
自己百度
二、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 [email protected]
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 [email protected] -p 2222
下面的操作不需要登陆SSH服务器
PC主机将文件/文件夹从远程ubuntu开发板拷贝至本地
Scp -r [email protected]:/home/username/1.txt ./
将文件/文件夹从本地拷贝至远程ubuntu开发板
Scp -r localfile.txt [email protected]:/home/username
默然编译不带ROS支持的相关python包,运行的时候报错:找不到python
打开虚拟机,先source一下环境,否则无法打开 make menuconfig
然后打开menuconfig
搜索ros
找到 … for ros 选项,随便点一个进去
选中catkin_pkg for ros ,编译的时候编译进去
然后保存,点击save按钮,也可以输入命令make savedefconfig 进行保存
优先使用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的都取消了
取消不必要的模块编译
这个页面下的东西我全取消了
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放到报错的目录下就好了
查看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
固件地址: ROC-RK3308-CC_Yocto_ROS下载完固件以后解压
打开开发工具,选中对应的景象进行升级
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 * 则表示主机设置成功
幸运的是,官方提供的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下面,所以需要拷贝出来,以备后用
Setup.sh需要复制到自己编译的板子里,用于配置ROS环境。
Wifi.sh 用于连接网络
因为编译的程序要放到开发板上运行,而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目录下面生成对应的可执行文件,然后拷贝到开发板运行就可以
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血泪教程
/*****************************/
本教程需要用到的文件
后续会上传到百度云盘