教程 | 阿克曼结构移动机器⼈的gazebo仿真(四)

本文介绍了如何手动编写阿克曼结构移动机器人的URDF文件,以进行gazebo仿真。从创建功能包、配置环境、建立小车模型、添加轮子转动关节、配置传感器,到最终在rviz中展示和验证模型,详细讲解了整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四章、手撸阿克曼小车URDF代码

01前言

上节说到通过twist消息控制从solidworks导出的阿克曼小⻋,但后续的开发⼯作中发现了从SW导出的模型做仿真有⼀些弊端,导致仿真的效果并不理想,所以博主准备⼿写⼀个urdf代码,并通过模型替代法来实现tianracer的仿真,本次写的urdf⽂件是基于tianracer小⻋1:1⽐例来编写的,⽅便后续的模型替换⼯作。

02创建小车功能包

在⼯作空间内创建racebot_description功能包:

catkin_create_pkg racebot_description roscpp rospy std_msgs

在该⼯作空间下创建config、launch、rviz_config、scripts、urdf等⽂件夹,此时准备⼯作已经做完。

03配置创建环境

我们需要创建⼀个URDF⽂件与能让模型在rviz中显⽰的launch⽂件,⽅便我们创造模型。以创建小⻋base_link模型为例:

在urdf⽂件夹中创建racebot.urdf⽂件,⾸先创建base_link,由于根link不能包含碰撞属性,否则gazebo仿真中会报错,所以我们将base_footprint作为根link,并且将base_footprint设置为小⻋贴到地⾯的位置,由于该小⻋是1:1仿真tianracer的,所以base_link在base_footprint正上⽅32mm处,如下代码所⽰:

<?xml version="1.0" encoding="utf-8"?>
<robot name="racebot">
    <link name="base_footprint">
    </link>
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.28 0.1 0.03"/>        
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="yellow">
                <color rgba="0.8 0.3 0.1 0.5" />
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="0.28 0.1 0.03" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
        </collision>
    </link>
    <joint name="base_link_joint" type="fixed">
        <parent link="base_footprint" />
        <child link="base_link"/>
        <origin xyz="0 0 0.032" rpy="0 0 0" />
    </joint>
</robot>

接着在launch⽂件夹中创建⼀个可以将小⻋模型在rviz中显⽰的launch⽂件racebot_rviz.launch,并且能够加载上述urdf⽂件:

<?xml version="1.0" encoding="UTF-8"?>
<launch>
    <!-- 将 urdf 文件内容设置进参数服务器 -->
    <param name="robot_description" textfile="$(find racebot_description)/urdf/racebot.urdf" />
    <!-- 启动 rivz -->
    <!-- <node pkg="rviz" type="rviz" name="rviz_test" args="-d $(find racebot_description)/config/racebot.rviz" /> -->
    <node pkg="rviz" type="rviz" name="rviz" args="" /> 
    <!-
### Gazebo阿克曼小车轮子抖动的解决方案 在Gazebo仿真环境中,阿克曼小车轮子出现抖动问题通常与物理参数配置、关节控制器设置以及传感器数据反馈有关。以下是一些可能的解决方案和调整方法[^1]。 #### 1. 物理参数优化 确保Gazebo中的物理引擎参数配置正确。可以通过调整`<physics>`标签下的参数来减少抖动现象。例如: - 增加`max_step_size`值以提高仿真步长精度。 - 调整`real_time_update_rate`以匹配硬件性能。 - 设置合适的阻尼系数(damping)和摩擦系数(friction)以减少不稳定的运动。 ```xml <physics type="ode"> <max_step_size>0.001</max_step_size> <real_time_update_rate>1000</real_time_update_rate> </physics> ``` #### 2. 关节控制器调整 阿克曼小车的轮子抖动可能源于关节控制器的PID参数配置不当。需要仔细调整PID参数以实现更平稳的控制。例如,在ROS中使用`effort_controllers/JointPositionController`时,可以修改`p`, `i`, `d`值: ```yaml steering_joint_controller: type: effort_controllers/JointPositionController joint: front_left_steer_joint pid: {p: 100.0, i: 0.01, d: 10.0} ``` 上述参数需要根据具体模型进行微调[^2]。 #### 3. 模型惯性参数校准 轮子抖动也可能由模型的惯性参数不合理引起。检查URDF或SDF文件中的`<inertial>`标签,确保质量、质心和惯性矩阵与实际物理特性一致。例如: ```xml <link name="front_left_wheel"> <inertial> <mass value="5.0"/> <origin xyz="0 0 0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> </link> ``` #### 4. 轮胎接触参数优化 调整轮胎与地面之间的接触参数,如弹簧刚度(spring stiffness)和阻尼系数(damping coefficient),可以有效减少抖动。在Gazebo中,这些参数通过`<surface>`标签配置: ```xml <link name="front_left_wheel"> <collision name="collision"> <surface> <contact> <ode> <kp>1e7</kp> <!-- 弹簧刚度 --> <kd>1e3</kd> <!-- 阻尼系数 --> </ode> </contact> </surface> </collision> </link> ``` #### 5. 传感器数据过滤 如果抖动是由传感器噪声引起的,可以在ROS节点中添加低通滤波器或平滑算法来处理传感器数据。例如,使用`ros::filters`库对IMU数据进行滤波: ```cpp #include <ros/ros.h> #include <sensor_msgs/Imu.h> #include <filters/filter_base.h> filters::FilterBase<sensor_msgs::Imu>* imu_filter; void imuCallback(const sensor_msgs::Imu::ConstPtr& msg) { sensor_msgs::Imu filtered_msg; if (imu_filter->update(*msg, filtered_msg)) { // 发布滤波后的数据 } } int main(int argc, char** argv) { ros::init(argc, argv, "imu_filter_node"); ros::NodeHandle nh; imu_filter = new filters::FilterChain<sensor_msgs::Imu>(); std::string filter_params_name = "imu_filter"; imu_filter->configure(filter_params_name, nh); ros::Subscriber sub = nh.subscribe("imu_raw", 10, imuCallback); ros::Publisher pub = nh.advertise<sensor_msgs::Imu>("imu_filtered", 10); ros::spin(); return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值