Closed10

Raspberry Pi 5(Raspberry Pi OSインストール済み)にROS2(Jazzy Jalisco)をインストールする

horie-thorie-t

なぜ、UbuntuではなくRaspberry Pi OS?

ROS2がサポートしているのは、Linuxの場合はUbuntuがTier 1サポートとなっている。Rasperry Pi OSは、DebianベースなのでTier 3に近い。

ROS2を苦労せずに動かすには、Raspberry Pi 5の場合はUbuntu 24.04を使った方が良いのだが、Ubuntu 24.04のヘッドレス運用のための設定に苦戦する羽目になってしまった。この調子だとデバイス・ドライバ周りでも苦労が予想された。

どうせ苦労するなら、上位レイヤで苦労した方が時間が短く済みそうなので、ROS2はTier 3のサポートが期待できそうなRaspberry Pi OSにソースコードからインストールする事にした。

horie-thorie-t

なぜ、Jazzy Jalisco?

これを書いている2024年5月4日現在はJazzy Jaliscoはリリースされていない。(5月23日リリース予定)

しかし、Raspberry Pi 5にインストールできるRaspberry Pi OSはDebian 12(Bookworm)がベースになっている。BookwormをサポートするROS2はJazzy Jaliscoになっている。ちょうど5月1日からJazzy Jalisco Testing and Tutorial Partyが実施されるので、チュートリアルにしたがってインストールする。

horie-thorie-t

ソースからのインストール手順

システム要件

  • Tier 3: Debian Linux - Bookworm (12) 64-bit

に合致しているものとして作業。

システムセットアップ

ロケールの設定

まずは、現状の確認。まあ、イギリス設定だよな・・・

$ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=

変更。

$ sudo apt update && sudo apt install locales
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian-security bookworm-security InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
Hit:4 http://archive.raspberrypi.com/debian bookworm InRelease   
Reading package lists... Done                                    
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
locales is already the newest version (2.36-9+rpt2+deb12u6).
The following package was automatically installed and is no longer required:
  libraspberrypi0
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
tetsuya@raspberrypi:~ $ sudo locale-gen en_US en_US.UTF-8
Generating locales (this might take a while)...
  en_GB.UTF-8... done
Generation complete.
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
*** update-locale: Error: invalid locale settings:  LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

いきなり、エラー発生。

エラーメッセージでググると、Stack Overflowの記事があったので、/etc/locale.genを確認

$ cat /etc/locale.gen
# This file lists locales that you wish to have built. You can find a list
# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add
# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change
# this file, you need to rerun locale-gen.
#

# C.UTF-8 UTF-8
# aa_DJ ISO-8859-1
# aa_DJ.UTF-8 UTF-8
# aa_ER UTF-8
# aa_ER@saaho UTF-8
# aa_ET UTF-8
# af_ZA ISO-8859-1
# af_ZA.UTF-8 UTF-8
# agr_PE UTF-8
# ak_GH UTF-8
# am_ET UTF-8
# an_ES ISO-8859-15
# an_ES.UTF-8 UTF-8
# anp_IN UTF-8
# ar_AE ISO-8859-6
# ar_AE.UTF-8 UTF-8
# ar_BH ISO-8859-6
# ar_BH.UTF-8 UTF-8
# ar_DZ ISO-8859-6
# ar_DZ.UTF-8 UTF-8
# ar_EG ISO-8859-6
# ar_EG.UTF-8 UTF-8
# ar_IN UTF-8
# ar_IQ ISO-8859-6
# ar_IQ.UTF-8 UTF-8
# ar_JO ISO-8859-6
# ar_JO.UTF-8 UTF-8
# ar_KW ISO-8859-6
# ar_KW.UTF-8 UTF-8
# ar_LB ISO-8859-6
# ar_LB.UTF-8 UTF-8
# ar_LY ISO-8859-6
# ar_LY.UTF-8 UTF-8
# ar_MA ISO-8859-6
# ar_MA.UTF-8 UTF-8
# ar_OM ISO-8859-6
# ar_OM.UTF-8 UTF-8
# ar_QA ISO-8859-6
# ar_QA.UTF-8 UTF-8
# ar_SA ISO-8859-6
# ar_SA.UTF-8 UTF-8
# ar_SD ISO-8859-6
# ar_SD.UTF-8 UTF-8
# ar_SS UTF-8
# ar_SY ISO-8859-6
# ar_SY.UTF-8 UTF-8
# ar_TN ISO-8859-6
# ar_TN.UTF-8 UTF-8
# ar_YE ISO-8859-6
# ar_YE.UTF-8 UTF-8
# as_IN UTF-8
# ast_ES ISO-8859-15
# ast_ES.UTF-8 UTF-8
# ayc_PE UTF-8
# az_AZ UTF-8
# az_IR UTF-8
# be_BY CP1251
# be_BY.UTF-8 UTF-8
# be_BY@latin UTF-8
# bem_ZM UTF-8
# ber_DZ UTF-8
# ber_MA UTF-8
# bg_BG CP1251
# bg_BG.UTF-8 UTF-8
# bhb_IN.UTF-8 UTF-8
# bho_IN UTF-8
# bho_NP UTF-8
# bi_VU UTF-8
# bn_BD UTF-8
# bn_IN UTF-8
# bo_CN UTF-8
# bo_IN UTF-8
# br_FR ISO-8859-1
# br_FR.UTF-8 UTF-8
# br_FR@euro ISO-8859-15
# brx_IN UTF-8
# bs_BA ISO-8859-2
# bs_BA.UTF-8 UTF-8
# byn_ER UTF-8
# ca_AD ISO-8859-15
# ca_AD.UTF-8 UTF-8
# ca_ES ISO-8859-1
# ca_ES.UTF-8 UTF-8
# ca_ES@euro ISO-8859-15
# ca_ES@valencia UTF-8
# ca_FR ISO-8859-15
# ca_FR.UTF-8 UTF-8
# ca_IT ISO-8859-15
# ca_IT.UTF-8 UTF-8
# ce_RU UTF-8
# chr_US UTF-8
# ckb_IQ UTF-8
# cmn_TW UTF-8
# crh_UA UTF-8
# cs_CZ ISO-8859-2
# cs_CZ.UTF-8 UTF-8
# csb_PL UTF-8
# cv_RU UTF-8
# cy_GB ISO-8859-14
# cy_GB.UTF-8 UTF-8
# da_DK ISO-8859-1
# da_DK.UTF-8 UTF-8
# de_AT ISO-8859-1
# de_AT.UTF-8 UTF-8
# de_AT@euro ISO-8859-15
# de_BE ISO-8859-1
# de_BE.UTF-8 UTF-8
# de_BE@euro ISO-8859-15
# de_CH ISO-8859-1
# de_CH.UTF-8 UTF-8
# de_DE ISO-8859-1
# de_DE.UTF-8 UTF-8
# de_DE@euro ISO-8859-15
# de_IT ISO-8859-1
# de_IT.UTF-8 UTF-8
# de_LI.UTF-8 UTF-8
# de_LU ISO-8859-1
# de_LU.UTF-8 UTF-8
# de_LU@euro ISO-8859-15
# doi_IN UTF-8
# dsb_DE UTF-8
# dv_MV UTF-8
# dz_BT UTF-8
# el_CY ISO-8859-7
# el_CY.UTF-8 UTF-8
# el_GR ISO-8859-7
# el_GR.UTF-8 UTF-8
# el_GR@euro ISO-8859-7
# en_AG UTF-8
# en_AU ISO-8859-1
# en_AU.UTF-8 UTF-8
# en_BW ISO-8859-1
# en_BW.UTF-8 UTF-8
# en_CA ISO-8859-1
# en_CA.UTF-8 UTF-8
# en_DK ISO-8859-1
# en_DK.ISO-8859-15 ISO-8859-15
# en_DK.UTF-8 UTF-8
# en_GB ISO-8859-1
# en_GB.ISO-8859-15 ISO-8859-15
en_GB.UTF-8 UTF-8
# en_HK ISO-8859-1
# en_HK.UTF-8 UTF-8
# en_IE ISO-8859-1
# en_IE.UTF-8 UTF-8
# en_IE@euro ISO-8859-15
# en_IL UTF-8
# en_IN UTF-8
# en_NG UTF-8
# en_NZ ISO-8859-1
# en_NZ.UTF-8 UTF-8
# en_PH ISO-8859-1
# en_PH.UTF-8 UTF-8
# en_SC.UTF-8 UTF-8
# en_SG ISO-8859-1
# en_SG.UTF-8 UTF-8
# en_US ISO-8859-1
# en_US.ISO-8859-15 ISO-8859-15
# en_US.UTF-8 UTF-8
# en_ZA ISO-8859-1
# en_ZA.UTF-8 UTF-8
# en_ZM UTF-8
# en_ZW ISO-8859-1
# en_ZW.UTF-8 UTF-8
# eo UTF-8
# es_AR ISO-8859-1
# es_AR.UTF-8 UTF-8
# es_BO ISO-8859-1
# es_BO.UTF-8 UTF-8
# es_CL ISO-8859-1
# es_CL.UTF-8 UTF-8
# es_CO ISO-8859-1
# es_CO.UTF-8 UTF-8
# es_CR ISO-8859-1
# es_CR.UTF-8 UTF-8
# es_CU UTF-8
# es_DO ISO-8859-1
# es_DO.UTF-8 UTF-8
# es_EC ISO-8859-1
# es_EC.UTF-8 UTF-8
# es_ES ISO-8859-1
# es_ES.UTF-8 UTF-8
# es_ES@euro ISO-8859-15
# es_GT ISO-8859-1
# es_GT.UTF-8 UTF-8
# es_HN ISO-8859-1
# es_HN.UTF-8 UTF-8
# es_MX ISO-8859-1
# es_MX.UTF-8 UTF-8
# es_NI ISO-8859-1
# es_NI.UTF-8 UTF-8
# es_PA ISO-8859-1
# es_PA.UTF-8 UTF-8
# es_PE ISO-8859-1
# es_PE.UTF-8 UTF-8
# es_PR ISO-8859-1
# es_PR.UTF-8 UTF-8
# es_PY ISO-8859-1
# es_PY.UTF-8 UTF-8
# es_SV ISO-8859-1
# es_SV.UTF-8 UTF-8
# es_US ISO-8859-1
# es_US.UTF-8 UTF-8
# es_UY ISO-8859-1
# es_UY.UTF-8 UTF-8
# es_VE ISO-8859-1
# es_VE.UTF-8 UTF-8
# et_EE ISO-8859-1
# et_EE.ISO-8859-15 ISO-8859-15
# et_EE.UTF-8 UTF-8
# eu_ES ISO-8859-1
# eu_ES.UTF-8 UTF-8
# eu_ES@euro ISO-8859-15
# eu_FR ISO-8859-1
# eu_FR.UTF-8 UTF-8
# eu_FR@euro ISO-8859-15
# fa_IR UTF-8
# ff_SN UTF-8
# fi_FI ISO-8859-1
# fi_FI.UTF-8 UTF-8
# fi_FI@euro ISO-8859-15
# fil_PH UTF-8
# fo_FO ISO-8859-1
# fo_FO.UTF-8 UTF-8
# fr_BE ISO-8859-1
# fr_BE.UTF-8 UTF-8
# fr_BE@euro ISO-8859-15
# fr_CA ISO-8859-1
# fr_CA.UTF-8 UTF-8
# fr_CH ISO-8859-1
# fr_CH.UTF-8 UTF-8
# fr_FR ISO-8859-1
# fr_FR.UTF-8 UTF-8
# fr_FR@euro ISO-8859-15
# fr_LU ISO-8859-1
# fr_LU.UTF-8 UTF-8
# fr_LU@euro ISO-8859-15
# fur_IT UTF-8
# fy_DE UTF-8
# fy_NL UTF-8
# ga_IE ISO-8859-1
# ga_IE.UTF-8 UTF-8
# ga_IE@euro ISO-8859-15
# gd_GB ISO-8859-15
# gd_GB.UTF-8 UTF-8
# gez_ER UTF-8
# gez_ER@abegede UTF-8
# gez_ET UTF-8
# gez_ET@abegede UTF-8
# gl_ES ISO-8859-1
# gl_ES.UTF-8 UTF-8
# gl_ES@euro ISO-8859-15
# gu_IN UTF-8
# gv_GB ISO-8859-1
# gv_GB.UTF-8 UTF-8
# ha_NG UTF-8
# hak_TW UTF-8
# he_IL ISO-8859-8
# he_IL.UTF-8 UTF-8
# hi_IN UTF-8
# hif_FJ UTF-8
# hne_IN UTF-8
# hr_HR ISO-8859-2
# hr_HR.UTF-8 UTF-8
# hsb_DE ISO-8859-2
# hsb_DE.UTF-8 UTF-8
# ht_HT UTF-8
# hu_HU ISO-8859-2
# hu_HU.UTF-8 UTF-8
# hy_AM UTF-8
# hy_AM.ARMSCII-8 ARMSCII-8
# ia_FR UTF-8
# id_ID ISO-8859-1
# id_ID.UTF-8 UTF-8
# ig_NG UTF-8
# ik_CA UTF-8
# is_IS ISO-8859-1
# is_IS.UTF-8 UTF-8
# it_CH ISO-8859-1
# it_CH.UTF-8 UTF-8
# it_IT ISO-8859-1
# it_IT.UTF-8 UTF-8
# it_IT@euro ISO-8859-15
# iu_CA UTF-8
# ja_JP.EUC-JP EUC-JP
# ja_JP.UTF-8 UTF-8
# ka_GE GEORGIAN-PS
# ka_GE.UTF-8 UTF-8
# kab_DZ UTF-8
# kk_KZ PT154
# kk_KZ.RK1048 RK1048
# kk_KZ.UTF-8 UTF-8
# kl_GL ISO-8859-1
# kl_GL.UTF-8 UTF-8
# km_KH UTF-8
# kn_IN UTF-8
# ko_KR.EUC-KR EUC-KR
# ko_KR.UTF-8 UTF-8
# kok_IN UTF-8
# ks_IN UTF-8
# ks_IN@devanagari UTF-8
# ku_TR ISO-8859-9
# ku_TR.UTF-8 UTF-8
# kw_GB ISO-8859-1
# kw_GB.UTF-8 UTF-8
# ky_KG UTF-8
# lb_LU UTF-8
# lg_UG ISO-8859-10
# lg_UG.UTF-8 UTF-8
# li_BE UTF-8
# li_NL UTF-8
# lij_IT UTF-8
# ln_CD UTF-8
# lo_LA UTF-8
# lt_LT ISO-8859-13
# lt_LT.UTF-8 UTF-8
# lv_LV ISO-8859-13
# lv_LV.UTF-8 UTF-8
# lzh_TW UTF-8
# mag_IN UTF-8
# mai_IN UTF-8
# mai_NP UTF-8
# mfe_MU UTF-8
# mg_MG ISO-8859-15
# mg_MG.UTF-8 UTF-8
# mhr_RU UTF-8
# mi_NZ ISO-8859-13
# mi_NZ.UTF-8 UTF-8
# miq_NI UTF-8
# mjw_IN UTF-8
# mk_MK ISO-8859-5
# mk_MK.UTF-8 UTF-8
# ml_IN UTF-8
# mn_MN UTF-8
# mni_IN UTF-8
# mnw_MM UTF-8
# mr_IN UTF-8
# ms_MY ISO-8859-1
# ms_MY.UTF-8 UTF-8
# mt_MT ISO-8859-3
# mt_MT.UTF-8 UTF-8
# my_MM UTF-8
# nan_TW UTF-8
# nan_TW@latin UTF-8
# nb_NO ISO-8859-1
# nb_NO.UTF-8 UTF-8
# nds_DE UTF-8
# nds_NL UTF-8
# ne_NP UTF-8
# nhn_MX UTF-8
# niu_NU UTF-8
# niu_NZ UTF-8
# nl_AW UTF-8
# nl_BE ISO-8859-1
# nl_BE.UTF-8 UTF-8
# nl_BE@euro ISO-8859-15
# nl_NL ISO-8859-1
# nl_NL.UTF-8 UTF-8
# nl_NL@euro ISO-8859-15
# nn_NO ISO-8859-1
# nn_NO.UTF-8 UTF-8
# nr_ZA UTF-8
# nso_ZA UTF-8
# oc_FR ISO-8859-1
# oc_FR.UTF-8 UTF-8
# om_ET UTF-8
# om_KE ISO-8859-1
# om_KE.UTF-8 UTF-8
# or_IN UTF-8
# os_RU UTF-8
# pa_IN UTF-8
# pa_PK UTF-8
# pap_AW UTF-8
# pap_CW UTF-8
# pl_PL ISO-8859-2
# pl_PL.UTF-8 UTF-8
# ps_AF UTF-8
# pt_BR ISO-8859-1
# pt_BR.UTF-8 UTF-8
# pt_PT ISO-8859-1
# pt_PT.UTF-8 UTF-8
# pt_PT@euro ISO-8859-15
# quz_PE UTF-8
# raj_IN UTF-8
# rif_MA UTF-8
# ro_RO ISO-8859-2
# ro_RO.UTF-8 UTF-8
# ru_RU ISO-8859-5
# ru_RU.CP1251 CP1251
# ru_RU.KOI8-R KOI8-R
# ru_RU.UTF-8 UTF-8
# ru_UA KOI8-U
# ru_UA.UTF-8 UTF-8
# rw_RW UTF-8
# sa_IN UTF-8
# sah_RU UTF-8
# sat_IN UTF-8
# sc_IT UTF-8
# sd_IN UTF-8
# sd_IN@devanagari UTF-8
# se_NO UTF-8
# sgs_LT UTF-8
# shn_MM UTF-8
# shs_CA UTF-8
# si_LK UTF-8
# sid_ET UTF-8
# sk_SK ISO-8859-2
# sk_SK.UTF-8 UTF-8
# sl_SI ISO-8859-2
# sl_SI.UTF-8 UTF-8
# sm_WS UTF-8
# so_DJ ISO-8859-1
# so_DJ.UTF-8 UTF-8
# so_ET UTF-8
# so_KE ISO-8859-1
# so_KE.UTF-8 UTF-8
# so_SO ISO-8859-1
# so_SO.UTF-8 UTF-8
# sq_AL ISO-8859-1
# sq_AL.UTF-8 UTF-8
# sq_MK UTF-8
# sr_ME UTF-8
# sr_RS UTF-8
# sr_RS@latin UTF-8
# ss_ZA UTF-8
# st_ZA ISO-8859-1
# st_ZA.UTF-8 UTF-8
# sv_FI ISO-8859-1
# sv_FI.UTF-8 UTF-8
# sv_FI@euro ISO-8859-15
# sv_SE ISO-8859-1
# sv_SE.ISO-8859-15 ISO-8859-15
# sv_SE.UTF-8 UTF-8
# sw_KE UTF-8
# sw_TZ UTF-8
# syr UTF-8
# szl_PL UTF-8
# ta_IN UTF-8
# ta_LK UTF-8
# tcy_IN.UTF-8 UTF-8
# te_IN UTF-8
# tg_TJ KOI8-T
# tg_TJ.UTF-8 UTF-8
# th_TH TIS-620
# th_TH.UTF-8 UTF-8
# the_NP UTF-8
# ti_ER UTF-8
# ti_ET UTF-8
# tig_ER UTF-8
# tk_TM UTF-8
# tl_PH ISO-8859-1
# tl_PH.UTF-8 UTF-8
# tn_ZA UTF-8
# to_TO UTF-8
# tpi_PG UTF-8
# tr_CY ISO-8859-9
# tr_CY.UTF-8 UTF-8
# tr_TR ISO-8859-9
# tr_TR.UTF-8 UTF-8
# ts_ZA UTF-8
# tt_RU UTF-8
# tt_RU@iqtelif UTF-8
# ug_CN UTF-8
# uk_UA KOI8-U
# uk_UA.UTF-8 UTF-8
# unm_US UTF-8
# ur_IN UTF-8
# ur_PK UTF-8
# uz_UZ ISO-8859-1
# uz_UZ.UTF-8 UTF-8
# uz_UZ@cyrillic UTF-8
# ve_ZA UTF-8
# vi_VN UTF-8
# wa_BE ISO-8859-1
# wa_BE.UTF-8 UTF-8
# wa_BE@euro ISO-8859-15
# wae_CH UTF-8
# wal_ET UTF-8
# wo_SN UTF-8
# xh_ZA ISO-8859-1
# xh_ZA.UTF-8 UTF-8
# yi_US CP1255
# yi_US.UTF-8 UTF-8
# yo_NG UTF-8
# yue_HK UTF-8
# yuw_PG UTF-8
# zh_CN GB2312
# zh_CN.GB18030 GB18030
# zh_CN.GBK GBK
# zh_CN.UTF-8 UTF-8
# zh_HK BIG5-HKSCS
# zh_HK.UTF-8 UTF-8
# zh_SG GB2312
# zh_SG.GBK GBK
# zh_SG.UTF-8 UTF-8
# zh_TW BIG5
# zh_TW.EUC-TW EUC-TW
# zh_TW.UTF-8 UTF-8
# zu_ZA ISO-8859-1
# zu_ZA.UTF-8 UTF-8

/etc/locale.genを編集。

sudo vi /etc/locale.gen 

3行を以下のようにアンコメント

C.UTF-8 UTF-8
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8

もう一度。なんかlocale-genコマンドの引数は意味がなさそう。

$ sudo locale-gen en_US en_US.UTF-8
Generating locales (this might take a while)...
  C.UTF-8... done
  en_GB.UTF-8... done
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ 

先へ進む。うまく行ってそう。LC_ALLが空なのは気になるけど。

$ export LANG=en_US.UTF-8
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
horie-thorie-t

必要なリポジトリを有効化

追加しようとしたけど、エラー発生。

$ sudo apt install software-properties-common
# 中略
$ sudo add-apt-repository universe
Unable to handle repository shortcut 'universe'

Stack Exchangeの記事によると

There's not Universe, universe, nor another permutation in Debian. This is a Ubuntu and derivatives only component. The only components you will find in debian are main, contrib and non-free. Only those.
和訳: DebianにはUniverseもuniverseも他の順列もありません。これはUbuntuとその派生物のみのコンポーネントです。debianにあるコンポーネントはmain、contrib、non-freeのみです。これらのみです。

との事で、現状を確認。non-freeに加え、non-free-firmwareまである。

$ cat /etc/apt/sources.list
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
# Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source'
#deb-src http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian-security/ bookworm-security main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware

ROS 2 GPG keyを追加

$ sudo apt update && sudo apt install curl -y
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://deb.debian.org/debian-security bookworm-security InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease   
Hit:4 http://archive.raspberrypi.com/debian bookworm InRelease   
Reading package lists... Done                                    
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
curl is already the newest version (7.88.1-10+deb12u5).
The following package was automatically installed and is no longer required:
  libraspberrypi0
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

リポジトリを追加しようとしたけど、$(. /etc/os-release && echo $UBUNTU_CODENAME)は多分動かないので、/etc/os-releaseを確認。

$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

なので、VERSION_CODENAMEに変更して実行する。

$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2-testing/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
horie-thorie-t

開発ツールをインストール

特に問題なくインストールできた。

sudo apt update && sudo apt install -y \
  python3-pip \
  python3-pytest-cov \
  python3-flake8-blind-except \
  python3-flake8-class-newline \
  python3-flake8-deprecated \
  python3-pytest-repeat \
  python3-pytest-rerunfailures \
  ros-dev-tools
horie-thorie-t

ROS 2のビルド

ROS 2のコードの取得

$ mkdir -p ~/ros2_jazzy/src
tetsuya@raspberrypi:~ $ cd ~/ros2_jazzy
tetsuya@raspberrypi:~/ros2_jazzy $ vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src
...........................................................................................................
=== src/ament/ament_cmake (git) ===
Cloning into '.'...
=== src/ament/ament_index (git) ===
Cloning into '.'...
=== src/ament/ament_lint (git) ===
Cloning into '.'...
=== src/ament/ament_package (git) ===
Cloning into '.'...
=== src/ament/google_benchmark_vendor (git) ===
Cloning into '.'...
=== src/ament/googletest (git) ===
Cloning into '.'...
=== src/ament/uncrustify_vendor (git) ===
Cloning into '.'...
=== src/eProsima/Fast-CDR (git) ===
Cloning into '.'...
=== src/eProsima/Fast-DDS (git) ===
Cloning into '.'...
=== src/eProsima/foonathan_memory_vendor (git) ===
Cloning into '.'...
=== src/eclipse-cyclonedds/cyclonedds (git) ===
Cloning into '.'...
=== src/eclipse-iceoryx/iceoryx (git) ===
Cloning into '.'...
=== src/gazebo-release/gz_cmake_vendor (git) ===
Cloning into '.'...
=== src/gazebo-release/gz_math_vendor (git) ===
Cloning into '.'...
=== src/gazebo-release/gz_utils_vendor (git) ===
Cloning into '.'...
=== src/osrf/osrf_pycommon (git) ===
Cloning into '.'...
=== src/osrf/osrf_testing_tools_cpp (git) ===
Cloning into '.'...
=== src/ros-perception/image_common (git) ===
Cloning into '.'...
=== src/ros-perception/laser_geometry (git) ===
Cloning into '.'...
=== src/ros-perception/point_cloud_transport (git) ===
Cloning into '.'...
=== src/ros-planning/navigation_msgs (git) ===
Cloning into '.'...
=== src/ros-tooling/keyboard_handler (git) ===
Cloning into '.'...
=== src/ros-tooling/libstatistics_collector (git) ===
Cloning into '.'...
=== src/ros-visualization/interactive_markers (git) ===
Cloning into '.'...
=== src/ros-visualization/python_qt_binding (git) ===
Cloning into '.'...
=== src/ros-visualization/qt_gui_core (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_action (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_bag (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_console (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_graph (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_msg (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_plot (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_publisher (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_py_console (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_reconfigure (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_service_caller (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_shell (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_srv (git) ===
Cloning into '.'...
=== src/ros-visualization/rqt_topic (git) ===
Cloning into '.'...
=== src/ros-visualization/tango_icons_vendor (git) ===
Cloning into '.'...
=== src/ros/class_loader (git) ===
Cloning into '.'...
=== src/ros/kdl_parser (git) ===
Cloning into '.'...
=== src/ros/pluginlib (git) ===
Cloning into '.'...
=== src/ros/resource_retriever (git) ===
Cloning into '.'...
=== src/ros/robot_state_publisher (git) ===
Cloning into '.'...
=== src/ros/ros_environment (git) ===
Cloning into '.'...
=== src/ros/ros_tutorials (git) ===
Cloning into '.'...
=== src/ros/urdfdom (git) ===
Cloning into '.'...
=== src/ros/urdfdom_headers (git) ===
Cloning into '.'...
=== src/ros2/ament_cmake_ros (git) ===
Cloning into '.'...
=== src/ros2/common_interfaces (git) ===
Cloning into '.'...
=== src/ros2/console_bridge_vendor (git) ===
Cloning into '.'...
=== src/ros2/demos (git) ===
Cloning into '.'...
=== src/ros2/eigen3_cmake_module (git) ===
Cloning into '.'...
=== src/ros2/example_interfaces (git) ===
Cloning into '.'...
=== src/ros2/examples (git) ===
Cloning into '.'...
=== src/ros2/geometry2 (git) ===
Cloning into '.'...
=== src/ros2/launch (git) ===
Cloning into '.'...
=== src/ros2/launch_ros (git) ===
Cloning into '.'...
=== src/ros2/libyaml_vendor (git) ===
Cloning into '.'...
=== src/ros2/message_filters (git) ===
Cloning into '.'...
=== src/ros2/mimick_vendor (git) ===
Cloning into '.'...
=== src/ros2/orocos_kdl_vendor (git) ===
Cloning into '.'...
=== src/ros2/performance_test_fixture (git) ===
Cloning into '.'...
=== src/ros2/pybind11_vendor (git) ===
Cloning into '.'...
=== src/ros2/python_cmake_module (git) ===
Cloning into '.'...
=== src/ros2/rcl (git) ===
Cloning into '.'...
=== src/ros2/rcl_interfaces (git) ===
Cloning into '.'...
=== src/ros2/rcl_logging (git) ===
Cloning into '.'...
=== src/ros2/rclcpp (git) ===
Cloning into '.'...
=== src/ros2/rclpy (git) ===
Cloning into '.'...
=== src/ros2/rcpputils (git) ===
Cloning into '.'...
=== src/ros2/rcutils (git) ===
Cloning into '.'...
=== src/ros2/realtime_support (git) ===
Cloning into '.'...
=== src/ros2/rmw (git) ===
Cloning into '.'...
=== src/ros2/rmw_connextdds (git) ===
Cloning into '.'...
=== src/ros2/rmw_cyclonedds (git) ===
Cloning into '.'...
=== src/ros2/rmw_dds_common (git) ===
Cloning into '.'...
=== src/ros2/rmw_fastrtps (git) ===
Cloning into '.'...
=== src/ros2/rmw_implementation (git) ===
Cloning into '.'...
=== src/ros2/ros2_tracing (git) ===
Cloning into '.'...
=== src/ros2/ros2cli (git) ===
Cloning into '.'...
=== src/ros2/ros2cli_common_extensions (git) ===
Cloning into '.'...
=== src/ros2/ros_testing (git) ===
Cloning into '.'...
=== src/ros2/rosbag2 (git) ===
Cloning into '.'...
=== src/ros2/rosidl (git) ===
Cloning into '.'...
=== src/ros2/rosidl_core (git) ===
Cloning into '.'...
=== src/ros2/rosidl_dds (git) ===
Cloning into '.'...
=== src/ros2/rosidl_defaults (git) ===
Cloning into '.'...
=== src/ros2/rosidl_dynamic_typesupport (git) ===
Cloning into '.'...
=== src/ros2/rosidl_dynamic_typesupport_fastrtps (git) ===
Cloning into '.'...
=== src/ros2/rosidl_python (git) ===
Cloning into '.'...
=== src/ros2/rosidl_runtime_py (git) ===
Cloning into '.'...
=== src/ros2/rosidl_typesupport (git) ===
Cloning into '.'...
=== src/ros2/rosidl_typesupport_fastrtps (git) ===
Cloning into '.'...
=== src/ros2/rpyutils (git) ===
Cloning into '.'...
=== src/ros2/rviz (git) ===
Cloning into '.'...
=== src/ros2/spdlog_vendor (git) ===
Cloning into '.'...
=== src/ros2/sros2 (git) ===
Cloning into '.'...
=== src/ros2/system_tests (git) ===
Cloning into '.'...
=== src/ros2/test_interface_files (git) ===
Cloning into '.'...
=== src/ros2/tinyxml2_vendor (git) ===
Cloning into '.'...
=== src/ros2/tlsf (git) ===
Cloning into '.'...
=== src/ros2/unique_identifier_msgs (git) ===
Cloning into '.'...
=== src/ros2/urdf (git) ===
Cloning into '.'...
=== src/ros2/yaml_cpp_vendor (git) ===
Cloning into '.'...
horie-thorie-t

rosdepを使って依存パッケージをインストール

~/ros2_jazzyディレクトリで実行している事に注意。

~/ros2_jazzy $ sudo apt upgrade
~/ros2_jazzy $ sudo rosdep init
~/ros2_jazzy $ rosdep update
~/ros2_jazzy $ rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
horie-thorie-t

RMWの追加インストール

デフォルトのFastDDSを使うのでスキップ

horie-thorie-t

ワークスペースでビルド

別のROS関係の設定(source /opt/ros/${ROS_DISTRO}/setup.bashの記述)がないかを確認。

$ cat ~/.bashrc 
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
#[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
	# We have color support; assume it's compliant with Ecma-48
	# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
	# a case would tend to support setf rather than setaf.)
	color_prompt=yes
    else
	color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w \$\[\033[00m\] '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
#alias ll='ls -l'
#alias la='ls -A'
#alias l='ls -CF'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

シェルの環境変数も確認。カレントディレクトリの影響で出るわな。

~/ros2_jazzy $ printenv | grep -i ROS
PWD=/home/tetsuya/ros2_jazzy

ビルドできた。

~/ros2_jazzy $ cd ~/ros2_jazzy/
~/ros2_jazzy $ colcon build --symlink-install
horie-thorie-t

環境のセットアップ

. ~/ros2_jazzy/install/local_setup.bash

例題を実行

新しいターミナルを開いて以下のようにtalkerを実行。

$ . ~/ros2_jazzy/install/local_setup.bash
$ ros2 run demo_nodes_cpp talker
[INFO] [1714799965.074857896] [talker]: Publishing: 'Hello World: 1'
[INFO] [1714799966.074809413] [talker]: Publishing: 'Hello World: 2'
[INFO] [1714799967.074837432] [talker]: Publishing: 'Hello World: 3'
[INFO] [1714799968.074872230] [talker]: Publishing: 'Hello World: 4'
# 後略

別ターミナルで以下のようにlistenerを実行

$ ros2 run demo_nodes_py listener
[INFO] [1714799984.097407047] [listener]: I heard: [Hello World: 20]
[INFO] [1714799985.076156630] [listener]: I heard: [Hello World: 21]
[INFO] [1714799986.076119553] [listener]: I heard: [Hello World: 22]
[INFO] [1714799987.076113662] [listener]: I heard: [Hello World: 23]
# 後略

無事、インストールできてROS 2が動いた。

このスクラップは2024/05/05にクローズされました