当前位置: 首页 > article >正文

gz sim机器人SDF模型 [持续更新]

机器人SDF模型

  • link
    • link的一级pose
    • 材质
  • plugin
    • 话题信息通信
    • 键盘操作plugin
  • Sensor传感器
    • imu

不算教学,个人的记录

sdf的格式跟urdf有所不同,必须是完整的一个包括,比如< pose></ pose>这样前一个后一个,urdf中是有< orign xyz=‘0 0 0’ rpy=‘0 0 0’>的写法的,也就是没< orign>< /orign>这样写。sdf中需要注意。

下面是一个两轮小车的模型sdf文件,算是一个标准基础例子。

<?xml version='1.0'?>
<sdf version='1.9'><model name='diff_drive_robot'><!-- 主车身(立方体) --><link name='base_link'><!-- 这个pose写的是右轮在整个model的零点的相对位置 --><pose>1 0 0 0 0 0</pose><!-- 物理属性必须要写,urdf中是可以不写的 --><inertial><mass>5.0</mass><inertia><ixx>0.104167</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.104167</iyy><iyz>0</iyz><izz>0.083333</izz></inertia></inertial><collision name='base_collision'><geometry><box><size>0.3 0.2 0.1</size> <!-- 长宽高:30cm x 20cm x 10cm --></box></geometry><surface><friction><ode><mu>0.5</mu><mu2>0.5</mu2></ode></friction></surface></collision><visual name='base_visual'><geometry><box><size>0.3 0.2 0.1</size></box></geometry><material><ambient>0.8 0.2 0.2 1</ambient><diffuse>0.8 0.2 0.2 1</diffuse></material></visual></link><!-- 左轮 --><link name='left_wheel'><inertial><mass>1.0</mass><inertia><ixx>0.05</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.05</iyy><iyz>0</iyz><izz>0.1</izz></inertia></inertial><collision name='left_wheel_collision'><geometry><cylinder><radius>0.1</radius>  <!-- 轮径20cm --><length>0.05</length> <!-- 厚度5cm --></cylinder></geometry></collision><visual name='left_wheel_visual'><geometry><cylinder><radius>0.1</radius><length>0.05</length></cylinder></geometry><material><ambient>0.3 0.3 0.3 1</ambient><diffuse>0.3 0.3 0.3 1</diffuse></material></visual></link><joint name='left_wheel_joint' type='revolute'><parent>base_link</parent><child>left_wheel</child><axis><xyz>0 1 0</xyz> <!-- Y轴为旋转轴 --><limit><lower>-1e9</lower> <!-- 无限旋转 --><upper>1e9</upper></limit></axis><pose>-0.15 0 -0.05 0 0 0</pose> <!-- 左偏移15cm --></joint><!-- 右轮(结构与左轮对称) --><link name='right_wheel'><!-- 这个pose写的是右轮在整个model的零点的相对位置,如果加了relative_to=‘base_link’,那就是相对base_link的位置 --><pose>1 0 0 0 0 0</pose><inertial><mass>1.0</mass><inertia><ixx>0.05</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.05</iyy><iyz>0</iyz><izz>0.1</izz></inertia></inertial><collision name='right_wheel_collision'><geometry><cylinder><radius>0.1</radius>  <!-- 轮径20cm --><length>0.05</length> <!-- 厚度5cm --></cylinder></geometry></collision><visual name='right_wheel_visual'><geometry><cylinder><radius>0.1</radius><length>0.05</length></cylinder></geometry><material><ambient>0.3 0.3 0.3 1</ambient><diffuse>0.3 0.3 0.3 1</diffuse></material></visual></link><joint name='right_wheel_joint' type='revolute'><parent>base_link</parent><child>right_wheel</child><axis><xyz>0 1 0</xyz> <!-- Y轴为旋转轴 --><limit><lower>-1e9</lower> <!-- 无限旋转 --><upper>1e9</upper></limit></axis><pose>0.15 0 -0.05 0 0 0</pose> <!-- 左偏移15cm --></joint></model>
</sdf>

查看sdf文件是否有效,gazebo能检测到并且输出
在这里插入图片描述

link

link的一级pose

给了base_link和左轮右轮的pose,这是相对整个model的零点的位置,也就是左轮的0 0 0 0 0 0处,因为三个link都是写在了< model> < /model>中,所以 也是相对模型零点的位置。

    <link name='base_link'><pose>0 0 1 0 0 0</pose>
    <link name='left_wheel'><pose>0 0 0 0 0 0</pose>
    <link name='right_wheel'><pose>1 0 0 0 0 0</pose>

在这里插入图片描述
整体都有位移,三个都改为0 0 1 0 0 0了
在这里插入图片描述
一般机器人都是写的有关节和链接,如果只用pose表示相对位置,只改了一个部件,那这个部件就会相对整个机器人发生位移,但是这个部件的子链接又没有位移就会扰乱了机器人模型,所以对一个完整的机器人,我会在pose里写一个relative_to=‘’

    <link name='left_wheel'><pose relative_to='base_link'>0 -0.125 0 1.57 0 0</pose>
    <link name='right_wheel'><pose relative_to='base_link'>0 0.125 0 1.57 0 0</pose>

在这里插入图片描述

材质

材质文件的保存形式,原来的sdf文件没定义纹理,可以自己创建material文件夹以及下面的scripts文件夹写纹理脚本文件,texture文件夹是纹理图片。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两种写法

        <script><uri>model://B2Z1/materials/scripts/gazebo.material</uri><name>Gazebo/Grey</name></script><!-- 只要求显示的话可以自己写,也不用脚本 --><material><shader type='pixel'/><ambient>0.3 0.3 0.3 1</ambient><diffuse>1 1 1 1</diffuse><specular>1 1 1 1</specular><emissive>0 0 0 1</emissive><shininess>90</shininess></material>

在这里插入图片描述

plugin

常见插件类型

  1. 传感器插件(如摄像头、激光雷达)
  2. 控制器插件(关节控制、机器人运动控制)
  3. 物理引擎插件(自定义物理行为)
  4. 系统插件(全局逻辑,如环境光照控制)

话题信息通信

为了与ros2进行通信的功能,写plugin引出gz topic话题,然后转换成ros2 topic话题
在这里插入图片描述
到官方文档中查看可以使用的接口
gz::sim::systems Namespace Reference
在这里插入图片描述
看到joint的控制器这里,可以看到给出了sdf中可写的内容
在这里插入图片描述

  <!-- JointController 插件 --><plugin name="joint_controller" filename="gz-sim-joint-controller-system"><!-- 必须参数 --><joint_name>your_joint</joint_name>  <!-- 要控制的关节名称 --><!-- 可选参数 --><use_force_commands>false</use_force_commands>  <!-- 是否使用力控制模式,默认 velocity 模式 --><use_actuator_msg>false</use_actuator_msg>     <!-- 是否使用 actuator 消息,默认 false --><actuator_number>0</actuator_number>           <!-- 执行器索引,默认 0 --><topic>/your_topic</topic>                     <!-- 命令话题,默认自动生成 --><sub_topic>your_subtopic</sub_topic>           <!-- 子话题,默认自动生成 --><initial_velocity>0</initial_velocity>         <!-- 初始速度 --><!-- 力控制模式下的 PID 参数(可选) --><p_gain>1.0</p_gain><i_gain>0.0</i_gain><d_gain>0.0</d_gain><i_max>1.0</i_max><i_min>-1.0</i_min><cmd_max>1000.0</cmd_max><cmd_min>-1000.0</cmd_min><cmd_offset>0.0</cmd_offset></plugin>

找到插件文件的存放路径发现这里有插件,在plugin中的filename填的就是插件文件名的部分,去掉lib和.so的格式

filename=“gz-sim-joint-controller-system” → 实际加载的库文件为 libgz-sim-joint-controller-system.so

在这里插入图片描述
能实现外部与仿真模型进行消息控制,< topic>和< sub_topic>非常重要, 主要就是自定义一个话题名成为gz topic,这样就有了接口,然后使用ros_gz_bridge进行转换让ros2代码进行操控消息数据

键盘操作plugin

监听特定输入消息,当匹配到预设条件时,自动发布指定的输出消息,在仿真中实现 “事件触发响应” 的机制,16777234是一个按键的对应码,类似c++中按键有对应的ASCII码那样。通过话题/cmd_vel输出速度数据。

        <plugin filename="gz-sim-triggered-publisher-system"name="gz::sim::systems::TriggeredPublisher"><input type="gz.msgs.Int32" topic="/keyboard/keypress"><match field="data">16777234</match></input><output type="gz.msgs.Twist" topic="/cmd_vel">linear: {x: 0.0}, angular: {z: 0.5}</output></plugin>

Sensor传感器

相机、imu、激光雷达是比较常用的

imu

看官方文档,说是plugin项放在world里就行,sensor项放在link中
在这里插入图片描述

<link name='imu_link'><pose relative_to='base_link'>0 0 0.125 0 0 0</pose><inertial><mass>0.1</mass><inertia><ixx>0.0001</ixx><ixy>0</ixy><ixz>0</ixz><iyy>0.0001</iyy><iyz>0</iyz><izz>0.0001</izz></inertia></inertial><visual name='imu_visual'><geometry><box><size>0.05 0.05 0.02</size></box></geometry><material><shader type='pixel'/><script><uri>model://joint/materials/scripts/gazebo.material</uri><name>Gazebo/Blue</name></script>          </material></visual><sensor name="imu_sensor" type="imu"><always_on>true</always_on><update_rate>10</update_rate><topic>imu</topic><visualize>true</visualize></sensor></link><!-- IMU传感器配置 --><plugin filename="libgz-sim-imu-system.so" name="gz::sim::systems::Imu"></plugin>
# 查看话题有没有imu
gz topic -l	
# 查看imu 的具体信息
gz topic -e -t /imu

在这里插入图片描述
在这里插入图片描述

相关文章:

gz sim机器人SDF模型 [持续更新]

机器人SDF模型 linklink的一级pose材质 plugin话题信息通信键盘操作plugin Sensor传感器imu 不算教学&#xff0c;个人的记录 sdf的格式跟urdf有所不同&#xff0c;必须是完整的一个包括&#xff0c;比如< pose></ pose>这样前一个后一个&#xff0c;urdf中是有<…...

【Qt】Ubuntu22.04使用命令安装Qt5和Qt6

1、安装Qt5 注意:Ubuntu22.04已经没有 qt5-default ,因此不能一键安装啦 1)安装核心组件 sudo apt install qtbase5-dev qtchooser qt5-qmake qtcreator2)安装QtCreator sudo apt install qtcreator3)安装工具包、Qt Quick 开发的核心库(qtdeclarative5-dev) sudo a…...

Pytest的Fixture使用

概述 Pytest中的Fixture可以使得测试代码高度复用,同时对资源进行安全的管理,以及在复杂的测试场景用进行灵活的组合。 概念 Fixture:可重用的函数,用@pytest.fixture来进行装饰,用于为测试提供数据、环境或者服务作用域:控制Fixture的生命周期,默认是function,可设置…...

【MySQL | 六、索引特性(进一步理解)】

目录 索引的理解索引的作用MySQL与磁盘的IOPage单个Page的分类多个Page的组织B树的特点 B树和B树的区别聚簇索引 VS 非聚簇索引聚簇索引的优缺点非聚簇索引的优缺点 创建索引常见索引分为&#xff1a;主键索引InnoDB主键索引的生成过程&#xff08;1&#xff09;初始化&#xf…...

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…...

【测试开发】OKR 小程序端黑盒测试报告

【测试报告】OKR 小程序端 项目名称版本号测试负责人测试完成日期联系方式OKR 小程序端4.0马铭胜2025-03-2515362558972 1、项目背景 1.1 OKR 用户端 在如今这个快节奏的时代中&#xff0c;个人和组织的成长往往依赖于清晰、明确且意义深远的目标。然而&#xff0c;如何设定…...

HTTP 1.0和2.0 有什么区别?

HTTP 1.0和HTTP 2.0是互联网中用于数据传输的重要协议&#xff0c;两者在功能和性能上有显著差异。 以下是它们的主要区别&#xff1a; HTTP 1.0 的特点&#xff1a; 单一连接&#xff1a;每个请求需要独立连接&#xff0c;导致高延迟和资源浪费。文本传输&#xff1a;使用文…...

部署高可用PostgreSQL14集群

目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群&#xff08;14版本&#xff09;&…...

JavaScript 对事件的反应机制

JavaScript 对事件的反应机制 JavaScript 对事件的反应机制是网页实现用户交互的核心&#xff0c;主要通过事件监听与处理函数实现对用户行为的响应。以下是关键要点解析&#xff1a; 一、事件机制基础 1. 事件的定义 事件是用户或浏览器在页面上的动作&#xff08;如点击、…...

Vue3中keep-alive缓存组件应用场景。

文章目录 一、KeepAlive是什么&#xff1f;二、基本使用1.例子2.keep-alive使用 三、其他属性3.1 包含/排除3.2 最大缓存实例数3.3 缓存实例的生命周期 总结 一、KeepAlive是什么&#xff1f; 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例…...

Pythonload JSON文件需要手动关闭吗?

在Python中使用 json 模块加载JSON文件时&#xff0c;通常不需要手动关闭文件。 例如&#xff0c;使用以下方式加载JSON文件&#xff1a; import json with open(data.json, r) as f: data json.load(f) 在上述代码中&#xff0c;使用 with 语句打开文件&#xff0c;它会在代码…...

SCI论文阅读指令(特征工程)

下面是一个SCI论文阅读特征工程V3.0&#xff0c;把指令输入大模型中&#xff0c;并上传PDF论文&#xff0c;就可以帮你快速阅读论文。 优先推荐kimi&#xff0c;当然DeepSeek、QwQ-32B等大语言模型也可以。测试了一下总结的还不错&#xff0c;很详细。 请仔细并深入地阅读所提…...

CosyVoice2在Windows系统上本地部署的详细步骤

CosyVoice2在Windows系统上本地部署的详细步骤&#xff1a; 下载源码并初始化&#xff1a; 确保你的设备上安装了Git。打开命令提示符&#xff08;cmd&#xff09;&#xff0c;执行以下命令来克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/CosyVo…...

鸿蒙入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)

文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…...

RabbitMQ 核心组件及功能详解

RabbitMQ 是一个开源的消息代理和队列服务器,其核心架构由以下关键组件构成: 一、核心组件架构 #mermaid-svg-mIHqbpvVt25Kpyl0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mIHqbpvVt25Kpyl0 .error-icon{fil…...

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…...

探秘 C++ 双星系统模型:实现快速值切换

在软件开发的世界里&#xff0c;有时我们会遇到需要频繁在两个值之间进行切换的场景。为了高效地处理这类情况&#xff0c;我们可以设计一个专门的类来实现这个功能。今天&#xff0c;我们就来详细介绍一个用 C 实现的双星系统模型类 Turner&#xff0c;它能够帮助我们轻松地在…...

AI 生成内容(AIGC):从文本到视频的完整流程

近年来&#xff0c;AI 生成内容&#xff08;AIGC, AI-Generated Content&#xff09; 迅速发展&#xff0c;从文本、图片到音频、视频&#xff0c;AI 在创意内容生成方面展现出了惊人的能力。AIGC 不仅提升了内容创作效率&#xff0c;还降低了成本&#xff0c;使得普通用户也能…...

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…...

WebMvcConfigurer 的 addResourceLocations

在 Spring Boot 的 addResourceLocations 方法中&#xff0c;file: 是一个 URL 前缀&#xff0c;用于指示资源的位置是本地文件系统路径。以下是详细解释&#xff1a; 一、file: 的作用 file: 是 Java 中用于表示本地文件系统的 URL 前缀。它告诉 Spring Boot&#xff0c;资源…...

Pytorch学习笔记(八)Learn the Basics - Save and Load the Model

这篇博客瞄准的是 pytorch 官方教程中 Learn the Basics 章节的 Save and Load the Model 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m …...

正则表达式基本语法和Java中的简单使用

先来个例子 public static final Pattern CHINESE_PATTERN Pattern.compile("[\\u4e00-\\u9fa5]"); / 检测字符串是否包含汉字 String text "Hello 世界"; boolean hasChinese CHINESE_PATTERN.matcher(text).find(); // 返回 true// 提取所有汉字 Mat…...

Mysql 回表查询,什么是回表查询,如何拒绝sql查询时的回表问题

文章目录 1. 什么是回表(回表查询)2. 如何减少回表3. 使用案例3.1 问题分析3.2 避免回表查询3.3 开始优化前言: 在继续讲解专栏内容之前,先学习几个概念,以便更好了解: 什么是聚簇索引什么是回表查询这篇文章详细分析 回表查询。聚簇索引的理解可以进入这篇文章:什么是聚…...

Spring Boot响应压缩配置与优化

一、核心工作机制 1.1 自动协商触发条件 Spring Boot的响应压缩功能基于智能协商机制&#xff0c;需同时满足以下条件方可触发&#xff1a; 客户端支持&#xff1a;请求头包含Accept-Encoding: gzip/deflate数据量阈值&#xff1a;响应体大小超过预设值&#xff08;默认2KB&…...

常考计算机操作系统面试习题(三上)

目录 1. 为何要引入与设备的无关性&#xff1f;如何实现设备的独立性&#xff1f; 2. 页面置换先进先出算法 3. 页面置换先进先出算法&#xff0c;4个页框 4. 进程优先级调度算法 5. 短作业优先调度策略 6. 平均内存访问时间计算 7. 页式存储和段式存储的物理地址计算 …...

MATLAB 绘制空间分布图 方法总结

方法一&#xff1a;用mapshow函数 figure(1); hold on %% 添加陆地 land shaperead(landareas); mapshow(landareas.shp, FaceColor, [1 1 1], EdgeColor, [0.3 0.3 0.3],FaceAlpha,0)%% 添加站点 for i 1:size(mycmap,1)mapshow(lon(label i),lat(label i),displaytype,po…...

Maven工具学习使用(三)——坐标和依赖

坐标元素 Maven坐标是通过一些元素定义的,元素包括groupId、artifactId、version、packaging、classifier groupId:定义当前Maven项目隶属的实际项目。Maven项目和实际项目不是一对一的关系。一个实际的项目对应的Maven模块可能会有很多,比如SpringFramework。groupId不应…...

命令模式(Command Pattern)★

命令模式&#xff08;Command Pattern&#xff09; 如果任务有多个复杂的操作&#xff0c;可以使用命令模式将任务的操作封装为命令对象。这些命令对象可以在需要时按顺序执行&#xff0c;方便管理任务执行的逻辑和回滚操作。 示例&#xff1a; class Command { public:virtu…...

深度学习论文: Image Segmentation Using Text and Image Prompts

深度学习论文: Image Segmentation Using Text and Image Prompts Image Segmentation Using Text and Image Prompts PDF: https://arxiv.org/abs/2503.10622v1 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/…...

Docker+Ollama+Xinference+RAGFlow+Dify+Open webui部署及踩坑问题

目录 一、Xinference部署 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;部署 &#xff08;三&#xff09;参数 &#xff08;四&#xff09;错误问题 &#xff08;五&#xff09;Xinference配置Text-embedding模型 &#xff08;六&#xff09;Xinference配…...