最新消息:380元/半年,推荐全网最具性价比的一站式编程学习平台码丁实验室

ROS教程-1.4 Gazebo及漫游机器人

ROS1/一代机器人系统 少儿编程 4037浏览 0评论
Ros教程01

友情提示:380元/半年,儿童学编程,就上码丁实验室

目  录

  • 1.4.1 Gazebo 仿真器
  • 1.4.2 读取传感器数据
  • 1.4.3 漫游机器人

 


 

1.4.1 Gazebo仿真器

在仿真环境中,根据需求建立真实场景的模型,将传感器和执行器建模为理想设备,或者包含不同程度的失真、错误和意外故障。由于ROS消息接口的隔离性,无论是控制真实机器人还是模拟机器人,绝大多数机器人的算法都可以运行。ROS Stage是一个2D仿真器,提供一个虚拟世界,包含移动机器人以及机器人感知和操纵的对象。参考链接:http://wiki.ros.org/simulator_stage。例如:

ROS教程-1.4 Gazebo及漫游机器人

其中,机器人透视图:

ROS教程-1.4 Gazebo及漫游机器人

(1)Gazebo

类似Stage,Gazebo是多机器人仿真器,模拟机器人、传感器和物体,支持3D模式;包括精确刚体物理仿真,生成真实传感器反馈;允许设计用于操作物理机器人的代码在人工环境中执行。

ROS教程-1.4 Gazebo及漫游机器人

ROS Indigo 预装GazeboV2.2;

ROS Kinetic预装GazeboV7;

Gazebo主页:http://gazebosim.org/

Gazebo教程:http://gazebosim.org/tutorials

Gazebo 架构包含服务器和客户端,服务器(gzserver): 运行物理循环和生成传感器数据;客户端(gzclient): 提供用户接口和仿真器可视化。

 

ROS教程-1.4 Gazebo及漫游机器人

(2)ROS运行Gazebo

通过如下命令启动Gazebo:

rosrun gazebo_ros gazebo

第一次启动Gazebo时,需要几分钟时间更新模型数据库。Gazebo用户界面:

ROS教程-1.4 Gazebo及漫游机器人

World View:显示世界及其中所有模型,可以添加、删除和操作模型,可以在工具栏左侧的视图的“View”,“Translate”和“Rotate”模式之间切换。

View Mode                  Translate Mode                      Rotate Mode

ROS教程-1.4 Gazebo及漫游机器人ROS教程-1.4 Gazebo及漫游机器人ROS教程-1.4 Gazebo及漫游机器人

通过如下步骤增加模型,在左侧“Insert”选项卡中左键单击所需的模型,将光标移动到世界视图中所需位置,再次单击鼠标左键以释放模型,使用“Translate”和“Rotate”模式可以更精确地定向模型。

例如,插入PR2机器人、球体和圆柱体:

ROS教程-1.4 Gazebo及漫游机器人

“World ”选项卡中的模型项包含所有模型及其链接的列表,右键单击模型可为您提供如下选项:Move to,Follow,View,Delete等。

“Collisions”视图:

ROS教程-1.4 Gazebo及漫游机器人

“Wireframe”视图

ROS教程-1.4 Gazebo及漫游机器人

时钟

在仿真过程中使用时钟开始、暂停和继续,它位于世界视图的底部:

ROS教程-1.4 Gazebo及漫游机器人

RealTime Factor:实时因子显示与实时运行速度相比仿真运行快慢程度,小于1.0的因子表示仿真运行速度比实时慢,大于1.0表示比实时更快。

(3)保存、载入仿真世界

若对创建的仿真世界感到满意,可以通过File->Save As菜单保存,输入my_world.sdf作为文件名,再单击“Save”。

ROS教程-1.4 Gazebo及漫游机器人

在命令行上加载已保存的世界:

gazebo my_world.sdf

注意,文件名必须位于当前工作目录中,否则必须指定完整路径。

(4)仿真世界描述文件

仿真世界描述文件包含仿真中所有元素:机器人、灯光、传感器和静态对象,使用SDF格式,扩展名为.world,Gazebo服务器(gzserver)读取此文件以生成并填充世界。

Gazebo附带了许多仿真世界示例,位于Gazebo资源路径的/worlds目录中,例如在ROS Indigo的路径是”/usr/share/gazebo-2.2”,在ROS Kinetic的路径是”/usr/share/gazebo-7”。gazebo_ros中的内置启动文件,可以加载其中一些仿真世界文件,例如,“willowgarage.world”文件的内容如下所示:

<?xml version="1.0" ?>
<sdf version="1.4">
 <world name="default">
   <include>
     <uri>model://ground_plane</uri>
   </include>
   <include>
     <uri>model://sun</uri>
   </include>     
   <include>
     <uri>model://willowgarage</uri>
   </include>
 </world>
</sdf>

该仿真世界文件片段中,引用了三个模型,将在本地Gazebo模型数据库中搜索这三个模型,如果本地数据库找不到,它们将自动从Gazebo的在线数据库中取出。

启动仿真世界文件”willowgarage_world”,输入:

roslaunch gazebo_ros willowgarage_world.launch

其中,“willowgarage_world.launch”文件的内容:

<launch>
 <!-- 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">
   <argname="world_name"value="worlds/willowgarage.world"/>
   <!-- Note: the world_name iswith respect to GAZEBO_RESOURCE_PATH environmental variable -->
   <argname="paused" value="false"/>
   <argname="use_sim_time"value="true"/>
   <argname="gui"value="true"/>
   <argname="headless" value="false"/>
   <argname="debug" value="false"/>
 </include>
</launch>

该文件继承了“empty_world.launch大部分功能,唯一需要更改的参数是world_name,用willowgarage.world替换empty.world,其它参数保持默认值。启动结果如下所示:

ROS教程-1.4 Gazebo及漫游机器人

(5)模型文件

模型文件使用与世界文件相同的SDF格式,但仅包含一个<model>标记,创建模型文件后,可以使用以下SDF语法将其包含在world文件中:

<include filename="model_file_name"/>

此外,还可以包含在线数据库的任何模型,在运行时将下载必要内容。其中,willowgarage模型SDF文件:

<?xml version="1.0" ?>
<sdf version="1.4">
 <model name="willowgarage">
   <static>true</static>
   <pose>-20 -20 0 0 0 0</pose>
   <link name="walls">
     <collision name="collision">
       <geometry>
         <mesh>
          <uri>model://willowgarage/meshes/willowgarage_collision.dae</uri>
         </mesh>
       </geometry>
     </collision>
     <visual name="visual">
       <geometry>
         <mesh>
          <uri>model://willowgarage/meshes/willowgarage_visual.dae</uri>
         </mesh>
       </geometry>
       <cast_shadows>false</cast_shadows>
     </visual>
   </link>
 </model>
</sdf>

模型组成部分如下所示:

Links: 包含模型中物体的物理属性,如轮子、也可以是联合链中的link等,每个link可能包含许多碰撞、视觉和传感器元素。

Collision: 碰撞元素封装用于碰撞检查的几何体,简单形状(优选的),或三角形网格(消耗更多资源);

Visual: 可视化link的各个部分;

Inertial: 描述link的动态特性,如质量、转动惯量矩阵;

Sensor: 传感器从世界收集数据以用于插件;

Joints: 连接两个link,建立父子关系以及其它参数,如旋转轴、关节限制;

Plugins: 用于控制模型的共享库。

(6)TurtleBot

基于ROS的移动机器人教育和原型设计的极简主义平台,拥有一个小型差速驱动移动基座,在基座顶部是一堆“架子”,提供空间放置个人计算机、深度相机和其他设备,没有激光扫描仪,尽管如此,在室内环境能够较好地实现地图构建和导航。

ROS教程-1.4 Gazebo及漫游机器人

参考链接:http://wiki.ros.org/Robots/TurtleBot.

通过如下命令安装Turtlebot仿真包:

sudo apt-get install ros-indigo-turtlebot-gazeboros-indigo-turtlebot-appsros-indigo-turtlebot-rviz-launchers

 

启动带有Turtlebot的仿真世界,输入:

roslaunch turtlebot_gazebo turtlebot_world.launch

 

ROS教程-1.4 Gazebo及漫游机器人

ROS教程-1.4 Gazebo及漫游机器人

通过如下命令启动teleop包,在仿真环境中移动Turtlebot:

roslaunch turtlebot_teleop keyboard_teleop.launch

ROS教程-1.4 Gazebo及漫游机器人

 


 

1.4.2 读取传感器数据

(1)激光扫描仪

ROS教程-1.4 Gazebo及漫游机器人

 

Hokuyo是机器人常用激光传感器:

 

ROS教程-1.4 Gazebo及漫游机器人ROS教程-1.4 Gazebo及漫游机器人

相关链接:https://www.hokuyo-aut.jp

(2)激光扫描数据LaserScan消息

发送激光信息的消息类型:”sensor_msgs/ LaserScan”;

使用如下命令查看消息结构:

rosmsg show sensor_msgs/LaserScan

ROS教程-1.4 Gazebo及漫游机器人

参考链接:http://docs.ros.org/melodic/api/sensor_msgs/html/msg/LaserScan.html

ROS Stage的激光扫描仪消息示例:

ROS教程-1.4 Gazebo及漫游机器人

TurtleBot的激光扫描消息示例:

ROS教程-1.4 Gazebo及漫游机器人

其中,TurtleBot没有激光雷达,但是,深度相机的图像可以用作激光扫描,“depthimage_to_laserscan”节点获取深度图像并生成2D激光扫描。在Gazebo中运行turtlebot仿真时,该节点将自动运行,输出范围数组包含NaN和+/-Infs(当范围小于range_min或大于range_max时),与NaN的比较总是返回false。

tutrlebot_world.launch

<launch>
 ...
 <!-- Fake laser -->
 <node pkg="nodelet"type="nodelet"name="laserscan_nodelet_manager"args="manager"/>
 <node pkg="nodelet"type="nodelet"name="depthimage_to_laserscan"args="loaddepthimage_to_laserscan/DepthImageToLaserScanNodeletlaserscan_nodelet_manager">
   <paramname="scan_height"value="10"/>
   <paramname="output_frame_id"value="/camera_depth_frame"/>
   <paramname="range_min"value="0.45"/>
   <remap from="image" to="/camera/depth/image_raw"/>
   <remap from="scan" to="/scan"/>
 </node>
</launch>

 


 

1.4.3 漫游机器人

综合应用上述概念,创建漫游机器人,听起来可能微不足道,但漫游机器人实际上能够做有意义的工作:在环境中行驶完成一系列任务;例如,可以通过巧妙的算法来实现扫地机器人的功能;机器人最终将覆盖环境的所有部分,完成其任务。

(1)“stopper”节点

创建“stopper”节点,该节点将使机器人向前移动,直到它检测到前方的障碍物为止,将使用激光传感器检测障碍物。

首先,创建一个名为wander_bot的包:

cd ~/catkin_ws/src
catkin_create_pkg wander_bot std_msgs rospy roscpp

在该包下的”src”路径创建文件:Stopper.h和Stopper.cpp,以及包含”main”函数的文件:run_stopper.cpp。

具体程序内容后台回复:ROS教程-1.4;

或者见:https://github.com/LinHuican/ros_tutorial/tree/master/lecture1-4/wander_bot.

(2)CMakeLists.txt

编辑CMakeLists.txt文件如下两行:

cd ~/catkin_ws/src
catkin_create_pkgwander_botstd_msgsrospyroscpp
cmake_minimum_required(VERSION2.8.3)
project(my_stage)

…

## Declare a cppexecutable
add_executable(stoppersrc/Stopper.cppsrc/run_stopper.cpp)
## Specify libraries to link a library orexecutable target against
target_link_libraries(stopper${catkin_LIBRARIES})

(3)Launch文件

启动Gazebo和stopper节点的launch文件:

<launch>
   <paramname="/use_sim_time"value="true" />
   <!-- Launch turtle bot world -->
   <include file="$(find turtlebot_gazebo)/launch/turtlebot_world.launch"/>
   <!-- Launch stopper node -->
   <node name="stopper" pkg="wander_bot" type="stopper"output="screen"/>
</launch>   

通过如下命令,运行launch文件:

roslaunch wander_bot stopper.launch

Turtlebot初始位置

ROS教程-1.4 Gazebo及漫游机器人

Turtlebot最终位置:

ROS教程-1.4 Gazebo及漫游机器人

 


 

练习

实现一个简单的漫游算法,机器人应该向前移动直到它到达障碍物,然后旋转方向直到前方的路线可通行,再向前移动并重复。

 


 

以上内容截图主要在ubuntu14.04、ROS Indigo测试取得,在ubuntu16.04、ROS Kinetic也能运行,任何问题欢迎后台留言。

 

1.4.3涉及的源码(ROS Indigo)详见:

https://github.com/LinHuican/ros_tutorial/tree/master/lecture1-4/wander_bot

转自公众号:
Robot404

您必须 登录 才能发表评论!