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
常见插件类型
- 传感器插件(如摄像头、激光雷达)
- 控制器插件(关节控制、机器人运动控制)
- 物理引擎插件(自定义物理行为)
- 系统插件(全局逻辑,如环境光照控制)
话题信息通信
为了与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 不算教学,个人的记录 sdf的格式跟urdf有所不同,必须是完整的一个包括,比如< pose></ pose>这样前一个后一个,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 非聚簇索引聚簇索引的优缺点非聚簇索引的优缺点 创建索引常见索引分为:主键索引InnoDB主键索引的生成过程(1)初始化…...
计算机网络高频(三)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 用户端 在如今这个快节奏的时代中,个人和组织的成长往往依赖于清晰、明确且意义深远的目标。然而,如何设定…...
HTTP 1.0和2.0 有什么区别?
HTTP 1.0和HTTP 2.0是互联网中用于数据传输的重要协议,两者在功能和性能上有显著差异。 以下是它们的主要区别: HTTP 1.0 的特点: 单一连接:每个请求需要独立连接,导致高延迟和资源浪费。文本传输:使用文…...
部署高可用PostgreSQL14集群
目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群(14版本)&…...
JavaScript 对事件的反应机制
JavaScript 对事件的反应机制 JavaScript 对事件的反应机制是网页实现用户交互的核心,主要通过事件监听与处理函数实现对用户行为的响应。以下是关键要点解析: 一、事件机制基础 1. 事件的定义 事件是用户或浏览器在页面上的动作(如点击、…...
Vue3中keep-alive缓存组件应用场景。
文章目录 一、KeepAlive是什么?二、基本使用1.例子2.keep-alive使用 三、其他属性3.1 包含/排除3.2 最大缓存实例数3.3 缓存实例的生命周期 总结 一、KeepAlive是什么? 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例…...
Pythonload JSON文件需要手动关闭吗?
在Python中使用 json 模块加载JSON文件时,通常不需要手动关闭文件。 例如,使用以下方式加载JSON文件: import json with open(data.json, r) as f: data json.load(f) 在上述代码中,使用 with 语句打开文件,它会在代码…...
SCI论文阅读指令(特征工程)
下面是一个SCI论文阅读特征工程V3.0,把指令输入大模型中,并上传PDF论文,就可以帮你快速阅读论文。 优先推荐kimi,当然DeepSeek、QwQ-32B等大语言模型也可以。测试了一下总结的还不错,很详细。 请仔细并深入地阅读所提…...
CosyVoice2在Windows系统上本地部署的详细步骤
CosyVoice2在Windows系统上本地部署的详细步骤: 下载源码并初始化: 确保你的设备上安装了Git。打开命令提示符(cmd),执行以下命令来克隆仓库: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是华为开发的一款用于海思芯片设备的刷机和调试工具,可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍: 功能用途 固件烧录:这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…...
探秘 C++ 双星系统模型:实现快速值切换
在软件开发的世界里,有时我们会遇到需要频繁在两个值之间进行切换的场景。为了高效地处理这类情况,我们可以设计一个专门的类来实现这个功能。今天,我们就来详细介绍一个用 C 实现的双星系统模型类 Turner,它能够帮助我们轻松地在…...
AI 生成内容(AIGC):从文本到视频的完整流程
近年来,AI 生成内容(AIGC, AI-Generated Content) 迅速发展,从文本、图片到音频、视频,AI 在创意内容生成方面展现出了惊人的能力。AIGC 不仅提升了内容创作效率,还降低了成本,使得普通用户也能…...
使用VS2022编译CEF
前提 选择编译的版本 CEF自动编译,在这里可以看到最新的稳定版和Beta版。 从这里得出,最新的稳定版是134.0.6998.118,对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…...
WebMvcConfigurer 的 addResourceLocations
在 Spring Boot 的 addResourceLocations 方法中,file: 是一个 URL 前缀,用于指示资源的位置是本地文件系统路径。以下是详细解释: 一、file: 的作用 file: 是 Java 中用于表示本地文件系统的 URL 前缀。它告诉 Spring Boot,资源…...
Pytorch学习笔记(八)Learn the Basics - Save and Load the Model
这篇博客瞄准的是 pytorch 官方教程中 Learn the Basics 章节的 Save and Load the Model 部分。 官网链接: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的响应压缩功能基于智能协商机制,需同时满足以下条件方可触发: 客户端支持:请求头包含Accept-Encoding: gzip/deflate数据量阈值:响应体大小超过预设值(默认2KB&…...
常考计算机操作系统面试习题(三上)
目录 1. 为何要引入与设备的无关性?如何实现设备的独立性? 2. 页面置换先进先出算法 3. 页面置换先进先出算法,4个页框 4. 进程优先级调度算法 5. 短作业优先调度策略 6. 平均内存访问时间计算 7. 页式存储和段式存储的物理地址计算 …...
MATLAB 绘制空间分布图 方法总结
方法一:用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)★
命令模式(Command Pattern) 如果任务有多个复杂的操作,可以使用命令模式将任务的操作封装为命令对象。这些命令对象可以在需要时按顺序执行,方便管理任务执行的逻辑和回滚操作。 示例: 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部署 (一)简介 (二)部署 (三)参数 (四)错误问题 (五)Xinference配置Text-embedding模型 (六)Xinference配…...
