ROS小车URDF模型的构建
构建小车urdf模型是一方面是为了构建出小车上各类传感器的TF坐标系,另一方面是为了小车在后续的导航建图中更具有展示度。
创建功能包并完成初始化
mkdir –p ~/myrobot/src
cd ~/myrobot/
catkin_make
cd myrobot/src
catkin_create_pkg smart_car urdf
cd ..
catkin_make smart_car
创建URDF文件并检查
在samrt_car功能包目录下,新建urdf文件,并完成tf坐标系的固定,具体程序如下:
<robot name="test_robot">
<!-- *********************** 车体 ******************************* -->
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .4 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="yellow">
<color rgba="255 153 0 1"/>
</material>
</visual>
</link>
<link name="base_link1">
<visual>
<geometry>
<box size="0.01 .1 .2"/>
</geometry>
<origin rpy="0 0 0" xyz="0.085 0.15 0.2"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<link name="base_link2">
<visual>
<geometry>
<box size="0.01 .1 .2"/>
</geometry>
<origin rpy="0 0 0" xyz="-0.085 0.15 0.2"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<link name="base_link3">
<visual>
<geometry>
<box size="0.18 .1 .01"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0.15 0.3"/>
<material name="silver">
<color rgba=".86 .86 .86 1"/>
</material>
</visual>
</link>
<!-- ******************* 车轮 ***************************-->
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.15 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0.15 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 -0.15 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 -0.15 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_5">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_6">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0 0"/>
<material name="black"/>
</visual>
</link>
<!-- ****************雷达******************************** -->
<link name="velodyne">
<visual>
<origin xyz="0 0 0" />
<!-- 这里的XYZ 是指模块的世界坐标原点 设为“0 0 0”即将该模块的世界坐标原点和base—link的世界坐标统一 -->
<geometry>
<cylinder length="0.05" radius="0.05" />
</geometry>
<material name="blue" />
<color rgba="0 0 .8 1"/>
</visual>
</link>
<!-- **************** IMU ******************************** -->
<link name="imu">
<visual>
<origin xyz="0 -0.15 .1" />
<geometry>
<cylinder length="0.01" radius="0.01" />
</geometry>
<material name="gray" />
</visual>
</link>
<!-- **************** 关节 ******************************** -->
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
<joint name="joint_base_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
</joint>
<joint name="joint_base_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
</joint>
<joint name="joint_base_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
</joint>
<joint name="joint_base_wheel5" type="fixed">
<parent link="base_link"/>
<child link="wheel_5"/>
</joint>
<joint name="joint_base_wheel6" type="fixed">
<parent link="base_link"/>
<child link="wheel_6"/>
</joint>
<joint name="joint_base_link1" type="fixed">
<parent link="base_link"/>
<child link="base_link1"/>
</joint>
<joint name="joint_base_link2" type="fixed">
<parent link="base_link"/>
<child link="base_link2"/>
</joint>
<joint name="joint_base_link3" type="fixed">
<parent link="base_link"/>
<child link="base_link3"/>
</joint>
<joint name="laser2link" type="fixed">
<parent link="base_link" />
<child link="velodyne" />
<origin xyz="0 0.15 0.33" rpy="0 0 0" />
<!-- 这里的XYZ用于设定该模块的位置,这样设定后,该模块的TF将固定模块上 -->
</joint>
<joint name="imu2link" type="fixed">
<parent link="base_link" />
<child link="imu" />
<origin xyz="0 0 0" rpy="0 0 0" />
</joint>
</robot>
检查文件语法与配置是否正确
URDF提供了一些命令行工具,可以帮助我们检查、梳理模型文件,需要在终端独立安装:
sudo apt install liburdfdom-tools
接着使用如下命令,检查文件的配置和语法:
check_urdf myrobot.urdf
小车模型文件无误,可以运行测试。
查看URDF模型整体结构
执行一下命令生成test_robot.gv和test_robot.pdf两个文件:
urdf_to_graphiz myrobot.urdf
编写launch启动文件
在smart_car文件夹下,新建launch文件夹,并在该文件夹下新建myrobot.launch文件:
<?xml version="1.0"?>
<launch>
<arg name="model"/>
<arg name="gui" default="False"/>
<param name="robot_description" textfile="$(arg model)"/>
<para name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
</launch>
启动文件:
roslaunch myrobot.launch model:="../urdf/myrobot.urdf"
打开rviz界面,添加robotmodel和TF
后期将小车的urdf模型复制到导航建图算法中,即可使用,无需再写其他配置文件,如下图: