Beispiel #1
0
int
main(int argc, char** argv)
{
	if (argc < 2)
	{
		std::cout << "Usage: rlJacobianDemo KINEMATICSFILE Q1 ... Qn QD1 ... QDn" << std::endl;
		return 1;
	}
	
	try
	{
		boost::shared_ptr< rl::kin::Kinematics > kinematics(rl::kin::Kinematics::create(argv[1]));
		
		rl::math::Vector q(kinematics->getDof());
		
		for (std::ptrdiff_t i = 0; i < q.size(); ++i)
		{
			q(i) = boost::lexical_cast< rl::math::Real >(argv[i + 2]);
		}
		
		rl::math::Vector qdot(kinematics->getDof());
		
		for (std::ptrdiff_t i = 0; i < qdot.size(); ++i)
		{
			qdot(i) = boost::lexical_cast< rl::math::Real >(argv[q.size() + i + 2]);
		}
		
		kinematics->setPosition(q);
		kinematics->updateFrames();
		kinematics->updateJacobian();
		
		std::cout << "J=" << std::endl << kinematics->getJacobian() << std::endl;
		
		rl::math::Vector xdot(kinematics->getOperationalDof() * 6);
		
		kinematics->forwardVelocity(qdot, xdot);
		
		std::cout << "xdot=" << std::endl;
		
		for (std::size_t i = 0; i < kinematics->getOperationalDof(); ++i)
		{
			std::cout << i << " " << xdot.transpose() << std::endl;
		}
		
		kinematics->updateJacobianInverse(1.0e-9f);
		
		std::cout << "invJ=" << std::endl << kinematics->getJacobianInverse() << std::endl;
		
		kinematics->inverseVelocity(xdot, qdot);
		
		std::cout << "qdot=" << std::endl << qdot.transpose() << std::endl;
	}
	catch (const std::exception& e)
	{
		std::cout << e.what() << std::endl;
		return 1;
	}
	
	return 0;
}
    void GeneralisedCoordinatesFromStorageFile::updateKinematicsSplines(double fc) {

        //reinitialise because I modify the storage with padding and filtering..
        OpenSim::Storage kinematics(kinematicsStorageFilename_);
        if (fc > 0) {
            kinematics.pad(kinematics.getSize() / 2.);
            kinematics.lowpassIIR(fc);
        }
        if (kinematics.isInDegrees()){
            model_.getSimbodyEngine().convertDegreesToRadians(kinematics);
        }
        // Create differentiable splines of the coordinate data
        OpenSim::GCVSplineSet kinematicsSplines(5, &kinematics);
        //Functions must correspond to model coordinates and their order for the solver
        OpenSim::Array<string> coordinateNamesOS;
        model_.getCoordinateSet().getNames(coordinateNamesOS);
        for (size_t i(0); i < coordinateNamesOS.getSize(); ++i){
            if (kinematicsSplines.contains(coordinateNamesOS.get(i))){
                kinematicsSplines.insert(i, kinematicsSplines.get(coordinateNamesOS.get(i)));
            }
            else{
                kinematicsSplines.insert(i, OpenSim::Constant(model_.getCoordinateSet().get(i).getDefaultValue()));
            }
        }
        if (kinematicsSplines.getSize() > coordinateNamesOS.getSize()){
            kinematicsSplines.setSize(coordinateNamesOS.getSize());
        }
        splines_ = kinematicsSplines;
    }
double CTRCalibration::ComputeErrorOnValidationSet(double& max_error, int& max_ID)
{
	CTR* robot = CTRFactory::buildCTR("");
	SetParamsToCTR(robot, m_params);
	MechanicsBasedKinematics kinematics(robot, m_numOfGridPoints);
	kinematics.ActivateIVPJacobian();

	double error = 0.0;
	double tmp = 0.0;
	double max_error_current = 0.0;
	int counter = 0;
	//for (int i = 0; i < m_validationSet.size(); i++)
	for (int i = m_validationSet.size() -1; i >=0 ; i--)
	{
		tmp = ComputeSingleShapeError(robot, &kinematics, m_validationSet[i], max_error_current);
		if (tmp < 0)
			continue;
		else
		{
			error += tmp;
			counter++;

			//::std::cout << i << "-th conf: " << tmp << ::std::endl;
			
			::Eigen::Vector3d position;
			kinematics.GetTipPosition(position);
			m_stream_val << i << "\t" << tmp << "\t" << position.transpose() << ::std::endl;
			
		}

		if (max_error_current > max_error)
		{
			max_error = max_error_current;
			max_ID = i;
			//::std::cout << "id: " << i << ", conf: ";
			//for (int k = 0 ; k < 5; k++)
			//	::std::cout << dataset[i].GetConfiguration()[k] << "	";
			//::std::cout << ::std::endl;
		}
	}

	delete robot;

	return ::std::sqrt(error/counter);
}
    GeneralisedCoordinatesFromStorageFile::GeneralisedCoordinatesFromStorageFile(
        GeneralisedCoordinatesQueue& outputGeneralisedCoordinatesQueue,
        rtb::Concurrency::Latch& doneWithSubscriptions,
        rtb::Concurrency::Latch& doneWithExecution,
        const std::string& osimModelFilename,
        const std::string& kinematicsStorageFilename,
        double fc) :
        GeneralisedCoordinatesFromX(outputGeneralisedCoordinatesQueue, doneWithSubscriptions, doneWithExecution),
        model_(osimModelFilename),
        kinematicsStorageFilename_(kinematicsStorageFilename) {

        //for some mysterious reason, if I don't use c_str it doesn't work..
        OpenSim::Storage kinematics(kinematicsStorageFilename_.c_str());
        OpenSim::Array<double> timeColumnOS;
        kinematics.getTimeColumn(timeColumnOS);
        ArrayConverter::toStdVector(timeColumnOS, timeColumn_);
        updateKinematicsSplines(fc);
        OpenSim::Array<string> coordinateNamesOS;
        model_.getCoordinateSet().getNames(coordinateNamesOS);
        ArrayConverter::toStdVector(coordinateNamesOS, coordinateNamesFromOsimModel_);
        mapper_.setNames(coordinateNamesFromOsimModel_, coordinateNamesFromOsimModel_);
    }
    void run()
    {
        
        // load model and data
        OpenSim::Model model(m_model_path);

        OpenSim::MarkerData imu_trc(m_imu_path);

        SimTK::State& state = model.initSystem();

        // setup
        SimTK::Assembler ik(model.updMultibodySystem());
        ik.setAccuracy(1e-5);
        SimTK::Markers* markers = new SimTK::Markers();
        SimTK::OrientationSensors* imus = new SimTK::OrientationSensors();
    
        // add markers
        addCustomMarkers(model, *markers, *imus);   
    
        // result storage
        OpenSim::Kinematics kinematics(&model);
        kinematics.setRecordAccelerations(true);

        // move to initial target
        ik.adoptAssemblyGoal(imus);
        imus->moveOneObservation(m_humerus_ox, SimTK::Rotation(
            SimTK::BodyOrSpaceType::BodyRotationSequence,
            imu_trc.getFrame(0).getMarker(0)[0], SimTK::XAxis,
            imu_trc.getFrame(0).getMarker(0)[1], SimTK::YAxis,
            imu_trc.getFrame(0).getMarker(0)[2], SimTK::ZAxis));
        imus->moveOneObservation(m_radius_ox, SimTK::Rotation(
            SimTK::BodyOrSpaceType::BodyRotationSequence,
            imu_trc.getFrame(0).getMarker(1)[0], SimTK::XAxis,
            imu_trc.getFrame(0).getMarker(1)[1], SimTK::YAxis,
            imu_trc.getFrame(0).getMarker(1)[2], SimTK::ZAxis));

        // setup inverse kinematics
        state.setTime(imu_trc.getFrame(0).getFrameTime());
        ik.initialize(state);
        ik.assemble(state);
        kinematics.begin(state);

        // loop for every observation frame (!!!must be same length)
        for (int i = 1; i < imu_trc.getNumFrames(); ++i)
        {        
            OpenSim::MarkerFrame osensor_frame = imu_trc.getFrame(i);
            SimTK::Vec3 humerus_vec = osensor_frame.getMarker(0);
            imus->moveOneObservation(m_humerus_ox, SimTK::Rotation(
                SimTK::BodyOrSpaceType::BodyRotationSequence,
                humerus_vec[0], SimTK::XAxis,
                humerus_vec[1], SimTK::YAxis,
                humerus_vec[2], SimTK::ZAxis));
            SimTK::Vec3 radius_vec = osensor_frame.getMarker(1);
            imus->moveOneObservation(m_radius_ox, SimTK::Rotation(
                SimTK::BodyOrSpaceType::BodyRotationSequence,
                radius_vec[0], SimTK::XAxis,
                radius_vec[1], SimTK::YAxis,
                radius_vec[2], SimTK::ZAxis));

            // track
            state.updTime() = osensor_frame.getFrameTime();
            ik.track(state.getTime());
            ik.updateFromInternalState(state);

            // report
    #ifdef DEBUG
            std::cout << "Frame: " << i << " (t=" << state.getTime() << ")\n";
            std::cout << "Error: " << ik.calcCurrentErrorNorm() << "\n";
            std::flush(std::cout);
    #endif

            // store
            kinematics.step(state, i);
        }
        kinematics.end(state);

        // store results
        kinematics.printResults(m_ik_result_path, "");
    }
Beispiel #6
0
int
main(int argc, char** argv)
{
	if (argc < 3)
	{
		std::cout << "testPrm SCENEFILE KINEMATICSFILE START1 ... STARTn GOAL1 ... GOALn" << std::endl;
		return 1;
	}
	
	rl::sg::solid::Scene scene;
	scene.load(argv[1]);
	
	::boost::shared_ptr< ::rl::kin::Kinematics > kinematics(::rl::kin::Kinematics::create(argv[2]));
	
	rl::plan::SimpleModel model;
	model.kinematics = kinematics.get();
	model.model = scene.getModel(0);
	model.scene = &scene;
	
	rl::plan::Prm planner;
	rl::plan::UniformSampler sampler;
	rl::plan::RecursiveVerifier verifier;
	
	planner.model = &model;
	planner.sampler = &sampler;
	planner.verifier = &verifier;
	
	sampler.model = &model;
	
	verifier.delta = 1.0f * rl::math::DEG2RAD;
	verifier.model = &model;
	
	rl::math::Vector start(kinematics->getDof());
	
	for (std::size_t i = 0; i < kinematics->getDof(); ++i)
	{
		start(i) = boost::lexical_cast< rl::math::Real >(argv[i + 3]);
	}
	
	planner.start = &start;
	
	rl::math::Vector goal(kinematics->getDof());
	
	for (std::size_t i = 0; i < kinematics->getDof(); ++i)
	{
		goal(i) = boost::lexical_cast< rl::math::Real >(argv[kinematics->getDof() + i + 3]);
	}
	
	planner.goal = &goal;
	
	rl::util::Timer timer;
	
	std::cout << "construct() ... " << std::endl;;
	timer.start();
	planner.construct(15);
	timer.stop();
	std::cout << "construct() " << timer.elapsed() * 1000.0f << " ms" << std::endl;
	
	std::cout << "solve() ... " << std::endl;;
	timer.start();
	bool solved = planner.solve();
	timer.stop();
	std::cout << "solve() " << (solved ? "true" : "false") << " " << timer.elapsed() * 1000.0f << " ms" << std::endl;
	
	return 0;
}
Beispiel #7
0
int
main(int argc, char** argv)
{
	if (argc < 3)
	{
		std::cout << "Usage: rlRrtDemo SCENEFILE KINEMATICSFILE START1 ... STARTn GOAL1 ... GOALn" << std::endl;
		return EXIT_FAILURE;
	}
	
	try
	{
		rl::sg::XmlFactory factory;
#if defined(RL_SG_SOLID)
		rl::sg::solid::Scene scene;
#elif defined(RL_SG_BULLET)
		rl::sg::bullet::Scene scene;
#elif defined(RL_SG_ODE)
		rl::sg::ode::Scene scene;
#endif
		factory.load(argv[1], &scene);
		
		std::shared_ptr<rl::kin::Kinematics> kinematics(rl::kin::Kinematics::create(argv[2]));

		rl::plan::SimpleModel model;
		model.kin = kinematics.get();
		model.model = scene.getModel(0);
		model.scene = &scene;
		
		rl::plan::KdtreeNearestNeighbors nearestNeighbors0(&model);
		rl::plan::KdtreeNearestNeighbors nearestNeighbors1(&model);
		rl::plan::RrtConCon planner;
		rl::plan::UniformSampler sampler;
		
		planner.model = &model;
		planner.setNearestNeighbors(&nearestNeighbors0, 0);
		planner.setNearestNeighbors(&nearestNeighbors1, 1);
		planner.sampler = &sampler;
		
		sampler.model = &model;
		
		planner.delta = 1 * rl::math::DEG2RAD;
		
		rl::math::Vector start(kinematics->getDof());
		
		for (std::size_t i = 0; i < kinematics->getDof(); ++i)
		{
			start(i) = boost::lexical_cast<rl::math::Real>(argv[i + 3]) * rl::math::DEG2RAD;
		}
		
		planner.start = &start;
		
		rl::math::Vector goal(kinematics->getDof());
		
		for (std::size_t i = 0; i < kinematics->getDof(); ++i)
		{
			goal(i) = boost::lexical_cast<rl::math::Real>(argv[kinematics->getDof() + i + 3]) * rl::math::DEG2RAD;
		}
		
		planner.goal = &goal;
		
		std::cout << "start: " << start.transpose() * rl::math::RAD2DEG << std::endl;;
		std::cout << "goal: " << goal.transpose() * rl::math::RAD2DEG << std::endl;;
		
		std::cout << "solve() ... " << std::endl;;
		std::chrono::steady_clock::time_point startTime = std::chrono::steady_clock::now();
		bool solved = planner.solve();
		std::chrono::steady_clock::time_point stopTime = std::chrono::steady_clock::now();
		std::cout << "solve() " << (solved ? "true" : "false") << " " << std::chrono::duration_cast<std::chrono::duration<double>>(stopTime - startTime).count() * 1000 << " ms" << std::endl;
		
		return EXIT_SUCCESS;
	}
	catch (const std::exception& e)
	{
		std::cerr << e.what() << std::endl;
		return EXIT_FAILURE;
	}
}
Beispiel #8
0
/*
 * This is the constraint that makes sure we hit the ball
 */
void kinematics_eq_constr(unsigned m, double *result, unsigned n, const double *x, double *grad, void *data) {

	static double ballPred[CART];
	static double racketDesVel[CART];
	static double racketDesNormal[CART];
	static Matrix  link_pos_des;
	static Matrix  joint_cog_mpos_des;
	static Matrix  joint_origin_pos_des;
	static Matrix  joint_axis_pos_des;
	static Matrix  Alink_des[N_LINKS+1];
	static Matrix  racketTransform;
	static Matrix  Jacobi;
	static Vector  qfdot;
	static Vector  xfdot;
	static Vector  normal;
	static int     firsttime = TRUE;

	double T = x[2*DOF];
	int N = T/TSTEP;
	int i;

	/* initialization of static variables */
	if (firsttime) {
		firsttime = FALSE;

		link_pos_des         = my_matrix(1,N_LINKS,1,3);
		joint_cog_mpos_des   = my_matrix(1,N_DOFS,1,3);
		joint_origin_pos_des = my_matrix(1,N_DOFS,1,3);
		joint_axis_pos_des   = my_matrix(1,N_DOFS,1,3);
		Jacobi               = my_matrix(1,2*CART,1,N_DOFS);
		racketTransform      = my_matrix(1,4,1,4);
		qfdot                = my_vector(1,DOF);
		xfdot                = my_vector(1,2*CART);
		normal               = my_vector(1,CART);

		for (i = 0; i <= N_LINKS; ++i)
			Alink_des[i] = my_matrix(1,4,1,4);

		// initialize the base variables
		//taken from ParameterPool.cf
		bzero((void *) &base_state, sizeof(base_state));
		bzero((void *) &base_orient, sizeof(base_orient));
		base_orient.q[_Q1_] = 1.0;

		// the the default endeffector parameters
		setDefaultEndeffector();

		// homogeneous transform instead of using quaternions
		racketTransform[1][1] = 1;
		racketTransform[2][3] = 1;
		racketTransform[3][2] = -1;
		racketTransform[4][4] = 1;
	}

	if (grad) {
		// compute gradient of kinematics = jacobian
		//TODO:
		grad[0] = 0.0;
		grad[1] = 0.0;
		grad[2] = 0.0;
	}

	// interpolate at time T to get the desired racket parameters
	first_order_hold(ballPred,racketDesVel,racketDesNormal,T);

	// extract state information from array to joint_des_state structure
	for (i = 1; i <= DOF; i++) {
		joint_des_state[i].th = x[i-1];
		joint_des_state[i].thd = qfdot[i] = x[i-1+DOF];
	}

	/* compute the desired link positions */
	kinematics(joint_des_state, &base_state, &base_orient, endeff,
			           joint_cog_mpos_des, joint_axis_pos_des, joint_origin_pos_des,
			           link_pos_des, Alink_des);


	/* compute the racket normal */
	mat_mult(Alink_des[6],racketTransform,Alink_des[6]);
	for (i = 1; i <= CART; i++) {
		normal[i] = Alink_des[6][i][3];
	}

	/* compute the jacobian */
	jacobian(link_pos_des, joint_origin_pos_des, joint_axis_pos_des, Jacobi);
	mat_vec_mult(Jacobi, qfdot, xfdot);

	/* deviations from the desired racket frame */
	for (i = 1; i <= CART; i++) {
		//printf("xfdot[%d] = %.4f, racketDesVel[%d] = %.4f\n",i,xfdot[i],i,racketDesVel[i-1]);
		//printf("normal[%d] = %.4f, racketDesNormal[%d] = %.4f\n",i,normal[i],i,racketDesNormal[i-1]);
		result[i-1] = link_pos_des[6][i] - ballPred[i-1];
		result[i-1 + CART] = xfdot[i] - racketDesVel[i-1];
		result[i-1 + 2*CART] = normal[i] - racketDesNormal[i-1];
	}

}