【创建urdf模型】

系列文章目录



前言

今日在使用机器人建图和定位的过程中发现没有模型和相关tf显示,真的很不好调试,为了在以后的工作中方便以后开展研发工作,也为了给机器人做标定工作,就写了一个urdf的模型文件,以下就是记录我写urdf模型文件的过程。


一、创建功能包

1、cd 到你的工作空间的src文件中;
2、使用命令catkin_create_pkg + [包名] + [urdf] + [xacro] ,其中urdf和xacro是依赖项
3、为了方便查看和调整我们的模型,我们需要创建launch文件夹和文件,创建config/rviz文件夹

二、创建具体urdf文件

1.创建总体调用文件

文件名为agv.xacro,创建在urdf/xacro文件夹下,其内容如下:

<!--set all-->
<robot name="agv_car" xmlns:xacro="http://wiki.ros.org/xacro" >
    <link name="map"/>
    <link name="odom"/>
    <joint name="odom_to_map" type="fixed">
        <parent link="map" />
        <child link="odom"/>
    </joint>
    <joint name="base_link_to_odom" type="fixed">
        <parent link="odom" />
        <child link="base_link"/>
    </joint>
    <xacro:include filename="car_base.xacro" />
    <!-- <xacro:include filename="car_cam.xacro" /> -->
    <xacro:include filename="car_laser.xacro" />
    <xacro:include filename="car_imu.xacro" />
</robot>

其中创建了一个静态的map和odom link,两个joint分别,描绘了odom到map,base_link到odom的关系,默认位置关系都为(0,0,0),rpy也为默认水平坐标系下。<xacro:include filename=“car_base.xacro” />这句话是调用car_base.xacro文件,这个文件的主要作用是描述机器人的形状,其中包含车体,驱动轮,万向轮和它们之间与base_link关系。<xacro:include filename=“car_laser.xacro” />这句语言就是调用激光雷达描述文件。<xacro:include filename=“car_imu.xacro” />这句话是调用imu描述文件。

2.车体描述文件car_base.xacro

	<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:property name="footprint_length"   value="0.63" /><!--footprint长度-->
    <xacro:property name="footprint_wide"   value="0.42" /><!--footprint宽度-->
    <xacro:property name="footprint_high"   value="0.3" /><!--footprint高度-->
    <xacro:property name="base_radius"   value="0.0" /><!--base_link半径-->
    <xacro:property name="base_lengh"   value="0.0" /><!--base_link高度-->
    <xacro:property name="robot_lidi" value="0.02"/><!--机器人离地高度-->
    <xacro:property name="leftwheel_radius"   value="0.072" /><!--左轮半径-->
    <xacro:property name="leftwheel_lengh"   value="0.05" /><!--左轮高度-->
    <xacro:property name="rightwheel_radius"   value="0.072" /><!--右轮半径-->
    <xacro:property name="rightwheel_lengh"   value="0.05" /><!--右轮高度-->
    <xacro:property name="wheel_between"   value="0.34" /><!--轮间距离 左边轮子中心到右边轮子中心距离-->
    <xacro:property name="front_support_wheel_radius"   value="0.035" /><!--前支撑轮半径-->
    <xacro:property name="front_support_wheel_lengh"   value="0.03" /><!--前支撑轮高度-->
    <xacro:property name="back_support_wheel_radius"   value="0.02" /><!--后支撑轮半径-->
    <xacro:property name="back_support_wheel_lengh"   value="0.02" /><!--后支撑轮高度-->
    <xacro:property name="PI"   value="3.1415927" />
    <!--  base_footprint  -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <box size="${footprint_length} ${footprint_wide} ${footprint_high}" />
            </geometry>
        </visual>
    </link>
    <!-- base_link -->
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_lengh}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="yellow">
                <color rgba="0 0 0 0" />
            </material>
        </visual>
    </link>
    <!-- base_footprint到base_link的tf关系 -->
    <joint name="base_footprint_to_base_link" type="fixed">
        <parent link="base_link" />
        <child link="base_footprint"/>
        <origin xyz="0 0 ${footprint_high/2+0.02}" />
    </joint>
    <!--左轮形状-->
    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="${leftwheel_radius}" length = "${leftwheel_lengh}"/>
            </geometry>
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0"/>
            </material>
        </visual>
    </link>
    <!--左轮位姿-->
    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 ${wheel_between/2} ${rightwheel_radius}" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>
    <!--右轮形状-->
    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="${rightwheel_radius}" length = "${rightwheel_lengh}"/>
            </geometry>
            <material name="black">
                <color rgba="0.0 0.0 0.0 1.0"/>
            </material>
        </visual>
    </link>
    <!--右轮位姿-->
    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 ${-wheel_between/2} ${rightwheel_radius}" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>
    <!--前万向轮-->
    <xacro:macro name="add_front_support_wheel"  params="name  flag">
        <link name="${name}_front_support_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${front_support_wheel_radius}" length="${front_support_wheel_lengh}" />
                </geometry>
                <origin xyz="0 0 0" rpy="${PI/2} 0 0" />
                <material name="black">
                    <color rgba="0.0 0.0 0.0 1.0" />
                </material>
            </visual>
        </link>

        <joint name="${name}_front_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_front_support_wheel" />
            <origin xyz="0.2 ${(footprint_wide/2-0.07)*flag} ${front_support_wheel_radius}" />
            <axis xyz="0 1 0" />
        </joint>
    </xacro:macro>
    <xacro:add_front_support_wheel   name="left"   flag="1" />
    <xacro:add_front_support_wheel  name="right"   flag="-1" />
    <!--后万向轮-->
    <xacro:macro name="add_back_support_wheel"  params="name  flag">
        <link name="${name}_back_support_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${back_support_wheel_radius}" length="${back_support_wheel_lengh}" />
                </geometry>
                <origin xyz="0 0 0" rpy="${PI/2} 0 0" />
                <material name="black">
                    <color rgba="0.0 0.0 0.0 1.0" />
                </material>
            </visual>
        </link>

        <joint name="${name}_back_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_back_support_wheel" />
            <origin xyz="-0.2 ${(footprint_wide/2-0.07)*flag} ${back_support_wheel_radius}" />
            <axis xyz="0 1 0" />
        </joint>
    </xacro:macro>
    <xacro:add_back_support_wheel   name="left"   flag="1" />
    <xacro:add_back_support_wheel  name="right"   flag="-1" />
</robot>

代码中基本的注释已经描述了一个完整的车体,其中有一个亮点就是参数单独提出来,这样方便以后修改车体信息,这个就是xacro与urdf的区别。

3.imu描述文件car_imu.xacro

<!--
    add imu
-->
<robot name="car_imu" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- the imu -->
    <xacro:property name="imu_length" value="0.03" /> <!-- length -->
    <xacro:property name="imu_wide" value="0.03" /> <!-- wide -->
	<xacro:property name="imu_high" value="0.01" /> <!-- wide -->
    <xacro:property name="imu_x" value="-0.192" /> <!-- x of installing -->
    <xacro:property name="imu_y" value="0.0" /> <!-- y of installing -->
    <xacro:property name="imu_z" value="${footprint_high + imu_length / 2+robot_lidi-0.02}" /> <!-- z -->

    <!-- link -->
    <link name="car_imu">
        <visual>
            <geometry>
				<box size="${imu_length} ${imu_wide} ${imu_high}"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <material name="white">
	            <color rgba="1.0 1.0 1.0 1.0"/>
            </material>
        </visual>
    </link>

    <joint name="imu2base_link" type="fixed">
        <parent link="base_link" />
        <child link="car_imu" />
        <origin xyz="${imu_x} ${imu_y} ${imu_z}" />
    </joint>
</robot>


这里跟车体描述文件差不多,也是形状、位置与base_link关系。

4.激光雷达描述文件car_laser.xacro

<!--
    add laser
-->
<robot name="car_laser" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- the laser -->
    <xacro:property name="laser_length" value="0.05" /> <!-- length -->
    <xacro:property name="laser_radius" value="0.03" /> <!-- radius -->
    <xacro:property name="laser_x" value="0.192" /> <!-- x of installing -->
    <xacro:property name="laser_y" value="-0.18" /> <!-- y of installing -->
    <xacro:property name="laser_z" value="${footprint_high + laser_length / 2+robot_lidi}" /> <!-- z -->

    <!-- link -->
    <link name="car_laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="laser2base_link" type="fixed">
        <parent link="base_link" />
        <child link="car_laser" />
        <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
    </joint>
</robot>

同imu差不多,不具体描述了。

5.编写launch文件

launch文件是启动程序的入口,文件放在launch文件夹下,名字为agv_model.launch,内容如下:

<launch>

    <!-- 1.设置参数(在参数服务器载入urdf文件) -->
    <param name="robot_description" command="$(find xacro)/xacro $(find agv_model)/urdf/xacro/agv.xacro" />

    <!-- 2.启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find agv_model)/config/rviz/agv.rviz"/>

    <!-- 添加关节状态发布节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <!-- 可选:用于控制关节运动的节点 -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />

</launch>

这个文档有三个关键的程序
1、

这里面有一句关键的是command命令,其中调用了xacro程序并运行agv.xacro文件。
2、

这个程序是读取urdf文件中的joint文件并发布tf关系的。
3、

三、运行并展示

如图:
在这里插入图片描述
在这里插入图片描述
其中主要分为两部分,一部分是模型展示,一部分是tf关系展示。

四、浅谈使用cartographer的过程中urdf文件在rviz显示的坑

一、如果在使用bag包建图或定位时,一定要把时间戳改到当前时间戳,不然因时间戳问题会抛异常,无法显示。
二、如果不使用里程计,会出现模型漂移显示,激光看着抖动,这个的问题是激光里程计发布出来的数据不连续,间隔时间较长。


总结

机器人urdf模型显示极大提高了显示并查看机器人位姿的方便性,有利于调试和使用机器人。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
创建 URDF(Unified Robot Description Format)是为了描述机器人模型的 XML 文件格式。在创建双臂机器人的 URDF 文件时,需要按照以下步骤进行: 1. 定义根链接:首先,需要定义机器人的根链接。根链接是机器人模型的基本结构,所有其他链接都将连接到它上面。 2. 创建链接:通过定义链接,可以描述机器人的各个组成部分。双臂机器人的 URDF 文件中,需要创建两个单独的链接,分别表示左臂和右臂。 3. 建立关节:链接之间的运动通过关节来实现。在 URDF 文件中,需要为每个链接创建相应的关节,并指定关节类型(如旋转关节、固定关节等)以及关节的轴线和运动范围。 4. 添加碰撞和显示信息:为了让机器人在仿真环境中进行物理交互和可视化,需要为每个链接添加碰撞和显示信息。碰撞信息描述了链接的物理形状和碰撞检测属性,而显示信息定义了链接在可视化中的外观。 5. 定义机器人结构:通过将链接和关节按照正确的顺序连接起来,可以定义机器人的完整结构。确保链接和关节正确连接,并且根据实际机器人的结构进行调整。 6. 设置传感器:如果双臂机器人具有传感器(如摄像头、激光雷达等),需要在 URDF 文件中定义传感器的参数和位置。 7. 导出 URDF 文件:完成所有定义后,将 URDF 文件导出为一个 XML 文件。 创建双臂机器人的 URDF 文件需要仔细设计和调整,确保结构准确并符合实际机器人的运动和外观。通过遵循 URDF 文件的格式和规范,可以使机器人在 ROS(Robot Operating System)中进行仿真、导航和控制等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值