ラズパイ(Raspberry Pi)に搭載されたカメラの映像を、SSHでラズパイを遠隔操作しているPCのWEBブラウザなどで確認する方法をまとめます。
今回使用するデバイスです。
デバイス | Raspberry pi 4B |
OS | Ubuntu Server 22.04 |
カメラ | Raspberry pi camera module 2 |
カメラを接続する方法を記載したのち、カメラが見ている静止画・動画を確認する方法を紹介します。
- 静止画を撮影して、ラズパイに保存された画像ファイルをSSHを介してPCにダウンロードし、画像を確認する。
- Motionというパッケージでカメラ映像を配信し、PCのWEBブラウザでストリーミングを確認する。
- ROS2を使って、カメラ映像をv4l2 camera nodeがパブリッシュし、web video serverがサブスクライブする形で配信し、PCのWEBブラウザでストリーミングや静止画を確認する。
- ROS2のrqtを使いカメラ映像を確認する。(Windows11のWSL2を使用)
カメラの接続方法
カメラモジュールの認識を有効にするために設定をします。
sudo nano /boot/firmware/config.txt
# 設定を追加
start_x=1
gpu_mem=128
camera_auto_detect=1
ラズパイがカメラを認識してるかを確認します。
ls /dev/video*
# /dev/video0, /dev/video1が表示される
静止画を撮影して、画像ファイルをPCで確認する
カメラで静止画を撮影し保存するためにパッケージをインストールします。
sudo apt install fswebcam
カメラに映る画像を保存します。
fswebcam -r 1280x720 --no-banner image.jpg
lsコマンドでカレントディレクトリを見ると、image.jpgが見つかります。このデータにSSHしているPC(Windows)からアクセスしダウンロードします。
# このコマンドはWondows PC側で実行(cmdやpower shell)
scp (user名)@(raspberry piのipアドレス):(転送ファイル) (Windows側の保存先)
# example
# scp user@192.168.10.110:~/image.jpg C:\Users\user\Documents\
PC側に画像ファイルをダウンロードできたため、ファイルを開きラズパイカメラが捕えた絵を確認できます。
カメラ画像がボケている場合は、カメラのフォーカスがあっていないため調整が必要です。Raspberry pi camera module 2は手動で設定となります。(カメラに付属していた穴の開いた樹脂部品で調整)
Motionを使って、カメラ映像を配信する
次にラズパイカメラの映像をPC側のWEBブラウザで確認するやり方を紹介します。使用するパッケージは”Motion”です。無線接続しているPCで遠隔でカメラの画像を見ることができます。
まずパッケージをインストールします。
sudo apt install motion
続いてmotionの設定ファイルをnanoで編集します。
sudo nano /etc/motion/motion.conf
次の項目を探し書き換え、保存します。
stream_localhost off
Motionを動作させ、その後動作しているか(Activeになっているか)を確認します。
sudo systemctl start motion
sudo systemctl status motion
このときラズパイカメラの映像は8081ポートでストリーミングされていますので、PC側のWEBブラウザで映像を確認することができます。
# Wondows PCのWebブラウザ(Chrome等)で実施

http://192.168.10.110:8081
以上でラズパイカメラの映像をPC側から確認できるようになりました。しかし映像を確認すると、とても遅く、カクカクした表示になっていると思います。それはMotionのストリームのフレームレート設定はデフォルトで1fpsになっているためです。
Motionではフレームレートなど詳細な設定を行うことができます。上記で使用したmotionのconfigファイルを編集します。このファイルにデフォルトで記載されていないものもありますので、Motionの公式ページを参照しましょう。
ここでは次の設定を追記しました。
# in motion.conf
# streamの追加設定
stream_quality 50
stream_grey off
stream_maxrate 30
stream_motion off
stream_maxrateがfpsを設定する項目です。ここでは30pfsにしています。他にも設定を記載していますが内容はデフォルトのものです。例えばstream_greyをonに変えると表示され映像は白黒になります。設定を変えて試してみましょう。
ラズパイを起動したすぐにmotionを起動させたい場合は次のコマンドを実行しておきます。
# motionを自動起動に設定する
sudo systemctl enable motion.service
自動起動したくない場合は次のコマンドを使用します。
# 自動起動になっているかを確認する
sudo systemctl is-enabled motion.service
# 自動起動を無効にする
sudo systemctl disable motion.service
ROS2を使って、カメラ映像を配信する
次にROS2を使ってカメラ映像を配信する方法をまとめます。
ラズパイを使ってロボットを作るときにROS2を使うことがあると思います。そのため、motionのように異なるサービスを使用するのではなく、ロボット動作中にすでに動いているROS2内でサーバーを立てて配信する方がまとまりがよさそうです。
まずROS2を起動します。ROS2の場合は複数のターミナルでコマンドを入力していきますので、自動でROS2を起動するようにしてあると楽です。
# ROS2起動
source /opt/ros/humble/setup.bash
ROS2が起動しているかどうかをエラーが出ないかで確認します。
ros2 topic list
ros2 node list
ROS2で使用するパッケージをインストールします。
sudo apt install ros-humble-v4l2-camera ros-humble-web-video-server
V4L2インタフェースを持つカメラ用のドライバーパッケージとROS2の画像トピックをサブスクライブして、Webブラウザで見られるストリームとして配信するサーバーパッケージです。
次に新しいターミナルを起動し、カメラノードを立ち上げます。
# 新しいターミナル(2つ目)を起動しコマンドを入力
ros2 run v4l2_camera v4l2_camera_node --ros-args -p video_device:="/dev/video0" -p image_width:=640 -p image_height:=480 -p framerate:=15.0
色々エラーが出ましたが、私の環境ではとりあえず配信動作には問題がありませんでした。このカメラノードを立ち上げると、このターミナルはコマンドを受け付けなくなります。サービスを終了させるにはCtrl + Cを入力します。
元のターミナルに戻り、トピックリストを確認してみると新しい名前が追加されていると思います。
# 元のターミナルに戻り実行. /camera_info, /image_rawのトピックが立ち上がっている
ros2 topic list
トピックが実際にデータを流しているかを確認します。映像データっぽいものが見れます。このコマンドは出力し続けますので、Ctrl+cで停止させましょう。
ros2 topic echo /image_raw
# 出力
header:
stamp:
sec: 1745412364
nanosec: 575944633
frame_id: camera
height: 480
width: 640
encoding: rgb8
is_bigendian: 0
step: 1920
data:
-120
-110
-120
-122
-111
(略)
次にweb video serverを起動させ、PCのWebブラウザでカメラ映像を確認できるようにします。
ここでも新しいターミナルを別で立ち上げます。そしてWeb video serverノードを起動します。
# また新しいターミナル(3つ目)を立ち上げる
ros2 run web_video_server web_video_server
# 出力
[INFO] [1745419386.436143139] [web_video_server]: Waiting For connections on 0.0.0.0:8080
8080ポートに配信をしている状態です。
ラズパイにファイアウォールを設定している場合、ポート8080が解放されているかを確認しましょう。
# ufwの設定状態を確認
sudo ufw status verbose
8080ポートを許可していない場合は設定を更新してください。そもそもファイアウォールを使っていない場合は通信できると思います。もしファイアウォールでラズパイのセキュリティを設定したい場合は次の記事を参考にしてください。ufwの設定、ポートの開放などやり方を記載しています。
以上で設定は完了しました。それではPCのWebブラウザからアクセスしてみましょう。
# PC (Windows)のWebブラウザからアクセス

http://(ラズパイのipアドレス):8080
# example

http://192.168.10.110:8080
「Available ROS Image Topics:」が表示され、Streamをクリックするとカメラ映像を見ることができます。

ROS2のrqtを使って、カメラ映像を確認する
前項で示したように、ROSでカメラをパブリッシュするノードを実行した状態で、ROSのデバック等で使われるrqt(QtベースのGUIフレームワーク)を使用してカメラ映像を、開発用PC側で確認できます。
WindowsのPowershellやコマンドプロンプトからsshをしていると、Raspberry pi側で実行されたGUIは表示できません。それはWindowsのネイティブなOSにX Window systemというLinuxで使われているシステムが搭載されていないためです。
そのため過去からLinuxの表示をWindowsでできるようにするために、VcXsrvなどのソフトウェアをインストールしていました。
一方、WindowsにはWSL2でUbuntu OSなどを動かすことができるようになっています。25/04時点で最新なWindows11では、WSL2内に標準でX Windowを出せる機能が入っています。
今回はこのWSL2のUbuntu22.04を使用して、sshをしているラズパイ上でrqtを実行し、開発用PCにGUIの画面を表示させたいと思います。
Windows11でのWSL2, Ubuntuの導入方法はインターネットで検索してみてください。
開発用PCでUbuntuのプロンプトを2つ実行します。WSL2でも構いません。(Windowsの検索でubuntsu or wslを入力)
それぞれのプロンプトでラズパイにsshします。この時にsshに-Xオプションをつけます。
ssh -X user名@ラズパイのipアドレス
# raspberrypi.local等だとうまく名前の解決ができずに接続できないことがあります。
# ラズパイのipアドレスは、上記まででできていたpowershellなどで、
# ping raspberrypi.localやsshしてip addrなどをして確認しておきましょう。
次にROSでカメラをパブリッシュします。
# ラズパイにsshしているターミナル(1つ目)
ros2 run v4l2_camera v4l2_camera_node --ros-args -p video_device:="/dev/video0" -p image_width:=640 -p image_height:=480 -p framerate:=15.0
そして、もう一つのターミナルでrqtを実行します。
# ラズパイにsshしているターミナル(2つ目)
ROS rqt
これでGUIの画面が表示されます。初めて起動したときは、初回の表示がされるため、次の図のようにPluginsからVisualizationのImage Viewを選ぶとウィンドウが広がります。
次に広がった表示部分のImage Viewと書かれた下の枠で、/image_rawを選択するとカメラ映像が表示されます。

画像の回転なども行うことができるため触ってみるといいでしょう。
最後に
ラズパイに接続したカメラ(Raspberry pi camera module 2)の映像を、無線でsshしている開発用PCから確認する方法をまとめました。
これにより遠隔でラズパイのある周りの状況を確認することができます。移動ロボットが動作している状況などが考えられます。
またサーバーを立ててブラウザで映像を見ることができるため、PCをローカルネットワークにつなげipアドレスを知っていれば、特別な設定なしで映像を見ることができます。sshでラズパイに接続する必要もありません。便利ですね。活用しましょう。
無線ルータがない環境下など、ラズパイがスタンドアローンで動く状況でラズパイにSSHする方法は次の記事で紹介しています。
ラズパイにUSB WiFiアダプタを取り付ける方法は次の記事で書いています。LinuxはUSB WiFiアダプタのドライバを設定する必要があることが多いです。