diff options
Diffstat (limited to 'code/projects/lcm_compile.md')
-rw-r--r-- | code/projects/lcm_compile.md | 141 |
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 | |||
5 | LCM(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 | ||
19 | sudo apt update | ||
20 | sudo apt upgrade | ||
21 | sudo apt install build-essential cmake libglib2.0-dev | ||
22 | sudo apt install openjdk-8-jdk # lcm仅支持jdk8 | ||
23 | ``` | ||
24 | |||
25 | # x86 的 lcm | ||
26 | |||
27 | 如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可: | ||
28 | |||
29 | ```bash | ||
30 | git clone https://github.com/lcm-proj/lcm | ||
31 | cd lcm | ||
32 | mkdir build && cd build | ||
33 | cmake .. | ||
34 | make | ||
35 | sudo 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 | |||
46 | lcm-spy 是 LCM 配套的数据可视化工具。 | ||
47 | 可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 | ||
48 | 如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。 | ||
49 | |||
50 | 启动 lcm-spy: | ||
51 | |||
52 | ```bash | ||
53 | export CLASSPATH=${your lcm-type class path} | ||
54 | lcm-spy | ||
55 | ``` | ||
56 | |||
57 | # 交叉编译 | ||
58 | |||
59 | 既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢? | ||
60 | |||
61 | 首先,我们可以设置一下 Native Development Kit(NDK)的路径: | ||
62 | |||
63 | ```bash | ||
64 | # 设置成自己的NDK工具目录 | ||
65 | export 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 | ||
85 | mkdir glib && cd glib | ||
86 | wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz | ||
87 | tar -xvf glib-2.79.2.tar.xz | ||
88 | mkdir 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] | ||
100 | c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang' | ||
101 | cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++' | ||
102 | ar = '$OHOS_ROOT/llvm/bin/llvm-ar' | ||
103 | strip = '$OHOS_ROOT/llvm/bin/llvm-strip' | ||
104 | ld = '$OHOS_ROOT/llvm/bin/llvm-link' | ||
105 | |||
106 | [properties] | ||
107 | skip_sanity_check = true | ||
108 | sys_root = '$OHOS_ROOT/sysroot' | ||
109 | c_args = ['-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos'] | ||
110 | |||
111 | [host_machine] | ||
112 | system = 'linux' | ||
113 | cpu_family = 'aarch64' | ||
114 | cpu = 'aarch64' | ||
115 | endian = 'little' | ||
116 | |||
117 | [target_machine] | ||
118 | system = 'ohos' | ||
119 | cpu_family = 'aarch64' | ||
120 | cpu = 'armv8a' | ||
121 | endian = 'little' | ||
122 | ``` | ||
123 | |||
124 | 将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令: | ||
125 | |||
126 | ```bash | ||
127 | meson --cross-file=../glib-2.79.2/meson_ohos.txt .. | ||
128 | ninja | ||
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 | 这次,编译成功了。万岁! | ||