首页 > 其他分享 >关于仿真Issac-GYM出现Tensor出现Nan报错的解决方案及分析过程

关于仿真Issac-GYM出现Tensor出现Nan报错的解决方案及分析过程

时间:2024-11-06 15:59:05浏览次数:2  
标签:Tensor Issac self torch dof 报错 vel buf obs

报错问题:出现了一个Nan

num_envs很小的情况下没问题,一旦大于50就有nan然后被强行停止函数的运行
image

Traceback (most recent call last):
  File "train.py", line 43, in <module>
    train(args)
  File "train.py", line 39, in train
    ppo_runner.learn(num_learning_iterations=train_cfg.runner.max_iterations, init_at_random_ep_len=True)
  File "/home/yyds/桌面/Gym5_human/humanoid-gym-main/humanoid/algo/ppo/on_policy_runner.py", line 129, in learn
    actions = self.alg.act(obs, critic_obs)
  File "/home/yyds/桌面/Gym5_human/humanoid-gym-main/humanoid/algo/ppo/ppo.py", line 93, in act
    self.transition.actions = self.actor_critic.act(obs).detach()
  File "/home/yyds/桌面/Gym5_human/humanoid-gym-main/humanoid/algo/ppo/actor_critic.py", line 133, in act
    self.update_distribution(observations)
  File "/home/yyds/桌面/Gym5_human/humanoid-gym-main/humanoid/algo/ppo/actor_critic.py", line 114, in update_distribution
    self.distribution = Normal(mean, mean*0. + self.std)
  File "/home/yyds/.local/lib/python3.8/site-packages/torch/distributions/normal.py", line 50, in __init__
    super(Normal, self).__init__(batch_shape, validate_args=validate_args)
  File "/home/yyds/.local/lib/python3.8/site-packages/torch/distributions/distribution.py", line 55, in __init__
    raise ValueError(
ValueError: Expected parameter loc (Tensor of shape (128, 10)) of distribution Normal(loc: torch.Size([128, 10]), scale: torch.Size([128, 10])) to satisfy the constraint Real(), but found invalid values:
tensor([[-0.0894, -0.0036, -0.0296,  ..., -0.0120,  0.0645,  0.0829],
        [-0.0959,  0.0003, -0.0248,  ..., -0.0023,  0.0624,  0.0635],
        [-0.1045,  0.0304, -0.0236,  ..., -0.0096,  0.0812,  0.0747],
        ...,
        [-0.0886,  0.0052,  0.0767,  ...,  0.0252, -0.0141,  0.1679],
        [-0.1043,  0.0212, -0.0588,  ...,  0.0114,  0.0969,  0.0459],
        [-0.0986,  0.0268,  0.0214,  ..., -0.0173,  0.0592,  0.0900]],
       device='cuda:0')

分析1

发现出现了这样的一个初始化,会不会和初始化有了一定程度的关系?
image
初步排查是这里的值存在Nan
image
而这个函数又被act函数引用
image
其又被一个内部类的函数应用
image
传入的参数为:
obs和critic_obs
那么我么就寻找obs这个变量的来源:
image
找到了这个函数:
返回类型为tensor类型的:
image
由于其用装饰函数修饰,必须要在子类中实现,所以我们查看它的子类在哪里集成了这个类:
这里env继承了这个类,但下面就走不通了,我们得另找其他路径来解决问题。。
image
找到了这个函数的定义了,在base_task文件中,返回的是obs_buf这个变量
image
那么我们继续查找这个变量
image
发现和下面的这两个变量紧密相关:

self.num_envs  环境数目
self.num_obs   观测值数目

说明它有环境数目行,观测值那么多列
image

image
整个目录又来base_task下面
image
被继承
image

被我们所继承
但我们还是不清楚obs_buf为什么会有一行,也就是有一个观测体会没有观测值?(也就是前面图片的变量,忘了前面图片找去)
image
我们进行了如下的查找,找到了这个obs_buf内容都是什么
我们询问copilot相关内容都是什么:
image
以及特权观察信息
image
二者分别对应了这里:
image

 def compute_observations(self):

        phase = self._get_phase()
        self.compute_ref_state()

        sin_pos = torch.sin(2 * torch.pi * phase).unsqueeze(1)
        cos_pos = torch.cos(2 * torch.pi * phase).unsqueeze(1)

        stance_mask = self._get_gait_phase()
        contact_mask = self.contact_forces[:, self.feet_indices, 2] > 5.

        self.command_input = torch.cat(
            (sin_pos, cos_pos, self.commands[:, :3] * self.commands_scale), dim=1)
        
        q = (self.dof_pos - self.default_dof_pos) * self.obs_scales.dof_pos
        dq = self.dof_vel * self.obs_scales.dof_vel
        
        diff = self.dof_pos - self.ref_dof_pos

        self.privileged_obs_buf = torch.cat((
            self.command_input,  # 2 + 3
            (self.dof_pos - self.default_joint_pd_target) * \
            self.obs_scales.dof_pos,  # 12
            self.dof_vel * self.obs_scales.dof_vel,  # 12
            self.actions,  # 12
            diff,  # 12
            self.base_lin_vel * self.obs_scales.lin_vel,  # 3
            self.base_ang_vel * self.obs_scales.ang_vel,  # 3
            self.base_euler_xyz * self.obs_scales.quat,  # 3
            self.rand_push_force[:, :2],  # 3
            self.rand_push_torque,  # 3
            self.env_frictions,  # 1
            self.body_mass / 30.,  # 1
            stance_mask,  # 2
            contact_mask,  # 2
        ), dim=-1)

        obs_buf = torch.cat((
            self.command_input,  # 5 = 2D(sin cos) + 3D(vel_x, vel_y, aug_vel_yaw)
            q,    # 12D
            dq,  # 12D
            self.actions,   # 12D
            self.base_ang_vel * self.obs_scales.ang_vel,  # 3
            self.base_euler_xyz * self.obs_scales.quat,  # 3
        ), dim=-1)

        if self.cfg.terrain.measure_heights:
            heights = torch.clip(self.root_states[:, 2].unsqueeze(1) - 0.5 - self.measured_heights, -1, 1.) * self.obs_scales.height_measurements
            self.privileged_obs_buf = torch.cat((self.obs_buf, heights), dim=-1)
        
        if self.add_noise:  
            obs_now = obs_buf.clone() + torch.randn_like(obs_buf) * self.noise_scale_vec * self.cfg.noise.noise_level
        else:
            obs_now = obs_buf.clone()
        self.obs_history.append(obs_now)
        self.critic_history.append(self.privileged_obs_buf)


        obs_buf_all = torch.stack([self.obs_history[i]
                                   for i in range(self.obs_history.maxlen)], dim=1)  # N,T,K

        self.obs_buf = obs_buf_all.reshape(self.num_envs, -1)  # N, T*K
        self.privileged_obs_buf = torch.cat([self.critic_history[i] for i in range(self.cfg.env.c_frame_stack)], dim=1)

也就是常见的那些观测值,那这样的话就跟我的urdf文件就有很大的关系了。

分析2

对urdf文件进行细致的分析。。
初步猜想是由于导出时的转动惯量造成的,所以我接下来进一步的分析。
然后我们来到了urdf的文件中:
我看到了这俩货:
image

effort和velocity

image
当我调大值时,竟然直接起飞了???

image
然后终于发现问题所在了。我给的不合理,就又会报错:这次我就很满足了
image

当你能够控制问题的产生与否的时候,你就已经解决了问题

我发现初步调节velocity的值,调的大一些关系不大,主要是effort的这个值,不能太大,一旦太大就会导致一些飞起的动作

标签:Tensor,Issac,self,torch,dof,报错,vel,buf,obs
From: https://www.cnblogs.com/myleaf/p/18523125

相关文章

  • 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间
    问题复现项目上历史项目为解决漏洞扫描从Tomcat6.0升级到了9.0版本,服务启动的日志显示如下警告,数据源是通过JNDI方式在server.xml中配置的,控制台上狂刷无法找到表空间的错误(没截图)报错:06-Nov-202410:32:03.701警告[main]java.util.ArrayList.forEachName=数据源Proper......
  • 【docker】拉取镜像环境报错解决#ERROR: Get https://registry-1.docker.io/v2/
    系统环境是ubuntu24.04创建daemon.json文件,设置国内加速地址。之前尝试使用了阿里,网易,百度的都不行。最后网上随便找了一粘进去,{"registry-mirrors":["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://do......
  • scroll-view 滚动时报错Ignored attempt to cancel a touchmove event with cancelabl
    场景描述:在uniapp中的弹窗pop中使用scroll-view频繁滚动出现报错[Intervention]Ignoredattempttocancelatouchmoveeventwithcancelable=false,forexamplebecausescrollingisinprogressandcannotbeinterrupted解决报错 解决办法:因为事件冒泡,scroll-v......
  • 解决idea报错cannot open Local Terminal
    idea使用终端发现用不了,一直显示can't  open local,具体报错情况如下: 一般是设置了powershell路径 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe,但没有解决(powershell路径可以改回来)再尝试了在环境变量Path中添加了 Powershell 路径配......
  • Mac报错:zsh: command not found: brew
    解决方法:cd/opt /bin/bash-c"$(curl-fsSLhttps://gitee.com/ineo6/homebrew-install/raw/master/install.sh)"or /bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brewls原因目前Homebrew还没有完......
  • 【Azure App Service】使用Microsoft.Office.Interop.Word来操作Word文档,部署到App Se
    问题描述在.NET项目中,使用Microsoft.Office.Interop.Word组件来操作Word文档,使用了Microsoft.Office.Interop.Word.Document对象中的Open和SaveAs方法。##打开文件doc=app.Documents.Open(refinputFile,refnullobj,refnullobj,refnullobj,refnullobj,refnullobj,......
  • 关于idea连接数据库时报错:Cannot run program E:\IntelliJ_IDEA_2023.3.4\jbr\bin
    问题说明连接mysql数据库时在点击testconnection时弹出的问题:CannotrunprogramE:\IntelliJ_IDEA_2023.3.4\jbr\bin\javacreateprocesserror=5,拒绝访问查询多个网站都没有找到解决方案。解决方法点击左侧Drivers,找到MySQL右侧点击Advanced在最下方的VMhome......
  • cron定时任务报错PAM unable to dlopen(pam_tally2.so): /lib/security/pam_tally2.so
    在Ubuntu22.04中,pam_tally2模块可能已经不再被支持或包含在系统默认的PAM模块中。因此,当系统尝试加载该模块时,无法找到对应的.so文件,需要使用pam_faillock.so来代替先查找下是否存在pam_faillock.so模块find/usr-name"pam_*.so"没有pam_tally2.so,复制出来一个就解决了......
  • 解决vite resolve alias的typescript报错
    报错如下: tsconfig.json配置如下:tsconfig.app.json需要添加一下配置:"compilerOptions":{"include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src"],"exclude":["no......
  • MySQL导入sql文件报错:2006 - MySQL server has gone away(转载)
    今天在在MySQL导入sql文件,导入失败,出现如下错误:2006-MySQLserverhasgoneaway,之前也遇到过,又一次遇到,还是记录一下吧!【问题】导入的sql文件大概有15M,导入过程中报错:2006-MySQLserverhasgoneaway  【解决办法】1、找到MySQL安装目录下的my.ini文件,修改max_allo......