子脚本(child stript)
子脚本是一个仿真脚本。CoppeliaSim每个场景会支持不限数量的子脚本。每个子脚本代表用Lua编写的一小部分例程集合,允许处理模拟中的特定函数。子脚本被附加到(或关联到)场景对象上,它们可以很容易地从场景层次结构中的脚本图标中识别出来。
双击脚本图标,就可以改变脚本的特性,或者将脚本通过脚本对话框与其他物体连接起来。通过选择对象,您可以将新的子脚本附加到对象上,[menu bar -->Add -->Associated child script]。
子脚本与场景对象的关联具有重要和积极的结果:
- 很好的移植性:子脚本将会和他们相连的物体一起进行保存/加载。通过使用子脚本,就可以创建不依赖任何系统特定接口的可移植的代码和仿真模型。一个功能完整的模型可以包含在一个单独的文件中(不需要修改就可以在不同的平台上使用),这不是依赖于插件来控制模型的情况。此外,出于同样的原因,依赖于子脚本的模型不需要长期维护(例如,一个新的操作系统版本不需要你调整代码的一部分或重新编译,正如你在使用插件时可能需要做的那样)。
- 固有的可伸缩性:如果与子脚本关联的物体被复制,那么它的子脚本也会被复制。复制的子脚本的内容将与原始子脚本的内容相同,但是复制的子脚本将会知道被复制并正确重定向对象访问(如果原来的子脚本正在访问“robot”,那么复制的子脚本将自动在“robot”后面附加一个名称后缀,以便访问复制的“robot”,而不是原来的那个)。要了解更多细节,请参阅关于以编程方式访问通用类型对象的部分。自动名称后缀调整允许复制对象和行为,而不必重写/调整任何代码。
- 不同的模型版本之间没有冲突:如果您修改一个给定模型的子脚本(例如,根据您的需要定制它),这将不会对其他类似的模型产生影响。当依赖于插件而不是子脚本进行模型控制时,这是一个更加关键的方面:使用插件时,总是冒着与以前的插件版本发生冲突的风险。
- 非常容易与模拟回路同步:子脚本可以运行线程和非线程。即使是子脚本的线程版本也可以很容易地与模拟回路同步,这是一个非常有用的特性。
子脚本有两种类型:非线程子脚本和线程子脚本:(左边是非线程,右边是线程)
非线程子脚本
非线程子脚本应该包含一组系统回调函数。并且不应该被阻塞。这意味着它们每次被调用时,都会执行一些任务并返回控制。如果没有返回控制,整个模拟会停止。非线性子脚本函数会在每个仿真step被主脚本(主脚本的驱动和传感函数)调用至少两次。系统还将在适当的地方调用其他系统回调函数(比如在子脚本初始化和清除时)。在任何可能的情况下,都应该选择非线程化的子脚本而不是线程化的子脚本。
非线程子脚本遵循精确的调用或执行顺序:默认的,子脚本以叶对象(或无子对象)开始,以根对象(或无父对象)结束。命令sim.handleChildScripts由默认主脚本调用,处理最重要的系统回调函数:想象一个自动门模拟模型的例子,一个接近度传感器在前面,后面允许检测靠近的人。当人离得足够近,门会自动打开。下面的代码就是关于上面粒子的一个典型的非线程子脚本
function sysCall_init()
sensorHandleFront=sim.getObjectHandle("DoorSensorFront")
sensorHandleBack=sim.get