2020年2月17日月曜日

ultra96+petalinux+ros2 dashingでturtlebotをgazeboで動かすまでのメモ


以下のSuperfloreを利用してレシピを生成する。
https://github.com/ros/meta-ros/wiki/Superflore-OE-Recipe-Generation-Scheme

navigation2のチュートリアル

https://ros-planning.github.io/navigation2/getting_started/index.html#running-the-example


ros2レシピ生成した後の解析でエラーはくやつを探して消す。buildでcatkin指定しているものはとりあえず消しておく。
grep 'ROS_BUILD_TYPE = "catkin"' -rl ./meta-ros2-dashing/

ROS_UNRESOLVED_PLATFORM_PKGを解決する。=>いらなかった模様。レシピインストール時に問題となったら考える。

clang-format

boost_python3が足りないと言われた。
local.confに以下を追加とのこと。(https://www.yoctoproject.org/pipermail/yocto/2015-April/024351.html)
PACKAGECONFIG_pn-boost = "python"
 
libboost_python3が見つからなかったので、以下のパッチを適用。do_install_appendとして適用 
https://patchwork.openembedded.org/patch/155696/ 

glibcのtaskhashもmismatchしたのでlocked-sig.incから消去。
glibc-localeも同様。

以下のパッチのバージョン指定に誤りがあったためビルドが通らず。
誤:meta-ros2-dashing/recipes-bbappends/vision-opencv/cv-bridge_2.1.3-1.bbappend
正:meta-ros2-dashing/recipes-bbappends/vision-opencv/cv-bridge_2.1.4-1.bbappend
エラーが取れたらパッケージを導入する。
project_spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bbでIMAGE_INSTALLに次を追加
・packagegroup-ros-turtlebot3-core
・packagegroup-ros-turtlebot3-extended
=================================================================

ros2のネットワークが落ちているとうまくトピック認識できない件について
 
以下のようにbr0とtap0を作る 
sudo brctl addbr br0
sudo ip addr add 10.0.2.2/16 dev br0
sudo ip link set br0 up
sudo ip tuntap add user akira mode tap
sudo dnsmasq --interface=br0 --bind-interfaces --dhcp-range=10.0.2.3,10.0.2.254


-net nic -net nic -net nic -net nic,netdev=my_tap0 -netdev tap,ifname=tap0,id=my_tap0
をQEMU動作の引数として渡す。 =>guestからhostへros2 topic流れてくるようになったが、host側でros2 topic echo /chatterすると、 Could not determine the type for the passed topicというメッセージが出る。
パケットキャプチャの結果、IPフラグメント通信の問題と思われる。cadence_gem.cが怪しいと思うので調査。qemu-xilinxのデバッグフラグを有効にする。locked-sig.incからqemu-xilinxを削除。


SRC_URI_append ="\
    file://0001-enable-cadence_gem-debug-flag.patch \
"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"


EXTRA_OECONF_append = " \
                --enable-debug \
                "



From 1652e2bd5b1eb896774045f0ac06ea1887abb87d Mon Sep 17 00:00:00 2001
From: Akira Nishiyama <xxxxxxxx@gmail.com>
Date: Mon, 17 Feb 2020 00:29:30 +0900
Subject: [PATCH] enable cadence_gem debug flag

---
 hw/net/cadence_gem.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 26d8d5e693..74e5118be5 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -31,7 +31,7 @@
 #include "net/checksum.h"
 #include "exec/address-spaces.h"

-#define CADENCE_GEM_ERR_DEBUG 0
+#define CADENCE_GEM_ERR_DEBUG 1
 #define DB_PRINT(...) do {\
     if (CADENCE_GEM_ERR_DEBUG) {   \
         qemu_log(": %s: ", __func__); \
-- 
2.17.1

qemu実行後にtx側のチェックサムオフロードやめるだけで問題は解決するので特に修正はしない。


pingとros2 multicastのテスト結果を記載する。

HOSTのみでの起動確認
$/opt/ros/dashing/lib/robot_state_publisher/robot_state_publisher /opt/ros/dashing/share/turtlebot3_description/urdf/turtlebot3_waffle.urdf

$ros2 run rviz2 rviz2 -d /opt/ros/dashing/share/nav2_bringup/launch/nav2_default_view.rviz

$ /opt/ros/dashing/lib/nav2_lifecycle_manager/lifecycle_manager

$gazebo -s libgazebo_ros_init.so /opt/ros/dashing/share/turtlebot3_gazebo/worlds/turtlebot3_worlds/waffle.model



================================================
QEMU側

ethtool -K eth0 tx off
export ROS_MASTER_URI=http://10.0.2.49:11311
export ROS_IP=10.0.2.49
export ROS_HOSTNAME=10.0.2.49
export ROS_DOMAIN_ID=1
source ros_setup.sh


2020年2月5日水曜日

ultra96v2_oobにros2-dashingを導入する方法その2〜

前回の続きです。見ればわかるとおりとりあえず動かした感がものすごく強いのでご使用の際は自己責任でお願いします。

まずは環境変数の設定をします。ug1144でプロジェクトのBitbakeへのアクセスを参考にbitbakeを使用できるようにします。なお、単純なuser-layerとしての追加は試しましたがtaskhash mismatchの問題出たのでソースから生成するようにしてます。(実はlocal.confをいじるだけでいけたかもしれないけど)
 
$cd <petalinux_prj_root>
$source <petalinux_install_path>/settings.sh
$source <petalinux_install_path>/components/yocto/source/aarch64/environment-setup-aarch64-xilinx-linux
$source <petalinux_install_path>/components/yocto/source/aarch64/layers/core/oe-init-build-env
$export PATH=<petalinux_install_path>/tools/xsct/bin:$PATH
$export BB_ENV_EXTRAWHITE="$BB_ENV_EXTRAWHITE PETALINUX"

bitbake straceが動けば環境設定は成功です。
次はソースからビルドするようにpetalinuxで使用しているプロジェクト一式をgithubから持ってきます。必要なレイヤーは<petalinux_prj_root>/build/conf/bblayer.confに記載があるので、これを参考に集めてきます。


BBLAYERS := " \
  ${SDKBASEMETAPATH}/poky/meta \
  ${SDKBASEMETAPATH}/poky/meta-poky \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-perl \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-python \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-filesystems \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-gnome \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-multimedia \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-networking \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-webserver \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-xfce \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-initramfs \
  ${SDKBASEMETAPATH}/meta-openembedded/meta-oe \
  ${SDKBASEMETAPATH}/meta-browser \
  ${SDKBASEMETAPATH}/meta-qt5 \
  ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-bsp \
  ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-pynq \
  ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-contrib \
  ${SDKBASEMETAPATH}/meta-xilinx-tools \
  ${SDKBASEMETAPATH}/meta-petalinux \
  ${SDKBASEMETAPATH}/meta-virtualization \
  ${SDKBASEMETAPATH}/meta-openamp \
  ${SDKBASEMETAPATH}/meta-jupyter \
  ・・・ 

よって次のコマンドを実行します。最後におまけでmeta-rosもクローンしておきます。
$cd ../project-spec
$git clone https://github.com/Xilinx/poky -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-openembedded -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-browser -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-qt5 -b rel-vc2019.2
$git clone https://github.com/Xilinx/meta-xilinx -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-xilinx-tools -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-petalinux -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-virtualization -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-openamp -b rel-v2019.2
$git clone https://github.com/Xilinx/meta-jupyter -b rel-v2019.2
$git clone https://github.com/ros/meta-ros -b origin/thud-draft

続いてbblayer.confを編集します。SDKBASEMETAPATHはgit cloneしたレイヤーを指定しておきます。
また、meta-rosの公式ビルドガイドに従うとraspberry-pi用のyocto環境を作成できるので、これを参考に以下のように追記しています。
なお、今回はどうせやるならros2のdashingだろうということでこれを選んでいます。
DISTROを変更すればros1-melodicやros2-crystal,ros2-eloquent(本当?)でも対応できると思います。
中身をよく調べもせずコピーしているので多分不要なものが含まれています。(MCF設定とか)
ROS_DISTRO_BASELINE_PLATFORM ?= "ubuntu-bionic"も参考元ではどこかで指定されるものと思われますが、petalinuxプロジェクトでは指定されないので定義して置く必要があります。


# Generated by mcf -- DO NOT EDIT
MCF_PROGRAM_VERSION = "7.2.0"

# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
LCONF_VERSION = "7"

SDKBASEMETAPATH = "<path_to_project-spec>"

META_ROS2_DASHING_LAYER ?= "${SDKBASEMETAPATH}/meta-ros/meta-ros2-dashing"
META_ROS2_LAYER ?= "${SDKBASEMETAPATH}/meta-ros/meta-ros2"
META_ROS_COMMON_LAYER ?= "${SDKBASEMETAPATH}/meta-ros/meta-ros-common"
META_ROS_BACKPORTS_WARRIOR_LAYER ?= "${SDKBASEMETAPATH}/meta-ros/meta-ros-backports-warrior"

BBLAYERS ?= " \
    ${SDKBASEMETAPATH}/poky/meta \
    ${SDKBASEMETAPATH}/poky/meta-poky \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-perl \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-python \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-filesystems \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-gnome \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-multimedia \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-networking \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-webserver \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-xfce \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-initramfs \
    ${SDKBASEMETAPATH}/meta-openembedded/meta-oe \
    ${SDKBASEMETAPATH}/meta-browser \
    ${SDKBASEMETAPATH}/meta-qt5 \
    ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-bsp \
    ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-pynq \
    ${SDKBASEMETAPATH}/meta-xilinx/meta-xilinx-contrib \
    ${SDKBASEMETAPATH}/meta-xilinx-tools \
    ${SDKBASEMETAPATH}/meta-petalinux \
    ${SDKBASEMETAPATH}/meta-virtualization \
    ${SDKBASEMETAPATH}/meta-openamp \
    ${SDKBASEMETAPATH}/meta-jupyter \
    ${META_RASPBERRYPI_LAYER} \
    ${META_ROS2_DASHING_LAYER} \
    ${META_ROS2_LAYER} \
    ${META_ROS_COMMON_LAYER} \
    ${META_ROS_BACKPORTS_WARRIOR_LAYER} \
    ${META_PYTHON_LAYER} \
    ${META_OE_LAYER} \
    ${META_LAYER} \
"
BBFILE_PRIORITY_ros2-dashing-layer_forcevariable = "39"
BBFILE_PRIORITY_ros2-layer_forcevariable = "38"
BBFILE_PRIORITY_ros-common-layer_forcevariable = "35"
BBFILE_PRIORITY_ros-backports-warrior-layer_forcevariable = "34"
BBFILE_PRIORITY_meta-python_forcevariable = "13"
BBFILE_PRIORITY_openembedded-layer_forcevariable = "10"
BBFILE_PRIORITY_core_forcevariable = "5"

ROS_DISTRO_BASELINE_PLATFORM ?= "ubuntu-bionic"

# Lines from the BblayersConfExtraLines setting:
MCF_DISTRO ?= "ros2"
ROS_DISTRO ?= "dashing"
MCF_SUPPORTED_MACHINES ?= "qemux86 raspberrypi3"
MCF_OPENEMBEDDED_VERSION ?= "2.6-464.1-thud"


まだ終わりません。つぎは<petalinux_prj_root>/build/conf/local.confです。UNINATIVE_CHECKSUMの行をコメントアウトします。meta-rosが何かやるせいだと思っています。WARNINGを書いてくれていますが無視します。
また<petalinux_prj_root>/build/conf/locked_sigs.incからlibgcc-initial及びglibc-initialの行をごっそりと削除します。meta-rosの仕業だと思っています。

<petalinux_prj_root>/project-spec/meta-plnx-generated/recipes-core/images/petalinux-user-image.bbを編集します。
IMAGE_INSTALLの最後に"ros-core \"を追加します。

また、pythonのバージョンに起因する問題と思われるエラー確認したのでpython3はpython3だろということでとりあえずmeta-rosのbackportsのpythonレシピを消してpetalinuxが使用しているpythonが使われるようにしました。

rm -rf <petalinux_prj_root>/project-spec/meta-ros/meta-ros-backports-warrior/recipes-devtools/python/python3
rm -rf <petalinux_prj_root>/project-spec/meta-ros/meta-ros-backports-warrior/recipes-devtools/python/python3_3.7.2.bb

ここまで来てようやくbuildができます。
次のように実行します。

$cd <path_to_prj_root>/build
$bitbake petalinux-user-image
buildには12時間かかりました。また途中chromeのbuild時に27Gのメモリが必要でしたのでswapを追加してbuildしました。 bblayer.conf,locked_sigs.inc,local.conf,petalinux-user-image.bbはpetalinux configで上書きされてしまうので、
バージョン管理するかバックアップ取っておくかしておくのが良いです。

あとは<path_to_prj_root>/Makefileにpetalinux同様のdeployイメージ収集処理を追加しておくと便利と思います。私は以下を追加しています。

import_deploy:
        cp -f $(DEPLOY_DIR)/fitImage images/linux/image.ub
        cp -f $(DEPLOY_DIR)/arm-trusted-firmware.elf images/linux/bl31.elf
        cp -f $(DEPLOY_DIR)/pmu-ultra96-zynqmp.elf images/linux/pmufw.elf
        cp -f $(DEPLOY_DIR)/u-boot.elf images/linux/u-boot.elf
        cp -f $(DEPLOY_DIR)/fsbl-ultra96-zynqmp.elf images/linux/zynqmp_fsbl.elf
        cp -f $(DEPLOY_DIR)/system.dtb images/linux/system.dtb
        cp -f $(DEPLOY_DIR)/System.map.linux images/linux/System.map.linux
        cp -f $(DEPLOY_DIR)/uEnv.txt images/linux/uEnv.txt
        cp -f $(DEPLOY_DIR)/petalinux-user-image-dashing-ultra96-zynqmp.tar.gz images/linux/rootfs.tar.gz
        cp -f $(DEPLOY_DIR)/qemu-hw-devicetrees/multiarch/zynqmp-pmu.dtb images/linux/zynqmp-qemu-multiarch-pmu.dtb
        cp -f $(DEPLOY_DIR)/qemu-hw-devicetrees/multiarch/zcu100-arm.dtb images/linux/zynqmp-qemu-multiarch-arm.dtb
        cp -f project-spec/hw-description/ultra96v2_oob.bit images/linux/system.bit

qemu動作させてみます。sd.imgはどうにかして用意してください。実機で動作させても同じです。
bootしたあとはROS2 Sanity Testを実行して動作確認します。
qemu動作時とSanity Test実行時のメッセージをおいておきます。
よいrosライフを!

$ make qemuboot 
petalinux-boot --qemu --u-boot --qemu-args "-drive file=myfile/sd.img,if=sd,id=sd0,index=0,format=raw -drive file=myfile/sd.img,if=sd,id=sd1,index=1,format=raw"
INFO: sourcing build tools
INFO: No DTB has been specified, use the default one "/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/system.dtb".
INFO: No DTB has been specified, use the default one "/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/system.dtb".
INFO: Starting microblaze QEMU
INFO: Starting the above QEMU command in the background
INFO:  qemu-system-microblazeel -M microblaze-fdt   -serial mon:stdio -serial /dev/null -display none -kernel /home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/pre-built/linux/images/pmu_rom_qemu_sha3.elf -device loader,file=/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/pmufw.elf      -hw-dtb /home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/zynqmp-qemu-multiarch-pmu.dtb -machine-path /tmp/tmp.V5UJRYwebI -device loader,addr=0xfd1a0074,data=0x1011003,data-len=4 -device loader,addr=0xfd1a007C,data=0x1010f03,data-len=4 
INFO: Set QEMU tftp to /home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux 
INFO: TCP PORT is free 
INFO: Starting aarch64 QEMU
INFO:  qemu-system-aarch64 -M arm-generic-fdt   -serial /dev/null -serial mon:stdio -display none -device loader,file=/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/bl31.elf,cpu-num=0 -device loader,file=/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/u-boot.elf -gdb tcp::9000 -dtb /home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/system.dtb  -net nic -net nic -net nic -net nic,netdev=eth0 -netdev user,id=eth0,tftp=/home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux   -hw-dtb /home/akira/work/ultra96v2_oob/ultra96v2_oob/petalinux/images/linux/zynqmp-qemu-multiarch-arm.dtb -machine-path /tmp/tmp.V5UJRYwebI -global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true -drive file=myfile/sd.img,if=sd,id=sd0,index=0,format=raw -drive file=myfile/sd.img,if=sd,id=sd1,index=1,format=raw   -m 4G
qemu-system-microblazeel: Failed to connect socket /tmp/tmp.V5UJRYwebI/qemu-rport-_pmu@0: No such file or directory
qemu-system-microblazeel: info: QEMU waiting for connection on: disconnected:unix:/tmp/tmp.V5UJRYwebI/qemu-rport-_pmu@0,server
QEMU 2.11.1 monitor - type 'help' for more information
(qemu) audio: Could not init `oss' audio driver
qemu-system-aarch64: warning: vlan 0 is not connected to host network
PMU Firmware 2019.2 Feb  3 2020   10:48:12
PMU_ROM Version: xpbr-v8.1.0-0
NOTICE:  ATF running on XCZUUNKN/QEMU v4/RTL0.0 at 0xfffea000
NOTICE:  BL31: Secure code at 0x60000000
NOTICE:  BL31: Non secure code at 0x10080000
NOTICE:  BL31: v2.0(release):xilinx-v2019.1-12-g713dace9
NOTICE:  BL31: Built : 10:50:42, Feb  3 2020
PMUFW: v1.1


U-Boot 2019.01 (Feb 03 2020 - 10:03:12 +0000)

Model: Avnet Ultra96 Rev1
Board: Xilinx ZynqMP
DRAM:  2 GiB
EL Level: EL2
Chip ID: unknown
MMC:   mmc@ff160000: 0, mmc@ff170000: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment

In:    serial@ff010000
Out:   serial@ff010000
Err:   serial@ff010000
Model: Avnet Ultra96 Rev1
Board: Xilinx ZynqMP
Bootmode: JTAG_MODE
Reset reason: 
Net:   ZYNQ GEM: ff0e0000, phyaddr ffffffff, interface gmii
eth0: ethernet@ff0e0000
U-BOOT for ultra96v2-oob-2019_2

Hit any key to stop autoboot:  0 
Device: mmc@ff160000
Manufacturer ID: aa
OEM: 5859
Name: QEMU! 
Bus Speed: 17361111
Mode : SD Legacy
Rd Block Len: 512
SD version 2.0
High Capacity: Yes
Capacity: 19.5 GiB
Bus Width: 4-bit
Erase Group Size: 512 Bytes
18462860 bytes read in 4812 ms (3.7 MiB/s)
## Loading kernel from FIT Image at 10000000 ...
   Using 'conf@system-top.dtb' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  uncompressed
     Data Start:   0x10000108
     Data Size:    18424320 Bytes = 17.6 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x00080000
     Entry Point:  0x00080000
     Hash algo:    sha1
     Hash value:   5b2a4cdeafb06d0c1704ce266cab9d682020e4be
   Verifying Hash Integrity ... sha1+ OK
## Loading fdt from FIT Image at 10000000 ...
   Using 'conf@system-top.dtb' configuration
   Trying 'fdt@system-top.dtb' fdt subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x1119240c
     Data Size:    36617 Bytes = 35.8 KiB
     Architecture: AArch64
     Hash algo:    sha1
     Hash value:   180c885fca6c51a5faf912f89c16d35ab258afd1
   Verifying Hash Integrity ... sha1+ OK
   Booting using the fdt blob at 0x1119240c
   Loading Kernel Image ... OK
   Loading Device Tree to 0000000007ff4000, end 0000000007ffff08 ... OK

Starting kernel ...

INIT: version 2.88 booting
Starting udev
Starting Ultra96 AP setup daemon.
Turning Ultra96 WiFi & Bluetooth LEDs ON...done.
 
Starting Flask server deamon to serve Ultra96 startup page.
INIT: Entering runlevel: 5
Configuring network interfaces... Successfully initialized wpa_supplicant
rfkill: Cannot get wiphy information
Could not read interface wlan0 flags: No such device
WEXT: Could not set interface 'wlan0' UP
wlan0: Failed to initialize driver interface
Cannot find device "wlan0"
Starting system message bus: dbus.
Starting Connection Manager
Starting haveged: haveged: listening socket at 3
haveged: haveged starting up


Starting Xserver
mount: /mnt: /dev/mmcblk0p1 already mounted on /run/media/mmcblk0p1.
mount: /mnt: /dev/mmcblk0 already mounted or mount point busy.
Starting Dropbear SSH server: haveged: haveged: ver: 1.9.4; arch: generic; vend: ; build: (gcc 8.2.0 CTV); collect: 128K

haveged: haveged: cpu: (VC); data: 16K (D V); inst: 16K (D V); idx: 11/40; sz: 15528/64688

haveged: haveged: tot tests(BA8): A:1/1 B:1/1 continuous tests(B):  last entropy estimate 8.00355

haveged: haveged: fills: 0, generated: 0 

mount: /mnt: /dev/mmcblk0p1 already mounted on /run/media/mmcblk0p1.
dropbear.
mount: /mnt: /dev/mmcblk0 already mounted or mount point busy.
Starting rpcbind daemon...

X.Org X Server 1.20.1
X Protocol Version 11, Revision 0
Build Operating System: Linux 5.3.0-28-generic x86_64 
Current Operating System: Linux ultra96v2-oob-2019_2 4.19.0-xilinx-v2019.2 #1 SMP Mon Feb 3 01:47:41 UTC 2020 aarch64
Kernel command line: earlycon console=ttyPS0,115200 clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait
Build Date: 03 February 2020  03:41:05AM
 
Current version of pixman: 0.34.0
 Before reporting problems, check http://wiki.x.org
 to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
 (++) from command line, (!!) notice, (II) informational,
 (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Wed Feb  5 09:38:25 2020
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
done.
starting statd: done
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning:          Unsupported high keycode 372 for name  ignored
>                   X11 cannot support keycodes above 255.
>                   This warning only shows for the first high keycode.
Starting bluetooth: bluetoothd.
Errors from xkbcomp are not fatal to the X server
Starting Distributed Compiler Daemon: distcc/etc/rc5.d/S20distcc: start failed with error code 110
Starting internet superserver: inetd.
exportfs: can't open /etc/exports for reading
NFS daemon support not enabled in kernel
Starting ntpd: done
Starting syslogd/klogd: D-BUS per-session daemon address is: unix:abstract=/tmp/dbus-CG2YvTEmNM,guid=06462448b754ac2b1c4e7eed5e3a8d1b
done
mount: /mnt: /dev/mmcblk0p1 already mounted on /run/media/mmcblk0p1.
Starting internet superserver: xinetdmount: /mnt: /dev/mmcblk0 already mounted or mount point busy.
.
 * Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon
Opening webpage
Starting Telephony daemon
GLib-GIO-Message: 09:38:41.098: Using the 'memory' GSettings backend.  Your settings will not be saved or shared with other applications.
Starting watchdog daemon...Failed to launch bus: Failed to execute child process ?/usr/bin? (Permission denied)done
Starting Linux NFC daemon
matchbox: Cant find a keycode for keysym 269025056
matchbox: ignoring key shortcut XF86Calendar=!$contacts

matchbox: Cant find a keycode for keysym 2809
matchbox: ignoring key shortcut telephone=!$dates

matchbox: Cant find a keycode for keysym 269025050
matchbox: ignoring key shortcut XF86Start=!matchbox-remote -desktop

[settings daemon] Forking. run with -n to prevent fork
Starting tcf-agent: OK


(matchbox-panel:2420): dbind-WARNING **: 09:38:53.223: Error retrieving accessibility bus address: org.a11y.Bus.Error: Failed to execute child process ?/usr/bin? (Permission denied)

(matchbox-desktop:2419): dbind-WARNING **: 09:38:53.219: Error retrieving accessibility bus address: org.a11y.Bus.Error: Failed to execute child process ?/usr/bin? (Permission denied)
mount: /mnt: /dev/mmcblk0p1 already mounted on /run/media/mmcblk0p1.
mount: /mnt: /dev/mmcblk0 already mounted or mount point busy.
root@ultra96v2-oob-2019_2:~# 
root@ultra96v2-oob-2019_2:~# 
root@ultra96v2-oob-2019_2:~# source [2586:2586:0205/093904:ERROR:gl_factory.cc(48)] Requested GL implementation is not available.
[2586:2586:0205/093904:ERROR:gpu_child_thread.cc(348)] Exiting GPU process due to errors during initialization
  
root@ultra96v2-oob-2019_2:~# 
root@ultra96v2-oob-2019_2:~# 
root@ultra96v2-oob-2019_2:~# source ros_setup.sh
[2377:2573:0205/093916:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed to launch GPU process.
[2377:2573:0205/093917:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed to launch GPU process.

root@ultra96v2-oob-2019_2:~# 
root@ultra96v2-oob-2019_2:~# echo $LD_LIBRARY_PATH
/usr/lib
root@ultra96v2-oob-2019_2:~# ros2 topic list
/parameter_events
/rosout
root@ultra96v2-oob-2019_2:~# ros2 msg list
action_msgs/msg/GoalInfo
action_msgs/msg/GoalStatus
action_msgs/msg/GoalStatusArray
actionlib_msgs/msg/GoalID
actionlib_msgs/msg/GoalStatus
actionlib_msgs/msg/GoalStatusArray
builtin_interfaces/msg/Duration
builtin_interfaces/msg/Time
diagnostic_msgs/msg/DiagnosticArray
diagnostic_msgs/msg/DiagnosticStatus
diagnostic_msgs/msg/KeyValue
geometry_msgs/msg/Accel
geometry_msgs/msg/AccelStamped
geometry_msgs/msg/AccelWithCovariance
geometry_msgs/msg/AccelWithCovarianceStamped
geometry_msgs/msg/Inertia
geometry_msgs/msg/InertiaStamped
geometry_msgs/msg/Point
geometry_msgs/msg/Point32
geometry_msgs/msg/PointStamped
geometry_msgs/msg/Polygon
geometry_msgs/msg/PolygonStamped
geometry_msgs/msg/Pose
geometry_msgs/msg/Pose2D
geometry_msgs/msg/PoseArray
geometry_msgs/msg/PoseStamped
geometry_msgs/msg/PoseWithCovariance
geometry_msgs/msg/PoseWithCovarianceStamped
geometry_msgs/msg/Quaternion
geometry_msgs/msg/QuaternionStamped
geometry_msgs/msg/Transform
geometry_msgs/msg/TransformStamped
geometry_msgs/msg/Twist
geometry_msgs/msg/TwistStamped
geometry_msgs/msg/TwistWithCovariance
geometry_msgs/msg/TwistWithCovarianceStamped
geometry_msgs/msg/Vector3
geometry_msgs/msg/Vector3Stamped
geometry_msgs/msg/Wrench
geometry_msgs/msg/WrenchStamped
lifecycle_msgs/msg/State
lifecycle_msgs/msg/Transition
lifecycle_msgs/msg/TransitionDescription
lifecycle_msgs/msg/TransitionEvent
nav_msgs/msg/GridCells
nav_msgs/msg/MapMetaData
nav_msgs/msg/OccupancyGrid
nav_msgs/msg/Odometry
nav_msgs/msg/Path
rcl_interfaces/msg/FloatingPointRange
rcl_interfaces/msg/IntegerRange
rcl_interfaces/msg/IntraProcessMessage
rcl_interfaces/msg/ListParametersResult
rcl_interfaces/msg/Log
rcl_interfaces/msg/Parameter
rcl_interfaces/msg/ParameterDescriptor
rcl_interfaces/msg/ParameterEvent
rcl_interfaces/msg/ParameterEventDescriptors
rcl_interfaces/msg/ParameterType
rcl_interfaces/msg/ParameterValue
rcl_interfaces/msg/SetParametersResult
rosgraph_msgs/msg/Clock
sensor_msgs/msg/BatteryState
sensor_msgs/msg/CameraInfo
sensor_msgs/msg/ChannelFloat32
sensor_msgs/msg/CompressedImage
sensor_msgs/msg/FluidPressure
sensor_msgs/msg/Illuminance
sensor_msgs/msg/Image
sensor_msgs/msg/Imu
sensor_msgs/msg/JointState
sensor_msgs/msg/Joy
sensor_msgs/msg/JoyFeedback
sensor_msgs/msg/JoyFeedbackArray
sensor_msgs/msg/LaserEcho
sensor_msgs/msg/LaserScan
sensor_msgs/msg/MagneticField
sensor_msgs/msg/MultiDOFJointState
sensor_msgs/msg/MultiEchoLaserScan
sensor_msgs/msg/NavSatFix
sensor_msgs/msg/NavSatStatus
sensor_msgs/msg/PointCloud
sensor_msgs/msg/PointCloud2
sensor_msgs/msg/PointField
sensor_msgs/msg/Range
sensor_msgs/msg/RegionOfInterest
sensor_msgs/msg/RelativeHumidity
sensor_msgs/msg/Temperature
sensor_msgs/msg/TimeReference
shape_msgs/msg/Mesh
shape_msgs/msg/MeshTriangle
shape_msgs/msg/Plane
shape_msgs/msg/SolidPrimitive
std_msgs/msg/Bool
std_msgs/msg/Byte
std_msgs/msg/ByteMultiArray
std_msgs/msg/Char
std_msgs/msg/ColorRGBA
std_msgs/msg/Empty
std_msgs/msg/Float32
std_msgs/msg/Float32MultiArray
std_msgs/msg/Float64
std_msgs/msg/Float64MultiArray
std_msgs/msg/Header
std_msgs/msg/Int16
std_msgs/msg/Int16MultiArray
std_msgs/msg/Int32
std_msgs/msg/Int32MultiArray
std_msgs/msg/Int64
std_msgs/msg/Int64MultiArray
std_msgs/msg/Int8
std_msgs/msg/Int8MultiArray
std_msgs/msg/MultiArrayDimension
std_msgs/msg/MultiArrayLayout
std_msgs/msg/String
std_msgs/msg/UInt16
std_msgs/msg/UInt16MultiArray
std_msgs/msg/UInt32
std_msgs/msg/UInt32MultiArray
std_msgs/msg/UInt64
std_msgs/msg/UInt64MultiArray
std_msgs/msg/UInt8
std_msgs/msg/UInt8MultiArray
stereo_msgs/msg/DisparityImage
trajectory_msgs/msg/JointTrajectory
trajectory_msgs/msg/JointTrajectoryPoint
trajectory_msgs/msg/MultiDOFJointTrajectory
trajectory_msgs/msg/MultiDOFJointTrajectoryPoint
unique_identifier_msgs/msg/UUID
visualization_msgs/msg/ImageMarker
visualization_msgs/msg/InteractiveMarker
visualization_msgs/msg/InteractiveMarkerControl
visualization_msgs/msg/InteractiveMarkerFeedback
visualization_msgs/msg/InteractiveMarkerInit
visualization_msgs/msg/InteractiveMarkerPose
visualization_msgs/msg/InteractiveMarkerUpdate
visualization_msgs/msg/Marker
visualization_msgs/msg/MarkerArray
visualization_msgs/msg/MenuEntry
root@ultra96v2-oob-2019_2:~# (sleep 5; ros2 topic pub /chatter std_msgs/String "data: Hello world") &
[1] 3871
root@ultra96v2-oob-2019_2:~# ros2 topic echo /chatter
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='Hello world')

publishing #2: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #3: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #4: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #5: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #6: std_msgs.msg.String(data='Hello world')

data: Hello world
---
publishing #7: std_msgs.msg.String(data='Hello world')

data: Hello world
---
QEMU: Terminated
qemu-system-microblazeel: /pmu@0: Disconnected clk=454329055928 ns





ultra96v2_oobにros2-dashingを導入する方法その1〜

meta-ros導入のメモu-bootやqemu-devicetreeの設定変更など書き散らしたものを整理していきます。

環境作成するための方法をまとめて後で使用できるようにすることが目的です。
petalinuxとvitisのインストールは省略し、Vivadoプロジェクトを作成した後からの続きの手順を記載します。




petalinuxのプロジェクトを作成します。ただし、sstateはmeta-rosの導入時に問題が出たので設定しません。buildはまだです。

次にu-bootのconfig_sys_text_baseを修正します。
パッチファイル作成し、以下に保存します。

<petalinux_prj>/project-spec/meta-user/recipes-bsp/u-boot/files/config_sys_text_base_amend.patch

<petalinux_prj>/project-spec/meta-user/recipes-bsp/u-boot/u-boot-xlnx_%.bbappendを以下の通りにしてパッチを追加します。


FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

SRC_URI += "file://platform-top.h"
SRC_URI += "file://bsp.cfg"
SRC_URI += "file://config_sys_text_base_amend.patch"


u-bootの次はqemu用のhw-dtbを修正するパッチを当てます。
結局petalinux-buildではrosを導入できなかったのでzcu102のqemu用dtbを使用すればいいような気もするけど、せっかくなので。
ファイルを置く場所は<petalinux_prj>/project-spec/meta-user/recipes-devtools/qemu/files/0001-enable-gems-for-zcu100-arm.dts.patchです。
後述するbitbakeを使用してbitbake -e qemu-devicetrees | grep ^FILEでレベルを合わせてmeta-userに配置することで適用できます。
パッチの内容は以下のようにgemのinvalidをコメントアウトしているだけです。
これでqemu動作させた際にgem3を使用して通信可能にし、rosの模擬動作やgazeboとの接続ができるようになるはずです。

From 4b5e8412beaff0a773ac4c960344e661e460ac65 Mon Sep 17 00:00:00 2001
From: Akira Nishiyama <xxxx@xxx.xxx>
Date: Wed, 29 Jan 2020 08:04:19 +0900
Subject: [PATCH] enable gems for zcu100-arm.dts

---
 zcu100-arm.dts | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/zcu100-arm.dts b/zcu100-arm.dts
index 4eee783..28351dc 100644
--- a/zcu100-arm.dts
+++ b/zcu100-arm.dts
@@ -40,6 +40,7 @@
 };

 /* Invalidate all GEMs as there is no Ethernet */
+/*
 &gem0 {
     compatible = "invalid";
 };
@@ -55,7 +56,7 @@
 &gem3 {
     compatible = "invalid";
 };
-
+*/
 &ps7_qspi_0 {
     qspi-flash@0 {
         compatible = "n25q128a13";
-- 
2.17.1

この後はpetalinuxツールではなくyoctoを使用していくための設定を行うのと、
meta-ros導入時に発生したtaskhash mismatchの問題に対応するためにソースからビルドしていくように設定します。
長くなるので続く



2020年2月4日火曜日

ultra96v2_oobをカスタムする話その4_meta-rosを導入するまでのメモ

とりあえずmeta-rosをビルドできるだけの環境を用意する。
ここを参考に環境を整えていく。

cd project-spec
git clone https://github.com/ros/meta-ros -b thud-draft

そのままuser-layerとして追加しようとしたけどtaskhashの問題出てきたので、
petalinux環境をgithubのXilinx/meta-xxxから作成できるように変更した。
rel-v2019.2を使っておけばインストールしたものと同じ状態になるはずなので試した。

pythonのsetuptoolsが見つからないエラーが出たのでmeta-ros-backports-warriorからpythonレシピを削除。
backportsしている理由がよくわからないから問題出るかもしれないけどとりあえず続行。

ultra96v2_oobをそのままビルドするとchromeのビルドには最大27Gのメモリが必要なので注意。
メモリが必要なのはこいつのみなのでswap増し増しでビルドを通す。

sstate_cacheの問題と見られるエラーが発生。以下のページを参考。
https://github.com/Xilinx/Edge-AI-Platform-Tutorials/issues/3

またlocked_sigからlibgcc-initial,glibc-initialを削除。
taskhashの問題発生のため。

これで本当に同一かはわからないけどとりあえずビルドとQEMUの動作確認はできた。
実機もOK。