| name | robot-sdf-modeling |
| description | 机器人 SDF 建模技能 - SDF 模型结构、链接关节、摩擦阻尼、ROS2 gazebo_ros |
| argument-hint | SDF建模 OR sdf OR robot model OR link OR joint |
| user-invocable | true |
机器人 SDF 建模技能
Gazebo SDF 模型创建
何时使用
当需要以下帮助时使用此技能:
- SDF 模型结构
- 链接 (link) 定义
- 关节 (joint) 配置
- 碰撞和摩擦
- ROS2 Gazebo 模型
核心实现
SDF 模型结构
<?xml version="1.0"?>
<sdf version="1.9">
<model name="robot_name">
<static>false</static>
<physics name="default_physics" type="ode">
<max_step_size>0.001</max_step_size>
<real_time_factor>1.0</real_time_factor>
<real_time_update_rate>1000</real_time_update_rate>
</physics>
<link name="base_link">
<pose>0 0 0.1 0 0 0</pose>
<inertial>
<mass>10.0</mass>
<inertia>
<ixx>0.01</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.01</iyy>
<iyz>0</iyz>
<izz>0.01</izz>
</inertia>
</inertial>
<collision name="base_collision">
<geometry>
<box>
<size>0.5 0.5 0.1</size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu>1.0</mu>
<mu2>1.0</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="base_visual">
<geometry>
<box>
<size>0.5 0.5 0.1</size>
</box>
</geometry>
<material>
<ambient>0.8 0.8 0.8 1</ambient>
</material>
</visual>
</link>
<joint name="joint1" type="revolute">
<parent>base_link</parent>
<child>link1</child>
<axis>
<xyz>0 0 1</xyz>
<limit>
<lower>-3.14</lower>
<upper>3.14</upper>
<effort>100</effort>
<velocity>10</velocity>
</limit>
</axis>
</joint>
</model>
</sdf>
ROS2 Gazebo 模型加载
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
ExecuteProcess(
cmd=['gzserver', '-s', 'libgazebo_ros_factory.so'],
output='screen'
),
Node(
package='gazebo_ros',
executable='spawn_entity',
arguments=['-entity', 'robot_name', '-file', '/path/to/model.sdf'],
output='screen'
),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=['/model/robot_name/pose@tf2_msgs/msg/TF@gz.msgs.Pose'],
output='screen'
)
])
摩擦和阻尼配置
<surface>
<friction>
<ode>
<mu>0.8</mu>
<mu2>0.8</mu2>
<fdir1>1 0 0</fdir1>
<slip1>0</slip1>
<slip2>0</slip2>
</ode>
</friction>
<contact>
<ode>
<kp>1e7</kp>
<kd>1e6</kd>
<max_vel>0.1</max_vel>
<min_depth>0.001</min_depth>
</ode>
</contact>
</>
0
0.2