<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>REAL</title>
  
  <subtitle>Liam Xander</subtitle>
  <link href="http://liam-xander.github.io/atom.xml" rel="self"/>
  
  <link href="http://liam-xander.github.io/"/>
  <updated>2024-11-18T07:27:14.233Z</updated>
  <id>http://liam-xander.github.io/</id>
  
  <author>
    <name>Liam Xander</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>FIESTA</title>
    <link href="http://liam-xander.github.io/2024/11/18/20241118/"/>
    <id>http://liam-xander.github.io/2024/11/18/20241118/</id>
    <published>2024-11-18T14:34:00.000Z</published>
    <updated>2024-11-18T07:27:14.233Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><p>“FIESTA: Fast Incremental Euclidean Distance Fields for Online Motion Planning of Aerial Robots”由香港科技大学的Luxin Han、Fei Gao、Boyu Zhou和Shaojie Shen撰写。该论文提出了一种名为FIESTA的建图系统，用于增量式构建全局ESDF地图，以解决空中机器人在线运动规划中ESDF地图更新的瓶颈问题。</p><p>1.&nbsp;研究背景</p><ul><li>无人机自主系统的关键环节：对于完全自主的微型无人机（MAV），感知 - 规划 - 控制流程至关重要，其中建图模块为机载运动规划提供基础，是系统的关键组成部分。</li><li>现有建图方法的不足：尽管存在多种建图数据结构和算法，但对于自主四旋翼导航而言，多数方法存在问题。如Octomap和TSDF等框架在平衡深度测量融合精度与环境精细表示存储开销方面存在不足，且真正对规划有用的是自由空间信息而非障碍物信息，而像基于栅格地图的方法在实时性和准确性上难以同时满足要求。</li><li>ESDF地图的重要性与更新瓶颈：ESDF地图能评估与障碍物的距离和梯度信息，对基于梯度的规划方法（如CHOMP）必不可少，但实时维护和更新ESDF地图的效率与准确性一直是瓶颈。例如，一些全局计算ESDF的方法在无人机平台上不实用，而仅维护局部地图的方法又无法用于全局或重复规划场景。Voxblox虽能增量构建ESDF地图，但存在计算距离不准确（基于准欧几里得距离更新）以及依赖TSDF映射导致误差（TSDF投影距离可能高估实际距离）等问题。<br>2.&nbsp;系统框架</li><li>数据获取与融合：系统从立体、RGB - D传感器或单目深度估计获取深度测量数据，从GPS、Vicon等外部设备或内部视觉惯性里程计（VIO）获取位姿测量数据，然后通过光线投射将其整合到占用栅格地图中，整合过程中，占用状态改变的体素分别被添加到插入队列（insertQueue）和删除队列（deleteQueue）。</li><li>ESDF地图更新：通过ESDF更新初始化过程将两个队列合并为更新队列（updateQueue），再基于广度优先搜索（BFS）的ESDF更新算法更新可能改变的体素，以最小计算开销全局更新ESDF地图。<br>3.&nbsp;数据结构</li><li>占用栅格地图与体素信息结构：占用栅格地图存储体素占用概率，体素信息结构（VIS）存储体素的各种信息，包括位置、占用概率、到最近障碍物的欧几里得距离（ESDF）、最近障碍物体素坐标、是否被观测等，VIS还包含用于双向链表（DLLs）操作和获取邻居体素的方法。</li><li>索引数据结构：根据规划区域边界框是否已知及内存情况，选择数组或哈希表进行索引，将体素坐标映射到对应的VIS指针，以实现高效查询，时间复杂度平均为Θ(1)。例如，当边界框已知且内存充足时用数组，否则用哈希表管理块（block），通过优化可在一定程度上平衡性能和内存消耗。</li><li>双向链表：用于高效处理占用体素变为空闲的情况。每个体素的VIS中有一个dll方法，用于表示以该体素为最近障碍物的所有体素构成的双向链表，链表头指针由VIS的head成员获取。初始化时，所有体素的最近障碍物设为理想点（无穷远点IP），新观测到的体素加入IP的dll，借助索引数据结构，可在Θ(1)时间内完成双向链表的插入和删除操作。<br>4.&nbsp;算法</li><li>占用整合算法：每次获取位姿和深度估计后，通过光线投射将新的占用信息整合到占用栅格地图，新观测到的体素插入IP的dll并标记为已观测，占用状态改变的体素分别加入插入队列或删除队列。</li><li>仅插入情况的ESDF更新算法：基于BFS，先假设新障碍物仅影响连续有界区域内体素的ESDF和最近障碍物，将插入队列中的体素经简单初始化后加入更新队列，然后用BFS更新邻居体素，更新方式为若邻居体素到当前体素最近障碍物的距离小于其自身ESDF值，则更新邻居体素的ESDF值、最近障碍物坐标，并在双向链表中进行相应操作，若更新则将邻居体素加入更新队列。</li><li>全动态情况的ESDF更新算法：对于插入队列的处理与仅插入情况类似，对于删除队列中的每个体素，遍历其dll中的所有体素，将状态重置为观测但未更新（最近障碍物设为IP，ESDF设为∞），然后尝试根据邻居体素的现有最近障碍物更新其ESDF，若更新则将该体素插入其最近障碍物的dll并加入更新队列，最后执行ESDF更新算法。</li><li>有限观测情况的ESDF更新算法：针对之前算法在有限观测下可能导致系统不一致的问题（如新观测体素未被之前体素更新），在ESDF更新算法中添加补丁代码，在更新邻居体素前检查是否应从其他邻居体素更新当前体素的ESDF，若更新则调整相关参数并将当前体素加入更新队列。</li><li>理论分析</li><li>最优性：算法通过体素与其邻居最近障碍物的最短欧几里得距离更新ESDF值，比准欧几里得方法更准确，但基于BFS的ESDF更新算法无论选择何种连通性都无法完全准确。以2D情况为例，由于用有限小圆圈覆盖大圆圈存在剩余空间，会导致算法计算距离与实际距离存在误差，不过考虑到最差情况较少且只有剩余空间内的整数点影响算法，实际均方根误差（RMS Error）可接受。</li><li>时间复杂度：ESDF更新初始化算法（Alg. 2）处理插入队列或其最近障碍物在删除队列中的体素，时间复杂度为Θ(k)（k为需处理的体素数量）；ESDF更新算法（Alg. 1）若用优先队列进行BFS，时间复杂度为Θ(n log n)（n为需更新的体素数量）。</li><li>空间复杂度：与基于哈希表的纯占用栅格地图相比，系统仅VIS有修改，空间复杂度仅比纯占用栅格地图高常数级别，通过选择block_size = 1，可使空间复杂度等于Θ(m)（m为所有观测到的体素数量），但效率较低，因此高度可定制的索引数据结构对实际系统很重要。<br>5.&nbsp;实验结果</li><li>真实世界数据集实验</li><li>参数调优：对系统内的连通性和索引数据结构等参数进行测试，以找到准确性、性能和内存消耗的最佳权衡。例如，固定索引数据结构为block_size = 8的哈希表，测试不同连通性（6 - 、18 - 、26 - 、24 - 、32 - 连通性）对准确性和性能的影响，发现24 - 连通性在均方根误差和性能方面是较好选择；然后固定连通性为24，比较不同block_size（1、2、4、8、16）的数组和哈希表实现的索引数据结构，结果表明若地图边界未知，block_size = 8的哈希表在时间和空间复杂度上是较好选择，否则数组性能最佳。</li><li>与Voxblox比较：在不同体素大小下，使用Cow和Lady数据集（RGB - D相机）和EuRoC数据集（立体相机）比较FIESTA和Voxblox的性能和准确性，结果显示FIESTA在性能和准确性上均优于Voxblox一个数量级，同时给出了使用FIESTA系统（voxel_size = 0.05）运行Cow和Lady数据集时占用栅格地图和ESDF地图切片的可视化结果。</li><li>四旋翼运动规划模拟测试：通过模拟四旋翼飞行证明所提出的地图可用于运动规划，采用[8]中的运动规划方法，在模拟中随机生成地图、起始点和目标点，FIESTA系统增量构建全局ESDF地图，帮助运动规划算法高效运行，展示了样本结果。</li><li>自主四旋翼机载实验：在未知杂乱环境中进行机载实验，平台为配备Velodyne VLP - 16 3D激光雷达的四旋翼，用于位姿估计和深度测量，所有模块在双核3.00GHz Intel i7 - 5500U处理器上运行。尽管ESDF地图可在20ms内完成更新，但由于实验对飞行速度要求低，为节省资源，以20Hz的频率更新ESDF地图，给出了实验快照以及增量建图和规划结果。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;“FIESTA: Fast Incremental Euclidean Distance Fields for Online Motion Planning of Aerial Robots”</summary>
      
    
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/categories/thinks/"/>
    
    
    <category term="papers" scheme="http://liam-xander.github.io/tags/papers/"/>
    
  </entry>
  
  <entry>
    <title>lua脚本文件</title>
    <link href="http://liam-xander.github.io/2024/04/15/lua/"/>
    <id>http://liam-xander.github.io/2024/04/15/lua/</id>
    <published>2024-04-15T03:34:00.000Z</published>
    <updated>2024-04-14T19:12:51.954Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">function <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">__getObjectQuaternion__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">__getObjectOrientation__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectOrientation</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">sysCall_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token operator">--</span> Make sure we have version <span class="token number">2.4</span><span class="token punctuation">.</span><span class="token number">13</span> <span class="token operator">or</span> <span class="token function">above</span> <span class="token punctuation">(</span>the particles are <span class="token operator">not</span> supported otherwise<span class="token punctuation">)</span>    v <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>v <span class="token operator">&lt;</span> <span class="token number">20413</span><span class="token punctuation">)</span> then        sim<span class="token punctuation">.</span><span class="token function">displayDialog</span><span class="token punctuation">(</span><span class="token char">'Warning'</span><span class="token punctuation">,</span> 'The propeller model is only fully supported from V<span class="token operator">-</span>REP version <span class="token number">2.4</span><span class="token punctuation">.</span><span class="token number">13</span> <span class="token operator">and</span> above<span class="token punctuation">.</span><span class="token operator">&amp;&amp;</span>nThis simulation will <span class="token operator">not</span> run as expected<span class="token operator">!</span><span class="token char">', sim.dlgstyle_ok, false, '</span>'<span class="token punctuation">,</span> nil<span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token number">0.8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>    end    <span class="token operator">--</span> Detatch the manipulation sphere<span class="token operator">:</span>    targetObj <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Quadricopter_target'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setObjectParent</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>    <span class="token operator">--</span> This control algo was quickly written <span class="token operator">and</span> is dirty <span class="token operator">and</span> <span class="token operator">not</span> optimal<span class="token punctuation">.</span> It just serves as a SIMPLE example    d <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Quadricopter_base'</span><span class="token punctuation">)</span>    particlesAreVisible <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'particlesAreVisible'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_tree<span class="token punctuation">,</span> <span class="token char">'particlesAreVisible'</span><span class="token punctuation">,</span> <span class="token function">tostring</span><span class="token punctuation">(</span>particlesAreVisible<span class="token punctuation">)</span><span class="token punctuation">)</span>    simulateParticles <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'simulateParticles'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_tree<span class="token punctuation">,</span> <span class="token char">'simulateParticles'</span><span class="token punctuation">,</span> <span class="token function">tostring</span><span class="token punctuation">(</span>simulateParticles<span class="token punctuation">)</span><span class="token punctuation">)</span>    propellerScripts <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">do</span>        propellerScripts<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptHandle</span><span class="token punctuation">(</span>'Quadricopter_propeller_respondable<span class="token number">'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> i<span class="token punctuation">)</span>    end    heli <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">)</span>    particlesTargetVelocities <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    pParam <span class="token operator">=</span> <span class="token number">2</span>    iParam <span class="token operator">=</span> <span class="token number">0</span>    dParam <span class="token operator">=</span> <span class="token number">0</span>    vParam <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">2</span>    cumul <span class="token operator">=</span> <span class="token number">0</span>    lastE <span class="token operator">=</span> <span class="token number">0</span>    pAlphaE <span class="token operator">=</span> <span class="token number">0</span>    pBetaE <span class="token operator">=</span> <span class="token number">0</span>    psp2 <span class="token operator">=</span> <span class="token number">0</span>    psp1 <span class="token operator">=</span> <span class="token number">0</span>    prevEuler <span class="token operator">=</span> <span class="token number">0</span>    fakeShadow <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'fakeShadow'</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>fakeShadow<span class="token punctuation">)</span> then        shadowCont <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">addDrawingObject</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>drawing_discpoints <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_cyclic <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_25percenttransparency <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_50percenttransparency <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_itemsizes<span class="token punctuation">,</span> <span class="token number">0.2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    end    visionSensor_h <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Vision_sensor'</span><span class="token punctuation">)</span>    imu_handle <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'IMU_link'</span><span class="token punctuation">)</span>    payload_h <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Cuboid'</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> simROS then                revsSub <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token char">'/rotorRevs'</span><span class="token punctuation">,</span> <span class="token char">'std_msgs/Float64MultiArray'</span><span class="token punctuation">,</span> <span class="token char">'rotorRevs_cb'</span><span class="token punctuation">)</span>        payload_pub <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/payload'</span><span class="token punctuation">,</span> <span class="token char">'geometry_msgs/Twist'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>payload_pub<span class="token punctuation">)</span>        Gyro_pub <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/imu'</span><span class="token punctuation">,</span> <span class="token char">'sensor_msgs/Imu'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>Gyro_pub<span class="token punctuation">)</span>        target_pub <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/target'</span><span class="token punctuation">,</span> <span class="token char">'geometry_msgs/Pose'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>target_pub<span class="token punctuation">)</span>        Odom_pub <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/odom'</span><span class="token punctuation">,</span><span class="token char">'nav_msgs/Odometry'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>Odom_pub<span class="token punctuation">)</span>        Imu_data <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>        gyroCommunicationTube <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeOpen</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token char">'gyroData'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> sim<span class="token punctuation">.</span><span class="token function">getNameSuffix</span><span class="token punctuation">(</span>nil<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>        accelCommunicationTube <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeOpen</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token char">'accelerometerData'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> sim<span class="token punctuation">.</span><span class="token function">getNameSuffix</span><span class="token punctuation">(</span>nil<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    end    rotorRevs<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">}</span>    initTime <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSimulationTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>endfunction <span class="token function">rotorRevs_cb</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span>        rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    endfunction <span class="token function">sysCall_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">removeDrawingObject</span><span class="token punctuation">(</span>shadowCont<span class="token punctuation">)</span>endfunction <span class="token function">sysCall_actuation</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    s <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectSizeFactor</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span>    pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>fakeShadow<span class="token punctuation">)</span> then        itemData <span class="token operator">=</span> <span class="token punctuation">{</span> pos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> pos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0.002</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0.2</span> <span class="token operator">*</span> s <span class="token punctuation">}</span>        sim<span class="token punctuation">.</span><span class="token function">addDrawingObjectItem</span><span class="token punctuation">(</span>shadowCont<span class="token punctuation">,</span> itemData<span class="token punctuation">)</span>    end    <span class="token operator">--</span> Vertical control<span class="token operator">:</span>    targetPos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    l <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getVelocity</span><span class="token punctuation">(</span>heli<span class="token punctuation">)</span>    e <span class="token operator">=</span> <span class="token punctuation">(</span>targetPos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> pos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    cumul <span class="token operator">=</span> cumul <span class="token operator">+</span> e    pv <span class="token operator">=</span> pParam <span class="token operator">*</span> e        thrust <span class="token operator">=</span> <span class="token number">5.10</span><span class="token operator">+</span> pv <span class="token operator">+</span> iParam <span class="token operator">*</span> cumul <span class="token operator">+</span> dParam <span class="token operator">*</span> <span class="token punctuation">(</span>e <span class="token operator">-</span> lastE<span class="token punctuation">)</span> <span class="token operator">+</span> l<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">*</span> vParam     <span class="token operator">--</span> Horizontal control<span class="token operator">:</span>    sp <span class="token operator">=</span> <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span> d<span class="token punctuation">)</span>    m <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectMatrix</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    vx <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    vx <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">multiplyVector</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> vx<span class="token punctuation">)</span>    vy <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    vy <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">multiplyVector</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> vy<span class="token punctuation">)</span>    <span class="token operator">--</span>m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token operator">-&gt;</span>z height    alphaE <span class="token operator">=</span> <span class="token punctuation">(</span>vy<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    alphaCorr <span class="token operator">=</span> <span class="token number">0.25</span> <span class="token operator">*</span> alphaE <span class="token operator">+</span> <span class="token number">2.1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>alphaE <span class="token operator">-</span> pAlphaE<span class="token punctuation">)</span>    betaE <span class="token operator">=</span> <span class="token punctuation">(</span>vx<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    betaCorr <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">0.25</span> <span class="token operator">*</span> betaE <span class="token operator">-</span> <span class="token number">2.1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>betaE <span class="token operator">-</span> pBetaE<span class="token punctuation">)</span>    pAlphaE <span class="token operator">=</span> alphaE    pBetaE <span class="token operator">=</span> betaE        alphaCorr <span class="token operator">=</span> alphaCorr <span class="token operator">+</span> sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.005</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">-</span> psp2<span class="token punctuation">)</span> <span class="token operator">--</span> errorY<span class="token operator">/</span><span class="token number">30</span>    betaCorr <span class="token operator">=</span> betaCorr <span class="token operator">-</span> sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.005</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> psp1<span class="token punctuation">)</span> <span class="token operator">--</span> errorX<span class="token operator">/</span><span class="token number">30</span>    psp2 <span class="token operator">=</span> sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>    psp1 <span class="token operator">=</span> sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>    <span class="token operator">--</span> Rotational control<span class="token operator">:</span>    euler <span class="token operator">=</span> <span class="token function">__getObjectOrientation__</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> targetObj<span class="token punctuation">)</span>    rotCorr <span class="token operator">=</span> euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.1</span> <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token punctuation">(</span>euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> prevEuler<span class="token punctuation">)</span>    prevEuler <span class="token operator">=</span> euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>    <span class="token operator">--</span> Decide of the motor velocities<span class="token operator">:</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token function">or</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getSimulationTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span>initTime<span class="token punctuation">)</span><span class="token operator">&lt;</span><span class="token number">2</span><span class="token punctuation">)</span> then        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> alphaCorr <span class="token operator">+</span> betaCorr <span class="token operator">+</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error2        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> alphaCorr <span class="token operator">-</span> betaCorr <span class="token operator">-</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error1        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> alphaCorr <span class="token operator">-</span> betaCorr <span class="token operator">+</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error4        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> alphaCorr <span class="token operator">+</span> betaCorr <span class="token operator">-</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error3    <span class="token keyword">else</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span>    end    <span class="token operator">--</span> Send the desired motor velocities to the <span class="token number">4</span> rotors<span class="token operator">:</span>    <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">do</span>        sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>propellerScripts<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token char">'particleVelocity'</span><span class="token punctuation">,</span> particlesTargetVelocities<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>    end    rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>endfunction <span class="token function">getTransformStamped</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> name<span class="token punctuation">,</span> relTo<span class="token punctuation">,</span> relToName<span class="token punctuation">)</span>    t <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    p <span class="token operator">=</span> <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> relTo<span class="token punctuation">)</span>    o <span class="token operator">=</span> <span class="token function">__getObjectQuaternion__</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> relTo<span class="token punctuation">)</span>    <span class="token keyword">return</span> <span class="token punctuation">{</span>        header <span class="token operator">=</span> <span class="token punctuation">{</span>            stamp <span class="token operator">=</span> t<span class="token punctuation">,</span>            frame_id <span class="token operator">=</span> relToName        <span class="token punctuation">}</span><span class="token punctuation">,</span>        child_frame_id <span class="token operator">=</span> name<span class="token punctuation">,</span>        transform <span class="token operator">=</span> <span class="token punctuation">{</span>            translation <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>            rotation <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> w <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>endfunction <span class="token function">sysCall_sensing</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> simROS then        quaternion <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        accele_data <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeRead</span><span class="token punctuation">(</span>accelCommunicationTube<span class="token punctuation">)</span>        gyro_data <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeRead</span><span class="token punctuation">(</span>gyroCommunicationTube<span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>accele_data <span class="token operator">and</span> gyro_data<span class="token punctuation">)</span> then            acceleration <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">unpackFloatTable</span><span class="token punctuation">(</span>accele_data<span class="token punctuation">)</span>            angularVariations <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">unpackFloatTable</span><span class="token punctuation">(</span>gyro_data<span class="token punctuation">)</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'orientation'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> w <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> seq <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> stamp <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> frame_id <span class="token operator">=</span> <span class="token string">"imu_link"</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'linear_acceleration'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> acceleration<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> acceleration<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> <span class="token operator">-</span>acceleration<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'angular_velocity'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>            simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>Gyro_pub<span class="token punctuation">,</span> Imu_data<span class="token punctuation">)</span>                        local pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            local ori <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            local vel <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectVelocity</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            odom <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>header <span class="token operator">=</span> <span class="token punctuation">{</span>seq<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>stamp<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> frame_id<span class="token operator">=</span><span class="token string">"odom"</span><span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>child_frame_id <span class="token operator">=</span> <span class="token char">'base_link'</span>            odom<span class="token punctuation">.</span>pose <span class="token operator">=</span> <span class="token punctuation">{</span> pose<span class="token operator">=</span><span class="token punctuation">{</span>position<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span> orientation<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span>w<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>twist<span class="token operator">=</span><span class="token punctuation">{</span>twist <span class="token operator">=</span> <span class="token punctuation">{</span> linear<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>angular <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span>            simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>Odom_pub<span class="token punctuation">,</span> odom<span class="token punctuation">)</span>        end        q_pos<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        local payload_pos<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>payload_h<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        payload_data<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">}</span>        payload_data<span class="token punctuation">[</span><span class="token char">'linear'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>payload_pos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>payload_pos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>payload_pos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span>        simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>payload_pub<span class="token punctuation">,</span> payload_data<span class="token punctuation">)</span>        local targetPos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        local targetOri <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        target_data<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">}</span>        target_data<span class="token punctuation">[</span><span class="token char">'position'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span>        target_data<span class="token punctuation">[</span><span class="token char">'orientation'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span>w<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">}</span>        simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>target_pub<span class="token punctuation">,</span> target_data<span class="token punctuation">)</span>                simROS<span class="token punctuation">.</span><span class="token function">sendTransform</span><span class="token punctuation">(</span><span class="token function">getTransformStamped</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token char">'odom'</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token char">'map'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            endend<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">function <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">__getObjectQuaternion__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">__getObjectOrientation__</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>    <span class="token operator">--</span> compatibility routine<span class="token punctuation">,</span> wrong results could be returned in some situations<span class="token punctuation">,</span> in CoppeliaSim <span class="token operator">&lt;</span><span class="token number">4.0</span><span class="token punctuation">.</span><span class="token number">1</span>    <span class="token keyword">if</span> b<span class="token operator">==</span>sim<span class="token punctuation">.</span>handle_parent then        b<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getObjectParent</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span>    end    <span class="token keyword">if</span> <span class="token punctuation">(</span>b<span class="token operator">~</span><span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getObjectType</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token operator">==</span>sim<span class="token punctuation">.</span>object_joint_type<span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span><span class="token operator">&gt;=</span><span class="token number">40001</span><span class="token punctuation">)</span> then        a<span class="token operator">=</span>a<span class="token operator">+</span>sim<span class="token punctuation">.</span>handleflag_reljointbaseframe    end    <span class="token keyword">return</span> sim<span class="token punctuation">.</span><span class="token function">getObjectOrientation</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span>endfunction <span class="token function">sysCall_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token operator">--</span> Make sure we have version <span class="token number">2.4</span><span class="token punctuation">.</span><span class="token number">13</span> <span class="token operator">or</span> <span class="token function">above</span> <span class="token punctuation">(</span>the particles are <span class="token operator">not</span> supported otherwise<span class="token punctuation">)</span>    v <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getInt32Param</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>intparam_program_version<span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>v <span class="token operator">&lt;</span> <span class="token number">20413</span><span class="token punctuation">)</span> then        sim<span class="token punctuation">.</span><span class="token function">displayDialog</span><span class="token punctuation">(</span><span class="token char">'Warning'</span><span class="token punctuation">,</span> 'The propeller model is only fully supported from V<span class="token operator">-</span>REP version <span class="token number">2.4</span><span class="token punctuation">.</span><span class="token number">13</span> <span class="token operator">and</span> above<span class="token punctuation">.</span><span class="token operator">&amp;&amp;</span>nThis simulation will <span class="token operator">not</span> run as expected<span class="token operator">!</span><span class="token char">', sim.dlgstyle_ok, false, '</span>'<span class="token punctuation">,</span> nil<span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token number">0.8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">)</span>    end    <span class="token operator">--</span> Detatch the manipulation sphere<span class="token operator">:</span>    targetObj <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Quadricopter_target'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setObjectParent</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>    <span class="token operator">--</span> This control algo was quickly written <span class="token operator">and</span> is dirty <span class="token operator">and</span> <span class="token operator">not</span> optimal<span class="token punctuation">.</span> It just serves as a SIMPLE example    d <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Quadricopter_base'</span><span class="token punctuation">)</span>    particlesAreVisible <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'particlesAreVisible'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_tree<span class="token punctuation">,</span> <span class="token char">'particlesAreVisible'</span><span class="token punctuation">,</span> <span class="token function">tostring</span><span class="token punctuation">(</span>particlesAreVisible<span class="token punctuation">)</span><span class="token punctuation">)</span>    simulateParticles <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'simulateParticles'</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_tree<span class="token punctuation">,</span> <span class="token char">'simulateParticles'</span><span class="token punctuation">,</span> <span class="token function">tostring</span><span class="token punctuation">(</span>simulateParticles<span class="token punctuation">)</span><span class="token punctuation">)</span>    propellerScripts <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span>    <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">do</span>        propellerScripts<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptHandle</span><span class="token punctuation">(</span>'Quadricopter_propeller_respondable<span class="token number">'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> i<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token string">"#0"</span><span class="token punctuation">)</span>    end    heli <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">)</span>    particlesTargetVelocities <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    pParam <span class="token operator">=</span> <span class="token number">2</span>    iParam <span class="token operator">=</span> <span class="token number">0</span>    dParam <span class="token operator">=</span> <span class="token number">0</span>    vParam <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">2</span>    cumul <span class="token operator">=</span> <span class="token number">0</span>    lastE <span class="token operator">=</span> <span class="token number">0</span>    pAlphaE <span class="token operator">=</span> <span class="token number">0</span>    pBetaE <span class="token operator">=</span> <span class="token number">0</span>    psp2 <span class="token operator">=</span> <span class="token number">0</span>    psp1 <span class="token operator">=</span> <span class="token number">0</span>    prevEuler <span class="token operator">=</span> <span class="token number">0</span>    fakeShadow <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getScriptSimulationParameter</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>handle_self<span class="token punctuation">,</span> <span class="token char">'fakeShadow'</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>fakeShadow<span class="token punctuation">)</span> then        shadowCont <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">addDrawingObject</span><span class="token punctuation">(</span>sim<span class="token punctuation">.</span>drawing_discpoints <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_cyclic <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_25percenttransparency <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_50percenttransparency <span class="token operator">+</span> sim<span class="token punctuation">.</span>drawing_itemsizes<span class="token punctuation">,</span> <span class="token number">0.2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    end    visionSensor_h <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'Vision_sensor'</span><span class="token punctuation">)</span>    imu_handle <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectHandle</span><span class="token punctuation">(</span><span class="token char">'IMU_link'</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> simROS then                revsSub0 <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token char">'/rotorRevs0'</span><span class="token punctuation">,</span> <span class="token char">'std_msgs/Float64MultiArray'</span><span class="token punctuation">,</span> <span class="token char">'rotorRevs_cb'</span><span class="token punctuation">)</span>        Gyro_pub0 <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/imu0'</span><span class="token punctuation">,</span> <span class="token char">'sensor_msgs/Imu'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>Gyro_pub0<span class="token punctuation">)</span>        target_pub0 <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/target0'</span><span class="token punctuation">,</span> <span class="token char">'geometry_msgs/Pose'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>target_pub0<span class="token punctuation">)</span>        Odom_pub0 <span class="token operator">=</span> simROS<span class="token punctuation">.</span><span class="token function">advertise</span><span class="token punctuation">(</span><span class="token char">'/odom0'</span><span class="token punctuation">,</span><span class="token char">'nav_msgs/Odometry'</span><span class="token punctuation">)</span>        simROS<span class="token punctuation">.</span><span class="token function">publisherTreatUInt8ArrayAsString</span><span class="token punctuation">(</span>Odom_pub0<span class="token punctuation">)</span>        Imu_data <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>        gyroCommunicationTube <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeOpen</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token char">'gyroData'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> sim<span class="token punctuation">.</span><span class="token function">getNameSuffix</span><span class="token punctuation">(</span>nil<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>        accelCommunicationTube <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeOpen</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token char">'accelerometerData'</span> <span class="token punctuation">.</span><span class="token punctuation">.</span> sim<span class="token punctuation">.</span><span class="token function">getNameSuffix</span><span class="token punctuation">(</span>nil<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    end    rotorRevs<span class="token operator">=</span><span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">}</span>    initTime <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSimulationTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>endfunction <span class="token function">rotorRevs_cb</span><span class="token punctuation">(</span>msg<span class="token punctuation">)</span>        rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    rotorRevs<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> msg<span class="token punctuation">.</span>data<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token operator">*</span><span class="token number">4.35</span>    endfunction <span class="token function">sysCall_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    sim<span class="token punctuation">.</span><span class="token function">removeDrawingObject</span><span class="token punctuation">(</span>shadowCont<span class="token punctuation">)</span>endfunction <span class="token function">sysCall_actuation</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    s <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectSizeFactor</span><span class="token punctuation">(</span>d<span class="token punctuation">)</span>    pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>fakeShadow<span class="token punctuation">)</span> then        itemData <span class="token operator">=</span> <span class="token punctuation">{</span> pos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> pos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">0.002</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0.2</span> <span class="token operator">*</span> s <span class="token punctuation">}</span>        sim<span class="token punctuation">.</span><span class="token function">addDrawingObjectItem</span><span class="token punctuation">(</span>shadowCont<span class="token punctuation">,</span> itemData<span class="token punctuation">)</span>    end    <span class="token operator">--</span> Vertical control<span class="token operator">:</span>    targetPos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    l <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getVelocity</span><span class="token punctuation">(</span>heli<span class="token punctuation">)</span>    e <span class="token operator">=</span> <span class="token punctuation">(</span>targetPos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> pos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    cumul <span class="token operator">=</span> cumul <span class="token operator">+</span> e    pv <span class="token operator">=</span> pParam <span class="token operator">*</span> e    thrust <span class="token operator">=</span> <span class="token number">5.10</span><span class="token operator">+</span> pv <span class="token operator">+</span> iParam <span class="token operator">*</span> cumul <span class="token operator">+</span> dParam <span class="token operator">*</span> <span class="token punctuation">(</span>e <span class="token operator">-</span> lastE<span class="token punctuation">)</span> <span class="token operator">+</span> l<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">*</span> vParam    lastE <span class="token operator">=</span> e    <span class="token operator">--</span> Horizontal control<span class="token operator">:</span>    sp <span class="token operator">=</span> <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span> d<span class="token punctuation">)</span>    m <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectMatrix</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>    vx <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    vx <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">multiplyVector</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> vx<span class="token punctuation">)</span>    vy <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">}</span>    vy <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">multiplyVector</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span> vy<span class="token punctuation">)</span>    <span class="token operator">--</span>m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token operator">-&gt;</span>z height    alphaE <span class="token operator">=</span> <span class="token punctuation">(</span>vy<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    alphaCorr <span class="token operator">=</span> <span class="token number">0.25</span> <span class="token operator">*</span> alphaE <span class="token operator">+</span> <span class="token number">2.1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>alphaE <span class="token operator">-</span> pAlphaE<span class="token punctuation">)</span>    betaE <span class="token operator">=</span> <span class="token punctuation">(</span>vx<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> m<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span>    betaCorr <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">0.25</span> <span class="token operator">*</span> betaE <span class="token operator">-</span> <span class="token number">2.1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>betaE <span class="token operator">-</span> pBetaE<span class="token punctuation">)</span>    pAlphaE <span class="token operator">=</span> alphaE    pBetaE <span class="token operator">=</span> betaE        alphaCorr <span class="token operator">=</span> alphaCorr <span class="token operator">+</span> sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.005</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">-</span> psp2<span class="token punctuation">)</span> <span class="token operator">--</span> errorY<span class="token operator">/</span><span class="token number">30</span>    betaCorr <span class="token operator">=</span> betaCorr <span class="token operator">-</span> sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.005</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token operator">*</span> <span class="token punctuation">(</span>sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> psp1<span class="token punctuation">)</span> <span class="token operator">--</span> errorX<span class="token operator">/</span><span class="token number">30</span>    psp2 <span class="token operator">=</span> sp<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>    psp1 <span class="token operator">=</span> sp<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>    <span class="token operator">--</span> Rotational control<span class="token operator">:</span>    euler <span class="token operator">=</span> <span class="token function">__getObjectOrientation__</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span> targetObj<span class="token punctuation">)</span>    rotCorr <span class="token operator">=</span> euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">0.1</span> <span class="token operator">+</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token punctuation">(</span>euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">-</span> prevEuler<span class="token punctuation">)</span>    prevEuler <span class="token operator">=</span> euler<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>    <span class="token operator">--</span> Decide of the motor velocities<span class="token operator">:</span>    <span class="token keyword">if</span> <span class="token punctuation">(</span>rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token function">or</span> <span class="token punctuation">(</span>sim<span class="token punctuation">.</span><span class="token function">getSimulationTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span>initTime<span class="token punctuation">)</span><span class="token operator">&lt;</span><span class="token number">2</span><span class="token punctuation">)</span> then        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> alphaCorr <span class="token operator">+</span> betaCorr <span class="token operator">+</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error2        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">-</span> alphaCorr <span class="token operator">-</span> betaCorr <span class="token operator">-</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error1        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> alphaCorr <span class="token operator">-</span> betaCorr <span class="token operator">+</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error4        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> thrust <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token number">1</span> <span class="token operator">+</span> alphaCorr <span class="token operator">+</span> betaCorr <span class="token operator">-</span> rotCorr<span class="token punctuation">)</span><span class="token operator">--</span><span class="token operator">+</span>error3    <span class="token keyword">else</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span>        particlesTargetVelocities<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> rotorRevs<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span>    end    <span class="token operator">--</span> Send the desired motor velocities to the <span class="token number">4</span> rotors<span class="token operator">:</span>    <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token keyword">do</span>        sim<span class="token punctuation">.</span><span class="token function">setScriptSimulationParameter</span><span class="token punctuation">(</span>propellerScripts<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token char">'particleVelocity'</span><span class="token punctuation">,</span> particlesTargetVelocities<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>    end    rotorRevs<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>endfunction <span class="token function">getTransformStamped</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> name<span class="token punctuation">,</span> relTo<span class="token punctuation">,</span> relToName<span class="token punctuation">)</span>    t <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    p <span class="token operator">=</span> <span class="token function">__getObjectPosition__</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> relTo<span class="token punctuation">)</span>    o <span class="token operator">=</span> <span class="token function">__getObjectQuaternion__</span><span class="token punctuation">(</span>objHandle<span class="token punctuation">,</span> relTo<span class="token punctuation">)</span>    <span class="token keyword">return</span> <span class="token punctuation">{</span>        header <span class="token operator">=</span> <span class="token punctuation">{</span>            stamp <span class="token operator">=</span> t<span class="token punctuation">,</span>            frame_id <span class="token operator">=</span> relToName        <span class="token punctuation">}</span><span class="token punctuation">,</span>        child_frame_id <span class="token operator">=</span> name<span class="token punctuation">,</span>        transform <span class="token operator">=</span> <span class="token punctuation">{</span>            translation <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> p<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">,</span>            rotation <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> w <span class="token operator">=</span> o<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>endfunction <span class="token function">sysCall_sensing</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> simROS then        quaternion <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        accele_data <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeRead</span><span class="token punctuation">(</span>accelCommunicationTube<span class="token punctuation">)</span>        gyro_data <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">tubeRead</span><span class="token punctuation">(</span>gyroCommunicationTube<span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token punctuation">(</span>accele_data <span class="token operator">and</span> gyro_data<span class="token punctuation">)</span> then            acceleration <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">unpackFloatTable</span><span class="token punctuation">(</span>accele_data<span class="token punctuation">)</span>            angularVariations <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">unpackFloatTable</span><span class="token punctuation">(</span>gyro_data<span class="token punctuation">)</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'orientation'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> w <span class="token operator">=</span> quaternion<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'header'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> seq <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> stamp <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> frame_id <span class="token operator">=</span> <span class="token string">"imu_link"</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'linear_acceleration'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> acceleration<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> acceleration<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> <span class="token operator">-</span>acceleration<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>            Imu_data<span class="token punctuation">[</span><span class="token char">'angular_velocity'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span>                        simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>Gyro_pub0<span class="token punctuation">,</span> Imu_data<span class="token punctuation">)</span>                        local pos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            local ori <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            local vel <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectVelocity</span><span class="token punctuation">(</span>imu_handle<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>            odom <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>header <span class="token operator">=</span> <span class="token punctuation">{</span>seq<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span>stamp<span class="token operator">=</span>sim<span class="token punctuation">.</span><span class="token function">getSystemTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> frame_id<span class="token operator">=</span><span class="token string">"odom"</span><span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>child_frame_id <span class="token operator">=</span> <span class="token char">'base_link'</span>            odom<span class="token punctuation">.</span>pose <span class="token operator">=</span> <span class="token punctuation">{</span> pose<span class="token operator">=</span><span class="token punctuation">{</span>position<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>pos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span> orientation<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span>w<span class="token operator">=</span>ori<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>            odom<span class="token punctuation">.</span>twist<span class="token operator">=</span><span class="token punctuation">{</span>twist <span class="token operator">=</span> <span class="token punctuation">{</span> linear<span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z<span class="token operator">=</span>vel<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">,</span>angular <span class="token operator">=</span> <span class="token punctuation">{</span> x <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> y <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> z <span class="token operator">=</span> angularVariations<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">}</span>            simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>Odom_pub0<span class="token punctuation">,</span> odom<span class="token punctuation">)</span>        end                        local targetPos <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectPosition</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        local targetOri <span class="token operator">=</span> sim<span class="token punctuation">.</span><span class="token function">getObjectQuaternion</span><span class="token punctuation">(</span>targetObj<span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span>        target_data<span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">}</span>        target_data<span class="token punctuation">[</span><span class="token char">'position'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>targetPos<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">}</span>        target_data<span class="token punctuation">[</span><span class="token char">'orientation'</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token punctuation">{</span>x<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span>y<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span>z<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span>w<span class="token operator">=</span>targetOri<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">}</span>        simROS<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>target_pub0<span class="token punctuation">,</span> target_data<span class="token punctuation">)</span>                simROS<span class="token punctuation">.</span><span class="token function">sendTransform</span><span class="token punctuation">(</span><span class="token function">getTransformStamped</span><span class="token punctuation">(</span>d<span class="token punctuation">,</span><span class="token char">'odom'</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token char">'map'</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            endend<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上是两个lua脚本发布无人机的/imu, /imu0、里程计(/odom, /odom0)、有效载荷位置(/payload)等话题。<br>这段C++代码是ROS节点的实现,用于与CoppeliaSim模拟器中运行的Lua脚本进行通信和数据交互。它们之间的关系如下:</p><ol><li><p>Lua脚本simulates两架无人机的运动控制,并发布它们的IMU、里程计数据、有效载荷位置等数据。</p></li><li><p>这段C++代码订阅了Lua脚本发布的这些数据,包括两架无人机的IMU(/imu, /imu0)、里程计(/odom, /odom0)、有效载荷位置(/payload)等主题。</p></li><li><p>C++代码中定义了一个PayloadController对象controller,用于计算两架无人机的期望位置、反馈载荷位置、期望载荷位置等控制量。</p></li><li><p>然后C++代码通过ROS话题发布这些控制量,包括期望位置(/desiredPos, /desiredPos1)、反馈载荷(/feedbackLoad, /feedbackLoad1)、期望载荷位置(/desiredLoadPos)等。</p></li><li><p>同时,C++代码还发布两架无人机的旋翼转速(/rotorRevs, /rotorRevs0),这个量可能被Lua脚本订阅并应用于无人机的运动控制。</p></li></ol><p>因此,这段C++代码和Lua脚本组成了一个闭环控制系统,二者通过ROS的发布订阅机制相互传递数据,实现了两架无人机协同吊运载荷的控制。Lua控制无人机运动,C++计算理想控制量并将其发回Lua脚本应用。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;pre class=&quot;line-numbers language-cpp&quot; data-language=&quot;cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;function &lt;spa</summary>
      
    
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/categories/thinks/"/>
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/tags/thinks/"/>
    
  </entry>
  
  <entry>
    <title>20240412</title>
    <link href="http://liam-xander.github.io/2024/04/12/somedays/"/>
    <id>http://liam-xander.github.io/2024/04/12/somedays/</id>
    <published>2024-04-12T14:44:00.000Z</published>
    <updated>2024-04-12T06:49:54.234Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token function">add_executable</span> <span class="token punctuation">(</span> random_complex     src<span class="token operator">/</span>random_complex_generator<span class="token punctuation">.</span>cpp <span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>为什么random_complex不是random_complex_generator</p><p>这里的可执行文件的名称可以自由定义。但是，有几个通常的最佳实践可供参考：</p><ol><li><p>通常我们会为可执行文件选择一个具有描述性的名称，这样的话其他人或者你自己在将来回看代码的时候，可以更好地理解该执行文件的功能。</p></li><li><p>如果一个程序的源代码文件不止一个，那么尽量用一个总体的名称来命名可执行文件，而不是使用单个源文件的名字。</p></li><li><p>避免使用系统已有命令或者常用单词作为可执行文件的名字，因为这可能会导致命令行调用时的混淆。</p></li><li><p>规避特殊字符和空格，这些可能导致在命令行环境中引发问题。</p></li></ol><p><code>random_complex</code>是一个很好的名称，因为它既表明了这个程序的主要功能（生成复杂的随机数），又足够简短，便于在命令行中快速输入。</p><h4 id="析构函数需要定义内容吗"><a href="#析构函数需要定义内容吗" class="headerlink" title="析构函数需要定义内容吗"></a>析构函数需要定义内容吗</h4><p>析构函数是一个特殊的成员函数，它在一个对象即将被销毁时被自动调用。它的主要任务是释放对象持有的任何资源，例如动态分配的内存、打开的文件、获取的锁等。<br>在许多情况下，你可以不用定义析构函数。例如，如果你的类不分配任何动态资源，那么编译器提供的默认析构函数应该足够了。默认析构函数只完成最基础的工作，如使对象逐个突变并调用每个成员的析构函数。<br>然而，当你开始处理自己管理的资源时（如动态分配内存，打开文件等），你就需要定义一个析构函数来正确释放这些资源。<br>需要注意的是，当类包含智能指针如<code>shared_ptr</code>,<code>unique_ptr</code>之类的成员变量时，析构函数一般不需要做任何事。智能指针的定义是当它们销毁时自动删除它们指向的对象，除非你需要在类销毁前采取一些特殊行动（如通知其他对象，关闭网络连接等），否则你不需要定义析构函数内容。<br>总的来说，需要在析构函数中定义内容取决于你的类是否持有必须在类析构时释放或清理的资源。</p><h4 id="析构函数一般什么时候被调用"><a href="#析构函数一般什么时候被调用" class="headerlink" title="析构函数一般什么时候被调用"></a>析构函数一般什么时候被调用</h4><p>析构函数在对象销毁时被自动调用，具体时机取决于对象的生命周期。下面是几种常见的情况：<br>对于局部对象：当控制流程离开对象被创建的语句块时，析构函数将被调用。也就是说，析构函数在包含对象的函数或语句块结束时被调用。<br>对于静态局部对象：当程序退出时，析构函数被调用。<br>对于动态分配的对象：当使用 <code>delete</code> 操作符时，析构函数被调用。<br>对于类的成员对象：当包含对象的类的析构函数调用时，会调用成员对象的析构函数。<br>对于全局对象：当程序退出时，析构函数被调用。<br>对于临时对象：在生成临时对象的完整表达式结束后，析构函数被调用。<br>值得注意的是，如果一个对象是基类的派生类对象，基类的析构函数会在派生类的析构函数执行完毕后被调用。由于析构函数的这种特性，所以在设计带有资源管理功能的基类时，必须将基类的析构函数声明为虚函数，以避免只调用基类的析构函数而导致资源未能正确释放的问题。</p><p>析构函数是一个特殊的成员函数，它在一个对象即将被销毁时被自动调用。它的主要任务是释放对象持有的任何资源，例如动态分配的内存、打开的文件、获取的锁等。<br>在许多情况下，你可以不用定义析构函数。例如，如果你的类不分配任何动态资源，那么编译器提供的默认析构函数应该足够了。默认析构函数只完成最基础的工作，如使对象逐个突变并调用每个成员的析构函数。<br>然而，当你开始处理自己管理的资源时（如动态分配内存，打开文件等），你就需要定义一个析构函数来正确释放这些资源。<br>需要注意的是，当类包含智能指针如<code>shared_ptr</code>,<code>unique_ptr</code>之类的成员变量时，析构函数一般不需要做任何事。智能指针的定义是当它们销毁时自动删除它们指向的对象，除非你需要在类销毁前采取一些特殊行动（如通知其他对象，关闭网络连接等），否则你不需要定义析构函数内容。<br>总的来说，需要在析构函数中定义内容取决于你的类是否持有必须在类析构时释放或清理的资源。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">env<span class="token double-colon punctuation">::</span>OccMap<span class="token double-colon punctuation">::</span>Ptr env_ptr_<span class="token punctuation">;</span><span class="token comment">// typedef shared_ptr&lt;OccMap&gt; Ptr;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这句代码解释一下</p><p>这个代码行定义了一个名为 <code>env_ptr_</code> 的 <code>shared_ptr</code>（智能指针），指向<code>OccMap</code> 类型的对象。<code>shared_ptr</code> 是 <code>C++</code> 中用于实现动态内存管理的一个工具，属于智能指针的一种。<br>在这里，<code>OccMap::Ptr</code> 是 <code>std::shared_ptr&lt;OccMap&gt;</code> 的一个别名，也就是说它创建了一个指向 <code>OccMap</code> 类型的共享指针。<code>shared_ptr</code> 的目标是允许多个指针指向同一对象。<code>shared_ptr</code> 使用引用计数，即它维护了一个记录它被引用了多少次的计数器。一旦引用计数器的值变为 <code>0</code>（也就是说没有任何对象引用它），那么它就会自动销毁。<br>在你的代码中，<code>env_ptr_</code> 指向一个 <code>OccMap</code> 类型对象的共享指针被创建，但是它并没有被初始化来指向一个实际的对象。在你尝试解引用该指针之前，你需要确保它被赋值给一个实际的 <code>OccMap</code> 对象。<br>希望上述解释能够帮助您理解这行代码的含义。如果需要针对此主题的进一步解释或有其他问题，欢迎随时进行询问。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">env<span class="token double-colon punctuation">::</span>OccMap<span class="token double-colon punctuation">::</span>Ptr env_ptr_<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这行代码创建了一个类型为<code>OccMap</code>的共享智能指针<code>shared_ptr</code>，名为<code>env_ptr_</code>。<br>首先让我们理解<code>OccMap::Ptr</code>，它是一种类型定义<code>(Type Definition)</code>，也就是给一种数据类型起一个新的名字。在这种情况下，<code>Ptr</code>应该是在<code>OccMap</code>类中定义的，表示一个指向<code>OccMap</code>对象的智能指针<code>shared_ptr</code>。<br><code>shared_ptr</code>是一种在<code>C++</code>中常见的智能指针，它可以确保在任何时候只有一个指针指向一个特定的对象，来避免内存泄露。<br>在这里，<code>env_ptr_</code>是该类型的一个实例。该指针尚未初始化，即它不指向任何内容。在使用该指针之前，必须先使它指向一个<code>OccMap</code>的实例。<br>这个指针用处很多，如可以用在需要改变或传递<code>OccMap</code>对象但不希望进行整个对象的复制的场景中。</p><p>所以我可以理解我<code>env_ptr_</code>是一个<code>shared_ptr</code>智能指针，直系那个了<code>OccMap</code>类型吗<br>是的，你完全正确。在这段代码中，<code>env::OccMap::Ptr</code> 是一个类型别名，表示一个指向 <code>OccMap</code> 对象的 <code>shared_ptr</code>（共享指针）。<code>env_ptr_</code> 是该类型的一个实例。<br>所以，<code>env_ptr_</code> 是一个指向 <code>OccMap</code>对象的智能指针。这意味着 <code>env_ptr_</code> 可以用于访问、修改指向的 <code>OccMap</code> 对象，同时也自动处理了对象的生命周期管理，你不需要手动地释放对象占用的内存。当没有任何 <code>shared_ptr</code> 指向某个对象时，该对象将被自动删除。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;pre class=&quot;line-numbers language-cpp&quot; data-language=&quot;cpp&quot;&gt;&lt;code class=&quot;language-cpp&quot;&gt;&lt;span class=&quot;</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="C++" scheme="http://liam-xander.github.io/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>hold on, we&#39;ll win!</title>
    <link href="http://liam-xander.github.io/2024/04/11/2023someday/"/>
    <id>http://liam-xander.github.io/2024/04/11/2023someday/</id>
    <published>2024-04-11T14:34:00.000Z</published>
    <updated>2024-04-11T07:17:29.706Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><p>风雪压我两三年<br>我笑风清雪又棉<br>心中仍有鸿鹄志<br>他日登顶啸苍天<br>待到功成与名就<br>生吃黄连苦也甜<br>无人扶我青云志<br>我自踏雪至山巅</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;风雪压我两三年&lt;br&gt;我笑风清雪又棉&lt;br&gt;心中仍有鸿鹄志&lt;br&gt;他日登顶啸苍天&lt;br&gt;待到功成与名就&lt;br&gt;生吃黄连苦也甜&lt;br&gt;无人扶我青云志&lt;br&gt;我自踏雪至山巅&lt;/p&gt;
</summary>
      
    
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/categories/thinks/"/>
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/tags/thinks/"/>
    
  </entry>
  
  <entry>
    <title>一些还没整理的知识点的汇总</title>
    <link href="http://liam-xander.github.io/2024/04/10/202404/"/>
    <id>http://liam-xander.github.io/2024/04/10/202404/</id>
    <published>2024-04-10T14:34:00.000Z</published>
    <updated>2024-04-10T14:47:26.742Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><p>当你想将类定义在某个命名空间中时，可以这样做：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">namespace</span> MyNamespace <span class="token punctuation">{</span>    <span class="token keyword">class</span> <span class="token class-name">MyClass</span> <span class="token punctuation">{</span>    <span class="token keyword">public</span><span class="token operator">:</span>        <span class="token function">MyClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//构造函数的声明</span>        <span class="token comment">//以下是类的其他组成部分，如成员函数和成员变量等</span>    <span class="token keyword">private</span><span class="token operator">:</span>        <span class="token comment">//私有成员</span>    <span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在这个例子中，我们将 <code>MyClass</code> 定义在了 <code>MyNamespace</code> 命名空间中。</p><p>使用命名空间可以防止全局范围内的命名冲突。在大型项目中，这个功能尤其有用。你可以使用 <code>::</code> 操作符访问命名空间内的类。</p><p>例如：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">MyNamespace<span class="token double-colon punctuation">::</span>MyClass mc<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这行代码创建了一个 <code>MyNamespace</code> 命名空间中 <code>MyClass</code> 类的对象 <code>mc</code>。</p><hr><p>这是在C++中使用<code>typedef</code>给特定的数据类型重新定义一个新的名字，常用于简化一些复杂的类型声明。</p><p>此处 <code>boost::shared_ptr&lt; ::geometry_msgs::PoseStamped const&gt;</code> 是一个使用<code>boost</code>库实现的智能指针，它指向一个不可修改的（<code>const</code>）<code>geometry_msgs::PoseStamped</code> 类型的实例。<code>boost::shared_ptr</code> 是一个可以自动释放内存的智能指针，当没有引用它所指向的对象时，它会自动删除那个对象并释放其内存空间。</p><p><code>typedef boost::shared_ptr&lt; ::geometry_msgs::PoseStamped const&gt; PoseStampedConstPtr;</code> 这行代码的意思就是，给这个类型起个别名叫做 <code>PoseStampedConstPtr</code>。</p><p>这么做的好处是，之后在代码中我们只需要使用 <code>PoseStampedConstPtr</code> 这个简洁的名字来声明该类型的变量，而不需要每次都写出完整的 <code>boost::shared_ptr&lt; ::geometry_msgs::PoseStamped const&gt;</code>。例如：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">PoseStampedConstPtr ps_ptr<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这样就创建了一个名为 <code>ps_ptr</code> 的 <code>PoseStampedConstPtr</code> 类型的对象，极大的简化了代码的复杂度。</p><hr><p><code>::geometry_msgs::PoseStamped const</code> 描述了一个特定类型的ROS (Robot Operating System) 消息。</p><p>在这里：</p><ul><li><p><code>geometry_msgs</code> 是一个命名空间，包含了用于地理信息处理的多种消息类型。</p></li><li><p><code>PoseStamped</code> 是 <code>geometry_msgs</code> 命名空间中的一种消息类型，通常用于描述物体的位置和方向 (姿态)。它包括两部分：一个 <code>Pose</code> 对象和一个 <code>Header</code> 对象。<code>Pose</code> 对象包含了物体的空间位置 (<code>position</code>) 和方向 (<code>orientation</code>)。<code>Header</code> 对象包含了此消息的时间戳和坐标系 (坐标系通常是相对于某个参照物的位置和方向)。</p></li><li><p>前面的 <code>::</code> 表示 <code>geometry_msgs</code> 是全局命名空间中的一个命名空间，而不是当前命名空间或者某个类或者结构体内部的一个命名空间。</p></li><li><p>最后的 <code>const</code> 表示这种类型的对象是不可修改的，也就是说，一旦创建，你就不能改变它的状态。这常用于类的成员函数中，你想要防止该函数修改类的状态。或者作为函数参数，当你想防止函数修改传入的参数时。</p></li></ul><p>将整句看在一起，<code>&lt; ::geometry_msgs::PoseStamped const&gt;</code> 描述了一个指向 <code>geometry_msgs::PoseStamped</code> 类型实例的常量指针。</p><hr><p><code>::geometry_msgs::PoseStamped const</code> 是一个常量的 <code>geometry_msgs::PoseStamped</code> 对象的指针。这个对象的类型是 <code>geometry_msgs::PoseStamped</code>, 设为 <code>const</code> 表示它是不可更改的。</p><p>有几个关于这个常量指针的关键点需要注意：</p><ol><li><p><strong>指向的对象不可修改</strong>：一旦这个 <code>::geometry_msgs::PoseStamped const</code> 类型的对象被初始化，你就不能改变它的内容。也就是说，你是不能对该对象的任何属性进行修改的，例如，你可以读取其中的 <code>Pose</code> 或者 <code>Header</code>，但是不能更改它们。</p></li><li><p><strong>安全性</strong>：它通常在某些函数的参数中使用，用以防止函数内部修改传递进来的参数的值，这在大型软件项目中很重要，因为它增加了代码的可靠性。</p></li><li><p><strong>需要对 ROS 有一定了解</strong>：对 <code>::geometry_msgs::PoseStamped</code> 的理解需要你对 ROS (机器人操作系统) 有一定了解。在 ROS中，消息是节点之间通信的主要方式，而 <code>geometry_msgs::PoseStamped</code> 是广泛用勾画机器人在三维空间中的位置和方向（姿态）。</p></li><li><p><strong>可读性</strong>：虽然这样的声明看起来有些复杂，但实际上它提供了很好的可读性。一看这样的变量，你就知道它是一个指向常量 <code>::geometry_msgs::PoseStamped</code> 对象的指针，这有助于理解代码的用途。</p></li></ol><p>总的来说，这是一个防止被修改的 <code>::geometry_msgs::PoseStamped</code> 对象的指针，增加了代码的稳定性和可靠性，降低了在编写和阅读代码时出错的概率。</p><hr><p>当我们在C++中使用双冒号(::)操作符时，其主要作用为：</p><ul><li>指示一个全局命名空间的名字，如果单独使用双冒号(比如::name)，表示的是全局的name，在任何地方都是唯一的。</li><li>访问一个类或结构体的静态成员。</li><li>在类的内部，访问类的成员。</li></ul><p>在你所提到的<code>::geometry_msgs::PoseStamped</code>这个例子中，双冒号被用来指明指定的命名空间。首先，”geometry_msgs”是ROS消息类型的一个命名空间，”PoseStamped”是这个命名空间下一种类型的消息。当我们在程序中写<code>geometry_msgs::PoseStamped</code>，表示我们要使用的是<code>geometry_msgs</code>命名空间下的<code>PoseStamped</code>。</p><p>但是，如果在前面加了两个冒号，变成<code>::geometry_msgs::PoseStamped</code>，那意思就改变了。它表示的是全局命名空间下的<code>geometry_msgs::PoseStamped</code>。这样写的目的是为了避免命名的混淆和冲突。假如在当前的局部作用域内也有一个名字为”geometry_msgs”的命名空间，那么写<code>geometry_msgs::PoseStamped</code>可能就会产生冲突，编译器也许会混淆我们到底要使用哪一个命名空间。而如果我们写<code>::geometry_msgs::PoseStamped</code>，则明确告诉编译器我们要使用的是全局命名空间下的”geometry_msgs”，从而避免了命名冲突。</p><hr><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">void</span> <span class="token class-name">EGOReplanFSM</span><span class="token double-colon punctuation">::</span><span class="token function">waypointCallback</span><span class="token punctuation">(</span><span class="token keyword">const</span> geometry_msgs<span class="token double-colon punctuation">::</span>PoseStampedPtr <span class="token operator">&amp;</span>msg<span class="token punctuation">)</span><span class="token punctuation">{</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span>msg<span class="token operator">-&gt;</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>z <span class="token operator">&lt;</span> <span class="token operator">-</span><span class="token number">0.1</span><span class="token punctuation">)</span>    <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token comment">//Z&lt;-0.1即未起飞</span>  cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Triggered!"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>  <span class="token comment">// trigger_ = true;</span>  init_pt_ <span class="token operator">=</span> odom_pos_<span class="token punctuation">;</span>  <span class="token comment">// Eigen::Vector3d end_wp(msg-&gt;pose.position.x, msg-&gt;pose.position.y, msg-&gt;pose.position.z);</span>  Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token function">end_wp</span><span class="token punctuation">(</span>msg<span class="token operator">-&gt;</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>x<span class="token punctuation">,</span> msg<span class="token operator">-&gt;</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>y<span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token function">planNextWaypoint</span><span class="token punctuation">(</span>end_wp<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// rviz指点规划</span><span class="token punctuation">}</span><span class="token comment">//是不是return，就不会执行下面的代码</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>是的，你的理解完全正确。在这段代码中，<code>return</code> 语句被用于立即终止当前的函数运行。如果条件(<code>msg-&gt;pose.position.z &lt; -0.1</code>)满足，那么 <code>return</code> 会被执行，并且函数 <code>EGOReplanFSM::waypointCallback</code> 的余下部分（也就是位于 <code>return</code> 之后的代码）都不会被执行。</p><p>这种使用 <code>return</code> 来提前结束函数的编程技巧通常被称为 “提前返回” 或者 “提前退出”。这种方法可以使代码更简洁，易于理解，同时避免了不必要的代码执行，可能会提高程序的效率。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">Quaterniond <span class="token function">q</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//要注意Eigen中四元数赋值的顺序，实数w在首；</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"四元数：\n"</span> <span class="token operator">&lt;&lt;</span> q <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span> <span class="token comment">//但是实际上它的内部存储顺序是[x y z w]</span>cout <span class="token operator">&lt;&lt;</span> q<span class="token punctuation">.</span><span class="token function">w</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span> <span class="token operator">&lt;&lt;</span> q<span class="token punctuation">.</span><span class="token function">x</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span> <span class="token operator">&lt;&lt;</span> q<span class="token punctuation">.</span><span class="token function">y</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span> <span class="token operator">&lt;&lt;</span> q<span class="token punctuation">.</span><span class="token function">z</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span> <span class="token comment">//单个取值</span>q <span class="token operator">=</span> vec4<span class="token punctuation">;</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"旋转矩阵：\n"</span> <span class="token operator">&lt;&lt;</span> q<span class="token punctuation">.</span><span class="token function">toRotationMatrix</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span> <span class="token comment">//将四元数转换为旋转矩阵</span>请你解释一下q <span class="token operator">=</span> vec4<span class="token punctuation">;</span>这部分<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在你的代码中，<code>q = vec4;</code> 这行代码的作用是将 <code>vec4</code>（向量）中的值赋给 <code>q</code>（四元数）。</p><p>假设 <code>vec4</code> 是一个四维向量或者有4个元素的数组，并且已经被初始化。在这种情况下，<code>q = vec4;</code> 的作用是将 <code>vec4</code> 中的值按顺序赋给四元数 <code>q</code>。具体来说，vec4中的第一个值赋给q的实部w，其余的值分别赋给q的虚部x, y, z。</p><p>注意，Eigen中的 <code>Quaterniond</code> 类使得四元数可以直接从一个四维向量（Eigen::Vector4d）进行初始化。因此，当你写 <code>q = vec4;</code> 时，vec4 中的值就会直接复制到四元数 q。</p><p>这段代码看起来应该是假设 <code>vec4</code> 已经被初始化并且包含了四元数所需要的4个值。如果这不是你代码的情境，需要调整来适应vec4的具体定义方式。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">Vector3d v3d_a <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Vector3d构造一：\n"</span> <span class="token operator">&lt;&lt;</span> v3d_a <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>Vector3d v3d_b<span class="token punctuation">;</span>v3d_b <span class="token operator">&lt;&lt;</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">;</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Vector3d构造二：\n"</span> <span class="token operator">&lt;&lt;</span> v3d_b <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>这其中的v3d_b <span class="token operator">&lt;&lt;</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">;</span>解释一下  <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在你的代码中，<code>Vector3d v3d_b;</code>声明了一个 <code>Vector3d</code> 类型的对象 <code>v3d_b</code>，并且<code>v3d_b &lt;&lt; 4, 5, 6;</code>这一行代码中的 <code>&lt;&lt;</code> 运算符被重载来实现特定的功能。</p><p><code>Vector3d</code> 存在于很多数学库中，比如Eigen库，这是一个用于表示三维向量的类。在这个类中，可能定义了一个 <code>&lt;&lt;</code> 运算符重载函数，可以用于对这个类的对象进行赋值。</p><p>那么<code>v3d_b &lt;&lt; 4, 5, 6;</code>这行代码所做的就是将 <code>4, 5, 6</code> 这三个值通过 <code>&lt;&lt;</code> 运算符赋给 <code>v3d_b</code>。因此 <code>v3d_b</code> 向量的三个分量值就被设置为了 <code>4, 5, 6</code>。</p><p>这个 <code>&lt;&lt;</code> 运算符的使用方式，有点类似于数据流的插入操作，提供了一种简短的连续赋值方式，使得代码更加简洁明了。</p><p>然而，你需要确认一下这段代码的具体语境，因为 <code>&lt;&lt;</code> 运算符的具体行为取决于它如何在 <code>Vector3d</code> 类中被重载。只有在确切知道这个类的实现情况，我们才能准确解析这里的 <code>&lt;&lt;</code> 运算符到底做了什么。如果有可能，我建议你查看一下 <code>Vector3d</code> 类的文档或源码，来找出 <code>&lt;&lt;</code> 运算符重载的具体行为。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">int</span> continously_called_times_<span class="token punctuation">{</span><span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这行代码定义了一个名为 continously_called_times_ 的 int 类型变量，并且将其初始化为 0。详细解释如下：<br>int 是一个关键字，代表这个变量的数据类型是整数。<br>continously_called_times_ 是这个变量的名称。在变量名后面加上下划线 _ 是一种命名习惯，常用于标识类或结构体的私有成员。这不是必需的，只是一种编程风格。<br>{0} 是使用 {} 初始化器来初始化这个整数变量。这和 =0 功能上是一样的，都表示将变量初始化为 0。<br>因此，这行代码的含义是“定义一个名为 continously_called_times_ 的整数变量，并将其初始化为 0”。</p><hr><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">      <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>target_type_ <span class="token operator">==</span> TARGET_TYPE<span class="token double-colon punctuation">::</span>PRESET_TARGET<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>          <span class="token punctuation">(</span>wp_id_ <span class="token operator">&lt;</span> waypoint_num_ <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>          <span class="token punctuation">(</span>end_pt_ <span class="token operator">-</span> pos<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">norm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> no_replan_thresh_<span class="token punctuation">)</span>解释一下<span class="token operator">&lt;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>在这段代码中， <code>&lt;</code> 是一个比较运算符，它用于比较两个值的大小。 </p><p>如果左边的值小于右边的值，那么表达式的结果就是 true，否则结果就是 false。</p><p>所以， <code>(wp_id_ &lt; waypoint_num_ - 1)</code> 这个表达式的含义是判断 <code>wp_id_</code> 是否小于 <code>waypoint_num_ - 1</code>。 如果 <code>wp_id_</code> 的值小于 <code>waypoint_num_ - 1</code>，那么这个表达式的结果就是 true；否则，结果就是 false。</p><p> <code>(end_pt_ - pos).norm() &lt; no_replan_thresh_</code> 这个表达式则是判断两点之间的距离（<code>(end_pt_ - pos).norm()</code>）是否小于 <code>no_replan_thresh_</code>。 如果距离小于 <code>no_replan_thresh_</code>，表达式的结果就是 true，否则就是 false。</p><p>这个 <code>if</code> 表达式则是要求三个条件都满足（也就是都为 true）： <code>target_type_</code> 等于 <code>TARGET_TYPE::PRESET_TARGET</code>，<code>wp_id_</code> 小于 <code>waypoint_num_ - 1</code>，以及两点之间的距离小于 <code>no_replan_thresh_</code>。</p><p>只有当这三个条件都满足时，<code>if</code> 语句中的代码块才会被执行。</p><hr><p>在C++编程中，<code>::</code>符号是一个范围解析运算符，用来指定命名空间或类或者枚举类型内部的具体元素。</p><p>在你给出的这段代码中，<code>TARGET_TYPE</code>是一个枚举类型，它包括<code>MANUAL_TARGET</code>, <code>PRESET_TARGET</code>, <code>REFENCE_PATH</code>这三个枚举值。当我们想要引用枚举中的一个值时，通常需要在该值前面加上枚举类型的名字和<code>::</code>，以此来明确指出这个值是属于哪个枚举类型的。</p><p>所以，<code>TARGET_TYPE::PRESET_TARGET</code>就是用来引用<code>TARGET_TYPE</code>这个枚举类型中的<code>PRESET_TARGET</code>枚举值。相应地，如果我们想要引用<code>TARGET_TYPE</code>中的其他值，也需要使用同样的方式，例如<code>TARGET_TYPE::MANUAL_TARGET</code>或<code>TARGET_TYPE::REFENCE_PATH</code>。</p><hr><p><code>&lt;&lt;</code> 在 C++ 中主要有两个用途。</p><ol><li>作为位运算符：<code>&lt;&lt;</code>是位左移运算符。它的功能是将左操作数的所有位向左移动指定的位数（由右操作数指定）。例如， <code>a &lt;&lt; 2</code> 将 <code>a</code> 的所有位向左移动两位，原来 <code>a</code> 最右边的两位将被丢弃，左边空出来的两位填充为0。</li></ol><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// 二进制形式为 0000 0101</span><span class="token keyword">int</span> b <span class="token operator">=</span> a <span class="token operator">&lt;&lt;</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// 结果为 10，二进制形式为 0000 1010</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><ol start="2"><li>作为流插入运算符：如果操作数是 iostream 对象（如 std::cout 或 std::cin 等），那么 <code>&lt;&lt;</code> 就变成了流插入运算符。在这种情况下，它被用来插入数据到流中（例如，输出数据到控制台或写入数据到文件等）。</li></ol><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Hello, World!"</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>这行代码的意思是将 “Hello, World!” 这个字符串插入到 cout 流中，也就是将其输出到控制台。</p><hr><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"> <span class="token keyword">switch</span> <span class="token punctuation">(</span>exec_state_<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> INIT<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>have_odom_<span class="token punctuation">)</span>   <span class="token punctuation">{</span>     <span class="token keyword">goto</span> force_return<span class="token punctuation">;</span>     <span class="token comment">// return;</span>   <span class="token punctuation">}</span>   <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>WAIT_TARGET<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">case</span> WAIT_TARGET<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>have_target_ <span class="token operator">||</span> <span class="token operator">!</span>have_trigger_<span class="token punctuation">)</span>     <span class="token keyword">goto</span> force_return<span class="token punctuation">;</span>   <span class="token comment">// return;</span>   <span class="token keyword">else</span>   <span class="token punctuation">{</span>     <span class="token comment">// if ( planner_manager_-&gt;pp_.drone_id &lt;= 0 )</span>     <span class="token comment">// {</span>     <span class="token comment">//   changeFSMExecState(GEN_NEW_TRAJ, "FSM");</span>     <span class="token comment">// }</span>     <span class="token comment">// else</span>     <span class="token comment">// {</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>SEQUENTIAL_START<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>     <span class="token comment">// }</span>   <span class="token punctuation">}</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">case</span> SEQUENTIAL_START<span class="token operator">:</span> <span class="token comment">// for swarm 单机用不到</span> <span class="token punctuation">{</span>   <span class="token comment">// cout &lt;&lt; "id=" &lt;&lt; planner_manager_-&gt;pp_.drone_id &lt;&lt; " have_recv_pre_agent_=" &lt;&lt; have_recv_pre_agent_ &lt;&lt; endl;</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span>planner_manager_<span class="token operator">-&gt;</span>pp_<span class="token punctuation">.</span>drone_id <span class="token operator">&lt;=</span> <span class="token number">0</span> <span class="token operator">||</span> <span class="token punctuation">(</span>planner_manager_<span class="token operator">-&gt;</span>pp_<span class="token punctuation">.</span>drone_id <span class="token operator">&gt;=</span> <span class="token number">1</span> <span class="token operator">&amp;&amp;</span> have_recv_pre_agent_<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token comment">//单机，drone_id=0</span>   <span class="token punctuation">{</span>     <span class="token keyword">if</span> <span class="token punctuation">(</span>have_odom_ <span class="token operator">&amp;&amp;</span> have_target_ <span class="token operator">&amp;&amp;</span> have_trigger_<span class="token punctuation">)</span>     <span class="token punctuation">{</span>       <span class="token keyword">bool</span> success <span class="token operator">=</span> <span class="token function">planFromGlobalTraj</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// zx-todo</span>       <span class="token keyword">if</span> <span class="token punctuation">(</span>success<span class="token punctuation">)</span>       <span class="token punctuation">{</span>         <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>EXEC_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>         <span class="token function">publishSwarmTrajs</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>       <span class="token punctuation">}</span>       <span class="token keyword">else</span>       <span class="token punctuation">{</span>         <span class="token function">ROS_ERROR</span><span class="token punctuation">(</span><span class="token string">"Failed to generate the first trajectory!!!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>         <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>SEQUENTIAL_START<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>       <span class="token punctuation">}</span>     <span class="token punctuation">}</span>     <span class="token keyword">else</span>     <span class="token punctuation">{</span>       <span class="token function">ROS_ERROR</span><span class="token punctuation">(</span><span class="token string">"No odom or no target! have_odom_=%d, have_target_=%d"</span><span class="token punctuation">,</span> have_odom_<span class="token punctuation">,</span> have_target_<span class="token punctuation">)</span><span class="token punctuation">;</span>     <span class="token punctuation">}</span>   <span class="token punctuation">}</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/*Second：生成全局轨迹后，执行以下状态*/</span> <span class="token keyword">case</span> GEN_NEW_TRAJ<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token comment">// Eigen::Vector3d rot_x = odom_orient_.toRotationMatrix().block(0, 0, 3, 1);</span>   <span class="token comment">// start_yaw_(0)         = atan2(rot_x(1), rot_x(0));</span>   <span class="token comment">// start_yaw_(1) = start_yaw_(2) = 0.0;</span>   <span class="token comment">/*Third 进行重规划优化*/</span>   <span class="token keyword">bool</span> success <span class="token operator">=</span> <span class="token function">planFromGlobalTraj</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// zx-todo</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span>success<span class="token punctuation">)</span>   <span class="token punctuation">{</span>     <span class="token comment">/*开始执行，此时如果检测到有碰撞会进行重规划*/</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>EXEC_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>     flag_escape_emergency_ <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>     <span class="token function">publishSwarmTrajs</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">else</span>   <span class="token punctuation">{</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>GEN_NEW_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">case</span> REPLAN_TRAJ<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">planFromCurrentTraj</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span>   <span class="token punctuation">{</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>EXEC_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>     <span class="token function">publishSwarmTrajs</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">else</span>   <span class="token punctuation">{</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>REPLAN_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token comment">/*Five 执行*/</span> <span class="token keyword">case</span> EXEC_TRAJ<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token comment">/* determine if need to replan */</span>   LocalTrajData <span class="token operator">*</span>info <span class="token operator">=</span> <span class="token operator">&amp;</span>planner_manager_<span class="token operator">-&gt;</span>local_data_<span class="token punctuation">;</span>   ros<span class="token double-colon punctuation">::</span>Time time_now <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token keyword">double</span> t_cur <span class="token operator">=</span> <span class="token punctuation">(</span>time_now <span class="token operator">-</span> info<span class="token operator">-&gt;</span>start_time_<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toSec</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   t_cur <span class="token operator">=</span> <span class="token function">min</span><span class="token punctuation">(</span>info<span class="token operator">-&gt;</span>duration_<span class="token punctuation">,</span> t_cur<span class="token punctuation">)</span><span class="token punctuation">;</span>   Eigen<span class="token double-colon punctuation">::</span>Vector3d pos <span class="token operator">=</span> info<span class="token operator">-&gt;</span>position_traj_<span class="token punctuation">.</span><span class="token function">evaluateDeBoorT</span><span class="token punctuation">(</span>t_cur<span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">/* &amp;&amp; (end_pt_ - pos).norm() &lt; 0.5 */</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>target_type_ <span class="token operator">==</span> TARGET_TYPE<span class="token double-colon punctuation">::</span>PRESET_TARGET<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>       <span class="token punctuation">(</span>wp_id_ <span class="token operator">&lt;</span> waypoint_num_ <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span>       <span class="token punctuation">(</span>end_pt_ <span class="token operator">-</span> pos<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">norm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> no_replan_thresh_<span class="token punctuation">)</span>   <span class="token punctuation">{</span>     wp_id_<span class="token operator">++</span><span class="token punctuation">;</span>     <span class="token function">planNextWaypoint</span><span class="token punctuation">(</span>wps_<span class="token punctuation">[</span>wp_id_<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>local_target_pt_ <span class="token operator">-</span> end_pt_<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">norm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">1e-3</span><span class="token punctuation">)</span> <span class="token comment">// close to the global target</span>   <span class="token punctuation">{</span>     <span class="token keyword">if</span> <span class="token punctuation">(</span>t_cur <span class="token operator">&gt;</span> info<span class="token operator">-&gt;</span>duration_ <span class="token operator">-</span> <span class="token number">1e-2</span><span class="token punctuation">)</span>     <span class="token punctuation">{</span>       have_target_ <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>       have_trigger_ <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>       <span class="token keyword">if</span> <span class="token punctuation">(</span>target_type_ <span class="token operator">==</span> TARGET_TYPE<span class="token double-colon punctuation">::</span>PRESET_TARGET<span class="token punctuation">)</span>       <span class="token punctuation">{</span>         wp_id_ <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>         <span class="token function">planNextWaypoint</span><span class="token punctuation">(</span>wps_<span class="token punctuation">[</span>wp_id_<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>       <span class="token punctuation">}</span>       <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>WAIT_TARGET<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>       <span class="token keyword">goto</span> force_return<span class="token punctuation">;</span>       <span class="token comment">// return;</span>     <span class="token punctuation">}</span>     <span class="token comment">/* Six 继续重规划*/</span>     <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>end_pt_ <span class="token operator">-</span> pos<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">norm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&gt;</span> no_replan_thresh_ <span class="token operator">&amp;&amp;</span> t_cur <span class="token operator">&gt;</span> replan_thresh_<span class="token punctuation">)</span>     <span class="token punctuation">{</span>       <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>REPLAN_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>     <span class="token punctuation">}</span>   <span class="token punctuation">}</span>   <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>t_cur <span class="token operator">&gt;</span> replan_thresh_<span class="token punctuation">)</span>   <span class="token punctuation">{</span>     <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>REPLAN_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">case</span> EMERGENCY_STOP<span class="token operator">:</span> <span class="token punctuation">{</span>   <span class="token keyword">if</span> <span class="token punctuation">(</span>flag_escape_emergency_<span class="token punctuation">)</span> <span class="token comment">// Avoiding repeated calls</span>   <span class="token punctuation">{</span>     <span class="token function">callEmergencyStop</span><span class="token punctuation">(</span>odom_pos_<span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   <span class="token keyword">else</span>   <span class="token punctuation">{</span>     <span class="token keyword">if</span> <span class="token punctuation">(</span>enable_fail_safe_ <span class="token operator">&amp;&amp;</span> odom_vel_<span class="token punctuation">.</span><span class="token function">norm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0.1</span><span class="token punctuation">)</span>       <span class="token function">changeFSMExecState</span><span class="token punctuation">(</span>GEN_NEW_TRAJ<span class="token punctuation">,</span> <span class="token string">"FSM"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token punctuation">}</span>   flag_escape_emergency_ <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>   <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//这就是有限状态机吗</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>是的，这个代码是一种称为有限状态机（Finite State Machine, FSM）的设计模式的示例。 </p><p>有限状态机是一种用来模拟对象状态转移的模型。在这个模型中，系统可以存在于一组有限的状态中，并且在某个时间只能处于其中一个状态。系统的状态可以根据一些条件或触发事件从一个状态转移到另一个状态。</p><p>在你给出的代码中，<code>EXEC_STATE</code> 枚举定义了所有可能的状态（如 <code>INIT, WAIT_TARGET, SEQUENTIAL_START, GEN_NEW_TRAJ, EXEC_TRAJ, REPLAN_TRAJ, EMERGENCY_STOP</code> 等），然后在 <code>switch (exec_state_)</code> 语句中，系统根据当前的 <code>exec_state_</code> 值来决定下一步要执行的操作。当满足某些条件时，状态会改变（如 <code>changeFSMExecState(WAIT_TARGET, "FSM")</code>），从而导致在下一次 <code>switch</code> 语句中执行不同的代码段。</p><p>有限状态机在处理具有多个条件和转变的系统（如游戏、工作流程、实物模拟等）时非常有用，尤其是当有些行为只在某些特定的状态下发生，或者当某些事件改变系统状态时。在这段代码中，有限状态机被用于控制和管理一台无人机的飞行阶段（例如：初始化、等待目标、开始导航、执行轨迹、重新规划轨迹，紧急停止等），以及相应的动作和转变条件。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;当你想将类定义在某个命名空间中时，可以这样做：&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-cpp&quot; data-language=&quot;cpp&quot;&gt;&lt;code cla</summary>
      
    
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/categories/ROS/"/>
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/tags/ROS/"/>
    
  </entry>
  
  <entry>
    <title>launch文件</title>
    <link href="http://liam-xander.github.io/2024/04/10/202404someday/"/>
    <id>http://liam-xander.github.io/2024/04/10/202404someday/</id>
    <published>2024-04-10T14:34:00.000Z</published>
    <updated>2024-04-11T06:51:07.638Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>launch</span><span class="token punctuation">&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>global_env_pcd2_topic<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/random_forest/all_map<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span><span class="token comment">&lt;!-- 这个参数是用来指定一个主题的，主题的名称是`/random_forest/all_map`。 --&gt;</span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>map_size_x<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>map_size_y<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>50.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>map_size_z<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>8.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>origin_x<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span> -25.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>origin_y<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span> -25.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>origin_z<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span> -1.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>resolution<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.5<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>steer_length<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>2.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>search_radius<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>6.0<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>search_time<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>0.2<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>arg</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>max_tree_node_nums<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>5000<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>node</span> <span class="token attr-name">pkg</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>path_finder<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>path_finder<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>path_finder_node<span class="token punctuation">"</span></span> <span class="token attr-name">output</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>screen<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>remap</span> <span class="token attr-name">from</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/global_cloud<span class="token punctuation">"</span></span> <span class="token attr-name">to</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg global_env_pcd2_topic)<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/origin_x<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg origin_x)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/origin_y<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg origin_y)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/origin_z<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg origin_z)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/map_size_x<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg map_size_x)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/map_size_y<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg map_size_y)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/map_size_z<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg map_size_z)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>occ_map/resolution<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg resolution)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>RRT_Star/steer_length<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg steer_length)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>RRT_Star/search_radius<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg search_radius)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>RRT_Star/search_time<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg search_time)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>double<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>param</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>RRT_Star/max_tree_node_nums<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(arg max_tree_node_nums)<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>int<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>node</span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>launch</span><span class="token punctuation">&gt;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这段代码是一个XML格式的ROS（Robot Operating System）的<code>.launch</code>文件，用于配置和启动ROS节点。</p><ol><li><p><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;</code> 这一行声明了这是一个XML文件，版本是1.0，编码方式是utf-8。</p></li><li><p><code>&lt;launch&gt;</code> 这是开始一个launch文件的标记。</p></li><li><p><code>&lt;arg name="..." value="..."/&gt;</code> 这些行定义了一些参数的值，可以在launch文件中引用。例如，<code>&lt;arg name="global_env_pcd2_topic" value="/random_forest/all_map" /&gt;</code>定义了一个名为<code>global_env_pcd2_topic</code>的参数，值为<code>/random_forest/all_map</code>。其他<code>&lt;arg&gt;</code>行以相同的方式声明参数。</p></li><li><p><code>&lt;node pkg="path_finder" type="path_finder" name="path_finder_node" output="screen"&gt;</code> 这一行启动一个名为”path_finder_node”的ROS节点，它处于”path_finder”这个包中，其类型为”path_finder”。输出将显示在屏幕上。</p></li><li><p><code>&lt;remap from="/global_cloud" to="$(arg global_env_pcd2_topic)"/&gt;</code> 这一行重新映射<code>/global_cloud</code>主题到<code>global_env_pcd2_topic</code>参数所指定的值，也就是<code>/random_forest/all_map</code>。</p></li><li><p><code>&lt;param name="..." value="$(arg ...)" type="..."/&gt;</code> 这些行为节点中的参数设置值。例如，<code>&lt;param name="occ_map/origin_x" value="$(arg origin_x)" type="double"/&gt;</code>在节点的<code>occ_map</code>命名空间内设置了<code>origin_x</code>参数的值，值为之前定义的<code>origin_x</code>的参数的值，类型为<code>double</code>。其他的<code>&lt;param&gt;</code>行以同样的方式定义节点参数。</p></li><li><p><code>&lt;/node&gt;</code> 这是结束一个节点标记。</p></li><li><p><code>&lt;/launch&gt;</code> 这是结束一个launch文件的标记。</p></li></ol><p>这个.launch文件首先声明了一些参数的值，然后启动一个名为 “path_finder_node” 的节点，并为这个节点的部分参数设定了值。 </p><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token prolog">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>launch</span><span class="token punctuation">&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>node</span> <span class="token attr-name">pkg</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rviz<span class="token punctuation">"</span></span> <span class="token attr-name">output</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>screen<span class="token punctuation">"</span></span> <span class="token attr-name">args</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>-d $(find path_finder)/launch/traj.rviz<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span> <span class="token attr-name">file</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(find path_finder)/launch/map.launch<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>include</span> <span class="token attr-name">file</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>$(find path_finder)/launch/test_planners.launch<span class="token punctuation">"</span></span><span class="token punctuation">/&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>launch</span><span class="token punctuation">&gt;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这段代码是ROS（机器人操作系统）的启动文件（<code>.launch</code>）的一部分，其中包含了一连串为ROS节点(node)的命令。当你运行这个 <code>.launch</code>文件时，它会启动一系列的ROS节点。</p><ol><li><p><code>&lt;launch&gt;</code> 开始一个launch文件的标记。</p></li><li><p><code>&lt;node pkg="rviz" type="rviz" name="rviz" output="screen" args="-d $(find path_finder)/launch/traj.rviz"/&gt;</code> 启动一个名为<code>rviz</code>的ROS节点，该节点来自<code>rviz</code>包，其类型也为<code>rviz</code>。输出将会在屏幕上显示。<code>args</code>参数表示启动rviz时传递给它的命令行参数。在这里，<code>-d $(find path_finder)/launch/traj.rviz</code> 表示启动rviz时加载 <code>$(find path_finder)/launch/traj.rviz</code> 这个rviz配置文件。<code>$(find path_finder)</code>是ROS中的一种用于查找给定包（在这里是<code>path_finder</code>包）路径的方法。</p></li><li><p><code>&lt;include file="$(find path_finder)/launch/map.launch"/&gt;</code> 在当前launch文件内引入另一个launch文件 <code>$(find path_finder)/launch/map.launch</code>。<code>$(find path_finder)</code>会被替换为<code>path_finder</code>包的路径，因此整个路径是<code>path_finder</code>包中<code>launch</code>目录下的<code>map.launch</code>文件。</p></li><li><p><code>&lt;include file="$(find path_finder)/launch/test_planners.launch"/&gt;</code> 同理，这行也是在当前launch文件内引入另一个launch文件<code>test_planners.launch</code>，位置是在<code>path_finder</code>包中<code>launch</code>目录下。</p></li><li><p><code>&lt;/launch&gt;</code> 结束一个launch文件的标记。</p></li></ol><p>简单来说，这个 <code>.launch</code> 文件首先启动 rviz 并加载指定的 rviz 配置文件，然后启动两个额外的 ROS 节点，它们都在 <code>path_finder</code> 包的 <code>launch</code> 目录下。 </p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;pre class=&quot;line-numbers language-markup&quot; data-language=&quot;markup&quot;&gt;&lt;code class=&quot;language-markup&quot;&gt;&lt;spa</summary>
      
    
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/categories/ROS/"/>
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/tags/ROS/"/>
    
  </entry>
  
  <entry>
    <title>对Astar算法及相关知识点的整理</title>
    <link href="http://liam-xander.github.io/2024/03/23/20240323/"/>
    <id>http://liam-xander.github.io/2024/03/23/20240323/</id>
    <published>2024-03-23T14:50:00.000Z</published>
    <updated>2024-03-23T21:17:50.840Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><h4 id="Astar-searcher-cpp"><a href="#Astar-searcher-cpp" class="headerlink" title="Astar_searcher.cpp"></a>Astar_searcher.cpp</h4><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"Astar_searcher.h"</span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> Eigen<span class="token punctuation">;</span><span class="token keyword">bool</span> tie_break <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">initGridMap</span><span class="token punctuation">(</span><span class="token keyword">double</span> _resolution<span class="token punctuation">,</span> Vector3d global_xyz_l<span class="token punctuation">,</span> Vector3d global_xyz_u<span class="token punctuation">,</span> <span class="token keyword">int</span> max_x_id<span class="token punctuation">,</span> <span class="token keyword">int</span> max_y_id<span class="token punctuation">,</span> <span class="token keyword">int</span> max_z_id<span class="token punctuation">)</span><span class="token punctuation">{</span>       gl_xl <span class="token operator">=</span> <span class="token function">global_xyz_l</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    gl_yl <span class="token operator">=</span> <span class="token function">global_xyz_l</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    gl_zl <span class="token operator">=</span> <span class="token function">global_xyz_l</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    gl_xu <span class="token operator">=</span> <span class="token function">global_xyz_u</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    gl_yu <span class="token operator">=</span> <span class="token function">global_xyz_u</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    gl_zu <span class="token operator">=</span> <span class="token function">global_xyz_u</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        GLX_SIZE <span class="token operator">=</span> max_x_id<span class="token punctuation">;</span>    GLY_SIZE <span class="token operator">=</span> max_y_id<span class="token punctuation">;</span>    GLZ_SIZE <span class="token operator">=</span> max_z_id<span class="token punctuation">;</span>    GLYZ_SIZE  <span class="token operator">=</span> GLY_SIZE <span class="token operator">*</span> GLZ_SIZE<span class="token punctuation">;</span>    GLXYZ_SIZE <span class="token operator">=</span> GLX_SIZE <span class="token operator">*</span> GLYZ_SIZE<span class="token punctuation">;</span>    resolution <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    inv_resolution <span class="token operator">=</span> <span class="token number">1.0</span> <span class="token operator">/</span> _resolution<span class="token punctuation">;</span>        data <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">uint8_t</span><span class="token punctuation">[</span>GLXYZ_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token function">memset</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> GLXYZ_SIZE <span class="token operator">*</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token keyword">uint8_t</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        GridNodeMap <span class="token operator">=</span> <span class="token keyword">new</span> GridNodePtr <span class="token operator">*</span><span class="token operator">*</span> <span class="token punctuation">[</span>GLX_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> GLX_SIZE<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>        GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> GridNodePtr <span class="token operator">*</span> <span class="token punctuation">[</span>GLY_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> GLY_SIZE<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>            GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> GridNodePtr <span class="token punctuation">[</span>GLZ_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>            <span class="token keyword">for</span><span class="token punctuation">(</span> <span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">&lt;</span> GLZ_SIZE<span class="token punctuation">;</span>k<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>                Vector3i <span class="token function">tmpIdx</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span>j<span class="token punctuation">,</span>k<span class="token punctuation">)</span><span class="token punctuation">;</span>                Vector3d pos <span class="token operator">=</span> <span class="token function">gridIndex2coord</span><span class="token punctuation">(</span>tmpIdx<span class="token punctuation">)</span><span class="token punctuation">;</span>                GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">GridNode</span><span class="token punctuation">(</span>tmpIdx<span class="token punctuation">,</span> pos<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">resetGrid</span><span class="token punctuation">(</span>GridNodePtr ptr<span class="token punctuation">)</span><span class="token punctuation">{</span>    ptr<span class="token operator">-&gt;</span>id <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>    ptr<span class="token operator">-&gt;</span>cameFrom <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>    ptr<span class="token operator">-&gt;</span>gScore <span class="token operator">=</span> inf<span class="token punctuation">;</span>    ptr<span class="token operator">-&gt;</span>fScore <span class="token operator">=</span> inf<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">resetUsedGrids</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>       <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> GLX_SIZE <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> GLY_SIZE <span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>            <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">&lt;</span> GLZ_SIZE <span class="token punctuation">;</span> k<span class="token operator">++</span><span class="token punctuation">)</span>                <span class="token function">resetGrid</span><span class="token punctuation">(</span>GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">setObs</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">double</span> coord_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">double</span> coord_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">double</span> coord_z<span class="token punctuation">)</span><span class="token punctuation">{</span>       <span class="token keyword">if</span><span class="token punctuation">(</span> coord_x <span class="token operator">&lt;</span> gl_xl  <span class="token operator">||</span> coord_y <span class="token operator">&lt;</span> gl_yl  <span class="token operator">||</span> coord_z <span class="token operator">&lt;</span>  gl_zl <span class="token operator">||</span>         coord_x <span class="token operator">&gt;=</span> gl_xu <span class="token operator">||</span> coord_y <span class="token operator">&gt;=</span> gl_yu <span class="token operator">||</span> coord_z <span class="token operator">&gt;=</span> gl_zu <span class="token punctuation">)</span>        <span class="token keyword">return</span><span class="token punctuation">;</span>    <span class="token keyword">int</span> idx_x <span class="token operator">=</span> <span class="token generic-function"><span class="token function">static_cast</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span> <span class="token punctuation">(</span>coord_x <span class="token operator">-</span> gl_xl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">int</span> idx_y <span class="token operator">=</span> <span class="token generic-function"><span class="token function">static_cast</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span> <span class="token punctuation">(</span>coord_y <span class="token operator">-</span> gl_yl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">int</span> idx_z <span class="token operator">=</span> <span class="token generic-function"><span class="token function">static_cast</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span> <span class="token punctuation">(</span>coord_z <span class="token operator">-</span> gl_zl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span>          data<span class="token punctuation">[</span>idx_x <span class="token operator">*</span> GLYZ_SIZE <span class="token operator">+</span> idx_y <span class="token operator">*</span> GLZ_SIZE <span class="token operator">+</span> idx_z<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token punctuation">}</span>vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">getVisitedNodes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>       vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> visited_nodes<span class="token punctuation">;</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> GLX_SIZE<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> GLY_SIZE<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span>            <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator">&lt;</span> GLZ_SIZE<span class="token punctuation">;</span> k<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>                   <span class="token keyword">if</span><span class="token punctuation">(</span>GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator">-&gt;</span>id <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">// visualize all nodes in open and close list</span><span class="token comment">//                if(GridNodeMap[i][j][k]-&gt;id == -1)  // visualize nodes in close list only TODO: careful</span>                    visited_nodes<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>GridNodeMap<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator">-&gt;</span>coord<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"getVisitedNodes函数结束"</span>  <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    <span class="token function">ROS_WARN</span><span class="token punctuation">(</span><span class="token string">"visited_nodes size : %d"</span><span class="token punctuation">,</span> visited_nodes<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">return</span> visited_nodes<span class="token punctuation">;</span><span class="token punctuation">}</span>Vector3d <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">gridIndex2coord</span><span class="token punctuation">(</span><span class="token keyword">const</span> Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span>    Vector3d pt<span class="token punctuation">;</span>    <span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">)</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token operator">*</span> resolution <span class="token operator">+</span> gl_xl<span class="token punctuation">;</span>    <span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">)</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token operator">*</span> resolution <span class="token operator">+</span> gl_yl<span class="token punctuation">;</span>    <span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">)</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">0.5</span><span class="token punctuation">)</span> <span class="token operator">*</span> resolution <span class="token operator">+</span> gl_zl<span class="token punctuation">;</span>    <span class="token keyword">return</span> pt<span class="token punctuation">;</span><span class="token punctuation">}</span>Vector3i <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">coord2gridIndex</span><span class="token punctuation">(</span><span class="token keyword">const</span> Vector3d <span class="token operator">&amp;</span> pt<span class="token punctuation">)</span> <span class="token punctuation">{</span>    Vector3i idx<span class="token punctuation">;</span>    idx <span class="token operator">&lt;&lt;</span>  <span class="token function">min</span><span class="token punctuation">(</span> <span class="token function">max</span><span class="token punctuation">(</span> <span class="token keyword">int</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">-</span> gl_xl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> GLX_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            <span class="token function">min</span><span class="token punctuation">(</span> <span class="token function">max</span><span class="token punctuation">(</span> <span class="token keyword">int</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> gl_yl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> GLY_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>            <span class="token function">min</span><span class="token punctuation">(</span> <span class="token function">max</span><span class="token punctuation">(</span> <span class="token keyword">int</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token function">pt</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">-</span> gl_zl<span class="token punctuation">)</span> <span class="token operator">*</span> inv_resolution<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> GLZ_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token keyword">return</span> idx<span class="token punctuation">;</span><span class="token punctuation">}</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">coordRounding</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token operator">&amp;</span> coord<span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token function">gridIndex2coord</span><span class="token punctuation">(</span><span class="token function">coord2gridIndex</span><span class="token punctuation">(</span>coord<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span> <span class="token keyword">bool</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">isOccupied</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token function">isOccupied</span><span class="token punctuation">(</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">index</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">index</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span> <span class="token keyword">bool</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">isFree</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token function">isFree</span><span class="token punctuation">(</span><span class="token function">index</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">index</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">index</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span> <span class="token keyword">bool</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">isOccupied</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_z<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span>    <span class="token keyword">return</span>  <span class="token punctuation">(</span>idx_x <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_x <span class="token operator">&lt;</span> GLX_SIZE <span class="token operator">&amp;&amp;</span> idx_y <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_y <span class="token operator">&lt;</span> GLY_SIZE <span class="token operator">&amp;&amp;</span> idx_z <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_z <span class="token operator">&lt;</span> GLZ_SIZE <span class="token operator">&amp;&amp;</span>             <span class="token punctuation">(</span>data<span class="token punctuation">[</span>idx_x <span class="token operator">*</span> GLYZ_SIZE <span class="token operator">+</span> idx_y <span class="token operator">*</span> GLZ_SIZE <span class="token operator">+</span> idx_z<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span> <span class="token keyword">bool</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">isFree</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_z<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span>    <span class="token keyword">return</span> <span class="token punctuation">(</span>idx_x <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_x <span class="token operator">&lt;</span> GLX_SIZE <span class="token operator">&amp;&amp;</span> idx_y <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_y <span class="token operator">&lt;</span> GLY_SIZE <span class="token operator">&amp;&amp;</span> idx_z <span class="token operator">&gt;=</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> idx_z <span class="token operator">&lt;</span> GLZ_SIZE <span class="token operator">&amp;&amp;</span>            <span class="token punctuation">(</span>data<span class="token punctuation">[</span>idx_x <span class="token operator">*</span> GLYZ_SIZE <span class="token operator">+</span> idx_y <span class="token operator">*</span> GLZ_SIZE <span class="token operator">+</span> idx_z<span class="token punctuation">]</span> <span class="token operator">&lt;</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">AstarGetSucc</span><span class="token punctuation">(</span>GridNodePtr currentPtr<span class="token punctuation">,</span> vector<span class="token operator">&lt;</span>GridNodePtr<span class="token operator">&gt;</span> <span class="token operator">&amp;</span> neighborPtrSets<span class="token punctuation">,</span> vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> <span class="token operator">&amp;</span> edgeCostSets<span class="token punctuation">)</span><span class="token comment">//获取当前节点的相邻节点</span><span class="token punctuation">{</span>       std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"进入AstarGetSucc函数，开始获取当前节点的相邻节点"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    neighborPtrSets<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//清空neighborPtrSets</span>    <span class="token comment">// Note: the pointers in this set copy pointers to GridNodeMap</span>    edgeCostSets<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//清空edgeCostSets</span>    <span class="token comment">/*    *    STEP 4: finish AstarPathFinder::AstarGetSucc yourself     please write your code below    *    *    */</span>    <span class="token comment">// idea index -&gt; coordinate -&gt; edgecost</span>    <span class="token keyword">if</span><span class="token punctuation">(</span>currentPtr <span class="token operator">==</span> <span class="token keyword">nullptr</span><span class="token punctuation">)</span><span class="token comment">//如果当前节点为空，输出错误信息</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Error: Current pointer is null!"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3i thisNode <span class="token operator">=</span> currentPtr <span class="token operator">-&gt;</span> index<span class="token punctuation">;</span><span class="token comment">//获取当前节点的索引</span>    <span class="token keyword">int</span> this_x <span class="token operator">=</span> thisNode<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//获取当前节点的x坐标</span>    <span class="token keyword">int</span> this_y <span class="token operator">=</span> thisNode<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">int</span> this_z <span class="token operator">=</span> thisNode<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    <span class="token keyword">auto</span> this_coord <span class="token operator">=</span> currentPtr <span class="token operator">-&gt;</span> coord<span class="token punctuation">;</span><span class="token comment">//获取当前节点的坐标</span>    <span class="token keyword">int</span>  n_x<span class="token punctuation">,</span> n_y<span class="token punctuation">,</span> n_z<span class="token punctuation">;</span><span class="token comment">//相邻节点的x,y,z坐标</span>    <span class="token keyword">double</span> dist<span class="token punctuation">;</span><span class="token comment">//当前节点到相邻节点的距离</span>    GridNodePtr temp_ptr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span><span class="token comment">//临时指针</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3d n_coord<span class="token punctuation">;</span><span class="token comment">//相邻节点的坐标</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>i <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token operator">++</span>i <span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token comment">// search in 3D space</span>        <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>j <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token operator">++</span>j <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//遍历相邻节点</span>            <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>k <span class="token operator">&lt;=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token operator">++</span>k<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//遍历相邻节点,i,j,k分别表示相邻节点在x,y,z方向上的偏移</span>                <span class="token keyword">if</span><span class="token punctuation">(</span> i <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> j <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> k <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token comment">//如果i,j,k都为0，跳过当前节点</span>                    <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// to avoid this node,中文：跳过当前节点</span>                n_x <span class="token operator">=</span> this_x <span class="token operator">+</span> i<span class="token punctuation">;</span><span class="token comment">//计算相邻节点的x坐标</span>                n_y <span class="token operator">=</span> this_y <span class="token operator">+</span> j<span class="token punctuation">;</span>                n_z <span class="token operator">=</span> this_z <span class="token operator">+</span> k<span class="token punctuation">;</span>                <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token generic-function"><span class="token function">n_x</span> <span class="token generic class-name"><span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>n_x <span class="token operator">&gt;</span></span></span> <span class="token punctuation">(</span>GLX_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token generic-function"><span class="token function">n_y</span> <span class="token generic class-name"><span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>n_y <span class="token operator">&gt;</span></span></span> <span class="token punctuation">(</span>GLY_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token generic-function"><span class="token function">n_z</span> <span class="token generic class-name"><span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">(</span>n_z <span class="token operator">&gt;</span></span></span> <span class="token punctuation">(</span>GLZ_SIZE <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token comment">//如果相邻节点的坐标超出地图范围，跳过</span>                <span class="token comment">//GLX_SIZE - 1为什么要减1？因为数组的下标是从0开始的，所以地图的范围是0到GLX_SIZE - 1</span>                    <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// to avoid index problem</span>                <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">isOccupied</span><span class="token punctuation">(</span>n_x<span class="token punctuation">,</span> n_y<span class="token punctuation">,</span> n_z<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token comment">//如果相邻节点是障碍物，跳过</span>                    <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">// to avoid obstacles</span>                <span class="token comment">// put the pointer into neighborPtrSets</span>                temp_ptr <span class="token operator">=</span> GridNodeMap<span class="token punctuation">[</span>n_x<span class="token punctuation">]</span><span class="token punctuation">[</span>n_y<span class="token punctuation">]</span><span class="token punctuation">[</span>n_z<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//获取相邻节点的指针</span>                <span class="token keyword">if</span><span class="token punctuation">(</span>temp_ptr<span class="token operator">-&gt;</span>id <span class="token operator">==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token keyword">continue</span><span class="token punctuation">;</span> <span class="token comment">//如果相邻节点已经被扩展过了，跳过</span>                <span class="token comment">// todo to check this; why the node can transversing the obstacles</span>                n_coord <span class="token operator">=</span> temp_ptr<span class="token operator">-&gt;</span>coord<span class="token punctuation">;</span><span class="token comment">//获取相邻节点的坐标</span>                <span class="token keyword">if</span><span class="token punctuation">(</span>temp_ptr <span class="token operator">==</span> currentPtr<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//如果相邻节点等于当前节点，输出错误信息</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Error: temp_ptr == currentPtr)"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>                <span class="token punctuation">}</span>                <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">1e-6</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">1e-6</span><span class="token punctuation">)</span> <span class="token function">and</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">1e-6</span> <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>                    <span class="token comment">//如果相邻节点的坐标和当前节点的坐标相同，输出错误信息</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Error: Not expanding correctly!"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//中文：没有正确扩展</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"n_coord:"</span> <span class="token operator">&lt;&lt;</span> n_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span><span class="token operator">&lt;&lt;</span>n_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">&lt;&lt;</span><span class="token string">" "</span><span class="token operator">&lt;&lt;</span>n_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//输出相邻节点的坐标</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"this_coord:"</span> <span class="token operator">&lt;&lt;</span> this_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span><span class="token operator">&lt;&lt;</span>this_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">&lt;&lt;</span><span class="token string">" "</span><span class="token operator">&lt;&lt;</span>this_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//输出当前节点的坐标</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"current node index:"</span> <span class="token operator">&lt;&lt;</span> this_x <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span><span class="token operator">&lt;&lt;</span> this_y<span class="token operator">&lt;&lt;</span><span class="token string">" "</span><span class="token operator">&lt;&lt;</span> this_z <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//输出当前节点的索引</span>                    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"neighbor node index:"</span> <span class="token operator">&lt;&lt;</span> n_x <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span><span class="token operator">&lt;&lt;</span> n_y<span class="token operator">&lt;&lt;</span><span class="token string">" "</span><span class="token operator">&lt;&lt;</span> n_z <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//输出相邻节点的索引</span>                <span class="token punctuation">}</span>                dist <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">sqrt</span><span class="token punctuation">(</span> <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>                        <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">+</span>                        <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>n_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">-</span> this_coord<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//计算当前节点到相邻节点的距离</span>                neighborPtrSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>temp_ptr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将相邻节点的指针放入neighborPtrSets </span>                <span class="token comment">// calculate the cost in edgeCostSets: inf means that is not unexpanded</span>                edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>dist<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将当前节点到相邻节点的距离放入edgeCostSets，  vector&lt;double&gt; edgeCostSets;//存储当前节点到相邻节点的代价</span>                <span class="token comment">// put the cost inot edgeCostSets</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>    <span class="token punctuation">}</span>std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"AstarGetSucc函数结束，结束获取相邻节点"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">double</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">getHeu</span><span class="token punctuation">(</span>GridNodePtr node1<span class="token punctuation">,</span> GridNodePtr node2<span class="token punctuation">)</span><span class="token comment">//获取启发函数,这里使用的是对角距离,也就是三维空间中两点之间的最短距离</span><span class="token punctuation">{</span>   <span class="token comment">//进入这个函数，就生成了结构体变量node1和node2</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"进入getHeu函数,获取启发函数"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    <span class="token comment">/*     choose possible heuristic function you want    Manhattan, Euclidean, Diagonal, or 0 (Dijkstra)    Remember tie_breaker learned in lecture, add it here ?    *    *    *    STEP 1: finish the AstarPathFinder::getHeu , which is the heuristic function    please write your code below    *    *    */</span>    <span class="token keyword">double</span> h<span class="token punctuation">;</span><span class="token comment">//启发函数的值</span>    <span class="token keyword">auto</span> node1_coord <span class="token operator">=</span> node1<span class="token operator">-&gt;</span>coord<span class="token punctuation">;</span><span class="token comment">//获取节点1的坐标</span>    <span class="token keyword">auto</span> node2_coord <span class="token operator">=</span> node2<span class="token operator">-&gt;</span>coord<span class="token punctuation">;</span><span class="token comment">//获取节点2的坐标</span>    <span class="token comment">// Heuristics 1: Manhattan</span><span class="token comment">//    h = std::abs(node1_coord(0) - node2_coord(0) ) +</span><span class="token comment">//            std::abs(node1_coord(1) - node2_coord(1) ) +</span><span class="token comment">//            std::abs(node1_coord(2) - node2_coord(2) );</span>    <span class="token comment">// Heuristics 2: Euclidean</span><span class="token comment">//    h = std::sqrt(std::pow((node1_coord(0) - node2_coord(0)), 2 ) +</span><span class="token comment">//            std::pow((node1_coord(1) - node2_coord(1)), 2 ) +</span><span class="token comment">//            std::pow((node1_coord(2) - node2_coord(2)), 2 ));</span>    <span class="token comment">// Heuristics 3: Diagnol distance</span>        <span class="token keyword">double</span> dx <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token function">node1_coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">node2_coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//计算两点在x轴上的距离</span>        <span class="token keyword">double</span> dy <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token function">node1_coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">node2_coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">double</span> dz <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token function">node1_coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token function">node2_coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">double</span> min_xyz <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">min</span><span class="token punctuation">(</span><span class="token punctuation">{</span>dx<span class="token punctuation">,</span> dy<span class="token punctuation">,</span> dz<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        h <span class="token operator">=</span> dx <span class="token operator">+</span> dy <span class="token operator">+</span> dz <span class="token operator">+</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span><span class="token function">sqrt</span><span class="token punctuation">(</span><span class="token number">3.0</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token operator">*</span> min_xyz<span class="token punctuation">;</span><span class="token comment">//对角距离</span>         <span class="token comment">// idea: diagnol is a short-cut, find out how many short-cuts can be realized</span>        <span class="token keyword">if</span><span class="token punctuation">(</span>tie_break<span class="token punctuation">)</span><span class="token punctuation">{</span>            <span class="token keyword">double</span> p <span class="token operator">=</span> <span class="token number">1.0</span> <span class="token operator">/</span> <span class="token number">25.0</span><span class="token punctuation">;</span>            h <span class="token operator">*=</span> <span class="token punctuation">(</span><span class="token number">1.0</span> <span class="token operator">+</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token comment">//std::cout &lt;&lt; "Tie Break!" &lt;&lt; std::endl;</span>        <span class="token punctuation">}</span>    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span><span class="token string">"getHeu函数结束,获取启发函数中的h is: "</span><span class="token operator">&lt;&lt;</span> h <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    <span class="token keyword">return</span> h<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">AstarGraphSearch</span><span class="token punctuation">(</span>Vector3d start_pt<span class="token punctuation">,</span> Vector3d end_pt<span class="token punctuation">)</span><span class="token comment">//A*搜索算法,输入起点和终点</span><span class="token punctuation">{</span>       std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span><span class="token string">"开始AstarGraphSearch：A*搜索算法"</span><span class="token operator">&lt;&lt;</span>std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    ros<span class="token double-colon punctuation">::</span>Time time_1 <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//记录开始时间，用于计算程序运行时间</span>    <span class="token comment">//这里的time_1是一个ros::Time类型的变量，用于记录程序开始运行的时间</span>    <span class="token comment">//index of start_point and end_point</span>    Vector3i start_idx <span class="token operator">=</span> <span class="token function">coord2gridIndex</span><span class="token punctuation">(</span>start_pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将起点坐标转换为栅格地图中的索引</span>    Vector3i end_idx   <span class="token operator">=</span> <span class="token function">coord2gridIndex</span><span class="token punctuation">(</span>end_pt<span class="token punctuation">)</span><span class="token punctuation">;</span>    goalIdx <span class="token operator">=</span> end_idx<span class="token punctuation">;</span><span class="token comment">//记录终点的索引</span>    <span class="token comment">//Vector3i是Eigen库中的一个类，用于表示三维向量，这里用于表示三维索引</span>    <span class="token comment">//position of start_point and end_point</span>    start_pt <span class="token operator">=</span> <span class="token function">gridIndex2coord</span><span class="token punctuation">(</span>start_idx<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将起点的索引转换为坐标</span>    end_pt   <span class="token operator">=</span> <span class="token function">gridIndex2coord</span><span class="token punctuation">(</span>end_idx<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">//Initialize the pointers of struct GridNode which represent start node and goal node</span>    GridNodePtr startPtr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">GridNode</span><span class="token punctuation">(</span>start_idx<span class="token punctuation">,</span> start_pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建一个GridNode结构体指针，表示起点</span>    GridNodePtr endPtr   <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">GridNode</span><span class="token punctuation">(</span>end_idx<span class="token punctuation">,</span>   end_pt<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token comment">//openSet is the open_list implemented through multimap in STL library</span>    openSet<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//清空openSet</span>    <span class="token comment">// currentPtr represents the node with lowest f(n) in the open_list</span>    GridNodePtr currentPtr  <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span><span class="token comment">//当前节点</span>    GridNodePtr neighborPtr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span><span class="token comment">//相邻节点</span>    <span class="token comment">//put start node in open set</span>    startPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token comment">//将起点的g值设置为0</span>    startPtr <span class="token operator">-&gt;</span> fScore <span class="token operator">=</span> <span class="token function">getHeu</span><span class="token punctuation">(</span>startPtr<span class="token punctuation">,</span>endPtr<span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//获取启发函数，这里使用的是对角距离,也就是三维空间中两点之间的最短距离</span>    <span class="token comment">//STEP 1: finish the AstarPathFinder::getHeu , which is the heuristic function</span>    startPtr <span class="token operator">-&gt;</span> id <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">//把起点放入openSet中</span>    startPtr <span class="token operator">-&gt;</span> coord <span class="token operator">=</span> start_pt<span class="token punctuation">;</span><span class="token comment">//startPtr是一个GridNode结构体指针，表示起点，start_pt是起点的坐标，将起点的坐标赋值给startPtr的coord</span>    openSet<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span> <span class="token function">make_pair</span><span class="token punctuation">(</span>startPtr <span class="token operator">-&gt;</span> fScore<span class="token punctuation">,</span> startPtr<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将起点放入openSet中</span>    <span class="token comment">//这里的startPtr -&gt; fScore是起点的f值，startPtr是一个GridNode结构体指针，表示起点，make_pair(startPtr -&gt; fScore, startPtr)是一个pair对象，表示起点的f值和起点</span>    <span class="token comment">//openSet是一个multimap对象，它的键是double类型，值是GridNodePtr类型，insert是multimap的一个函数，用于将pair对象插入到multimap中</span>    <span class="token comment">//按照键的大小自动排序，所以openSet中的节点是按照f值从小到大排序的</span>     <span class="token comment">// todo Note: modified, insert the pointer GridNodeMap[i][j][k] to the start node in grid map</span>    <span class="token comment">/*    *    STEP 2 :  some else preparatory works which should be done before while loop    please write your code below    *    *    */</span>    <span class="token comment">// three dimension pointer GridNodeMap[i][j][k] is pointed to a struct GridNode(Eigen::Vector3i _index, Eigen::Vector3d _coord);</span>    <span class="token comment">// assign g(xs) = 0, g(n) = inf (already done in initialzation of struct)</span>    <span class="token comment">// mark start point as visited(expanded) (id 0: no operation, id: 1 in OPEN, id -1: in CLOSE )</span>    GridNodeMap<span class="token punctuation">[</span>start_idx<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>start_idx<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>start_idx<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">-&gt;</span> id <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//将起点的id设置为1，表示起点在openSet中</span>    vector<span class="token operator">&lt;</span>GridNodePtr<span class="token operator">&gt;</span> neighborPtrSets<span class="token punctuation">;</span><span class="token comment">//存储当前节点的相邻节点,这里的vector是容器，存储GridNodePtr类型的数据，gridNodePtr包含了节点的坐标，方向，索引，g值，f值，父节点，节点的迭代器</span>    <span class="token comment">//所以这个vector的维数不止三维，而是六维，存储了相邻节点的坐标，方向，索引，g值，f值，父节点</span>    vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> edgeCostSets<span class="token punctuation">;</span><span class="token comment">//存储当前节点到相邻节点的代价，这是一个一维的vector，存储了当前节点到相邻节点的代价</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3i current_idx<span class="token punctuation">;</span> <span class="token comment">// record the current index//记录当前节点的索引</span>    <span class="token comment">// this is the main loop</span>    <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token operator">!</span>openSet<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//当openSet不为空时，循环执行以下操作</span>        <span class="token comment">/*        *        *        step 3: Remove the node with lowest cost function from open set to closed set        please write your code below                IMPORTANT NOTE!!!        This part you should use the C++ STL: multimap, more details can be find in Homework description        *        *        */</span>        currentPtr <span class="token operator">=</span> openSet<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-&gt;</span> second<span class="token punctuation">;</span><span class="token comment">//这里的当前节点是openSet中f值最小的节点，second是multimap的一个函数，用于返回第二个元素的迭代器</span>        <span class="token comment">//这里的当前节点虽然是指针，是不是对应一个新的结构体变量</span>        <span class="token comment">//openSet是一个multimap对象，begin()是multimap的一个函数，用于返回指向第一个元素（这里的第一个元素是包含键值的迭代器）的迭代器,second是multimap的一个函数，用于返回第二个元素的迭代器</span>         <span class="token comment">// first T1 键, second T2 值 ,pair&lt;type 1,type 2&gt;</span>        openSet<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>openSet<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//erase()是multimap的一个函数，用于删除指定位置的元素</span>         <span class="token comment">// remove the node wistd::cout &lt;&lt;"h is: "&lt;&lt; h &lt;&lt; std::endl;th minimal f value</span>        current_idx <span class="token operator">=</span> currentPtr<span class="token operator">-&gt;</span>index<span class="token punctuation">;</span><span class="token comment">//获取当前节点的索引，currentPtr是一个GridNode结构体指针，表示当前节点</span>        <span class="token comment">//currentPtr是一个GridNode结构体指针，表示当前节点，currentPtr-&gt;index是一个Vector3i类型的变量，表示当前节点的索引</span>        GridNodeMap<span class="token punctuation">[</span>current_idx<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>current_idx<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">[</span>current_idx<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token operator">-&gt;</span> id <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">// update the id in grid node map,中文是更新栅格地图中的节点id，将当前节点的id设置为-1，表示当前节点在closeSet中</span>        <span class="token comment">// if the current node is the goal </span>        <span class="token keyword">if</span><span class="token punctuation">(</span> currentPtr<span class="token operator">-&gt;</span>index <span class="token operator">==</span> goalIdx <span class="token punctuation">)</span><span class="token punctuation">{</span>            ros<span class="token double-colon punctuation">::</span>Time time_2 <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//记录结束时间，用于计算程序运行时间</span>            terminatePtr <span class="token operator">=</span> currentPtr<span class="token punctuation">;</span><span class="token comment">//将当前节点设置为终点</span>            <span class="token function">ROS_WARN</span><span class="token punctuation">(</span><span class="token string">"[A*]{sucess}  Time in A*  is %f ms, path cost if %f m"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>time_2 <span class="token operator">-</span> time_1<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toSec</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">1000.0</span><span class="token punctuation">,</span> currentPtr<span class="token operator">-&gt;</span>gScore <span class="token operator">*</span> resolution <span class="token punctuation">)</span><span class="token punctuation">;</span>                        <span class="token comment">//(time_2 - time_1).toSec() * 1000.0具体解释：(time_2 - time_1).toSec()是程序运行的时间，toSec()是一个函数，用于返回时间的秒数，*1000.0是将秒转换为毫秒</span>            <span class="token comment">//currentPtr-&gt;gScore * resolution是路径的代价，currentPtr是一个GridNode结构体指针，表示当前节点，gScore是当前节点的g值，resolution是地图的分辨率</span>             std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span><span class="token string">"AstarGraphSearch：A*搜索算法结束"</span><span class="token operator">&lt;&lt;</span>std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>            <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token comment">//返回,结束程序</span>        <span class="token punctuation">}</span>        <span class="token comment">//获取邻居节点</span>        <span class="token comment">//get the succetion</span>        <span class="token function">AstarGetSucc</span><span class="token punctuation">(</span>currentPtr<span class="token punctuation">,</span> neighborPtrSets<span class="token punctuation">,</span> edgeCostSets<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//STEP 4: finish AstarPathFinder::AstarGetSucc yourself     </span>        <span class="token comment">/*        *        *        STEP 5:  For all unexpanded neigbors "m" of node "n", please finish this for loop        please write your code below        对于节点“n”的所有未扩展的邻居“m”，请完成这个for循环        *                */</span>                 <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>neighborPtrSets<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//遍历当前节点的相邻节点</span>            <span class="token comment">/*            *            *            Judge if the neigbors have been expanded            please write your code below                        IMPORTANT NOTE!!!            neighborPtrSets[i]-&gt;id = -1 : expanded, equal to this node is in close set            neighborPtrSets[i]-&gt;id = 1 : unexpanded, equal to this node is in open set            *                    */</span>            neighborPtr <span class="token operator">=</span> neighborPtrSets<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//获取相邻节点的指针</span>            <span class="token keyword">if</span><span class="token punctuation">(</span>neighborPtr <span class="token operator">-&gt;</span> id <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//这个节点没有被扩展过 </span>                <span class="token comment">//discover a new node, which is not in the closed set and open set</span>                <span class="token comment">/*                *                *                STEP 6:  As for a new node, do what you need do ,and then put neighbor in open set and record it                please write your code below                *                        */</span>                <span class="token comment">// shall update: gScore = inf; fScore = inf; cameFrom = NULL, id, mayby direction</span>                neighborPtr<span class="token operator">-&gt;</span>gScore <span class="token operator">=</span> currentPtr<span class="token operator">-&gt;</span>gScore <span class="token operator">+</span> edgeCostSets<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//更新相邻节点的g值</span>                neighborPtr<span class="token operator">-&gt;</span>fScore <span class="token operator">=</span> neighborPtr<span class="token operator">-&gt;</span>gScore <span class="token operator">+</span> <span class="token function">getHeu</span><span class="token punctuation">(</span>neighborPtr<span class="token punctuation">,</span>endPtr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//更新相邻节点的f值</span>                std<span class="token double-colon punctuation">::</span>cout<span class="token operator">&lt;&lt;</span><span class="token string">"第"</span><span class="token operator">&lt;&lt;</span>i<span class="token operator">&lt;&lt;</span><span class="token string">"次进入getHeu函数，获取启发函数"</span><span class="token operator">&lt;&lt;</span>std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>                neighborPtr<span class="token operator">-&gt;</span>cameFrom <span class="token operator">=</span> currentPtr<span class="token punctuation">;</span><span class="token comment">//更新相邻节点的父节点 </span>                <span class="token comment">// todo shallow copy or deep copy,翻译：浅拷贝还是深拷贝</span>                <span class="token comment">// push node "m" into OPEN</span>                openSet<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token function">make_pair</span><span class="token punctuation">(</span>neighborPtr <span class="token operator">-&gt;</span> fScore<span class="token punctuation">,</span> neighborPtr<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将相邻节点放入openSet中</span>                neighborPtr <span class="token operator">-&gt;</span> id <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token comment">//将相邻节点的id设置为1，表示相邻节点在openSet中</span>                <span class="token keyword">continue</span><span class="token punctuation">;</span>            <span class="token punctuation">}</span>            <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span>neighborPtr <span class="token operator">-&gt;</span> id <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">//这个节点在openSet中，需要判断是否需要更新，当你编写代码时，应该删除“0”</span>                <span class="token comment">//this node is in open set and need to judge if it needs to update, the "0" should be deleted when you are coding</span>                <span class="token comment">/*                *                *                STEP 7:  As for a node in open set, update it , maintain the openset ,and then put neighbor in open set and record it                please write your code below                *                        */</span>                <span class="token comment">// shall update: gScore; fScore; cameFrom, mayby direction</span>                <span class="token keyword">if</span><span class="token punctuation">(</span>neighborPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">&gt;</span> <span class="token punctuation">(</span>currentPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">+</span> edgeCostSets<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//如果当前节点的g值加上当前节点到相邻节点的代价小于相邻节点的g值</span>                    neighborPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">=</span> currentPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">+</span> edgeCostSets<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token comment">//更新相邻节点的g值</span>                    neighborPtr <span class="token operator">-&gt;</span> fScore <span class="token operator">=</span> neighborPtr <span class="token operator">-&gt;</span> gScore <span class="token operator">+</span> <span class="token function">getHeu</span><span class="token punctuation">(</span>neighborPtr<span class="token punctuation">,</span>endPtr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//更新相邻节点的f值</span>                    neighborPtr <span class="token operator">-&gt;</span> cameFrom <span class="token operator">=</span> currentPtr<span class="token punctuation">;</span><span class="token comment">//更新相邻节点的父节点</span>                <span class="token punctuation">}</span>                <span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token comment">//继续下一次循环</span>            <span class="token punctuation">}</span>            <span class="token keyword">else</span><span class="token punctuation">{</span><span class="token comment">//this node is in closed set</span>                <span class="token comment">/*                *                please write your code below                *                        */</span>                <span class="token comment">// todo nothing to do here?</span>                <span class="token keyword">continue</span><span class="token punctuation">;</span><span class="token comment">//情况：这个节点在closeSet中，不需要做任何操作，继续下一次循环，在closeSet意味着这个节点已经被扩展过了</span>            <span class="token punctuation">}</span>        <span class="token punctuation">}</span>          <span class="token punctuation">}</span>    <span class="token comment">//if search fails</span>    ros<span class="token double-colon punctuation">::</span>Time time_2 <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//记录结束时间，用于计算程序运行时间</span>    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token punctuation">(</span>time_2 <span class="token operator">-</span> time_1<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toSec</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&gt;</span> <span class="token number">0.1</span><span class="token punctuation">)</span><span class="token comment">//如果程序运行时间大于0.1s</span>        <span class="token function">ROS_WARN</span><span class="token punctuation">(</span><span class="token string">"Time consume in Astar path finding is %f"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>time_2 <span class="token operator">-</span> time_1<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toSec</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//输出程序运行时间</span><span class="token punctuation">}</span><span class="token comment">//获得路径，返回一个vector，存储了路径上的点，按照顺序存储，第一个点是起点，最后一个点是终点</span>vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> <span class="token class-name">AstarPathFinder</span><span class="token double-colon punctuation">::</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span><span class="token string">"开始getPath函数"</span><span class="token operator">&lt;&lt;</span>std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> path<span class="token punctuation">;</span><span class="token comment">//存储路径上的点,按照顺序存储，第一个点是起点，最后一个点是终点，</span>    vector<span class="token operator">&lt;</span>GridNodePtr<span class="token operator">&gt;</span> gridPath<span class="token punctuation">;</span><span class="token comment">//存储路径上的节点,区别：path存储的是路径上的点，gridPath存储的是路径上的节点</span>    <span class="token comment">/*    *    *    STEP 8:  trace back from the curretnt nodePtr to get all nodes along the path    please write your code below    *          */</span>    <span class="token keyword">auto</span> ptr <span class="token operator">=</span> terminatePtr<span class="token punctuation">;</span><span class="token comment">//ptr是一个GridNode结构体指针，表示终点</span>    <span class="token keyword">while</span><span class="token punctuation">(</span>ptr <span class="token operator">-&gt;</span> cameFrom <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//当ptr的父节点不为空时，循环执行以下操作</span>        gridPath<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>ptr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将ptr放入gridPath中</span>        ptr <span class="token operator">=</span> ptr<span class="token operator">-&gt;</span>cameFrom<span class="token punctuation">;</span><span class="token comment">//将ptr的父节点赋值给ptr</span>    <span class="token punctuation">}</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> ptr<span class="token operator">:</span> gridPath<span class="token punctuation">)</span><span class="token comment">//遍历gridPath,</span>    <span class="token comment">//具体解释一下auto ptr: gridPath，ptr 是一个局部变量，其类型由 auto 自动推导得出，和 gridPath 中的数据类型相同。在每次循环中，ptr 都会被设置为 gridPath 中的当前元素。</span>        path<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>ptr<span class="token operator">-&gt;</span>coord<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将ptr的坐标放入path中</span>            <span class="token function">reverse</span><span class="token punctuation">(</span>path<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>path<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将path中的元素逆序</span>    std<span class="token double-colon punctuation">::</span> cout <span class="token operator">&lt;&lt;</span> <span class="token string">"getPath函数结束,path size（节点数） is: "</span> <span class="token operator">&lt;&lt;</span> path<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token comment">//输出路径的长度</span>    <span class="token keyword">return</span> path<span class="token punctuation">;</span><span class="token comment">//返回路径</span>    <span class="token punctuation">}</span><span class="token comment">// if the difference of f is trivial, then choose then prefer the path along the straight line from start to goal</span><span class="token comment">// discared!!!</span>GridNodePtr <span class="token operator">&amp;</span> <span class="token function">TieBreaker</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>multimap<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token punctuation">,</span> GridNodePtr<span class="token operator">&gt;</span> <span class="token operator">&amp;</span>  openSet<span class="token punctuation">,</span> <span class="token keyword">const</span> GridNodePtr <span class="token operator">&amp;</span> endPtr<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//作用：如果f值的差异微不足道，则选择沿着从起点到终点的直线的路径</span>    <span class="token comment">// todo do I have to update the f in openSet??</span>    std<span class="token double-colon punctuation">::</span>multimap<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token punctuation">,</span> GridNodePtr<span class="token operator">&gt;</span> local_set<span class="token punctuation">;</span><span class="token comment">//存储当前节点的相邻节点</span>    <span class="token keyword">auto</span> f_min <span class="token operator">=</span> openSet<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span>first<span class="token punctuation">;</span><span class="token comment">//获取openSet中f值最小的节点的f值</span>    <span class="token keyword">auto</span> f_max <span class="token operator">=</span> f_min <span class="token operator">+</span> <span class="token number">1e-2</span><span class="token punctuation">;</span><span class="token comment">//f_max是f_min加上一个微不足道的差值</span>    <span class="token keyword">auto</span> itlow <span class="token operator">=</span> openSet<span class="token punctuation">.</span><span class="token function">lower_bound</span> <span class="token punctuation">(</span>f_min<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取openSet中f值最小的节点的迭代器</span>    <span class="token keyword">auto</span> itup <span class="token operator">=</span> openSet<span class="token punctuation">.</span><span class="token function">upper_bound</span><span class="token punctuation">(</span>f_max<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取openSet中f值最大的节点的迭代器</span>    <span class="token keyword">double</span> cross<span class="token punctuation">,</span> f_new<span class="token punctuation">;</span><span class="token comment">//cross是当前节点到相邻节点的距离，f_new是相邻节点的f值</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> it<span class="token operator">=</span>itlow<span class="token punctuation">;</span> it<span class="token operator">!=</span>itup<span class="token punctuation">;</span> <span class="token operator">++</span>it<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment">//遍历itlow到itup之间的节点</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"f value is:"</span> <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>first <span class="token operator">&lt;&lt;</span> <span class="token string">" pointer is: "</span> <span class="token operator">&lt;&lt;</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second <span class="token operator">&lt;&lt;</span> <span class="token char">'\n'</span><span class="token punctuation">;</span><span class="token comment">//输出f值和指针</span>        cross <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>endPtr<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span>                std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>endPtr<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span>                std<span class="token double-colon punctuation">::</span><span class="token function">abs</span><span class="token punctuation">(</span>endPtr<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token operator">-&gt;</span><span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//计算当前节点到相邻节点的距离</span>        f_new <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token operator">-&gt;</span>fScore <span class="token operator">+</span> <span class="token number">0.001</span> <span class="token operator">*</span> cross<span class="token punctuation">;</span><span class="token comment">//计算相邻节点的f值</span>        local_set<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span> <span class="token function">make_pair</span><span class="token punctuation">(</span>f_new<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//将相邻节点的f值和指针放入local_set中 ，在 local_set 中插入 pair（f_new, (*it).second），这样一个 std::pair 对象，其中第一个元素是 f_new，第二个元素是 (*it).second。</span>        <span class="token comment">// todo what is iterator, is this way correct?</span>    <span class="token punctuation">}</span>    <span class="token keyword">return</span> local_set<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span>second<span class="token punctuation">;</span><span class="token comment">//返回local_set中f值最小的节点的指针，second是返回的是指针，表示local_set中f值最小的节点</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="Astar-searcher-h"><a href="#Astar-searcher-h" class="headerlink" title="Astar_searcher.h"></a>Astar_searcher.h</h4><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">_ASTART_SEARCHER_H</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">_ASTART_SEARCHER_H</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/ros.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/console.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;Eigen/Eigen&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"backward.hpp"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"node.h"</span></span><span class="token keyword">class</span> <span class="token class-name">AstarPathFinder</span><span class="token punctuation">{</span><span class="token keyword">private</span><span class="token operator">:</span><span class="token keyword">protected</span><span class="token operator">:</span><span class="token keyword">uint8_t</span> <span class="token operator">*</span> data<span class="token punctuation">;</span><span class="token comment">//地图数据</span>GridNodePtr <span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span> GridNodeMap<span class="token punctuation">;</span><span class="token comment">//节点地图</span>Eigen<span class="token double-colon punctuation">::</span>Vector3i goalIdx<span class="token punctuation">;</span><span class="token comment">//目标点的索引</span><span class="token keyword">int</span> GLX_SIZE<span class="token punctuation">,</span> GLY_SIZE<span class="token punctuation">,</span> GLZ_SIZE<span class="token punctuation">;</span><span class="token comment">//地图的大小,地图的大小是三维的，所以有三个维度</span><span class="token keyword">int</span> GLXYZ_SIZE<span class="token punctuation">,</span> GLYZ_SIZE<span class="token punctuation">;</span><span class="token comment">//地图的大小，区别于上面的地图大小，这个地图大小是一个数值，是三维地图大小的乘积</span><span class="token comment">//有什么区别：GLX_SIZE, GLY_SIZE, GLZ_SIZE是地图的大小，GLXYZ_SIZE是地图大小的乘积</span><span class="token keyword">double</span> resolution<span class="token punctuation">,</span> inv_resolution<span class="token punctuation">;</span><span class="token comment">//分辨率和分辨率的倒数</span><span class="token keyword">double</span> gl_xl<span class="token punctuation">,</span> gl_yl<span class="token punctuation">,</span> gl_zl<span class="token punctuation">;</span><span class="token comment">//地图的边界</span><span class="token keyword">double</span> gl_xu<span class="token punctuation">,</span> gl_yu<span class="token punctuation">,</span> gl_zu<span class="token punctuation">;</span><span class="token comment">//地图的边界</span><span class="token comment">//有什么区别：gl_xl, gl_yl, gl_zl是地图的下界，gl_xu, gl_yu, gl_zu是地图的上界</span>GridNodePtr terminatePtr<span class="token punctuation">;</span><span class="token comment">//终止节点,terminatePtr是一个GridNodePtr类型的指针</span>std<span class="token double-colon punctuation">::</span>multimap<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token punctuation">,</span> GridNodePtr<span class="token operator">&gt;</span> openSet<span class="token punctuation">;</span><span class="token comment">//multimap是一个关联容器，它的元素是一对键值对，键和值可以是任意类型，键值对是按照键的大小自动排序的</span><span class="token comment">//std::multimap&lt;double, GridNodePtr&gt; openSet;具体解释每一部分：std是C++标准库的命名空间，multimap是一个关联容器，它的元素是一对键值对</span><span class="token comment">//double是键的类型，GridNodePtr是值的类型，openSet是一个multimap对象，它的键是double类型，值是GridNodePtr类型</span><span class="token keyword">double</span> <span class="token function">getHeu</span><span class="token punctuation">(</span>GridNodePtr node1<span class="token punctuation">,</span> GridNodePtr node2<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">AstarGetSucc</span><span class="token punctuation">(</span>GridNodePtr currentPtr<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>GridNodePtr<span class="token operator">&gt;</span> <span class="token operator">&amp;</span> neighborPtrSets<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> <span class="token operator">&amp;</span> edgeCostSets<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token keyword">bool</span> <span class="token function">isOccupied</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_z<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">isOccupied</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">isFree</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&amp;</span> idx_z<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span><span class="token keyword">bool</span> <span class="token function">isFree</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span> <span class="token keyword">const</span><span class="token punctuation">;</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token function">gridIndex2coord</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token operator">&amp;</span> index<span class="token punctuation">)</span><span class="token punctuation">;</span>Eigen<span class="token double-colon punctuation">::</span>Vector3i <span class="token function">coord2gridIndex</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token operator">&amp;</span> pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">public</span><span class="token operator">:</span><span class="token function">AstarPathFinder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//构造函数，初始化</span><span class="token operator">~</span><span class="token function">AstarPathFinder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//析构函数，释放内存</span><span class="token keyword">void</span> <span class="token function">AstarGraphSearch</span><span class="token punctuation">(</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d start_pt<span class="token punctuation">,</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d end_pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//A*算法</span><span class="token keyword">void</span> <span class="token function">resetGrid</span><span class="token punctuation">(</span>GridNodePtr ptr<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//重置地图</span><span class="token keyword">void</span> <span class="token function">resetUsedGrids</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//重置已使用的地图</span><span class="token keyword">void</span> <span class="token function">initGridMap</span><span class="token punctuation">(</span><span class="token keyword">double</span> _resolution<span class="token punctuation">,</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d global_xyz_l<span class="token punctuation">,</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d global_xyz_u<span class="token punctuation">,</span> <span class="token keyword">int</span> max_x_id<span class="token punctuation">,</span> <span class="token keyword">int</span> max_y_id<span class="token punctuation">,</span> <span class="token keyword">int</span> max_z_id<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//初始化地图,设置地图的参数,包括分辨率，地图的大小，地图的边界</span><span class="token keyword">void</span> <span class="token function">setObs</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">double</span> coord_x<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">double</span> coord_y<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">double</span> coord_z<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//设置障碍物/</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token function">coordRounding</span><span class="token punctuation">(</span><span class="token keyword">const</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d <span class="token operator">&amp;</span> coord<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//坐标取整,将坐标取整</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d<span class="token operator">&gt;</span> <span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>Eigen<span class="token double-colon punctuation">::</span>Vector3d<span class="token operator">&gt;</span> <span class="token function">getVisitedNodes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="demo-node-cpp"><a href="#demo-node-cpp" class="headerlink" title="demo_node.cpp"></a>demo_node.cpp</h4><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;fstream&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;math.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;pcl_conversions/pcl_conversions.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;pcl/point_cloud.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;pcl/point_types.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/ros.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/console.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;sensor_msgs/PointCloud2.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;nav_msgs/Odometry.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;nav_msgs/Path.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;geometry_msgs/PoseStamped.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;visualization_msgs/MarkerArray.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;visualization_msgs/Marker.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"Astar_searcher.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"JPS_searcher.h"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"backward.hpp"</span></span><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span><span class="token keyword">using</span> <span class="token keyword">namespace</span> Eigen<span class="token punctuation">;</span><span class="token keyword">namespace</span> backward <span class="token punctuation">{</span>backward<span class="token double-colon punctuation">::</span>SignalHandling sh<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// simulation param from launch file</span><span class="token keyword">double</span> _resolution<span class="token punctuation">,</span> _inv_resolution<span class="token punctuation">,</span> _cloud_margin<span class="token punctuation">;</span><span class="token keyword">double</span> _x_size<span class="token punctuation">,</span> _y_size<span class="token punctuation">,</span> _z_size<span class="token punctuation">;</span>    <span class="token comment">// useful global variables</span><span class="token keyword">bool</span> _has_map   <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span>Vector3d _start_pt<span class="token punctuation">;</span>Vector3d _map_lower<span class="token punctuation">,</span> _map_upper<span class="token punctuation">;</span><span class="token keyword">int</span> _max_x_id<span class="token punctuation">,</span> _max_y_id<span class="token punctuation">,</span> _max_z_id<span class="token punctuation">;</span><span class="token comment">// ros related</span>ros<span class="token double-colon punctuation">::</span>Subscriber _map_sub<span class="token punctuation">,</span> _pts_sub<span class="token punctuation">;</span>ros<span class="token double-colon punctuation">::</span>Publisher  _grid_path_vis_pub<span class="token punctuation">,</span> _visited_nodes_vis_pub<span class="token punctuation">,</span> _grid_map_vis_pub<span class="token punctuation">;</span>AstarPathFinder <span class="token operator">*</span> _astar_path_finder     <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">AstarPathFinder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建A*路径规划对象,AsatrPathFinder是一个类</span>JPSPathFinder   <span class="token operator">*</span> _jps_path_finder       <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">JPSPathFinder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建JPS路径规划对象</span><span class="token keyword">void</span> <span class="token function">rcvWaypointsCallback</span><span class="token punctuation">(</span><span class="token keyword">const</span> nav_msgs<span class="token double-colon punctuation">::</span>Path <span class="token operator">&amp;</span> wp<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">rcvPointCloudCallBack</span><span class="token punctuation">(</span><span class="token keyword">const</span> sensor_msgs<span class="token double-colon punctuation">::</span>PointCloud2 <span class="token operator">&amp;</span> pointcloud_map<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">visGridPath</span><span class="token punctuation">(</span> vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> nodes<span class="token punctuation">,</span> <span class="token keyword">bool</span> is_use_jps <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">visVisitedNode</span><span class="token punctuation">(</span> vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> nodes <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">pathFinding</span><span class="token punctuation">(</span><span class="token keyword">const</span> Vector3d start_pt<span class="token punctuation">,</span> <span class="token keyword">const</span> Vector3d target_pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">void</span> <span class="token function">rcvWaypointsCallback</span><span class="token punctuation">(</span><span class="token keyword">const</span> nav_msgs<span class="token double-colon punctuation">::</span>Path <span class="token operator">&amp;</span> wp<span class="token punctuation">)</span><span class="token comment">//接收路径规划的目标点,并调用路径规划函数,进行路径规划</span><span class="token punctuation">{</span>         <span class="token keyword">if</span><span class="token punctuation">(</span> wp<span class="token punctuation">.</span>poses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>z <span class="token operator">&lt;</span> <span class="token number">0.0</span> <span class="token operator">||</span> _has_map <span class="token operator">==</span> <span class="token boolean">false</span> <span class="token punctuation">)</span>        <span class="token keyword">return</span><span class="token punctuation">;</span>    Vector3d target_pt<span class="token punctuation">;</span>    target_pt <span class="token operator">&lt;&lt;</span> wp<span class="token punctuation">.</span>poses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>x<span class="token punctuation">,</span>                 wp<span class="token punctuation">.</span>poses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>y<span class="token punctuation">,</span>                 wp<span class="token punctuation">.</span>poses<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>pose<span class="token punctuation">.</span>position<span class="token punctuation">.</span>z<span class="token punctuation">;</span>    <span class="token function">ROS_INFO</span><span class="token punctuation">(</span><span class="token string">"[node] receive the planning target"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token function">pathFinding</span><span class="token punctuation">(</span>_start_pt<span class="token punctuation">,</span> target_pt<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//路径规划,调用路径规划函数,进行路径规划,并进行可视化,显示路径规划结果</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">rcvPointCloudCallBack</span><span class="token punctuation">(</span><span class="token keyword">const</span> sensor_msgs<span class="token double-colon punctuation">::</span>PointCloud2 <span class="token operator">&amp;</span> pointcloud_map<span class="token punctuation">)</span><span class="token punctuation">{</span>       <span class="token keyword">if</span><span class="token punctuation">(</span>_has_map <span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>    pcl<span class="token double-colon punctuation">::</span>PointCloud<span class="token operator">&lt;</span>pcl<span class="token double-colon punctuation">::</span>PointXYZ<span class="token operator">&gt;</span> cloud<span class="token punctuation">;</span>    pcl<span class="token double-colon punctuation">::</span>PointCloud<span class="token operator">&lt;</span>pcl<span class="token double-colon punctuation">::</span>PointXYZ<span class="token operator">&gt;</span> cloud_vis<span class="token punctuation">;</span>    sensor_msgs<span class="token double-colon punctuation">::</span>PointCloud2 map_vis<span class="token punctuation">;</span>    pcl<span class="token double-colon punctuation">::</span><span class="token function">fromROSMsg</span><span class="token punctuation">(</span>pointcloud_map<span class="token punctuation">,</span> cloud<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>cloud<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token keyword">return</span><span class="token punctuation">;</span>    pcl<span class="token double-colon punctuation">::</span>PointXYZ pt<span class="token punctuation">;</span>    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> idx <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> idx <span class="token operator">&lt;</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span>cloud<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> idx<span class="token operator">++</span><span class="token punctuation">)</span>    <span class="token punctuation">{</span>            pt <span class="token operator">=</span> cloud<span class="token punctuation">.</span>points<span class="token punctuation">[</span>idx<span class="token punctuation">]</span><span class="token punctuation">;</span>                <span class="token comment">// set obstalces into grid map for path planning</span>        _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">setObs</span><span class="token punctuation">(</span>pt<span class="token punctuation">.</span>x<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>y<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>z<span class="token punctuation">)</span><span class="token punctuation">;</span>        _jps_path_finder<span class="token operator">-&gt;</span><span class="token function">setObs</span><span class="token punctuation">(</span>pt<span class="token punctuation">.</span>x<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>y<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>z<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// for visualize only</span>        Vector3d cor_round <span class="token operator">=</span> _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">coordRounding</span><span class="token punctuation">(</span><span class="token function">Vector3d</span><span class="token punctuation">(</span>pt<span class="token punctuation">.</span>x<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>y<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>z<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token function">cor_round</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token function">cor_round</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token function">cor_round</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        cloud_vis<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>pt<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    cloud_vis<span class="token punctuation">.</span>width    <span class="token operator">=</span> cloud_vis<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    cloud_vis<span class="token punctuation">.</span>height   <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>    cloud_vis<span class="token punctuation">.</span>is_dense <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>    pcl<span class="token double-colon punctuation">::</span><span class="token function">toROSMsg</span><span class="token punctuation">(</span>cloud_vis<span class="token punctuation">,</span> map_vis<span class="token punctuation">)</span><span class="token punctuation">;</span>    map_vis<span class="token punctuation">.</span>header<span class="token punctuation">.</span>frame_id <span class="token operator">=</span> <span class="token string">"/world"</span><span class="token punctuation">;</span>    _grid_map_vis_pub<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>map_vis<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发布地图,用于rviz显示,发布的是经过处理的地图</span>    _has_map <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">pathFinding</span><span class="token punctuation">(</span><span class="token keyword">const</span> Vector3d start_pt<span class="token punctuation">,</span> <span class="token keyword">const</span> Vector3d target_pt<span class="token punctuation">)</span><span class="token punctuation">{</span>    <span class="token comment">//Call A* to search for a path</span>    _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">AstarGraphSearch</span><span class="token punctuation">(</span>start_pt<span class="token punctuation">,</span> target_pt<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//调用A*算法,进行路径规划</span>    <span class="token comment">//Retrieve the path</span>    <span class="token keyword">auto</span> grid_path     <span class="token operator">=</span> _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取路径,获取A*算法的路径,并获取已经访问的节点</span>    <span class="token keyword">auto</span> visited_nodes <span class="token operator">=</span> _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">getVisitedNodes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取已经访问的节点,获取A*算法的已经访问的节点,用于可视化</span>    <span class="token comment">//Visualize the result</span>    <span class="token function">visGridPath</span> <span class="token punctuation">(</span>grid_path<span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//可视化路径,可视化A*算法的路径</span>    <span class="token function">visVisitedNode</span><span class="token punctuation">(</span>visited_nodes<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//可视化已访问的节点,可视化A*算法的已经访问的节点</span>    <span class="token comment">//Reset map for next call</span>    _astar_path_finder<span class="token operator">-&gt;</span><span class="token function">resetUsedGrids</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//重置地图,重置A*算法的地图,用于下一次路径规划</span>    <span class="token comment">//_use_jps = 0 -&gt; Do not use JPS</span>    <span class="token comment">//_use_jps = 1 -&gt; Use JPS</span>    <span class="token comment">//you just need to change the #define value of _use_jps</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">_use_jps</span> <span class="token expression"><span class="token number">0</span></span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression">_use_jps</span></span>    <span class="token punctuation">{</span>        <span class="token comment">//Call JPS to search for a path</span>        _jps_path_finder <span class="token operator">-&gt;</span> <span class="token function">JPSGraphSearch</span><span class="token punctuation">(</span>start_pt<span class="token punctuation">,</span> target_pt<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">//Retrieve the path</span>        <span class="token keyword">auto</span> grid_path     <span class="token operator">=</span> _jps_path_finder<span class="token operator">-&gt;</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">auto</span> visited_nodes <span class="token operator">=</span> _jps_path_finder<span class="token operator">-&gt;</span><span class="token function">getVisitedNodes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">//Visualize the result</span>        <span class="token function">visGridPath</span>   <span class="token punctuation">(</span>grid_path<span class="token punctuation">,</span> _use_jps<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token function">visVisitedNode</span><span class="token punctuation">(</span>visited_nodes<span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">//Reset map for next call</span>        _jps_path_finder<span class="token operator">-&gt;</span><span class="token function">resetUsedGrids</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span><span class="token punctuation">}</span><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span><span class="token operator">*</span> argv<span class="token punctuation">)</span><span class="token punctuation">{</span>    ros<span class="token double-colon punctuation">::</span><span class="token function">init</span><span class="token punctuation">(</span>argc<span class="token punctuation">,</span> argv<span class="token punctuation">,</span> <span class="token string">"demo_node"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token comment">// 输出节点启动提示</span>    <span class="token function">ROS_INFO</span><span class="token punctuation">(</span><span class="token string">"Demo node has started."</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    ros<span class="token double-colon punctuation">::</span>NodeHandle <span class="token function">nh</span><span class="token punctuation">(</span><span class="token string">"~"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建节点句柄,用于与ROS系统通信,创建一个私有节点句柄,用于与ROS系统通信</span>        std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Hold on, we'll win!"</span> <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>    _map_sub  <span class="token operator">=</span> nh<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span> <span class="token string">"map"</span><span class="token punctuation">,</span>       <span class="token number">1</span><span class="token punctuation">,</span> rcvPointCloudCallBack <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//订阅地图,接收地图,用于路径规划</span>    _pts_sub  <span class="token operator">=</span> nh<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span> <span class="token string">"waypoints"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> rcvWaypointsCallback <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//订阅路径规划的目标点,接收路径规划的目标点,用于路径规划</span>    _grid_map_vis_pub             <span class="token operator">=</span> nh<span class="token punctuation">.</span><span class="token generic-function"><span class="token function">advertise</span><span class="token generic class-name"><span class="token operator">&lt;</span>sensor_msgs<span class="token double-colon punctuation">::</span>PointCloud2<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">"grid_map_vis"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发布地图,用于rviz显示,发布的是经过处理的地图</span>    _grid_path_vis_pub            <span class="token operator">=</span> nh<span class="token punctuation">.</span><span class="token generic-function"><span class="token function">advertise</span><span class="token generic class-name"><span class="token operator">&lt;</span>visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">"grid_path_vis"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发布路径,用于rviz显示,发布的是路径</span>    _visited_nodes_vis_pub        <span class="token operator">=</span> nh<span class="token punctuation">.</span><span class="token generic-function"><span class="token function">advertise</span><span class="token generic class-name"><span class="token operator">&lt;</span>visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">"visited_nodes_vis"</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发布已访问的节点,用于rviz显示,发布的是已经访问的节点</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"map/cloud_margin"</span><span class="token punctuation">,</span>  _cloud_margin<span class="token punctuation">,</span> <span class="token number">0.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//地图的边缘</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"map/resolution"</span><span class="token punctuation">,</span>    _resolution<span class="token punctuation">,</span>   <span class="token number">0.2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">//地图的分辨率</span>        nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"map/x_size"</span><span class="token punctuation">,</span>        _x_size<span class="token punctuation">,</span> <span class="token number">50.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>   <span class="token comment">//地图的大小</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"map/y_size"</span><span class="token punctuation">,</span>        _y_size<span class="token punctuation">,</span> <span class="token number">50.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//地图的大小</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"map/z_size"</span><span class="token punctuation">,</span>        _z_size<span class="token punctuation">,</span> <span class="token number">5.0</span> <span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//地图的大小</span>        nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"planning/start_x"</span><span class="token punctuation">,</span>  <span class="token function">_start_pt</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token number">0.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//路径规划的起点</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"planning/start_y"</span><span class="token punctuation">,</span>  <span class="token function">_start_pt</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token number">0.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//路径规划的起点</span>    nh<span class="token punctuation">.</span><span class="token function">param</span><span class="token punctuation">(</span><span class="token string">"planning/start_z"</span><span class="token punctuation">,</span>  <span class="token function">_start_pt</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token number">0.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//路径规划的起点</span>    _map_lower <span class="token operator">&lt;&lt;</span> <span class="token operator">-</span> _x_size<span class="token operator">/</span><span class="token number">2.0</span><span class="token punctuation">,</span> <span class="token operator">-</span> _y_size<span class="token operator">/</span><span class="token number">2.0</span><span class="token punctuation">,</span>     <span class="token number">0.0</span><span class="token punctuation">;</span><span class="token comment">//地图的下边界</span>    _map_upper <span class="token operator">&lt;&lt;</span> <span class="token operator">+</span> _x_size<span class="token operator">/</span><span class="token number">2.0</span><span class="token punctuation">,</span> <span class="token operator">+</span> _y_size<span class="token operator">/</span><span class="token number">2.0</span><span class="token punctuation">,</span> _z_size<span class="token punctuation">;</span><span class="token comment">//地图的上边界</span>        _inv_resolution <span class="token operator">=</span> <span class="token number">1.0</span> <span class="token operator">/</span> _resolution<span class="token punctuation">;</span><span class="token comment">//分辨率的倒数</span>        _max_x_id <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span>_x_size <span class="token operator">*</span> _inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//地图的最大索引</span>    _max_y_id <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span>_y_size <span class="token operator">*</span> _inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//地图的最大索引</span>    _max_z_id <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">(</span>_z_size <span class="token operator">*</span> _inv_resolution<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//地图的最大索引</span>    _astar_path_finder  <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">AstarPathFinder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建A*路径规划对象</span>    _astar_path_finder  <span class="token operator">-&gt;</span> <span class="token function">initGridMap</span><span class="token punctuation">(</span>_resolution<span class="token punctuation">,</span> _map_lower<span class="token punctuation">,</span> _map_upper<span class="token punctuation">,</span> _max_x_id<span class="token punctuation">,</span> _max_y_id<span class="token punctuation">,</span> _max_z_id<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//初始化地图,设置地图的参数,包括分辨率，地图的大小，地图的边界</span><span class="token comment">//    _jps_path_finder    = new JPSPathFinder();</span><span class="token comment">//    _jps_path_finder    -&gt; initGridMap(_resolution, _map_lower, _map_upper, _max_x_id, _max_y_id, _max_z_id);</span>        ros<span class="token double-colon punctuation">::</span>Rate <span class="token function">rate</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//设置循环的频率,100Hz,具体解释一下：ros::Rate是一个类，用于控制循环的频率，这里的rate是对象还是构造函数？是对象</span>    <span class="token keyword">bool</span> status <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token function">ok</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//节点是否正常运行</span>    <span class="token keyword">while</span><span class="token punctuation">(</span>status<span class="token punctuation">)</span> <span class="token comment">//节点是否正常运行</span>    <span class="token punctuation">{</span>        ros<span class="token double-colon punctuation">::</span><span class="token function">spinOnce</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>      <span class="token comment">//检查是否有消息传入,处理回调函数</span>        status <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token function">ok</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//节点是否正常运行</span>        rate<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//根据前面的设置,设置的频率是100Hz，rate是一个对象，对象可以调用成员函数，这里调用的是sleep()函数，用于控制循环的频率</span>    <span class="token punctuation">}</span>    <span class="token keyword">delete</span> _astar_path_finder<span class="token punctuation">;</span><span class="token comment">//释放内存</span>    <span class="token keyword">delete</span> _jps_path_finder<span class="token punctuation">;</span><span class="token comment">//释放内存</span>    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">visGridPath</span><span class="token punctuation">(</span> vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> nodes<span class="token punctuation">,</span> <span class="token keyword">bool</span> is_use_jps <span class="token punctuation">)</span><span class="token punctuation">{</span>       visualization_msgs<span class="token double-colon punctuation">::</span>Marker node_vis<span class="token punctuation">;</span>     node_vis<span class="token punctuation">.</span>header<span class="token punctuation">.</span>frame_id <span class="token operator">=</span> <span class="token string">"world"</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>header<span class="token punctuation">.</span>stamp <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">if</span><span class="token punctuation">(</span>is_use_jps<span class="token punctuation">)</span>        node_vis<span class="token punctuation">.</span>ns <span class="token operator">=</span> <span class="token string">"demo_node/jps_path"</span><span class="token punctuation">;</span>    <span class="token keyword">else</span>        node_vis<span class="token punctuation">.</span>ns <span class="token operator">=</span> <span class="token string">"demo_node/astar_path"</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>type <span class="token operator">=</span> visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token double-colon punctuation">::</span>CUBE_LIST<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>action <span class="token operator">=</span> visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token double-colon punctuation">::</span>ADD<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>w <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>    <span class="token keyword">if</span><span class="token punctuation">(</span>is_use_jps<span class="token punctuation">)</span><span class="token punctuation">{</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>g <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token keyword">else</span><span class="token punctuation">{</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>g <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>x <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>y <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>z <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    geometry_msgs<span class="token double-colon punctuation">::</span>Point pt<span class="token punctuation">;</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token keyword">int</span><span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>    <span class="token punctuation">{</span>        Vector3d coord <span class="token operator">=</span> nodes<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>pt<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    _grid_path_vis_pub<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>node_vis<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">void</span> <span class="token function">visVisitedNode</span><span class="token punctuation">(</span> vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> nodes <span class="token punctuation">)</span><span class="token punctuation">{</span>       visualization_msgs<span class="token double-colon punctuation">::</span>Marker node_vis<span class="token punctuation">;</span>     node_vis<span class="token punctuation">.</span>header<span class="token punctuation">.</span>frame_id <span class="token operator">=</span> <span class="token string">"world"</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>header<span class="token punctuation">.</span>stamp <span class="token operator">=</span> ros<span class="token double-colon punctuation">::</span><span class="token class-name">Time</span><span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>ns <span class="token operator">=</span> <span class="token string">"demo_node/expanded_nodes"</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>type <span class="token operator">=</span> visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token double-colon punctuation">::</span>CUBE_LIST<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>action <span class="token operator">=</span> visualization_msgs<span class="token double-colon punctuation">::</span>Marker<span class="token double-colon punctuation">::</span>ADD<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>pose<span class="token punctuation">.</span>orientation<span class="token punctuation">.</span>w <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>a <span class="token operator">=</span> <span class="token number">0.5</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>r <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>g <span class="token operator">=</span> <span class="token number">0.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>color<span class="token punctuation">.</span>b <span class="token operator">=</span> <span class="token number">1.0</span><span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>x <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>y <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    node_vis<span class="token punctuation">.</span>scale<span class="token punctuation">.</span>z <span class="token operator">=</span> _resolution<span class="token punctuation">;</span>    geometry_msgs<span class="token double-colon punctuation">::</span>Point pt<span class="token punctuation">;</span>    <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token keyword">int</span><span class="token punctuation">(</span>nodes<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>    <span class="token punctuation">{</span>        Vector3d coord <span class="token operator">=</span> nodes<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        pt<span class="token punctuation">.</span>z <span class="token operator">=</span> <span class="token function">coord</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        node_vis<span class="token punctuation">.</span>points<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>pt<span class="token punctuation">)</span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    _visited_nodes_vis_pub<span class="token punctuation">.</span><span class="token function">publish</span><span class="token punctuation">(</span>node_vis<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="node-h"><a href="#node-h" class="headerlink" title="node.h"></a>node.h</h4><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">_NODE_H_</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">_NODE_H_</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/ros.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;ros/console.h&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;Eigen/Eigen&gt;</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"backward.hpp"</span></span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">inf</span> <span class="token expression"><span class="token number">1</span><span class="token operator">&gt;&gt;</span><span class="token number">20</span></span><span class="token comment">//定义一个无穷大的值，1左移20位，1的二进制是0001，左移20位后变成1000000000000000000000，这是一个很大的数</span></span><span class="token keyword">struct</span> <span class="token class-name">GridNode</span><span class="token punctuation">;</span><span class="token comment">//声明一个节点结构体,这是一个结构体，不是一个类</span><span class="token keyword">typedef</span> GridNode<span class="token operator">*</span> GridNodePtr<span class="token punctuation">;</span><span class="token comment">//定义一个节点指针,GridNodePtr是一个指向GridNode的指针，这里typedef是一个关键字，用于给已有的数据类型定义一个新的名字</span><span class="token comment">//完整解释一下：typedef是C++中的一个关键字，用于给已有的数据类型定义一个新的名字，GridNode是一个结构体，GridNodePtr是一个指向GridNode的指针</span><span class="token comment">//这里已有的数据类型是什么：GridNode是一个结构体，GridNodePtr是一个指向GridNode的指针</span><span class="token keyword">struct</span> <span class="token class-name">GridNode</span><span class="token comment">//定义一个节点结构体，包含了节点的坐标，方向，索引，g值，f值，父节点，节点的迭代器，这不是一个类吧，这是一个结构体</span><span class="token punctuation">{</span>         <span class="token keyword">int</span> id<span class="token punctuation">;</span>        <span class="token comment">// 1--&gt; open set, -1 --&gt; closed set</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3d coord<span class="token punctuation">;</span> <span class="token comment">//世界坐标系下的坐标，节点的坐标，坐标中心是地图的中心,这是 一个三维向量</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3i dir<span class="token punctuation">;</span>   <span class="token comment">// direction of expanding</span>    Eigen<span class="token double-colon punctuation">::</span>Vector3i index<span class="token punctuation">;</span><span class="token comment">//节点的索引，索引是节点在地图中的位置，和coord的区别是，索引是整数，而坐标是浮点数</span>    <span class="token comment">//举例说明index:假设地图的分辨率是0.1m，地图的中心是(0,0,0)，那么地图的左下角的坐标是(-50,-50,-50)，那么地图的左下角的索引是(-500,-500,-500)</span>    <span class="token keyword">double</span> gScore<span class="token punctuation">,</span> fScore<span class="token punctuation">;</span>    GridNodePtr cameFrom<span class="token punctuation">;</span><span class="token comment">//父节点，节点的父节点，这是一个指针，指向节点的父节点</span>    std<span class="token double-colon punctuation">::</span>multimap<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token punctuation">,</span> GridNodePtr<span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>iterator nodeMapIt<span class="token punctuation">;</span>    <span class="token function">GridNode</span><span class="token punctuation">(</span>Eigen<span class="token double-colon punctuation">::</span>Vector3i _index<span class="token punctuation">,</span> Eigen<span class="token double-colon punctuation">::</span>Vector3d _coord<span class="token punctuation">)</span><span class="token punctuation">{</span>  <span class="token comment">//构造函数,初始化节点的各个参数，输入是节点的索引和坐标</span>id <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token comment">//节点的id</span>index <span class="token operator">=</span> _index<span class="token punctuation">;</span><span class="token comment">//节点的索引</span>coord <span class="token operator">=</span> _coord<span class="token punctuation">;</span><span class="token comment">//节点的坐标</span>dir   <span class="token operator">=</span> Eigen<span class="token double-colon punctuation">::</span><span class="token class-name">Vector3i</span><span class="token double-colon punctuation">::</span><span class="token function">Zero</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//节点的方向</span>    <span class="token comment">//Eigen::Vector3i::Zero()详细解释一下：Eigen::Vector3i是一个三维向量，Eigen::Vector3i::Zero()是一个三维向量，三个元素都是0</span>    <span class="token comment">//分别介绍Eigen和Vector3i：Eigen是一个C++模板库，用于线性代数运算，Vector3i是Eigen库中的一个类，表示一个三维向量</span>    <span class="token comment">//Zero()是Vector3i类中的一个函数，用于初始化一个三维向量，将向量的三个元素都初始化为0</span>gScore <span class="token operator">=</span> inf<span class="token punctuation">;</span><span class="token comment">//节点的g值,inf是一个无穷大的值</span>fScore <span class="token operator">=</span> inf<span class="token punctuation">;</span><span class="token comment">//节点的f值,inf是一个无穷大的值</span>cameFrom <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span><span class="token comment">//节点的父节点,初始化为NULL</span>    <span class="token punctuation">}</span>    <span class="token function">GridNode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//构造函数,初始化节点的各个参数</span>    <span class="token operator">~</span><span class="token function">GridNode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//析构函数,释放节点的内存</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token comment">//结构体什么时候调用构造函数，什么时候调用析构函数</span><span class="token comment">//结构体的构造函数和析构函数是在结构体的变量被创建和销毁的时候调用的</span><span class="token comment">//openSet.begin() -&gt; second 返回的是一个 GridNodePtr，该指针已经指向了一个已经构造完成的 GridNode 对象。这个 GridNode 对象的创建和构造在之前的代码中已经完成。</span><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="知识点回顾"><a href="#知识点回顾" class="headerlink" title="知识点回顾"></a>知识点回顾</h3><p>通常在编程中遇到的一些常见概念。为了便于理解，我将归类并简单描述。</p><ol><li><p><strong>指针</strong>：<br>指针是存储内存地址的变量。在C和C++编程中，我们可以使用指针访问不同的内存区域，从而获取或更改其内容。指针对于有效的内存管理和高效的编程任务（如动态内存分配和数据结构的操作）至关重要。</p></li><li><p><strong>数组</strong>：<br>数组是一个数据集合，其中所有数据都是相同类型的。在大多数编程语言中，数组中的元素可以通过其索引访问（通常从 0 开始）。</p></li><li><p><strong>对象和类</strong>：<br>对象和类是面向对象编程的两个基本概念。类定义了一组属性（数据元素）和方法（对数据执行操作的函数）。它是一个模板，我们可以根据这个模板创建对象（实例）。对象则是类的实例，具有定义在类中的属性和方法。</p></li><li><p><strong>结构体</strong>：<br>结构体是一种数据类型，在该类型中可以存储多种不同类型的数据。在C和C++中，我们可以使用<code>struct</code>关键字创建结构体。结构体通常用于存储相关联的数据项。</p></li><li><p><strong>模板</strong>：<br>在C++编程中，模板是一种功能强大的工具，允许我们编写独立于类型的代码。C++有两种模板，函数模板和类模板。这意味着我们可以创建一个可以处理多种数据类型的函数或类，并且数据类型可以在编译时确定。</p></li></ol><hr><p>结构体（Struct）并不是一个对象，而是一种用户定义的数据类型，用于组合并存储不同类型的数据。你可以将结构体看作是一个创建自定义数据类型的模板。在C和C++编程中，结构体通常用于存储一些逻辑上相关的信息。</p><p>创建结构体后，我们可以按照所定义的结构创建多个结构体变量（就像对象），并为这些变量的每个成员赋值。这些结构体变量存储的是结构体定义的数据类型。每个结构体变量都有自己的内存空间，它们的值相互独立，更改其中一个并不会影响其他变量。</p><p>例如，我们可以创建一个包含名字（字符串）和年龄（整数）的”Person”结构体，然后可以创建多个结构体变量（如tom、bob等），每个变量都会有自己特定的名字和年龄。</p><hr><p>在C++和其他一些类似编程语言中，点（.）和箭头（-&gt;）都用于访问结构体或对象的成员，但它们的使用情景有所不同：</p><ul><li><p><strong>点操作符（.）</strong>：当你直接操作结构体或对象时，使用点操作符来访问其成员。比如有一个名为 <code>person</code> 的结构体实例，我们可以用 <code>person.name</code> 来访问其 <code>name</code> 成员。</p></li><li><p><strong>箭头操作符（-&gt;）</strong>：当你有一个指向结构体或对象的指针时，使用箭头操作符来访问其成员。比如有一个指向 <code>person</code> 的指针 <code>p</code>，我们可以用 <code>p-&gt;name</code> 来访问 <code>person</code> 的 <code>name</code> 成员。</p></li></ul><p>总结一下，如果你持有的是实体的话就使用点<code>.</code>，如果你持有的是指针就使用箭头<code>-&gt;</code>。</p><hr><p>在C++中，定义一个结构体及其变量可以参照以下的步骤：</p><ol><li><p><strong>定义结构体</strong>：首先，我们需要定义结构体的数据结构，使用关键字 <code>struct</code> 加上你想要的结构体名字，然后在大括号 <code>{}</code> 中定义你需要的成员变量，比如我们定义一个名为 <code>Person</code> 的结构体，它包含 <code>name</code> 和 <code>age</code> 两个成员：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">struct</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span>    std<span class="token double-colon punctuation">::</span>string name<span class="token punctuation">;</span>    <span class="token keyword">int</span> age<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>定义结构体变量</strong>：有了结构体的定义后，我们可以根据这个模板来创建结构体的变量。可以直接在定义结构体的后面加上变量名来定义，也可以在后面的代码中通过 <code>struct 结构体名 变量名;</code> 来定义，比如：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// 定义结构体时直接定义了一个名为 tom 的变量</span><span class="token keyword">struct</span> <span class="token class-name">Person</span> <span class="token punctuation">{</span>    std<span class="token double-colon punctuation">::</span>string name<span class="token punctuation">;</span>    <span class="token keyword">int</span> age<span class="token punctuation">;</span><span class="token punctuation">}</span> tom<span class="token punctuation">;</span><span class="token comment">// 在代码中定义一个名为 bob 的变量</span><span class="token keyword">struct</span> <span class="token class-name">Person</span> bob<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>给结构体变量赋值</strong>：定义好结构体变量后，我们可以通过点操作符 <code>.</code> 来给变量的各个成员赋值：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">tom<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"Tom"</span><span class="token punctuation">;</span>tom<span class="token punctuation">.</span>age <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span>bob<span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"Bob"</span><span class="token punctuation">;</span>bob<span class="token punctuation">.</span>age <span class="token operator">=</span> <span class="token number">25</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ol><p>现在， <code>tom</code> 和 <code>bob</code> 就都已经安全地存储了他们各自的 <code>name</code> 和 <code>age</code> 信息。你可以按需在程序中使用它们。</p><hr><p><code>std::vector</code> 是一个 C++ 标准库提供的动态数组，其大小可以根据需要进行增加或减小。<code>vector&lt;double&gt;</code> 则表示元素类型为 <code>double</code> 的 <code>vector</code>，即可以存储 <code>double</code> 类型元素的动态数组。</p><p>以下介绍 <code>vector&lt;double&gt;</code> 的一些基本使用方法：</p><ol><li><p><strong>初始化</strong>：可以在声明时直接初始化，也可以在声明后添加元素。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> v1<span class="token punctuation">;</span>  <span class="token comment">// 声明一个空的vector</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> <span class="token function">v2</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 声明一个含有5个元素的vector，所有元素值为1.0</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span> v3 <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token number">2.0</span><span class="token punctuation">,</span> <span class="token number">3.0</span><span class="token punctuation">,</span> <span class="token number">4.0</span><span class="token punctuation">,</span> <span class="token number">5.0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>  <span class="token comment">// 声明并初始化vector</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li><li><p><strong>添加元素</strong>：<code>vector</code> 提供了 <code>push_back</code> 函数可以在尾部添加元素。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">v1<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 在v1的尾部添加一个元素1.0</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li><p><strong>访问元素</strong>：可以使用索引操作符 <code>[]</code> 或 <code>at</code> 函数访问元素，使用 <code>front</code> 和 <code>back</code> 分别获取首元素和尾元素。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">double</span> d1 <span class="token operator">=</span> v1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>  <span class="token comment">// 使用索引访问元素</span><span class="token keyword">double</span> d2 <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 使用at函数访问元素</span><span class="token keyword">double</span> d3 <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 获取首元素</span><span class="token keyword">double</span> d4 <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 获取尾元素</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>修改元素</strong>：可以使用索引操作符 <code>[]</code> 或 <code>at</code> 函数修改元素。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">v1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2.0</span><span class="token punctuation">;</span>  <span class="token comment">// 使用索引修改元素</span>v1<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">3.0</span><span class="token punctuation">;</span>  <span class="token comment">// 使用at函数修改元素</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p><strong>删除元素</strong>：使用 <code>pop_back</code> 可以删除尾部元素，使用 <code>erase</code> 可以删除指定位置的元素。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">v1<span class="token punctuation">.</span><span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 删除尾部元素</span>v1<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>v1<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 删除首元素</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p><strong>查看容量和大小</strong>：使用 <code>size</code> 函数可以查看 <code>vector</code> 中已有元素的数量，使用 <code>capacity</code> 可以查看 <code>vector</code> 当前的容量，使用 <code>empty</code> 可以判断 <code>vector</code> 是否为空。</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">size_t s <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 获取vector中元素的数量</span>size_t c <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">capacity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 获取vector的当前容量</span><span class="token keyword">bool</span> b <span class="token operator">=</span> v1<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 判断vector是否为空</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre></li></ol><p>此外，<code>std::vector</code> 还提供了很多其他的功能，比如排序，查找，复制等，可根据具体需要使用。</p><hr><p><code>openSet.begin()</code> 的确会返回一个迭代器，该迭代器指向 <code>multimap</code> 中的第一个元素（关键字最小的元素）。然而，需要注意的是，这个迭代器不是指容器本身，而是指向容器内的一个元素。</p><p>在这个上下文中，<code>begin() -&gt; second</code> 是指迭代器指向的首个元素的值。如果 <code>openSet</code> 是一个 <code>std::multimap&lt;KeyType, ValueType&gt;</code>，那么 <code>openSet.begin() -&gt; second</code> 就对应了首个元素的 <code>ValueType</code> 值。</p><p>这是因为 <code>multimap</code> 中每个元素都是一个键-值对，可以用 <code>first</code> 访问键，用 <code>second</code> 访问值。在这里，键对应迭代器的 <code>first</code> 属性，值对应迭代器的 <code>second</code> 属性。</p><p>因此，<code>currentPtr = openSet.begin() -&gt; second;</code> 这行代码的作用是将 <code>openSet</code> 中第一个元素的值赋给 <code>currentPtr</code>。</p><hr><p><code>openSet.begin()</code>返回的是一个迭代器，这个迭代器指向<code>openSet</code>这个<code>multimap</code>容器中的第一个元素。迭代器可以理解为容器中元素的地址或者引用，是一个可以用于遍历和操作容器内元素的工具，而非容器本身。所以，<code>openSet.begin()</code>并不会返回容器本身。</p><hr><p>名称 “ptr” 通常在编程语言中表示 “pointer”，指针是一种特殊的变量，其值为另一个变量的地址，即它”指向”另一个存在内存中的位置。具有指针特性的变量，我们就通常称它为 “指针”。</p><p>指针通常用于以下几种情况：</p><ol><li><p><strong>动态内存管理</strong>： 当你想要在运行时动态分配内存空间时，会使用指针。例如在 C++ 中，我们可以使用 <code>new</code> 和 <code>delete</code> 来分配和释放内存，它们都操作指针。</p></li><li><p><strong>操作数组</strong>： 指针和数组有很密切的关系。实际上，数组名是一个指向数组首元素的指针。</p></li><li><p><strong>传递函数参数</strong>： 当我们想要在函数内部修改外部变量的值，或者传递大量数据时，会使用指针或者引用。这比直接传值更有效率，因为我们只是传递了数据的地址，而不是复制了整份数据。</p></li><li><p><strong>实现高级数据结构</strong>：如链接表、树、图等数据结构，都需要使用指针。</p></li></ol><p>所以，“ptr”是一个非常常见的名称，它通常代表一个指向某个数据或者对象的指针。</p><hr><p>只包含一个键-值对的对象也可以称之为容器。在编程中，容器是用来持有和管理一组元素的数据结构。这些元素可以是基本的数据类型，也可以是复杂的对象类型，甚至是键-值对。</p><p>例如在 C++ 中，<code>std::map</code>、<code>std::unordered_map</code> 或者 <code>std::multimap</code> 都是可以存放键-值对的容器。即使这些容器中只有一个键-值对，也是被认为是容器的实例。</p><p>这是因为，容器的定义并非由其包含元素的数量决定，而是由其提供的用于访问、插入和删除元素等操作的接口决定。因此，最小的容器是空容器，即不包含任何元素的容器。</p><hr><p><code>vector&lt;double&gt; edgeCostSets;</code> 这段代码是在声明一个名为 <code>edgeCostSets</code> 的 <code>vector</code> 容器，该容器用于存储 <code>double</code> 类型的数据。</p><p><code>std::vector</code> 是 C++ 标准库中的一种序列容器，用于存储动态大小的元素集合，其大小可以根据需要自动调整。</p><p>举例说明 <code>edgeCostSets</code> 的一些常见用法：</p><p><strong>添加元素：</strong><br>我们可以使用 <code>push_back()</code> 方法向 <code>vector</code> 尾部添加元素：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">2.5</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p><strong>访问元素：</strong><br>我们可以使用索引（跟数组类似）或者迭代器访问 <code>vector</code> 里的元素：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">double</span> firstElement <span class="token operator">=</span> edgeCostSets<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>  <span class="token comment">// 使用索引访问</span><span class="token comment">// 使用迭代器遍历并打印所有元素</span><span class="token keyword">for</span><span class="token punctuation">(</span>vector<span class="token operator">&lt;</span><span class="token keyword">double</span><span class="token operator">&gt;</span><span class="token double-colon punctuation">::</span>iterator it <span class="token operator">=</span> edgeCostSets<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> it <span class="token operator">!=</span> edgeCostSets<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">++</span>it<span class="token punctuation">)</span> <span class="token punctuation">{</span>    cout <span class="token operator">&lt;&lt;</span> <span class="token operator">*</span>it <span class="token operator">&lt;&lt;</span> <span class="token string">" "</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>获取大小：</strong><br>可以使用 <code>size()</code> 方法获取 <code>vector</code> 的大小（元素个数）：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>size_t size <span class="token operator">=</span> edgeCostSets<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><strong>删除元素：</strong><br>删除元素通常可以使用 <code>erase()</code> 方法：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">edgeCostSets<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>edgeCostSets<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 删除第一个元素</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>综上，<code>vector&lt;double&gt; edgeCostSets;</code> 定义了一个可以存储 <code>double</code> 类型数值的动态数组 <code>edgeCostSets</code>。</p><hr><p>当我们声明一个 <code>std::vector&lt;double&gt; edgeCostSets;</code> 时，我们实际上创建了一个动态数组 <code>edgeCostSets</code>，它可以持久化 <code>double</code> 类型的数据。初始化时，<code>edgeCostSets</code> 是空的，没有任何元素。</p><p>我们可以把 <code>std::vector</code> 容器想象成一条连续的内存存储线，对应到它的物理结构，它是在堆内存中连续分配的一片内存区域。每一个 <code>double</code> 类型的元素都按顺序放在这条线上的一个位置。</p><p>假设我们这样操作：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1.1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">2.2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>edgeCostSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">3.3</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>在这个情况下容器的内部结构如下：</p><pre class="line-numbers language-none"><code class="language-none">index:   0    1    2  value:  1.1  2.2  3.3<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>我们向 <code>edgeCostSets</code> 中追加了3个元素，每次调用 <code>push_back</code> 方法都会在 vector 的末尾添加一个新的元素。这些元素都存储在连续的内存地址上，我们可以通过索引（从<code>0</code>开始计数）来访问各个元素。</p><p>由于 <code>std::vector</code> 是动态数组，如果需要添加更多的元素，内存会自动重新分配并扩展以容纳新的元素。同时，由于是连续的内存空间，访问效率高，但插入删除效率低（尤其在中间位置插入删除）。使用 <code>std::vector</code> 需要根据实际需求判断其优劣。</p><hr><p><code>vector&lt;GridNodePtr&gt; neighborPtrSets;</code> 这段代码中，我们在创建一个名为 <code>neighborPtrSets</code> 的 <code>vector</code> 容器，该容器用于存储 <code>GridNodePtr</code> 类型的数据。这里 <code>GridNodePtr</code> 可能是一个指向 <code>GridNode</code> 对象的指针，或者是某种用户自定义类型。我会以 <code>GridNodePtr</code> 是一个指向对象的指针来进行解释。</p><p><code>std::vector</code> 是 C++ 标准库中的一种序列容器，用于存储动态大小的元素集合。在物理结构上，它是在堆内存中连续分配的一片内存区域。</p><p>假设我们已经定义了 <code>GridNode</code> 类，并且已经初始化了一些 <code>GridNode</code> 对象和相应的指针 <code>GridNodePtr</code>。</p><p>举例来说：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">GridNode node1<span class="token punctuation">,</span> node2<span class="token punctuation">,</span> node3<span class="token punctuation">;</span>GridNodePtr nodePtr1 <span class="token operator">=</span> <span class="token operator">&amp;</span>node1<span class="token punctuation">;</span>GridNodePtr nodePtr2 <span class="token operator">=</span> <span class="token operator">&amp;</span>node2<span class="token punctuation">;</span>GridNodePtr nodePtr3 <span class="token operator">=</span> <span class="token operator">&amp;</span>node3<span class="token punctuation">;</span>neighborPtrSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>nodePtr1<span class="token punctuation">)</span><span class="token punctuation">;</span>neighborPtrSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>nodePtr2<span class="token punctuation">)</span><span class="token punctuation">;</span>neighborPtrSets<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>nodePtr3<span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在此例中，我们创建了3个 <code>GridNode</code> 对象，然后将它们的地址（即 <code>GridNodePtr</code> 指针）追加到了 <code>neighborPtrSets</code> 中。这样后，<code>neighborPtrSets</code> 的内部结构会如下所示：</p><pre class="line-numbers language-none"><code class="language-none">index:   0        1         2 value: &amp;node1   &amp;node2   &amp;node3<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>这样，<code>neighborPtrSets</code> 就存储了三个指针，这些指针都是指向 <code>GridNode</code> 对象的指针。我们可以通过这些存储在 <code>neighborPtrSets</code> 中的指针来访问和操作原始对象。</p><p>请注意，容器中实际存储的是指针，而不是对象本身。因此，如果原始对象被修改，那么通过 <code>neighborPtrSets</code> 访问时得到的对象内容也会相应改变。同样，如果原始对象被销毁了，那么在 <code>neighborPtrSets</code> 中对应的指针就会成为悬空指针，此时再通过这个指针来访问对象就会出现未定义的行为。</p><hr><p>当创建一个新的 <code>GridNodePtr</code>，比如 <code>GridNodePtr currentPtr</code>，并且你让它指向一个新的 <code>GridNode</code> 对象时，就会调用一次 <code>GridNode</code> 的构造函数。实例化 <code>GridNode</code> 对象的方式可能是使用 <code>new</code> 关键字等。</p><p>假设你有如下的代码：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">GridNodePtr currentPtr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">GridNode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在这个例子中，一个新的 <code>GridNode</code> 对象被创建，同时 <code>GridNode</code> 的构造函数被执行。<code>currentPtr</code> 就是指向这个新创建的 <code>GridNode</code> 对象的指针。</p><p>确保当你不再需要这个 <code>GridNode</code> 对象时，你要使用 <code>delete</code> 关键字来释放它，防止内存泄漏。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">delete</span> currentPtr<span class="token punctuation">;</span>currentPtr <span class="token operator">=</span> <span class="token keyword">nullptr</span><span class="token punctuation">;</span> <span class="token comment">// 防止成为野指针</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>记住，对于在堆上动态分配的对象，你必须明确释放它们，否则这些对象将一直占据内存，直到程序结束，这可能会导致内存泄漏。</p><hr><p>代码 <code>currentPtr = openSet.begin() -&gt; second;</code> 中，实际上并没有创建一个新的 <code>GridNode</code> 对象，也就没有调用 <code>GridNode</code> 的构造函数。</p><p>这段代码的含义是，将 <code>currentPtr</code> 指向 <code>openSet</code> 容器的第一个元素的 <code>second</code> 成员。这里假设 <code>openSet</code> 是一个像 <code>std::map&lt;Key, GridNodePtr&gt;</code> 或 <code>std::unordered_map&lt;Key, GridNodePtr&gt;</code> 这样的容器，它的元素是由 <code>Key</code> 类型的键和 <code>GridNodePtr</code> 类型的值组成的键值对。</p><p>所以，<code>openSet.begin() -&gt; second</code> 获取的是 <code>openSet</code> 的第一个元素（键值对）的值部分，这个值应该是一个 <code>GridNodePtr</code>，指向某个 <code>GridNode</code> 对象。然后，你将 <code>currentPtr</code> 指向了这个已经存在的 <code>GridNode</code> 对象。</p><p>请注意，这种情况下，你有责任确保 <code>openSet.begin() -&gt; second</code> 指向的 <code>GridNode</code> 对象在使用 <code>currentPtr</code> 的整个生命周期中都是有效的。换句话说，如果在还在使用 <code>currentPtr</code> 的时候，<code>openSet.begin() -&gt; second</code> 指向的对象被销毁了，那么 <code>currentPtr</code> 就会变成一个悬空指针，这将导致未定义的行为。</p><hr><p><code>openSet.begin() -&gt; second</code> 返回的是一个 <code>GridNodePtr</code>，该指针已经指向了一个已经构造完成的 <code>GridNode</code> 对象。这个 <code>GridNode</code> 对象的创建和构造可能在之前的代码中已经完成，这可能包括调用构造函数初始化对象等操作。 </p><p>举个例子，以下面这段代码为例：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// 假设 GridNode 实现了以下构造函数</span><span class="token class-name">GridNode</span><span class="token double-colon punctuation">::</span><span class="token function">GridNode</span><span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>    nodeValue <span class="token operator">=</span> value<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment">// 在某处创建了一个新的 GridNode 对象，并加入到 openSet 中</span><span class="token keyword">int</span> keyValue <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>GridNodePtr nodePtr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">GridNode</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>openSet<span class="token punctuation">[</span>keyValue<span class="token punctuation">]</span> <span class="token operator">=</span> nodePtr<span class="token punctuation">;</span><span class="token comment">// 然后在其他地方，你可能会这样使用</span>GridNodePtr currentPtr <span class="token operator">=</span> openSet<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-&gt;</span> second<span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在此例中，<code>openSet.begin() -&gt; second</code> 就会返回之前创建的 <code>GridNodePtr</code>，它指向的 <code>GridNode</code> 的构造函数在前面的代码中就已经调用过了。所以 <code>currentPtr</code> 最终指向的是这个已经构造并初始化完成的 <code>GridNode</code> 对象。</p><hr><p><code>continue</code> 语句仅跳过当前循环，并立即开始下一个迭代。对于嵌套循环，<code>continue</code> 仅适用于最内层的循环。</p><p>在你给的这段代码中，如果 <code>i == 0 &amp;&amp; j == 0 &amp;&amp; k == 0</code>，<code>continue</code> 会导致立即开始下一个 <code>k</code> 循环的迭代，而不是跳过整个 <code>k</code> 循环或 <code>j</code> 或 <code>i</code> 循环。也就是说，如果 <code>continue</code> 语句被执行，那么它将跳过下面的代码（如果有的话），并立即在 <code>k</code> 循环中开始下一个迭代。如果 <code>k</code> 循环已经是最后一次迭代，那么它将跳到 <code>j</code> 循环的下一次迭代，对于 <code>j</code> 循环同样如此。</p><p>如果你想在某个条件下跳过所有的循环或者跳出全部循环，你可能需要使用更复杂的控制流，例如设置一个标志变量或使用 <code>goto</code> 语句。（但是注意，<code>goto</code> 语句在现代编程中的使用通常是不被推荐的，因为它可能会使代码难以理解和维护。）</p><hr><p>在 C++ 中，<code>for</code> 循环有多种变体。这里使用的是 C++11 引入的基于范围的 <code>for</code> 循环。这种循环语句会依次迭代容器（如数组，向量，集合等）中的每个元素。</p><p>在你给出的代码 <code>for (auto ptr: gridPath)</code> 中：</p><ul><li><p><code>gridPath</code> 是一个容器，如 <code>std::vector</code>、<code>std::list</code>、<code>std::array</code>、<code>std::set</code>、<code>std::map</code>等。这个容器中应该含有你感兴趣的数据。</p></li><li><p><code>ptr</code> 是一个局部变量，其类型由 <code>auto</code> 自动推导得出，和 <code>gridPath</code> 中的数据类型相同。在每次循环中，<code>ptr</code> 都会被设置为 <code>gridPath</code> 中的当前元素。这样，你就可以在 <code>for</code> 循环的代码块中使用 <code>ptr</code> 来操作当前元素。</p></li></ul><p>例如，如果 <code>gridPath</code> 是一个 <code>std::vector&lt;int&gt;</code>，<code>ptr</code> 则为 <code>int</code> 类型的元素；如果 <code>gridPath</code> 是一个 <code>std::vector&lt;GridNodePtr&gt;</code>，<code>ptr</code> 则为 <code>GridNodePtr</code> 类型的元素。</p><p>这种基于范围的 <code>for</code> 循环是一种非常便捷的方式，可以轻易遍历容器，而无需管理索引或迭代器。下面是一个具体的例子：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> numbers <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> num<span class="token operator">:</span> numbers<span class="token punctuation">)</span> <span class="token punctuation">{</span>    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> num <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>这将输出：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token number">1</span><span class="token number">2</span><span class="token number">3</span><span class="token number">4</span><span class="token number">5</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr><p><code>vector&lt;Vector3d&gt; path;</code> 这行代码定义了一个名为 <code>path</code> 的 <code>std::vector</code> 容器，而这个容器中存储的元素类型是 <code>Vector3d</code>。<code>Vector3d</code> 通常代表一个包含三个数值的三维向量。</p><p>具体来说，<code>Vector3d</code> 可能是一个类或一个结构体，它通常包含三个浮点数成员（例如 <code>x</code>、<code>y</code> 和 <code>z</code>），用于描述三维空间中的一个点或者一个方向向量。例如，在某些图形编程库或者物理引擎中，<code>Vector3d</code> 可能被定义为：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">struct</span> <span class="token class-name">Vector3d</span> <span class="token punctuation">{</span>    <span class="token keyword">double</span> x<span class="token punctuation">;</span>    <span class="token keyword">double</span> y<span class="token punctuation">;</span>    <span class="token keyword">double</span> z<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在这种情况下，<code>vector&lt;Vector3d&gt; path;</code> 将存储一系列的三维坐标或向量。例如，你可以这样初始化和使用它：</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">vector<span class="token operator">&lt;</span>Vector3d<span class="token operator">&gt;</span> path<span class="token punctuation">;</span>Vector3d point1 <span class="token punctuation">{</span><span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token number">2.0</span><span class="token punctuation">,</span> <span class="token number">3.0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>   <span class="token comment">// 创建一个 Vector3d 对象</span>Vector3d point2 <span class="token punctuation">{</span><span class="token number">4.0</span><span class="token punctuation">,</span> <span class="token number">5.0</span><span class="token punctuation">,</span> <span class="token number">6.0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>   <span class="token comment">// 创建另一个 Vector3d 对象</span>path<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>point1<span class="token punctuation">)</span><span class="token punctuation">;</span>            <span class="token comment">// 添加到 vector 的末尾</span>path<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>point2<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">// 遍历 vector 并打印出每个 Vector3d 对象</span><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> point <span class="token operator">:</span> path<span class="token punctuation">)</span> <span class="token punctuation">{</span>    cout <span class="token operator">&lt;&lt;</span> <span class="token string">"x: "</span> <span class="token operator">&lt;&lt;</span> point<span class="token punctuation">.</span>x          <span class="token operator">&lt;&lt;</span> <span class="token string">", y: "</span> <span class="token operator">&lt;&lt;</span> point<span class="token punctuation">.</span>y          <span class="token operator">&lt;&lt;</span> <span class="token string">", z: "</span> <span class="token operator">&lt;&lt;</span> point<span class="token punctuation">.</span>z <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>在具体实际使用中，<code>Vector3d</code> 的定义可能略有不同，具体取决于你所使用的库或者实际需求。</p><hr><p><code>push_back</code> 是 C++ <code>std::vector</code> 类的一个成员函数，其主要用途是在容器的末尾插入一个新的元素。这个函数将其参数作为新元素添加到 vector 的末尾，vector 的大小会相应地增加。</p><p>下面是 <code>push_back</code> 的一些常见用法：</p><ol><li><p>向空 vector 添加元素：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> v<span class="token punctuation">;</span>v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// v 现在包含一个元素：1</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p>向已有元素的 vector 添加元素：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> v <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span>v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// v 现在包含四个元素：2, 3, 4, 5</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li><p>使用循环添加多个元素：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">&gt;</span> v<span class="token punctuation">;</span><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span><span class="token punctuation">{</span>    v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// v 现在包含十个元素：0, 1, 2, ... , 9</span><span class="token punctuation">}</span> <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre></li><li><p>添加自定义类型的元素：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token keyword">struct</span> <span class="token class-name">Point</span> <span class="token punctuation">{</span>    <span class="token keyword">int</span> x<span class="token punctuation">;</span>    <span class="token keyword">int</span> y<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>Point<span class="token operator">&gt;</span> v<span class="token punctuation">;</span>Point p <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">;</span>v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// v 现在包含一个 Point 元素：{1, 2}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p> 或者直接使用 <code>{}</code> 添加：</p> <pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">v<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// v 现在包含两个 Point 元素：{1, 2}, {3, 4}</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li></ol><p>注意：如果 vector 的容量不足以存储新的元素，<code>push_back</code> 操作可能会导致存储内容的内存区间被重新分配，从而使所有指向旧存储内容的迭代器、引用和指针失效。为了避免频繁的内存重新分配，你可以先用 <code>reserve</code> 函数预先分配足够的空间。</p><hr><p>在 C++ 中，<code>insert</code> 是 <code>std::set</code>、<code>std::map</code>、<code>std::multiset</code>、<code>std::multimap</code>、<code>std::unordered_set</code>、<code>std::unordered_map</code>、<code>std::unordered_multiset</code> 和 <code>std::unordered_multimap</code> 容器的成员函数之一。这个函数用于插入元素到容器中。</p><p>在你的示例代码 <code>local_set.insert( make_pair(f_new, (*it).second) );</code> 中：</p><ul><li><p><code>local_set</code> 是一个集合或映射类型容器（比如 <code>std::map</code>, <code>std::set</code>, <code>std::unordered_map</code> 或者 <code>std::unordered_set</code>）。具体类型需要根据具体上下文来确定。</p></li><li><p><code>(*it).second</code> 表示迭代器 <code>it</code> 所指向的元素的第二组成部分，<code>it</code> 通常是指向一个如 <code>std::pair</code> 类型元素的迭代器。结构类似 <code>std::pair&lt;KeyType, ValueType&gt;</code>，其中 <code>.first</code> 是键（或叫第一组成部分），<code>.second</code> 是值（或叫第二组成部分）。</p></li><li><p><code>make_pair(f_new, (*it).second)</code> 会生成一个 <code>std::pair</code> 对象，其中第一个元素是 <code>f_new</code>，第二个元素是 <code>(*it).second</code>。</p></li><li><p><code>local_set.insert( make_pair(f_new, (*it).second) );</code> 最终将一个包含两个元素 <code>f_new</code> 和 <code>(*it).second</code> 的 pair 插入到 <code>local_set</code> 容器中。</p></li></ul><p>举个例子，如果 <code>local_set</code> 是 <code>std::map&lt;int, int&gt;</code> 类型，<code>it</code> 是另一个相同类型 <code>map</code> 的迭代器，并且 <code>f_new</code> 是 <code>int</code> 类型，则以下代码将将 <code>f_new</code> 和 <code>it</code> 所迭代到的值作为新的键值对插入到 <code>local_set</code> 中。</p><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">std<span class="token double-colon punctuation">::</span>map<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">&gt;</span> another_map <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token keyword">auto</span> it <span class="token operator">=</span> another_map<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> f_new <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>std<span class="token double-colon punctuation">::</span>map<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">&gt;</span> local_set<span class="token punctuation">;</span>local_set<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span> <span class="token function">make_pair</span><span class="token punctuation">(</span>f_new<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token operator">*</span>it<span class="token punctuation">)</span><span class="token punctuation">.</span>second<span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>  <span class="token comment">// 在 local_set 中插入 pair（5, 2）</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;Astar-searcher-cpp&quot;&gt;&lt;a href=&quot;#Astar-searcher-cpp&quot; class=&quot;headerlink&quot; title=&quot;Astar_searcher.</summary>
      
    
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/categories/ROS/"/>
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/tags/ROS/"/>
    
  </entry>
  
  <entry>
    <title>规控前奏——ROS相关</title>
    <link href="http://liam-xander.github.io/2024/03/14/20240314/"/>
    <id>http://liam-xander.github.io/2024/03/14/20240314/</id>
    <published>2024-03-14T11:00:00.000Z</published>
    <updated>2024-03-23T21:02:01.254Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><h2 id="规控前奏——ROS相关"><a href="#规控前奏——ROS相关" class="headerlink" title="规控前奏——ROS相关"></a>规控前奏——ROS相关</h2><h3 id="1-ROS概述"><a href="#1-ROS概述" class="headerlink" title="1.ROS概述"></a>1.ROS概述</h3><p>ROS是一个强大的工具,我们应该熟练使用它,而不被它所束缚。ROS的通信机制类似于MQTT,采用分布式的话题通讯和服务通讯模式。话题用于发送和接收数据,服务则是请求-响应式的。参数服务器提供全局变量功能。</p><p>ROS不仅提供通信机制,还包括开发工具、应用功能包和庞大的生态系统。开发工具如rqt_graph可视化节点关系,rostopic/rosservice查看话题/服务,rosmsg/rossrv管理消息/服务类型。应用功能包可直接移植使用,节省开发时间。</p><p>分析新功能包的步骤:首先浏览目录结构,查看package.xml和CMakeLists.txt了解功能和依赖;然后检查话题/服务的数据格式,研究launch文件中的节点关系;最后启动功能包,通过rqt_graph验证分析结果。</p><p>熟练使用ROS工具、移植应用功能包、组合搭配不同功能,才是掌握ROS的关键所在。</p><h3 id="2-ROS通信机制（划重点！）"><a href="#2-ROS通信机制（划重点！）" class="headerlink" title="2.ROS通信机制（划重点！）"></a>2.ROS通信机制（划重点！）</h3><p><strong>感觉ROS Master节点管理器的模式可以类比到mqtt，它们两个都是分布式的通讯</strong>；</p><blockquote><p>微信的及时通讯等也使用了基于MQTT的消息推送机制,使用发布/订阅模式进行消息传输,降低了系统耦合度。使用TCP/IP协议通信,提供不同服务质量(QoS)的消息发布订阅。消息分为主题和内容两个逻辑部分。</p></blockquote><p><strong>感觉话题通讯就是发送数据和接收数据，只是丢出去和接收的关系；感觉服务通讯就是我给你数据，你给我反馈，没有反馈就是失败和错误；参数编程模式:参数服务器(Parameter Server),允许在节点之间共享参数变量,实现全局配置的功能。其实就是一个全局变量……</strong></p><p>ROS是一种高级的机器人编程环境，其主要组成部分包括通信机制、开发工具、应用功能以及一个完整的生态系统。</p><ul><li><p><strong>通讯机制</strong>：这是ROS的核心部分，它允许不同的软件组件（称为节点）在一个共享的网络环境中进行交流和协作。这些节点由节点管理器管理。</p></li><li><p><strong>节点</strong>：节点是ROS中进行任务处理的基本单位，每个节点都会执行一个特定的任务。不同的节点可以通过消息的方式相互通信。</p></li><li><p><strong>节点管理器</strong>：节点管理器（roscore）负责连接和管理所有的节点。它会记录节点的信息，并确保它们能够相互找到并进行通信。</p></li><li><p>话题（Topics）和服务（Services）：这是ROS的两种主要通讯方式。话题是一种发布/订阅的通讯方式，一个节点可以发布消息到某个话题上，其他节点可以订阅这个话题来接收消息。而服务则是一种同步的请求/响应的通讯方式，一个节点可以向另一个节点请求服务，等待对方的响应。</p></li><li><p><strong>开发工具</strong>：ROS 提供了一套完整的开发工具，帮助开发者更有效地开发和调试软件。</p></li><li><p><strong>应用功能</strong>：ROS 定义了一系列的应用级功能，比如导航、感知和操控等，帮助开发者构建复杂的机器人应用。</p></li><li><p><strong>生态系统</strong>：除了上述的软件组件，ROS 还有一个健康的社区和丰富的软件资源，帮助开发者快速开发和部署复杂的机器人系统。</p></li></ul><h3 id="3-ROS开发工具"><a href="#3-ROS开发工具" class="headerlink" title="3.ROS开发工具"></a>3.ROS开发工具</h3><p>ROS提供了rqt_graph这个工具,它能够生成节点关系图,直观地展现出当前运行的各个节点之间的连接情况,充分反映了整个系统的通信拓扑结构。使用rqt_graph,就能一目了然地观察到系统是如何被整合并运行起来的。</p><h3 id="4-运行ROS系统实例"><a href="#4-运行ROS系统实例" class="headerlink" title="4.运行ROS系统实例"></a>4.运行ROS系统实例</h3><p>为了直观地理解ROS系统的运行机制,启动键盘控制示例,并运行rqt_graph可视化工具。节点关系图清晰地展现了系统各个节点之间的数据流动过程,我一目了然地看到了系统是如何被整合并协同工作的。至少通过节点关系图,大致把握了整个系统的运行逻辑和节点交互的方式。</p><p>然后进一步了解这些节点之间传递的具体数据内容。节点之间的通信主要依赖于话题(Topic)和服务(Service)两种通信模式。要查看话题的数据格式和内容,可以使用ROS提供的rostopic工具。</p><p>而既然有rostopic工具用于管理话题通信,自然也应该存在类似的rosservice工具,用于检查和调用服务通信的请求响应数据。通过这些工具,就能够逐步深入理解ROS系统的本质运行原理。</p><p>ROS（Robot Operating System）的入门学习，其中包括ROS的通讯机制和工具的使用。ROS的通讯机制通过msg和srv的格式来定义，这些格式由rosmsg或rossrv工具来决定。<br>这些工具只是ROS系统中的一部分，要想熟练掌握ROS，你需要了解和掌握更多的工具，例如rviz、gazebo、Moveit等。ROS的工具体系十分强大和全面。<br>这里的”ROS的应用功能”指的是功能包，这些功能包可以被移植到你自己的系统中使用。当你需要让两个或以上的功能包一起工作时，你就需要进行一些调配。<br>换言之，ROS提供了许多已经建好的”轮子”供我们使用，</p><h3 id="5-应用功能包使用-划重点！"><a href="#5-应用功能包使用-划重点！" class="headerlink" title="5.应用功能包使用 (划重点！)"></a>5.应用功能包使用 (划重点！)</h3><p><strong>在拿到一个新的、陌生的功能包的时候，我的习惯，先是tree一下，看一下这个功能包里面都有哪些组成；然后是看package.xml，这个文件可以让我大致知道这个功能包能做什么，依赖了什么；接着是CMakeList.txt，这里我可以看到依赖包、消息、服务、动作、配置，甚至是需要编译的文件、测试节点、文档等等内容。在看完package.xml和CMakeList.txt以后，对这个功能包有了一个大概的猜想</strong>。</p><p><strong>然后是查看话题、服务等等内容，看看数据格式是什么，内容是什么；再然后就是看launch文件，看launch文件的每个node和param，了解在这个功能包里面的节点关系是什么样的</strong>。</p><p><strong>最后就是启动这个功能包，rqt_graph验证自己的猜想。至此，一个功能包的分析大致结束</strong>。</p><p><img src="/images/12.jpg"></p><p>以上内容根据博客：<a href="https://www.guyuehome.com/Bubble/detail/id/66110">失眠，聊聊自己搞ROS的心得体会吧 </a>进行补充与修改。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;h2 id=&quot;规控前奏——ROS相关&quot;&gt;&lt;a href=&quot;#规控前奏——ROS相关&quot; class=&quot;headerlink&quot; title=&quot;规控前奏——ROS相关&quot;&gt;&lt;/a&gt;规控前奏——ROS相关&lt;/h2&gt;&lt;</summary>
      
    
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/categories/ROS/"/>
    
    
    <category term="ROS" scheme="http://liam-xander.github.io/tags/ROS/"/>
    
  </entry>
  
  <entry>
    <title>Rototics and Control</title>
    <link href="http://liam-xander.github.io/2024/03/13/20230312night/"/>
    <id>http://liam-xander.github.io/2024/03/13/20230312night/</id>
    <published>2024-03-13T06:25:00.000Z</published>
    <updated>2024-03-16T02:17:05.503Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="Robotics" scheme="http://liam-xander.github.io/tags/Robotics/"/>
    
    <category term="C++" scheme="http://liam-xander.github.io/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>Rototics and Control</title>
    <link href="http://liam-xander.github.io/2024/03/13/another/"/>
    <id>http://liam-xander.github.io/2024/03/13/another/</id>
    <published>2024-03-13T06:25:00.000Z</published>
    <updated>2024-03-12T06:59:48.051Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="Robotics" scheme="http://liam-xander.github.io/tags/Robotics/"/>
    
    <category term="C++" scheme="http://liam-xander.github.io/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>typora-vue-theme主题介绍</title>
    <link href="http://liam-xander.github.io/2024/03/12/20240312/"/>
    <id>http://liam-xander.github.io/2024/03/12/20240312/</id>
    <published>2024-03-12T01:25:00.000Z</published>
    <updated>2024-03-12T04:23:18.039Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="Typora" scheme="http://liam-xander.github.io/tags/Typora/"/>
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="http://liam-xander.github.io/2024/03/11/hello-world/"/>
    <id>http://liam-xander.github.io/2024/03/11/hello-world/</id>
    <published>2024-03-11T15:01:39.157Z</published>
    <updated>2024-03-12T04:21:40.569Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    
    <category term="Typora" scheme="http://liam-xander.github.io/tags/Typora/"/>
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>typora-vue-theme主题介绍</title>
    <link href="http://liam-xander.github.io/2023/12/29/20240312afternoon/"/>
    <id>http://liam-xander.github.io/2023/12/29/20240312afternoon/</id>
    <published>2023-12-29T06:25:00.000Z</published>
    <updated>2024-03-12T04:23:14.934Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="Typora" scheme="http://liam-xander.github.io/tags/Typora/"/>
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>Trajectory planning and cooperative control of UAV lifting system主题介绍</title>
    <link href="http://liam-xander.github.io/2023/10/16/recommended-articles/"/>
    <id>http://liam-xander.github.io/2023/10/16/recommended-articles/</id>
    <published>2023-10-16T02:34:00.000Z</published>
    <updated>2024-03-12T04:25:39.960Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="Markdown" scheme="http://liam-xander.github.io/categories/Markdown/"/>
    
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
    <category term="UAV" scheme="http://liam-xander.github.io/tags/UAV/"/>
    
  </entry>
  
  <entry>
    <title>typora-vue-theme主题介绍</title>
    <link href="http://liam-xander.github.io/2023/09/07/hello-world-again/"/>
    <id>http://liam-xander.github.io/2023/09/07/hello-world-again/</id>
    <published>2023-09-07T01:25:00.000Z</published>
    <updated>2024-03-12T04:25:45.860Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="C++" scheme="http://liam-xander.github.io/categories/C/"/>
    
    
    <category term="Typora" scheme="http://liam-xander.github.io/tags/Typora/"/>
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>Trajectory planning主题介绍</title>
    <link href="http://liam-xander.github.io/2023/08/26/test/"/>
    <id>http://liam-xander.github.io/2023/08/26/test/</id>
    <published>2023-08-26T02:35:00.000Z</published>
    <updated>2024-03-23T21:02:29.726Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo new <span class="token string">"My New Post"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo generate<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    <category term="Markdown" scheme="http://liam-xander.github.io/categories/Markdown/"/>
    
    
    <category term="Typora" scheme="http://liam-xander.github.io/tags/Typora/"/>
    
    <category term="Markdown" scheme="http://liam-xander.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>一切的开始</title>
    <link href="http://liam-xander.github.io/2023/05/29/20230522/"/>
    <id>http://liam-xander.github.io/2023/05/29/20230522/</id>
    <published>2023-05-29T00:00:00.000Z</published>
    <updated>2024-03-23T21:01:43.596Z</updated>
    
    <content type="html"><![CDATA[<p>怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》</p><hr><h2 id="时间、空间与最速曲线的深入思考"><a href="#时间、空间与最速曲线的深入思考" class="headerlink" title="时间、空间与最速曲线的深入思考"></a>时间、空间与最速曲线的深入思考</h2><p>在探索时间与空间的关系时，我们常感到被无形的力量所束缚。作为三维生物的人类，我们的存在似乎完全受制于时间这一维度的严格支配。我们所经历的“现在”不断地滑向过去，未来则不断地成为现在，形成一个连续不断的流。这一切仿佛注定了所有生命将在不同的轨迹上前进，但无论速度快慢，无法逃脱时间的终极归宿。</p><h3 id="时间的相对性与最速曲线"><a href="#时间的相对性与最速曲线" class="headerlink" title="时间的相对性与最速曲线"></a>时间的相对性与最速曲线</h3><p>然而，爱因斯坦的相对论以及<strong>最速曲线</strong>概念向我们揭示了时间和空间并非刚性固定，而是可以被形变和曲折的东西。最速曲线，或称为测地线，在广义相对论中描述了在弯曲时空中质点在两点间所经历的最短路径。它令人考虑，是否能通过物理法则以及对时空的更深理解，来找到一种“最优的人生路径”。</p><h4 id="时空曲线：穿越宿命的航道"><a href="#时空曲线：穿越宿命的航道" class="headerlink" title="时空曲线：穿越宿命的航道"></a>时空曲线：穿越宿命的航道</h4><p>时空曲线不仅仅是数学物理上的抽象概念，它在实际中亦有所体现。它仿佛是一条穿越重重时空纠葛的隐秘航道，带我们掠过潜在的无数可能性，最终抵达命运所指引的彼岸。</p><h3 id="生产制造和项目管理中的最优路径深化"><a href="#生产制造和项目管理中的最优路径深化" class="headerlink" title="生产制造和项目管理中的最优路径深化"></a>生产制造和项目管理中的最优路径深化</h3><ul><li><strong>生产制造领域</strong>中，通过构建高度自动化与信息化的工艺流程，人类可以在时间的长河中创造出更大的价值，提升生活的质量。</li><li><strong>项目管理</strong>也不再是简单的任务安排，而是成为了一门实现效率与创造性结合的艺术，通过科学合理的规划和资源调配达到目标。</li></ul><h3 id="个人目标追求与时间效率的最优化"><a href="#个人目标追求与时间效率的最优化" class="headerlink" title="个人目标追求与时间效率的最优化"></a>个人目标追求与时间效率的最优化</h3><p>每个人生旅途中的目标和梦想是独一无二的，如何在时间的大海中找到属于自己的航向？我们不仅需要对自我有深度的了解，还需对周達環境有敏锐的认知。选择最优路径就如同在一个多元宇宙中选择我们所期望的宇宙版本，意味着我们要结合理性与直觉、策略与灵感。</p><h4 id="适应变化：人生选择的智慧"><a href="#适应变化：人生选择的智慧" class="headerlink" title="适应变化：人生选择的智慧"></a>适应变化：人生选择的智慧</h4><p>我们必须学会适应变化，以坦然面对生活中的不确定性和曲折，利用我们的灵活性和资源克服障碍，持续向着我们的最终目的地迈进。</p><h3 id="决策的艺术与意志力的坚持"><a href="#决策的艺术与意志力的坚持" class="headerlink" title="决策的艺术与意志力的坚持"></a>决策的艺术与意志力的坚持</h3><p>追寻梦想的道路充满了未知和变数。我们生命中的每个决策都类似于选择在时空中的一个节点，影响着未来的方向和速度。这不仅需要明智的选择和深远的思考，还需要不懈的追求和不断的自我超越。</p><hr><p>经过深度的思考与选择，我们或许能够趋近生命的“最速曲线”，更有效地利用有限的时间实现价值最大化。是的，时间无法逆流，生命不可重来，但在我们的意志和智慧引导下，旅途中的风景将因我们的抉择而更加璀璨。</p><blockquote><p>“通过深刻的自我改变，世界亦将随之改变。只有成就更好的自己，才能开辟出一片更和谐美好的天地。” </p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;怕什么真理无穷，进一寸有一寸的欢喜。——读《胡适谈读书》&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;时间、空间与最速曲线的深入思考&quot;&gt;&lt;a href=&quot;#时间、空间与最速曲线的深入思考&quot; class=&quot;headerlink&quot; title=&quot;时间、空间与最速曲线的深入思考&quot;&gt;&lt;/a&gt;</summary>
      
    
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/categories/thinks/"/>
    
    
    <category term="thinks" scheme="http://liam-xander.github.io/tags/thinks/"/>
    
  </entry>
  
</feed>
