コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2024年10月6日 >>> 2024年9月27日
link もっと後

2024年10月6日

OpenPilotを調べる - ビルドと実行

目次: OpenPilot

最近はOSSの運転支援ソフトウェアOpenPilotのコードを見ています。今日はOpenPilotのビルドと実行方法について調べます。ソースコードはGitHubから入手できます(リンク)。

OpenPilotは全自動運転とはいかないまでもADAS+αの機能を実現するシステムです。OpenPilot用のデバイスが市販されており、既存のADASシステム搭載車のCAN通信回線に割り込ませる形で後付します。自動運転レベルでいえばレベル2(常に人間が見ている前提)だと思います。突然止まっても害はありませんし、OpenPilotがおかしな制御信号を出しても既存ADASシステムが受け付けないはずです。たぶん……。

ビルド

ソースコードの他にUbuntuの環境、Pythonの環境のセットアップが必要です。私はDebian Testingで試しましたが、特にこだわりがなければUbuntu 24.04 LTSを使うと良いと思います。

OpenPilotのビルド
$ cd openpilot
$ git submodule update --init --recursive
$ ./tools/install_ubuntu_dependencies.sh

$ python3 -m venv .venv
$ source .venv/bin/activate
$ ./tools/install_python_dependencies.sh

$ scons -j8

主にPythonとC++で実装されています。車用と銘打ったソフトウェアがPythonを使っているのは割と驚きでした……。

実行

ビルドできましたが我が家には専用デバイスもありませんし、車も古いのでADAS付きではありません。そんな私はどうしたら良いのでしょうか?大丈夫、デモモードがあります。デモモードを動作させるには端末を2つ使います。

OpenPilotのデモモード起動方法
#### 1つ目の端末

$ ./tools/replay/replay

#### 2つ目の端末

$ ./selfdrive/ui/ui

なぜかreplayはCUIで、uiはGUIです。まあそれはどうでも良いとして、replay側はこのような表示になるはずです。


OpenPilotのreplay(デモモード)

デモモードではあるもののデータ自体は実際の車で走行したデータを再現しているはずです(たぶん)。しばらくするとCar Fingerprint: TOYOTA COROLLA TSS2 2019と出ますから、カローラと接続してこのデータを作ったのでしょう。もう一方のui側はこのような表示になるはずです。


OpenPilotのui(デモモード)

アメリカのどこかのハイウェイ?でしょうか。しばらく見ていると車線変更を行ったりする様子が見えると思います。

デモモードでは全ての機能が動作する訳ではありませんが、特殊な機器なしでもある程度動作させることができるため、内部を解析する際の手助けになるでしょう。なかなか便利ですね。

編集者:すずき(2024/10/25 02:11)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年10月4日

OpenPilot - まとめリンク

目次: OpenPilot

一覧が欲しくなったので作りました。

編集者:すずき(2024/10/24 00:23)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年10月3日

Ubuntu 20.04 LTSでxrdpのエラーを再現できるか挑戦

目次: Linux

先日(2024年10月1日の日記参照)のUbuntu 22とxrdpの組み合わせで起きるエラーですが、Ubuntu 20で再現できるかやってみました。グラフィクスは種類が違いますがAMDのGPU(Radeon RX 6900 XT)です。条件は同様でgdm3は終了させてxrdpのみ起動しています。

結論から言うと再現しました。以下が通常時のログです。正常に画面が表示されます。

AMD GPU&Ubuntu 20.04 LTSのgnome-session-binaryのログ
gnome-session-binary[2712263]: DEBUG(+): Enabling debugging
gnome-session-binary[2712263]: GLib-DEBUG(+): posix_spawn avoided (fd close requested)
gnome-session-binary[2712263]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’
gnome-session-binary[2712263]: WARNING: Error creating FIFO: File exists

ログにはデバッグ有効であること以外は特に何も出ません。FIFOが作れない警告が出ます、これは何だろう?まあいいか。

次にcard0とrenderD128をリネームしてアクセスできないようにして試しました。画面は真っ黒になってすぐに切断されます。Ubuntu 20.04 LTSでも再現するんですね。ログは下記のようになりました。

card0とrenderD128をリネームした時のログ
gnome-session-binary[2712010]: DEBUG(+): Enabling debugging
gnome-session-binary[2712010]: GLib-DEBUG(+): posix_spawn avoided (fd close requested)
gnome-session-is-accelerated: No hardware 3D support.
gnome-session-check-accelerated: GL Helper exited with code 256
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)

** (gnome-session-check-accelerated-gles-helper:2712146): WARNING **: 14:44:50.573: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[2712010]: DEBUG(+): hardware acceleration check failed: Child process exited with code 1
gnome-session-binary[2712010]: GLib-DEBUG(+): setenv()/putenv() are not thread-safe and should not be used after threads are created
gnome-session-binary[2712010]: GLib-DEBUG(+): posix_spawn avoided (fd close requested)
gnome-session-is-accelerated: No hardware 3D support.
gnome-session-check-accelerated: GL Helper exited with code 256
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)

** (gnome-session-check-accelerated-gles-helper:2712203): WARNING **: 14:44:55.610: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[2712010]: WARNING: software acceleration check failed: Child process exited with code 1
gnome-session-binary[2712010]: CRITICAL: We failed, but the fail whale is dead. Sorry....

前回も見かけたamdgpu_get_auth()のエラーが出て止まりました。AMDのGPUの場合、エラーが起きると止まってしまう疑いが強まりました。本当はエラーが起きたらソフトウェアレンダリングにフォールバックしてほしいんですけど、そうならないようです……。

デバイスファイルが/dev/driに全く存在しなくてもamdgpu_get_auth()が怒ってくるところを見ると、X.orgはPCのグラフィクスの種類(VirtualBoxなのかAMDのGPUなのか)を最初から決め打ちにしているんですね。

編集者:すずき(2024/10/06 01:33)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年10月2日

VirtualBoxでxrdpのエラーを再現できるか挑戦

目次: Linux

昨日(2024年10月1日の日記参照)のUbuntu 22とxrdpの組み合わせで起きるエラーですが、VirtualBox 7.0.18で再現できるかやってみました。グラフィクスはVMSVGAを選択しています。VMSVGAは/dev/driの下にcard0とrenderD128が生成されるようです。ちなみにgdm3は終了させてxrdpのみ起動しています。

ちなみに結論から言っておくと再現しません。以下が通常時のログです。正常に画面が表示されます。

VirtualBox&Ubuntu 22.04 LTSのgnome-session-binaryのログ
gnome-session-binary[2774]: DEBUG(+): Enabling debugging
gnome-session-binary[2774]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’

ログにはデバッグ有効であることと、libEGLが何かしら見つけて反応しています。それ以外は特に何も出ません。

次にcard0とrenderD128をリネームしてアクセスできないようにして試しました。しかし正常に画面が表示されます。えぇー?ログは下記のようになりました。

card0とrenderD128をリネームした時のログ
gnome-session-binary[4319]: DEBUG(+): Enabling debugging
gnome-session-check-accelerated: GL Helper exited with code 512
libEGL warning: DRI2: failed to authenticate
gnome-session-check-accelerated: GLES Helper exited with code 512
gnome-session-binary[4319]: GLib-GIO-DEBUG(+): _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for ‘gsettings-backend’

AMDのGPUでも見かけたfailed to authenticateが出ています。が、エラーは無視されるんでしょうか?謎の動きですね。

編集者:すずき(2024/10/05 15:08)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年10月1日

Ubuntu 22.04のxrdpに接続できない病

目次: Linux

WindowsからUbuntu 22.04 LTSのxrdpに接続すると真っ黒な画面しか出ず、すぐに接続が切断されてしまう問題に遭遇しました。どこでクラッシュしているか調べるため、xrdpがGNOMEを起動するところまでを追いかけると下記のようになっていました。

xrdpがXsessionを起動するまでの呼び出し経路
/etc/xrdp/startwm.sh
  exec /bin/sh /etc/X11/Xsession
    /etc/X11/Xsession.d/99x11-common_start
      /usr/bin/ssh-agent /usr/bin/im-launch x-session-manager
        /usr/bin/x-session-manager
          /usr/libexec/gnome-session-binary

スクリプトx-session-managerを書き換えてgnome-session-binaryの引数に--debugを足すと、GNOMEはより詳細なメッセージを出力します。メッセージはホームディレクトリの.xsession-errorsに記録されます。GNOMEのエラーメッセージは下記です。

GNOMEのエラーメッセージ
** (gnome-session-check-accelerated-gles-helper:3301100): WARNING **: 13:50:04.884: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[3300977]: DEBUG(+): hardware acceleration check failed: Child process exited with code 1
gnome-session-binary[3300977]: GLib-DEBUG(+): setenv()/putenv() are not thread-safe and should not be used after threads are created
gnome-session-binary[3300977]: GLib-DEBUG(+): posix_spawn avoided (fd close requested)
gnome-session-is-accelerated: No hardware 3D support.
gnome-session-check-accelerated: GL Helper exited with code 256    ★★ここでエラーが発生している
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)
amdgpu_device_initialize: amdgpu_get_auth (1) failed (-1)

** (gnome-session-check-accelerated-gles-helper:3301174): WARNING **: 13:50:09.927: eglInitialize() failed
gnome-session-check-accelerated: GLES Helper exited with code 256
gnome-session-binary[3300977]: WARNING: software acceleration check failed: Child process exited with code 1
gnome-session-binary[3300977]: CRITICAL: We failed, but the fail whale is dead. Sorry....

エラーメッセージ曰くamdgpu_get_auth()が失敗しています。関数名から推測するにAMDのGPUが装着されているマシンでしか発生しないエラーなのかもしれません。この関数は何者なのかDRMのソースコード(Mesa/libdrmのソースコードリポジトリへのリンク)を見ると、

libdrmのソースコード

// drm/amdgpu/amdgpu_device.c

/**
* Get the authenticated form fd,
*
* \param   fd   - \c [in]  File descriptor for AMD GPU device
* \param   auth - \c [out] Pointer to output the fd is authenticated or not
*                          A render node fd, output auth = 0
*                          A legacy fd, get the authenticated for compatibility root
*
* \return   0 on success\n
*          >0 - AMD specific error code\n
*          <0 - Negative POSIX Error code
*/
static int amdgpu_get_auth(int fd, int *auth)
{
	int r = 0;
	drm_client_t client = {};

	if (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER)
		*auth = 0;
	else {
		client.idx = 0;
		r = drmIoctl(fd, DRM_IOCTL_GET_CLIENT, &client);    //★★エラーを返すのはこの関数だけ★★
		if (!r)
			*auth = client.auth;
	}
	return r;
}


// drm/xf86drm.c

/**
 * Call ioctl, restarting if it is interrupted
 */
drm_public int
drmIoctl(int fd, unsigned long request, void *arg)
{
    int ret;

    do {
        ret = ioctl(fd, request, arg);    //★★drmIoctl()はioctl()が返すエラーをそのまま返す★★
    } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
    return ret;
}

ソースコードから推測するにグラフィクス系のデバイスファイルにioctl()しようとして失敗しているものと思われます。

XのグラフィックスはDRI(Direct Rendering Infrastructure)と呼ばれるインタフェースを経由してGPUを使用します。Xとカーネルの間にはlibDRMがおり、libDRMはLinuxカーネルのDRM(Direct Rendering Manager)を使用してGPUにアクセスします。DRMのデバイスファイルは/dev/driディレクトリの下にありますが、名前がDRIだったりDRMだったりして謎ですね。グラフィクス周りはあまり詳しくなくて理由はわかりません……。

DRMのデバイスファイルの例
# ls /dev/dri/* -la

crw-rw-rw-+ 1 root video  226,   0  4月 30 15:00 /dev/dri/card0
crw-rw-rw-+ 1 root render 226, 128  4月 30 15:00 /dev/dri/renderD128

上記のようにキャラクタデバイス/dev/dri/card0と/dev/dri/renderD128のパーミッションを0666にしたところエラーが出なくなりました。今回はこの2つのデバイスファイルで解決しましたが、他のデバイスファイルにもアクセスしていた場合はさらに調査が必要かもしれません。グラフィクス系のエラーは簡単に調べる方法がないのが辛いですね。

ちなみにこの症状はQEMUだと再現しません。card0のパーミッションを0000にするとlibEGLがエラーになるのですが、なぜかGNOMEはエラーを無視して起動してしまいます。AMDのときだけなんで止まるんでしょうか。いまいち釈然としません……。

編集者:すずき(2024/10/05 15:07)

コメント一覧

  • hdkさん(2024/10/03 08:30)
    おー、面白いですね。xrdpはすでに立ち上がっているVNCサーバーにつなぐ設定しかしたことがなくて、startwm.shなんてスクリプトがあったとは...
    この前WaylandのWestonを少し触ったんですが(ちなみにWestonにもRDPやVNCを提供する機能もあります)、その時にrendererにCPUを使うかGPUを使うかの選択肢がありました。Container上でXwaylandとXアプリケーションを走らせてホスト側Weston上に出すみたいなことをしたんですけど、GPUを使う設定だとXwaylandがDRMデバイスを探してしまってcontainerからアクセスできないのでエラーになるというのがありました。
    それで、QEMUだと再現しないというのは、まともなハードウェアアクセラレーションがないのでソフトウェアレンダリングになっているのかな、と思いました。
    /dev/driはkvmと同様にローカルのログインユーザーにはudevのuaccessでアクセス権が与えられていますね。
  • すずきさん(2024/10/03 10:12)
    私は逆にVNCサーバーに繋ぐ使い方をしたことがなくて、違いがわかってないです。あと今回調べて初めて構造を知ったので、正しいのか若干不安です。
    Westonは触ったことないですねえ。しかもコンテナ内でもないから普通に動作してほしいところです。

    GNOMEがハードウェアレンダリングかソフトウェアレンダリングかどちらを選択したのか確認しなかったですね。ログに出るかな?
    パーミッションに関してはおっしゃる通りで/dev/driは通常パーミッションの問題は発生しないですが、なぜか今回は変な現象が発生しました。AMDのGPUだと何かあるのかなあ……?
  • hdkさん(2024/10/03 19:05)
    GNOMEをお使いでしたら今はWaylandにも対応していますから、Westonと同じようにRDPのバックエンドを選べてもよさそうです。

    パーミッションは、AMDだからというよりは、たぶんローカルでログインした扱いになっていないんじゃないかと思います。uaccessの設定は端末の眼の前で直接ログインした時にはアクセス権が付与されるんですが、それ以外のSSHとかVNCとかでは付与されないものです。昔、大学の共用計算機システムみたいなところで、光学ドライブのパーミッションが0666になっていて、人が使っているところにリモートログインして勝手にejectを実行する、なんて遊びがありましたが、そういうのができないように、今はuaccessで管理されるみたいですね。
  • すずきさん(2024/10/06 03:41)
    xrdpで十分動作しているので、Waylandにはそこまでこだわってないんですが、時代はWaylandなのかなあ。

    uaccess知らなかったので少し調べてみたら、
    TAG+="uaccess"
    をルールに追加するとpam-systemdからsystemd-logindに依頼が行ってACLでパーミッションが設定される、なんて仕組みがあるんですね。なかなか複雑だなあ……。
open/close この記事にコメントする



2024年9月28日

TAS動画をニコニコ動画にアップロードできない

クラッキングでぶっ壊されてしまったニコニコ動画が復活し、シン・ニコニコ動画になって帰ってきました。いちユーザーとしては嬉しい気分でいっぱいです。

しかし前と比べて困ったことが起きていて、BizHawkで出力した動画をシン・ニコニコ動画にアップロードしようとすると「この動画の映像形式には対応していません」とエラーが出てしまって投稿できません。試行錯誤の末、解決方法を見つけたのでメモしておきます。

端的に言えば原因はピクセルフォーマットでした。BizHawkは特に何も言わないとYUV444で出力しますが、ニコニコ動画はYUV420でないと受け付けてくれないようです。どこにもそんな制約は書いていないため、仕様か?バグか?どちらともわかりません。

YUV420にする方法ですけども、BizHawkの出力設定を[Custom]にして、下記のようにピクセルフォーマットを明示的に指定すればYUV420で出力してくれました。

BizHawkの[Custom]動画出力設定の例
-c:a aac -c:v libx264 -preset ultrafast -pix_fmt yuv420p -f mp4

もしすでにYUV444で出力済みの動画ならば、ffmpegを使って再エンコードすれば良いです。

ピクセルフォーマットYUV420で再エンコード
$ ffmpeg -i input.mp4 \
    -vcodec libx264 -vb 2048000 -r 60 -s 1280x720 -pix_fmt yuv420p \
    -acodec aac -ar 44100 -ab 192000 output.mp4

動画ビットレート(-vb)、フレームレート(-r)、動画サイズ(-s)は元の動画に応じて調整してください。

編集者:すずき(2024/10/03 01:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2024年10月6日 >>> 2024年9月27日
link もっと後

管理用メニュー

link 記事を新規作成

<2024>
<<<10>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」
  • link 24年10月1日
    hdkさん (10/03 08:30)
    「おー、面白いですね。xrdpはすでに立ち...」
  • link 14年6月13日
    2048player...さん (09/26 01:04)
    「最後に、この式を出すのに紙4枚(A4)も...」

最近の記事3件

  • link 24年10月28日
    すずき (10/30 23:49)
    「[Linuxからリモートデスクトップ] 目次: Linux開発用のLinuxマシンの画面を見るにはいろいろな手段がありますが、...」
  • link 23年4月10日
    すずき (10/30 23:46)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年10月24日
    すずき (10/25 02:35)
    「[ONKYOからM-AUDIOのUSB DACへ] 目次: PCかれこれ10年以上(2013年3月16日の日記参照)活躍してく...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 10/30 23:49