Odor Sensor

Watch the video tutorial on using and detecting odors!


AnimatLab allows you to place odor emitters within the virtual world. In fact, any of the main rigid body parts like box and cone can emit an odor. This means that you are not limited to having a simple, non-moving piece of food that can emit an odor. You can have a part of the body of the organism emit an odor that other organisms can smell. This makes it possible to simulate social behaviors that use chemical communication. It would be possible to have 2 ant nests with 50 ants in each. Ants within the same nests would recognize each other from their odor and get along. Unrecognized ants, like those in the other nest, would be aggressively attacked and the nests could compete over food sources. This is one example of how you could use odor sources. Other uses would be for finding food and for mating. Here we will describe how to add odor emitters to your neuromechanical simulation, and how to add odor sensors to your biomechanical organisms to detect the odors and control their behavior.

How Do Odors Work In AnimatLab?

Figure 1. Edit Odors Dialog.

To add an odor emitter select a rbody part while in the biomechanical editor and click on its Odor Sources property. This will open the Edit Odors dialog shown above in figure 1. This dialog allows you to add odors to the selected body part. On the left side is a list of all defined odor types in this virtual world. You can have as many defined odor types as you want, and any part can emit any combination of these odors at different strengths. Click the Add Odor Type button to add a new type, and the Remove Odor Type button to remove an existing type and all instances where it has been used in the virtual world. Odor type has only two properties, name and diffusion constant. The diffusion Constant describes how fast the odor moves and how strong it will be at a distance. If it has a larger diffusion constant then it will be easier to smell it at a larger distance.

Once you have your odor types defined though you still need to specify which ones you want this part to emit. You can do this by moving odor types over into the odor source list using the left and right arrow buttons. This allows you to configure this part to emit different combinations of odors. Each body part has a different list of odor sources that it can emit. An odor source has two properties in addition to the odor type. The first is the quantity of this odor chemical. If you have configured this part to emit different odor types you can change the quantity values of each one so they emit those odors in different strengths. The second determines if the odor quantity should be determined by the food quantity value of this part. If you set this to true then the quantity of the odor becomes read-only. This allows you to directly couple the strength of an odor source to the amount of food at that source.

Now that you have odor emitters you need to be able to detect odors and use that to modify behavior. This is accomplished by adding odor sensors to your biomechanical organism. You do this like adding any other part. Select the odor sensor as the default body part and add it to any existing part. You can position the sensor anywhere on the part and the relative location and orientation of the sensor is maintained while the animal moves in the virtual world. So if you put it on the end of an antenna, then even if that antenna is bent the sensor will stay in the same place relative the end of the antenna. The most important property for the odor sensor is the odor type it can detect. This property gives a list of all odor types that have been defined in the virtual world. Select the one you want and this sensor will provide you with the strength of the detected odor for that odor type.

Figure 2. Food Odor Sensors. How the odor strength is calculated at a food odor sensor.

How is the odor detected? AnimatLab uses a very simple linear gradient model for smells. You can add odor sensors anywhere on the body of your biomechanical organism. That sensor can detect the strength of a specific odor type from anywhere in the virtual world. It detects this odor from all sources that emit this odor anywhere in the virtual world. The strength of the odor it detects though depends on a number of factors. The first is how far away the odor is from the sensor. The strength of the odor declines proportional to the inverse of the square distance from the source. So the farther away it is from the source the less it will be able to smell that source. A second factor is the diffusion constant defined for this odor type. If you define a large constant then it will be easier to smell this source from farther away. The third factor is how large of a supply of this odorant there is at the source. If you have a massive amount of this chemical then more of it will diffuse and the stronger the odor will be. This is determined by the quantity value you defined for this odor when you added it to the source part. AnimatLab knows where every odor emitter is located in the virtual world and calculates a strength for each of these sources and then adds them together to get a total strength for that sensor. So the strength of the odor the sensor detects is the summation of all the strengths for this odor throughout the entire virtual world.

In reality, this is very simplistic compared to what happens in nature. Odorants do not move in straight lines, and do not diffuse in nice gradients. Typically, winds and vortices swirl the odorants up so that the odor sensors of real animals only get intermittent sniffs of the odor that end up looking almost random. It is still not known how animals can actually follow this very complex and seemingly random path of odorants back to their source. There is a great deal of active research going on to try and unravel this question. Unfortunately, this level of complexity was simply too much to add into AnimatLab, so we decided to use this simpler model for the moment. It is far less realistic than what happens in the real world, but it can be useful if you are interested more in the overall behaviors that the odors elicit than in the specifics of how they detect the odors and use those to track prey or mates.

Transducing Odor Signals

Figure 3. Transducing odor signal into neural signal.

The odor sensor provides a strength signal for a specific odor type, but how do you get this information into your neural network? As usual when dealing with sensory or motor systems the answer to this is an adapter. In your diagram you need to add an odor sensor node and then draw a connection from it to a neuron. An adapter will automatically be added between the two nodes. The adapter will translate the odor strength into a synaptic current that will be injected into the neuron. You should setup the gain function of the adapter so that at a given odor strength it will produce a desired depolarization of the neuron. Keep in mind that you can use the adapter gain to have odor sensors that have different dynamic ranges. For example, you might want a short range sensor that has a low gain so it is not saturated by the odor at short ranges. While you might also need another sensor that has a high gain to detect odors at longer distances. You can manipulate the gains to provide this type of feature.

Odor Type Properties

Diffusion Constant
Describes how fast this odor spreads and how strong it will be at different distances.
Default value: 1 m2/s
Acceptable range: Any value grater than 0
Name
Name of this odor type.
Default value: New Odor
Acceptable range: Any String

Odor Properties

Diffusion Constant
Describes how fast this odor spreads and how strong it will be at different distances.
Default value: 1 m2/s
Acceptable range: Any value grater than 0
Name
Name of this odor type.
Default value: New Odor
Acceptable range: Any String
Quantity
The amount of this odorant there is at the source.
Default value: 100
Acceptable range: Any value greater than or equal to 0

Odor Sensor Properties

Location Local
The location of the body relative to it's own origin.  Each body part has it's own local coordinate system which is the center of the body's parent body part.. 
Default value:  (0,0,0) 
Acceptable range: -infinity - infinity

Location World
The location of the body relative to the world origin.  The world origin is center of the root body

Default value:  The distance from the center of the root body part 
Acceptable range:  -infinity - infinity

Color
The color of the body.  The user can enter a color value using R (Red) G (Green) B (Blue) values or they can use the color chooser.   To use the color chooser, click on the color property and a dropdown arrow will appear.  .  Click the drop down arrow to open up the color chooser and then select the desired color.


Default value:  Red (255, 0, 0)
Acceptable range:  R: 0 - 255, G: 0 - 255, B: 0 - 255;

Name
The name of this body
Default value:  If it is the first body in an organism, "root".  Otherwise the name is "body_xx" where xx is the number in which the body was added.

Odor Type
A drop-down list that lets you select the type of odor that this sensor will detect.

Transparency
The transparency value determines how transparent a body part is.  The higher the transparency value the more transparent a body will be.  1 is fully transparent and 0 is fully opaque.
Default value: 0 (opaque)
Acceptable range: 0 - 1

Visible
Determines if this body is visible within the simulation. If you set this value to false then this body will still be included in the simulation and any dynamics related to this object will still be calculated, but no graphics will be generated for the user. This property does not effect visibility in the editor. If you wish to make something invisible in the editor then you will need to use the alpha value described above.
Default value:  True
Acceptable values:  True, False

Radius
The radius of the mouth.  This value can be directly entered by the user or they can use the mouse by clicking on the curved portion of the cylinder and dragging the mouse to the desired radius.
Default value:  1 cm
Acceptable range:  any number greater than zero