Ubuntu20.04(on ラズパイ4)&ROS2でLD06とBNO055を使う
まえがき
ROS2 galacticで独立差動二輪ロボットを自作しています。今回は自作ロボットに搭載しているラズパイ4にLIDAR LD06とIMUセンサーBNO055をUARTで接続させROS2で動作確認しました。
環境
- ラズパイ4(Ubuntu 20.04LTS) & ROS2 galactic(インストール済みの前提)
- LIDAR LD06(RS-Onlineで購入、https://www.ldrobot.com/product/en/98 と同じもの?)
- IMUセンサー BNO055(ロボショップで購入)
ラズパイ4(Ubuntu 20.04LTS)の確認
設定前のUART関連のデバイス名を確認します。
$ ls -l /dev/ttyAMA*
crw-rw---- 1 root dialout 204, 64 Jan 10 13:56 /dev/ttyAMA0
ひとつだけUARTが認識されています。シリアルコンソールデバイスでしょうか?よくわかりませんが、そういうものがある、ということだけ確認できました。
UbuntuのUARTを有効化する
デバイスを割り付けるUARTを決める
ラズパイ4のGPIOの兼ね合いから下記のように割り当てることとしました。
- LD06 ... UART3
- BNO055 ... UART5
有効化する設定を追加
/boot/firmware/usercfg.txt
に下記2行を追記します。
dtoverlay=uart3
dtoverlay=uart5
OSを再起動します。
有効化されていることの確認
$ ls -l /dev/ttyAMA*
crw-rw---- 1 root dialout 204, 64 Jan 10 13:56 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jan 10 13:56 /dev/ttyAMA1
crw-rw---- 1 root dialout 204, 66 Jan 10 13:56 /dev/ttyAMA2
ttyAMA1とttyAMA2が追加され、有効化されました。ttyAMA1がUART3、ttyAMA2がUART5に割り当てられたようです。
デバイスを割り当てたGPIOピンに接続
LD06とラズパイ4の接続
LD06のGNDケーブルの色が赤で直感に反しているように思えます。
LD06 | ラズパイ4 |
---|---|
Tx | 29番(RXD3) |
PWM | 接続しない |
GND | 30番(GND) |
P5V | 2番(5V PWR) |
BNO055とラズパイ4の接続
BNO055 | ラズパイ4 |
---|---|
Vcc | 1番(3.3V PWR) |
Rx | 32番(GPIO12,TXD5) |
Tx | 33番(GPIO13,RXD5) |
Gnd | 34番(GND) |
BNO055の動作確認
bno055パッケージのインストール
aptコマンドでインストールします。
$ sudo apt install ros-galactic-bno055
bno055ノードの起動
BNO055はUART5につなぎましたので、パラメータuart_port
はデバイス名/dev/ttyAMA2
を指定します。また、frame_id
パラメータはimu_link
としました。
$ ros2 run bno055 bno055 --ros-args --param uart_port:="/dev/ttyAMA2" --param frame_id:="imu_link"
[INFO] [1644742883.234234787] [bno055]: Initializing parameters
[INFO] [1644742883.250585377] [bno055]: Parameters set to:
[INFO] [1644742883.252593312] [bno055]: ros_topic_prefix: "bno055/"
[INFO] [1644742883.254633395] [bno055]: connection_type: "uart"
[INFO] [1644742883.256552128] [bno055]: uart_port: "/dev/ttyAMA2"
[INFO] [1644742883.258506601] [bno055]: uart_baudrate: "115200"
[INFO] [1644742883.260538258] [bno055]: uart_timeout: "0.1"
[INFO] [1644742883.262526916] [bno055]: frame_id: "imu_link"
[INFO] [1644742883.264495463] [bno055]: data_query_frequency: "10"
[INFO] [1644742883.266446658] [bno055]: calib_status_frequency: "0.1"
[INFO] [1644742883.268349614] [bno055]: operation_mode: "12"
[INFO] [1644742883.270304383] [bno055]: placement_axis_remap: "P1"
[INFO] [1644742883.272211338] [bno055]: acc_factor: "100.0"
[INFO] [1644742883.274158145] [bno055]: mag_factor: "16000000.0"
[INFO] [1644742883.276036211] [bno055]: gyr_factor: "900.0"
[INFO] [1644742883.277929556] [bno055]: set_offsets: "False"
[INFO] [1644742883.279815419] [bno055]: offset_acc: "[65516, 165, 65512]"
[INFO] [1644742883.281753799] [bno055]: offset_mag: "[65460, 65182, 637]"
[INFO] [1644742883.283628996] [bno055]: offset_gyr: "[2, 65535, 65535]"
[INFO] [1644742883.285544932] [bno055]: variance_acc: "[0.017, 0.017, 0.017]"
[INFO] [1644742883.287430554] [bno055]: variance_angular_vel: "[0.04, 0.04, 0.04]"
[INFO] [1644742883.289351287] [bno055]: variance_orientation: "[0.0159, 0.0159, 0.0159]"
[INFO] [1644742883.291227169] [bno055]: variance_mag: "[0.0, 0.0, 0.0]"
[INFO] [1644742883.293503082] [bno055]: Opening serial port: "/dev/ttyAMA2"...
[INFO] [1644742883.354080969] [bno055]: Configuring device...
Current sensor offsets:
[INFO] [1644742883.389332150] [bno055]: Accel offsets (x y z): 0 0 0
[INFO] [1644742883.392725289] [bno055]: Mag offsets (x y z): 0 0 0
[INFO] [1644742883.395558842] [bno055]: Gyro offsets (x y z): 0 0 0
[INFO] [1644742883.427033223] [bno055]: Bosch BNO055 IMU configuration complete.
ノード起動時の表示からパラメータがいろいろありそうなことがわかります。
bno055のノード名とトピックを確認
$ ros2 node list
/bno055
$ ros2 topic list
/bno055/calib_status
/bno055/imu
/bno055/imu_raw
/bno055/mag
/bno055/temp
/parameter_events
/rosout
$ ros2 topic echo /bno055/imu
...
---
header:
stamp:
sec: 0
nanosec: 0
frame_id: imu_link
orientation:
x: 0.0690297189600907
y: -0.016235106315989505
z: 0.0
w: 0.9974824906850243
orientation_covariance:
- 0.0159
- 0.0
- 0.0
- 0.0
- 0.0159
- 0.0
- 0.0
- 0.0
- 0.0159
angular_velocity:
x: 0.0
y: 0.0
z: 0.0
angular_velocity_covariance:
- 0.04
- 0.0
- 0.0
- 0.0
- 0.04
- 0.0
- 0.0
- 0.0
- 0.04
linear_acceleration:
x: -0.06
y: -0.01
z: -0.16
linear_acceleration_covariance:
- 0.017
- 0.0
- 0.0
- 0.0
- 0.017
- 0.0
- 0.0
- 0.0
- 0.017
---
...
ということで、BNO055は動作していることが確認できました。
LD06の動作確認
ノードのインストール
linorobotさんのLD06ドライバノードを使わせていただきました。
インストール方法は下記サイトに載っていますのでそれを参照してください。
ldlidarノードの起動
LD06はUART3につなぎましたので、パラメータserial_port
はデバイス名/dev/ttyAMA1
を指定します。
$ ros2 launch ldlidar ldlidar.launch.py serial_port:=/dev/ttyAMA1
[INFO] [launch]: All log files can be found below /home/ubuntu/.ros/log/2022-02-13-18-20-48-590745-cylinder-2265
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [ldlidar-1]: process started with pid [2267]
[ldlidar-1] [INFO] [1644744049.356037120] [rclcpp]: Using port /dev/ttyAMA1
[ldlidar-1] [INFO] [1644744049.357882217] [rclcpp]: LiDAR_LD06 started successfully
ldlidarのノード名とトピックを確認
$ ros2 node list
/ldlidar
$ ros2 topic list
/parameter_events
/rosout
/scan
$ ros2 topic echo /scan
...
---
header:
stamp:
sec: 1644744264
nanosec: 692657762
frame_id: base_scan
angle_min: 0.0
angle_max: 6.2831854820251465
angle_increment: 0.013966500759124756
time_increment: 0.0
scan_time: 0.0
range_min: 0.004999999888241291
range_max: 15.0
ranges:
- 3.9590001106262207
- 3.9590001106262207
...
ということで、LD06も動作していることが確認できました。
最後に
当初、LD06もBNO055もUSB-シリアル変換基板を使う予定でしたがGPIOを有効活用でき、省スペース化できてよかったです。
Discussion
こんにちは、私はUbuntu20.04(on Raspberry Pi4 B)&ROS2 Foxy&UART通信の環境を構築したいと考えている者です。
記事と同様にUART有効化の確認までは同様に行うことが出来ましたが、いざbno055ノードを立ち上げるとconnection Error(response 0)を吐かれてしまいます。
他記事を拝見しますと/boot/firmware/cmdline.txt内のconsole=serial0,115200を削除するように等の記載がありましたが、そういった本記事で述べていないが他に行った設定はございますでしょうか。
また、Raspberry Pi OS(64bit)ですとUARTを有効にしたとき
$ls -l /dev/
で表示される中に/dev/serial*->/dev/ttyAMAといった記載があると思うのですが(Ubuntuの初期状態だと/dev/serialはありません(私の環境では))。
本記事の環境では/dev/serialは現れているのでしょうか。(/dev/serialはUART通信には関係ないのでしょうか)
素人質問並びにご多忙のところ大変恐縮ですが、ご回答いただけますと幸いです。
拙い記事ですが読んでいただきありがとうございます。
【1】dtoverlay=uart3とuart5の追加くらいです。
/boot/firmware以下の*.txtをマルっと記載します。
【2】/dev/serialはディレクトリが存在していました。下記参考になりますでしょうか。
【気になる点】
文面を拝見しました限りですと、UARTのポートは有効化されたが、UARTポートに繋がっているBNO055と通信ができてないように見受けられます。なので、私でしたら下記2つから見直してみます。
https://hackaday.com/2022/02/01/did-you-know-that-the-raspberry-pi-4-has-more-spi-i2c-uart-ports/
ちなみに、下記のやり方でもOSがUARTポートを有効化したかどうかがわかります。
迅速で親切なご回答とご助言、誠にありがとうございます。
ご助言いただきました内容について再度試しました。
[気になる点][1]GPIOピンの接続
UART5を使用するため
bno055 - raspiGPIO
VIN - 5V(pin4)
GND - GND(pin6)
Rx - GPIO13(pin33)
Tx - GPIO12(pin32)
ADD - GND(pin6)
に接続しています。bno055のRx、Txのピン配置確認済みです。
[気になる点][2]UART有効化
これで有効化出来ていると思われましたが...
bno055ノードの実行
うまく通信できていないみたいです...
また/dev/serial*ディレクトリに関しても存在しないと言われます...
他に考えられる原因
再度試していて考えられた原因は3つです。
■1.Ubuntuまたはraspiのfirmwareのバージョン、種類が異なる
私の環境では、公式からインストールしたイメージをRaspberry Pi Imager v1.7.2で
OSを選ぶ→カスタムイメージを使う→ubuntu-20.04.4-preinstalled-server-arm64+raspi.img.xz
で書き込んでいます。 以下がその環境での表示です。
補足ですが上記のようなやり方ではなく、Raspberry Pi Imagerで
OSを選ぶ→Other general-purpose OS→Ubuntu→Ubuntu Server 20.04.4 LTS(RPi 3/4/400)
を書き込んだ環境でも同様に失敗しました...
■2.bno055が息をしていない
これに関しては何らかの理由で私が壊したか、不良品か...
■3.Ubuntuの初期設定
私はこれらの環境を構築するにあたって
3.1ファームウェアの更新
3.2他記事を参考に
シリアル通信を有効化するためまたSSHを有効化するため
最後に/boot/firmware以下の編集
を行っております。
長文並びに度重なる質問お許しください。ご助言いただけますと幸いです。
使用しているユーザアカウントをdialoutグループに追加してありますでしょうか?
下記のように/dev/ttyAMA*はdialoutグループには読み書き可能です。
ユーザアカウントがdialoutグループに属しているかどうかはidコマンドで確認できます。
(1)dialoutに属していないとき
bno055ノードは以下のように起動できませんでした。
(2)dialoutに属しているとき
bno055ノードは以下のように起動できました。
追加情報ありがとうございます。
UARTの有効化・bno055ノードの実行・idコマンドの結果を見ますと、ポートを開くことはできているようです。
気になるのは、[1]GPIOピンの接続です。
(1)
ラズパイ4のUART5は、
TXD5 – GPIO12 – Pin32
RXD5 – GPIO13 – Pin33
です。
また、UARTは下記の図のように接続します。
頂いた情報にTx/Rxを書き加えると下記のようになり、Tx(送信)同士をつなげ、Rx(受信)同士をつなげていないでしょうか?
bno055 - raspiGPIO
VIN - 5V(pin4)
GND - GND(pin6)
Rx - GPIO13(pin33)...RXD5
Tx - GPIO12(pin32)...TXD5
ADD - GND(pin6)
(2) もしよろしければ使用してるBNO055モジュール教えていただけないでしょうか?
ADDというピンがあるので、GY-BNO055と勝手ながら推測しました。
GY-BNO055はI2CかUARTの切り替えを半田ブリッジで行う必要があるようです。
(3) VINに5Vを給電するか、3.3Vを給電するか、どちらが良いのでしょうか?
私の場合ですと、使用しているBNO055モジュールは3.3V-5Vで使えますが、ラズパイ4のGPIOが3.3Vトレラントなので3.3Vを給電しています。
(1)
仰られるようにTx同士、Rx同士を繋げておりました...
uart通信の初歩的な部分を失念しておりました。申し訳ございません。
(3)こちらの記事のコメントから5Vの方が良いのかなと考えてしまいました。
(2)
GY-BNO055です。
ご助言いただきましたショートによっての切り替えですが、 只今確認しましたところ出荷時では2つともショートしてあり、
そのまま使用していたためI2Cの設定になっていました...
その後、IC側のPS1ブリッジの半田を取り除き(UARTに設定)、
bno055ノードを実行したところ、通信できませんでした...
まだ通電している可能性が考えられたため、
$i2cdetect -y 1
にてMPU9250でI2Cアドレスが表示されたのを確認した後
同様にbno055を(SCL、SDAの位置を確認し)接続したところI2Cにおいても反応がありませんでした...
ご助言いただきました(1)(3)よりbno055を壊してしまった可能性が高いですね...
新しく買い替えまして、再度試したいと思います。
届くまでの間で過去Raspberry Pi OSでUART通信に成功した経験のあるbno055以外のデバイスでもUART通信の確認をしてみます。
こちらこそいろいろ情報共有いただきありがとうございました。
本記事も、接続ピンについてもう少し加筆修正いたします。
idコマンドで確認したところ
このように表示されました。dialoutの記載があるためグループには入っているのでしょうか。