Open CHH3213 opened 2 years ago
您好,我也在gazebo仿真平台上做强化学习训练,但是苦于无人交流,现在遇到几个问题能与你一起讨论一下吗? 我的gazebo环境做了10倍加速,为了在仿真中达到10hz的控制频率,我需要实际100hz的状态回调,但是我测试发现/gazebo/model_states话题回调的频率不稳定,偶尔会出现30-40ms的回调间隔。这让我十分苦恼,并且使用回调不能保证回调反馈的状态是上次step动作作用后导致的,还需做额外的同步才能得到正确的sarsa。 想问下您在这部分是怎么做的?
您好,我也在gazebo仿真平台上做强化学习训练,但是苦于无人交流,现在遇到几个问题能与你一起讨论一下吗? 我的gazebo环境做了10倍加速,为了在仿真中达到10hz的控制频率,我需要实际100hz的状态回调,但是我测试发现/gazebo/model_states话题回调的频率不稳定,偶尔会出现30-40ms的回调间隔。这让我十分苦恼,并且使用回调不能保证回调反馈的状态是上次step动作作用后导致的,还需做额外的同步才能得到正确的sarsa。 想问下您在这部分是怎么做的?
您好,我现在用gazebo仿真并没有做加速的操作,因为这样在我这边好像模拟仿真与实物的差距会更大,导致迁移变得更难。回调的频率我也碰到过不稳定的情况,我一般是设置比较小的一个频率值,例如频率一般稳定在60hz,我可能只固定频率为50hz。另外回调不能保证回调反馈的状态是上次step动作作用后导致的,我的一个粗暴的做法时同一个动作话题重复发送几次,这样比较能保证回调反馈的状态是上次step动作作用后导致的。希望能给您帮助。 @JLer666
非常感谢您的回复!之前确实在网上查到说如果gazebo做仿真加速将会导致一些不正常的行为,但是不做加速数据的采集实在是太慢了。我在使用ElegantRL框架,训练端到端的on policy agent,现在训练一次需要接近10万个eps,如果不加速我训练一次的时间需要超过200小时,由于我现在还在改进测试的阶段需要经常从头训练,这么长的训练时长无法接受,在后期算法验证确实没问题后会专门在不加速环境下训练。对于状态同步的问题,我现在的做法是在step中pub了本次的act后sleep 100ms,先调用暂停仿真服务再调用/gazebo/get_model_state服务去得到机器人的状态,这样至少能保证我得到的状态一定是这个100ms后的状态。我还有一个问题,我想只做规划的策略agent(在仿真中不考虑控制问题,只考虑机器人的运动学约束),所以希望在我pub act后的100ms后仿真中的机器人一定能达到我的期望act,我查资料找到如果在参数中不指定gazebo_ros_control的pid_gains,gazebo将会直接使用我们的期望动作设定到对应的关节上,但是我不论加或不加pid_gains都达不到我想要的效果(或许是我的pid没调好?) ,您知道有什么方法可以做到吗? 再次感谢您的回复 @CHH3213
非常感谢您的回复!之前确实在网上查到说如果gazebo做仿真加速将会导致一些不正常的行为,但是不做加速数据的采集实在是太慢了。我在使用ElegantRL框架,训练端到端的on policy agent,现在训练一次需要接近10万个eps,如果不加速我训练一次的时间需要超过200小时,由于我现在还在改进测试的阶段需要经常从头训练,这么长的训练时长无法接受,在后期算法验证确实没问题后会专门在不加速环境下训练。对于状态同步的问题,我现在的做法是在step中pub了本次的act后sleep 100ms,先调用暂停仿真服务再调用/gazebo/get_model_state服务去得到机器人的状态,这样至少能保证我得到的状态一定是这个100ms后的状态。我还有一个问题,我想只做规划的策略agent(在仿真中不考虑控制问题,只考虑机器人的运动学约束),所以希望在我pub act后的100ms后仿真中的机器人一定能达到我的期望act,我查资料找到如果在参数中不指定gazebo_ros_control的pid_gains,gazebo将会直接使用我们的期望动作设定到对应的关节上,但是我不论加或不加pid_gains都达不到我想要的效果(或许是我的pid没调好?) ,您知道有什么方法可以做到吗? 再次感谢您的回复 @CHH3213
您好,不好意思,这个我不太清楚唉。您之后要是知道怎么做了,方便的话可以再回复我一下,谢谢~@JLer666
3、gazebo 关闭 client 界面
gazebo 平台第三视角关闭方法如下:
在打开的文件中将
value=true
改为<arg name="gui" value="false"/>
若上面方法还不能关闭界面,在 launch 启动文件里面,找到所有相关联的启动文件,将上面的修改方法在 launch 里面也执行一遍。
5、gazebo 仿真时间加速
主要是通过修改 world 文件里面的一些物理属性,来实现仿真时间加速的效果,若需要加速时,还是在重新测试比较好,我修改为如下代码后,较之前能有 3 倍左右的提升速度,并且没有使用 rospy.sleep(2) 函数,而是使用的 rospy.Rate(0.46).sleep() 来代替。
通过修改 max_step_size 的值能对 gazebo 进行加速,一般修改的时候 real_time_update_rate 设置为 0。
Max_step_size:0.001(默认值)
Real_time_update_rate:1(默认值)
Real_time_update_rate:1000(默认值)
参考网址:http://gazebosim.org/tutorials?tut=modifying_world&cat=build_world
6、gazebo 添加定制模型
例如,这样的模型则不一定能自己制作出来
因此,我们可以在3D Warehouse上搜索关键词,然后找到想要的模型,点击进去后,以 Collada File 文件形式下载即可。
(1)下载完后,解压,解压后更改 dae 的名字。然后在 gazebo_model_path 的文件夹目录下创建相对应的模型文件,主要包括 model.config、model.sdf 文件和 mesh 文件夹(文件夹下只有 dae 文件)
其中,model.sdf 文件内容如下:
(2)测试
创建 arc.world 文件,并将如下内容拷贝进去
(3)显示
运行 gazebo arc.world
参考网址:http://gazebosim.org/tutorials?tut=import_mesh#PreparetheMesh
https://answers.ros.org/question/42529/how-to-import-collada-dae-files-into-gazebo-rosfuerte/
7、Gazebo 场景纹理图重置
先看代码,后面在进行解释,该代码是从训练的代码中截取的部分,需要的内容全部都在了
在重置的过程中,首先需要先删除模型,即调用
gazebo/delete_model
服务,然后在重新生成,这时需要找到想要生成的模型的 sdf 文件所在位置,然后读取并调用gazebo/spawn_sdf_model
服务,即可实现 gazebo 场景纹理图的重置主要需要查看的帮助信息是
(1)roservice list:查找相关 service 服务
(2)rosservice info [service_name]:查找对应服务的数据类型
对其中一个进行解释说明:如
这里就和/gazebo/spawn_sdf_model 里面的 Args 对应,分别是 model_name、model_xml、robot_namespace、initial_pose、reference_frame
又如: