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.
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
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
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
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.
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.
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.
Default value: Red (255, 0, 0)
Acceptable range: R: 0 - 255, G: 0 - 255, B: 0 - 255;
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
A drop-down list that lets you select the type of odor that this sensor will detect.
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
Default value: 0 (opaque)
Acceptable range: 0 - 1
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
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
This project was supported by: