<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ROS坐标系统，常见的坐标系和其含义]]></title><description><![CDATA[<h3>常见的坐标系</h3>
<p dir="auto">在使用ROS进行定位导航等操作时，我们经常会遇到各种坐标系。每种坐标系都有明确的含义。理论上坐标系的名称可以是随意的，但是为了方便不同的软件间共享坐标信息，ROS定义了几个常见的坐标系。</p>
<p dir="auto">1.<code>base_link</code><br />
<code>base_link</code>坐标系和机器人的底盘直接连接。其具体位置和方向都是任意的。对于不同的机器人平台，底盘上会有不同的参考点。不过ROS也给了推荐的坐标系取法。</p>
<p dir="auto">x 轴指向机器人前方<br />
y 轴指向机器人左方<br />
z 轴指向机器人上方</p>
<p dir="auto">2.<code>odom</code><br />
<code>odom</code>是一个固定在环境中的坐标系也就是world-fixed。它的原点和方向不会随着机器人运动而改变。但是odom的位置可以随着机器人的运动漂移。漂移导致<code>odom</code>不是一个很有用的长期的全局坐标。然而机器人的<code>odom</code>坐标必须保证是连续变化的。也就是在<code>odom</code>坐标系下机器人的位置必须是连续变化的，不能有突变和跳跃。<br />
在一般使用中<code>odom</code>坐标系是通过里程计信息计算出来的。比如轮子的编码器或者视觉里程计算法或者陀螺仪和加速度计。<code>odom</code>是一个短期的局域的精确坐标系。但是却是一个比较差的长期大范围坐标。</p>
<p dir="auto">3.<code>map</code><br />
<code>map</code>和<code>odom</code>一样是一个固定在环境中的世界坐标系。<code>map</code>的z轴是向上的。机器人在<code>map</code>坐标系下的坐标不应该随着时间漂移。但是<code>map</code>坐标系下的坐标并不需要保证连续性。也就是说在map坐标系下机器人的坐标可以在任何时间发生跳跃变化。<br />
一般来说<code>map</code>坐标系的坐标是通过传感器的信息不断的计算更新而来。比如激光雷达，视觉定位等等。因此能够有效的减少累积误差，但是也导致每次坐标更新可能会产生跳跃。<br />
<code>map</code>坐标系是一个很有用的长期全局坐标系。但是由于坐标会跳跃改变，这是一个比较差的局部坐标系（不适合用于避障和局部操作）。</p>
<h3>坐标系的约定</h3>
<p dir="auto">在非结构化的环境中（比如开放环境），如果我们要定义一个全球坐标系</p>
<ol>
<li>默认的方向要采用 x轴向东，y轴向北，z轴向上</li>
<li>如果没有特殊说明的话z轴为零的地方应该在WGS84椭球上(WGS84椭球是一个全球定位坐标。大致上也就是z代表水平面高度)<br />
如果在开发中这个约定不能完全保证，也要求尽量满足。比如对于没有GPS，指南针等传感器的机器人，仍然可以保证坐标系z轴向上的约定。如果有指南针传感器，这样就能保证x和y轴的初始化方向。</li>
</ol>
<p dir="auto">在结构化的环境中（比如室内），在定义坐标系时和环境保持对应更有用。比如对于有平面图的建筑，坐标系可以和平面图对应。类似的对于室内环境地图可以和建筑物的层相对应。对于有多层结构的建筑物，对每一层单独有一个坐标系也是合理的。</p>
<p dir="auto">4.<code>earth</code><br />
这个坐标系是为了多个机器人相互交互而设计的。当有多个机器人的时候，每个机器人都有自己的<code>map</code>坐标系，他们之间的<code>map</code>坐标系并不相同。如果想要在不同的机器人间共享数据，则需要这个坐标系来进行转化。<br />
如果<code>map</code>坐标系是一个全局坐标系，那么<code>map</code>到<code>earth</code>坐标系的变化可以是一个静态变换。如果不是的话，就要每次计算<code>map</code>坐标系的原点和方向。<br />
在刚启动的时候<code>map</code>坐标系的全局位置可能是不知道的。这时候可以先不发布到<code>earth</code>的变换，直到有了比较精确的全局位置。</p>
<p dir="auto">坐标系之间的关系<br />
坐标系之间的关系可以用树图的方式表示。每一个坐标系只能有一个父坐标系和任意多个子坐标系。</p>
<p dir="auto"><code>earth -&gt; map -&gt; odom -&gt; base_link</code><br />
按照之前的说明，<code>odom</code>和<code>map</code>都应该连接到<code>base_link</code>坐标系。但是这样是不允许的，因为每一个坐标系只能有一个父坐标系。</p>
<p dir="auto">额外的中间坐标系<br />
这个图只表示了最少的坐标系。在保证基本的结构不变的情况下可以在其中加入中间的坐标系以提供额外的功能。</p>
<p dir="auto">多机器人坐标系的例子</p>
<p dir="auto"><code>earth --&gt; map_1 --&gt; odom_1 --&gt; base_link1</code><br />
<code>earth --&gt; map_2 --&gt; odom_2 --&gt; base_link2 </code></p>
<h3>坐标系变换的计算</h3>
<p dir="auto"><code>odom</code>到<code>base_link</code>的变换由里程计数据源中的一个发布</p>
<p dir="auto"><code>map</code>到<code>base_link</code>通过定位组件计算得出。但是定位组件并不发布从<code>map</code>到<code>base_link</code>的变换。它首先获取<code>odom</code>到<code>base_link</code>的变换然后利用定位信息计算出<code>map</code>到<code>odom</code>的变换。</p>
<p dir="auto"><code>earth</code>到<code>map</code>的变换是根据<code>map</code>坐标系选取所发布的一个静态变换。如果没有设置，那么就会使用机器人的初始位置作为坐标原点。</p>
<h3>Map之间的切换</h3>
<p dir="auto">如果机器人的运动范围很大，那么极有可能是要切换地图的。在室内环境下，在不同的建筑物中，和不同的楼层地图都会不同。<br />
在不同的地图间切换的时候，定位组件要恰当的把<code>odom</code>的<code>parent</code>替换成新的地图。主要是<code>map</code>到<code>base_link</code>之间的变换要选取恰当的地图，然后在转换成<code>map</code>到<code>odom</code>之间的变换。</p>
<p dir="auto">odom坐标系的连续性<br />
在切换地图的时候，odom坐标系不应该受到影响。odom坐标系要保证连续性。可能影响连续性的情况包括进出电梯，机器人自身没有运动，但是周围环境发生很大的变化。还有可能由于运动距离太远，造成数据溢出。这些都要特殊进行处理。</p>
<p dir="auto">参考资料:<br />
<a href="https://github.com/ros-infrastructure/rep/blob/master/rep-0105.rst" target="_blank" rel="noopener noreferrer">ROS REP 105</a></p>
]]></description><link>http://community.bwbot.org/topic/227/ros坐标系统-常见的坐标系和其含义</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 09:44:42 GMT</lastBuildDate><atom:link href="http://community.bwbot.org/topic/227.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Sep 2017 08:59:20 GMT</pubDate><ttl>60</ttl></channel></rss>