🍇

ROS 2 用ラズパイUbuntu 22.04の設定・セットアップ・TIPS

2023/05/09に公開

海洋ロボコンをやってた人です。

今回は、ROS 2でロボット制御するために、ラズパイへUbuntu22.04をインストール&セットアップしたので、その備忘録として記載していきます。

なぜまとめるかは以下です。

  • 良記事は無数にありますが、多すぎてChromeのタブが複数になる、どれ見たら良いか迷う
  • ロボット作る自分用に、必要な手順をまとめておけば見返すときに便利
  • Ubuntu2x.xxとバージョン上がっても、自分のメモに追加するだけで数年後も再利用可

"こうすれば簡単に設定できる" というご意見がありましたら、是非ご教授いただけますと幸いです。

また、本記事に対するコメントも積極的に募集しますので、よろしくお願いいたします。

How to Setup a Ubuntu 22.04 on Raspberry Pi

Raspberry Pi Imager > CHOOSE OS > Other general-purpose OS >
Ubuntu > Ubuntu Server 22.04.2 LTS (32-bit)

を使用してOSをSDカードにインストールします。

初めは、Wifiにつながらないので、有線でネットにつなぎます。
モニタ、キーボード、マウス、Ethernetケーブルあれば準備可

WiFi、Ethernetの固定IP設定

ログインして、ネットワークの設定をする。

raspi terminal
ubuntu login: ubuntu
Password: ubuntu

sudo apt install net-tools # ネットワークの設定
sudo apt install nano # CUIでの編集

sudo nano /etc/netplan/99-cloud-init.yaml

最初に、WiFiとEthernetの固定IPまで設定しておく

/etc/netplan/99-cloud-init.yaml
network:
  renderer: networkd
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      optional: true
      addresses: [192.168.13.88/24]
      nameservers:
        addresses: [192.168.13.1]
  wifis:
    wlan0:
      dhcp4: true
      dhcp6: true
      access-points:
        "Buffalo-xxx-":
          password: "xxx"
      addresses: [192.168.11.88/24]
      nameservers:
        addresses: [192.168.11.1]

ネットワークの設定を適応させ、「ifconfig」で固定IPアドレスが設定されているかを確認

raspi terminal
sudo netplan apply
ifconfig

もし

raspi terminal
** (generate:6061): WARNING **: 02:57:30.964: Permissions for /etc/netplan/99-cloud-init.yaml are too open. Netplan configuration should NOT be accessible by others.
# 上述のようなエラーの場合はアクセス権限を制限する

sudo chmod 600 /etc/netplan/99-cloud-init.yaml
sudo netplan generate

設定できたら、その後の操作はPCでssh接続して行う(楽だから)
sshで接続するときは、ユーザ名@IPアドレスでログインする

PC terminal connected raspi
sudo apt install ssh
ssh ubuntu@192.168.11.88

ubuntu@192.168.11.88's password: 
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-1024-raspi armv7l)
・・・略・・・
Last login: Thu May  4 13:06:54 2023 from 192.168.11.3
ubuntu@ubuntu:~$ 

WARNINGが出たら、WARNINGと一緒に表示されるssh-keygenの削除コマンドを実行してから、再度ssh接続すればOK

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!

ssh-keygen -f "/home/ubuntu/.ssh/known_hosts" -R "192.168.11.88"

ROS 2 Humbleのインストール

RaspiをロボットのサブPCとして使用したいため、ROS 2 のインストールは欠かせません。
基本はドキュメント通りなので、下記を参照しインストールします。

また、公式ドキュメントにも記載がありますが、GUIの有無でどちらかを選択します。
GUIが必要でないなら、ros-baseで良いと思います。

sudo apt install ros-humble-desktop # GUI tools.
sudo apt install ros-humble-ros-base # no GUI tools.
/home/ubuntu/.bashrc
source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=89

ros-humble-desktopをインストールすると、サンプルプログラムを動かすことで動作確認ができます。
ros-baseをインストールした場合は、適当にパッケージを作る/クローンして動作確認をしておきます。

mkdir -p ros2_ws/src

Reference 以下2つだけで十分

ROS 2 Documentation: Humble

Install ROS2 Humble on Raspberry Pi 4

使用するライブラリのインストール

以下、センサ類を制御するためにインストールしたライブラリをメモ書き
※ こちらは任意です。用途に応じて各自使い分けてください。

  1. I2Cライブラリ

I2Cでセンサ類から情報を取得するのでインストールします。

PC terminal connected raspi
sudo apt install libi2c-dev -y # cpp library #include <i2c/smbus.h>
sudo apt install python3-smbus # python library
sudo apt install i2c-tools

I2Cのアドレス確認

PC terminal connected raspi
 sudo i2cdetect -y -r 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- -- 

もし、以下のようにすべてのアドレスを確認できない場合

PC terminal connected raspi
Warning: Can't use SMBus Quick Write command, will skip some addresses
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:
10:
20:
30: -- -- -- -- -- -- -- --
40:
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60:
70:

という場合はI2Cアドレスを直接確認する。

PC terminal connected raspi
i2cdump -y 1 0x40
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 11 04 e2 e4 e8 e0 00 00 00 10 00 00 00 10 00 00    ??????...?...?..
10: 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00    .?...?...?...?..
20: 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00    .?...?...?...?..
30: 00 10 00 00 00 10 00 00 00 10 00 00 00 10 00 00    .?...?...?...?..
40: 00 10 00 00 00 10 XX XX XX XX XX XX XX XX XX XX    .?...?XXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX 00 00 00 00 1e 00

アドレスが確認できれば、対象のI2Cアドレスは使用できるので問題なし。


  1. Adafruit servokitライブラリ

PWMサーボドライバーのライブラリをインストール

この辺は、どのモータドライバーを使用するかで適宜インストールします。

PC terminal connected raspi
sudo apt install python3-pip
sudo pip3 install adafruit-circuitpython-servokit


  1. wiringpi ライブラリ

上記のようなソフトウェアPWMではなく、ラズパイ本体でハードウェアPWMを行うときなどに使用する

sudo apt install wiringpi

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

gpio -v

aptでwiringpiをインストールすると、version: 2.5.0なので上記でアップデートする
2023/05/07時点では以下のように、version2.70でした

gpio version: 2.70
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 4B, Revision: 02, Memory: 4096MB, Maker: Sony 
  * Device tree is enabled.
  *--> Raspberry Pi 4 Model B Rev 1.2
  * This Raspberry Pi supports user-level GPIO access.

また、C++ CMakeでビルドするときは依存関係の追記も忘れないように行いましょう。

CMakeLists.txt
# Find WiringPi
find_library(WIRINGPI_LIB wiringPi)
find_path(WIRINGPI_INCLUDE_DIR wiringPi.h)

# Include directories
include_directories(${WIRINGPI_INCLUDE_DIR})


add_executable(xxx src/xxx.cpp)
target_link_libraries(ps_controller ${WIRINGPI_LIB})


ros2コマンドなどの自動起動

ROS/ROS 2 である程度動くロボットを作れるようになると、電源を入れたら自動でROSコマンドが起動して動くようになってほしいと思います。

これはROSコマンド以外でも同じことが言えますが、以降はros2コマンドの自動起動について記載していきます。

  1. .shファイルを記述する

Raspi側の任意のフォルダで.shファイルを記述します。

terminal
cd ~/ros2_ws/src
sudo nano start_bno055_sensor.sh

.shの中身はrosのセットアップやドメインID等と、ros2で実行したいコマンドを記述します。
ros2 run, ros2 launchのどちらでも問題ありません。

start_bno055_sensor.sh
#!/bin/bash
export ROS_DOMAIN_ID=89
source /opt/ros/humble/setup.bash
source /home/ubuntu/ros2_ws/install/setup.bash
# ros2 run bno055_sensor bno055_sensor_node
ros2 launch bno055_sensor bno055.launch.py

記述が終わったら、xxx.shに実行権限を与えます。

terminal
sudo chmod +x /home/ubuntu/ros2_ws/src/start_bno055_sensor.sh


  1. .serviceファイルを記述する

サービスの起動、停止、再起動、自動起動などを管理するために使用する設定ファイルのserviceファイルを記述していきます。
このファイルに.shの実行を紐付けることで自動起動が可能となります。
基本的に.serviceファイルは/etc/systemd/system/下に配置されます。

terminal
sudo nano /etc/systemd/system/ros2_bno055_sensor.service

以下のように記述します。

ros2_bno055_sensor.service
[Unit]
Description=ROS2 BNO055 Sensor

[Service]
ExecStart=/home/ubuntu/ros2_ws/src/start_bno055_sensor.sh
Restart=always
StartLimitInterval=30
StartLimitBurst=3
KillMode=mixed
Type=simple
User=ubuntu

[Install]
WantedBy=multi-user.target

ExecStart:サービスに登録したい実行ファイル等を指定します。ここではstart_bno055_sensor.shが起動するようになっています。

Restart=always:サービスが停止した場合に自動的に再起動するように指示する設定。

StartLimitInterval=60:サービスの開始リトライ間隔を指定。こ再起動が試みられるまでの最小時間間隔が60秒であることを意味します。

StartLimitBurst=3:サービスの開始リトライ回数を指定します。サービスが開始に失敗した場合、最大で3回再試行が行われます。

KillMode=mixed:プロセスの終了方法を指定します。この設定では、最初にSIGTERMシグナルを送信してから、5秒後にSIGKILLシグナルを送信して、プロセスを終了します。

上記の準備ができたら、自動起動を有効化しstartさせます。

terminal
sudo systemctl daemon-reload
sudo systemctl enable ros2_bno055_sensor.service
sudo systemctl start ros2_bno055_sensor.service #起動

上記の後は必ずrebootし、reboot後に他の端末よりros2 topicでノードを確認できればOKです。

terminal
sudo reboot

また、ちゃんと自動起動できているかを確認する場合は、以下で確認してください。

terminal
systemctl status ros2_bno055_sensor.service #ステータスを確認

● ros2_bno055_sensor.service - ROS2 BNO055 Sensor
     Loaded: loaded (/etc/systemd/system/ros2_bno055_sensor.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2023-05-09 05:37:34 UTC; 12min ago
   Main PID: 693 (start_bno055_se)
      Tasks: 14 (limit: 4416)
     Memory: 64.0M
        CPU: 1min 12.684s
     CGroup: /system.slice/ros2_bno055_sensor.service
             ├─693 /bin/bash /home/ubuntu/ros2_ws/src/start_bno055_sensor.sh
             ├─898 /usr/bin/python3 /opt/ros/humble/bin/ros2 launch bno055_sensor bno055.launch.py
             └─899 /home/ubuntu/ros2_ws/install/bno055_sensor/lib/bno055_sensor/bno055_sensor_node --ros-args

自動起動サービスを停止または削除する場合は以下で行います。

terminal
sudo systemctl disable ros2_bno055_sensor.service #停止
Removed /etc/systemd/system/multi-user.target.wants/ros2_bno055_sensor.service.

sudo rm -r /etc/systemd/system/ros2_bno055_sensor.service #削除


知ってると便利なコマンド

個人的に知ってると便利なコマンドもこちらに残しておきます。

  • RaspiへPCのフォルダをコピー転送
terminal
sudo scp -r xxxxx_ros/ ubuntu@192.168.11.88:/home/ubuntu/dev_ws/src
  • フォルダの一括コピー
terminal
sudo cp -r ~/ros2_ws/src/aaa/ ~/dev_ws/src/bbb/
  • フォルダの一括の削除
terminal
sudo rm -r ~/ros2_ws/src/aaa/


以上、ROS 2 用ラズパイUbuntu 22.04の設定・セットアップ・TIPSでした。

追記する事項が増えたら、こちらに加筆します。

皆様のお役に立てれば幸いです。

Discussion