Source code for morse.sensors.collision

import logging; logger = logging.getLogger("morse." + __name__)
from morse.core.sensor import Sensor
from morse.helpers.components import add_data, add_property
from morse.core import blenderapi

[docs]class Collision(Sensor): """ Sensor to detect objects colliding with the current object. It allows to select which objects are sensed for collision by setting the property ``only_objects_with_property`` (see the Examples section for an example). This sensor is a wrapper around Blender's own `Collision <https://www.blender.org/manual/game_engine/logic/sensors/collision.html>`_ sensor. .. example:: from morse.builder import * # adds a default robot (the MORSE mascott!) robot = Morsy() # create and add a Collision sensor collision = Collision() # place it on the front side of the robot collision.translate(0.43,0,0.3) # only detect collision with objects which have the property 'Object'. # see the documentation of `Passive Objects` for details: # http://www.openrobots.org/morse/doc/latest/user/others/passive_objects.html collision.properties(only_objects_with_property="Object") robot.append(collision) # for this example, we use the socket interface collision.add_interface("socket") # we also add a keyboard actuator to be able to move # around our robot to test collisions keyboard = Keyboard() robot.append(keyboard) # the 'sandbox' test environment offers plenty of objects to test # collisions. These objects have all the property 'Object' already set. env = Environment('sandbox') # Copy this code to a script, and run it with `morse run <script>`! .. example:: # This is a sample *client* code that uses pymorse to count the # collisions. Copy this code to a different script, start it with # `python3 <script>`, and move the robot in the simulator with the # arrow keys: when you collide with an object, it is printed on the # console. import pymorse nb_collisions = 0 def counter(data): global nb_collisions if data["collision"]: nb_collisions += 1 print("Collision with %s! In total, %d collisions occured" % (data["objects"], nb_collisions)) with pymorse.Morse() as morse: morse.robot.collision.subscribe(counter) print("Press ctrl+C to stop") while True: morse.sleep(10) :noautoexample: """ _name = "Collision" _short_desc = "Detect objects colliding with the current object." add_data('collision', False, "bool", "objects colliding with the current object") add_data('objects', "", "string", "A list of colliding objects.") # These properties are not used directly in the logic, but are used # in the builder to create the radar properly. # These value cannot be changed dynamically in bge. add_property('_collision_property', "", 'only_objects_with_property', 'string', 'Only report collision with objects that have this property, ' 'default "" (all objects)') def __init__(self, obj, parent=None): """ Constructor method. Receives the reference to the Blender object. The second parameter should be the name of the object's parent. """ logger.info('%s initialization' % obj.name) # Call the constructor of the parent class Sensor.__init__(self, obj, parent) logger.info('Component initialized, runs at %.2f Hz', self.frequency)
[docs] def default_action(self): """ Is currently in collision """ controller = blenderapi.controller() sensor = controller.sensors[-1] # see hitObjectList and hitObject for last collided object(s) # http://www.blender.org/api/blender_python_api_2_76_release/bge.types.KX_TouchSensor.html self.local_data['collision'] = sensor.positive self.local_data['objects'] = ','.join([o.name for o in sensor.hitObjectList])