XRoboToolkit PC Service ARM64 Instructions
Target machine:
g1-rpaarch64Ubuntu 20.04.6 LTS- output
.deb:~/src/XRoboToolkit-PC-Service-main/RoboticsService/Package/output/XRoboToolkit-PC-Service_1.0.0.0_arm64.deb
Why Rebuild
The upstream ARM64 .deb installs but does not run on Ubuntu 20.04. It was
built against newer runtime symbols:
GLIBC_2.34 not found
GLIBC_2.33 not found
GLIBC_2.32 not found
GLIBCXX_3.4.29 not found
Build on g1-rp so the service links against Ubuntu 20.04-compatible runtime
libraries.
Setup
1. system packages
Run on g1-rp:
sudo apt update
sudo apt install -y \
build-essential \
cmake \
git \
wget \
python3 \
python3-pip \
protobuf-compiler \
libprotobuf-dev
Enable proxy if GitHub / Qt downloads are slow:
source ~/.bashrc
proxy_on
2. source
On a machine with good GitHub access:
curl -L \
-o /tmp/xrobotoolkit-pc-service-main.tar.gz \
https://codeload.github.com/XR-Robotics/XRoboToolkit-PC-Service/tar.gz/refs/heads/main
scp /tmp/xrobotoolkit-pc-service-main.tar.gz \
g1-rp:/home/elijah/src/xrobotoolkit-pc-service-main.tar.gz
On g1-rp:
mkdir -p ~/src
cd ~/src
rm -rf XRoboToolkit-PC-Service-main
tar xf xrobotoolkit-pc-service-main.tar.gz
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
3. Qt 6.7.3
python3 -m pip install --user --upgrade pip setuptools wheel aqtinstall
source ~/.bashrc
proxy_on
~/.local/bin/aqt install-qt \
-O ~/Qt6 \
linux_arm64 desktop 6.7.3 linux_gcc_arm64 \
-m qt5compat
Check:
~/Qt6/6.7.3/gcc_arm64/bin/qmake -query QT_VERSION
Expected:
6.7.3
4. gRPC 1.16
mkdir -p ~/pkgprobe ~/opt/grpc16-extract
cd ~/pkgprobe
apt download \
libgrpc++-dev \
libgrpc-dev \
protobuf-compiler-grpc \
libgrpc++1 \
libgrpc6 \
libc-ares2 \
libssl1.1
cd ~/opt/grpc16-extract
rm -rf ./*
for f in \
~/pkgprobe/libgrpc++-dev_1.16.1-1ubuntu5_arm64.deb \
~/pkgprobe/libgrpc-dev_1.16.1-1ubuntu5_arm64.deb \
~/pkgprobe/protobuf-compiler-grpc_1.16.1-1ubuntu5_arm64.deb \
~/pkgprobe/libgrpc++1_1.16.1-1ubuntu5_arm64.deb \
~/pkgprobe/libgrpc6_1.16.1-1ubuntu5_arm64.deb \
~/pkgprobe/libc-ares2_1.15.0-1ubuntu0.5_arm64.deb \
~/pkgprobe/libssl1.1_1.1.1f-1ubuntu2.24_arm64.deb
do
dpkg-deb -x "$f" ~/opt/grpc16-extract
done
cd ~/opt/grpc16-extract/usr/lib/aarch64-linux-gnu
ln -sf libcares.so.2 libcares.so
Check:
test -x ~/opt/grpc16-extract/usr/bin/grpc_cpp_plugin
ls ~/opt/grpc16-extract/usr/lib/aarch64-linux-gnu/libgrpc++.so.1
Patch
Run from:
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
1. remove Core5Compat
perl -0pi -e 's/find_package\(Qt6 REQUIRED COMPONENTS Core5Compat\)\n//g;
s/target_link_libraries\(([^\n]+) PRIVATE Qt6::Core5Compat\)\n//g' \
CMakeLists.txt \
CommonUtils/CMakeLists.txt \
Business/CMakeLists.txt \
PXREAGRPCServer/CMakeLists.txt \
RoboticsServiceProcess/CMakeLists.txt
perl -0pi -e 's/#include <QTextCodec>\n//g;
s/\n\s*QTextCodec\* codec = QTextCodec::codecForName\("utf-8"\);\n\s*QTextCodec::setCodecForLocale\(codec\);\n/\n/g' \
Business/Business_global.h \
Business/business.cpp \
RoboticsServiceProcess/main.cpp
2. regenerate protobuf
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService/PXREAService
cp -f linux_aarch64/PXREAService.pb.h linux_aarch64/PXREAService.pb.h.bak
cp -f linux_aarch64/PXREAService.pb.cc linux_aarch64/PXREAService.pb.cc.bak
cp -f linux_aarch64/PXREAService.grpc.pb.h linux_aarch64/PXREAService.grpc.pb.h.bak
cp -f linux_aarch64/PXREAService.grpc.pb.cc linux_aarch64/PXREAService.grpc.pb.cc.bak
protoc \
-I . \
-I /usr/include \
--cpp_out=linux_aarch64 \
--grpc_out=linux_aarch64 \
--plugin=protoc-gen-grpc=$HOME/opt/grpc16-extract/usr/bin/grpc_cpp_plugin \
PXREAService.proto
3. link local gRPC
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
python3 - <<'PY'
from pathlib import Path
p = Path("PXREAGRPCServer/CMakeLists.txt")
text = p.read_text()
text = text.replace(
"""target_include_directories(PXREAGRPCServer PUBLIC
../Redistributable/linux_aarch64/grpc/include
../PXREAService/linux_aarch64
)""",
"""target_include_directories(PXREAGRPCServer PUBLIC
$ENV{HOME}/opt/grpc16-extract/usr/include
../PXREAService/linux_aarch64
)""",
)
text = text.replace(
"target_link_directories(PXREAGRPCServer PUBLIC ${PROJECT_SOURCE_DIR}/../Redistributable/linux_aarch64/grpc/lib)",
"target_link_directories(PXREAGRPCServer PUBLIC $ENV{HOME}/opt/grpc16-extract/usr/lib/aarch64-linux-gnu)",
)
lines = text.splitlines()
out = []
i = 0
while i < len(lines):
if lines[i].startswith(" target_link_libraries(PXREAGRPCServer PUBLIC"):
out.extend([
" target_link_libraries(PXREAGRPCServer PUBLIC",
" grpc++",
" grpc++_reflection",
" grpc",
" gpr",
" protobuf",
" cares",
" ssl",
" crypto",
" z",
" Threads::Threads",
" )",
"",
])
i += 1
while i < len(lines) and lines[i].strip() != ")":
i += 1
if i < len(lines) and lines[i].strip() == ")":
i += 1
continue
out.append(lines[i])
i += 1
p.write_text("\n".join(out) + "\n")
PY
Build
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
rm -rf build20
cmake \
-S . \
-B build20 \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$HOME/Qt6/6.7.3/gcc_arm64 \
-DBUILD_LIB_PATH=$HOME/Qt6/6.7.3/gcc_arm64
cmake --build build20 -- -j"$(nproc)"
Check:
ls -l bin/RoboticsServiceProcess
Expected build line:
[100%] Built target RoboticsServiceProcess
Package
1. stage runtime libraries
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
mkdir -p bin/lib
for lib in \
libQt6Core.so libQt6Core.so.6 libQt6Core.so.6.7.3 \
libQt6Network.so libQt6Network.so.6 libQt6Network.so.6.7.3 \
libQt6DBus.so libQt6DBus.so.6 libQt6DBus.so.6.7.3 \
libQt6Sql.so libQt6Sql.so.6 libQt6Sql.so.6.7.3
do
[ -e "$HOME/Qt6/6.7.3/gcc_arm64/lib/$lib" ] && \
cp -a "$HOME/Qt6/6.7.3/gcc_arm64/lib/$lib" bin/lib/
done
rm -f bin/lib/libicui18n.so.73 bin/lib/libicuuc.so.73 bin/lib/libicudata.so.73
cp -L "$HOME/Qt6/6.7.3/gcc_arm64/lib/libicui18n.so.73" bin/lib/libicui18n.so.73
cp -L "$HOME/Qt6/6.7.3/gcc_arm64/lib/libicuuc.so.73" bin/lib/libicuuc.so.73
cp -L "$HOME/Qt6/6.7.3/gcc_arm64/lib/libicudata.so.73" bin/lib/libicudata.so.73
for lib in \
libgrpc++.so.1 libgrpc++.so.1.16.1 \
libgrpc++_reflection.so.1 libgrpc++_reflection.so.1.16.1 \
libgrpc.so.6 libgrpc.so.6.0.0 \
libgpr.so.6 libgpr.so.6.0.0 \
libssl.so.1.1 libcrypto.so.1.1 \
libcares.so.2 libcares.so.2.3.0
do
[ -e "$HOME/opt/grpc16-extract/usr/lib/aarch64-linux-gnu/$lib" ] && \
cp -a "$HOME/opt/grpc16-extract/usr/lib/aarch64-linux-gnu/$lib" bin/lib/
done
[ -d "$HOME/Qt6/6.7.3/gcc_arm64/translations" ] && \
cp -a "$HOME/Qt6/6.7.3/gcc_arm64/translations" bin/
mkdir -p bin/plugins
for d in generic networkinformation platforminputcontexts platforms sqldrivers tls; do
[ -d "$HOME/Qt6/6.7.3/gcc_arm64/plugins/$d" ] && \
cp -a "$HOME/Qt6/6.7.3/gcc_arm64/plugins/$d" bin/plugins/
done
Check:
LD_LIBRARY_PATH=$PWD/bin:$PWD/bin/lib \
ldd bin/RoboticsServiceProcess | grep 'not found' || true
Expected: no output.
2. build deb
cd ~/src/XRoboToolkit-PC-Service-main/RoboticsService
rm -rf Package/debPackAArch64/package_arm64
bash Package/debPackAArch64/setup.sh
Check:
ls -lh Package/output/XRoboToolkit-PC-Service_1.0.0.0_arm64.deb
dpkg-deb -c Package/output/XRoboToolkit-PC-Service_1.0.0.0_arm64.deb | \
egrep 'RoboticsServiceProcess|libicu|libgrpc|libQt6Core|libQt6Network|runService'
Install
sudo apt install -y \
~/src/XRoboToolkit-PC-Service-main/RoboticsService/Package/output/XRoboToolkit-PC-Service_1.0.0.0_arm64.deb
Installed path:
/opt/apps/roboticsservice
Validate
Check runtime dependencies:
cd /opt/apps/roboticsservice
LD_LIBRARY_PATH=$PWD:$PWD/lib:$PWD/SDK/arm64 \
ldd ./RoboticsServiceProcess | grep 'not found' || true
Expected: no output.
Start service:
bash /opt/apps/roboticsservice/runService.sh
Expected log:
Synchronous server. Num CQs: 1, Min pollers: 1, Max Pollers: 2
Notes
Package/debPackAArch64/setup.shprintscp: cannot stat ... RobotDemoQtandRobotDataRecorderbefore the finalbin/*copy. The final package still includes the files frombin/.- The package intentionally uses Ubuntu 20.04 system
libprotobuf.so.17. - The upstream ARM64
.debrequires newerglibc/libstdc++and should not be used on Ubuntu 20.04.