Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?
@fararrow

SavvyCANをbuildするためにQt 5.15.2をbuild

概要

とある事情でCANから流れてくる情報をわかりやすく把握したかったため,SavvyCANをUbuntu20.04でbuildしようとしたものの,色々詰まった際のメモ.

SavvyCAN V204

諸情報

環境

  • 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していく.

参考情報群

公式ドキュメント公式WikiLinux 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 ScratchAdditional DownloadsRequired 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

とし,

good_result
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周りだけ

.bashrc
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_PLUGINS1にしているのは色々迷走した際の名残)

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.

What to do if qmake fails with error Project ERROR: Unknown module(s) in QT: qml serialbus help on Ubuntu?にある通り

$ 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経由で動作した.

SavvyCAN V204

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 Binaries3.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版ドライバが正常にインストールされていれば
PCAN-View v0.9.0
のように表示され,Rxを確認したりTxしてみたりが可能.

冒頭で述べた自身の「CANから流れてくる情報をわかりやすく把握」に関してはコレで十分だったのだが,chardev版を入れるとnetdev版もkernel内のドライバも使えなくなり,SocketCAN経由の通信ができなくなる.
逆にSocketCANを生かそうとすると
PCAN-View UNKNOWN
のようにPCAN-Viewが使えなくなる.
(これはnetdev版が入った状態なのでPCAN-USB自体は認識していてConnectedとなっているが,UNKNOWNと表示されて通信不可.なお,kernel内のドライバのみの場合はまずデバイス自体を認識できない.)

最終的にはROS上でsocketcan_interface経由の通信をするノードを作りたい状況なので,いちいちドライバを切り替える事になってしまう.
そのため,「SocketCANでキレイに可視化できそうなSavvyCANを使ってみよう」となった.

なお,SavvyCAN(というかQt Serial Bus)はchardev版PCAN Driverにも対応しているのだが,
SavvyCAN PCAN Driver
設定がおかしいのかどうしても250000になってしまいうまく通信できなかった.
ただし,前述の通りaptでQtSerialBusを入れるなどしたため

libqt5serialbus5 (= 5.12.8-0ubuntu1)が入っている環境につき,5.15用に自前buildすればうまく動くのかも知れない.
(PCAN-Viewは使えたし,以前PCAN-Basic APIを使うWindows用プログラムを作ったこともあるので,PCAN Driver自体は悪くないはず.)

ハマった原因

まず,元々色々入れてきていた環境だったので,xcb系が不足していると思わず,Linux From ScratchInstall 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

ので確かに楽なのだが,このままだと一気にmakeまでやりきってしまうため,xcb系非対応のままSavvyCANのbuildへ進んでしまった.
しかもSavvyCANのbuild自体はできてしまい,実行時に

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.

となり,

bad_result
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)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?