系列文章目录
文章目录
前言
今日在使用机器人建图和定位的过程中发现没有模型和相关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模型显示极大提高了显示并查看机器人位姿的方便性,有利于调试和使用机器人。