Controller module

In this tutorial you will learn how to: - Modify the PyBullet joint controller - Modify our neural controller - Incorporate customized controllers

Modifying the PyBullet joint controller

We use two control modes in our experiments to actuate NeuroMechFly’s joints:

Position control

This mode is used in our Kinematic Replay experiments. It takes as inputs angular positions for each joint. There are certain parameters that can be modified such as the controller gains (Kp and Kd). Please refer to the environment tutorial to learn how to change these parameters when initializing the simulation.

Torque control

This mode is used in our Optimization experiments. It takes as inputs torques computed from our muscles model to actuate each joint. Please refer to the muscles tutorial to learn how these models can be modified.

Modifying our neural controller

Our neural controller is a network of coupled oscillators whose parameters are optimized using a multi-objective genetic algorithm. You can either modify the network architecture to explore different behaviors, or reformulate the objective functions and penalties in our optimization framework to evaluate their importance over generations.

Modifying the network of coupled oscillators

Our network was created using the NetworkX Python package. Please refer to their documentation for a full description of how to create a network. We define our architecture in the script data/locomotion_network/locomotion.py. When running this script, a configuration file named locomotion_network.graphml is created in the config/network/ folder. This file contains the network description defining its nodes, edges, phases, and weights. You can refer to the comments in the locomotion.py script to learn how to modify the network’s architecture.

NOTE: If you modify the architecture, make sure to update its parameters accordingly in the script NeuroMechFly/experiments/network_optimization/neuromuscular_control.py. Also, be sure to update the optimization framework if neccesary in the script NeuroMechFly/experiments/network_optimization/multiobj_optimization.py.

Formulating new objective functions and penalties

We defined two objective functions: locomotor speed and static stability. Furthermore, we added four penalties to those functions: a moving boundary, an angular velocity limit, a range of motion limit, and a duty-factor range. Please refer to our related publication for a full description.

These objective functions and penalties are implemented in the script NeuroMechFly/experiments/network_optimization/neuromuscular_control.py. You can refer to the docstrings in that script to learn how to modify them.

On the other hand, you can always define completely new objective functions and penalties. In that case, you would need to add them to the optimization framework in the script NeuroMechFly/experiments/network_optimization/multiobj_optimization.py.

Incorporating customized controllers

You can also incorporate a completely different neural controller into NeuroMechFly (e.g., a Hodgkin-Huxley model). You would need to implement your own script to compute your preferred model, or you can also check FARMS Network to learn how to design new neural network controllers. However, once you have your neural controller, you can use our other three modules (muscles, biomechanical, and environment) to run a complete simulation. The requirements for using NeuroMechFly are as follows:

Using muscles, biomechanical, and environment modules

  • The output of your neural controller should be a motor neuron-like activity function: our muscle model computes torques based on this kind of signal. For example, the output of a CPG-like function from a network of coupled oscillators. This output is stored using the Container class and loaded to the muscles during initialization in the script NeuroMechFly/experiments/network_optimization/neuromuscular_control.py. Please, refer to FARMS container to learn how to use the Container class.

Using biomechanical, and environment modules

  • The output of your neural controller should be torques or angular positions for each joint. In this case you can choose between either of the control modes explained above (i.e., position or torque mode). Refer to those sections to learn how to test your neural controller with our biomechanical model within its environment.