## URDF
URDF 是用來描述機器人硬體結構的文件,通常由 `base_link` 開始,展開到各種感測器、輪子、相機等設備。
在 ROS 中,URDF 有兩種主要的協定,以下有官方的說明連結以及程式碼實現範例。而我正在將實驗室的舊有 URDF 從 `REP 120` 轉換到 `REP 105`,因為我認為 `REP 105` 更符合 AMR 的特性:
- [REP 105 協定](https://www.ros.org/reps/rep-0105.html):
- 適用於移動平台的座標系
- 座標系簡化為僅包含 `base_link`,更加簡潔
- [我的改版 URDF](https://github.com/ming0071/ROS2-3D-lidar-AMR/blob/main/urdf/AMR_model.urdf)
- [REP 120 協定](https://www.ros.org/reps/rep-0120.html#id8):
- 適用於人形機器人的座標系
- 增加了 `base_footprint` 來表示機器人在地板上的位置
- [實驗室原有 URDF](https://github.com/ming0071/ROS2-3D-lidar-AMR/blob/main/urdf/AMR_ros_3d.urdf.xacro)
## TF
#### TF 座標系概述
當建立好 AMR 的 URDF 後,可透過 ROS 中的 TF 來發布座標系,來省去複雜的座標系轉換過程,是非常好用的工具。
在 ROS 中,TF 的座標系定義包含 X、Y、Z 方向以及 r、p、y 旋轉角度,並以 X 軸作為前進方向。

#### Publish tf tree
可以由這樣的 launch 檔來發布 tf 座標系到 ROS 中,發布 `robot_state_publisher` 和 `joint_state_publisher` 兩個節點來開啟 tf,另外也加入了可以彈性選擇實驗室原版與我的改良版本[^註腳],想了解 tf launch 細節的話可以參考官方指南 [Using URDF with robot_state_publisher](https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/Using-URDF-with-Robot-State-Publisher.html) 實作。
```
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python import get_package_share_directory
def generate_launch_description():
version = "ROS2" # 可選擇 ROS2 改良版或實驗室舊版 URDF 文件
if version == "ROS2":
urdf_name = "AMR_model.urdf" # AMR_model.urdf AMR_ros_3d.urdf.xacro
else:
urdf_name = "AMR_ros_3d.urdf.xacro"
urdf_model_path = os.path.join(
get_package_share_directory("scl_amr"),
"urdf",
urdf_name,
)
robot_state_publisher_node = Node(
package="robot_state_publisher",
executable="robot_state_publisher",
arguments=[urdf_model_path],
)
joint_state_publisher_node = Node(
package="joint_state_publisher",
executable="joint_state_publisher",
name="joint_state_publisher",
arguments=[urdf_model_path],
)
ld = LaunchDescription()
ld.add_action(joint_state_publisher_node)
ld.add_action(robot_state_publisher_node)
return ld
```
#### 撰寫 TF launch 的小訣竅
- 通過 `ros2 run rqt_tf_tree rqt_tf_tree --force-discover
` 指令來檢查 TF 是否有正確發布。
- 發布 TF 時同步藉由 Rviz 可視化 STL 模型檔,方便觀察座標系是否正確,也可以藉由調整模型顏色、透明度來更清楚的觀察物件位置和方向
- `tf2_monitor`監控 TF 更新頻率,像是`ros2 run tf2_ros tf2_monitor base_link imu_link
`
[^註腳]:`joint_state_publisher` 不是必要的節點,它的功能是模擬和控制關節,在座標系轉換上並不必要。另外,目前的 TF launch 和官方的指南有細微的差異,或許還有改良空間可以嘗試。