URDF
、TF
和odom
的关系在机器人自主导航中,ROS
会构建这几个很重要的坐标系,即frame
。在urdf
文件中定义base_link
,它代表了机器人的主干,其它所有的frame
都是相对于base_link
定义并粘在一起的。它们一起相对于大地图map
移动,让机器人移动就是向tf
发布geometry_msgs::TransformStamped
消息通知ros base_link
相对于map
的tf
转换关系 。
? | 物理语义 | 理解 | 原点 |
---|---|---|---|
base_link | 为相对机器人的本体的坐标系 | 位于tf tree 的最根部 | 原点一般为表示机器人中心 |
odom | 一个对于机器人全局位姿的粗略估计 | 直接与base_link 相链接,数据一般来源于里程计(odometry ) | 原点为开始计算位姿那个时刻的机器人的位置 |
map | 一个经过先验(或者SLAM )地图数据矫正过的,在地图中的位姿信息 | 与odom (或者odom_combined )相连,与odom 同为全局坐标系 | 原点为地图原点(地图原点在地图相应的yaml 文件中有规定) |
map --> odom --> base_link odom
到base_link
的坐标转换是从运动源计算出来广播的。map
到base_link
的坐标转换是被定位模块计算出来的. 但定位模块不发布map
到base_link的转换. 相反它先接受从odom
到base_link
的转换, 再计算并广播map
到odom
的位置转换关系
fixed_frame
:RViz
中认定的大世界就是fixed_frame
target_frame
:Rviz
中视觉跟踪的frame
是 target_frame
在lidar的launch启动文件中增加:
<node pkg="tf" type="static_transform_publisher" name="base_link_to_laser4"
? ?args="0.0 0.0 0.2 0.0 3.1415926 0.0 /base_link /laser_frame 40" />
</launch>
?
args="0.0 0.0 0.2 0.0 3.1415926 0.0 /base_link /laser_frame 40"
// 参数意义,分别对应static_transform_publisher的
// x y z yaw pitch roll frame_id child_frame_id period_in_ms
// x y z 是 x y z 的坐标
// yaw pitch roll 是 绕 z旋转弧度角,绕y旋转弧度角,绕x旋转弧度角
// frame_id child_frame_id period_in_ms 父坐标系,子坐标系,发布间隔(ms)
// 上述是指的 z方向增加0.2m,绕y旋转180°
// 这些相对变换就是固定base-link,看其他坐标在base_link下的偏移
?
修改urdf文件的坐标 找到urdf的描述文件,如turtlebot_description/urdf/turtlebot_library.urdf.xacro,在文件中修改坐标
<joint name="laser" type="fixed">
? ?<origin xyz="0.00 0.00 0.20" rpy="0 3.1415926 0" />
? ?<parent link="base_link" />
? ?<child link="base_laser_link" />
?</joint>
?<link name="base_laser_link">
? ?<visual>
? ? ?<geometry>
? ? ? ?<box size="0.00 0.05 0.06" />
? ? ?</geometry>
? ? ?<material name="Green" />
? ?</visual>
? ?<inertial>
? ? ?<mass value="0.000001" />
? ? ?<origin xyz="0 0 0" />
? ? ?<inertia ixx="0.0001" ixy="0.0" ixz="0.0"
? ? ? ?iyy="0.0001" iyz="0.0"
? ? ? ?izz="0.0001" />
? ?</inertial>
?</link>
?
cs