Skip to main content Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill sdf-xacro-modelコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
| name | sdf-xacro-model |
| description | 轮式车辆 SDF/XACRO 模型开发技能 - 差速驱动车、阿克曼车、履带车模型创建与仿真配置 |
| argument-hint | 创建轮式车辆模型 OR 差速驱动 OR 阿克曼模型 OR 履带车 |
| user-invocable | true |
Wheeled Vehicle SDF/XACRO Model Skill
用于创建轮式移动机器人的 SDF 和 XACRO 模型
何时使用
当需要以下帮助时使用此技能:
- 创建差速驱动轮式机器人
- 创建阿克曼转向车辆
- 创建履带式机器人
- 配置轮式车辆传感器
- 设置仿真环境参数
快速参考
车辆类型选择
差速驱动车辆
SDF 模型 - 完整示例
<?xml version="1.0" ?>
<sdf version="1.11">
<model name="diff_drive_robot">
<static>false</static>
<self_collide>false</self_collide>
<link name="base_link">
<pose>0 0 0.1 0 0 0</pose>
<inertial>
<mass>10.0</mass>
<inertia>
<ixx>0.1</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.1</iyy><iyz>0</iyz>
<izz>0.1</izz>
</inertia>
</inertial>
<collision name="base_collision">
<geometry>
<box>
<size>0.5 0.4 0.1</size>
</box>
</geometry>
</collision>
<visual name="base_visual">
<geometry>
<box>
<size>0.5 0.4 0.1</size>
</box>
</geometry>
<material>
<ambient>0.3 0.3 0.3 1</ambient>
<diffuse>0.3 0.3 0.3 1</diffuse>
</material>
</visual>
</link>
<link name="wheel_fl">
<pose>0.2 0.25 0 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.001</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.001</iyy><iyz>0</iyz>
<izz>0.001</izz>
</inertia>
</inertial>
<collision name="wheel_fl_collision">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
<surface>
<friction>
<ode>
<mu>1.0</mu>
<mu2>1.0</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="wheel_fl_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
<material>
<ambient>0.1 0.1 0.1 1</ambient>
</material>
</visual>
</link>
<joint name="wheel_fl_joint" type="continuous">
<parent>base_link</parent>
<child>wheel_fl</child>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<link name="wheel_fr">
<pose>0.2 -0.25 0 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.001</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.001</iyy><iyz>0</iyz>
<izz>0.001</izz>
</inertia>
</inertial>
<collision name="wheel_fr_collision">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_fr_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
<material>
<ambient>0.1 0.1 0.1 1</ambient>
</material>
</visual>
</link>
<joint name="wheel_fr_joint" type="continuous">
<parent>base_link</parent>
<child>wheel_fr</child>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<link name="wheel_rl">
<pose>-0.2 0.25 0 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.001</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.001</iyy><iyz>0</iyz>
<izz>0.001</izz>
</inertia>
</inertial>
<collision name="wheel_rl_collision">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_rl_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
<material>
<ambient>0.1 0.1 0.1 1</ambient>
</material>
</visual>
</link>
<joint name="wheel_rl_joint" type="continuous">
<parent>base_link</parent>
<child>wheel_rl</child>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<link name="wheel_rr">
<pose>-0.2 -0.25 0 0 0 0</pose>
<inertial>
<mass>0.5</mass>
<inertia>
<ixx>0.001</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.001</iyy><iyz>0</iyz>
<izz>0.001</izz>
</inertia>
</inertial>
<collision name="wheel_rr_collision">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_rr_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>0.05</length>
</cylinder>
</geometry>
<material>
<ambient>0.1 0.1 0.1 1</ambient>
</material>
</visual>
</link>
<joint name="wheel_rr_joint" type="continuous">
<parent>base_link</parent>
<child>wheel_rr</child>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<link name="laser_link">
<pose>0.25 0 0.15 0 0 0</pose>
<sensor name="laser" type="gpu_lidar">
<update_rate>10</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
</horizontal>
</scan>
<range>
<min>0.1</min>
<max>30</max>
</range>
</ray>
<plugin filename="gz-sim-sensors-gpu-lidar" name="gz::sim::systems::GpuRaySensor">
<ros>
<namespace>/robot</namespace>
</ros>
</plugin>
</sensor>
</link>
<joint name="laser_joint" type="fixed">
<parent>base_link</parent>
<child>laser_link</child>
</joint>
<plugin filename="gz-sim-diff-drive-system" name="gz::sim::systems::DiffDrive">
<left_joint>wheel_fl_joint</left_joint>
<right_joint>wheel_fr_joint</right_joint>
<left_joint>wheel_rl_joint</left_joint>
<right_joint>wheel_rr_joint</right_joint>
<wheel_radius>0.1</wheel_radius>
<wheel_separation>0.5</wheel_separation>
<max_wheel_torque>20</max_wheel_torque>
<max_wheel_velocity>10</max_wheel_velocity>
</plugin>
</model>
</sdf>
XACRO 模型
<?xml version="1.0" ?>
<robot name="diff_drive_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="PI" value="3.14159265358979"/>
<xacro:property name="base_mass" value="10.0"/>
<xacro:property name="base_length" value="0.5"/>
<xacro:property name="base_width" value="0.4"/>
<xacro:property name="base_height" value="0.1"/>
<xacro:property name="wheel_radius" value="0.1"/>
<xacro:property name="wheel_width" value="0.05"/>
<xacro:property name="wheel_mass" value="0.5"/>
<xacro:property name= =/>
1.0
1.0
/robot
cmd_vel:=cmd_vel
odom:=odom
50
wheel_fl_joint
wheel_fr_joint
${wheel_separation}
${wheel_radius}
20
10
阿克曼转向车辆
SDF 模型
<?xml version="1.0" ?>
<sdf version="1.11">
<model name="ackermann_vehicle">
<static>false</static>
<link name="chassis">
<pose>0 0 0.2 0 0 0</pose>
<inertial>
<mass>50.0</mass>
<inertia>
<ixx>0.5</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.8</iyy><iyz>0</iyz>
<izz>0.8</izz>
</inertia>
</inertial>
<collision name="chassis_collision">
1.0 0.5 0.2
1.0 0.5 0.2
0.4 0.2 0.1 1
0.4 0 0.1 0 0 0
5.0
0.0100
0.010
0.01
0.1 0.4 0.1
0.1 0.4 0.1
0.2 0.2 0.2 1
chassis
front_axle
0 0 1
-0.5
0.5
0.4 0.3 0.1 0 0 0
2.0
0.0100
0.010
0.01
0.15
0.1
0.15
0.1
0.1 0.1 0.1 1
front_axle
wheel_fl
0 1 0
0.4 -0.3 0.1 0 0 0
2.0
0.0100
0.010
0.01
0.15
0.1
0.15
0.1
0.1 0.1 0.1 1
front_axle
wheel_fr
0 1 0
-0.4 0.25 0.1 0 0 0
2.0
0.0100
0.010
0.01
0.15
0.1
0.15
0.1
0.1 0.1 0.1 1
chassis
wheel_rl
0 1 0
-0.4 -0.25 0.1 0 0 0
2.0
0.0100
0.010
0.01
0.15
0.1
0.15
0.1
0.1 0.1 0.1 1
chassis
wheel_rr
0 1 0
wheel_fl_joint
wheel_fr_joint
wheel_rl_joint
wheel_rr_joint
front_steering_joint
0.15
0.6
0.8
0.5
履带式车辆
SDF 模型
<?xml version="1.0" ?>
<sdf version="1.11">
<model name="tracked_vehicle">
<static>false</static>
<link name="chassis">
<pose>0 0 0.15 0 0 0</pose>
<inertial>
<mass>30.0</mass>
<inertia>
<ixx>0.3</ixx><ixy>0</ixy><ixz>0</ixz>
<iyy>0.5</iyy><iyz>0</iyz>
<izz>0.5</izz>
</inertia>
</inertial>
<collision name="chassis_collision">
0.8 0.4 0.15
0.8 0.4 0.15
0.3 0.3 0.2 1
0 0.25 0 0 0 0
5.0
0.0500
0.050
0.05
0.8 0.1 0.1
2.0
2.0
0.8 0.1 0.1
0.1 0.1 0.1 1
chassis
track_left
0 1 0
0 -0.25 0 0 0 0
5.0
0.0500
0.050
0.05
0.8 0.1 0.1
2.0
2.0
0.8 0.1 0.1
0.1 0.1 0.1 1
chassis
track_right
0 1 0
track_left_joint
track_right_joint
0.1
0.5
50
5
传感器配置
轮式车辆常用传感器
<link name="front_laser_link">
<pose>0.4 0 0.15 0 0 0</pose>
<sensor name="front_laser" type="gpu_lidar">
<update_rate>10</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
</horizontal>
</scan>
<range>
<min>0.1</min>
<max>30</max>
</range>
</ray>
<plugin filename="gz-sim-sensors-gpu-lidar" name="gz::sim::systems::GpuRaySensor">
<ros>
<namespace>/robot
0.3 0 0.2 0 0.3 0
30
1.57
640
480
/robot
0 0 0.1 0 0 0
100
/robot
0 0 0.2 0 0 0
10
/robot
环境参数配置
地面摩擦参数
<gazebo reference="wheel">
<surface>
<friction>
<ode>
<mu>1.0</mu>
<mu2>1.0</mu2>
<fdir1>0 0 1</fdir1>
<slip1>0</slip1>
<slip2>0</slip2>
</ode>
<contact>
<kp>1e7</kp>
<kd>1</kd>
</contact>
</friction>
</surface>
</gazebo>
负载配置
<gazebo reference="base_link">
<mass>2.0</mass>
</gazebo>
常见问题
问题 1: 机器人滑动
解决方案:
- 增加轮子摩擦系数 (mu > 1.0)
- 检查关节阻尼设置
- 验证驱动扭矩
问题 2: 转向不准
解决方案:
- 调整阿克曼转向角度限制
- 验证前轴位置
- 检查转向关节限位
相关资源
另见
"wheel_separation"
value
"0.5"
<xacro:property name="wheel_base" value="0.4"/>
<xacro:macro name="base_link">
<link name="base_link">
<inertial>
<mass value="${base_mass}"/>
<inertia
ixx="${base_mass / 12 * (base_width**2 + base_height**2)}"
ixy="0" ixz="0"
iyy="${base_mass / 12 * (base_length**2 + base_height**2)}"
iyz="0"
izz="${base_mass / 12 * (base_length**2 + base_width**2)}"/>
</inertial>
<collision>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
</collision>
<visual>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
<material name="grey">
<color rgba="0.3 0.3 0.3 1"/>
</material>
</visual>
</link>
</xacro:macro>
<xacro:macro name="wheel" params="name x y">
<joint name="${name}_joint" type="continuous">
<origin xyz="${x} ${y} 0" rpy="-${PI/2} 0 0"/>
<parent link="base_link"/>
<child link="${name}"/>
<axis xyz="0 0 1"/>
<dynamics damping="0.1" friction="0.5"/>
</joint>
<link name="${name}">
<inertial>
<mass value="${wheel_mass}"/>
<inertia
ixx="${wheel_mass * wheel_radius**2 / 2}"
ixy="0" ixz="0"
iyy="${wheel_mass * wheel_radius**2 / 2}"
iyz="0"
izz="${wheel_mass * wheel_radius**2 / 2}"/>
</inertial>
<collision>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_width}"/>
</geometry>
<surface>
<friction>
<ode>
<mu>
</mu>
<mu2>
</mu2>
</ode>
</friction>
</surface>
</collision>
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_width}"/>
</geometry>
<material name="black">
<color rgba="0.1 0.1 0.1 1"/>
</material>
</visual>
</link>
</xacro:macro>
<xacro:base_link/>
<xacro:wheel name="wheel_fl" x="${wheel_base/2}" y="${wheel_separation/2}"/>
<xacro:wheel name="wheel_fr" x="${wheel_base/2}" y="-${wheel_separation/2}"/>
<xacro:wheel name="wheel_rl" x="-${wheel_base/2}" y="${wheel_separation/2}"/>
<xacro:wheel name="wheel_rr" x="-${wheel_base/2}" y="-${wheel_separation/2}"/>
<gazebo>
<plugin filename="libgazebo_ros_diff_drive.so" name="gazebo_ros_diff_drive">
<ros>
<namespace>
</namespace>
<remap>
</remap>
<remap>
</remap>
</ros>
<update_rate>
</update_rate>
<left_joint>
</left_joint>
<right_joint>
</right_joint>
<wheel_separation>
</wheel_separation>
<wheel_radius>
</wheel_radius>
<max_wheel_torque>
</max_wheel_torque>
<max_wheel_velocity>
</max_wheel_velocity>
</plugin>
</gazebo>
</robot>
<geometry>
<box>
<size>
</size>
</box>
</geometry>
</collision>
<visual name="chassis_visual">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<link name="front_axle">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="front_axle_collision">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
</collision>
<visual name="front_axle_visual">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="front_steering_joint" type="revolute">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
<limit>
<lower>
</lower>
<upper>
</upper>
</limit>
</axis>
</joint>
<link name="wheel_fl">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="wheel_fl_collision">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_fl_visual">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="wheel_fl_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<link name="wheel_fr">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="wheel_fr_collision">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_fr_visual">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="wheel_fr_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<link name="wheel_rl">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="wheel_rl_collision">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_rl_visual">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="wheel_rl_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<link name="wheel_rr">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="wheel_rr_collision">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
</collision>
<visual name="wheel_rr_visual">
<geometry>
<cylinder>
<radius>
</radius>
<length>
</length>
</cylinder>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="wheel_rr_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<plugin filename="gz-sim-ackermann-steering-system" name="gz::sim::systems::AckermannSteering">
<left_joint>
</left_joint>
<right_joint>
</right_joint>
<left_rear_joint>
</left_rear_joint>
<right_rear_joint>
</right_rear_joint>
<steering_joint>
</steering_joint>
<wheel_radius>
</wheel_radius>
<wheel_separation>
</wheel_separation>
<axle_length>
</axle_length>
<max_steering_angle>
</max_steering_angle>
</plugin>
</model>
</sdf>
<geometry>
<box>
<size>
</size>
</box>
</geometry>
</collision>
<visual name="chassis_visual">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<link name="track_left">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="track_left_collision">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu>
</mu>
<mu2>
</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="track_left_visual">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="track_left_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<link name="track_right">
<pose>
</pose>
<inertial>
<mass>
</mass>
<inertia>
<ixx>
</ixx>
<ixy>
</ixy>
<ixz>
</ixz>
<iyy>
</iyy>
<iyz>
</iyz>
<izz>
</izz>
</inertia>
</inertial>
<collision name="track_right_collision">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<surface>
<friction>
<ode>
<mu>
</mu>
<mu2>
</mu2>
</ode>
</friction>
</surface>
</collision>
<visual name="track_right_visual">
<geometry>
<box>
<size>
</size>
</box>
</geometry>
<material>
<ambient>
</ambient>
</material>
</visual>
</link>
<joint name="track_right_joint" type="continuous">
<parent>
</parent>
<child>
</child>
<axis>
<xyz>
</xyz>
</axis>
</joint>
<plugin filename="gz-sim-diff-drive-system" name="gz::sim::systems::DiffDrive">
<left_joint>
</left_joint>
<right_joint>
</right_joint>
<wheel_radius>
</wheel_radius>
<wheel_separation>
</wheel_separation>
<max_wheel_torque>
</max_wheel_torque>
<max_wheel_velocity>
</max_wheel_velocity>
</plugin>
</model>
</sdf>
</namespace>
</ros>
</plugin>
</sensor>
</link>
<link name="camera_link">
<pose>
</pose>
<sensor name="camera" type="rgbd_camera">
<update_rate>
</update_rate>
<camera>
<horizontal_fov>
</horizontal_fov>
<image>
<width>
</width>
<height>
</height>
</image>
</camera>
<plugin filename="gz-sim-sensors-rgbd-camera-system" name="gz::sim::systems::RgbdCamera">
<ros>
<namespace>
</namespace>
</ros>
</plugin>
</sensor>
</link>
<link name="imu_link">
<pose>
</pose>
<sensor name="imu" type="imu">
<update_rate>
</update_rate>
<plugin filename="gz-sim-sensors-imu-system" name="gz::sim::systems::Imu">
<ros>
<namespace>
</namespace>
</ros>
</plugin>
</sensor>
</link>
<link name="gps_link">
<pose>
</pose>
<sensor name="gps" type="gps">
<update_rate>
</update_rate>
<plugin filename="gz-sim-sensors-gps-system" name="gz::sim::systems::Gps">
<ros>
<namespace>
</namespace>
</ros>
</plugin>
</sensor>
</link>