5.3 Urdf文件的编写
5.3.1 实现效果
在rviz中,能够显示的小车模型如下所示。
5.3.2 代码编写
1、创建功能包添加依赖项
创建一个新的功能包,名称自定义然后导入依赖urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins
,然后在当前功能包下,再新建几个目录:
urdf:存储 urdf 文件的目录
meshes:机器人模型渲染文件(暂不使用)
config: 配置文件
launch: 存储 launch 启动文件
world:存放场景地图文件
2、编写urdf文件
<robot name="myAGV">
<link name="base_coordinate">
<visual>
<geometry>
<sphere radius="0.001" />
</geometry>
</visual>
</link>
<link name="base_link">
<visual>
<geometry>
<mesh filename="package://simulation_scene/meshes/agv.stl"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 1.57" />
<material name="blue">
<color rgba="0 0.25 0.5 0.8" />
</material>
</visual>
<collision>
<geometry>
<box size="0.34 0.34 0.34" />
</geometry>
<origin xyz="-0.8 0.0 0.0" rpy="0.0 0.0 1.57" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="1" />
<inertia ixx="0.2" ixy="0" ixz="0" iyy="0.2" iyz="0" izz="0.2" />
</inertial>
</link>
<gazebo reference="base_link">
<material>Gazebo/Blue</material>
</gazebo>
<joint name="base_link_to_base_coordinate" type="fixed">
<parent link="base_coordinate" />
<child link="base_link"/>
<origin xyz="0 0 0.205" />
</joint>
<link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.09" length="0.06" />
</geometry>
<origin xyz="0 0 0" rpy="1.57 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<cylinder radius="0.09" length="0.06" />
</geometry>
<origin xyz="0 0 0" rpy="1.57 0 0" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="2" />
<inertia ixx="0.02" ixy="0" ixz="0" iyy="0.02" iyz="0" izz="0.04" />
</inertial>
</link>
<gazebo reference="right_wheel">
<material>Gazebo/Black</material>
</gazebo>
<joint name="base_r_wheel_joint" type="continuous">
<parent link="base_link" />
<child link="right_wheel" />
<origin xyz="0.13 -0.1575 -0.115" />
<axis xyz="0 1 0" />
</joint>
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.09" length="0.06" />
</geometry>
<origin xyz="0 0 0" rpy="1.57 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<cylinder radius="0.09" length="0.06" />
</geometry>
<origin xyz="0 0 0" rpy="1.57 0 0" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="2" />
<inertia ixx="0.02" ixy="0" ixz="0" iyy="0.02" iyz="0" izz="0.04" />
</inertial>
</link>
<gazebo reference="left_wheel">
<material>Gazebo/Black</material>
</gazebo>
<joint name="base_l_wheel_joint" type="continuous">
<parent link="base_link" />
<child link="left_wheel" />
<origin xyz="0.13 0.1575 -0.115" />
<axis xyz="0 1 0" />
</joint>
<link name="universal_wheel">
<visual>
<geometry>
<sphere radius="0.035" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<sphere radius="0.035" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="0.5" />
<inertia ixx="0.0002" ixy="0" ixz="0" iyy="0.0002" iyz="0" izz="0.0002" />
</inertial>
</link>
<gazebo reference="universal_wheel">
<material>Gazebo/White</material>
</gazebo>
<joint name="universal_wheel_to_base_link" type="continuous">
<parent link="base_link" />
<child link="universal_wheel" />
<origin xyz="-0.135 0 -0.17" />
<axis xyz="1 1 1" />
</joint>
<link name="laser">
<visual>
<geometry>
<box size="0.05 0.05 0.05" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="red">
<color rgba="1.0 0.0 0.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<box size="0.05 0.05 0.05" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="0.2" />
<inertia ixx="0.00008" ixy="0" ixz="0" iyy="0.00008" iyz="0" izz="0.00008" />
</inertial>
</link>
<gazebo reference="laser">
<material>Gazebo/Red</material>
</gazebo>
<joint name="laser_to_base_link" type="fixed">
<parent link="base_link" />
<child link="laser" />
<origin xyz="0.12 0 0.195" />
</joint>
<link name="camera">
<visual>
<geometry>
<cylinder radius="0.02" length="0.01" />
</geometry>
<origin xyz="0 0 0" rpy="0 1.57 0" />
<material name="yellow">
<color rgba="1.0 1.0 0.0 1.0" />
</material>
</visual>
<collision>
<geometry>
<cylinder radius="0.02" length="0.01" />
</geometry>
<origin xyz="0 0 0" rpy="0 1.57 0" />
</collision>
<inertial>
<origin xyz="0 0 0" />
<mass value="0.1" />
<inertia ixx="0.00001" ixy="0" ixz="0" iyy="0.00001" iyz="0" izz="0.00002" />
</inertial>
</link>
<gazebo reference="camera">
<material>Gazebo/Yellow</material>
</gazebo>
<joint name="camera_to_base_link" type="fixed">
<parent link="base_link" />
<child link="camera" />
<origin xyz="0.23 0 0.145" />
</joint>
</robot>
Tips:这里由于默认前进方向是X向,对模型都有一个向Y轴的偏转。
3、编写launch文件
<launch>
<!-- 设置参数 其中param的名字必须是robot_description -->
<param name="robot_description" textfile="$(find simulation_scene)/urdf/myAGV.urdf" />
<!-- 启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find simulation_scene)/config/myAGV.rviz" />
<!-- 启动机器人状态和关节状态发布节点 -->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
<!-- 启动 gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch" >
<arg name="world_name" value="$(find simulation_scene)/world/house.world" />
</include>
<!-- 在 gazebo 中显示机器人模型 -->
<node pkg="gazebo_ros" type="spawn_model" name="myAGV" args="-urdf -model myAGV -param robot_description" />
</launch>
5.4 仿真环境的搭建
1、运行gazebo
2、绘制墙体
3、添加简单障碍物
4、保存为world文件
5.4.1 创建墙体
1、启动gazebo:在终端输入gazebo即可
2、绘制墙体:在Edit选项卡,选择building editor,点击wall再绘图即可;将绘制好的墙体保存,最后点击左上角的file先save后再exit即可。
5.4.2 添加简单障碍物并保存为world文件
1、添加简单障碍物:在gazebo的操作栏上,点击方块或者圆柱体 拖动到界面,即可。
2、保存为world文件:在File下,save world as保存为world文件。最后终端输入killall gzserver
结束所有gazebo进程。
3、最后将world文件添加到ROS功能包的world目录下。
上一篇: 5 ROS仿真建模(1- urdf和rviz、gazebo的基础操作).
下一篇: 5 ROS仿真建模(3- rviz+gazebo+控制仿真机器人).