えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

ティア某カメラを使ってみる&ROS2での使用

ティア某カメラ(Automotive Grade HDR Camera C1)の使用感想まとめ + ROS2での使用です。


このカメラはレベル3/4の自動運転向けに開発されており、カメラ内部でHDR処理を行うことができます。

防水防塵であるため、ロボティクス界隈のコワイ人たちによって水に沈められていたりします…


主なスペック(C1)

sensor.tier4.jp

  • 2.5MP高解像
  • 120dB HDR
  • LEDフリッカ低減
  • HW/SWシャッタートリガ(同期)
  • IP69K 防水防塵
  • 動作温度 -40 to 85°C

コネクタはGMSL2となっており、専用変換基板が必要です。

現時点では Jetson AGX developer Kit が必要です。


レビュー

とりあえずトンネルを擬似的に作成し、LEDライトを逆光に見立てて検証。

人間でもトンネルから出る際は、目が慣れるには時間がかかりますよね。

左側がティア某カメラ、右側がスマートフォンで焦点を異なる位置に合わせて撮影した画像です(HDRなし)。

しっかりと逆光対策できており、LEDの形まで見えてしまうほどの性能でした。

元ツイート

このカメラのすごいところは、HDR調整済みの画像がほぼ遅延なしに出力されることです。

逆光や反射に悩まされることが少なくなるという点で、開発者にやさしいカメラと言えるでしょう。


もっと過激に!?

この検証で満足していたところ、開発者様より「もっと過酷な環境でやって」とのお達しが来たので、夕日を撮影してみました。

ついでに周りにあったカメラも合わせて撮影してみました。カメラ側でリアルタイムHDRが可能なカメラの選択肢がほとんどないため、もはや出来レースですが…

ティア某カメラの他にZED2 Stereo camera、SANWA製4K解像度Webカメラ、RealSense D435iを使用しています。

元ツイート

予想通りではあるけれどもかなり綺麗に映っています。太陽の影響を受けにくく眩みにくい!

他のデバイスの追随を許さない圧倒的性能です。


フリッカー抑制

このカメラにはフリッカー抑制性能がついています。

信号機・電子標識は元の交流を全波整流で100Hz/120HzのPWM風の点滅(フリッカー)にします。

人の眼では分からないほど早いものですが、HDRカメラでは素子の短時間露光を行う必要があり、この点滅がたまたまカメラのシャッタータイミングに合致してしまった時に信号機が無灯火状態になります。

これでは信号や標識の検出には全く使えないので、フリッカー抑制機能がついている素子を利用する必要があるそうです。


フリッカー抑制機能付きの素子では、素子の特性を活かして露光時間を比較的長くすることができるため、点滅時の影響を低減することができます。

このサイトの解説がわかりやすかったです。(C2カメラの素子についての解説です)

thinklucid.com


左端から40Hz/50Hz/60HzのPWM電圧をLEDに印加して検証しました。50Hz付近で平滑化されていることが分かったのですが、少々暗くなっているようにも見えました。

元ツイート


ただ、実際の信号機は全波整流によって直流化されており、100Hz/120Hzで点灯しています。そのため、この検証は少し厳しすぎる環境だったみたいです。

100/120Hzの点滅では、暗くなっているようには見えなかったので、問題ないと感じました。

全く暗くなる気配を感じなかったので、載せません


ROS2での使用

ティア某カメラは、特製のLinuxカーネルを当てることでv4l2カメラとして認識させることができます。

そのため、カメラの設定を変更するだけでこれまでと同じプログラムでカメラを使用することができます。


imageトピックの送信にはgscam-nodeを使用します。

github.com

ROS-eloquent環境で動かしたのでビルドが必要でした。


ここでは、darknet-rosを使用して画像検出デモを行いました。

darknetは依存関係が複雑でないので環境構築が楽でいいです。

github.com

以下にLaunchファイルを示します。1台接続の場合の書き方になります。

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():

  gscam = Node(
        package="gscam", executable="gscam_node", # ROS-foxy
        # package="gscam", node_executable="gscam_node", # ROS-eloquent
        parameters=[
            {"gscam_config": "v4l2src device=/dev/video0 ! video/x-raw ! videoconvert"},
            {"sync_sink": False},
        ],
        remappings=[
            ("camera/image_raw","image_raw")
        ]
    )

  return LaunchDescription([
    gscam,
  ])

元ツイート


ちなみに、1台だけ接続されている場合のみOpenCVのVideoCaptureで(0)を指定するだけでも認識できます。(デフォルトで設定されているオプションに依存)


おわりに

他社の追随を許さない高性能な自動運転カメラを試してみました。

個人的には、ZED2 Stereo cameraのようなキャリブレーション済みのステレオカメラモジュールもあると嬉しいので密かに期待しています。