仿真/模拟(Simulation),泛指基于实验或训练的目的,将原本的系统、事务或流程,建立一个模型以表征其关键特性(Key Characteristics)或者行为/功能,予以系统化与公式化,以便对关键特征做出模拟。
当所研究的系统造价昂贵、实验的危险性大或需要很长时间才能了解系统参数变化所引起的后果时,仿真是一种特别有效的研究手段,目前已经广泛应用于电气、机械、化工、水力、热力、社会、经济、生态、管理等领域。
gazebo是一款功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的是其开源免费的特性。gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。
一、gazebo的特点
gazebo是一款优秀的开源物理仿真环境,它具备如下特点:
1. 动力学仿真:支持多种高性能的物理引擎,例如ODE、Bullet、SimBody、DART等。
2. 三维可视化环境:支持显示逼真的三维环境,包括光线、纹理、影子。
3. 传感器仿真:支持传感器数据的仿真,同时可以仿真传感器噪声。
4. 可扩展插件:用户可以定制化开发插件,扩展gazebo的功能,满足个性化的需求。
5. 多种机器人模型:官方提供PR2、Pioneer2 DX、TurtleBot等机器人模型,当然也可以使用自己创建的机器人模型。
6. TCP/IP传输:gazebo可以实现远程仿真,后台仿真和前台显示通过网络通信。
7. 云仿真:gazebo仿真可以在Amazon、Softlayer等云端运行,也可以在自己搭建的云服务器上运行。
8. 终端工具:用户可以使用gazebo提供的命令行工具在终端实现仿真控制。
gazebo的社区维护非常积极,2013年以来几乎每年都会有较大的版本变化,如下图所示,可以看到gazebo的版本迭代,以及近几个ROS版本对应的gazebo版本。
gazebo的版本变化虽然较大,但是兼容性保持的比较好,indigo中2.2版本的机器人仿真模型,在Kinetic的7.0版本中运行依然不会有问题。
二、安装并运行gazebo
与rviz一样,如果已经安装了桌面完整版的ROS,那么可以直接跳过这一步,否则,请使用以下命令进行安装:
$ sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control
安装完成后,在终端中使用如下命令启动ROS和gazebo:
$ roscore
$ rosrun gazebo_ros gazebo
gazebo启动成功后的界面如下图所示:
主界面中主要包含以下几个部分:
0 :3D视图区
1 :工具栏
2 :模型列表
3 :模型属性项
4 :时间显示区
验证gazebo是否与ROS系统成功连接,可以查看ROS的话题列表:
$ rostopic list
如果连接成功,应该可以看到gazebo发布/订阅的如下话题列表:
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/set_link_state
/gazebo/set_model_state
当然,还有gazebo提供的服务列表:
$ rosservice list
/gazebo/apply_body_wrench
/gazebo/apply_joint_effort
/gazebo/clear_body_wrenches
/gazebo/clear_joint_forces
/gazebo/delete_model
/gazebo/get_joint_properties
/gazebo/get_link_properties
/gazebo/get_link_state
/gazebo/get_loggers
/gazebo/get_model_properties
/gazebo/get_model_state
/gazebo/get_physics_properties
/gazebo/get_world_properties
/gazebo/pause_physics
/gazebo/reset_simulation
/gazebo/reset_world
/gazebo/set_joint_properties
/gazebo/set_link_properties
/gazebo/set_link_state
/gazebo/set_logger_level
/gazebo/set_model_configuration
/gazebo/set_model_state
/gazebo/set_parameters
/gazebo/set_physics_properties
/gazebo/spawn_gazebo_model
/gazebo/spawn_sdf_model
/gazebo/spawn_urdf_model
/gazebo/unpause_physics
/rosout/get_loggers
/rosout/set_logger_level
三、构建仿真环境
在仿真之前,需要构建一个仿真环境。gazebo中有两种创建仿真环境的方法:
1. 直接插入模型
在gazebo左侧的模型列表中,有一个insert选项,罗列了所有可使用的模型。选择需要使用的模型,放置在主显示区中,就可以在仿真环境中添加机器人和外部物体等仿真实例:
模型的加载需要连接国外网站,为了保证模型顺利加载,可以提前将模型文件下载并放置到本地路径~/.gazebo/models下,模型文件的下载地址:
https://bitbucket.org/osrf/gazebo_models/downloads/。
2. Building Editor
第二种方法是使用gazebo提供的Building Editor工具手动绘制地图。
在gazebo菜单栏中选择Edit –> Building Editor,可以打开Building Editor界面。选择左侧的绘制选项,然后在上侧窗口中使用鼠标绘制,下侧窗口中即可实时显示绘制的仿真环境。
模型建立完成后就可以加载机器人模型并进行仿真了。
评论列表(70条)
gazebo中该如何仿真行星轮机构呢,一个齿轮带电机,带动周围三个齿轮绕各自轴自传,这三个尺寸再各自带动一个齿轮绕各自轴自传。
古月老师 您好 我在gazebo中insert自己构建的模型时总是闪退,报[gazebo_gui-3] process has died错误,请问您知道是什么原因么[gazebo_gui-3] process has died [pid 22905, exit code 134, cmd /opt/ros/kinetic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/home/che/.ros/log/cbc28d68-abb6-11ea-ad9a-68f728cdf268/gazebo_gui-3.log].
log file: /home/che/.ros/log/cbc28d68-abb6-11ea-ad9a-68f728cdf268/gazebo_gui-3*.log
古月老师,我在学习《ROS机器人开发实践》这本书的时候。再9.10章节进行gazebo使用move——base进行导航时,发现local planner规划边走边右拐。但是机器人边走边左拐。但是原地旋转的时候就不会出现这种问题。除了我使用的时Ubuntu1804和M版ros以外其他都和您教程一模一样。请问问题出在那里了呢?
kinetic和melodic中的差速插件方向不一致,如果你用的是m版本,需要修改下urdf中两个轮子的方向
古老师,我也遇到了这个问题,请问如何修改轮子方向呀
请问你的问题解决了吗?我也遇到了同样的问题!
请问你的问题解决了吗?我也遇到同样的问题,导致之后用算法也不好是,总是左右跑反。
老师,我想租用GPU服务器进行训练,它是用远程桌面控制的,我安装了ROS后,可以启动roscore,但是gazebo和rviz都打不开,会显示Segmentation fault (core dumped)。您知道是什么原因吗?
是不是远程无法渲染图像界面
胡老师,我最近利用gazebo导入零件并通过joint配合,ros可以控制sdf吗?还有就是urdf可以作delta并联机器人吗,如果不可以能问一下老师怎么做?如果不可以,可由解决的办法?
urdf不能直接支持并联机器人,sdf可以在gazebo中仿真
老师,我目前想要实现对传感器姿态的实时展现,可以使用gazebo的bullet物理引擎实现吗?如果可以的话,如何建立传感器(串口)与物理引擎之间的连接呢?
你好古月老师
我根据您的教程自己搭建了一个机器小车用作slam建图,但是我目前做的是集群控制,需要仿真多辆车。我在单车的基础上添加了group标签以此来分辨多车,但是我在cpp文件里发送相关速度指令的时候,几辆车是一起动的。我去查了查rqt_graph发现 gazebo并没有和几个group保持连接,但是我去查了查turtlebot的launch文件,写法是相同的,但是他们可以连接,并且可以单独给每个小车发不同指令。
请问老师,mbot的launch文件在添加group后是不是还缺少了什么配置?谢谢~
检查话题名的分组是否生效,已经每个节点是否重映射话题名字
分组生效了 节点重映射话题名字是否需要在模型里修改
重映射不需要在模型里改,launch里设置
老师你好,,这几天都差不多弄出来了 但是就差最后一个问题真不太明白。
我把他分组之后,所有的topic都有了,rviz上也都有了,每辆车雷达信息都可以各自检查到,但是amcl不行,我直接在rviz上点击一个目标点,机器人无法规划路径并且前进,posearray也没有,但是rviz上的信息栏里都显示正常,该有的都有。老师可以指点一下吗?
你好师兄,我是做群机器人方向的,最近开始学ROS和gazebo,想和你交流一下
古月老师你好,请问我在solidworks里画的物体,生成stl文件后在gazebo里加载,它的gazebo属性里的visual就是物体本身,但是collision却不是,一般是个比物体要大的正方体,然后这种stl模型又不能编辑我怎样把collision调成和visual一致呢?
在模型文件里改成一样的就行
老师您好,我想用xacro或urdf画一个闭环的机械结构,请问有相应的参考资料吗
我手上没有闭环的,google找下
请问你找到了闭环的机械结构了吗
Closed kinamtic chains can not be described by URDF. You have to ‘open up’ your structure and take care about the constraints using software code that provides the joint coordinates.
Gazebo supports closed chains through SDF:http://answers.gazebosim.org/question/7308/parallel-robots-implementing-close-kinematic-chains/
urdf好像不能弄闭环,一定要形成树结构。。。简单的四连杆都不行[捂脸]
Closed kinamtic chains can not be described by URDF. You have to ‘open up’ your structure and take care about the constraints using software code that provides the joint coordinates.
Gazebo supports closed chains through SDF:http://answers.gazebosim.org/question/7308/parallel-robots-implementing-close-kinematic-chains/
老师您好,最近在做gazebo仿真的时候,遇到一个摩擦力设置的问题。
在做的是一个四足机器人模型,躯干下面是四个四肢,然后是四个足,都是用简单的圆柱体和长方体。加载进gazebo后,控制四肢前后摆动的时候,躯干并不移动,足底在平面上前后滑动,类似足底和地面没有摩擦一样,这个摩擦应该怎么设置?
找了一些资料,比如设置gazebo标签
500.0
500.0
500000.0
10.0
0.001
0.1
1 0 0
1
Gazebo/GreyTransparent
但这样还是不行
可以设置下地面的模型参数试试,比如加入一片草地
古老师您好!我最近在做双足机器人行走的gazebo仿真,模型和控制器已经加好,初始状态机器人保持直立在地上,仿真环境运行之后机器人双脚会在地面上小幅度碰撞,反复碰撞几次之后机器人就摔倒了。地面模型的参数我没有找到相关的参考,不知道具体怎么设置。所以想请问一下古老师,上面您提到的草地,是否有可以参考的模型。我机器人目标环境是人造草坪,有一定的缓冲作用,不知道在sdf文件中是对应哪个参数。
gazebo中有草地模型,可以在sdf中修改模型的参数
谢谢古老师,修改了contact里面的kp参数,又调整了一下各个关节的PID,现在可以实现稳定的站立了。
您好,老师,最近在ubuntu18.04的环境下安装使用melodic版本的ROS,发现在gazebo的安装和连接总是不成功,不甘心不明不白地返回教程上版本,想就此问题咨询老师到底是哪里出现了问题,这个问题前后已经纠结一周,苦于找不到解决方法。
ritchie@think:~$ rosrun gazebo_ros gazebo
gzclient: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgazebo_common.so.9: undefined symbol: _ZN8ignition10fuel_tools12ClientConfig12SetUserAgentERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
gzserver: symbol lookup error: /usr/lib/x86_64-linux-gnu/libgazebo_common.so.9: undefined symbol: _ZN8ignition10fuel_tools12ClientConfig12SetUserAgentERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
敬等老师的解惑!
这个错误我也看不出来什么原因,只能建议多重装几次gazebo试试
您好!不知您的问题解决了么?
老师您好,最近在学习如何组装自己的机器人时遇到了一个问题,就是订阅的速度信息通过什么公式转换成电机所能识别的pwm信号吗?
参考智能车的驱动,一般使用PID闭环控制
古老师,我自己用solidworks导出一个两轮的机器人的模型,没有支撑轮的一种。但是导出到gazebo中以后,模型会自己摆动,这一般是什么原因呢?
应该是物理参数的问题
古老师,我的那个物理参数都是用soildworks画图后,自动生成的,里面含有不规则体,所以有些转动惯量参数自动生成的。
个人经验,自动生成的物理参数不一定好用,一般修改成比较小的质量会稳定一写些
大神,按照您的方法安装Gazebo,Gazebo启动就闪了一下界面,没有任何报错消息。
u@u-virtual-machine:~$ gazebo
u@u-virtual-machine:~$
我该怎么解决?
你用的虚拟机么?虚拟机显卡支持不好,gazebo经常有问题,rosrun gazebo_ros gazebo试一下,不行的话还是建议装双系统
古月老师好,在使用moveIt笛卡尔路径规划时,添加路点waypoints时,依次添加三个点A,B,C。希望末端能从A点直线过渡到B,再从B点直线过渡到C点,plan规划时候很好,可是实际执行时,在moveit和gazebo实际执行机械臂中,从A点直线过渡到B点,然后从B点转个大圈再到B点,然后再直线过渡到C点,这是怎么回事吗?是OMPL原因吗?另外出现了这个错误,ABORTED: Solution found but controller failed during execution, Path computed successfully. Moving the arm.并未标黄。
有可能是ompl导致的,但是不太清楚具体原因,这个问题一般是因为控制器没跟上规划的轨迹时间点导致的
古月老师好,我用笛卡尔路径规划时也出现了这样的问题,rviz中plan规划是挺好的,但是机械臂execute的时候不按照plan的路径走,直接动了一下就回到home姿态了。这个怎么解决呢?
古月老师好,我用笛卡尔路径规划时也出现了这样的问题,rviz中plan规划是挺好的,但是机械臂execute的时候不按照plan的路径走,直接动了一下就回到home姿态了。这个怎么解决呢?
而且我的也是有这个错误ABORTED: Solution found but controller failed during execution
这个是机器人控制器执行失败了,路径规划没问题,要看控制端是不是有问题
古月大佬你好,我买了你的书ROS机器人开发实践,根据你的书一步步往下学习,但目前有个问题想请教你一下,问题如下:我在第六章机器人建模与仿真中的gazebo模块中启动了装载摄像头的机器人模型,启动后按照您书上所写的启动rqt_image_view选择了仿真摄像头发布的话题后,我并没有得到仿真摄像头所拍摄到的图片。我原本打开launch文件的终端内出现了如下错误:gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && “A new DepthBuffer for a RenderTarget was created, but after creation” “it says it’s incompatible with that RT”‘ failed.
Aborted (core dumped)
[gazebo-1] process has died [pid 17038, exit code 134, cmd /opt/ros/kinetic/lib/gazebo_ros/gzserver -eode /home/health/catkin_study/src/mrobot_gazebo/worlds/playground.world __name:=gazebo __log:=/home/health/.ros/log/0718acd6-0a90-11e9-919a-000c2938f4a0/gazebo-1.log].
log file: /home/health/.ros/log/0718acd6-0a90-11e9-919a-000c2938f4a0/gazebo-1*.log
请问这是什么原因呢?还请古月老师指导一下~
根据以上错误,可能是动力学引擎挂了,重新安装gazebo试下
请问重新安装以后也没有解决怎么办?
想问一下这个问题现在已经解决了么,我也遇到这个问题了
老师您好,机械臂模型在gazebo内抖动的问题应该如何解决,应该主要配置哪些参数,有这方面的参考例子吗? 谢谢。
主要是物理参数的问题,惯性矩阵、质量等参数,可以参考已有的模型,比如ur
老师您好,gazebo可以做自己导入的两个机器人的协同仿真吗?
可以的,gazebo支持多机器人仿真,协同算法需要自己做或者找已有的包
老师,您好!麻烦问一下,运行roslaunch view_xbot_gazebo_empty_world.launch,显示下面错误是什么原因?
[urdf_spawner-6] process has died [pid 4273, exit code 1, cmd /opt/ros/kinetic/lib/gazebo_ros/spawn_model -urdf -model mrobot -param robot_description __name:=urdf_spawner __log:=/home/terminal/.ros/log/55c5bbe2-f156-11e8-a639-9c2a7050be79/urdf_spawner-6.log].
log file: /home/terminal/.ros/log/55c5bbe2-f156-11e8-a639-9c2a7050be79/urdf_spawner-6*.log
这个信息看不出来错误,rviz中可以显示模型么
在rviz中可以正常显示,就是在gazebo中打开显示这样的错误
Traceback (most recent call last):
File “/opt/ros/kinetic/lib/gazebo_ros/spawn_model”, line 26, in
from gazebo_ros import gazebo_interface
File “/opt/ros/kinetic/lib/python2.7/dist-packages/gazebo_ros/gazebo_interface.py”, line 9, in
from gazebo_msgs.msg import *
ImportError: No module named msg
[urdf_spawner-6] process has died [pid 5748, exit code 1, cmd /opt/ros/kinetic/lib/gazebo_ros/spawn_model -urdf -model mrobot -param robot_description __name:=urdf_spawner __log:=/home/terminal/.ros/log/37dde90c-f3fd-11e8-bf18-9c2a7050be79/urdf_spawner-6.log].
log file: /home/terminal/.ros/log/37dde90c-f3fd-11e8-bf18-9c2a7050be79/urdf_spawner-6*.log
感觉是gazebo安装包的问题,实现重新安装gazebo包
古月老师,我也出现这个问题。在gazebo中不显示模型,rviz中也是
[urdf_spawner-6] process has died [pid 15604, exit code 1, cmd /opt/ros/kinetic/lib/gazebo_ros/spawn_model -urdf -model mbot -param robot_description __name:=urdf_spawner __log:=/home/ds/.ros/log/d4240950-9b71-11ea-bbf9-000c29843059/urdf_spawner-6.log].
log file: /home/ds/.ros/log/d4240950-9b71-11ea-bbf9-000c29843059/urdf_spawner-6*.log
您好,您的问题解决了吗?
大神您好! 我仿照UR5机器人的moveit+gazebo仿真, 编写自己机器人的代码, [ WARN] [1542712031.375472683, 544.004000000]: Controller bmiarm_description/arm_joint_controller failed with error code GOAL_TOLERANCE_VIOLATED , 机器人可以规划但是不能动, 求大神解答.
看错误提示是非法误差设置
您好,您的问题解决了吗?我遇到了与您一样的问题能提供一下解决方法吗?或者错误所在吗?
您好,您的问题解决了吗?我遇到了与您一样的问题能提供一下解决方法吗?或者错误所在吗?
gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && “A new DepthBuffer for a RenderTarget was created, but after creation” “it says it’s incompatible with that RT”‘ failed.
Aborted (core dumped) 加载相机会出现上面问题,但是去掉相机可以正常工作,请问怎么解决
应该是图像渲染出问题了,重装gazebo试下
老师好 我用gazebo加载地图是一直抱着个错误,这个可能是什么原因呢
gzclient: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/include/OgreAxisAlignedBox.h:252: void Ogre::AxisAlignedBox::setExtents(const Ogre::Vector3&, const Ogre::Vector3&): Assertion `(min.x <= max.x && min.y <= max.y && min.z <= max.z) && "The minimum corner of the box must be less than or equal to maximum corner"' failed.
请问这个问题解决了吗?我也遇到了同样的问题,我是在用rviz中出现的
解决了,还是要检查程序,超出访问边界了