友情提示: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。例如:
其中,机器人透视图:
(1)Gazebo
类似Stage,Gazebo是多机器人仿真器,模拟机器人、传感器和物体,支持3D模式;包括精确刚体物理仿真,生成真实传感器反馈;允许设计用于操作物理机器人的代码在人工环境中执行。
ROS Indigo 预装GazeboV2.2;
ROS Kinetic预装GazeboV7;
Gazebo主页:http://gazebosim.org/
Gazebo教程:http://gazebosim.org/tutorials
Gazebo 架构包含服务器和客户端,服务器(gzserver): 运行物理循环和生成传感器数据;客户端(gzclient): 提供用户接口和仿真器可视化。
(2)ROS运行Gazebo
通过如下命令启动Gazebo:
rosrun gazebo_ros gazebo
第一次启动Gazebo时,需要几分钟时间更新模型数据库。Gazebo用户界面:
World View:显示世界及其中所有模型,可以添加、删除和操作模型,可以在工具栏左侧的视图的“View”,“Translate”和“Rotate”模式之间切换。
View Mode Translate Mode Rotate Mode
通过如下步骤增加模型,在左侧“Insert”选项卡中左键单击所需的模型,将光标移动到世界视图中所需位置,再次单击鼠标左键以释放模型,使用“Translate”和“Rotate”模式可以更精确地定向模型。
例如,插入PR2机器人、球体和圆柱体:
“World ”选项卡中的模型项包含所有模型及其链接的列表,右键单击模型可为您提供如下选项:Move to,Follow,View,Delete等。
“Collisions”视图:
“Wireframe”视图
时钟
在仿真过程中使用时钟开始、暂停和继续,它位于世界视图的底部:
RealTime Factor:实时因子显示与实时运行速度相比仿真运行快慢程度,小于1.0的因子表示仿真运行速度比实时慢,大于1.0表示比实时更快。
(3)保存、载入仿真世界
若对创建的仿真世界感到满意,可以通过File->Save As菜单保存,输入my_world.sdf作为文件名,再单击“Save”。
在命令行上加载已保存的世界:
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,其它参数保持默认值。启动结果如下所示:
(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的移动机器人教育和原型设计的极简主义平台,拥有一个小型差速驱动移动基座,在基座顶部是一堆“架子”,提供空间放置个人计算机、深度相机和其他设备,没有激光扫描仪,尽管如此,在室内环境能够较好地实现地图构建和导航。
参考链接: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
通过如下命令启动teleop包,在仿真环境中移动Turtlebot:
roslaunch turtlebot_teleop keyboard_teleop.launch
1.4.2 读取传感器数据
(1)激光扫描仪
Hokuyo是机器人常用激光传感器:
相关链接:https://www.hokuyo-aut.jp
(2)激光扫描数据LaserScan消息
发送激光信息的消息类型:”sensor_msgs/ LaserScan”;
使用如下命令查看消息结构:
rosmsg show sensor_msgs/LaserScan
参考链接:http://docs.ros.org/melodic/api/sensor_msgs/html/msg/LaserScan.html
ROS Stage的激光扫描仪消息示例:
TurtleBot的激光扫描消息示例:
其中,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初始位置
Turtlebot最终位置:
练习
实现一个简单的漫游算法,机器人应该向前移动直到它到达障碍物,然后旋转方向直到前方的路线可通行,再向前移动并重复。
以上内容截图主要在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