[英]Gazebo model does not stand
Apologies for a very long post. 很长的帖子很抱歉。 I created the following xacro file, when I load in gazebo using the following launch file, the robot does not stand straight and falls down.
我创建了以下xacro文件,当使用以下启动文件加载到凉亭中时,机器人无法直立并跌落。 I tried with different values of mass for different links, but no luck.
对于不同的链接,我尝试使用不同的质量值,但是没有运气。 It looks like I am missing something, can anyone help?
好像我缺少什么,有人可以帮忙吗?
<?xml version="1.0" ?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"
xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
name="rosbot_v1">
<!--Formula for calculation of mass moment of inertia of a cylinder
is given by the following formula:
Reference: http://www.amesweb.info/SectionalPropertiesTabs/Mass-Moment-of-Inertia-Cylinder.aspx
Mass moment of inertia about x axis Ix Ix= (m/12) * (3r^2+h^2)
Mass moment of inertia about y axis Iy Iy= (m/12) * (3r^2+h^2)
Mass moment of inertia about z axis Iz Iz= (mr2)/2-->
<xacro:macro name="inertial_matrix_cylinder" params="mass arm_radius arm_length">
<inertial>
<mass value="${mass}" />
<inertia ixx="${mass*(3*arm_radius*arm_radius+arm_length*arm_length)/12}"
ixy = "0" ixz = "0"
iyy="${mass*(3*arm_radius*arm_radius+arm_length*arm_length)/12}" iyz = "0"
izz="${mass*arm_radius*arm_radius/2}" />
</inertial>
</xacro:macro>
<!--Physical attributes definition for base box-->
<xacro:property name="base_box_length" value="1" />
<xacro:property name="base_box_width" value="1" />
<xacro:property name="base_box_height" value="0.6" />
<xacro:property name="base_box_mass" value="4" />
<!--Physical attributes definition for the swivel arm-->
<xacro:property name="swivel_arm_length" value="0.2" />
<xacro:property name="swivel_arm_radius" value="0.2" />
<xacro:property name="swivel_arm_mass" value="1" />
<!--Physical attributes definition for the arms-->
<xacro:property name="arm_length" value="1" />
<xacro:property name="arm_radius" value="0.1" />
<xacro:property name="arm_mass" value="0.1" />
<!--Physical attributes definition for gripper box-->
<xacro:property name="gripper_box_length" value="0.5" />
<xacro:property name="gripper_box_width" value="0.4" />
<xacro:property name="gripper_box_height" value="0.2" />
<xacro:property name="gripper_box_mass" value="0.01" />
<!--Physical attributes definition for gripper fingers-->
<xacro:property name="gripper_finger_length" value="0.12" />
<xacro:property name="gripper_finger_width" value="0.4" />
<xacro:property name="gripper_finger_height" value="0.12" />
<xacro:property name="gripper_finger_mass" value="0.001" />
<!--Formula for calculation of mass moment of inertia of a cuboid
is given by the following formula: a=x(length); b=y(width)
Mass moment of inertia about x axis Ix Ix= (M/12) * a^2
Mass moment of inertia about y axis Iy Iy= (M/12) * b^2
Mass moment of inertia about z axis Iz Iz= (1/12)*M*(a^2+b^2)-->
<xacro:macro name="inertial_matrix_cuboid" params="mass box_length box_width">
<inertial>
<mass value="${mass}" />
<inertia ixx="${mass/12*(box_length*box_length)}"
ixy = "0" ixz = "0"
iyy="${mass/12*(box_width*box_width)}" iyz = "0"
izz="${mass/12*(box_length*box_length + box_width*box_width)}" />
</inertial>
</xacro:macro>
<material name="blue">
<color rgba="0 0 0.8 1"/>
</material>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
<material name="cyan">
<color rgba="0 1 1 1"/>
</material>
<!-- world link -->
<link name="base_link"/>
<link name="rosbot_base">
<xacro:inertial_matrix_cuboid mass="${base_box_mass}" box_length="${base_box_length}" box_width="${base_box_width}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="${base_box_length} ${base_box_width} ${base_box_height}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="${base_box_length} ${base_box_width} ${base_box_height}"/>
</geometry>
<material name="blue"/>
</visual>
</link>
<!-- base_link and its fixed joint -->
<joint name="joint_fix" type="fixed">
<parent link="base_link"/>
<child link="rosbot_base"/>
</joint>
<!-- A swiveling base on which next arm will sit -->
<link name="rosbot_swivel_base">
<xacro:inertial_matrix_cylinder mass="${swivel_arm_mass}" arm_length="${swivel_arm_length}" arm_radius="${swivel_arm_radius}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="0 0 ${swivel_arm_length/2}"/>
<geometry>
<cylinder length="${swivel_arm_length}" radius="${swivel_arm_radius}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="0 0 ${swivel_arm_length/2}"/>
<geometry>
<cylinder length="${swivel_arm_length}" radius="${swivel_arm_radius}"/>
</geometry>
<material name="white"/>
</visual>
</link>
<!-- The joint between swivel and base needs to be flush on the top face of rosbot_base -->
<joint name="rosbot_base_swivel_joint" type="revolute">
<parent link="rosbot_base"/>
<child link="rosbot_swivel_base"/>
<origin rpy="0 0 0" xyz="0 0 ${base_box_height/2}"/>
<axis xyz="0 0 1"/>
<limit effort="100" lower="-1.57" upper="1.57" velocity="100"/>
</joint>
<!-- A moving/manipulating arm1 -->
<link name="rosbot_arm1">
<xacro:inertial_matrix_cylinder mass="${arm_mass}" arm_length="${arm_length}" arm_radius="${arm_radius}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="0 0 ${arm_length/2}"/>
<geometry>
<cylinder length="${arm_length}" radius="${arm_radius}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="0 0 ${arm_length/2}"/>
<geometry>
<cylinder length="${arm_length}" radius="${arm_radius}"/>
</geometry>
<material name="blue"/>
</visual>
</link>
<!-- The joint between swivel and arm1 needs to be at the height of swivel link -->
<joint name="rosbot_swivel_arm1_joint" type="revolute">
<parent link="rosbot_swivel_base"/>
<child link="rosbot_arm1"/>
<origin rpy="0 0 0" xyz="0 0 ${swivel_arm_length}"/>
<axis xyz="1 0 0"/>
<limit effort="100" lower="-1.57" upper="1.57" velocity="100"/>
</joint>
<!-- A moving/manipulating arm2 -->
<link name="rosbot_arm2">
<xacro:inertial_matrix_cylinder mass="${arm_mass}" arm_length="${arm_length}" arm_radius="${arm_radius}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="0 0 ${arm_length/2}"/>
<geometry>
<cylinder length="${arm_length}" radius="${arm_radius}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="0 0 ${arm_length/2}"/>
<geometry>
<cylinder length="${arm_length}" radius="${arm_radius}"/>
</geometry>
<material name="blue"/>
</visual>
</link>
<!-- The joint between arm1 and arm2 needs to be at height of arm1 -->
<joint name="rosbot_arm1_arm2_joint" type="revolute">
<parent link="rosbot_arm1"/>
<child link="rosbot_arm2"/>
<origin rpy="0 0 0" xyz="0 0 ${arm_length}"/>
<axis xyz="1 0 0"/>
<limit effort="100" lower="-1.57" upper="1.57" velocity="100"/>
</joint>
<!-- A gripper box, which holds the gripper joints -->
<link name="rosbot_gripper_box">
<xacro:inertial_matrix_cuboid mass="${gripper_box_mass}" box_length="${gripper_box_length}" box_width="${gripper_box_width}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="0 0 ${gripper_box_height/2}"/>
<geometry>
<box size="${gripper_box_length} ${gripper_box_width} ${gripper_box_height}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="0 0 ${gripper_box_height/2}"/>
<geometry>
<box size="${gripper_box_length} ${gripper_box_width} ${gripper_box_height}"/>
</geometry>
<material name="cyan"/>
</visual>
</link>
<!-- The joint between arm2 and gripper needs to be at height of arm2 -->
<joint name="rosbot_arm2_gripper_joint" type="revolute">
<parent link="rosbot_arm2"/>
<child link="rosbot_gripper_box"/>
<origin rpy="0 0 0" xyz="0 0 ${arm_length}"/>
<axis xyz="0 0 1"/>
<limit effort="100" lower="-1.57" upper="1.57" velocity="100"/>
</joint>
<!-- The left gripper -->
<link name="rosbot_lgripper">
<xacro:inertial_matrix_cuboid mass="${gripper_finger_mass}" box_length="${gripper_finger_length}" box_width="${gripper_finger_width}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="-0.0 0.20 ${gripper_finger_height/2}"/>
<geometry>
<box size="${gripper_finger_length} ${gripper_finger_width} ${gripper_finger_height}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="-0.0 0.20 ${gripper_finger_height/2}"/>
<geometry>
<box size="${gripper_finger_length} ${gripper_finger_width} ${gripper_finger_height}"/>
</geometry>
<material name="green"/>
</visual>
</link>
<!-- The joint between gripper box and gripper needs to be at origin/slightly higher than origin of gripper box -->
<joint name="rosbot_lgripper_joint" type="prismatic">
<parent link="rosbot_gripper_box"/>
<child link="rosbot_lgripper"/>
<origin rpy="0 0 0" xyz="-0.2 0.2 0.02"/>
<axis xyz="1 0 0"/>
<limit effort="100" lower="0" upper="0.14" velocity="100"/>
</joint>
<!-- The right gripper -->
<link name="rosbot_rgripper">
<xacro:inertial_matrix_cuboid mass="${gripper_finger_mass}" box_length="${gripper_finger_length}" box_width="${gripper_finger_width}"/>
<collision name="rosbot_collision">
<origin rpy="0 0 0" xyz="-0.0 0.20 ${gripper_finger_height/2}"/>
<geometry>
<box size="${gripper_finger_length} ${gripper_finger_width} ${gripper_finger_height}"/>
</geometry>
</collision>
<visual name="rosbot_visual">
<origin rpy="0 0 0" xyz="-0.0 0.20 ${gripper_finger_height/2}"/>
<geometry>
<box size="${gripper_finger_length} ${gripper_finger_width} ${gripper_finger_height}"/>
</geometry>
<material name="green"/>
</visual>
</link>
<!-- The joint between gripper box and gripper needs to be at origin or slightly higher than origin of gripper box -->
<joint name="rosbot_rgripper_joint" type="prismatic">
<parent link="rosbot_gripper_box"/>
<child link="rosbot_rgripper"/>
<origin rpy="0 0 0" xyz="0.2 0.2 0.02"/>
<axis xyz="1 0 0"/>
<limit effort="100" lower="-0.14" upper="0" velocity="100"/>
</joint>
</robot>
When I edit the model in Gazebo and then toggle the static flag, it seems to be stable. 当我在凉亭中编辑模型然后切换静态标志时,它似乎很稳定。
I could solve this issue by adding the friction and damping elements to the URDF file. 我可以通过将摩擦和阻尼元素添加到URDF文件中来解决此问题。
<xacro:property name="damping_value" value="10" />
<xacro:property name="friction_value" value="0.1" />
Sample usage of the property in joint is given below, 联合中该属性的用法示例如下:
<!-- The joint between swivel and base needs to be flush on the top face of rosbot_base -->
<joint name="rosbot_base_swivel_joint" type="revolute">
<parent link="rosbot_base"/>
<child link="rosbot_swivel_base"/>
<origin rpy="0 0 0" xyz="0 0 ${base_box_height/2}"/>
<axis xyz="0 0 1"/>
<limit effort="100" lower="-1.57" upper="1.57" velocity="100"/>
<dynamics damping="${damping_value}" friction="${friction_value}"/>
</joint>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.