ROS 2 用ラズパイUbuntu 22.04の設定・セットアップ・TIPS
海洋ロボコンをやってた人です。
今回は、ROS 2でロボット制御するために、ラズパイへUbuntu22.04をインストール&セットアップしたので、その備忘録として記載していきます。
なぜまとめるかは以下です。
- 良記事は無数にありますが、多すぎてChromeのタブが複数になる、どれ見たら良いか迷う
- ロボット作る自分用に、必要な手順をまとめておけば見返すときに便利
- Ubuntu2x.xxとバージョン上がっても、自分のメモに追加するだけで数年後も再利用可
"こうすれば簡単に設定できる" というご意見がありましたら、是非ご教授いただけますと幸いです。
また、本記事に対するコメントも積極的に募集しますので、よろしくお願いいたします。
1. 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ケーブルあれば準備可
1.1 WiFi、Ethernetの固定IP設定
ログインして、ネットワークの設定をする。
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まで設定しておく
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アドレスが設定されているかを確認
sudo netplan apply
ifconfig
もし
** (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アドレスでログインする
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:~$
1.1.1 ssh-keygenと表示されるとき
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"
1.1.2 wlan0などネットワーク認識しないとき
ifconfig
でeth0, wlan0などが表示されないときは、下記でインターフェイス名を確認します。
ip link show
1: lo: <LOOPBACK,UP,LOWER_UP>
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> m
4: wlan1: <BROADCAST,MULTICAST>
5: wlx7cc2c620830c: <BROADCAST,MULTICAST> m
などと表示されるので
sudo ip link set wlan1 up
を実行し、ネットワークを有効化する。
1.2 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.
source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=89
ros-humble-desktopをインストールすると、サンプルプログラムを動かすことで動作確認ができます。
ros-baseをインストールした場合は、適当にパッケージを作る/クローンして動作確認をしておきます。
mkdir -p ros2_ws/src
Reference 以下2つだけで十分
Install ROS2 Humble on Raspberry Pi 4
1.3 使用するライブラリのインストール
以下、センサ類を制御するためにインストールしたライブラリをメモ書き
※ こちらは任意です。用途に応じて各自使い分けてください。
- I2Cライブラリ
I2Cでセンサ類から情報を取得するのでインストールします。
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のアドレス確認
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 -- -- -- -- -- -- --
もし、以下のようにすべてのアドレスを確認できない場合
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アドレスを直接確認する。
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アドレスは使用できるので問題なし。
- Adafruit servokitライブラリ
PWMサーボドライバーのライブラリをインストール
この辺は、どのモータドライバーを使用するかで適宜インストールします。
sudo apt install python3-pip
sudo pip3 install adafruit-circuitpython-servokit
- 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でビルドするときは依存関係の追記も忘れないように行いましょう。
# 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})
1.4 ros2コマンドなどの自動起動
ROS/ROS 2 である程度動くロボットを作れるようになると、電源を入れたら自動でROSコマンドが起動して動くようになってほしいと思います。
これはROSコマンド以外でも同じことが言えますが、以降はros2コマンドの自動起動について記載していきます。
- .shファイルを記述する
Raspi側の任意のフォルダで.shファイルを記述します。
cd ~/ros2_ws/src
sudo nano start_bno055_sensor.sh
.shの中身はrosのセットアップやドメインID等と、ros2で実行したいコマンドを記述します。
ros2 run, ros2 launchのどちらでも問題ありません。
#!/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に実行権限を与えます。
sudo chmod +x /home/ubuntu/ros2_ws/src/start_bno055_sensor.sh
- .serviceファイルを記述する
サービスの起動、停止、再起動、自動起動などを管理するために使用する設定ファイルのserviceファイルを記述していきます。
このファイルに.shの実行を紐付けることで自動起動が可能となります。
基本的に.serviceファイルは/etc/systemd/system/
下に配置されます。
sudo nano /etc/systemd/system/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させます。
sudo systemctl daemon-reload
sudo systemctl enable ros2_bno055_sensor.service
sudo systemctl start ros2_bno055_sensor.service #起動
上記の後は必ずrebootし、reboot後に他の端末よりros2 topicでノードを確認できればOKです。
sudo reboot
また、ちゃんと自動起動できているかを確認する場合は、以下で確認してください。
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
自動起動サービスを停止または削除する場合は以下で行います。
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 #削除
1.5 知ってると便利なコマンド
個人的に知ってると便利なコマンドもこちらに残しておきます。
- RaspiへPCのフォルダをコピー転送
sudo scp -r xxxxx_ros/ ubuntu@192.168.11.88:/home/ubuntu/dev_ws/src
- フォルダの一括コピー
sudo cp -r ~/ros2_ws/src/aaa/ ~/dev_ws/src/bbb/
- フォルダの一括の削除
sudo rm -r ~/ros2_ws/src/aaa/
以上、ROS 2 用ラズパイUbuntu 22.04の設定・セットアップ・TIPSでした。
追記する事項が増えたら、こちらに加筆します。
皆様のお役に立てれば幸いです。
Discussion