😠

RasPi開発でのsense-hat・paho-mqtt依存関係エラー

に公開

概要

IoT CoreからのMQTTメッセージをRaspberry Piに表示するシステム開発において、仮想環境でのsense-hatとpaho-mqttインストール時に発生したエラーと、その解決方法について解説します。

発生したエラー

エラー1: numpyインポートエラー

RuntimeError: You should not try to import numpy from within the numpy installation directory

エラー2: RTIMUモジュール不足エラー

ModuleNotFoundError: No module named 'RTIMU'

解決方法

以下の手順で問題を解決できます:

1. システムパッケージのインストール

sudo apt update
sudo apt install -y python3-sense-hat python3-numpy python3-rtimulib

2. システムパッケージ込み仮想環境の作成

python3 -m venv test --system-site-packages
source test/bin/activate

3. アプリケーション依存パッケージのインストール

pip install paho-mqtt

4. プログラムの実行

python mqttAllRequest.py

エラーの原因

1. RuntimeError: You should not try to import numpy from within the numpy installation directory

このエラーの根本原因は、仮想環境でのnumpyの不完全なインストールにあります。

詳細な発生メカニズム

  • 仮想環境でpip install sense-hatを実行した際、依存関係としてnumpyが自動的にインストールされる
  • Raspberry PiのARM64アーキテクチャでは、numpyをソースからビルドする必要がある
  • ビルドプロセス中に一部のC拡張モジュール(_multiarray.soumath.so等)のコンパイルが失敗
  • 結果として、numpyパッケージは存在するが、重要な機能が欠如した「不完全な状態」となる

エラーが発生するタイミング

from sense_hat import SenseHat  # この行でエラー発生
# ↓ sense_hat内部でnumpyをimport
# ↓ 不完全なnumpyが読み込まれる
# ↓ numpy内部の整合性チェックで異常検出
# ↓ RuntimeError発生

不完全なnumpyの状態

numpy/
├── __init__.py           ✅ 正常
├── core/
│   ├── __init__.py      ✅ 正常  
│   ├── _multiarray.so   ❌ コンパイル失敗
│   └── umath.so         ❌ コンパイル失敗
├── linalg/
│   └── lapack_lite.so   ❌ コンパイル失敗
└── random/
    └── mtrand.so        ❌ コンパイル失敗

2. ModuleNotFoundError: No module named 'RTIMU'

このエラーは、RTIMUライブラリのビルド失敗が原因です。

技術的背景

  • sense_hatは内部でRTIMU(Real Time Inertial Measurement Unit)ライブラリに依存
  • RTIMUはC++で書かれたハードウェア制御ライブラリで、Pythonバインディングが必要
  • 仮想環境でのpip install時に、RTIMUのソースコードを取得してビルドを試行
  • しかし、必要な開発ツール(cmake、build-essential)やヘッダーファイルが不足
  • 結果として、RTIMUライブラリのビルドが失敗し、モジュールが存在しない状態となる

具体的なビルドエラー例

cc1plus: fatal error: ../../RTIMULib/IMUDrivers/RTHumidity.cpp: そのようなファイルやディレクトリはありません
compilation terminated.
error: command '/usr/bin/arm-linux-gnueabihf-gcc' failed with exit code 1

なぜこの方法で解決することができたのか

1. システムパッケージの活用による安定性確保

sudo apt install -y python3-sense-hat python3-numpy python3-rtimulib

解決ポイント

  • 事前ビルド済みパッケージ: Raspberry Pi OS公式リポジトリのパッケージは、ARM64アーキテクチャ向けに最適化され、完全にテスト済み
  • 一貫した依存関係: 同じビルド環境で作成されたパッケージ群のため、相互の互換性が保証される
  • ハードウェア最適化: Raspberry Pi固有のハードウェア(I2C、SPI、GPIO)との連携が適切に設定済み

システムパッケージの構成例

/usr/lib/python3/dist-packages/numpy/
├── __init__.py
├── core/
│   ├── _multiarray.cpython-311-aarch64-linux-gnu.so  ✅ ARM64向けビルド済み
│   └── umath.cpython-311-aarch64-linux-gnu.so        ✅ 最適化済み
├── linalg/
│   └── lapack_lite.cpython-311-aarch64-linux-gnu.so  ✅ BLAS/LAPACK連携
└── random/
    └── mtrand.cpython-311-aarch64-linux-gnu.so       ✅ 完全動作

2. --system-site-packagesによるハイブリッド環境

python3 -m venv test --system-site-packages

技術的効果

  • パッケージ参照の優先順位: 仮想環境のパッケージを優先し、存在しない場合はシステムパッケージを参照
  • 依存関係の整合性維持: ハードウェア依存パッケージはシステム、アプリケーション依存パッケージは仮想環境で分離管理
  • 開発環境の柔軟性: プロジェクト固有のパッケージ(paho-mqtt等)は仮想環境で独立管理可能

Pythonパスの構成例

import sys
print(sys.path)
# [
#   '/home/admin/internship2025/test/lib/python3.11/site-packages',  # 仮想環境
#   '/usr/lib/python3/dist-packages',  # システムパッケージ
#   '/usr/lib/python311.zip',
#   '/usr/lib/python3.11',
# ]

3. 依存関係の完全性確保

解決前の状態

仮想環境:
├── sense_hat (不完全)
├── numpy (部分的にビルド失敗)
└── RTIMU (存在しない)

解決後の状態

システムパッケージ:
├── python3-sense-hat ✅ 完全動作
├── python3-numpy ✅ 最適化済み
└── python3-rtimulib ✅ ハードウェア連携

仮想環境:
└── paho-mqtt ✅ プロジェクト固有

4. 技術的検証

この解決方法の有効性を確認:

# 解決後の動作確認
import numpy as np
print(f"numpy version: {np.__version__}")  # 正常に表示
print(f"numpy location: {np.__file__}")    # /usr/lib/python3/dist-packages/numpy

from sense_hat import SenseHat
sense = SenseHat()  # エラーなしで初期化成功

import RTIMU
print("RTIMU module loaded successfully")  # 正常にロード

教訓とベストプラクティス

IoTデバイス開発における依存関係管理

1. ハードウェア依存パッケージ

システムパッケージを使用

  • sense-hat
  • GPIO制御ライブラリ
  • カメラモジュール制御
  • I2C/SPI通信ライブラリ

2. アプリケーション依存パッケージ

仮想環境で管理

  • MQTT通信ライブラリ(paho-mqtt)
  • HTTP通信ライブラリ(requests)
  • データ処理ライブラリ(pandas)
  • Web框架(Flask、FastAPI)

3. ハイブリッド環境の活用

--system-site-packagesオプションで両方の利点を享受

トラブルシューティングの指針

エラーの種類 対処方法
ハードウェア関連のエラー システムパッケージを確認
コンパイルエラー 事前ビルド済みパッケージの利用を検討
依存関係の競合 パッケージの管理戦略を見直し

検証コマンド

環境が正しく構築されたかを確認:

# システムパッケージの確認
dpkg -l | grep sense-hat
dpkg -l | grep rtimu

# Pythonでの動作確認
source test/bin/activate
python3 -c "
from sense_hat import SenseHat
import RTIMU
import numpy as np
print('✅ 全ての依存関係が正常に動作')
"

まとめ

この解決方法により、Raspberry Piでの安定したIoTアプリケーション開発環境を構築することができました。重要なポイントは、ハードウェア依存のパッケージとアプリケーション依存のパッケージを適切に分離管理することです。

Discussion