在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落:修改sdf、urdf模型

简介: 在使用ros做仿真实验时,有时会需要在空间中添加一个模型文件,使之悬浮在空间中的某个坐标,但是往往会因为重力原因,模型会直接掉落在地上

一、问题描述:

在使用ros做仿真实验时,有时会需要在空间中添加一个模型文件,使之悬浮在空间中的某个坐标,但是往往会因为重力原因,模型会直接掉落在地上

二、解决方法:

修改模型文件,禁用重力标签

<gravity>1</gravity>

2.1 SDF模型:

找到你的模型文件目录,如果你的模型文件是.sdf格式,找到模型代码的重力标签部分

<gravity>0</gravity>

将其中的数字1改为数字0,达到禁用重力的目的


这将阻止Gazebo对该模型施加重力,使其悬浮在半空中。其他的惯性(inertial)和碰撞(collision)等属性保持不变,只需修改标签即可。保存文件后,重新加载模型到Gazebo中,它将悬浮在半空中而不会受到重力的影响。

保存文件后重新在Gazebo中添加模型,就可以悬浮在半空中了;

2.2 URDF模型:

找到你的模型文件目录,如果你的模型文件是.urdf格式,要让模型悬浮在半空中而不受重力影响,你可以将模型的惯性属性适当设置为零。

在URDF文件中,惯性属性可以在每个链接(link)的元素中设置。确保在你想要悬浮的链接中将惯性属性设置为合适的零值

一个例子如下:

<link name="floating_link">
  <inertial>
    <mass value="0.0"/>
    <!-- Set all inertia values to zero -->
    <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
  </inertial>
  <!-- Other visual, collision, and other elements -->
</link>

通过将mass值设置为0,以及设置inertia的所有值为0,你可以让该链接悬浮在半空中,并且不受重力影响。需要注意的是,如果该链接是连接到其他链接的,你可能还需要检查其父链接或子链接的属性,确保整个模型都符合你的要求。


同样地,你也可以根据需要进行一些调整,以达到适合你模型的平衡状态。完成修改后,重新加载URDF文件到ROS和Gazebo中,你的模型应该会悬浮在半空中而不会受到重力影响。

2.3 测试添加模型

使用程序在坐标(1,1,1)处添加模型,可以看到能够悬浮在此坐标系下

三、通过Python程序在Gazebo中添加模型

这里需要注意的一点是,在将模型文件的重力标签禁用之后,模型处于零重力状态,想象一下宇航员在太空空间站中的状态,以及结合中学物理知识,只要有一个初速度,他就会进行匀速直线运动,且很难停下。

所以如果用鼠标直接添加模型的话,大概率是有一个向上的初速度的,此时就建议使用额外的脚本命令来添加模型,这里我使用的是Python程序

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os
import rospy
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import DeleteModel, SpawnModel
from std_msgs.msg import Header
from geometry_msgs.msg import Pose, Point
# 初始化ROS节点
rospy.init_node('spawn_aruco_cubo_hover', anonymous=True)
# 定义生成模型的函数
def spawn_aruco_cubo_hover():
    model_name = "aruco_cubo_hover"
    model_path = "/home/sjh/project/Tiago_ws/src/pal_gazebo_worlds/models/aruco_cube_hover/aruco_cube_hover.sdf"
    initial_pose = Pose(position=Point(x=1, y=1, z=1))
    # 从文件加载模型
    with open(model_path, "r") as f:
        model_xml = f.read()
    # 调用Gazebo的SpawnModel服务
    spawn_model = rospy.ServiceProxy('/gazebo/spawn_sdf_model', SpawnModel)
    resp_sdf = spawn_model(model_name, model_xml, "", initial_pose, "world")
    if resp_sdf.success:
        rospy.loginfo("模型 '{}' 生成成功。".format(model_name))
    else:
        rospy.logerr("模型 '{}' 生成失败。".format(model_name))
# 调用生成模型的函数
if __name__ == '__main__':
    try:
        spawn_aruco_cubo_hover()
    except rospy.ROSInterruptException:
        pass


在使用程序时,注意将spawn_aruco_cubo_hover函数中的模型路径和指定坐标修改为你需要的

def spawn_aruco_cubo_hover():
    model_name = "你的模型的名称"
    model_path = "你的模型的路径"
    initial_pose = Pose(position=Point(x=1, y=1, z=1)) # xyz值就是指定坐标位置
目录
相关文章
cesium添加实体不被地形遮挡的参数设置
disableDepthTestDistance:指定从相机到禁用深度测试的距离,关于深度测试我们将在后面的文章中介绍到,由于深度测试的存在,我们的对象很多时候会被地形挡住,如下:
1969 0
cesium添加实体不被地形遮挡的参数设置
|
5月前
|
图形学
【unity小技巧】实现FPS武器的瞄准放大效果(UGUI实现反向遮罩,全屏遮挡,局部镂空效果)
【unity小技巧】实现FPS武器的瞄准放大效果(UGUI实现反向遮罩,全屏遮挡,局部镂空效果)
80 1
|
5月前
|
图形学
【unity小技巧】unity3D寻路指示轨迹预测
【unity小技巧】unity3D寻路指示轨迹预测
72 0
在Gazebo中添加悬浮模型后,利用键盘控制其移动方法
今天讲一下如何通过键盘来控制其移动:监听键盘输入并根据按键调整模型的位置,然后通过调用set_model_state函数来更新模型在Gazebo中的状态
391 0
|
传感器 编解码
在gazebo中进行相机标定
在gazebo中进行相机标定
在gazebo中进行相机标定
|
C++ Python
C++ VTK鼠标网格表面绘制曲线
C++ VTK鼠标网格表面绘制曲线
438 0
C++ VTK鼠标网格表面绘制曲线
|
Ubuntu 机器人 定位技术
ros_gazebo/turtlebot3 室内仿真导航,提取camera/image和pose位姿真值,并将topic 时间同步对齐,最后制作成kitti 格式的数据集。
ros_gazebo/turtlebot3 室内仿真导航,提取camera/image和pose位姿真值,并将topic 时间同步对齐,最后制作成kitti 格式的数据集。
472 0
|
传感器 算法 机器人
获取机器人turtlebot3 在gazebo 中仿真导航时的位姿真值
获取机器人turtlebot3 在gazebo 中仿真导航时的位姿真值
463 0
【Unity3D--自由观察模型】模型自动旋转+触屏旋转和缩放
展示3D模型,同时实现模型自动旋转和触屏旋转和缩放
382 0
探究--gazebo里 关节是如何动起来的____通过节点发布topic让关节转动
探究--gazebo里 关节是如何动起来的____通过节点发布topic让关节转动
探究--gazebo里 关节是如何动起来的____通过节点发布topic让关节转动