# 技術分享：在Yocto開發環境部屬ROS

**URL:** <https://forum.aim-linux.advantech.com/t/yocto-ros/250>\
**Category:** 最新消息\
**Created:** [September 13, 2022, 12:27am UTC](https://forum.aim-linux.advantech.com/t/yocto-ros/250 "2022-09-13T00:27:34Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![charles.huang](https://avatars.discourse-cdn.com/v4/letter/c/76d3ee/32.png) [@charles.huang](https://forum.aim-linux.advantech.com/u/charles.huang)\
**Post date:** [September 13, 2022, 12:27am UTC](https://forum.aim-linux.advantech.com/t/yocto-ros/250/1 "2022-09-13T00:27:34Z")

</div>

# **簡介**

Robot Operating System (ROS)由數個軟體庫和工具程式組成，可協助使用者開發機器人應用系統。ROS 的設計適用於 Ubuntu 平台，且主要在 Ubuntu 上進行測試，因此，完整測試也都使用特定的 Ubuntu 版本進行，使用者可在任何基於 Unix 的平台上安裝和運行 ROS。

在整合開發機器人時，可能會出現與相容性或是資料庫無相容版本有關的問題。為確保一切順利運行的最佳方法，便是使用 [ROS](http://wiki.ros.org/Distributions) 和 [ROS2 Distribution](https://docs.ros.org/en/rolling/Releases.html) 所建議的正確 Ubuntu 版本，或是在硬體供應商提供的特定硬體和產品上，使用經過全面測試的 ROS。上述兩種方法，都能確保 ROS 的處理架構順利運行。

# **搭建環境**

硬體簡介：

- [RSB-3720](https://iotmart.advantech.com.tw/RSB-3720WQ-ACA2E/product/model-RSB-3720WQ-ACA2E.htm) 透過 UIO40-Express 的擴充設計，滿足各種垂直應用需求。

- NXP Arm® Cortex®-A53 i.MX8M Plus Quad/Dual up to 1.8 GHz

- Onboard LPDDR4 4 GB/6 GB and 4000MT/s memory

- HDMI 1920x1080 at 60Hz, 1 x Single or 1 x Dual Channel 24 bit LVDS (or 1 x 4-Lane MIPI-DSI by Software modification)

- 1 x 4-wire RS-232/422/485, 1 x USB 3.2 Gen 1 By 1, 1 x USB2.0, 1 x Micro SD, 1 x Mic. in/Line out

- 1 x mini-PCIe for 3G/4G, 1 x M.2 2230 Key E slot

- Supports Yocto Project Linux and Android

- Supports I/O expansion boards via UIO40-Express

# **使用 eMMC 或 SD 啟動系統**

[RSB-3720](https://iotmart.advantech.com.tw/RSB-3720WQ-ACA2E/product/model-RSB-3720WQ-ACA2E.htm) 啟動作業系統的方法共有兩種，其一是使用 SD 卡啟動，另一種方法是透過 eMMC 啟動。對 ROS 進行開發評估的使用者，可能會發現開發伺服器或 PC來產生運行系統的SD 卡 時，更新韌體會比較容易。

| Boot strap | SW1-1 | SW1-2 | SW1-3 | SW1-4 |
| --- | --- | --- | --- | --- |
| SD | ON | ON | OFF | OFF |
| eMMC | OFF | ON | OFF | OFF |

A. SD 啟動

 ![image](https://us1.discourse-cdn.com/flex016/uploads/aim_linux/original/1X/33a52c8216537c7f5dc41c3e4db768af8d688aef.jpeg)

B. eMMC 啟動

 ![image](https://us1.discourse-cdn.com/flex016/uploads/aim_linux/original/1X/3157c2fb08178ff578ea672e73e5aca60c1326af.jpeg)

C. 連接和設定除錯埠

[RSB-3720](https://iotmart.advantech.com.tw/RSB-3720WQ-ACA2E/product/model-RSB-3720WQ-ACA2E.htm) 的除錯埠與 COM1 共用。請連接除錯控制台的纜線，然後將 USB 轉 RS232 纜線連接到您的 PC 端子。將纜線接到 HDMI 接頭旁邊的 COM1 排針，RSB-3720 可透過序列傳輸纜線與主機伺服器通訊。HyperTerminal、Tera Term 或 PuTTY 等常見序列通訊程式，都適用此類應用。請將鮑率設至 115200。

 ![image](https://us1.discourse-cdn.com/flex016/uploads/aim_linux/original/1X/ad9f7d13594a2fa81b59692eeccaa28ca14e4df0.jpeg)

# **BSP**  **的環境設定和構建說明**

Advantech 已將構建環境和映像所需的流程，減少至 3 個步驟：

請造訪我們的 [AIM-Linux 開發中心](http://ess-wiki.advantech.com.tw/view/AIM-Linux/RSB-3720)，並選擇基於RSB-3720相關的 BSP

跟著「User Guide」方法下載程式碼

將構建映像刷入 SD 卡，並將其從 SD 卡啟動

此舉減少了工程師在設定環境時的工作量，並在出現問題時協助解決問題。此項作業只需使用者擁有本地 PC 或雲端虛擬主機，其他所有必要素材都可以在網上找到。使用者應使用性能較強的 PC，或是帶 SSD 的虛擬主機加快流程。同理，如果使用者能存取 Azure VM 服務，透過 PC 或筆電在雲端完成作業，再下載映像至本地 SD 卡內。我們將在本簡介的後面，詳談如何在 Linux 和 Windows 上使用這些工具。

**主機的 Docker 設定**

使用者可在 Azure 雲端服務或本地構建主機設立附 Ubuntu 系統的虛擬構建主機。

**Docker**  **安裝簡介**

在構建主機上準備容器環境。選擇 Ubuntu 18.04，作為下述簡介的作業系統。

更新 APT 軟體包索引，並安裝軟體包讓 APT 透過 HTTPS 使用儲存庫：

```auto
$sudo apt-get update

$sudo apt-get install \

ca-certificates \

curl \

gnupg \

lsb-release

```

添加 Docker 的官方 GPG 金鑰

```auto
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

```

建立一個穩定的儲存庫，並安裝 Docker 引擎

```auto
$ echo \

"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \

$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

$ sudo apt-get update

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

```

使用 Advantech 在 Docker Hub 製作的 Docker 映像。

```auto
$ docker pull advrisc/u18.04-imx8lbv

$ export CONTAINER_NAME=rsb-3720

$ mkdir adv-release-bsp

$ export WORKSPACE=~/adv-release-bsp

$ docker run --privileged -it --name ${CONTAINER_NAME} -v ${WORKSPACE}:/home/adv/adv-release-bsp -v /dev:/dev advrisc/u18.04-imx8lbv1 /bin/bash

```

# **構建簡介**

進入 Docker 的容器環境殼層時，使用下列操作：

**準備 BSP 並包含 ROS 元層**

update CA certificates

```auto
$ sudo apt-get install apt-transport-https ca-certificates -y

$ sudo update-ca-certificates

$ export GIT_SSL_NO_VERIFY=1

$ repo init -u https://dev.azure.com/advcharles/IMX-Robot/_git/adv-arm-yocto-bsp -b imx-linux-zeus -m imx8LBVA0271_robot.xml

$ repo sync

$ ln -s sources/meta-robot-platform/imx/meta-robot/tools/setup-imx-robot.sh setup-imx-robot.sh

```

如您所見，元機器人平台已內含在 BSP 中。使用者可以使用指定的 ROS 版本，開始構建自己的機器人韌體。他們可以選擇如 ROS1 melodic 或 kinetic，或是 ROS2 foxy。

```auto
$ DISTRO=imx-robot-xwayland MACHINE=imx8mprsb3720a1 source setup-imx-robot.sh -r melodic -b imx8mprsb3720a1-robot-melodic

$ bitbake imx-robot-system

$ DISTRO=imx-robot-xwayland MACHINE=imx8mprsb3720a1 source setup-imx-robot.sh -r kinetic -b imx8mprsb3720a1-robot-kinetic

$ bitbake imx-robot-system

$ DISTRO=imx-robot-xwayland MACHINE=imx8mprsb3720a1 source setup-imx-robot.sh -r foxy -b imx8mprsb3720a1-robot-foxy

$ bitbake imx-robot-system

```

**刷入映像並擴展 _rootfs_ 空間**

請複製映像至主機 PC 或筆電。

```auto
$ scp charles@desktop:~/adv-release-bsp/imx8mprsb3720a1-robot-melodic/tmp/deploy/images/imx8mprsb3720a1/imx-robot-system-melodic-imx8mprsb3720a1-20220309072100.rootfs.wic.bz2 .

```

A. Linux

選擇一個 uDisk 名稱替換 /dev/sdx。如 /dev/sdc 為例，使用者應避免使用到系統碟或重要的儲存碟。

```auto
$ sudo dd if=./imx-robot-system-melodic-imx8mprsb3720a1-20220309072100.rootfs.wic.bz2 of=/dev/sdx

```

B. Windows

使用者可以選擇 [balenaEtcher](https://www.balena.io/etcher/) 刷入映像至他們的 Windows 作業系統，或是他們也可以選擇 Linux 的版本。使用 Linux Desktop GUI 時，Linux 版本一的操作類似 Windows 版本。  
`![image|528x334](upload://vqyKwpi2KNSUfB6dDtkyC4BB4DS.png)`

針對 nxp8987 SDK 構建失敗的提示和解決方法，會支援鏡像站設置並提供來源：

請同時加上 MACHINE\_FEATURES\_remove = " nxp8987 "，並移除構建資料夾的 local.conf 檔案內的 source mirror 部分，以防構建失敗。

請透過添加 IMAGE\_INSTALL\_append = " orb-slam2 usb-cam" 將 orb-slam2 包含至映像中，以便使用 slam 和 ROS 攝影機節點演示。

用戶可在 build 資料夾的 local.conf 檔案中，添加 INHERIT += “rm\_work” 功能以保留硬碟空間。

**在 ROS 中啟動攝影機 (僅限 USB 攝影機，目前尚未支援 MIPI 攝影機)**

ROS1 仍是機器人應用系統的熱門選擇，因此我們將演示使用 ROS1。在本簡介中使用的版本，是基於 Melodic distribution，我們將演示啟動 USB 攝影機節點的方法。這次演示會將攝影機的預覽內容，顯示在您的 HDMI 螢幕上，它同時也是一個 ROS 節點。

```auto
$ source /opt/ros/melodic/setup.bash

$ roscore&

$ roslaunch usb_cam usb_cam-test.launch

```

**SLAM**  **演示**

您可以在下述連結，找到必要素材

[https://codeload.github.com/raulmur/ORB\_SLAM2/zip/refs/heads/master](https://codeload.github.com/raulmur/ORB_SLAM2/zip/refs/heads/master)

[http://robotics.ethz.ch/~asl-datasets/ijrr\_euroc\_mav\_dataset/machine\_hall/MH\_02\_easy/MH\_02\_easy.zip](http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_02_easy/MH_02_easy.zip)

```auto
$ mono_euroc/orb-slam2/Vocabulary/ORBvoc.txt

ORB_SLAM2/Examples/Monocular/EuRoC.yaml mav0/cam0/data ORB_SLAM2/Examples/Monocular/EuRoC_TimeStamps/MH01.txt

```

點擊下方按鈕觀看SLAM演示影片：  
**[SLAM演示影片](https://advantecho365-my.sharepoint.com/:v:/g/personal/charles_huang_advantech_com/EdrI6_stpmVJt-BxSV-jAOkBUunl-EpFWeJ1ZSu3mdXZhg?e=uQWW6u)**

# **結論**

熟悉ROS開發環境 的使用者，會發現 ROS 能與 Ubuntu 系統良好整合。這是因為 ROS被廣泛應用於 Ubuntu x86 架構上，並用以開發機器人解決方案。反之，基於 Arm 架構的運算平台通常都會預先嵌入式Linux (如 Yocto OS)，且因嵌入式 Linux 是以提供架構給終端使用者，使其可以構建模塊設計自己的作業系統而聞名，因此使用 ROS 平台安裝和開發會較為困難。Advantech 的 BSP 已完全整合 ROS，ROS 開發人員無需過度煩惱，可以專注於 ROS 應用程式開發，並將精力用在設計低功耗的機器人解決方案，這樣更能進一步降低基於 Arm 架構的開發成本和其他連帶問題。
