URDF全称为Unified Robot Description Format,中文可以翻译为“统一机器人描述格式”。与计算机文件中的.txt文本格式、.jpg图像格式等类似,URDF是一种基于XML规范、用于描述机器人结构的格式。根据该格式的设计者所言,设计这一格式的目的在于提供一种尽可能通用(as general as possible)的机器人描述规范。
URDF文件可用于GAZEBO仿真,网上关于URDF文件用于仿真环境中的例程较多,此处不再详述,重点关注于真实机器人的导航算法。
机器人描述格式将机器人用若干个link和jiont表示,并定义其相互关系。便于ROS系统获取机器人各个组件间的tf变换。
此部分工作是基于ROS导航算法的机器人模型建立,是重要的基础工作,便于代码的维护和算法的实现。
<?xml version="1.0"?>
<robot name="robot" xmlns:xacro="http://wwww.ros.org/wiki/xacro">
<xacro:property name="Pi" value="3.1416"/>
<xacro:property name="box_length" value="0.324"/>
<xacro:property name="box_width" value="0.242"/>
<xacro:property name="box_height" value="0.093"/>
<xacro:property name="wheel_diameter" value="0.1524"/>
<xacro:property name="wheel_length" value="0.060"/>
<xacro:property name="wheel_distance" value="0.200"/>
<xacro:property name="lidar_length" value="0.030"/>
<xacro:property name="lidar_diameter" value="0.060"/>
<link name="base_footprint">
<origin rpy="0 0 0" xyz="0 0 0"/>
</link>
<joint name="base_footprint_joint" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0" />
<parent link="base_footprint"/>
<child link="base_link" />
</joint>
<link name="base_link">
<visual>
<geometry>
<box size="${box_length} ${box_width} ${box_height}"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 ${(wheel_diameter+box_height)/2}"/>
<material name="blue">
<color rgba="0 .5 .8 1"/>
</material>
</visual>
</link>
<link name="right_front_wheel">
<visual>
<geometry>
<cylinder length="${wheel_length}" radius="${wheel_diameter/2}"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 1 0"/>
<parent link="base_link"/>
<child link="right_front_wheel"/>
<origin rpy="${Pi/2} 0 0" xyz="${wheel_distance/2} ${-(box_width+wheel_length)/2} ${wheel_diameter/2}"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_back_wheel">
<visual>
<geometry>
<cylinder length="${wheel_length}" radius="${wheel_diameter/2}"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
<axis xyz="0 1 0"/>
<parent link="base_link"/>
<child link="right_back_wheel"/>
<origin rpy="${Pi/2} 0 0" xyz="${-wheel_distance/2} ${-(box_width+wheel_length)/2} ${wheel_diameter/2}"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_front_wheel">
<visual>
<geometry>
<cylinder length="${wheel_length}" radius="${wheel_diameter/2}"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_front_wheel_joint" type="continuous">
<axis xyz="0 1 0"/>
<parent link="base_link"/>
<child link="left_front_wheel"/>
<origin rpy="${Pi/2} 0 0" xyz="${wheel_distance/2} ${(box_width+wheel_length)/2} ${wheel_diameter/2}"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_back_wheel">
<visual>
<geometry>
<cylinder length="${wheel_length}" radius="${wheel_diameter/2}"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
<axis xyz="0 1 0"/>
<parent link="base_link"/>
<child link="left_back_wheel"/>
<origin rpy="${Pi/2} 0 0" xyz="${-wheel_distance/2} ${(box_width+wheel_length)/2} ${wheel_diameter/2}"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="laser">
<visual>
<geometry>
<cylinder length="${lidar_length}" radius="${lidar_diameter/2}"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<joint name="laser_joint" type="fixed">
<parent link="base_link"/>
<child link="laser"/>
<origin xyz="0.05 0 ${(wheel_diameter+2*box_height+lidar_length)/2}" rpy="0 0 0"/>
</joint>
</robot>
上述为机器人xacro描述文件,具体功能包下载地址:https://download.csdn.net/download/ustcyr/24559934
编译完成后,启动launch文件,可在rviz中看到机器人模型
roslaunch description_function robot.launch
此机器人模型仅仅定义了各个link和joint间的关系,与我现在使用的实验平台相同,包含一个激光雷达和四轮小车。可根据需求更改调整参数,与自己的实验平台相一直。
另外此文件并未添加雷达插件,四轮差分平台插件,还不能实现与GAZEBO系统间的交互。ROS与GAZEBO实际上是独立的两个模块,初学者在使用ROS和GZAEBO序偶开发时,切莫混淆两者。为了将两者连起来,就是通过这些插件和ros_control模块。
此处另附激光雷达的GAZEBO插件,电机驱动插件和四轮差分驱动控制器插件。
激光雷达:
<gazebo reference="laser">
<sensor type="ray" name="rplidar">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
<update_rate>5.5</update_rate>
<ray>
<scan>
<horizontal>
<samples>360</samples>
<resolution>1</resolution>
<min_angle>-3</min_angle>
<max_angle>3</max_angle>
</horizontal>
</scan>
<range>
<min>0.10</min>
<max>6.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>laser_link</frameName>
</plugin>
</sensor>
</gazebo>
电机驱动,此处以左前轮为例,剩下的三个轮子可根据自己的joint名称定义,更改joint name
的参数即可。使用xacro文件的宏定义方法来简化代码,也是可以的。
<transmission name="wheel_left_front_joint_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="left_front_wheel_joint" />
<actuator name="wheel_left_front_joint_motor">
<hardwareInterface>VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
四轮差分驱动:网络和论坛上有很多两轮差分驱动的模块,四轮差分驱动的插件本人未找到,寻至ros官网,寻到此插件。
四轮与两轮并无本质区别,只是真实机器人多为四轮驱动,为了和真实机器人一致,可以使用以下代码作为差分驱动插件
<gazebo>
<plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
<updateRate>100.0</updateRate>
<robotNamespace>/</robotNamespace>
<leftFrontJoint>front_left_wheel_joint</leftFrontJoint>
<rightFrontJoint>front_right_wheel_joint</rightFrontJoint>
<leftRearJoint>back_left_wheel_joint</leftRearJoint>
<rightRearJoint>back_right_wheel_joint</rightRearJoint>
<wheelSeparation>0.4</wheelSeparation>
<wheelDiameter>0.215</wheelDiameter>
<robotBaseFrame>base_link</robotBaseFrame>
<torque>20</torque>
<topicName>cmd_vel</topicName>
<broadcastTF>false</broadcastTF>
</plugin>
</gazebo>
————————————————
版权声明:本文为CSDN博主「yrain·」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ustcyr/article/details/118557140
写至此,用于真实机器人建图导航算法的四轮差分驱动模型的URDF已详述,若想用GAZEBO仿真环境来模拟开发,还需关注ros_control的内容,此处不再详述。