NTTドコモR&Dの技術ブログです。

Livox Mid-360とRaspberry Pi5で取得した点群をRviz2で可視化する手順をまとめました

はじめに

はじめまして、NTTドコモ クロステック開発部の佐藤です。

私は建設現場業務の効率化を狙ったプロダクト開発における技術開発を担当しています。具体的にはレーザーの反射を利用して空間を測定することができるLIDAR(Livox Mid-360)とラズパイ(Raspberry Pi 5)を組み合わせ、取得した点群データを可視化・伝送するセンサー開発に従事しています。

新卒入社1年目として将来性の高いテーマを業務にできていることは嬉しい反面、自分の技術力の乏しさを痛感させられています。

本記事では、LIDAR(Livox Mid-360)とラズパイ(Raspberry Pi 5)を接続し、3次元データ可視化ソフトのRviz2で点群を描画するまでの手順をまとめています。

IoTデバイスが絡むとWeb開発に比べて環境構築の難易度が高く感じました。同様の環境構築で苦労されている方の助けになれば幸いです。

動作環境

動作環境を整備する前に、ラズパイ・Ubuntu・ROS2のバージョン互換性の確認を先に行うことをおすすめします。

  • LIDAR(Livox Mid-360)
  • ラズパイ(Raspberry Pi 5)
  • ラズパイ純正タッチパネルディスプレイ(Raspberry Pi Touch Display 2)
  • OS:Ubuntu 24.04
  • その他ソフトウェア:ROS2 Jazzy

記事執筆時点では、ラズパイ4の場合、対応するROS2のLTS版のサポートが終了間近となっていました。

また、本記事は以下の開発環境のTipsも含んでいます。

  • ラズパイへSSHでリモートログインをした開発
  • VSCodeのリモートトンネル機能を使用した開発

機材構成と動作イメージ

以下の画像は本記事の手順を完遂した場合の動作イメージです。

左側がLIDAR本体・ラズパイは右側のディスプレイ裏にネジ止めしています

詳細手順

1 ラズパイに Ubuntu をインストールする

Rviz2を動かすためデスクトップ版 Ubuntu 24.04 LTS を用意します。

手順

1 ラズパイとディスプレイを接続する。 2 Raspberry Pi Imager で Ubuntu Desktop 24.04.3 LTS (64bit) を microSD に書き込む。 3 初回起動でユーザー / 言語 / 時刻を設定する。

注意点

電圧不足でディスプレイが正常に描画されない場合があります。この場合はHDMI端子経由で外部モニタへ接続することをオススメします。

2 SSH でリモートログインする (任意)

ラズパイにキーボードやディスプレイを接続せず、SSHでリモート操作する環境を整える場合の手順をまとめています。
ただし、初回はUbuntu側の設定のためキーボードやディスプレイの接続が必要ですのでご注意ください。

手順

1 リモートアクセスする任意のローカルマシンでターミナルを立ち上げ、以下のコマンドを実行します。ifconfigでラズパイのIPアドレスを取得し控えてください。

sudo apt update
sudo apt install -y openssh-server net-tools
ifconfig
ssh ユーザー名@控えたIP

設定例 (~/.ssh/config)

Host lidarpi
  HostName 192.168.1.200
  User ubuntu

ssh lidarpi でシェルが起動すれば接続成功です。

3 VSCodeのリモートトンネル機能を使用する(任意)

リモートログイン機能を使うとブラウザやローカルマシンのVSCodeから簡単にリモート編集できるようになります。

手順

1 ラズパイに VSCodeをインストールする。

2 コマンドパレットで Remote Tunnelsを許可する。

3 ローカルマシンのVSCodeのRemote Explorerから接続する。

4 ROS2 Jazzy のインストールと動作確認を実施する

LIDARのドライバが依存するROS2をインストールし、簡単なPubSub通信ができるか動作確認します。
公式ドキュメントはこちらです。

手順

1 以下のコマンドを実行し、ROS2をインストールする。

sudo apt update
sudo apt install -y ros-jazzy-desktop
locale | grep UTF-8

2 talkerノードを起動する。

source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker

3 別ターミナルでlistenerノードを起動する。

source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp listener

listener 側で I heard: ... のログが 1 秒ごとに出力されれば成功です。

5 Livox-SDK2をインストールする

LIDAR 本体と通信するためのSDK をインストールします。

公式リポジトリはこちらです。

手順

1 以下のコマンドを実行し、各種パッケージをインストールする。その後SDKのリポジトリをクローンする。

sudo apt install -y build-essential cmake git libusb-1.0-0-dev libpcap-dev libpcl-dev
cd ~
git clone https://github.com/Livox-SDK/Livox-SDK2.git   # SDK 取得
cd Livox-SDK2

2 下記ファイルのヘッダに #include <cstdint> を追加する (Ubuntu 24.04 で必要になる場合)

sdk_core/comm/define.h
sdk_core/comm/protocol.h
sdk_core/logger_handler/file_manager.h

3 ビルドファイルを実行する

mkdir build && cd build
cmake .. && make -j"$(nproc)"
sudo make install

エラー無く/usr/local/lib に liblivox_sdk* が生成されれば成功です。

6 livox_ros_driver2 をビルドする

ROS2でLIDARから点群データを取得するドライバを準備します。 ドライバのリポジトリはこちらです。

手順

1 以下のコマンドを実行し、各種パッケージをインストールする。

mkdir -p ~/project/livox_ws_jazzy/src
cd ~/project/livox_ws_jazzy/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git
sudo apt install -y python3-colcon-common-extensions libpcl-dev ros-jazzy-pcl-conversions ros-jazzy-pcl-ros
rosdep update
rosdep install --from-paths . --ignore-src -r -y
cd ..
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install
source /opt/ros/jazzy/setup.bash
source ~/project/livox_ws_jazzy/install/setup.bash

推奨ディレクトリ構成

~/project/
  livox_ws_jazzy/
    src/
      livox_ros_driver2/
      pointcloud_processor/ (将来用)

ros2 pkg list | grep livox にドライバ名が表示されれば成功です。

7 ネットワークと MID360_config.jsonを設定する

LIDAR からの点群データをラズパイが正しく受け取れるようIPとポート番号を設定します。

1 以下のコマンドを実行し、IPを設定します。

なお、LIDARのデフォルトIPは本体に印字されているシリアル番号の末尾 2 桁です。192.168.1.1XXXX にシリアル番号の末尾2桁を入れるとIPになります。

例 (LIDARのIP:192.168.1.195 / :ラズパイのIP:192.168.1.200の場合)

sudo ip link set eth0 up
sudo ip address add 192.168.1.200/24 dev eth0 2>/dev/null || true
ping -c1 192.168.1.195   # 疎通確認

2 livox_ros_driver2/config/MID360_config.jsonに各種IPとポート番号を追記します。

  • lidar_configs.ip にLIDARのIPを追記
  • host_net_infoipの各IPにラズパイのIPを追記
  • bind failedが出た場合は、ポートを58101など空き番号へ変更

ドライバ起動時にbind failedが出なければ成功です。

8 ドライバ起動の起動と基本的な出力を確認する

1 以下のコマンドを実行し、。ドライバを起動します。

ros2 launch livox_ros_driver2 msg_MID360_launch.py

2 別ターミナルを立ち上げ、以下のコマンドを実行します。

source /opt/ros/jazzy/setup.bash
source ~/project/livox_ws_jazzy/install/setup.bash
ros2 topic list | grep livox   # livox トピック
ros2 topic hz /livox/lidar     # 周波数
ros2 topic bw /livox/lidar     # 帯域

hz が 9〜10Hz、bw が 約5MB/sで出力されていれば、安定的に点群データが取れています。

9 Rviz2で点群を描画する

1 以下のコマンドを実行し、Rviz2を起動します。

echo $DISPLAY   # :0 でなければ export DISPLAY=:0
ros2 launch livox_ros_driver2 rviz_MID360_launch.py

点群が原点周辺にし描画されていれば成功です。

10 よくある初期トラブル早見表

ここまでの手順を進める中でで生じたエラーを簡易的にまとめました。

症状 主な原因 対処
qt.qpa.xcb: could not connect DISPLAY が X11 転送先 unset DISPLAY; export DISPLAY=:0
Failed to create an OpenGL context GPU/ドライバ不整合 物理 GUI / Mesa 更新
libOgreMain.so not found ROS 環境未読み込み /opt/ros → ワークスペースの順で source
bind failed ポート競合 / IP ミス JSON のポート変更 / IP 再確認
exit code -11 (終了時) 終了時既知クラッシュ 動作中正常なら無視
レートが 5Hz 以下 回線不安定 / CPU 負荷 有線直結 / 不要プロセス停止

おわりに

今回の開発を進めるにあたって技術調査を様々行いましたが、IoT開発の環境構築記事がWeb開発に比べて圧倒的に少ないと感じました。

生成AIに質問した際の出力結果もWeb開発に比べてイマイチだなと感じました。

ハードウェアや低レイヤが絡む開発は生成AI主導で進められる未来はまだ先なのかなと思っています。

ご覧いただきありがとうございました。