概要
とある事情でCANから流れてくる情報をわかりやすく把握したかったため,SavvyCANをUbuntu20.04でbuildしようとしたものの,色々詰まった際のメモ.
諸情報
環境
- Ubuntu 20.04.2 LTS (amd64)
最終的にbuildしたもの
- Qt 5 : Qt 5.15.2
- SavvyCAN : V204 (Continuous Build) - 5 May 2021
経緯
PEAK-SystemのPCAN-USB
経由でCAN通信をしたかったのだが,対象車の仕様がIDすら想定外だった.
諸々調べようと思い,PCAN-View for Linux
を使おうとするも,これを動かすにはPCAN Driver for Linux
が必要であり,SocketCANと併存できないことを思い出した.
そこで調べてみるとSavvyCANが良さそうだったので,buildを試みる.
が,普通に
$ qmake CONFIG+=debug
$ make
すると
dbc/dbchandler.cpp:1915:17: error: ‘class QList<DBCFile>’ has no member named ‘swapItemsAt’
1915 | loadedFiles.swapItemsAt(pos1, pos2);
というエラーに遭遇.
調べると,
にあるようにQtが古い模様.(質問者はswapに変更して解決したとのこと)
qtbase5-dev (qt5-qmake)と思われる元々Ubuntu 20.04に入っているものは記事執筆時点で5.12.8だった.
一応コマンドでも確認.
$ qmake -v
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu
さらに調べると,↓の通りThis function was introduced in Qt 5.13.
らしい.
また,よく読むと公式にちゃんと
This project requires 5.14.0 or higher because of a dependency on QtSerialBus and other new additions to Qt.
と書いてある.
というわけで,より新しいQt5を準備することに.
Qt 5.15.2
SavvyCANをbuildするためのツールをbuildしていく.
参考情報群
公式ドキュメントや公式Wiki,Linux From Scratchの情報が参考になる.
下準備
とりあえず,↓からqt-everywhere-src-5.15.2.tar.xzを落とし,展開しておく.
システム要件(Qt)
まず,Requirementsを満たしていく.
対象環境がROS Noeticを入れてあるような環境だったので,build-essentialなどは既に入っていた.
が,xcb周りが不足していたので,公式Wikiにある通り
$ sudo apt install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
として一式揃える.
(ちなみに大ハマリした原因はココだった…)
パッチ
Linux From ScratchのAdditional Downloads
にRequired patch
とやらがある.
First apply a patch to fix an Out Of Bounds read in QtSVG
とのことなので,とりあえず適用しておく.
$ cd xxx/qt-everywhere-src-5.15.2/
$ patch -Np1 -i ../qt-everywhere-src-5.15.2-CVE-2021-3481-1.patch
(↑xxx下にpatchファイルがある想定)
(適用が必須か否かは未確認)
さらに,
Project ERROR: Library 'assimp' is not defined.
と出てしまうので,
を参考にqtquick3d-assimp.patch
を当てる.ただ,↑にあるURLは404になってしまうため,
を使う.
$ cd xxx/qt-everywhere-src-5.15.2/qtquick3d
$ patch -Np1 -i ../../qt-debug-pkgbuild-master/qt5-quick3d/qtquick3d-assimp.patch
(↑xxx下にpatchファイルがある想定)
ビルド&インストール
Linux From ScratchのInstall Qt5 by running the following commandsを参考にbuildしていく.
なお,以下は/opt/qt-5.15.2
にインストールする想定のコマンド.
$ cd xxx/qt-everywhere-src-5.15.2
$ export QT5PREFIX=/opt/qt-5.15.2
$ ./configure -prefix $QT5PREFIX \
-sysconfdir /etc/xdg \
-confirm-license \
-opensource \
-dbus-linked \
-openssl-linked \
-system-harfbuzz \
-system-sqlite \
-nomake examples \
-no-rpath \
-skip qtwebengine \
-xcb-xlib \
-xcb
とし,
Features used by QPA backends:
︙
X11 specific:
XLib ................................. yes
XCB Xlib ............................. yes
EGL on X11 ........................... yes
xkbcommon-x11 ........................ yes
XCB Xlibとかxkbcommon-x11とかがyesになっていることを確認.
あとは普通に
$ make
$ sudo make install
とすれば/opt/qt-5.15.2
に入る.
なお,参考記事のTipsにバージョン有無間のシンボリックリンクに関する記述がある.
何故か-prefix
で/opt/qt5
を指定してインストールし,後から云々になっているが,自分は先の通り/opt/qt-5.15.2
へ直接インストールした上で
$ sudo ln -sfnv /opt/qt-5.15.2 /opt/qt5
とした.
その他
参考記事のNext fix some issues using gcc-11
にあるsed
連発はやらなくてもいけた…と思う.
パスは,qmake自体はダイレクトに叩けば良いので/opt/qt5/bin
なんかは通さず,lib周りだけ
LD_LIBRARY_PATH=/opt/qt5/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/opt/qt5/lib/plugins/
export QT_DEBUG_PLUGINS=1
とした.
(QT_DEBUG_PLUGINS
を1
にしているのは色々迷走した際の名残)
SavvyCAN V204
用意した新しいQt5を使って本来の目的であるSavvyCANをbuildする.
参考情報群
日本語だと以下の情報くらいしか出てこなかったが,いずれも18.04向け,かつQt 5.12でいけた頃もしくはJetson向けなので本環境とは完全には合致せず.
とは言え公式のREADME.mdで十分.
(最初は経緯の通りThis project requires 5.14.0 or higher
を見てませんでしたが…)
なお,後者はデフォルトのQtのバージョンに合わせてV199.1
を使うことにしているので,古いものを使ったり
などを参考に書き換えて対応するのもありかも知れない.
下準備
とりあえず,↓からgit cloneするか,zipで落として展開しておく.
システム要件(SavvyCAN)
DependenciesにあるThis project requires 5.14.0 or higher because of a dependency on QtSerialBus and other new additions to Qt.
に関しては5.15.2を用意したのでOK.
$ sudo apt install libqt5serialbus5-dev libqt5serialport5-dev qttools5-dev
を入れておく.
(参考情報前者曰く18.04だと自前buildを要する模様.Qt 5.12でbuildしていてQtSerialBusが5.14.0 or higherに依存してる
って話と矛盾するけど,おそらく5.12時代の話なのでしょう.)
なお,後述の通りうまく動かない部分もあったので,必要なら5.15用にbuildするべきかも知れない.
ビルド&実行
↓でbuildし,
$ cd xxx/SavvyCAN
$ /opt/qt5/bin/qmake CONFIG+=debug
$ make
(↑defaultの5.12.8ではなくbuildした新しいqmakeを呼ぶ)
↓普通に実行
$ cd xxx/SavvyCAN
$ ./SavvyCAN
これで↓のようにちゃんとSocketCAN経由で動作した.
PCAN-USBにおけるSocketCANとPCAN Driver
PEAK-Systemのアダプタを使ってSocketCANでSavvyCANを使う分にはココ以降の作業は不要.
ただ,PCAN Driverに関して以前別車両で使った頃のことを忘れていたので備忘録.
細かな説明は↓にある通り.
SocketCAN
公式にMany Linux distributions, or rather the used Linux Kernels, already contain the drivers for PEAK-System's CAN interfaces.
とある通り,Ubuntuには元々PEAK-System製CAN Interfacesのドライバが含まれているので,PCAN-USBは挿すだけで認識してくれる.
(多分16.04 LTS以降のKernel?)
なので,あとは以下のように起動してあげればSocketCANで通信できる.
$ sudo ip link set can0 type can bitrate 500000
$ sudo ip link set can0 up
(ifconfig -a
などで確認してcan0
として認識されていた場合)
なお,Kvaserはドライバ入れないと駄目だったような気がする.
ちなみにVectorはWindows専用.
PCAN Driver
先の通りSocketCANで事足りる場合は何も入れなくても良いが,公式にin connection with the PCAN-Basic API, you need our PCAN Driver for Linux package and compile the driver yourself
とある通り,PCAN-ViewのようにPCAN-Basic APIを使用するソフトを使いたい場合は別途PCAN Driverをインストールする必要がある.
準備
公式のDownload PCAN Driver Package
からドライバをダウンロードし,展開する.
なお,ドライバ本体の隣のリンクのDocumentation
に仕様などが書かれたPCAN DriverのUser Manualがある.
その中にSystem Requirements
が書かれており,自身の環境ではlibpopt-dev
が不足していたので
$ sudo apt install libpopt-dev
を叩いた.
ビルド&インストール(chardev)
User Manual内の3.1 Build Binaries
や3.2 Install Package
にある通りで,
$ cd xxx/peak-linux-driver-8.12.0/
$ make clean
$ make
とし,
$ sudo make install
$ sudo modprobe pcan
でOK.
これで入るのはchardev版ドライバであり,一応,netdev版が必要な場合は次の通り.
ビルド&インストール(netdev)
chardev版のmakeの部分でにnetdev用のオプションを付け,
$ make –C driver NET=NETDEV_SUPPORT
としてインストールすればOK.
(コッチの場合,普通は先の通り元々あるドライバで事足りるのだが,NVIDIA DRIVE AGXで使おうとした際に含まれておらずこうやってbuildとinstallをした…気がする.)
PCAN-View
公式のHow to install PCAN-View via repository
にある通り,
$ wget -q http://www.peak-system.com/debian/dists/`lsb_release -cs`/peak-system.list -O- | sudo tee /etc/apt/sources.list.d/peak-system.list
$ wget -q http://www.peak-system.com/debian/peak-system-public-key.asc -O- | sudo apt-key add -
$ sudo apt update
$ sudo apt install pcanview-ncurses
とすれば入り,
$ pcanview
で起動できる.
chardev版ドライバが正常にインストールされていれば
のように表示され,Rxを確認したりTxしてみたりが可能.
冒頭で述べた自身の「CANから流れてくる情報をわかりやすく把握」に関してはコレで十分だったのだが,chardev版を入れるとnetdev版もkernel内のドライバも使えなくなり,SocketCAN経由の通信ができなくなる.
逆にSocketCANを生かそうとすると
のようにPCAN-Viewが使えなくなる.
(これはnetdev版が入った状態なのでPCAN-USB自体は認識していてConnectedとなっているが,UNKNOWNと表示されて通信不可.なお,kernel内のドライバのみの場合はまずデバイス自体を認識できない.)
最終的にはROS上でsocketcan_interface経由の通信をするノードを作りたい状況なので,いちいちドライバを切り替える事になってしまう.
そのため,「SocketCANでキレイに可視化できそうなSavvyCANを使ってみよう」となった.
なお,SavvyCAN(というかQt Serial Bus)はchardev版PCAN Driverにも対応しているのだが,
設定がおかしいのかどうしても250000になってしまいうまく通信できなかった.
ただし,前述の通りaptでQtSerialBusを入れるなどしたため
libqt5serialbus5 (= 5.12.8-0ubuntu1)
が入っている環境につき,5.15用に自前buildすればうまく動くのかも知れない.
(PCAN-Viewは使えたし,以前PCAN-Basic APIを使うWindows用プログラムを作ったこともあるので,PCAN Driver自体は悪くないはず.)
ハマった原因
まず,元々色々入れてきていた環境だったので,xcb系が不足していると思わず,Linux From ScratchのInstall Qt5 by running the following commands
に書いてある
$ ./configure -prefix $QT5PREFIX \
-sysconfdir /etc/xdg \
-confirm-license \
-opensource \
-dbus-linked \
-openssl-linked \
-system-harfbuzz \
-system-sqlite \
-nomake examples \
-no-rpath \
-skip qtwebengine &&
make
をそのまま叩いてしまった.
単にconfigureだけ叩くと色々選択しないといけない
Selecting Qt Edition.
Type 'c' if you want to use the Commercial Edition.
Type 'o' if you want to use the Open Source Edition.
Which edition of Qt do you want to use? o
This is the Qt Open Source Edition.
You are licensed to use this software under the terms of
the GNU Lesser General Public License (LGPL) version 3
or the GNU General Public License (GPL) version 2.
Type 'L' to view the GNU Lesser General Public License version 3 (LGPLv3).
Type 'G' to view the GNU General Public License version 2 (GPLv2).
Type 'y' to accept this license offer.
Type 'n' to decline this license offer.
Do you accept the terms of either license? y
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
となって理由を探す羽目になった.
パスが通っていないのか?などと延々迷走した後,libxcb等が不足していたことに気付き,個別にインストールした.
それでも無理だったため,configure
時に-xcb-xlib
や-xcb
を付けてみたところ,
ERROR: Feature 'xcb' was enabled, but the pre-condition 'features.thread && libs.xcb && features.xkbcommon-x11' failed.
ERROR: Feature 'xcb-xlib' was enabled, but the pre-condition 'features.xlib && libs.xcb_xlib' failed.
となり,
Features used by QPA backends:
︙
X11 specific:
XLib ................................. yes
XCB Xlib ............................. no
EGL on X11 ........................... yes
xkbcommon-x11 ........................ no
のままだった.
先の一気に網羅なコマンドを叩いても(そもそもその時点では全てinstalled),何度configureしてもこの状況から抜け出せず…
結局,一度
$ make clean
してあげないと最初に
Checking for XCB >= 1.11... yes
Checking for XCB ICCCM >= 0.3.9... yes
Checking for XCB Util >= 0.3.9... yes
Checking for XCB SHM... yes
Checking for XCB Image >= 0.3.9... yes
Checking for XCB Keysyms >= 0.3.9... yes
Checking for XCB RandR... yes
Checking for XCB XRender... yes
Checking for XCB Renderutil >= 0.3.9... yes
Checking for XCB Shape... yes
Checking for XCB Sync... yes
Checking for XCB Xfixes... yes
Checking for XCB Xinerama... yes
Checking for XCB XKB... yes
Checking for XCB (extensions)... yes
Checking for xkbcommon >= 0.5.0... yes
Checking for xkbcommon-x11... yes
と判定される部分は更新されず,何度configure叩こうがライブラリの有無フラグは残ったままだったのが原因だった.
- libがすでに揃っている,無くともqmakeかmake段階でエラーが出るだろうと思い込んでいた
- 最初にmakeまで一気に叩くコマンドをコピペしてしまい,膨大なログでこの判定部分はすぐに流れてしまってこのログの存在も知らず,毎回libの判定をしていると思い込んでいた(二度目からのconfigureではChecking forが出てこない)
- そこそこ重いのでcleanを避けていた
というコンボで時間を熔かしてしまいました(T_T)