-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
181 lines (181 loc) · 81.4 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta name="description" content=""><meta name="keywords" content=""><meta name="author" content="Charon Cheung"><meta name="copyright" content="Charon Cheung"><title>If you wish for peace, prepare for war | 沉默杀手</title><link rel="shortcut icon" href="/melody-favicon.ico"><link rel="stylesheet" href="/css/index.css?version=1.6.1"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@latest/css/font-awesome.min.css?version=1.6.1"><link rel="dns-prefetch" href="https://cdn.staticfile.org"><link rel="dns-prefetch" href="https://cdn.bootcss.com"><link rel="dns-prefetch" href="https://creativecommons.org"><script>var GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
copy: {
success: 'Copy successfully',
error: 'Copy error',
noSupport: 'The browser does not support'
}
} </script><meta name="generator" content="Hexo 5.4.0"></head><body><canvas class="fireworks"></canvas><i class="fa fa-arrow-right" id="toggle-sidebar" aria-hidden="true"></i><div id="sidebar"><div class="author-info"><div class="author-info__avatar text-center"><img src="https://s2.loli.net/2022/02/17/HQaCXUBn64zsMIL.png"></div><div class="author-info__name text-center">Charon Cheung</div><div class="author-info__description text-center"></div><hr><div class="author-info-articles"><a class="author-info-articles__archives article-meta" href="/archives"><span class="pull-left">Articles</span><span class="pull-right">650</span></a><a class="author-info-articles__tags article-meta" href="/tags"><span class="pull-left">Tags</span><span class="pull-right">6</span></a><a class="author-info-articles__categories article-meta" href="/categories"><span class="pull-left">Categories</span><span class="pull-right">51</span></a></div></div></div><nav id="nav" style="background-image: url(https://s2.loli.net/2024/11/12/x1aqcwUG3XDiskN.jpg)"><div id="page-header"><span class="pull-left"> <a id="site-name" href="/">沉默杀手</a></span><i class="fa fa-bars toggle-menu pull-right" aria-hidden="true"></i><span class="pull-right menus"><a class="site-page" href="/">Home</a><a class="site-page" href="/archives">Archives</a><a class="site-page" href="/tags">Tags</a><a class="site-page" href="/categories">Categories</a></span></div><div id="site-info"><div id="site-title">沉默杀手</div><div id="site-sub-title">If you wish for peace, prepare for war</div></div></nav><div id="content-outer"><div class="layout" id="content-inner"><div class="recent-post-item article-container"><a class="article-title" href="/2024/11/07/ROS/ROS2/ROS2%E7%9A%84%E6%A6%82%E8%BF%B0%E5%92%8C%E5%AE%89%E8%A3%85/">ROS2的概述和安装</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-11-07</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/ROS/">ROS</a><i class="fa fa-angle-right" aria-hidden="true"></i><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/ROS/ROS2/">ROS2</a></span><div class="content"><p>ros2.0是一个跨平台的机器人开发框架,它在ros1.0的基础上进行了重构和改进,以适应更多的应用场景和需求。ros2.0的架构可以分为以下几个层次:</p>
<ul>
<li><p>OS层: ros2.0支持多种操作系统,包括Linux、Windows、macOS、RTOS等,也支持没有操作系统的裸机.。</p>
</li>
<li><p>中间层: ros2.0采用基于RTSP协议的DDS (Data-Distribution Service) 作为中间层,DDS是一种用于实时和嵌入式系统发布-订阅式通信的工业标准,它提供了点对点的通信模式,不需要像ros1.0那样借由master节点来完成两个节点间通信,这使得系统更加容错和灵活。</p>
</li>
<li><p>接口层: ros2.0提供了两个主要的接口层,分别是rmw (ros middleware interface) 和rd (ros dient libraries) 。rmw是相对底层的接口层,直接和DDS交互,C语言实现:rc是对mw相对高层的抽象,C/C++实现。此外,还有一个ros to dds组件,主要为用户直接访问DDS层提供接口。</p>
</li>
<li><p>应用层: ros2.0支持用C++或者Python来编写应用程序,也支持其他语言的绑定。应用程序可以通过r或者ros to dds来调用中间层的功能。</p>
</li>
</ul>
<p>如果项目需要实时性和分布通信支持,ROS 2.0提供了更好的解决方案</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>安装参考 <a target="_blank" rel="noopener" href="https://www.guyuehome.com/42960">安装ROS2的过程</a>,唯一不同地方是我没有遇到 2.3 中的报错。</p>
<p>截至目前有两个ROS 2的版本还没有到项目终止日期 (EOL end-of-life),一个是最新的发布版本为Iron Irwini,发布时间是2023年5月23日,EOL date是2024年11月,另一个是<strong>Humble Hawksbil</strong>,发布时间是2022年5月23日,EOL date是到2027年5月,比较后我选择了Humble这个版本来学习。</p>
<p><code>ament_cmake</code>是cmake的增强版</p>
<p>ROS2安装指定包,和ROS1一样,例如 <code>sudo apt-get install ros-humble-irobot-create-msgs</code></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/09/27/ubuntu%E9%85%8D%E7%BD%AECUDA/">ubuntu配置CUDA</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-09-27</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/cuda/">cuda</a></span><div class="content"><ul>
<li>Ensure there is enough space in /tmp and that the installation package is not corrupt</li>
</ul>
<p>刚开始安装<code>./cuda_12.1.1_530.30.02_linux.run</code>时, <code>/</code>所在的<code>/dev/sdb7</code>所剩空间越来越小,最终安装失败,提示 <code>Ensure there is enough space in /tmp and that the installation package is not corrupt</code>。 所以必须先扩展<code>/</code>所在的硬盘容量</p>
<p>按这个步骤安装,一般不会出问题: <a target="_blank" rel="noopener" href="https://blog.csdn.net/weixin_34910922/article/details/118046455">ubuntu18.04上cuda及cudnn安装</a></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/09/23/cmake%20qmake/%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91PCL/">交叉编译 PCL</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-09-23</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/cmake-qmake/">cmake/qmake</a></span><div class="content"><p>在x86架构的Ubuntu22.04交叉编译PCL源码,以能在ARM aarch64系统上运行,也就是全志MR527的TinaLinux 5.15.123 aarch64</p>
<p>先看完成的状态,也就是ARM平台的PCL库文件链接关系:</p>
<p><code>libpcl_kdtree.so</code><br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">ldd /usr/lib/aarch64-linux-gnu/libpcl_kdtree.so</span><br><span class="line"> linux-vdso.so.<span class="number">1</span> (<span class="number">0x0000ffff8d240000</span>)</span><br><span class="line"></span><br><span class="line"> libpcl_common.so.<span class="number">1.10</span> => <span class="regexp">/lib/aar</span>ch64-linux-gnu/libpcl_common.so.<span class="number">1.10</span> (<span class="number">0x0000ffff8cfb7000</span>)</span><br><span class="line"> liblz4.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/liblz4.so.<span class="number">1</span> (<span class="number">0x0000ffff8cf89000</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> libstdc++.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libstdc++.so.<span class="number">6</span> (<span class="number">0x0000ffff8cda4000</span>)</span><br><span class="line"> libgomp.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgomp.so.<span class="number">1</span> (<span class="number">0x0000ffff8cd56000</span>)</span><br><span class="line"> libgcc_s.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgcc_s.so.<span class="number">1</span> (<span class="number">0x0000ffff8cd32000</span>)</span><br><span class="line"> libc.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libc.so.<span class="number">6</span> (<span class="number">0x0000ffff8cbbf000</span>)</span><br><span class="line"> /lib/ld-linux-aarch64.so.<span class="number">1</span> (<span class="number">0x0000ffff8d210000</span>)</span><br><span class="line"> libm.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libm.so.<span class="number">6</span> (<span class="number">0x0000ffff8cb14000</span>)</span><br><span class="line"> libpthread.so.<span class="string">0 =></span> /lib/aarch64-linux-gnu/libpthread.so.<span class="number">0</span> (<span class="number">0x0000ffff8cae3000</span>)</span><br><span class="line"> libdl.so.<span class="string">2 =></span> /lib/aarch64-linux-gnu/libdl.so.<span class="number">2</span> (<span class="number">0x0000ffff8cacf000</span>)</span><br></pre></td></tr></table></figure></p>
<p><code>libpcl_common.so</code><br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">ldd /usr/lib/aarch64-linux-gnu/libpcl_common.so</span><br><span class="line"> linux-vdso.so.<span class="number">1</span> (<span class="number">0x0000ffff975e8000</span>)</span><br><span class="line"> libstdc++.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libstdc++.so.<span class="number">6</span> (<span class="number">0x0000ffff972d0000</span>)</span><br><span class="line"> libm.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libm.so.<span class="number">6</span> (<span class="number">0x0000ffff97225000</span>)</span><br><span class="line"> libgomp.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgomp.so.<span class="number">1</span> (<span class="number">0x0000ffff971d7000</span>)</span><br><span class="line"> libgcc_s.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgcc_s.so.<span class="number">1</span> (<span class="number">0x0000ffff971b3000</span>)</span><br><span class="line"> libpthread.so.<span class="string">0 =></span> /lib/aarch64-linux-gnu/libpthread.so.<span class="number">0</span> (<span class="number">0x0000ffff97182000</span>)</span><br><span class="line"> libc.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libc.so.<span class="number">6</span> (<span class="number">0x0000ffff9700f000</span>)</span><br><span class="line"> /lib/ld-linux-aarch64.so.<span class="number">1</span> (<span class="number">0x0000ffff975b8000</span>)</span><br><span class="line"> libdl.so.<span class="string">2 =></span> /lib/aarch64-linux-gnu/libdl.so.<span class="number">2</span> </span><br></pre></td></tr></table></figure></p>
<hr>
<h2 id="交叉编译-PCL"><a href="#交叉编译-PCL" class="headerlink" title="交叉编译 PCL"></a>交叉编译 PCL</h2><p>在终端找到<code>/opt/cmake/bin</code>,启动<code>cmake-gui</code>,这里是新安装的cmake 3.27. 选择PCL的源码目录和build目录,选择交叉编译平台。没有显示需求,所以<code>cmake-gui</code>不需要选择 OpenGL和VTK</p>
<h3 id="The-C-compiler-identification-is-unknown"><a href="#The-C-compiler-identification-is-unknown" class="headerlink" title="The C compiler identification is unknown"></a>The C compiler identification is unknown</h3><p>既然是交叉编译,那就得用跨平台的编译器,注意在启动<code>cmake-gui</code>的终端要提前设置环境变量:<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">export ARCH=arm64</span><br><span class="line">export TOOLCHAIN_PATH=<span class="regexp">/home/us</span>er/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu</span><br><span class="line">export LD_LIBRARY_PATH=<span class="regexp">/home/us</span>er/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH </span><br><span class="line">export CROSS_COMPILE=<span class="regexp">/home/us</span>er/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-</span><br><span class="line"></span><br></pre></td></tr></table></figure></p>
<h3 id="不重要的报警"><a href="#不重要的报警" class="headerlink" title="不重要的报警"></a>不重要的报警</h3><p>configure PCL时出现的部分信息,可以无视<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE) <span class="comment"># OMIT</span></span><br><span class="line">Could NOT find LIBUSB_1 (missing: LIBUSB_1_LIBRARY LIBUSB_1_INCLUDE_DIR) <span class="comment"># OMIT</span></span><br><span class="line">Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR) </span><br><span class="line">Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) </span><br></pre></td></tr></table></figure></p>
<p>编译的过程中,发现需要处理Boost, Flann, lz4, hdf5等库,它们也需要交叉编译。</p>
<h2 id="交叉编译Boost"><a href="#交叉编译Boost" class="headerlink" title="交叉编译Boost"></a>交叉编译Boost</h2><p>PCL需要Boost,cmake时会提示无法找到Boost的错误,不是本机的x86 Boost,是aarch64的Boost,也就是说需要交叉编译Boost。</p>
<p>下载Boost1.74源码,找到<code>bootstrap.sh</code>,然后执行<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./bootstrap.sh --with-libraries=<span class="keyword">system</span>,filesystem,thread,date_time,iostreams --with-toolset=gcc </span><br></pre></td></tr></table></figure></p>
<p>修改<code>project-config.jam</code>文件,把<code>using gcc</code>部分修改为<br><code>using gcc : arm : /home/user/toolschain/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc ;</code></p>
<p>找到<code>gcc.jam</code>文件,在430行左右,增加一行<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># On Windows, fPIC is the default, and specifying -fPIC explicitly leads</span></span><br><span class="line"><span class="comment"># to a warning.</span></span><br><span class="line"><span class="keyword">local</span> non-windows = [ set.difference $(all-os) : cygwin windows ] ;</span><br><span class="line">compile-<span class="keyword">link</span>-flags <<span class="keyword">link</span>>shared/<target-os>$(non-windows) : -fPIC ;</span><br><span class="line"><span class="comment"># 增加下面这行</span></span><br><span class="line">compile-<span class="keyword">link</span>-flags <<span class="keyword">link</span>>static/<target-os>$(non-windows) : -fPIC ;</span><br></pre></td></tr></table></figure><br>此步骤的主要目的是打开-fPIC,避免PCL在编译时找不到boost库的.a文件</p>
<p>进行编译并安装boost:<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo ./b2 cxxflags=-fPIC cflags=-fPIC -a install</span><br></pre></td></tr></table></figure></p>
<p>编译时可能会报错: <font size=4 color="orange"> error while loading shared libraries: libisl.so.22: cannot open shared object file: No such file </font></p>
<p>将交叉编译的<code>toolschain</code>地址的这几个库文件都复制到<code>/usr/lib/x86_64-linux-gnu</code>: <code>libctf-arm64.so.0</code>, <code>libopcodes-2.34-arm64.so</code>, <code>libbfd-2.34-arm64.so</code>, <code>libisl.so.22</code>。 如果没报错就不用了。</p>
<p>编译结束,我把生成的Boost库的文件都放到了<code>/usr/local/lib</code>。也就是<code>/usr/lib/x86_64-linux-gnu</code>中的<code>libboost</code>开头的库文件仍是x86的,<code>/usr/local/lib</code>中的<code>libboost</code>开头的库文件是<code>AArch64</code>架构。对于ARM的so库文件,在x86上用<code>ldd</code>命令查看会出现 <strong>not a dynamic executable</strong></p>
<p>修改PCL中的<code>pcl_find_boost.cmake</code>文件<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">set(Boost_DIR <span class="string">"/usr/lib/x86_64-linux-gnu/cmake"</span>)</span><br><span class="line"> <span class="comment"># Required boost modules</span></span><br><span class="line">set(BOOST_REQUIRED_MODULES filesystem date_time iostreams <span class="keyword">system</span>)</span><br><span class="line">find_package(Boost <span class="number">1.74</span>.<span class="number">0</span> REQUIRED COMPONENTS ${BOOST_REQUIRED_MODULES})</span><br></pre></td></tr></table></figure></p>
<h3 id="lz4-1-9-1-arm64版本的交叉编译"><a href="#lz4-1-9-1-arm64版本的交叉编译" class="headerlink" title="lz4 1.9.1 arm64版本的交叉编译"></a>lz4 1.9.1 arm64版本的交叉编译</h3><p>下载源码后执行<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">make CC=<span class="regexp">/home/us</span>er/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc</span><br><span class="line"><span class="keyword">mkdir</span> lz4_arm</span><br><span class="line">make install PREFIX=$(pwd)/lz4_arm</span><br></pre></td></tr></table></figure><br>运行<code>ldconfig</code>, 出现 <code>/sbin/ldconfig.real: /lib/x86_64-linux-gnu/liblz4.so.1 is not a symbolic link</code></p>
<p>运行<code>file /lib/liblz4.so</code>,出现<code>liblz4.so: broken symbolic link to liblz4.s</code></p>
<p>目前解决: 把地平线x3M的 <code>/lib/liblz4.so</code> 和 <code>/lib/liblz4.so.1</code> 复制到我的本机的 <code>/lib</code>目录, <code>/usr/lib/x86_64-linux-gnu</code>的几个 liblz4.so 仍然是 x86 平台。</p>
<h3 id="hdf5的问题"><a href="#hdf5的问题" class="headerlink" title="hdf5的问题"></a>hdf5的问题</h3><p>编译flann时,链接hdf5出错<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/home/user/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu/bin/../lib/gcc-cross/aarch64-linux-gnu/<span class="number">9</span>/../../../../aarch64-linux-gnu/bin/ld: <span class="regexp">/usr/li</span>b/x86_64-linux-gnu/hdf5/serial/libhdf5.so: error adding symbols: file in wrong <span class="keyword">format</span></span><br><span class="line"></span><br><span class="line">collect2: error: ld returned <span class="number">1</span> <span class="keyword">exit</span> status</span><br></pre></td></tr></table></figure><br>显然需要的是ARM的hdf5,这个库的交叉编译特别麻烦,最后解决方法是从一台ARM平台的主机上找到 <code>hdf5</code>文件夹,放到了 <code>/usr/lib/x86_64-linux-gnu</code></p>
<p>如果交叉编译hdf5,参考:</p>
<ol>
<li>使用cmake-gui进行configure和generate,第一次configure会失败,重新configure即可</li>
<li>进行make,两次,编译失败</li>
<li>拷贝bin/H5detect bin/H5make_libsettings libhdf5.settings到arm平台</li>
<li>在arm平台修改文件执行权限,执行H5detect和H5make_libsettings,把程序输出分别保存到H5Tinit.c和H5lib_settings.c</li>
<li>拷贝H5Tinit.c和H5lib_settings.c到主机的编译目录下,继续编译</li>
</ol>
<h3 id="交叉编译flann库"><a href="#交叉编译flann库" class="headerlink" title="交叉编译flann库"></a>交叉编译flann库</h3><p>在一台ARM平台的设备上,flann库文件是这样的<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">/usr/lib/aarch64-linux-gnu/libflann.so</span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann.so.<span class="number">1.9</span></span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann.so.<span class="number">1.9</span>.<span class="number">1</span></span><br><span class="line"></span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann_cpp.so</span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann_cpp.so.<span class="number">1.9</span></span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann_cpp.so.<span class="number">1.9</span>.<span class="number">1</span></span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann_cpp_s.a</span><br><span class="line">/usr/lib/aarch64-linux-gnu/libflann_s.a</span><br></pre></td></tr></table></figure><br>链接关系:<br>libflann.so<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">ldd /usr/lib/aarch64-linux-gnu/libflann.so</span><br><span class="line"> linux-vdso.so.<span class="number">1</span> (<span class="number">0x0000ffff85887000</span>)</span><br><span class="line"> libstdc++.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libstdc++.so.<span class="number">6</span> (<span class="number">0x0000ffff8511b000</span>)</span><br><span class="line"> libm.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libm.so.<span class="number">6</span> (<span class="number">0x0000ffff85070000</span>)</span><br><span class="line"> <span class="comment"># 缺</span></span><br><span class="line"> libgomp.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgomp.so.<span class="number">1</span> (<span class="number">0x0000ffff85022000</span>)</span><br><span class="line"></span><br><span class="line"> libgcc_s.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgcc_s.so.<span class="number">1</span> (<span class="number">0x0000ffff84ffe000</span>)</span><br><span class="line"> libc.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libc.so.<span class="number">6</span> (<span class="number">0x0000ffff84e8b000</span>)</span><br><span class="line"> /lib/ld-linux-aarch64.so.<span class="number">1</span> (<span class="number">0x0000ffff85857000</span>)</span><br><span class="line"> <span class="comment"># 目前缺这两个</span></span><br><span class="line"> libdl.so.<span class="string">2 =></span> /lib/aarch64-linux-gnu/libdl.so.<span class="number">2</span> (<span class="number">0x0000ffff84e77000</span>)</span><br><span class="line"> libpthread.so.<span class="string">0 =></span> /lib/aarch64-linux-gnu/libpthread.so.<span class="number">0</span> (<span class="number">0x0000ffff84e46000</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ldd /usr/lib/aarch64-linux-gnu/libflann_cpp.so</span><br><span class="line"> linux-vdso.so.<span class="number">1</span> (<span class="number">0x0000ffff9fb1f000</span>)</span><br><span class="line"> <span class="comment"># 目前需要交叉编译</span></span><br><span class="line"> liblz4.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/liblz4.so.<span class="number">1</span> (<span class="number">0x0000ffff9fa68000</span>)</span><br><span class="line"> libstdc++.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libstdc++.so.<span class="number">6</span> (<span class="number">0x0000ffff9f883000</span>)</span><br><span class="line"> <span class="comment"># 目前缺</span></span><br><span class="line"> libpthread.so.<span class="string">0 =></span> /lib/aarch64-linux-gnu/libpthread.so.<span class="number">0</span> (<span class="number">0x0000ffff9f852000</span>)</span><br><span class="line"> libc.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libc.so.<span class="number">6</span> (<span class="number">0x0000ffff9f6df000</span>)</span><br><span class="line"> /lib/ld-linux-aarch64.so.<span class="number">1</span> (<span class="number">0x0000ffff9faef000</span>)</span><br><span class="line"> libm.so.<span class="string">6 =></span> /lib/aarch64-linux-gnu/libm.so.<span class="number">6</span> (<span class="number">0x0000ffff9f634000</span>)</span><br><span class="line"> libgcc_s.so.<span class="string">1 =></span> /lib/aarch64-linux-gnu/libgcc_s.so.<span class="number">1</span> </span><br></pre></td></tr></table></figure></p>
<p>如果之前缺hdf5,编译会报警 hdf5 library not found, not compiling flann_example.cpp</p>
<p>解决方法: 把ARM平台的的flann库文件复制到了 <code>/usr/lib/x86_64-linux-gnu</code>,原来的x86的flann库文件复制到了新文件夹 <code>/usr/lib/x86_64-linux-gnu/x86_flann</code></p>
<p>如果要交叉编译,需要修改<code>CMakeLists</code>:<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">pkg_check_modules(LZ4 REQUIRED liblz4)</span><br><span class="line"><span class="comment">#include_directories(${LZ4_INCLUDE_DIRS})</span></span><br><span class="line">include_directories(<span class="regexp">/home/us</span>er/Downloads/lz4-<span class="number">1.9</span>.<span class="number">1</span>/lz4_arm/include)</span><br><span class="line"></span><br><span class="line">link_directories(<span class="regexp">/home/us</span>er/Downloads/lz4-<span class="number">1.9</span>.<span class="number">1</span>/lz4_arm/lib)</span><br></pre></td></tr></table></figure></p>
<hr>
<p>现在继续使用<code>cmake-gui</code>交叉编译PCL,在界面中没有选择所有模块,执行<code>Configure</code>和<code>Generate</code>后,会有日志:<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">编译的模块:</span><br><span class="line"> common kdtree octree search</span><br><span class="line"> sample_consensus filters 2d</span><br><span class="line"> geometry io features ml</span><br><span class="line"> segmentation surface keypoints</span><br><span class="line"> tracking stereo tools</span><br><span class="line"></span><br><span class="line">不会编译的模块:</span><br><span class="line"> visualization: VTK was not found.</span><br><span class="line"> registration: Disabled manually.</span><br><span class="line"> recognition: Requires registration.</span><br><span class="line"> apps: Disabled: registration missing.</span><br><span class="line"> outofcore: Requires visualization.</span><br><span class="line"> examples: Code examples are disabled by default.</span><br><span class="line"> people: Requires visualization.</span><br><span class="line"> simulation: Disabled: visualization missing.</span><br><span class="line"> global_tests: No reason</span><br><span class="line"> tools: Disabled: registration missing.</span><br></pre></td></tr></table></figure></p>
<p>然后去build文件夹找每个模块的Makefile,比如<code>pcl-pcl-1.10.0/build/kdtree</code>,然后执行<code>make</code>即可。</p>
<p>PCL交叉编译得到的so文件特别大,有的到了800M。使用strip瘦身,结果报错 <font size=4 color="orange"> strip: Unable to recognise the format of the input file </font>,因为so文件是aarch64的,应当使用<code>gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/aarch64-linux-gnu/bin/strip</code>,结果让<code>libpcl_features.so.1.10.0</code>从797M 下降到 39M。</p>
<p>所有编译生成的库文件在<code>pcl-pcl-1.10.0/build/lib</code>,把这些库文件放到开发板上,比如路径<code>/pcl_libs</code>,所有Boost的库文件也放过去,比如<code>/boost_libs</code>。</p>
<p><br></p>
<h2 id="测试程序"><a href="#测试程序" class="headerlink" title="测试程序"></a>测试程序</h2><p>在本机上写一个PCL的测试程序,CMake部分:<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">cmake_minimum_required(VERSION <span class="number">3.5</span>)</span><br><span class="line"></span><br><span class="line">project(test_cross_pcl LANGUAGES CXX)</span><br><span class="line"></span><br><span class="line">set(CMAKE_CXX_STANDARD <span class="number">14</span>)</span><br><span class="line">set(CMAKE_CXX_STANDARD_REQUIRED ON)</span><br><span class="line"></span><br><span class="line">find_package(Boost COMPONENTS <span class="keyword">system</span> filesystem thread REQUIRED)</span><br><span class="line"></span><br><span class="line">include_directories(</span><br><span class="line"> include</span><br><span class="line"> /usr/include/eigen3</span><br><span class="line"></span><br><span class="line"> /home/user/Downloads/pcl-pcl-<span class="number">1.10</span>.<span class="number">0</span>/common/include</span><br><span class="line"> /home/user/Downloads/pcl-pcl-<span class="number">1.10</span>.<span class="number">0</span>/build/include</span><br><span class="line"> /home/user/Downloads/pcl-pcl-<span class="number">1.10</span>.<span class="number">0</span>/io/include</span><br><span class="line"> /home/user/Downloads/pcl-pcl-<span class="number">1.10</span>.<span class="number">0</span>/filters/include</span><br><span class="line">)</span><br><span class="line">LINK_DIRECTORIES(<span class="regexp">/home/us</span>er/Downloads/pcl-pcl-<span class="number">1.10</span>.<span class="number">0</span>/build/lib)</span><br><span class="line">LINK_DIRECTORIES(<span class="regexp">/home/us</span>er/toolschain/gcc-ubuntu-<span class="number">9.3</span>.<span class="number">0</span>-<span class="number">2020.03</span>-x86_64-aarch64-linux-gnu/aarch64-linux-gnu/lib)</span><br><span class="line"></span><br><span class="line">add_executable(test_cross_pcl main.cpp)</span><br><span class="line">target_link_libraries(test_cross_pcl</span><br><span class="line"> -lpcl_common</span><br><span class="line"> -lpcl_io</span><br><span class="line"> -lpcl_filters</span><br><span class="line"> -lpthread</span><br><span class="line">)</span><br></pre></td></tr></table></figure><br>不能使用本机上的编译器,还用<code>cmake-gui</code>进行交叉编译: configure, generate, 然后到对应的build文件夹里执行<code>make</code>,把生成的可执行文件放到开发板。</p>
<p>执行<code>export LD_LIBRARY_PATH=/pcl_libs:/boost_libs:$LD_LIBRARY_PATH</code>,也就是指定链接库的地址,再执行就成功了。</p>
<p>参考:<a target="_blank" rel="noopener" href="https://www.cnblogs.com/kezunlin/p/11836252.html">Windows 10上源码编译PCL 1.8.1支持VTK和QT,可视化三维点云</a><br><a target="_blank" rel="noopener" href="https://blog.csdn.net/qq_29414731/article/details/133487825?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-133487825-blog-88745954.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.3&utm_relevant_index=5">交叉编译Boost</a></p>
<p><a target="_blank" rel="noopener" href="https://www.cnblogs.com/oloroso/p/14606052.html">解决vcpkg无法交叉编译arm64版本 HDF5 库的问题</a><br><a target="_blank" rel="noopener" href="https://www.cnblogs.com/xiaomaixiaomai/p/16179343.html">编译HDF5</a><br><a target="_blank" rel="noopener" href="https://blog.csdn.net/luoying_1993/article/details/53228473?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-53228473-blog-134309819.235^v43^pc_blog_bottom_relevance_base7&spm=1001.2101.3001.4242.2&utm_relevant_index=2">Linux安装HDF5及遇到的问题总结</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/Wang_xm_wss/article/details/128809568">FLANN 1.9.2 源码编译</a><br><a target="_blank" rel="noopener" href="https://blog.csdn.net/CC977/article/details/130719649">PCL与VTK</a></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/06/13/C++/C++%20%20%E5%9F%BA%E7%A1%80/%E5%88%A4%E6%96%AD%E6%96%87%E4%BB%B6%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8/">判断文件是否存在</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-06-13</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/C/">C++</a><i class="fa fa-angle-right" aria-hidden="true"></i><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/C/C-%E5%9F%BA%E7%A1%80/">C++ 基础</a></span><div class="content"><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><fstream></span></span></span><br><span class="line"></span><br><span class="line"><span class="function">std::ifstream <span class="title">fin</span><span class="params">(file_name)</span></span>;</span><br><span class="line"><span class="keyword">if</span> (!fin) {</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"file not exist"</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">fin.<span class="built_in">close</span>();</span><br></pre></td></tr></table></figure>
<hr>
<p>C++17中有<code>std::filesystem::path</code>,相当于Boost的<code>filesystem</code>模块,只需要<code>set(CMAKE_CXX_STANDARD 17)</code><br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><filesystem></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="keyword">namespace</span> fs = std::filesystem;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> std::<span class="function">filesystem::path <span class="title">test_path</span><span class="params">(<span class="string">"/home/user/test.yaml"</span>)</span></span>;</span><br><span class="line"> <span class="comment">//判断路径是否存在</span></span><br><span class="line"> std::cout << <span class="string">"is_exist = "</span> << std::filesystem::<span class="built_in">exists</span>(test_path) << std::endl;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断路径为绝对路径还是相对路径</span></span><br><span class="line"> std::cout << <span class="string">"is_abs = "</span> << test_path.<span class="built_in">is_absolute</span>() << std::endl;</span><br><span class="line"> std::cout << <span class="string">"is_relative = "</span> << test_path.<span class="built_in">is_relative</span>() << std::endl;</span><br><span class="line"> <span class="comment">// 取得不带扩展名的文件名</span></span><br><span class="line"> std::cout << <span class="string">"stem = "</span> << test_path.<span class="built_in">stem</span>() << std::endl;</span><br><span class="line"> <span class="comment">// 取得扩展名,如果没有,则为空</span></span><br><span class="line"> std::cout << <span class="string">"extension = "</span> << test_path.<span class="built_in">extension</span>() << std::endl;</span><br><span class="line"> <span class="comment">// 取得文件名</span></span><br><span class="line"> std::cout << <span class="string">"filename = "</span> << test_path.<span class="built_in">filename</span>() << std::endl;</span><br><span class="line"></span><br><span class="line"> std::cout << <span class="string">"----------------------------------------"</span> << std::endl;</span><br><span class="line"></span><br><span class="line"> std::<span class="function">filesystem::path <span class="title">test_dir</span><span class="params">(<span class="string">"/home/user/Pictures"</span>)</span></span>;</span><br><span class="line"> <span class="comment">//判断是文件还是文件夹</span></span><br><span class="line"> std::cout << <span class="string">"is_file = "</span> << std::filesystem::<span class="built_in">is_regular_file</span>(test_path) << std::endl;</span><br><span class="line"> std::cout << <span class="string">"is_dir = "</span> << std::filesystem::<span class="built_in">is_directory</span>(test_dir) << std::endl;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//关于路径拼接</span></span><br><span class="line"> std::filesystem::path new_path = test_dir / <span class="string">"test.txt"</span>;</span><br><span class="line"> std::cout << <span class="string">"new_path = "</span> << new_path << std::endl;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//取得当前绝对工作路径 编译后可执行文件的路径文件夹</span></span><br><span class="line"> std::filesystem::path workPath = std::filesystem::<span class="built_in">current_path</span>();</span><br><span class="line"> std::cout << <span class="string">"current exe path = "</span> << workPath << std::endl;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//递归遍历指定路径下所有文件,文件夹名字也会返回</span></span><br><span class="line"> std::<span class="function">filesystem::recursive_directory_iterator <span class="title">iterDir</span><span class="params">(test_dir)</span></span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">auto</span> &it: iterDir)</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//打印绝对路径</span></span><br><span class="line"> std::cout << it << std::endl;</span><br><span class="line"> <span class="comment">// 不打印路径而是打印文件名</span></span><br><span class="line"> std::cout << it.<span class="built_in">path</span>().<span class="built_in">filename</span>() << std::endl;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//给一个相对路径,返回绝对路径</span></span><br><span class="line"> std::<span class="function">filesystem::path <span class="title">path_test</span><span class="params">(<span class="string">"./"</span>)</span></span>;</span><br><span class="line"> std::cout << <span class="string">"abs_path = "</span> << std::filesystem::<span class="built_in">absolute</span>(path_test) << std::endl;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 删除文件, 路径不存在不报错</span></span><br><span class="line"><span class="comment">// std::filesystem::remove(test_dir / "deepfakes"/"yolov7.pdf");</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 拷贝文件夹, 删除文件夹</span></span><br><span class="line"><span class="comment">// std::filesystem::copy(test_dir, test_dir.parent_path() / "works", std::filesystem::copy_options::recursive);</span></span><br><span class="line"><span class="comment">// std::filesystem::remove_all(test_dir.parent_path() / "works");</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/06/03/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/yaml-cpp%E7%9A%84%E4%BD%BF%E7%94%A8/">yaml-cpp的使用</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-06-03</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/">第三方库</a></span><div class="content"><p>使用<code>yaml-cpp</code>读文件<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">YAML::Node gps_root;</span><br><span class="line"><span class="keyword">try</span> {</span><br><span class="line"> gps_root = YAML::<span class="built_in">LoadFile</span>(<span class="string">"/home/user/111.yaml"</span>);</span><br><span class="line">} <span class="built_in"><span class="keyword">catch</span></span> (YAML::ParserException &ex) {</span><br><span class="line"> std::cerr << <span class="string">"gps.yaml parse failed: "</span> << ex.<span class="built_in">what</span>() << std::endl;</span><br><span class="line"> <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">} <span class="built_in"><span class="keyword">catch</span></span> (YAML::BadFile &ex) {</span><br><span class="line"> std::cerr << <span class="string">"gps.yaml load failed: "</span> << ex.<span class="built_in">what</span>() << std::endl;</span><br><span class="line"> <span class="built_in">exit</span>(<span class="number">-1</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>所用函数的源码:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">Node <span class="title">LoadFile</span><span class="params">(<span class="keyword">const</span> std::string& filename)</span> </span>{</span><br><span class="line"> <span class="function">std::ifstream <span class="title">fin</span><span class="params">(filename.c_str())</span></span>;</span><br><span class="line"> <span class="keyword">if</span> (!fin) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="built_in">BadFile</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Load</span>(fin);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">Node <span class="title">Load</span><span class="params">(std::istream& input)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="function">Parser <span class="title">parser</span><span class="params">(input)</span></span>;</span><br><span class="line"> NodeBuilder builder;</span><br><span class="line"> <span class="keyword">if</span> (!parser.<span class="built_in">HandleNextDocument</span>(builder)) {</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">Node</span>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> builder.<span class="built_in">Root</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>如果读文件失败,会抛出异常,不会运行到<code>Load</code>,所以无法用<code>IsDefined</code>函数判断是否读文件成功。</p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/05/28/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/ZeroMQ%E7%9A%84%E5%AD%A6%E4%B9%A0/">ZeroMQ的学习</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-05-28</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/">第三方库</a></span><div class="content"><p>使用<code>zmqpp-4.2.0</code>,但是用函数<code>zmq_version</code>发现版本是 4.3.4</p>
<h2 id="ZeroMQ在CMake的设置"><a href="#ZeroMQ在CMake的设置" class="headerlink" title="ZeroMQ在CMake的设置"></a>ZeroMQ在CMake的设置</h2><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">cmake_minimum_required(VERSION <span class="number">3.5</span>)</span><br><span class="line"></span><br><span class="line">project(untitled LANGUAGES CXX)</span><br><span class="line"></span><br><span class="line">set(CMAKE_CXX_STANDARD <span class="number">11</span>)</span><br><span class="line">set(CMAKE_CXX_STANDARD_REQUIRED ON)</span><br><span class="line"></span><br><span class="line">include_directories(zmqpp-<span class="number">4.2</span>.<span class="number">0</span>/src/zmqpp)</span><br><span class="line">LINK_DIRECTORIES(zmqpp-<span class="number">4.2</span>.<span class="number">0</span>/lib/)</span><br><span class="line"></span><br><span class="line">add_executable(untitled main.cpp)</span><br><span class="line">target_link_libraries(untitled zmq)</span><br></pre></td></tr></table></figure>
<h2 id="查看版本"><a href="#查看版本" class="headerlink" title="查看版本"></a>查看版本</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><zmq.h></span></span></span><br><span class="line"><span class="comment">// 显示当前的zeromq版本</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> major, minor, patch;</span><br><span class="line"> <span class="built_in">zmq_version</span>(&major, &minor, &patch);</span><br><span class="line"> <span class="built_in">printf</span>(<span class="string">"Current ZeroMQ version is %d.%d.%d\n"</span>, major, minor, patch);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="发布和订阅"><a href="#发布和订阅" class="headerlink" title="发布和订阅"></a>发布和订阅</h2><p>pub端:</p>
<ul>
<li>创建context</li>
<li>创建socket,设置<code>ZMQ_PUB</code>模式</li>
<li>bind端口</li>
<li>循环发布消息send</li>
</ul>
<p>sub端:</p>
<ul>
<li>创建context</li>
<li>创建socket,设置<code>ZMQ_SUB</code>模式</li>
<li>connect到pub端</li>
<li><code>setsockopt</code>设置<code>ZMQ_SUBSCRIBE</code>订阅的消息</li>
<li>循环接收recv</li>
</ul>
<p>注意事项:</p>
<ol>
<li>我们在pub中<code>bind</code>,在sub中<code>connect</code>,在zmq的使用中无论是在pub还是sub中都可以bind,但是一般我们在pub中bind,在sub中<code>connect</code>。反之sub端可能收不到消息</li>
<li><code>zmq_setsockopt</code> – 设置zmq的socket属性,sub端必须使用此方法,否则是收不到消息的。</li>
<li>pub端不能使用recv函数,sub端不能使用send函数</li>
<li>pub端socket的zmq_send()函数永远不会阻塞</li>
</ol>
<h3 id="zmq-msg-init-size"><a href="#zmq-msg-init-size" class="headerlink" title="zmq_msg_init_size"></a>zmq_msg_init_size</h3><p>使用一个指定的空间大小初始化ZMQ消息对象。原型<code>int zmq_msg_init_size (zmq_msg_t *msg, size_t size);</code></p>
<p>分配任何被请求的资源来存储一个size大小字节的消息,并且初始化msg参数指定的消息,用来表示新分配到的消息。</p>
<p>在函数执行的时候,会选择是否把消息存储在栈里面(小消息),还是堆里面(大消息)。考虑到性能原因,函数不会清除消息数据。</p>
<p>永远不要直接对<code>zmq_msg_t</code>对象进行直接操作,而是要使用<code>zmq_msg</code>函数族进行操作。</p>
<p><code>zmq_msg_init()</code>, <code>zmq_msg_init_data()</code>和<code>zmq_msg_init_size()</code>这三个函数是互斥的。永远不要把一个<code>zmq_msg_t</code>对象初始化两次。</p>
<p>执行成功时返回0。否则返回 -1,并且设置errno的值为下列定义的值。</p>
<h3 id="zmq-msg-data"><a href="#zmq-msg-data" class="headerlink" title="zmq_msg_data"></a>zmq_msg_data</h3><p>原型<code>void *zmq_msg_data (zmq_msg_t *msg);</code> 返回msg参数指定的消息内容的指针。</p>
<p>函数执行成功返回0,否则返回 -1</p>
<p>参考:<br><a target="_blank" rel="noopener" href="https://blog.csdn.net/guotianqing/article/details/101429319?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-101429319-blog-127110153.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-101429319-blog-127110153.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=2">zmq pub/sub使用详解</a></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/05/28/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/proto%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/">proto基本使用</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-05-28</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/%E7%AC%AC%E4%B8%89%E6%96%B9%E5%BA%93/">第三方库</a></span><div class="content"><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>安装Protobuf需要两个zip文件,以 3.0.0 为例,到<a target="_blank" rel="noopener" href="https://github.com/protocolbuffers/protobuf/releases/tag/v3.0.0">github下载页面</a>下载 <code>protoc-3.0.0-linux-x86_64.zip</code> 和 <code>protobuf-cpp-3.0.0.zip</code></p>
<p>安装前者:<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Unzip</span></span><br><span class="line">unzip protoc-<span class="number">3.2</span>.<span class="number">0</span>-linux-x86_64.zip -d protoc3</span><br><span class="line"></span><br><span class="line">sudo mv protoc3/bin/* <span class="regexp">/usr/l</span>ocal/bin/</span><br><span class="line"></span><br><span class="line">sudo mv protoc3/include/* <span class="regexp">/usr/l</span>ocal/include/</span><br><span class="line"></span><br><span class="line"><span class="comment"># change owner,也可不执行</span></span><br><span class="line">sudo chwon [user] /usr/<span class="keyword">local</span>/bin/protoc</span><br><span class="line">sudo chwon -R [user] /usr/<span class="keyword">local</span>/include/google</span><br></pre></td></tr></table></figure></p>
<p>再安装后者<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压后执行</span></span><br><span class="line">./autogen.sh</span><br><span class="line"></span><br><span class="line">./configure <span class="comment"># 或者 ./configure --prefix=/usr</span></span><br><span class="line"></span><br><span class="line">make</span><br><span class="line">sudo make install</span><br><span class="line">sudo ldconfig</span><br><span class="line"></span><br><span class="line">protoc --version</span><br><span class="line"><span class="comment"># 输出:libprotoc 3.0.0</span></span><br><span class="line"></span><br><span class="line">locate libprotobuf.so</span><br></pre></td></tr></table></figure></p>
<p><br></p>
<p>所用protobuf的版本是 3.12.4</p>
<p><code>Test.proto</code>文件:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">syntax = <span class="string">"proto3"</span>;</span><br><span class="line"><span class="comment">// 包名:在生成对应的C++文件时,将被替换为名称空间,在代码中会有体现</span></span><br><span class="line">package Test; </span><br><span class="line"></span><br><span class="line">message Pose {</span><br><span class="line"> <span class="keyword">float</span> x = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">float</span> y = <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">float</span> yaw = <span class="number">3</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>根据proto文件生成.h 和 .cc文件<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./protoc --proto_path=<span class="regexp">/home/us</span>er/qt_projects --cpp_out=<span class="regexp">/home/us</span>er/qt_projects/proto_gen /home/user/qt_projects/Test.proto</span><br></pre></td></tr></table></figure><br>简略形式: <code>protoc message.proto --cpp_out=.</code></p>
<p><br></p>
<p>CMake中的配置<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">cmake_minimum_required(VERSION <span class="number">3.5</span>)</span><br><span class="line"></span><br><span class="line">project(test_proto LANGUAGES CXX)</span><br><span class="line"></span><br><span class="line">set(CMAKE_CXX_STANDARD <span class="number">11</span>)</span><br><span class="line">set(CMAKE_CXX_STANDARD_REQUIRED ON)</span><br><span class="line"></span><br><span class="line">include_directories(<span class="regexp">/home/us</span>er/zmqpp-<span class="number">4.2</span>.<span class="number">0</span>/src/zmqpp)</span><br><span class="line">include_directories(<span class="regexp">/home/us</span>er/protobuf/src)</span><br><span class="line"></span><br><span class="line">LINK_DIRECTORIES(<span class="regexp">/home/us</span>er/x86/zmqpp-<span class="number">4.2</span>.<span class="number">0</span>/lib/)</span><br><span class="line">LINK_DIRECTORIES(<span class="regexp">/home/us</span>er/x86/protobuf/lib)</span><br><span class="line"><span class="comment"># 上面生成的cc文件</span></span><br><span class="line">add_executable(test_proto main.cpp Test.pb.cc)</span><br><span class="line">target_link_libraries(test_proto zmq protobuf)</span><br></pre></td></tr></table></figure></p>
<p>注意 <code>#include "Test.pb.h"</code></p>
<p>可以这样使用<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Test::Pose* pose_msg = <span class="keyword">new</span> Test::<span class="built_in">Pose</span>();</span><br><span class="line">pose_msg-><span class="built_in">set_x</span>(<span class="number">1.5</span>);</span><br><span class="line">pose_msg-><span class="built_in">set_y</span>(<span class="number">2.7</span>);</span><br><span class="line">pose_msg-><span class="built_in">set_yaw</span>(<span class="number">0</span>);</span><br></pre></td></tr></table></figure></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/05/28/cmake%20qmake/ccache%E5%8A%A0%E9%80%9F%E7%BC%96%E8%AF%91/">ccache加速编译</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-05-28</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/cmake-qmake/">cmake/qmake</a></span><div class="content"><h2 id="ccache"><a href="#ccache" class="headerlink" title="ccache"></a>ccache</h2><p>先使用<code>apt-get install ccache</code>进行安装。</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/environment</span><br><span class="line">PATH=<span class="string">'/usr/lib/ccache:keep the rest'</span></span><br><span class="line"></span><br><span class="line">source /etc/environment</span><br></pre></td></tr></table></figure>
<p>输入<code>which gcc</code>,应该得到<code>/usr/lib/ccache/gcc</code></p>
<p>修改<code>CMakeLists.txt</code><br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">set(CMAKE_CXX_COMPILER_LAUNCHER ccache)</span><br><span class="line">set(CMAKE_C_COMPILER_LAUNCHER ccache)</span><br></pre></td></tr></table></figure></p>
<p><strong>但是在ROS环境下,没发现起作用</strong></p>
<h2 id="distcc"><a href="#distcc" class="headerlink" title="distcc"></a>distcc</h2><p>Setting up distcc (server)</p>
<p>So, go ahead and install distcc on the server computer (in my case, the desktop)</p>
<p>And then spin up the server. (The following assumes I’m on the 10.8.33.0 subnet, and I’m allowing all hosts on that subnet to send jobs)<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo distccd --<span class="keyword">log</span>-file=<span class="regexp">/tmp/dis</span>tccd.log --daemon -a <span class="number">10.8</span>.<span class="number">33.0</span>/<span class="number">24</span></span><br></pre></td></tr></table></figure><br>Setting up distcc (client) So, now you have to tell ccache to use the distcc distributed compilation servers. To do this, just add the following line to your ~/.bashrc file.<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export CCACHE_PREFIX=distcc</span><br></pre></td></tr></table></figure><br>Next, we have to tell distcc where to go to find the server. This also, just add to the bottom of your <code>~/.bashrc</code> (my desktop is at 10.8.33.182 and it has 8 cores, my laptop is at localhost and has 4)<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export DISTCC_HOSTS=<span class="string">'localhost/4 10.8.33.182/8'</span></span><br></pre></td></tr></table></figure></p>
<p><br></p>
<p>在另一个终端,使用下面命令检验ccache的运行效果<br><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">watch -n1 <span class="string">'ccache -s -v'</span></span><br></pre></td></tr></table></figure><br>或者<code>watch -n1 'ccache --show-stats -v'</code></p>
<p>编译时,使用top看 distcc process starts spooling up its threads.</p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/05/27/%E9%82%A3%E4%BA%9B%E5%8D%A1%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84bug/Linux%E7%A8%8B%E5%BA%8F%E8%BF%90%E8%A1%8C%E6%97%B6%E8%A2%ABkilled/">Linux程序运行时被killed</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-05-27</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/%E9%82%A3%E4%BA%9B%E5%8D%A1%E6%88%91%E5%BE%88%E4%B9%85%E7%9A%84bug/">那些卡我很久的bug</a></span><div class="content"><p>linux程序运行时突然出现<code>Killed</code>,可以使用<code>dmesg | egrep -i -B100 'killed process</code> 查看原因,输出最近killed的信息。</p>
<p>参考: <a target="_blank" rel="noopener" href="https://juejin.cn/post/7094882813907828773">linux 程序被Killed,查看原因</a></p>
</div><hr></div><div class="recent-post-item article-container"><a class="article-title" href="/2024/05/26/C++/C++%20%20%E5%9F%BA%E7%A1%80/%E6%9C%89%E7%94%A8%E7%9A%84%E7%A8%8B%E5%BA%8F%201/">有用的程序 1</a><time class="post-meta__date"><i class="fa fa-calendar" aria-hidden="true"></i> 2024-05-26</time><span class="article-meta"><span class="article-meta__separator">|</span><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/C/">C++</a><i class="fa fa-angle-right" aria-hidden="true"></i><i class="fa fa-inbox article-meta__icon" aria-hidden="true"></i><a class="article-meta__categories" href="/categories/C/C-%E5%9F%BA%E7%A1%80/">C++ 基础</a></span><div class="content"><ul>
<li>不断判断随机数的大小,如果它能大于某个值维持一段时间,输出时间,否则重新计时。</li>
</ul>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">int</span> num = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> count = <span class="number">0</span>;</span><br><span class="line"> std::chrono::steady_clock::time_point start, end;</span><br><span class="line"> <span class="keyword">double</span> duration;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span>(<span class="number">1</span>)</span><br><span class="line"> {</span><br><span class="line"> std::<span class="built_in">srand</span>(<span class="built_in">time</span>(<span class="number">0</span>));</span><br><span class="line"> count = <span class="built_in">rand</span>() % <span class="number">1000000</span>;</span><br><span class="line"> <span class="keyword">if</span>(count > <span class="number">680000</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(num==<span class="number">0</span>)</span><br><span class="line"> start = std::chrono::steady_clock::<span class="built_in">now</span>();</span><br><span class="line"></span><br><span class="line"> num++;</span><br><span class="line"> end = std::chrono::steady_clock::<span class="built_in">now</span>();</span><br><span class="line"> duration = std::chrono::duration<<span class="keyword">double</span>>(end - start).<span class="built_in">count</span>();</span><br><span class="line"> cout << <span class="string">"count: "</span> << count << endl;</span><br><span class="line"> cout << <span class="string">"time elapsed "</span> << <span class="keyword">static_cast</span><<span class="keyword">int</span>>(duration) << endl;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> duration = <span class="number">0</span>;</span><br><span class="line"> num = <span class="number">0</span>;</span><br><span class="line"> cout << endl;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>判断一个点是否在多边形中</li>
</ul>
<p>opencv函数: <code>double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist)</code></p>
<p>当<code>measureDist</code>设置为true时,返回实际距离值。若返回值为正,表示点在多边形内部,返回值为负,表示在多边形外部,返回值为0,表示在多边形上。<br>当measureDist设置为false时,返回 -1、0、1三个固定值。若返回值为+1,表示点在多边形内部,返回值为-1,表示在多边形外部,返回值为0,表示在多边形上。</p>
<ul>
<li>计算点到直线的距离</li>
</ul>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @tparam T point type</span></span><br><span class="line"><span class="comment"> * @param first Given the starting point of a line segment</span></span><br><span class="line"><span class="comment"> * @param last The endpoint of a given line segment</span></span><br><span class="line"><span class="comment"> * @param third Given point</span></span><br><span class="line"><span class="comment"> * @return T Distance from point to line</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">template</span> <<span class="keyword">typename</span> T></span><br><span class="line"><span class="function"><span class="keyword">static</span> T <span class="title">PointToLineDistance</span><span class="params">(<span class="keyword">const</span> Point<T>& first, <span class="keyword">const</span> Point<T>& last, <span class="keyword">const</span> Point<T>& third)</span> </span>{</span><br><span class="line"> <span class="keyword">float</span> dis_suqare =</span><br><span class="line"> ((first.y - last.y) * third.x + (last.x - first.x) * third.y +</span><br><span class="line"> (first.x * last.y - last.x * first.y)) *</span><br><span class="line"> ((first.y - last.y) * third.x + (last.x - first.x) * third.y +</span><br><span class="line"> (first.x * last.y - last.x * first.y)) /</span><br><span class="line"> ((last.x - first.x) * (last.x - first.x) + (last.y - first.y) * (last.y - first.y));</span><br><span class="line"> <span class="keyword">return</span> std::<span class="built_in">sqrt</span>(dis_suqare);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>求图形的外接圆</li>
</ul>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/dcrmg/article/details/52260699">OpenCV绘制最小外接矩形、最小外接圆</a><br><a target="_blank" rel="noopener" href="https://blog.csdn.net/Galen_xia/article/details/123407743">pointPolygonTest函数</a></p>
</div><hr></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">…</span><a class="page-number" href="/page/65/">65</a><a class="extend next" rel="next" href="/page/2/">Next >></a></div></nav></div></div><footer class="footer-bg" style="background-image: url(https://s2.loli.net/2024/11/12/x1aqcwUG3XDiskN.jpg)"><div class="layout" id="footer"><div class="copyright">©2018 - 2024 By Charon Cheung</div><div class="framework-info"><span>Driven - </span><a target="_blank" rel="noopener" href="http://hexo.io"><span>Hexo</span></a><span class="footer-separator">|</span><span>Theme - </span><a target="_blank" rel="noopener" href="https://github.com/Molunerfinn/hexo-theme-melody"><span>Melody</span></a></div><div class="busuanzi"><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><span id="busuanzi_container_site_uv"><i class="fa fa-user"></i><span id="busuanzi_value_site_uv"></span><span></span></span><span class="footer-separator">|</span><span id="busuanzi_container_site_pv"><i class="fa fa-eye"></i><span id="busuanzi_value_site_pv"></span><span></span></span></div></div></footer><i class="fa fa-arrow-up" id="go-up" aria-hidden="true"></i><script src="https://cdn.jsdelivr.net/npm/animejs@latest/anime.min.js"></script><script src="https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-animate@latest/velocity.min.js"></script><script src="https://cdn.jsdelivr.net/npm/velocity-ui-pack@latest/velocity.ui.min.js"></script><script src="/js/utils.js?version=1.6.1"></script><script src="/js/fancybox.js?version=1.6.1"></script><script src="/js/sidebar.js?version=1.6.1"></script><script src="/js/copy.js?version=1.6.1"></script><script src="/js/fireworks.js?version=1.6.1"></script><script src="/js/transition.js?version=1.6.1"></script><script src="/js/scroll.js?version=1.6.1"></script><script src="/js/head.js?version=1.6.1"></script><script type="text/x-mathjax-config">MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
},
CommonHTML: {
linebreaks: { automatic: true, width: "90% container" }
},
"HTML-CSS": {
linebreaks: { automatic: true, width: "90% container" }
},
"SVG": {
linebreaks: { automatic: true, width: "90% container" }
}
});
</script><script type="text/x-mathjax-config">MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for (i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script><script src="https://cdn.bootcss.com/mathjax/2.7.2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script>if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
$('#nav').addClass('is-mobile')
$('footer').addClass('is-mobile')
}</script></body></html>