云计算百科
云计算领域专业知识百科平台

Linux:物理仿真与 Gazebo 世界

今天的主题是:给机器人赋予“物理肉体”。

在 Rviz 里,你的机器人只是个“全息投影”,好看但不能打。

为了让它能进 Gazebo(那个有重力、有碰撞的真实世界),我们必须给它加上两样东西:

  • 碰撞体积 (Collision):穿上“防弹衣”,让它能撞到东西,而不是穿墙而过。

  • 惯性矩阵 (Inertial):告诉电脑它有多重 (Mass) 以及重心在哪。


  • 第一步:准备“数学公式” (Inertial Macros)

    (日常提醒要在存放Linux的地盘(cd ~/ros2_ws))

    给机器人算惯性矩阵是很痛苦的

    作为懒人工程师,我们当然要用 Xacro 宏 来自动算!

    请打开你的 Xacro 文件:

    Bash

    nano src/my_robot_description/urdf/my_robot.urdf.xacro

    操作任务:

    请把下面这段“万能公式”复制粘贴到 变量定义 (property) 的下面,但在 base_link 的上面。

    (这段代码定义了球体、方块、圆柱体的惯性计算公式,以后直接调用就行)

    XML

    <xacro:macro name="inertial_sphere" params="mass radius">
    <inertial>
    <mass value="${mass}"/>
    <inertia ixx="${(2/5) * mass * (radius*radius)}" ixy="0.0" ixz="0.0"
    iyy="${(2/5) * mass * (radius*radius)}" iyz="0.0"
    izz="${(2/5) * mass * (radius*radius)}"/>
    </inertial>
    </xacro:macro>

    <xacro:macro name="inertial_box" params="mass x y z">
    <inertial>
    <mass value="${mass}"/>
    <inertia ixx="${(1/12) * mass * (y*y+z*z)}" ixy="0.0" ixz="0.0"
    iyy="${(1/12) * mass * (x*x+z*z)}" iyz="0.0"
    izz="${(1/12) * mass * (x*x+y*y)}"/>
    </inertial>
    </xacro:macro>

    <xacro:macro name="inertial_cylinder" params="mass length radius">
    <inertial>
    <mass value="${mass}"/>
    <inertia ixx="${(1/12) * mass * (3*radius*radius + length*length)}" ixy="0.0" ixz="0.0"
    iyy="${(1/12) * mass * (3*radius*radius + length*length)}" iyz="0.0"
    izz="${(1/2) * mass * (radius*radius)}"/>
    </inertial>
    </xacro:macro>
    ```

    粘贴好后,保存退出,确保没有报错。

    ### 第二步:改造身体 (`base_link`)

    现在我们要给蓝色的车身加上“防弹衣”和“体重”。

    再次打开文件,找到 `<link name="base_link">` 部分。

    你需要做两件事:
    1. **加 Collision (防弹衣)**:通常形状和 Visual (外观) 一样。
    2. **加 Inertial (体重)**:调用刚才写的宏。

    **请把你的 `base_link` 修改成下面这样(注意看新增的部分):**

    ```xml
    <link name="base_link">
    <visual>
    <geometry>
    <box size="${base_length} ${base_width} ${base_height}"/>
    </geometry>
    <material name="blue">
    <color rgba="0 0 1 1"/>
    </material>
    </visual>

    <collision>
    <geometry>
    <box size="${base_length} ${base_width} ${base_height}"/>
    </geometry>
    </collision>

    <xacro:inertial_box mass="1.0" x="${base_length}" y="${base_width}" z="${base_height}"/>
    </link>


    第三步:改造轮子 (setup_wheel 宏)

    轮子也要有物理属性,不然它支撑不住车身。

    找到你的 setup_wheel 宏定义,在 <link name="${prefix}_wheel_link"> 里面修改。

    修改后的宏应该是这样的:

    XML

    <xacro:macro name="setup_wheel" params="prefix y_reflect">
    <xacro:property name="z_offset" value="-0.05"/>
    <link name="${prefix}_wheel_link">
    <visual>
    <geometry>
    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
    </geometry>
    <material name="grey">
    <color rgba="0.5 0.5 0.5 1"/>
    </material>
    </visual>

    <collision>
    <geometry>
    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
    </geometry>
    </collision>

    <xacro:inertial_cylinder mass="0.1" length="${wheel_length}" radius="${wheel_radius}"/>
    </link>

    <joint name="base_to_${prefix}_wheel" type="continuous">
    … (保持原样) …
    </joint>
    </xacro:macro>


    第四步:改造万向轮 (caster_wheel_link)

    最后是那个小白球。

    找到 caster_wheel_link,修改如下:

    XML

    <link name="caster_wheel_link">
    <visual>
    <geometry>
    <sphere radius="0.05"/>
    </geometry>
    <material name="white">
    <color rgba="1 1 1 1"/>
    </material>
    </visual>

    <collision>
    <geometry>
    <sphere radius="0.05"/>
    </geometry>
    </collision>

    <xacro:inertial_sphere mass="0.1" radius="0.05"/>
    </link>


    🧪 阶段性检查

    改了这么多地方,一定要检查一下语法有没有写错(比如标签没闭合)。

  • 翻译一下:

    Bash

    xacro src/my_robot_description/urdf/my_robot.urdf.xacro > check.urdf

    (如果没有报错,说明 Xacro 语法通过!)

  • 如果报错例如报错在58行:    怎么快速定位第 58 行?

  • 在 Nano 编辑器里: 1. 按 **`Ctrl + _`** (有的键盘是 `Ctrl + Shift + -`,就是下划线那个键)。 2. 屏幕下方会提示 `Enter line number, column number:`。 3. 输入 **`58`** 然后回车。 4. 光标会直接跳到报错的地方。**看看光标上面是不是少了一个结束标签 `</…>`?**

  • 看一眼 Rviz(确保外观没变):

    Bash

    ros2 launch urdf_tutorial display.launch.py model:=$(pwd)/check.urdf

    (这一步 Rviz 里看起来应该完全没有变化。如果你能在 Rviz 里看到 "Collision Enabled" 的选项勾选上后出现了半透明的外壳,那就更好了,不过通常只要车还在就行)

  • 打开Collision Enabled 在 Rviz 左侧的显示面板(Displays)里:

  • 找到 RobotModel 这一项。

  • 点击它前面的小三角 ▶ 把它展开。

  • 在展开的列表里,找一个叫 Collision Enabled 的复选框。

  • 打勾 。

  •  

     

     

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux:物理仿真与 Gazebo 世界
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!