ROS+Gazebo仿真学习记录1:创建机器人URDF模型

本章的源码和教程来源:《ROS机器人开发实践》

下面是注释的urdf代码,学起来更方便,对小白更友好。

注意:以下代码请只用来学习,要用的话直接拿书上提供的源码(别问为什么,都是用头发铺好的路,照做就是)。自己写的话千万注意urdf的格式

<?xml version="1.0"?>

<!-- 定义一个机器人模型,名称是mrobot_chassis -->
<robot name="mrobot_chassis">

    <!-- 描述底盘link,visual标签用来定义底盘的外观属性,在显示和仿真中,rviz或Gazebo会按照这里的描述将机器人模型呈现出来。 -->
    <link name="base_link">
        <visual>
            <!-- origin声明这个底盘在三维空间内的坐标系和旋转姿态 -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <!-- cylinder标签定义圆柱的半径和高 -->
                <cylinder radius="0.13" length="0.005"/>
            </geometry>
            <!-- material声明底盘圆柱在空间内的三维坐标位置和旋转姿态 -->
            <material name="yellow">
                <!-- 这里面的color是黄色的RGBA值 -->
                <color rgba="1.0 0.4 0.0 1.0"/>
            </material>
        </visual>
    </link>

    <!-- 定义第一个关节joint,用来连接机器人底盘和左边驱动电机 -->
    <!-- joint的类型是fixed类型,这种类型的joint是固定的,不允许关节发生运动 -->
    <joint name="base_left_motor_joint" type="fixed">
        <!-- origin定义了joint的起点,将起点设置在需要安装电机的底盘位置,具体看下面的重点1 -->
        <origin xyz="-0.055 0.075 0.0" rpy="0.0 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="left_motor"/>
    </joint>

    <!-- 描述左侧电机的模型 -->
    <link name="left_motor">
        <visual>
            <!-- 
            重点1:
            电机的的坐标位置是相对于joint计算的。
            在上面的name为"base_left_motor_joint"的joint的位置坐标设置中,
            已经将joint放置到了安装电机的底盘位置,所以在电机模型的坐标设置中,
            不需要位置偏移,放置到坐标(0,0,0)即可。
            由于圆柱体默认是垂直地面创建的,需要把圆柱体围绕x轴旋转90°,
            才能称为电机的模样。
            -->
            <!-- 定义起点位置 -->
            <origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
            <geometry>
                <!-- 电机外观抽象成圆柱体,半径为0.02m,高为0.08m -->
                <cylinder radius="0.02" length="0.08"/>
            </geometry>
            <!-- 定义外观颜色 -->
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <!-- 定义电机和轮子之间的joint。joint的类型是continuous型,可以围绕一个轴进行旋转,适合轮子的这种模型 -->
    <joint name="left_wheel_joint" type="continuous">
        <!-- 起点设置到安装轮子的位置 -->
        <origin xyz="0.0 0.0485 0.0" rpy="0.0 0.0 0.0"/>
        <parent link="left_motor"/>
        <child link="left_wheel_link"/>
        <!-- axis定义joint的旋转轴是正y轴,轮子在运动时就会围绕y轴旋转 -->
        <axis xyz="0.0 1 0.0"/>
    </joint>

    <!-- 左轮子 -->
    <link name="left_wheel_link">
        <visual>
            <!-- 旋转90° -->
            <origin xyz="0.0 0.0 0.0"rpy="1.5707 0.0 0.0"/>
            <geometry>
                <cylinder radius="0.033" length="0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <!-- 右边的关节,同上 -->
    <joint name="base_right_motor_joint" type="fixed">
        <!-- 右边电机的位置 -->
        <origin xyz="-0.055 -0.075 0.0" rpy="0.0 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="right_motor"/>
    </joint>

    <!-- 右边的电机 -->
    <link name="right_motor">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
            <geometry>
                <cylinder radius="0.02" length="0.08"/>
            </geometry>
            <material name="gray">
                <color rgba="0.75 0.75 0.75 1"/>
            </material>
        </visual>
    </link>

    <!-- 右边点击和轮子之间的关节 -->
    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0.0 -0.0485 0.0" rpy="0.0 0.0 0.0"/>
        <parent link="right_motor"/>
        <child link="right_wheel_link"/>
        <axis xyz="0.0 1 0.0"/>
    </joint>

    <!-- 右边轮子 -->
    <link name="right_wheel_link">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
            <geometry>
                <cylinder radius="0.033" length="0.017"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <!-- 前轮关节 -->
    <joint name="front_castor_joint" type="fixed">
        <origin xyz="0.1135 0.0 -0.0165" rpy="0.0 0.0 0.0"/>
        <parent link="base_link"/>
        <child link="front_castor_link"/>
        <!-- 前轮绕y轴转动 -->
        <axis xyz="0.0 1 0.0"/>
    </joint>

    <!-- 前轮 -->
    <link name="front_castor_link">
        <visual>
            <origin xyz="0 0.0 0.0" rpy="1.5707 0.0 0.0"/>
            <geometry>
                <!-- 前轮是球形的 -->
                <sphere radius="0.0165"/>
            </geometry>
            <material name="black">
                <color rgba="0.0 0.0 0.0 0.95"/>
            </material>
        </visual>
    </link>
</robot>

接下来是launch文件

<launch>
    <param name="robot_description" textfile="$(find mrobot_description)/urdf/mrobot_chassis.urdf" />

    <!-- 设置GUI参数,显示关节控制插件 -->
    <param name="use_gui" value="true"/>

    <!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
    <!-- pkg定义节点所在的功能包名称,type定义节点的可执行文件,name定义节点运行的名称 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher">
    </node>   
    <!-- 运行robot_state_publisher节点,发布TF-->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
    </node>

    <!-- 运行rviz可视化界面 -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find mrobot_description)/config/mrobot_urdf.rviz" required="true">
    </node>


</launch>

上面两个代码文件分别放到mrobot_description功能包下的urdf文件夹和launch文件夹中

然后运行

roslaunch mrobot_description display_mrobot_chassis_urdf.launch

rviz出现以下错误的话

直接将Global Options 下面的 Fixed Frame 中的map改为base_link,就可以了

然后发现没有机器人模型,点击左下角的Add,添加下面的RobotModel,可以看到模型,添加TF,可以看到坐标轴。

解决方案来源:https://blog.csdn.net/cillian_bao/article/details/116205396

总算成功了,我的头发啊,哎。

此时应响起BGM,怕什么真理无穷,进一寸有一寸的欢喜。

如果解决了您的问题,可以帮忙点个赞嘛~有能力的打赏个鸡腿钱就更好了

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Besproma_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值