找回密码
 注册
X系列官方授权正版
搜索
楼主: Cesrate

[分享] 你们绝对会爱死0.21的SAS

[复制链接]
发表于 2013-6-27 12:02:21 | 显示全部楼层
这个好啊!!
终于开始改进这些问题了。
回复

使用道具 举报

发表于 2013-6-27 12:03:46 | 显示全部楼层
394966931 发表于 2013-6-27 12:01
兄台是什么专业.?

Computer Science。。。。。Game Development.....
回复

使用道具 举报

发表于 2013-6-27 12:14:00 | 显示全部楼层
FRIGHTER 发表于 2013-6-27 12:03
Computer Science。。。。。Game Development.....

喔 怪不得 代码讲解很清楚啊
不过listener的时间间隔过长了 1秒对于SAS的矫正动作还是太长了 如果在一秒之内的运动幅度超过了当前可容忍阈值(矫正过头了) 也还是会导致震动的发生
提高listener的频率又会导致性能的下降
我觉得它的解决方法没有你讲的这么简单..


我还是比较提倡运动预测的算法
回复

使用道具 举报

发表于 2013-6-27 12:44:46 | 显示全部楼层
394966931 发表于 2013-6-27 12:14
喔 怪不得 代码讲解很清楚啊
不过listener的时间间隔过长了 1秒对于SAS的矫正动作还是太长了 如果在一秒 ...

嘛。。。毕竟我也不知道游戏中实际可以获取的变量有哪些。。。运动预测需要用到的变量很多,而且必须在一个稳定的环境下,也就是类似MJ自动入轨那样的把玩家的控制权剥夺掉才能实现吧。因此我选择了用Listener来实现。至于一秒那当然也是随手打的了。如果多核心支持能好一点的话用Listener也没什么大问题。再说现有的运算量其实很多都是浪费在火箭零件之间力的处理上了(虽然说浪费有点过了,但确实感觉不是那么重要。)。还有内存空间的限制如果能突破到64位的话也宽裕很多,用Double来做数据的话精度应该也会提高不少。总的来说就是引擎不给力=- =
回复

使用道具 举报

发表于 2013-6-27 12:53:14 | 显示全部楼层
FRIGHTER 发表于 2013-6-27 12:44
嘛。。。毕竟我也不知道游戏中实际可以获取的变量有哪些。。。运动预测需要用到的变量很多,而且必须在一 ...

嗯嗯.. 不管怎样还是期待0.21快出来吧
优化是个大问题
回复

使用道具 举报

发表于 2013-6-27 13:27:21 | 显示全部楼层
FRIGHTER 发表于 2013-6-27 11:12
其实所谓的震动就是因为没有一个误差容忍值导致的。。。我上个学期有一次的作业就是用JAVA写一个火箭着陆 ...

这看上去似乎只是个带自适应的纯P控制器。。。震荡是靠P分量的比例系数逐渐减小来消除的,而没有D分量的参与(D分量算是专门用来超前修正惯性带来的问题的)。这种方式的动态特性似乎不是很好,对箭体姿态变化较大的情况恐怕适应能力有些差,起码你的代码里我暂时没看到k有再次增大的地方,当然可以再加自适应把k值增大的代码逻辑。但这种自适应总会有一个响应延迟的时间差,运气不好的话,可能在一些情况下会和玩家控制产生不好的耦合而产生PIO(驾驶员诱发振荡)。。。

而我之前提及的船体弯度带来的控制问题是否可以靠这个方法来解决也是个疑点。因为这个问题的本质是ASAS模块获得的姿态数据与实际的火箭整体姿态可能并不一致(ASAS所在位置的箭体可能弯曲了一定角度),且因为箭体本身的抗弯能力,这个弯曲的角度会来回带衰减的反复振荡。也就是说你获得的float n = SAS这个值本身就会小幅来回振荡,而你在这种情况下产生的控制输出带来的反向扭矩又会和箭体本身抗弯带来的反向扭矩相叠加,最后如果可以依然满足n<=k的话也许还有机会逐渐缩小控制强度,如果满足不了而用上了RCS什么的加以干预继而导致箭体弯度振荡幅度的继续增加,那能不能保证可以比较好的稳定姿态就成问题了。。。
回复

使用道具 举报

发表于 2013-6-27 13:36:49 | 显示全部楼层
394966931 发表于 2013-6-27 12:14
喔 怪不得 代码讲解很清楚啊
不过listener的时间间隔过长了 1秒对于SAS的矫正动作还是太长了 如果在一秒 ...

PD控制算是比较简单(或者说简陋 XD)的一种带运动预测的稳定方式。当然D分量本身在设定的时候如果不合适的话,其本身也会带来小幅度的高频振荡(关于这个,RendezMe的Home On功能表示遇到过这种情形,最后还是得把控制率做一些额外修正来减缓)。
回复

使用道具 举报

发表于 2013-6-27 13:45:00 | 显示全部楼层
Cesrate 发表于 2013-6-27 10:49
呃有点类似于Orbiter的飞控,Kill Rotation功能?

Orbiter的Kill Rot纯粹就是个D控制,只是根据当前的角速度按比例产生一个反向的控制输出。所以其本身不具备定向能力,只是如其名字所描述的那样:消除旋转(也就是角速度清零)。。。

KSP的无人指挥舱在激活SAS的时候也是个D控制,它不具备定向能力,只是把角速度减为零,所以你激活时飞船的指向和最后停下来的指向可能相差甚远。
KSP的ASAS模块则是个PD控制(I分量这里暂时先不管有没有),它具备了定向能力(靠P分量根据当前指向到目标指向的差按比例产生控制输出),但单靠P分量必然会有到达目标指向时角速度不为零而导致的过调现象,所以结合D控制可以做到在到达目标指向前就开始提前减小角速度的效果,最后比较平稳的以较小的速度挪到目标指向的位置。
回复

使用道具 举报

 楼主| 发表于 2013-6-27 14:10:31 来自手机 | 显示全部楼层
394966931 发表于 2013-6-27 11:59
这是一方面
另一方面是SAS的过度矫正(一直进行转向知道指向锁定的位置为止)之后又会由于惯性...之前这 ...


我现在一直用“点刹法”,不停按F来避免过矫( ̄▽ ̄)
回复

使用道具 举报

发表于 2013-6-27 16:46:58 | 显示全部楼层
我来歪楼了,KSP用的引擎中只要加一句代码,这个问题就搞定了
this.rigidbody.constraints=RigidbodyConstraints.FreezeAll

那个FRIGHTER办法貌似可行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站