简单火箭2吧 关注:5,982贴子:85,361
  • 16回复贴,共1

【新手入门贴】如何快速设计简单好用的火箭——之VIZZY篇

只看楼主收藏回复

前两天有伙伴说什么时候讲Vizzy。安排。
提前声明:这是新手入门贴,抛砖用的。既不是新手教程,也不是高级进修。已经会的伙伴可能能从这里看到一两个亮点,多的没有。不会的伙伴也不要期望这里会手把手教会操作。一切还需要结合自己在游戏里操作进行熟悉。
好了,先上一张全图,之前贴吧里大神发布的,借过了用用。
Vizzy参数英汉对照表。编程序的时候可以用这个查所需要的参数。


IP属地:河北来自Android客户端1楼2022-08-14 01:03回复
    1.Vizzy入口
    在图中设计界面主菜单的红圈位置。
    点这里进去,打开的是飞行器当前控制中心(芯片)的编程界面。
    其实RS2中几乎每一个部件都可以写Vizzy,并且会随部件激活而激活【新版本中需要有电,因此如果飞行器没有电池或太阳能板,发动机也没有启动,Vizzy不会执行。反过来,写在发动机上的Vizzy不能控制当前发动机开启,且只要飞行器有任意发动机启动,Vizzy也会启动。不过这属于“小技巧”】。
    不过一般我们都将Vizzzy写在主控制器上,避免不小心分离丢失了。
    2.Vizzy可以用来做什么?
    自动点火、分离,可激活部件启动关闭,设定飞行方向,控制滑动条,控制舵面……凡是上面图片中标为set的属性都可以操作。很多大神做的自动入轨、寻的、自动着陆,甚至全自动飞火,都可以用Vizzy实现。


    IP属地:河北来自Android客户端2楼2022-08-14 01:20
    收起回复
      2025-08-23 14:58:58
      广告
      不感兴趣
      开通SVIP免广告
      3.Vizzy难么?
      简单火箭嘛,就是两个字:简单。入门很容易,想用好嘛,得肝。RS2一贯特色。
      不废话,上图。
      4.主菜单介绍。
      4.1逻辑模块菜单
      这里存放的是编程的基础逻辑模块。
      主要是:
      1)延时等待和条件等待模块。
      2)计数循环、条件循环、步进循环模块。
      【这里插一句:循环模块的执行逻辑是,每次循环开始时,检测循环条件,当条件不满足时,终止循环。因此,repeat计数循环不能与i=i-1结合去替代for步进循环。因为第三个循环的检测条件是i-3是否小于0。假如i初始为4,此时检测结果为4-1*2-3=-1,第三次循环不会再执行。】
      3)条件选择模块。
      由if、elseif、else三个模块框组成。if执行逻辑是如果条件满足就执行框内语句,如果不满足就跳过。else需要接在if后面使用,不能单独使用。因为其逻辑是如果if的条件不满足才执行,如果if的条件满足,则跳过else。if...else...组成最基础的二选一条件选择语句。elseif则是个结合体,要接在前一个if或elseif后面使用。if...elseif...else可以组成顺序选择语句。比较适合做单选题。


      IP属地:河北来自Android客户端3楼2022-08-14 01:49
      回复
        4)display,屏幕输出。用来在屏幕上短暂(几秒)显示信息的。常拿来做程序测试用。也可以实现一些特殊效果,比如倒计时(需要和循环语句配合使用)。不过显示时间太短,想长时间显示,需要了循环语句配合。
        5)break,终止/跳出指令。作用是无条件跳出当前程序框。就是从前面的那些个程序框中跳出来,继续执行后面的语句。具体怎么用,到后面实例当中再说。


        IP属地:河北来自Android客户端4楼2022-08-14 02:08
        回复
          4.2计算模块。
          这里提供了加减乘除、逻辑运算、三坐标(矢量)运算、三角函数等等。不多介绍,自己去查。
          提示一下:对于三坐标量(矢量),也是可以直接用四则运算进行加减乘除的。至于矢量乘除矢量,按点乘处置,具体属于大学高数内容了。


          IP属地:河北来自Android客户端5楼2022-08-14 02:14
          回复
            4.3飞行器(游戏)属性设置模块。
            可以设定的参数都在这里。具体查看中英对照表。


            IP属地:河北来自Android客户端6楼2022-08-14 02:15
            回复
              4.4飞行器参数模块。
              需要提取的参数都在这里。具体还是查中英对照表。


              IP属地:河北来自Android客户端8楼2022-08-14 10:55
              回复
                4.5程序起始、调用模块。
                红色的是程序起始块。作为初始入门,用红圈里两个就够了。
                其中On Start是主起始块,相当于C语言中的Main()函数。一个程序中,可以有多个主起始块同步运行。
                另一个是消息调用起始块,就是收到黑色编辑框里写的广播消息时,开始执行。同样是并行运行。
                绿色框里是广播消息块。用来调用启动“消息调用起始块”的。说明一下:广播是可以携带数据的,要携带的数据写在with data后面“0”那个位置。数据类型不限。在调用起始块中,携带数据的是那个黄色的data,可以被直接拖动出来直接使用。但仅在当前函数中有效。这个属于额外特性,初始入门基本用不上。


                IP属地:河北来自Android客户端9楼2022-08-14 11:14
                回复
                  2025-08-23 14:52:58
                  广告
                  不感兴趣
                  开通SVIP免广告
                  4.6自定义变量模块
                  绿色的是我自定义的变量。按最下面的蓝色按钮可以添加。自定义变量可以拖出来直接用,不用指定数据类型,数据类型在第一次赋值时由程序自动决定。
                  上面三个是自定义变量的赋值块。
                  第一个是给自定义变量赋值。
                  第二个是给自定义变量加一个新值。比如原值是100,这里加个-99,新值就是1。
                  第三个是“输入框”,会在飞行界面跳出一个输入框,将输入框里输入的内容赋值给自定义变量。
                  后面还有自定义集合、自定义函数、自定义C函数(主要用于复杂字符处理)模块,初始入门用不上,就不介绍了。
                  Vizzy菜单各部分介绍在中英对照表中都有,多的就不复述了。这里只介绍主要的菜单功能,更多自己摸索。下面开始实战。


                  IP属地:河北来自Android客户端10楼2022-08-14 11:27
                  回复
                    这是一段自动飞行控制程序。代替在飞行界面中手动按点火按钮。各语句作用,和实际效果已经标注在图片中。可以自行研究。这里简单补充说明一下。
                    1.为什么要加等待时间?
                    分离、点火等操作,如果太快,下面级有时会对上面级产生干扰,这是给一个缓冲时间。当然,分离、点火放一起也可以。根据火箭实际状况来。
                    2.括号里的功能在哪儿实现?
                    😓这个嘛……纯手动控制在哪儿设置的,这个就在哪儿设置。看到activate了么?它就是代替手按的。
                    3.为什么要反复解除锁定?
                    因为用程序锁定和飞行界面手按锁定不一样,不会解除之前的锁定设置。结果就是两个相互打架,飞起来那叫一个酸爽。
                    4.两种锁定方式
                    右侧绿框中,是“正经”锁定。分别锁定当前方向、顺航向、目标方向等等。和飞行界面手按锁定效果相同。
                    程序里面第一处“锁定目标方向”,使用的是另外一种锁定方式,就是用程序设置导航球方位。这是一个三坐标量(矢量),是一条从飞行器自身到目标飞行器的连线。
                    特别提示:在这个程序段中,所有指令都是一次执行的。也就是第一处“锁定目标方向”只是给出了当时目标的方位,不会形成“持续锁定”的效果。
                    这里多说一句,Vizzy中矢量的概念:
                    把间星看做纸上的一个三坐标空间数轴,矢量就是坐标系中两个点之间的连线。将这条连线平移到坐标系原点(或飞行器原点),这就是所获得的矢量。所以,任何三坐标矢量,都可以直接进行加减乘除。
                    唯一的问题是:间星的空间坐标系不是飞行器当前位置的上下左右前后,是建立在球心上且固定不动的。因此目标方位就需要用目标坐标-飞行器坐标求出来。


                    IP属地:河北来自Android客户端11楼2022-08-14 12:15
                    回复
                      简单进阶一下。前面程序广播调用的“寻的”函数。
                      1.函数启动块中黑色部分内容必须与广播的消息一致。你可以认为那就是“函数名”。这里我偷懒没改名字。
                      2.因为这个程序实现的是持续计算导航参数,实现连续目标锁定,因此必须使用循环语句实现。while的条件用了个true,就是无条件循环。
                      新手注意:无条件循环一旦开始就不会停止。如果想停止,建议将结束条件写到while的条件中。注意一点,和所有判定条件一样,这里只接受真、假(1、0,true、false)。也就是那些外观为菱形的模块。如果要将结束条件写到判定位置,需要做一个转换。用“=”号判定,一端放入结束条件,另一端写入“false”,将“成立”变成“不成立”,将“不成立”变成“成立”。
                      3.下面三句:获取目标方位,获取相对速度方位,计算误差值。
                      因为相对速度大小、目标距离是变动的,而我只需要方位信息。为了保持误差计算的稳定性,我采用了取模运算。就是那个norm。结果就是将矢量缩短或增长到长度为1。
                      误差计算中用到了min、max两个,还有PCI to local。这是因为我后面要对误差进行累加计算。有效数据只有相对我飞行器来说的上下左右,前后方向数据累加的结果就是把我的飞行器死死的锁定在正前方向上。所以,用PCI to local把误差(矢量)从默认的简星三坐标系,转化成飞行器三坐标系。然后用min、max进行三坐标比较,(由于参数已经取模长,所以误差值最长不会超过2)将中间参数(前后)归零(min三坐标各自取两个矢量中的小值,实现正数取0;max反之,实现负数取0)。


                      IP属地:河北来自Android客户端12楼2022-08-14 12:50
                      回复
                        下一部分,第一对if...else...组合。计算误差累积量。
                        为了让累积量不至于过大,设定如果累积长度小于1,则正常累积。否则就将结果取模(强制长度为1)。
                        第二对if...else...组合。程序核心,也是最肝的地方:PID算法,计算锁定方位。
                        这里,用的算法逻辑是:让相对速度方向,对正目标方向。之所以用if...else...,是因为在大角度和小角度两种状态下,我选择了不同的控制算法。
                        或许有人会问:不是有默认的“锁定目标方向”么?问题是那只是让飞行器指向目标方位,速度方向、相对速度方向并没有指向目标。而且飞行器指向目标会有误差,根本无法和目标交汇(尤其是在相对速度很大时)。
                        PID控制算法基本逻辑:
                        飞行器正方向(0,1,0)+误差+误差积分(累积)+误差微分(两次循环误差变化量)。
                        效果:飞行器以当前方向为中心,向误差方向偏转,如偏转不足(存在误差)由积分进一步消除误差,用微分检查误差变化趋势并给一个减速制动(如果误差减小就减小控制量,如果误差增大就增大控制量)
                        注意一点:由于前面我消除误差在飞行器正方向上数值时,将坐标系转化成了local(飞行器坐标系),PID计算的最终结果,需要反向转换成简星坐标系(PCI),才能用来设置锁定。
                        最后三步:锁定瞄准方向,保存本次误差值(用于下一循环微分计算),将误差的长度显示到飞行界面屏幕上(肝PID时观察算法效果用的)。


                        IP属地:河北来自Android客户端13楼2022-08-14 13:18
                        回复
                          好了,一个基础的Vizzy自动飞行、寻的控制程序做完了。下面就可以肝PID参数了。具体怎么调,第一看飞行效果,第二网上查资料。这里就不介绍了。


                          IP属地:河北来自Android客户端14楼2022-08-14 13:21
                          回复
                            写在最后:
                            介绍一个测试PID的小技巧。
                            首先起飞一架飞行器,不要飞太远,但高度要够(否则你还没飞过去,他就掉下来了)。或者自己做一艘快船,开到几十公里的地方。然后保存。
                            第二步,打开你的火箭,进入飞行界面,暂停时间。再点屏幕左上角的原点,进入简星轨道显示界面。点放大镜,会显示出当前存在的星球、发射场和飞行器。后面带铅笔的就是飞行器。从这里可以快速选择目标飞行器。点弹出界面中的方框,完成锁定。好了,回到飞行界面,开始测试吧。
                            程序不复杂,但肝PID,真的伤肝。


                            IP属地:河北来自Android客户端15楼2022-08-14 13:30
                            回复
                              2025-08-23 14:46:58
                              广告
                              不感兴趣
                              开通SVIP免广告
                              谢谢你,刚发完就找到好东西了


                              IP属地:云南来自iPhone客户端16楼2024-03-18 21:12
                              回复