ROS学习笔记十二:使用gazebo在ROS中仿真

ROS 学习笔记⼗⼆:使⽤gazebo 在ROS 中仿真
想要在ROS 系统中对我们的机器⼈进⾏仿真,需要使⽤gazebo 。
gazebo 是⼀种适⽤于复杂室内多机器⼈和室外环境的仿真环境。它能够在三维环境中对多个机器⼈、传感器及物体进⾏仿真,产⽣实际传感器反馈和物体之间的物理响应。在本⽂中,你会学习如何使⽤之前创建的机器⼈模型,如何加载⼀个激光雷达传感器和摄像头,并使机器⼈模型像真的机器⼈⼀样移动。⼀、在 gazebo 中使⽤ URDF 3D 模型在 gazebo ⼯作前,我们需要安装ROS 功能包与 gazebo 交互:
$ sudo apt-get install ros-indigo-gazebo-ros-pkgs ros-indigo-ros-control
你能够在 chapter7_tutorials/robot1_description/urdf/robot1_base_01.xacro 到修改后的⽂件:(由于代码过多,所以并未完全贴出,下⾯只是很少的⼀部分代码)
为了在 gazebo 中导⼊机器⼈模型,你需要先完成 URDF 模型。在这⾥我们将使⽤.xacro ⽂件,虽然这可能更复杂,但是对于代码开发来说其功能⾮常强⼤。<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>  <origin rpy="0 0 1.54" xyz="0 0 0.05"/>
<material name="white">
简易过滤器<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>  <geometry>
<box size="0.2 .3 0.1"/>
</geometry>
</collision>
<xacro:default_inertial mass="10"/>
</link>
这是机器⼈底盘 base_link 的新代码。请注意 collision 和 inertial 部分对于在 gazebo 中运⾏模型是必需的,这样才能计算机器⼈的物理响应。
想要启动这⼀切,我们创建⼀个名为 gazebo.launch 的启动⽂件到 chapter7_tutorials/robot1_gazebo/launch ⽂件夹下,并添加以下代码:<?xml version="1.0"?>
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="true"/>
<arg name="use_sim_time" default="false"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="true"/>
<!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find robot1_gazebo)/worlds/robot.world"/>
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- Load the URDF into the ROS Parameter Server -->
<arg name="model" />立式烤箱
<param name="robot_description"
command="$(find xacro)/xacro.py $(arg model)" />
<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model robot1 -param robot_description -z 0.05"/>
</launch>想要启动⽂件,需要使⽤以下命令:
$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_01.xacro"
然后可以在 gazebo 中看到机器⼈。仿真初始状态是暂停的,你可以点击 paly 来运⾏它。(不过机器⼈不会移动)
将 robot1_description/urdf/robot1_base_01.xacro ⽂件另存为robot1_base_02.xacro ,并添加如下代码,即可创建robot.gazebo ⽂件:
正如你所见,模型并没有任何纹理渲染。在rviz 中你能看到在URDF ⽂件中声明的纹理。但是在 gazebo 中,你看不到它们。为了在 gazebo 中添加可见的纹理,需要在你的 .gazebo 模型⽂件中创建robot.gazebo ⽂件。<xacro:include filename="$(find robot1_description)/urdf/robot.gazebo" />
启动这个新⽂件,你看到的机器⼈虽然还是同⼀个,但已经带有纹理了:
$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_02.xacro"
你将会看到以下输出:
⼆、在 gazebo 中添加传感器
在gazebo 中,你能够对机器⼈的物理运动进⾏仿真。你同样能仿真它的传感器。
在本节中我们将会向模型中添加⼀个摄像头和激光雷达传感器。
我们会从 gazebo_ros_demos 功能包中调⽤激光雷达。这是ROS 的神奇之处,你能从其他功能包中复⽤代码从⽽简化开发。
我们唯⼀需要做的是向 robot1_base_02.xacro ⽂件中增加这些⾏,来为机器⼈添加 Hokuyo 激光雷达3D 模型,并另存为
robot1_base_03.xacro ⽂件:
<!-- Hokuyo Laser -->
<link name="hokuyo_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>      <geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>      <geometry>
<mesh filename="package://robot1_description/meshes/hokuyo.dae"/>
</geometry>
</visual>
<inertial>
<mass value="1e-5" />
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" />
</inertial>
</link>在 robot.gazebo ⽂件⾥,我们将添加 libgazebo_ros_laser 插件,这样就可以模拟 Hokuyo 激光测距雷达的⾏为。
<!-- hokuyo -->
<gazebo reference="hokuyo_link">
<sensor type="ray" name="head_hokuyo_sensor">
<pose>0 0 0 0 0 0</pose>
<visualize>false</visualize>
自动化洗碗机<update_rate>40</update_rate>
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.570796</min_angle>
<max_angle>1.570796</max_angle>
</horizontal>
</scan>
<range>
液晶屏保护膜<min>0.10</min>
<max>30.0</max>
<resolution>0.01</resolution>
</range>
<noise>
<type>gaussian</type>
<!-- Noise parameters based on published spec for Hokuyo laser
achieving "+-30mm" accuracy at range < 10m.  A mean of 0.0m and
stddev of 0.01m will put 99.7% of samples within 0.03m of the true
reading. -->
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
<topicName>/scan</topicName>
<frameName>hokuyo_link</frameName>
</plugin>
</sensor>
</gazebo>
使⽤以下命令启动新的模型:
$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_03.xacro"
你将会看到附带激光雷达模块的机器⼈。
采⽤同样的⽅法,我们向 robot.gazebo 和 robot1_base_03.xacro 添加⼏⾏代码以增加另⼀个传感器(⼀个摄像头)。
再使⽤以下命令启动添加摄像头后的模型:
$ roslaunch robot1_gazebo gazebo.launch model:="`rospack find robot1_description`/urdf/robot1_base_04.xacro"
注意,这个激光雷达会像真实的雷达⼀样产⽣“真实"的传感器数据。你能够通过 rostopic echo 命令看到这些数据:
$ rostopic echo /robot/laser/scan
我们可以向摄像头发出相同命令,但如果你想观察摄像头看到的 gazebo 仿真图像,你可以在终端中写⼊以下指令:
$ rosrun image_view image_view image:=/robot/camera1/image_raw
下⾯是点击"play"允许后摄像头拍摄的图像。
三、在 gazebo 中加载和使⽤地图
在本⼩节中我们将会使⽤⼀张柳树车库公司(Willow Garage)办公室的地图、这张地图在我们的ROS软件中应该默认安装了,保存在gazebo_worlds 功能包中。
为了检查模型,可以使⽤以下命令启动 .launch ⽂件:
$ roslaunch gazebo_ros willowgarage_world.launch
你会在 gazebo 中看到3D的办公室。这个办公室只有墙壁,你可以添加桌⼦、椅⼦和其他你想添加的物体。
为实现这个功能,我们在 robot1_gazebo/launch ⽂件夹下创建⼀个我们现在要做的是创建⼀个新的 .launch ⽂件来同时加载地图和机器⼈。
名为 gazebo_wg.launch 的⽂件,并添加以下代码:
<?xml version="1.0"?>
<launch>
<include file="$(find gazebo_ros)/launch/willowgarage_world.launch">
</include>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description"
command="$(find xacro)/xacro.py '$(find robot1_description)/urdf/robot1_base_04.xacro'" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
樱桃采摘机<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model robot1 -param robot_description -z 0.05"/>
</launch>
现在运⾏带有机器⼈的地图模型⽂件(注意:有些时候会出现软件崩溃,多尝试运⾏⼏次):
$ roslaunch robot1_gazebo gazebo_wg.launch
你会在 gazebo 中看到机器⼈和地图。下⼀步是在仿真虚拟环境中命令机器⼈移动和接受其传感器的仿真读数。
四、在 gazebo 中移动机器⼈
滑移转向(skid-steer)机器⼈是⼀种对机⾝两侧轮⼦分别进⾏驱动的移动机器⼈。它通过将两侧轮⼦控制在不同的转速(所产⽣的转速差)进⾏转向,⽽不需要轮⼦有任何转向⾏动。
正如前⾯所说,在 gazebo 中我们需要对机器⼈、关节、传感器等设备的⾏为进⾏编程。和前⾯的激光雷达⼀样,gazeb 也已经有了 skid 驱动的实现,我们能够直接使⽤它移动机器⼈。使⽤此⾏驶控制器,只需要在模型⽂件(robot1_base_04.xacro)中增加以下代码:
<!-- Drive controller -->
<gazebo>
<plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
<updateRate>100.0</updateRate>
<robotNamespace>/</robotNamespace>
<leftFrontJoint>base_to_wheel1</leftFrontJoint>
<rightFrontJoint>base_to_wheel3</rightFrontJoint>
<leftRearJoint>base_to_wheel2</leftRearJoint>
<rightRearJoint>base_to_wheel4</rightRearJoint>
<wheelSeparation>4</wheelSeparation>
<wheelDiameter>0.1</wheelDiameter>
<robotBaseFrame>base_link</robotBaseFrame>
<torque>1</torque>
<topicName>cmd_vel</topicName>
<broadcastTF>0</broadcastTF>
</plugin>
</gazebo>
你在代码中能够看到的参数都是⼀些简单的配置,以便这个控制器能够⽀持4个轮⼦的机器⼈⼯作。例如,我们选择 base_to_wheel1、base_to_wheel2、base_to_wheel3、base_to_wheel4 关节作为机器⼈的驱动轮。
另外⼀个有趣的参数是 topicName。我们需要以这个参数为名发布命令来控制机器⼈。此时,当你发布⼀个 sensor_msgs/Twist 主题调⽤/cmd_vel 时,机器⼈将会移动。正确配置轮⼦关节的⽅向⾮常重要,按照xacro⽂件中的当前⽅向,机器⼈将上下移动,因此有必要修改四个轮⼦的初始rpy,如以下代码中的 base link 和 wheel1 关节:
<joint name="base_to_wheel1" type="continuous">
<parent link="base_link"/>
<child link="wheel_1"/>
<origin rpy="-1.5707 0 0" xyz="0.1 0.15 0"/>
<axis xyz="0 0 1" />
</joint>
所有修改都保存在 chapter7_tutorials/robot1_description/urdf/robot1_base_04.xacro ⽂件中。现在我们使⽤以下命令启动带有控制器、机器⼈和地图的模型:
$ roslaunch robot1_gazebo gazebo_wg.launch
这个节点在 teleop_twist_keyboard 功能包
你将会在 gazebo 屏幕中看到机器⼈在地图上。现在我们将使⽤键盘来移动地图中的机器⼈。
中,发布 /cmd_vel 主题。运⾏以下命令以按照此功能包:
$ sudo apt-get install ros-indigo-teleop-twist-keyboard
$ rosstack profile
$ rospack profile
然后,运⾏节点如下:
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
现在你会看到⼀个有很多说明的新命令⾏窗⼝,你可以使⽤(u,i,o,j,k,l,m,“,”,“.”)按键来移动机器⼈并设置最⼤速度。
(⽬前已知u键是加速,j键是左转,k键是减速,l键是右转)
如果⼀切顺利的话,你可以驾驶机器⼈穿越 Willow Garage 的办公室。你可以观察到激光雷达数据和摄像头显⽰的图像。
五、⼩节
在本⽂中,你学会了如何创建⼀个属于⾃⼰的3D机器⼈模型。这包括对添加纹理、创建关节和说明如何使⽤节点来移动机器⼈等⼯作的详细解释。
无线视频服务器
概况来讲,我们已经看到了如何复⽤其他机器⼈的部件来设计我们⾃⼰的机器⼈,特别是我们已经包含了抓取器并添加了传感器,例如⼀个激光雷达和⼀个摄像头。
因此,在仿真中不需要完全从⽆到有来建造⼀个机器⼈,社区⾥已经开发了⼤量的机器⼈,你可以代码并在 ROS 和 gazebo 中运⾏它们,如有必要也可以修改它们。

本文发布于:2024-09-21 22:34:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/297047.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:机器   模型   添加   移动   传感器   看到   代码
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议