接近传感器
官方手册Scene objects栏
类型
类型从超声波到红外线,能检测detectable的实体
光线类型:
- 理想地适用于接近传感器的简单模型或是激光距离探测器的建模
- 最快的接近传感器
随机光线类型
- 属于光线类型,随机扫描圆锥的体积,外观与锥形接近传感器相似
金字塔型
- 理想地适用于接近传感器的简单模型,检测体积是矩形,具有迅速性
圆柱型
- 理想地适用于接近传感器的简单模型,检测体积是旋转的,具有迅速性
磁盘型
- 接近传感器的精确模型,检测体积是旋转扫描
- 取决于选择的精度和运行模式,其可以有更大的计算量
6.圆锥型
- 大部分接近传感器最好,最精确的模型
- 取决于选择的精度和运行模式,其可以有更大的计算量
检测机制
- 接近传感器以几何精确的方式操作:它们在感测点(小球体)和干扰其检测体积(理解为与检测体积的交集)的任何可检测实体之间执行精确的距离计算(它们不像大多数其他仿真软件那样,在检测体积边缘之间进行简单的碰撞检测,而是在检测体积内进行精确的距离计算)。每个接近传感器如下计算以下最小距离
检测结果可以在图表数据流中显示
接近传感器属性设置
小技巧
如果选择了一个以上的接近传感器进行参数设置,那么可以将一些参数设置从最后选定的接近传感器复制到其他选定的接近传感器(点击Apply to selection按钮):
- Sensing point size:对检测无影响,即使显示尺寸很大,也被认为是一个点
- Entity to detect:只检测带标签的可检测实体(带标签,即设置Detectable properties)
- Explicit handling:指明是否显式处理传感器,若选中,则当调用simHandleProximitySensor(sim_handle_all_except_explicit) 时,传感器不去进行处理,只有当调用simHandleProximitySensor(sim_handle_all) 或 simHandleProximitySensor(proximitySensorHandle),传感器才处理
- 如果用户希望在子脚本中而不是在主脚本中处理传感器(如果没有检查,则传感器将被处理两次,一次在主脚本中调用simHandleProximitySensor(sim_handle_all_except_explicit),一次在脚本中simHandleProximitySensor(proximitySensorHandle)),这样很有用。具体参考explicit and non-explicit calls部分
接近传感器检测参数设置
- Front / back face detection:用户决定传感器看到并检测到三角形的哪一边,在 triangle edit mode中,Front faces为蓝色,back faces为红色
- Fast detection (approximate):变快,但准确性降低
- Limited angle detection:选中时,可指定检测光线和物体表面法向量的最大角度,该特性在超声波接近传感器上很有用(超声波传感器一般不能看到没有足够面向传感器的物体表面)。当最大角度设置为很小时,检测速度大大提高。
- Occlusion check:障碍物确认,当传感器运行在limited angle detection模式上时,其会检测一些隐藏的物体,为了避免这样的情况,选中该项,计算时间会大大增加。当需要设置该项时,建议使用随机光线型接近传感器
- Don’t allow detections if distance smaller than:设置最小检测距离(a mask distance),模拟真实情况(太近检测不到),若简单地设置检测体积偏移(an offset for the detection volume),则也会增加检测距离(不希望看到)
- Randomized ray detection:适用随机光线型接近传感器
加速度传感器
红色:X轴
绿色:Y轴
蓝色:Z轴
if (sim_call_type==sim_childscriptcall_initialization) then
modelBase=simGetObjectAssociatedWithScript(sim_handle_self)
//Retrives the handle of the object the script is attached to
massObject=simGetObjectHandle('Accelerometer_mass')
sensor=simGetObjectHandle('Accelerometer_forceSensor')
result,mass=simGetObjectFloatParameter(massObject,sim_shapefloatparam_mass)
ui=simGetUIHandle('Accelerometer_UI')
simSetUIButtonLabel(ui,0,simGetObjectName(modelBase))
accelCommunicationTube=simTubeOpen(0,'accelerometerData'..simGetNameSuffix(nil),1)
end
if (sim_call_type==sim_childscriptcall_cleanup) then
end
if (sim_call_type==sim_childscriptcall_sensing) then
result,force=simReadForceSensor(sensor)
if (result>0) then
accel={force[1]/mass,force[2]/mass,force[3]/mass}
simTubeWrite(accelCommunicationTube,simPackFloatTable(accel))
simSetUIButtonLabel(ui,3,string.format("X-Accel: %.4f",accel[1]))
simSetUIButtonLabel(ui,4,string.format("Y-Accel: %.4f",accel[2]))
simSetUIButtonLabel(ui,5,string.format("Z-Accel: %.4f",accel[3]))
else
simSetUIButtonLabel(ui,3,"X-Accel: -")
simSetUIButtonLabel(ui,4,"Y-Accel: -")
simSetUIButtonLabel(ui,5,"Z-Accel: -")
end