Beispiel #1
0
int main(int argc, char **argv) {
	vec3 vector, vectorMultiplied;
	vec2 add;
	mat3x3 transform;

	vector.x = 3;
	vector.y = 0;
	vector.z = 1;

	add.x = 1000;
	add.y = 1000;

	printVec3(vector);

	vectorMultiplied = vector;
	mat3x3Identity(transform);
	mat3x3Rotate2D(transform, PI / 4);
	mat3x3Scale2D(transform, 2);
	mat3x3Translate(transform, add);

	printMat3x3(transform);

	printVec3(mat3x3GetCol(transform, 1));

	printf("Applying transformation matrix...\n\n");

	vectorMultiplied = mat3x3MultiplyVector(transform, vector);

	printVec3(vectorMultiplied);

	printf("Length: %.2f\n", vec2Length(vector.vec2));

	return 0;
}
Beispiel #2
0
void test_updateWheelContactGeom() {

	const Real rad = .325;
	WheelContactGeom contact;

	//terrain
	SurfaceVector surfs;

	//flat(surfs);
	//ramp(surfs);
	grid(surfs, ResourceDir() + std::string("gridsurfdata.txt") );
	
	
	//wheel pose
	HomogeneousTransform HT_wheel_to_world;
	VecOrient orient = {0,0,0}; //assume WMRSIM_USE_QUATERNION 0
	Vec3 pos = {2.5, -1.0, rad};

	//adjust height of wheel
	Real zsurf;
	surfacesHeight(surfs,pos,zsurf);
	pos[2] += zsurf;

	poseToHT(orient,pos,HT_wheel_to_world); //assumes WMRSIM_USE_QUATERNION 0

	updateWheelContactGeom(surfs, HT_wheel_to_world, rad, contact );

	//print
	std::cout << "wheel pos = \n";
	printVec3(pos,-1,-1);
	std::cout << "dz = " << contact.dz << std::endl;
	std::cout << "contact angle (deg)= " << RADTODEG(contact.angle) << std::endl;
	std::cout << "\nHT_contact_to_wheel=\n";
	printHT(contact.HT_wheel,-1,-1);
	std::cout << "\nHT_contact_to_world=\n";
	printHT(contact.HT_world,-1,-1);
	
	if (1) {
		//time it
		int nw = 4;
		timeval t0, t1;

		int n= (int) 1e5;

		gettimeofday(&t0, NULL);
		for (int i=0; i<n*nw; i++) {
			updateWheelContactGeom(surfs, HT_wheel_to_world, rad, contact );
		}
		gettimeofday(&t1, NULL);
		std::cout << "num wheels: " << nw << std::endl;
		std::cout << "iterations: " << (Real) n << std::endl;
		std::cout << "clock (sec): " << tosec(t1)-tosec(t0) << std::endl;
	}
}
Beispiel #3
0
void test_updateTrackContactGeom() {


	const Real rad = .2;
	const Real rad2 = .2;
	const Real L = .5;

	TrackContactGeom contact;
	initTrackContactGeom(rad,rad2,L,contact);
	const int np = contact.get_np();
	

	//terrain
	SurfaceVector surfs;

	//flat(surfs);
	//ramp(surfs);
	grid(surfs, ResourceDir() + std::string("gridsurfdata.txt") );

	//track pose
	HomogeneousTransform HT_track_to_world;
	VecOrient orient = {0,0,0}; //assume WMRSIM_USE_QUATERNION 0
	Vec3 pos = {3.0, 0, rad-.01};

	//adjust height of track
	Real zsurf;
	surfacesHeight(surfs,pos,zsurf);
	pos[2] += zsurf;

	poseToHT(orient,pos,HT_track_to_world); 

	updateTrackContactGeom(surfs, HT_track_to_world, contact );

	//print
	std::cout << "track pos = \n";
	printVec3(pos,-1,-1);
	std::cout << "dz=\n"; printMatReal(1,np,contact.dz,-1,-1); std::cout << std::endl;

}
Beispiel #4
0
void test_transform() {

	VecEuler euler;
	Vec3 translation;
	HomogeneousTransform HT,HT2;

	setEuler(DEGTORAD(10),DEGTORAD(20),DEGTORAD(30),euler);
	setVec3(1,2,3,translation);
	poseToHT(euler,translation,HT);

	std::cout << "HT=\n"; printHT(HT,-1,-1);
	

	//test rotation matrix
	Mat3 Rx,Ry,Rz,Rot,Tmp;

	Rotx(euler[0],Rx);
	Roty(euler[1],Ry);
	Rotz(euler[2],Rz);
	multMatMat3(Ry,Rx,Tmp);
	multMatMat3(Rz,Tmp,Rot);
	std::cout << "Rotz(yaw)*Roty(pit)*Rotx(rol)=\n"; printMat3(Rot,-1,-1);

	//test invert transform
	invertHT(HT,HT2);
	std::cout << "inv(HT)=\n"; printHT(HT2,-1,-1);

	//test compose HT
	if (1) {
		//time it

		int n = (int) 1e8;
		timeval t0, t1;

		//compose Homogeneous Transforms
		gettimeofday(&t0, NULL);
		for (int i=0; i<n; i++) { 
			composeHT(HT,HT,HT2);
		}
		gettimeofday(&t1, NULL);

		std::cout << "HT*HT=\n"; printHT(HT2,-1,-1);
	
		std::cout << "iterations: " << (Real) n << std::endl;
		std::cout << "clock (sec): " << tosec(t1)-tosec(t0) << std::endl;
	} else {
		composeHT(HT,HT,HT2);
		std::cout << "HT*HT=\n"; printHT(HT2,-1,-1);
	}

	composeInvHT(HT,HT,HT2);
	std::cout << "inv(HT)*HT=\n"; printHT(HT2,-1,-1);


	//test transform point
	Vec3 p,q;
	setVec3(2,3,4,p);

	std::cout << "p=\n"; printVec3(p,-1,-1);
	applyHT(HT,p,q);
	std::cout << "q=HT*p=\n";	printVec3(q,-1,-1);

	applyInvHT(HT,p,q);
	std::cout << "q=inv(HT)*p=\n"; printVec3(q,-1,-1);

	
	//test converting between angular velocity and Euler rates
	Vec3 vel={1,2,3};
	VecEuler eulerrate;
	MatEuler T;
	std::cout << "angular velocity=\n";	printVec3(vel,-1,-1);

	velToEulerrate(euler,vel,eulerrate,T);
	std::cout << "eulerrate=\n"; printEuler(eulerrate,-1,-1);
	std::cout << "T_vel_to_eulerrate=\n"; printMatReal(3,3,T,-1,-1);

	std::cout << "convert back:\n";
	eulerrateToVel(euler,eulerrate,vel,0);
	std::cout << "angular velocity=\n";	printVec3(vel,-1,-1);
	std::cout << std::endl;

	
	//test at singularity
	setEuler(0,M_PI/2,0,euler);
	setVec3(0,0,1,vel);
	velToEulerrate(euler,vel,eulerrate,T);
	std::cout << "test at singularity:\n";
	std::cout << "euler=\n"; printEuler(euler,-1,-1);
	std::cout << "angular velocity=\n"; printVec3(vel,-1,-1);
	std::cout << "eulerrate=\n"; printEuler(eulerrate,-1,-1);
	
}