TF轉換理解:
借鑑這裏https://blog.csdn.net/zong596568821xp/article/details/79101989 1、首先要搞明白URDF、TF和odom的關係 在機器人自主導航中,ROS會構建這幾個很重要的座標系,即frame 在urdf文件中定義base_link -> 代表了機器人的主幹,其它所有的frame都是相對於base_link定義並粘在一起的 它們一起相對於大地圖map移動,讓機器人移動就是向tf發佈 geometry_msgs::TransformStamped 消息通知ros base_link相對於map的tf轉換關係 2、概念理解:
物理語義 | 理解 | 原點 | |
---|---|---|---|
base_link | 爲相對機器人的本體的座標系 | 位於tf tree的最根部 | 原點一般爲表示機器人中心 |
odom | 一個對於機器人全局位姿的粗略估計 | 直接與base_link 相鏈接,數據一般來源於里程計(odometry) | 原點爲開始計算位姿那個時刻的機器人的位置 |
map | 一個經過先驗(或者SLAM)地圖數據矯正過的,在地圖中的位姿信息 | 與odom(或者odom_combined)相連,與odom同爲全局座標系 | 原點爲地圖原點(地圖原點在地圖相應的yaml文件中有規定) |
3、關係 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
4、座標轉換 ☆ 在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>