summaryrefslogtreecommitdiffstats
path: root/code/projects/lcm_compile.md
diff options
context:
space:
mode:
Diffstat (limited to 'code/projects/lcm_compile.md')
-rw-r--r--code/projects/lcm_compile.md141
1 files changed, 141 insertions, 0 deletions
diff --git a/code/projects/lcm_compile.md b/code/projects/lcm_compile.md
new file mode 100644
index 0000000..8f34297
--- /dev/null
+++ b/code/projects/lcm_compile.md
@@ -0,0 +1,141 @@
1<!-- 编译集成lcm模块 -->
2
3# LCM 简介
4
5LCM(Lightweight Communications and Marshalling)是一种轻量级的通信和编组库,是一种针对高带宽、低延迟、实时性要求高的场景下的通讯工具,用于在多个进程之间传递消息。LCM 的设计目标是提供一种简单的方法来传递结构化数据,而不需要复杂的 API 或协议定义。LCM 的消息传递是基于发布/订阅模型的,发布者和订阅者之间通过一个中心化的消息传递系统进行通信。
6
7在机器人和自动驾驶系统中,LCM 可作为 ROS 的替代品,借以完成进程间、设备间的通讯。
8
9为了方便地在不同进程、不同设备间传递数据,我们在 OHOS 系统中集成了 LCM 模块。
10
11参考文档:
12
13- [LCM 官方文档](https://lcm-proj.github.io/)
14- [一篇博客](https://zhuanlan.zhihu.com/p/621943685)
15
16# 依赖项安装
17
18```bash
19sudo apt update
20sudo apt upgrade
21sudo apt install build-essential cmake libglib2.0-dev
22sudo apt install openjdk-8-jdk # lcm仅支持jdk8
23```
24
25# x86 的 lcm
26
27如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:
28
29```bash
30git clone https://github.com/lcm-proj/lcm
31cd lcm
32mkdir build && cd build
33cmake ..
34make
35sudo make install
36```
37
38编译完成后,注意观察<kbd>build</kbd>目录下是否有<kbd>lcm-java</kbd>文件夹,如果没有,证明没有安装 java 或者 java 版本不对。
39
40## lcm-python
41
42若想使用<kbd>lcm-python</kbd>,在<kbd>lcm/lcm-python</kbd>下执行`sudo python3 setup.py install`即可,使用时`import python`。
43
44## lcm-spy 的使用
45
46lcm-spy 是 LCM 配套的数据可视化工具。
47可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。
48如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。
49
50启动 lcm-spy:
51
52```bash
53export CLASSPATH=${your lcm-type class path}
54lcm-spy
55```
56
57# 交叉编译
58
59既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?
60
61首先,我们可以设置一下 Native Development Kit(NDK)的路径:
62
63```bash
64# 设置成自己的NDK工具目录
65export OHOS_ROOT=~/app/native
66```
67
68```bash
69$OHOS_ROOT/build-tools/cmake/bin/cmake \
70 -DOHOS_STL=c++_shared \
71 -DOHOS_ARCH=armv8-a \
72 -DOHOS_PLATFORM=OHOS \
73 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
74```
75
76不出意外的话,就要出意外了。果不其然,报错<kbd>Could NOT fid Glib2</kbd>。思考之后,我们认为,问题出现在 lcm 所依赖的 glib 库上:在 x86 架构上,我们直接向系统安装了`libglib2.0-dev`,而 lcm 编译时直接从系统里找到了这个库;但当交叉编译时,由于 OHOS 交叉编译工具未提供 libglib2.0-dev,lcm 找遍了系统也没找到 arm 架构下的这个库,因而直接报错。
77
78解决方案自然是自己手动交叉编译`libglib2.0-dev`。
79
80## Glib2.0 交叉编译
81
82从[官网](https://download.gnome.org/sources/glib/)下载 glib-2.79.2 源码,解压后进入源码目录。
83
84```bash
85mkdir glib && cd glib
86wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz
87tar -xvf glib-2.79.2.tar.xz
88mkdir build
89```
90
91这里需要注意的是:
92
93- 虽然 glib 编译需要`meson`,但它并不能直接交叉编译,OHOS 也并未提供用于交叉编译的`meson`。
94- `meson`要求保证源码目录与构建目录不能相同,以保证构建过程的干净,因此我们在源码目录外新建了一个`build`目录。
95
96接着,参考博客[这篇博客](https://t.csdnimg.cn/YfSJC),撰写如下<kbd>meson_ohos.txt</kbd>(友情提醒,使用该文件时把<kbd>native</kbd>也就是 NDK 的路径修改为自己的路径、源平台与目标平台按需修改):
97
98```meson
99[binaries]
100c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang'
101cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++'
102ar = '$OHOS_ROOT/llvm/bin/llvm-ar'
103strip = '$OHOS_ROOT/llvm/bin/llvm-strip'
104ld = '$OHOS_ROOT/llvm/bin/llvm-link'
105
106[properties]
107skip_sanity_check = true
108sys_root = '$OHOS_ROOT/sysroot'
109c_args = ['-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos']
110
111[host_machine]
112system = 'linux'
113cpu_family = 'aarch64'
114cpu = 'aarch64'
115endian = 'little'
116
117[target_machine]
118system = 'ohos'
119cpu_family = 'aarch64'
120cpu = 'armv8a'
121endian = 'little'
122```
123
124将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令:
125
126```bash
127meson --cross-file=../glib-2.79.2/meson_ohos.txt ..
128ninja
129```
130
131编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:
132
133```bash
134$OHOS_ROOT/build-tools/cmake/bin/cmake \
135 -DOHOS_STL=c++_shared \
136 -DOHOS_ARCH=armv8-a \
137 -DOHOS_PLATFORM=OHOS \
138 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
139```
140
141这次,编译成功了。万岁!