Examples 41-50

Example 41 - Scorpion Watchdog keep system running

This example documents how to communicate with the Resuscitator program to create a watchdog for both Scorpion and a Proscilica camera which is controlled by Scorpion.

  • The Resuscitator program - also named Scorpion Watchdog - is a program managing tool and is available on the Scorpion CD. * This program can control startup, shutdowns sequence and be a watchdog for all kinds of programs.
  • This example shows how to use it to implement a fast watchdog if a program stops capturing images.

Requirements:

  • Python
  • Python for Windows Extentions
  • Resuscitator

Scorpion is started and controlled by Resuscitator and must be closed when it is started from Resuscitator.

  • The Resuscitator configuration file - Resuscitator.ini - is placed in the profile base directory.

Scorpion and Resuscitator will communicate as follows:

Scorpion will write two lines in Resuscitator.ini file. They are stated below

[AliveStatus]
status= 1

In our example Resuscitator will check if these two lines has been written every 10 seconds.

  • If they are present in the file, Resuscitator will delete them.
  • If not, Resuscitator will restart scorpion. It is important that Scorpion writes the program lines above more frequently than they are written (for instance every second)

Scorpion Setup:

Central Start

def KickResuscitatior(applicationName, iniFileName)
  import win32api
  profile = GetStringValue('System.Profile')
  # when the code is executed, profile will contain a string with the the path of the current scorpion profile.
  win32api.WriteProfileVal('AliveStatus',applicationName,1,profile + '\\' + iniFileName)
  #for writing the lines to the file using the win32api (for details read the win32 api)

The script which calls the KickResuscitator function will must be executed both when the Scorpion is IDLE, and when Scorpion is RUNNING. If RUNNING we call Grab action, which gets a snapshot from the camera. When the camera has sent the snapshot, the action AfterInspect will be trigged. In AfterInspect we’ll call the KickResuscitator function, which then only is trigged if the camera is working properly. In sytem state idle, we won’t check if the camera is operating correctly, and call the KickResuscitator function directly. We will use Scorpion actions and events to enable this. For more information on Scorpion actions and events, klick here.

This example implements the strategy above by defining two actions in the actions tab, and one event in the scheduler: CameraTrigger and AfterInspect. After inspect is a system defined event, and should be filled with one new command; command = Script, parameters= KickResuscitator(‘Scorpion’,’ resuscitator.ini’). In the camera trigger action we have added two new commands. The first one has the command=Grab and a guard=running. The second one has command = Script, parameters= KickResuscitator(‘Scorpion’,’ resuscitator.ini’), and guard = Inverted running. In the scheduler create a new Event. Give it the following attributes; name: nextImage, command: cameraTrigger, frequency: ‘every nth millisecond’, period: 200

Resuscitator Setup:

Place a shortcut to Resuscitator in the startup group, edit the properties:

Target : C:\Program Files\Tordivel AS\Resuscitator for NT\FindResuscitator.exe
Start in: "C:\Program Files\Tordivel AS\Scorpion 7\Test Prosilica Watchdog

In the Resuscitator program press configure button, and edit the properties for each application:

_images/shortcut.gif

Under configure for applications: Shutdown

Program path: C:\Program Files\TORDIVEL AS\Resuscitator for NT\SHUTDOWN.EXE
Start in: C:\Program Files\TORDIVEL AS\Resuscitator for NT
Select checkbox: Run at shutdown only

Under configure for applications: Server control parameters

Program path: C:\Program Files\Tordivel AS\Resuscitator for NT\FindResuscitator.exe
Parameters: -topmost
Select checkbox: Watch this program
_images/findresucitator.gif

Find Resuscitator

Under configure for applications: Scorpion

Program path: C:\Program Files\TORDIVEL AS\Scorpion 6\Scorpion.exe
Parameters: system="Test Prosilica Watchdog" #This is the profile we want to open with scorpion
Start in: C:\Program Files\TORDIVEL AS\Scorpion 6\
Select checkbox: Watch this Program
Select checkbox: Alive check
_images/resuscitator_config.gif

Scorpion Application Configuration

Example 43 - Creating an ordered pointcloud

The following script will create an ordered 3D pointcloud

from arrlib import xyzwvfMat
from random import random
cloud = xyzwvfMat(10,10)    #1x10 matrix
cloud.tag = 'Example43'     #image/overlay name
for r in xrange(10):
  for c in range(10):
    cloud[r*10+c] = r-5,c-5,random()-0.5,0,0
SetImageMatr('3DModel',cloud)

Example 44 - UDP Socket Communication

Script collection demonstrating UDP socket communication in Scorpion.

Central Start:

import socket
receivedFromAddress = None # will be set when receiving data
receivePort = 1501 # listen on this port
sendToAddress = (sendToIPAddress, sendToPort) # target for sending data
udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
udp.bind(('', receivePort))
udp.settimeout(0.01)

Central Stop:

udp = None

Scheduler

# to be called at short intervals from a timer
# ensure no time-consuming tasks are done inside this function.
def Receive():
  global udp
  global receivedFromAddress
  if udp == None:
    print 'no udp object'
    return
  bufsize = 16384
  try:
    data, receivedFromAddress = udp.recvfrom(bufsize)
  except socket.timeout:
    return # no data waiting in buffer
  except Exception, err:
    print 'recv exception:', err
    return
  print 'Received %d bytes from' % len(data), receivedFromAddress
  #use the data string

Send Data

def Send(data):
  global udp
  sendToIPAddress = '127.0.0.1'
  sendToPort = 1500
  sendToAddress = (sendToIPAddress, sendToPort)
  if udp <> None:
    try:
      udp.sendto(data, sendToAddress)
    except Exception, err:
      print 'Send exception: ', err
      return
  else:
    print 'Send: No socket object'

Example 45 - Creating an empty pointcloud

The following script will create an empty pointcloud

from arrlib import xyzfVec
cloud=xyzfVec(1)          #min vector lengt = 1
cloud.tag='Example45'     #image/overlay name
cloud.setLength(0)        #set length to 0 - no data
SetImageMatr('3DModel',cloud)