gazebo 中车子静态(不设置速度)滑动的问题

news2025/1/11 0:16:52

目录

  • 写在前面的话(重要!!!)
  • gazebo中的参数设置
    • 设置启动小车的初始姿态
  • 发现车子与地面的接触点有问题(关键!!!)
    • 查看接触点的步骤:
    • 原始车轮设置
    • 原始转向器设置
    • 统一车轮和转向器的设置
  • 最终结果
    • 控制指令
    • gif 动图显示

写在前面的话(重要!!!)

启动gazebo的时候,不给车子发送控制指令,总是无法禁止,会沿着一个方向转弯,我进行多种的尝试:

  1. 一开始以为是摩擦力的问题,给车轮设置了很大的摩擦力(十个0的那种),但是还是无法禁止。
  2. 车子质量的问题,把质量调小,车子还是会转弯,但是速度变慢了很多;把质量调大,车子转弯速度会加快很多。
  3. 车轮刚性的问题,这个没用,但是我发现了,这个设置小,车子碰撞地面和墙壁的话很容易弹飞,设置大的话,车子就不怎么受弹力的影响。
  4. 车轮阻尼的问题,这个有用,设置大了,车子真的会禁止不动,但是同时车轮转不动了,有点类似大力刹车,车轮卡死的感觉。
  5. 车轮惯性的问题,统一了惯量矩阵设置,但还是没用。
  6. 转向器和车轮的位置的问题,统一了转向器和车轮的位置,车轮惯性统一也要保持,这次才实现静止(成功!!!)。

gazebo中的参数设置

  1. mul1:摩擦力
  2. mul2:摩擦力
  3. kp: 刚性大小,表示车子对抗形变的能力,越大,表示车子对抗形变的能力越强,小的话车子会像篮球一样反复弹跳。
  4. kd: 阻尼大小,表示车子的制动能力,越大,表示刹车的力度越大,越不会滑动。
  5. min_depth:这个标签设置了碰撞体之间的最小接触深度为0.001。这意味着在模拟碰撞时,如果两个碰撞体的接触深度小于0.001,系统将视它们为没有接触。
  6. maxVel:定义了最大线速度为20。
  7. fdir1:指定了摩擦力的方向。

设置启动小车的初始姿态

spawn_x_val = '0.0'
spawn_y_val = '0.0'
spawn_z_val = '0.756'#0.755879
spawn_yaw_val = '0.0'

这些值设置的是车子在gazebo中出现的位置,在gazebo中,Z轴默认垂直地面向上(蓝色),X轴(红色),Y轴(绿色)。gazebo是一个支持仿真物理空间的软件。

假设单位是米,如果你设置了初始Z轴的值是10米【spawn_z=10.0】,然后你的车子中心点(base_link)离车轮触地的高度是1米,那么车子就会从10米高空出现,然后因为重力的影响下落砸到地面上。

如果你设置初始Z轴的值是0米,由于你的车子的中心点的高度是1米,那么你的车子初始位置就是被压入地面1米以下,那么因为地面的弹力作用,会导致车子弹射进入高空再下落。

这里因为我的车子的中心点设置比车胎底部高出0.7558米,所以我需要考虑这个高度,防止车子被压入地面。(在下图中车子的pose栏的z值偏小,因为车轮因为重力影响被挤压,高度有细微变化

# Pose where we want to spawn the robot
spawn_x_val = '0.0'
spawn_y_val = '0.0'
spawn_z_val = '0.756'#0.755879
spawn_yaw_val = '0.0'

spawn_entity = Node(package='gazebo_ros', executable='spawn_entity.py',
                    arguments=['-topic', 'robot_description',
                               '-entity', f'{robot_name_in_model}',
                                '-x', spawn_x_val,
                                '-y', spawn_y_val,
                                '-z', spawn_z_val,
                                '-Y', spawn_yaw_val
                               ], 
                    output='screen')

在这里插入图片描述

发现车子与地面的接触点有问题(关键!!!)

在 gazebo 中发现, 四个轮子中有个轮子(右后轮)与地面没有接触点(不施加力下,车子无法静止的关键原因),检查 xacro 发现车子车轮和转向器的原点的坐标没有统一,惯性也没统一,这是可能是由于solidworks导出urdf出现的误差,也有可能本身solidworks设计的车子就没有考虑这些。

后续我通过xacro函数对 车轮(wheel)和转向器(orient)进行了统一设置,车子实现了静态禁止。

查看接触点的步骤:

gazebo 左上角窗口 World, 在 Models中,右键选择 car_urdf_gazebo,View 设置为 transparent(透明),然后在菜单栏 View 勾选 Contacts 即可

在这里插入图片描述

原始车轮设置

在这里插入图片描述

原始转向器设置

在这里插入图片描述

统一车轮和转向器的设置

  <xacro:macro name='orient_joint' params='prefix:=left_front'>
      <joint name="${prefix}_orient_joint"
            type="continuous">
          <xacro:if value="${prefix == 'left_front'}">
              <origin
                  xyz="0.22654 0.5868 -0.068"
                  rpy="0 0 0" />
          </xacro:if>
          <xacro:if value="${prefix == 'left_back'}">
              <origin
                  xyz="-0.77346 0.5868 -0.068"
                  rpy="0 0 0" />
          </xacro:if>
          <xacro:if value="${prefix == 'right_front'}">
              <origin
                  xyz="0.22654 -0.5868 -0.068"
                  rpy="0 0 0" />
          </xacro:if>
          <xacro:if value="${prefix == 'right_back'}">
              <origin
                  xyz="-0.77346 -0.5868 -0.068"
                  rpy="0 0 0" />
          </xacro:if>
        <parent
          link="base_link" />
        <child
          link="${prefix}_orient_Link" />
        <axis
          xyz="0 0 -1" />
      </joint>
  </xacro:macro>

  <xacro:macro name='wheel_joint' params='prefix:=left_front'>
    <joint name="${prefix}_wheel_joint"
        type="continuous">
        <xacro:if value="${prefix == 'left_front'}">
            <origin
              xyz="0 0.04825 -0.385"
              rpy="0 0 0" />
        </xacro:if>
        <xacro:if value="${prefix == 'left_back'}">
            <origin
              xyz="0.001828 0.04825 -0.385"
              rpy="0 0 0" />
        </xacro:if>
        <xacro:if value="${prefix == 'right_front'}">
            <origin
              xyz="0 -0.04825 -0.385"
              rpy="0 0 0" />
        </xacro:if>
        <xacro:if value="${prefix == 'right_back'}">
            <origin
              xyz="0.001828 -0.04825 -0.385"
              rpy="0 0 0" />
        </xacro:if>
      <parent
        link="${prefix}_orient_Link" />
      <child
        link="${prefix}_wheel_Link" />
      <axis
        xyz="0 1 0" />
    </joint>
  </xacro:macro>
  

最终结果

控制指令

ros2 topic pub /forward_velocity_controller/commands std_msgs/msg/Float64MultiArray "{data: [-10,-10,-10,-10]}" --rate 100

gif 动图显示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2131605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现mini-redis字符串操作

写在文章开头 在之前的系列文章中&#xff0c;我们通过命令行模式完成了mini-redis解析和处理指令的执行基调&#xff0c;这篇文章笔者将对mini-redis中存储字符串的set和get指令的设计和实现进行分析讲解&#xff0c;希望对你了解mini-redis有所帮助。 Hi&#xff0c;我是 sh…

94 、k8s之rbac

一、rbac----安全机制 赋权机制 集群是按照用户名进行登录&#xff0c;按照项目名称进行命名空间的分类。 配电云主站------62天 8个人 高温补贴 一主2从 user pdyzz pdyzz -n pdyzz 资源空间 pod数量 1.1、k8s的安全机制&#xff1a; apiserver------>集群内和外…

S3C2440开发板点亮LED灯+PWM定时器

目录 GPIO引脚和寄存器概述 点亮LED灯步骤 1.配置GPIO 2.点亮LED 设置引脚为输出 控制引脚电平 完整代码 PWM GPIO引脚和寄存器概述 GPIO端口&#xff1a; S3C2440的GPIO引脚可被配置为输入或输出&#xff08;控制LED的引脚通常配置为输出模式&#xff09;。寄存器&#…

从LoRA到QLoRA:量化技术如何改变预训练模型的微调方式

在现代人工智能的发展中&#xff0c;预训练语言模型&#xff08;LLM&#xff09;已成为各种自然语言处理任务中的关键技术。这些模型通常具有数十亿甚至数千亿的参数&#xff0c;因此需要巨大的计算和存储资源来进行微调。QLoRA提出了一种新方法&#xff0c;使得在单个48GB的GP…

“这年头,只依赖上班,是赚不到钱的——揭秘如何利用AI开启赚钱新模式“

苹果&#xff0c;在AI时代终于要有大动作了。 反观国内华为&#xff0c;前段时间刚上线的新款平板MatePad Air也大放异彩&#xff0c;搭载AI助手&#xff0c;创新生产力。 像我这写文案的时常灵感枯竭&#xff0c;打开电脑却迟迟下不了手…而华为小艺帮写功能只需要输入指令就…

【C\C++】Eigen初体验(VS Code编译)

Eigen Eigen 是一个高效的 C 库&#xff0c;专注于线性代数运算。PCL 使用 Eigen 来处理矩阵和向量运算&#xff0c;特别是在点云数据的变换、配准和特征计算等方面。Eigen 提供了高效的矩阵运算功能&#xff0c;使得 PCL 在处理大规模点云数据时能够保持高性能。 Eigen 使用…

如何使用Chainlit让所有网站快速嵌入一个AI聊天助手Copilot

Copilot 副驾驶 Software Copilot 是嵌入到您的应用/产品中的一种新型助手。它们旨在通过提供情境指导并代表用户采取行动来帮助用户充分利用您的应用。 支持的功能 信息流媒体元素声音的询问用户聊天记录聊天资料反馈✅✅✅✅✅❌✅✅ 嵌入 Copilot 首先&#xff0c;确保您…

团队协作必备:2025年10大企业知识库管理系统工具推荐

2025年团队协作知识库工具合集TOP 10 在团队协作和知识管理日益重要的今天&#xff0c;选择一款高效、灵活的知识库工具对于提升工作效率至关重要。以下是精心挑选的2025年团队协作知识库工具合集TOP 10&#xff0c;每款工具都具备独特的功能和优势&#xff0c;以满足不同团队…

基于鸿蒙API10的RTSP播放器(一:基本界面的实现)

ijkplayer简介&#xff1a; ijkplayer 本身是一个开源的 Android 媒体播放库&#xff0c;它主要用于播放视频和音频文件&#xff0c;现在已有前辈将其引入到鸿蒙当中&#xff0c;通过XComponent组件完成适配。向开源致敬&#xff01; 支持格式&#xff1a; 它支持多种格式&…

wine 麒麟系统运行Windows编译的exe

启动终端 首先,我们需要打开终端程序。 在终端中,输入以下命令: sudo apt-get update这个命令通常会要求输入密码,输入你的密码后,就可以继续执行了。 如果你想要切换到 root 用户,可以通过以下方法: su 用户名然后输入 root 用户的密码。 如果你想要重置 root 用户…

网站如何防范BOT流量?

随着互联网的快速发展&#xff0c;BOT流量已成为网络安全领域的一大隐患。BOT&#xff0c;即自动化程序&#xff0c;它们在网络中执行各种任务&#xff0c;包括数据抓取、恶意抢购、暴力破解等。这些行为不仅威胁到网站的正常运营&#xff0c;还可能造成数据泄露、经济损失等严…

day20JS-axios数据通信

1. 什么是axios axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端&#xff0c;简单的理解就是ajax的封装&#xff0c;只不过它是Promise的实现版本。 特性&#xff1a; 从浏览器中创建 XMLHttpRequests从 node.js 创建 http 请求支持 Promise API拦截请求和响应转…

零宽字符应用场景及前端解决方案

零宽字符&#xff08;Zero Width Characters&#xff09;是一类在文本中不可见但具有特定功能的特殊字符。称为零宽字符&#xff0c;也叫幽灵字符。它们在显示时不占据任何空间&#xff0c;但在文本处理和显示中发挥着重要作用。这些字符主要包括零宽度空格、零宽度非连接符、零…

【C++ 高频面试题】STL 你了解多少呢?vector 的底层实现原理

文章目录 1. 常见的 STL 容器2.vector 和 list 的区别3. vector 的底层原理4. push_back() 和 emplace_back() 区别 1. 常见的 STL 容器 &#x1f34e;①序列容器 vector&#xff08;向量&#xff09;&#xff1a;是一个动态数组实现&#xff0c;提供高效的随机访问和在尾部进行…

基于R语言结构方程模型分析与实践技术应用

结构方程模型&#xff08;Sructural Equation Model&#xff09;是一种建立、估计和检验研究系统中多变量间因果关系的模型方法&#xff0c;它可以替代多元回归、因子分析、协方差分析等方法&#xff0c;利用图形化模型方式清晰展示研究系统中变量间的因果网络关系&#xff0c;…

信息安全数学基础(9)素数的算数基本定理

前言 在信息安全数学基础中&#xff0c;素数的算数基本定理&#xff08;也称为唯一分解定理或算术基本定理&#xff09;是一个极其重要的定理&#xff0c;它描述了正整数如何唯一地分解为素数的乘积。这个定理不仅是数论的基础&#xff0c;也是许多密码学算法&#xff08;如RSA…

【算法专场】分治(上)

目录 前言 什么是分治&#xff1f; 75. 颜色分类 算法分析 算法步骤 算法代码 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法步骤 算法代码 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 算法分析 算法步骤 ​编辑…

【Redis入门到精通一】什么是Redis?

目录 Redis 1. Redis的背景知识 2.Redis特性 3.Redis的使用场景 4.Ubuntu上安装配置Redis Redis Redis在当今编程技术中的地位可以说非常重要&#xff0c;大多数互联网公司内部都在使用这个技术&#xff0c;熟练使用Redis已经成为开发人员的一个必备技能。本章将带领读者…

yolov5实战全部流程

本科生阶段除了在中等以上的985和某些特定的CS强项院校&#xff0c;无意愿研究生学习的本科生是不建议学习人工智能这一专业的&#xff0c;保研学生也许可以在实验室打工推荐信学习接触到此类事件&#xff0c;此项blog主要是对yolov5的实践性项目&#xff0c;yolov5作为最具有代…

python 函数 封装

封装 函数的参数是&#xff1a;变量 def 函数(参数):print(参数)if __name__ __main__:函数(参数)函数(参数2)函数的参数是&#xff1a; 字典 import requests# 定义一个字典 data {} 地址 "https://webdriveruniversity.com/" 请求方法 getdata["url"…