前回の続きです。見ればわかるとおりとりあえず動かした感がものすごく強いのでご使用の際は自己責任でお願いします。
まずは環境変数の設定をします。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