NXP iMX8 Ubuntu 系统移植及 ROS 应用

By Toradex 胡珊逢

1). 简介

NXP iMX8 是NXP近期发布的基于Cortex-A72、Cortex-A53等性能非常强大的的ARM处理器, 默认 BSP 是基于 Yocto 工程编译,这是一个精简的产品级 Linux BSP。但是对于习惯 Ubuntu 环境的用户,特别是 ROS 用户,Yocto 的操作会显得相对复杂。因此本文就采用Toradex基于NXP iMX8 SoC的ARM核心板模块Apalis iMX8介绍如何制作一个 Ubuntu BSP,并演示如何使用 ROS。



2). Ubuntu BSP定制

一个完整的 Ubuntu BSP 包括 u-boot、Linux kernel 和 Ubuntu rootfs。为了能够受益于 Toradex 的开发成果,我们将使用 Toradex 官方 Linux V3.0b4 BSP 中的u-boot、Linux kernel,rootfs 则仍然采用 ubuntu-base-18.04.4-base-arm64。编译方法来自 NXP 论坛。当然,我们会使用 Toradex 的Yocto 编译环境。


首先从上面链接下载 ubuntu-base-18.04.4-base-arm64.tar.gz,然后解压。

---------------------------------------

$ mkdir ~/ubuntu-rootfs

$ sudo tar vxf ubuntu-base-18.04.4-base-arm64.tar.gz -C ubuntu-rootfs

---------------------------------------


复制该脚本文件,创建 ch-mount.sh。

---------------------------------------

$ sudo chmod a+x ./ch-mount.sh

---------------------------------------


上面下载的是一个基础的 Ubuntu-base 文件系统,缺失了很多常用的工具,需要我们进行安装。为此在电脑上安装 qemu-user-static 软件仿真 arm64 运行环境。

---------------------------------------

$ sudo apt install qemu-user-static

---------------------------------------


挂载 Ubuntu-base 文件系统,然后可以直接在arm64 环境中操作。

---------------------------------------

$ sudo ./ch-mount.sh -m ubuntu-rootfs/

---------------------------------------


添加 DNS 服务器,例如8.8.8.8,或者其他可用的DNS 服务器 IP。

---------------------------------------

# echo nameserver 8.8.8.8 > /etc/resolv.conf

---------------------------------------


安装相关软件,当然你也可以把其他软件添加进来。

---------------------------------------

# apt install language-pack-en-base sudo ssh net-tools \

network-manager iputils-ping rsyslog \

bash-completion htop resolvconf dialog \

vim nano v4l-utils alsa-utils git gcc \

less resolvconf autoconf autopoint libtool \

bison flex gtk-doc-tools glib-2.0 \

libglib2.0-dev libpango1.0-dev libatk1.0-dev kmod pciutils -y

---------------------------------------


创建用户和设置密码,这里用户名为 ubuntu

---------------------------------------

# useradd -s '/bin/bash' -m -G adm,sudo ubuntu

# passwd ubuntu

# passwd root

# echo 'apalis-imx8' > /etc/hostname

---------------------------------------


至此基本的 Ubuntu 已经配置完毕。

---------------------------------------

# exit

$ sudo ./ch-mount.sh -u ubuntu-rootfs/

---------------------------------------


接下来需要按照上面的链接搭建 Yocto 编译环境,生成适用于 Apalis iMX8的 GPU 驱动和 weston 软件。将 build/conf/local.conf 文件中INHERIT += "rm_work" 属性注释掉,因为我们需要其中一些软件包编译后的二进制文件,用于构建 Ubuntu BSP。然后成功编译适用于 Apalis iMX8的 console-tdx-image。

---------------------------------------

# Delete the the souIMX8rce/object/binary files once a package is built to preserve disk space

# INHERIT += "rm_work"

---------------------------------------


如果你已经在之前成功编译过 console-tdx-image 但是没有删除INHERIT += "rm_work" 属性,那需要重新编译下面几个软件包

---------------------------------------

$ bitbake -c cleanall libdrm && bitbake libdrm

$ bitbake imx-gpu-viv && bitbake -c cleanall imx-gpu-viv

$ bitbake -c cleanall imx-dpu-g2d && bitbake imx-dpu-g2d

$ bitbake -c cleanall wayland && bitbake wayland

$ bitbake -c cleanall wayland-protocols && bitbake wayland-protocols

$ bitbake -c cleanall weston && bitbake weston

& bitbake -c cleanall weston-init && bitbake weston-init

& bitbake -c cleanall libinput && bitbake libinput

---------------------------------------


删除 Ubuntu-base 中原有的 drm、egl、wayland 文件。

---------------------------------------

$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libdrm*

$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/mesa-egl/*

$ sudo rm -rf ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libglapi.so.0*

$ sudo rm -rf /usr/lib/aarch64-linux-gnu/libwayland-*

---------------------------------------


我们在 “~/V30/“ 目录下编译 Yocto 环境,同样 ubuntu-rootfs 也位于 “~/“目录中。根据你的实际情况调整路径,然后复制相关文件。

---------------------------------------

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/libdrm/2.4.91.imx-r0/image$ sudo cp -Ppra usr ~/ubuntu-rootfs/

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-gpu-viv/1_6.2.4.p4.8-aarch64-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-dpu-g2d/1.7.6-r0/image$  sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/wayland/1.16.0-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/wayland-protocols/1.16.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/weston/5.0.0.imx-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libinput/1.11.3-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libxkbcommon/0.8.2-r0/images$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/mtdev/1.1.5-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/libevdev/1.5.9-r0/image$ sudo cp -Ppra ./* ~/ubuntu-rootfs /

---------------------------------------


如果需要 Gstreamer 也可以添加进来

---------------------------------------

$ bitbake -c cleanall gstreamer1.0-plugins-base && bitbake gstreamer1.0-plugins-base

$ bitbake -c cleanall gstreamer1.0-plugins-good && bitbake gstreamer1.0-plugins-good

$ bitbake -c cleanall gstreamer1.0-plugins-bad && bitbake gstreamer1.0-plugins-bad

$ bitbake -c cleanall imx-gst1.0-plugin && bitbake imx-gst1.0-plugin


oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-tdx-linux/gstreamer1.0/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-base/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-good/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/gstreamer1.0-plugins-bad/1.14.imx-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

oe-user@oe-v30-build:~/V30/build/tmp/work/aarch64-mx8-tdx-linux/imx-gst1.0-plugin/4.5.2-r0/image$ sudo cp -Ppra ./* ~/ ubuntu-rootfs /

---------------------------------------


下载 Toradex Linux V3.0b4 BSP后解压。

---------------------------------------

$ cd ~/

$ wget https://docs.toradex.cn/107503-apalis-imx8_console-image-tezi.tar

$ tar vxf 107503-apalis-imx8_console-image-tezi.tar

$ cd Apalis-iMX8_Console-Image-Tezi_3.0b4.254/

$ sudo tar vxf Console-Image-apalis-imx8.tar.xz -C ~/console-rootfs

---------------------------------------


复制相关文件

---------------------------------------

oe-user@oe-v30-build:~ $ cd ~/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/firmware/vpu ubuntu-rootfs/lib/firmware/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/firmware/mrvl ubuntu-rootfs/lib/firmware/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/lib/modules ubuntu-rootfs/lib/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service ubuntu-rootfs/etc/systemd/system/getty.target.wants/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/etc/fstab ubuntu-rootfs/etc/

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/share/X11/xkb ubuntu-rootfs/usr/share/X11/

oe-user@oe-v30-build:~ $ sudo rm ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libjpeg.so*

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/lib/libjpeg.so* ubuntu-rootfs/usr/lib/aarch64-linux-gnu/

oe-user@oe-v30-build:~ $ sudo rm ubuntu-rootfs/usr/lib/aarch64-linux-gnu/libcairo.so*

oe-user@oe-v30-build:~ $ sudo cp -Ppra console-rootfs/usr/lib/libcairo.so.2* ubuntu-rootfs/usr/lib/aarch64-linux-gnu/

--------------------------------------


到此,集成显示功能的基本 Ubuntu rootfs 已经构建完毕。如你看到的,我们采用了 weston 和 wayland 显示框架,而不是传统的 Xorg。所以这里的 Ubuntu 也并不是我们在电脑上看到的 Gnome 桌面环境。

最后我们将 ubuntu-rootfs 重新打包成支持 Toradex Easy Installer 烧写的格式。

---------------------------------------

oe-user@oe-v30-build:~ $ cd ~/

oe-user@oe-v30-build:~ $ sudo tar cJfv ubuntu_18.04.4_rootfs.tar.xz -C ubuntu-rootfs .

oe-user@oe-v30-build:~ $ mv ubuntu_18.04.4_rootfs.tar.xz Apalis-iMX8_Console-Image-Tezi_3.0b4.254/

oe-user@oe-v30-build:~ $ mv Apalis-iMX8_Console-Image-Tezi_3.0b4.254 Apalis_iMX8_3.0b4.254_ubuntu18.04

oe-user@oe-v30-build:~ $ cd Apalis_iMX8_3.0b4.254_ubuntu18.04

oe-user@oe-v30-build:~ $ rm Console-Image-apalis-imx8.tar.xz

---------------------------------------


修改image.json 文件

---------------------------------------

{

    "config_format": 2,

    "autoinstall": false,

"name": "Ubuntu 18.04 based on Toradex Linux 3.0b4.254",

"description": "Ubuntu 18.04 Weston",

"version": "Ubuntu_18.04_3.0b4.254",

"release_date": "2020-04-21",


……


                {

                    "partition_size_nominal": 512,

                    "want_maximised": true,

                    "content": {

                        "label": "RFS",

                        "filesystem_type": "ext4",

                        "mkfs_options": "-E nodiscard",

"filename": "ubuntu_18.04.4_rootfs.tar.xz",

"uncompressed_size": 1232.53125

                    }

                }

---------------------------------------


现在你可以将 Apalis_iMX8_3.0b4.254_ubuntu18.04 复制到 SD 或者 U 盘通过 Toradex Easy Installer 安装。如果你想直接在 Apalis iMX8模块上测试 Ubuntu 也可以从这里下载我们已经制作好的安装文件。


安装完毕后在调试串口使用 ubuntu 用户登录,密码为之前您所设置的。我们提供的 Ubuntu 测试 BSP 里,密码为ubuntu.


开启以太网并设置DNS 服务器IP。

---------------------------------------

ubuntu@apalis-imx8:~$ sudo ifconfig eth0 up

ubuntu@apalis-imx8:~$ sudo dhclient eth0

ubuntu@apalis-imx8:~$ sudo vi /etc/resolv.conf

---------------------------------------


启动 weston 。

---------------------------------------

ubuntu@apalis-imx8:~$ export XDG_RUNTIME_DIR=/run/user/1000

ubuntu@apalis-imx8:~$ sudo -E weston --tty=1 &

ubuntu@apalis-imx8:~$ weston-flower

---------------------------------------





3). ROS测试

在 Ubuntu 系统里你可以十分方便地安装 ROS 程序,具体可以参考下面说明。

http://wiki.ros.org/melodic/Installation/Ubuntu

http://wiki.ros.org/ROS/Tutorials


---------------------------------------

ubuntu@apalis-imx8:~$ sudo apt install lsb-core

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

ubuntu@apalis-imx8:~$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

ubuntu@apalis-imx8:~$ sudo apt update

ubuntu@apalis-imx8:~$ sudo apt install ros-melodic-desktop

---------------------------------------


在三个 SSH 终端分别运行下面命令,模拟ROS 节点之间相互通信。

---------------------------------------

// Terminal 1

ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh

ubuntu@apalis-imx8:~$ roscore

// Terminal 2

ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh

ubuntu@apalis-imx8:~$ rosrun roscpp_tutorials talker

// Terminal 3

ubuntu@apalis-imx8:~$ source /opt/ros/melodic/setup.sh

ubuntu@apalis-imx8:~$ rosrun roscpp_tutorials listener

---------------------------------------


4). 总结


Ubuntu 系统由于其丰富的软件源,用户可以很便捷地安装所需软件,加速测试、开发流程。为此本文结合 NXP 资料介绍在 Apalis iMX8 上移植 Ubuntu 的方法以及 ROS 的简单应用。由于驱动限制,iMX8 并不支持 Xorg,因此 ROS 默认的图形界面工具将无法直接使用,如rqt 等。另外需要说明的是,本文仅用于技术讨论,使用期间如遇到问题,需用户自行解决。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348