Wiki
Harmonic差速底盘仿真
约 2 分钟阅读
自己建立一个差速底盘模型。控制器使用轮子反馈计算里程计,并与世界位姿对照。
1.示例 1:完整模型
保存 urdf/diff_gz.urdf.xacro:
<?xml version="1.0"?>
<robot name="learning_diffbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<link name="base_link">
<inertial><mass value="2"/><inertia ixx="0.02" ixy="0" ixz="0" iyy="0.03" iyz="0" izz="0.04"/></inertial>
<visual><geometry><box size="0.3 0.2 0.08"/></geometry></visual>
<collision><geometry><box size="0.3 0.2 0.08"/></geometry></collision>
</link>
<link name="left_wheel">
<inertial><mass value="0.2"/><inertia ixx="0.00014" ixy="0" ixz="0" iyy="0.00025" iyz="0" izz="0.00014"/></inertial>
<visual><origin rpy="1.57079632679 0 0"/><geometry><cylinder radius="0.05" length="0.03"/></geometry></visual>
<collision><origin rpy="1.57079632679 0 0"/><geometry><cylinder radius="0.05" length="0.03"/></geometry></collision>
</link>
<joint name="left_wheel_joint" type="continuous">
<parent link="base_link"/><child link="left_wheel"/>
<origin xyz="0 0.15 0"/><axis xyz="0 1 0"/>
<limit effort="5" velocity="20"/>
</joint>
<link name="right_wheel">
<inertial><mass value="0.2"/><inertia ixx="0.00014" ixy="0" ixz="0" iyy="0.00025" iyz="0" izz="0.00014"/></inertial>
<visual><origin rpy="1.57079632679 0 0"/><geometry><cylinder radius="0.05" length="0.03"/></geometry></visual>
<collision><origin rpy="1.57079632679 0 0"/><geometry><cylinder radius="0.05" length="0.03"/></geometry></collision>
</link>
<joint name="right_wheel_joint" type="continuous">
<parent link="base_link"/><child link="right_wheel"/>
<origin xyz="0 -0.15 0"/><axis xyz="0 1 0"/>
<limit effort="5" velocity="20"/>
</joint>
<link name="front_caster">
<inertial><mass value="0.02"/><inertia ixx="0.0000032" ixy="0" ixz="0" iyy="0.0000032" iyz="0" izz="0.0000032"/></inertial>
<visual><geometry><sphere radius="0.02"/></geometry></visual>
<collision><geometry><sphere radius="0.02"/></geometry></collision>
</link>
<joint name="front_caster_fixed" type="fixed"><parent link="base_link"/><child link="front_caster"/><origin xyz="0.12 0 -0.03"/></joint>
<gazebo reference="front_caster"><mu1>0.0</mu1><mu2>0.0</mu2></gazebo>
<link name="rear_caster">
<inertial><mass value="0.02"/><inertia ixx="0.0000032" ixy="0" ixz="0" iyy="0.0000032" iyz="0" izz="0.0000032"/></inertial>
<visual><geometry><sphere radius="0.02"/></geometry></visual>
<collision><geometry><sphere radius="0.02"/></geometry></collision>
</link>
<joint name="rear_caster_fixed" type="fixed"><parent link="base_link"/><child link="rear_caster"/><origin xyz="-0.12 0 -0.03"/></joint>
<gazebo reference="rear_caster"><mu1>0.0</mu1><mu2>0.0</mu2></gazebo>
<ros2_control name="DiffSystem" type="system">
<hardware><plugin>gz_ros2_control/GazeboSimSystem</plugin></hardware>
<joint name="left_wheel_joint"><command_interface name="velocity"/>
<state_interface name="position"/><state_interface name="velocity"/>
</joint>
<joint name="right_wheel_joint"><command_interface name="velocity"/>
<state_interface name="position"/><state_interface name="velocity"/>
</joint>
</ros2_control>
<gazebo>
<plugin filename="libgz_ros2_control-system.so" name="gz_ros2_control::GazeboSimROS2ControlPlugin">
<parameters>$(find jazzy_control_hardware)/config/diff_controllers.yaml</parameters>
</plugin>
</gazebo>
</robot>
车体 x 朝前、y 朝左,两轮轴沿 +y;轮距 0.30 m、半径 0.05 m。前后支撑球降低转弯阻力。参数用于教学,不代表某台真实机器人的辨识结果。
2.示例 2:完整配置
保存 config/diff_controllers.yaml,并在 package.xml 增加 diff_drive_controller 运行依赖:
<exec_depend>diff_drive_controller</exec_depend>
controller_manager:
ros__parameters:
update_rate: 100
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
diff_controller:
type: diff_drive_controller/DiffDriveController
diff_controller:
ros__parameters:
left_wheel_names: [left_wheel_joint]
right_wheel_names: [right_wheel_joint]
wheel_separation: 0.30
wheel_radius: 0.05
position_feedback: true
open_loop: false
cmd_vel_timeout: 0.5
publish_rate: 50.0
odom_frame_id: odom
base_frame_id: base_link
enable_odom_tf: true
本例 open_loop=false,输入为 /diff_controller/cmd_vel,类型 TwistStamped。不要使用无时间戳 Twist,也不要从其它版本配置中搬入 use_stamped_vel。
3.编译运行
cd ~/ros2_control_jazzy_ws
colcon build --symlink-install --packages-select jazzy_control_hardware
source install/setup.bash
ros2 launch jazzy_control_hardware sim.launch.py gui:=false \
model:=$(ros2 pkg prefix jazzy_control_hardware)/share/jazzy_control_hardware/urdf/diff_gz.urdf.xacro \
config:=$(ros2 pkg prefix jazzy_control_hardware)/share/jazzy_control_hardware/config/diff_controllers.yaml \
controller:=diff_controller
另一终端 source 学习工作区后:
ros2 topic pub --rate 10 --use-sim-time /diff_controller/cmd_vel \
geometry_msgs/msg/TwistStamped \
"{header: auto, twist: {linear: {x: 0.08}, angular: {z: 0.0}}}"
这里必须让时间戳来自 /clock。等待仿真时钟开始前进后,再检查命令是否被接收。
4.示例 3:确认车体确实运动
ros2 topic echo /diff_controller/odom
ros2 topic echo /joint_states
gz topic -e -n 1 -t /world/empty/pose/info
按模型名找到 learning_robot,比较不同时刻的 position。轮子里程计与世界位姿可能因接触和打滑而不同;只看到轮子转动不能证明车体移动。
停止直行发布后,可将 angular.z 改为 0.3、linear.x 改为 0 来观察转弯。停止发布后检查速度目标归零和实际停车过程。
4.1.排查顺序
控制器不 active 先查接口和参数;轮子不转先查目标与时钟;轮子转而车不走再查碰撞、摩擦、轴向和接触。不要用 open_loop=true 掩盖物理模型问题。
返回 Jazzy 总览 · 上一篇:DiffBot与差速底盘控制 · 下一篇:多接口与硬件类型