一個具體的機器人模型示例,包含完整的文件結構和代碼:
1. 完整的文件結構
my_robot_pkg/ ├── CMakeLists.txt ├── package.xml ├── launch/ │ ├── display.launch │ └── gazebo.launch ├── urdf/ │ ├── my_robot.urdf │ ├── materials.xacro │ └── macros.xacro ├── meshes/ │ ├── visual/ │ │ ├── base.dae │ │ ├── arm.dae │ │ └── gripper.dae │ └── collision/ │ ├── base.stl │ ├── arm.stl │ └── gripper.stl └── config/ └── joint_controllers.yaml
2. URDF 示例代碼
xml<?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- 材質定義 --> <material name="blue"> <color rgba="0 0 0.8 1"/> </material> <!-- 基座鏈接 --> <link name="base_link"> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot_pkg/meshes/visual/base.dae" scale="0.001 0.001 0.001"/> </geometry> <material name="blue"/> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot_pkg/meshes/collision/base.stl"/> </geometry> </collision> <inertial> <mass value="5.0"/> <origin xyz="0 0 0" rpy="0 0 0"/> <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/> </inertial> </link> <!-- 機械臂關節 --> <joint name="arm_joint" type="revolute"> <parent link="base_link"/> <child link="arm_link"/> <origin xyz="0 0 0.1" rpy="0 0 0"/> <axis xyz="0 0 1"/> <limit lower="-3.14" upper="3.14" effort="100" velocity="1.0"/> </joint> <!-- 機械臂鏈接 --> <link name="arm_link"> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot_pkg/meshes/visual/arm.dae" scale="0.001 0.001 0.001"/> </geometry> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://my_robot_pkg/meshes/collision/arm.stl"/> </geometry> </collision> <inertial> <mass value="1.0"/> <origin xyz="0 0 0" rpy="0 0 0"/> <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/> </inertial> </link> </robot>
3. Launch 文件示例
xml<!-- gazebo.launch --> <launch> <!-- 載入機器人描述參數 --> <param name="robot_description" command="$(find xacro)/xacro '$(find my_robot_pkg)/urdf/my_robot.urdf'"/> <!-- 啟動 Gazebo --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="debug" value="false"/> </include> <!-- 生成機器人模型 --> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model my_robot"/> <!-- 啟動控制器 --> <rosparam command="load" file="$(find my_robot_pkg)/config/joint_controllers.yaml"/> <node name="controller_spawner" pkg="controller_manager" type="spawner" output="screen" args="joint_state_controller arm_controller"/> </launch>
4. 控制器配置示例
yaml# joint_controllers.yaml joint_state_controller: type: joint_state_controller/JointStateController publish_rate: 50 arm_controller: type: position_controllers/JointPositionController joint: arm_joint pid: {p: 100.0, i: 0.01, d: 10.0}
5. Gazebo 相關插件配置
xml<!-- 在 URDF 中添加 Gazebo 插件 --> <gazebo> <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"> <robotNamespace>/my_robot</robotNamespace> <robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType> </plugin> </gazebo> <!-- 為鏈接添加材質 --> <gazebo reference="base_link"> <material>Gazebo/Blue</material> </gazebo>
6. 運行和測試
- 編譯包:
bashcatkin_make
- 運行模擬:
bashroslaunch my_robot_pkg gazebo.launch
- 發送控制命令:
bashrostopic pub /my_robot/arm_controller/command std_msgs/Float64 "data: 1.57"
7. 調試技巧
- 檢查模型是否正確載入:
bashrosrun tf_echo /base_link /arm_link
- 查看關節狀態:
bashrostopic echo /joint_states
- 使用 RViz 可視化:
bashrosrun rviz rviz -d `rospack find my_robot_pkg`/rviz/config.rviz
這個完整示例展示了如何:
- 組織機器人描述文件
- 配置 Gazebo 模擬
- 設置控制器
- 運行和測試模型
沒有留言:
張貼留言