ROS漫漫长路(一)——Gazebo中机器人圆柱,球,长方体惯性矩阵推导与代码实现

ROS漫漫长路(一)——Gazebo中机器人圆柱,球,长方体惯性矩阵推导与代码实现


前言

ROS中,要想将urdf文件实现的机器人,放到gazebo中仿真,需要添加collision碰撞参数和inertial参数,其中collision参数大多情况下就直接和机器人的形状一致,而inertial则为机器人的惯性矩阵参数,基本构造机器人,常用的形状即为圆柱,球和长方体,即使是不规则的形状,推导方式其实也是一样的。

一、公式推导

 

 

 

(更正:上图w和l的标注对换 )

 一、代码实现

ros中这部分的代码实现,其实直接使用官方给的就好了,在编写inertial参数时,分别调用sphere_inertial_matrix, cylinder_inertial_matrix, Box_inertial_matrix宏即可

 <xacro:Box_inertial_matrix m="" w="" l="" h=""/>   调用长方体
 <xacro:sphere_inertial_matrix m="" r="" /> 调用球
 <xacro:cylinder_inertial_matrix m="" r="" h="" /> 调用圆柱体

 示例

假如我要创建一个圆柱体的机器人

第一步把这个官方的惯性矩阵写道一个xacro文件中

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

 第二步,在编写机器人xacro文件时,调用宏

 <link name="base_link">
      <visual>
        <geometry>
          <cylinder radius="0.1" length="0.05" />
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <material name="yellow">
          <color rgba="0.5 0.3 0.0 0.5" />
        </material>
      </visual>
      <collision>
        <geometry>
          <cylinder radius="0.1" length="0.05" />
        </geometry>
        <origin xyz="0 0 0" rpy="0 0 0" />
      </collision>
      <!--    调用宏来创建惯性矩阵    -->
      <xacro:cylinder_inertial_matrix m="1" r="0.1" h="0.05" />

    </link>

  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在ROS实现语音控制Gazebo机器人,需要进行以下步骤: 1. 安装必要的ROS包和依赖项,例如ROS Kinetic和gazebo_ros_pkgs。 2. 创建ROS程序包和ROS节点,其ROS节点可以接收语音指令并控制Gazebo机器人。 3. 编写ROS节点的代码,其包括使用语音识别库(如pocketsphinx)来解析语音指令,以及使用ROSGazebo API来控制机器人。 以下是一个简单的示例代码,可以让机器人根据语音指令移动: ```python import rospy from geometry_msgs.msg import Twist def callback(data): # 根据语音指令控制机器人移动 if data.data == 'forward': twist.linear.x = 0.5 elif data.data == 'backward': twist.linear.x = -0.5 elif data.data == 'left': twist.angular.z = 0.5 elif data.data == 'right': twist.angular.z = -0.5 def listener(): # 初始化ROS节点 rospy.init_node('voice_control') # 创建Twist消息,用于控制机器人移动 twist = Twist() # 创建ROS订阅者,用于接收语音指令 rospy.Subscriber('voice_command', String, callback) # 创建ROS发布者,用于发布机器人移动控制指令 pub = rospy.Publisher('cmd_vel', Twist, queue_size=10) # 循环发布机器人移动控制指令 rate = rospy.Rate(10) while not rospy.is_shutdown(): pub.publish(twist) rate.sleep() if __name__ == '__main__': listener() ``` 在这个例子,我们首先创建了一个ROS节点,并初始化了Twist消息,用于控制机器人移动。然后,我们创建了一个ROS订阅者,用于接收语音指令,并在回调函数解析指令并设置机器人的移动速度。最后,我们创建了一个ROS发布者,用于发布机器人移动控制指令,并在循环不断地发布指令以控制机器人移动。 请注意,这只是一个简单的示例代码,实际的语音控制系统可能需要更复杂的代码来处理更多的语音指令和机器人动作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzzzzzzm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值