Cortical model with reinforcement learning drives realistic virtual arm (Dura-Bernal et al 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:183014
We developed a 3-layer sensorimotor cortical network of consisting of 704 spiking model-neurons, including excitatory, fast-spiking and low-threshold spiking interneurons. Neurons were interconnected with AMPA/NMDA, and GABAA synapses. We trained our model using spike-timing-dependent reinforcement learning to control a virtual musculoskeletal human arm, with realistic anatomical and biomechanical properties, to reach a target. Virtual arm position was used to simultaneously control a robot arm via a network interface.
References:
1 . Dura-Bernal S, Zhou X, Neymotin SA, Przekwas A, Francis JT, Lytton WW (2015) Cortical Spiking Network Interfaced with Virtual Musculoskeletal Arm and Robotic Arm. Front Neurorobot 9:13 [PubMed]
2 . Dura-Bernal S, Li K, Neymotin SA, Francis JT, Principe JC, Lytton WW (2016) Restoring Behavior via Inverse Neurocontroller in a Lesioned Cortical Spiking Model Driving a Virtual Arm. Front Neurosci 10:28 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism:
Cell Type(s): Neocortex M1 L5B pyramidal pyramidal tract GLU cell; Neocortex M1 L2/6 pyramidal intratelencephalic GLU cell; Neocortex M1 interneuron basket PV GABA cell; Neocortex fast spiking (FS) interneuron; Neostriatum fast spiking interneuron; Neocortex spiking regular (RS) neuron; Neocortex spiking low threshold (LTS) neuron;
Channel(s):
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s): Gaba; Glutamate;
Simulation Environment: NEURON; Python (web link to model);
Model Concept(s): Synaptic Plasticity; Learning; Reinforcement Learning; STDP; Reward-modulated STDP; Sensory processing; Motor control; Touch;
Implementer(s): Neymotin, Sam [Samuel.Neymotin at nki.rfmh.org]; Dura, Salvador [ salvadordura at gmail.com];
Search NeuronDB for information about:  Neocortex M1 L2/6 pyramidal intratelencephalic GLU cell; Neocortex M1 L5B pyramidal pyramidal tract GLU cell; Neocortex M1 interneuron basket PV GABA cell; GabaA; AMPA; NMDA; Gaba; Glutamate;
#include <Math/MathHeaders.h>
#include <Multibody/MultibodyHeaders.h>
#include <BodyController/ControllerHeaders.h>
#include <OsgVisualization/OsgVizHeaders.h>

#include <Utils/Notify.h>
#include <FileIO/AtbTestBuilder.h>
#include <FileIO/ForceTestBuilder.h>

#include <iostream>
#include <iomanip>
#include "LSODAIntegrator2.h"

#include <FileIO/ControlledMbdSimulation.h>


#ifdef STATIC_CALLHACK
	Extern_Static_Call_Hack(CoordinateOutputEventHandler);
	//Extern_Static_Call_Hack(MuscleStatusEventHandler);
	Extern_Static_Call_Hack(MuscleExcitationSetterEventHandler);
#endif

int testFwdDynXML(int argc, char** argv)
{
	using namespace mf_mbd;

	const Real PI = 3.141592653589793238462643;

	try {

		if(argc == 1){
			throw std::runtime_error("Please specify the input file name");
		}

		std::string filename(argv[1]);
		
		ControlledMbdSimulation sim;
		//MbdSimulation sim;

		// read xml file
		sim.readFromFile(filename);

		sim.initBeforeRun();

		std::cout << "READY TO RUN" << std::endl;

		sim.run();

	}
	catch(std::exception& ex) {			//in case there is an error on the sim file, Cobi will stop
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}	

	return 0;
}

int main(int argc, char** argv){

	/*Turns out that the object files containing the static initializers 
	 were not included by the linker because nothing referenced any functions in them. 
	 Therefore we need the line below for now, how to solve this????
	 Use Library Dependency Inputs set to yes fixed this problem
	*/

	try{
		//SLog::getLog().setOutputFile("log.txt");
		mf_mbd::IntegratorCreator::getFactoryReg()->regist("LSODAIntegrator2", &Math::User::LSODAIntegrator2<VecN>::createInstance);
		testFwdDynXML(argc,argv);
	}
	catch(std::exception& ex) {			//in case there is an error on the sim file, Cobi will stop
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}	

	return 0;
}

Loading data, please wait...