예제 #1
0
void Contoller::initForVC(string virtualImg)
{
	USING_VIRTUAL_CAMERA = 1;
	vc = VirtualCamera(mdi, virtualImg);//初始化虚拟相机
	OutPutDebugInfo("相机&采集卡初始化完成!");
}
SimulatedIAUV::SimulatedIAUV(SceneBuilder *oscene, Vehicle vehicleChars) : urdf(new URDFRobot(oscene->scene->getOceanScene(),vehicleChars)) {
	name=vehicleChars.name;
	baseTransform=new osg::MatrixTransform;

	if(urdf->baseTransform!=NULL /* && arm->baseTransform!=NULL*/ ){
		baseTransform->addChild(urdf->baseTransform);
		baseTransform->setName(vehicleChars.name);
	}

	//Add virtual  cameras in config file
	while(vehicleChars.Vcams.size() > 0){
		Vcam vcam=vehicleChars.Vcams.front();
		OSG_INFO << "Adding a virtual camera " << vcam.name << "..." << std::endl;
		vehicleChars.Vcams.pop_front();
		//Camera frame given wrt vehicle origin frame.
		//Remember that in opengl/osg, the camera frame is a right-handed system with Z going backwards (opposite to the viewing direction) and Y up.
		osg::ref_ptr<osg::Transform> vMc=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMc->asPositionAttitudeTransform()->setPosition(osg::Vec3d(vcam.position[0],vcam.position[1],vcam.position[2]));
		vMc->asPositionAttitudeTransform()->setAttitude(osg::Quat(vcam.orientation[0],osg::Vec3d(1,0,0),vcam.orientation[1],osg::Vec3d(0,1,0), vcam.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[vcam.link]->asGroup()->addChild(vMc);
		camview.push_back(VirtualCamera(oscene->root, vcam.name, vMc, vcam.resw, vcam.resh, vcam.baseLine, vcam.frameId, vcam.parameters.get(),0));
		if (vcam.showpath) camview[camview.size()-1].showPath(vcam.showpath);
		OSG_INFO << "Done adding a virtual camera..." << std::endl;
	}

	//Add virtual range cameras in config file
	while(vehicleChars.VRangecams.size() > 0){
		Vcam vcam=vehicleChars.VRangecams.front();
		OSG_INFO << "Adding a virtual camera " << vcam.name << "..." << std::endl;
		vehicleChars.VRangecams.pop_front();
		//Camera frame given wrt vehicle origin frame.
		//Remember that in opengl/osg, the camera frame is a right-handed system with Z going backwards (opposite to the viewing direction) and Y up.
		osg::ref_ptr<osg::Transform> vMc=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMc->asPositionAttitudeTransform()->setPosition(osg::Vec3d(vcam.position[0],vcam.position[1],vcam.position[2]));
		vMc->asPositionAttitudeTransform()->setAttitude(osg::Quat(vcam.orientation[0],osg::Vec3d(1,0,0),vcam.orientation[1],osg::Vec3d(0,1,0), vcam.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[vcam.link]->asGroup()->addChild(vMc);
		camview.push_back(VirtualCamera(oscene->root, vcam.name, vMc, vcam.resw, vcam.resh, vcam.baseLine, vcam.frameId, vcam.parameters.get(),1));
		if (vcam.showpath) camview[camview.size()-1].showPath(vcam.showpath);
		OSG_INFO << "Done adding a virtual camera..." << std::endl;
	}

	//Adding range sensors
	while(vehicleChars.range_sensors.size() > 0){
		OSG_INFO << "Adding a virtual range sensor..." << std::endl;
		rangeSensor rs;
		rs=vehicleChars.range_sensors.front();
		vehicleChars.range_sensors.pop_front();
		osg::ref_ptr<osg::Transform> vMr=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMr->asPositionAttitudeTransform()->setPosition(osg::Vec3d(rs.position[0],rs.position[1],rs.position[2]));
		vMr->asPositionAttitudeTransform()->setAttitude(osg::Quat(rs.orientation[0],osg::Vec3d(1,0,0),rs.orientation[1],osg::Vec3d(0,1,0), rs.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[rs.link]->asGroup()->addChild(vMr);
		range_sensors.push_back(VirtualRangeSensor(rs.name, oscene->scene->localizedWorld, vMr, rs.range, (rs.visible)? true:false));
		OSG_INFO << "Done adding a virtual range sensor..." << std::endl;
	}

	//Adding imus
	while(vehicleChars.imus.size() > 0){
		OSG_INFO << "Adding an IMU..." << std::endl;
		Imu imu;
		imu=vehicleChars.imus.front();
		vehicleChars.imus.pop_front();
		osg::ref_ptr<osg::Transform> vMi=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMi->asPositionAttitudeTransform()->setPosition(osg::Vec3d(imu.position[0],imu.position[1],imu.position[2]));
		vMi->asPositionAttitudeTransform()->setAttitude(osg::Quat(imu.orientation[0],osg::Vec3d(1,0,0),imu.orientation[1],osg::Vec3d(0,1,0), imu.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[imu.link]->getParent(0)->getParent(0)->asGroup()->addChild(vMi);
		imus.push_back(InertialMeasurementUnit(imu.name, vMi, oscene->scene->localizedWorld->getMatrix(), imu.std));
		OSG_INFO << "Done adding an IMU..." << std::endl;
	}

	//Adding pressure sensors
	while(vehicleChars.pressure_sensors.size() > 0){
		OSG_INFO << "Adding a pressure sensor..." << std::endl;
		XMLPressureSensor ps;
		ps=vehicleChars.pressure_sensors.front();
		vehicleChars.pressure_sensors.pop_front();
		osg::ref_ptr<osg::Transform> vMs=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMs->asPositionAttitudeTransform()->setPosition(osg::Vec3d(ps.position[0],ps.position[1],ps.position[2]));
		vMs->asPositionAttitudeTransform()->setAttitude(osg::Quat(ps.orientation[0],osg::Vec3d(1,0,0),ps.orientation[1],osg::Vec3d(0,1,0), ps.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[ps.link]->getParent(0)->getParent(0)->asGroup()->addChild(vMs);
		pressure_sensors.push_back(PressureSensor(ps.name, vMs, oscene->scene->localizedWorld->getMatrix(), ps.std));
		OSG_INFO << "Done adding an Pressure Sensor..." << std::endl;
	}

	//Adding GPS sensors
	while(vehicleChars.gps_sensors.size() > 0){
		OSG_INFO << "Adding a gps sensor..." << std::endl;
		XMLGPSSensor ps;
		ps=vehicleChars.gps_sensors.front();
		vehicleChars.gps_sensors.pop_front();
		osg::ref_ptr<osg::Transform> vMs=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMs->asPositionAttitudeTransform()->setPosition(osg::Vec3d(ps.position[0],ps.position[1],ps.position[2]));
		vMs->asPositionAttitudeTransform()->setAttitude(osg::Quat(ps.orientation[0],osg::Vec3d(1,0,0),ps.orientation[1],osg::Vec3d(0,1,0), ps.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[ps.link]->getParent(0)->getParent(0)->asGroup()->addChild(vMs);
		gps_sensors.push_back(GPSSensor(oscene->scene, ps.name, vMs, oscene->scene->localizedWorld->getMatrix(), ps.std));
		OSG_INFO << "Done adding an GPS Sensor..." << std::endl;
	}

	//Adding dvl sensors
	while(vehicleChars.dvl_sensors.size() > 0){
		OSG_INFO << "Adding a dvl sensor..." << std::endl;
		XMLDVLSensor ps;
		ps=vehicleChars.dvl_sensors.front();
		vehicleChars.dvl_sensors.pop_front();
		osg::ref_ptr<osg::Transform> vMs=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMs->asPositionAttitudeTransform()->setPosition(osg::Vec3d(ps.position[0],ps.position[1],ps.position[2]));
		vMs->asPositionAttitudeTransform()->setAttitude(osg::Quat(ps.orientation[0],osg::Vec3d(1,0,0),ps.orientation[1],osg::Vec3d(0,1,0), ps.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[ps.link]->getParent(0)->getParent(0)->asGroup()->addChild(vMs);
		dvl_sensors.push_back(DVLSensor(ps.name, vMs, oscene->scene->localizedWorld->getMatrix(), ps.std));
		OSG_INFO << "Done adding an DVL Sensor..." << std::endl;
	}

	//Adding Multibeam sensors
	while(vehicleChars.multibeam_sensors.size() > 0){
		OSG_INFO << "Adding a Multibeam sensor..." << std::endl;
		XMLMultibeamSensor MB;
		MB=vehicleChars.multibeam_sensors.front();
		vehicleChars.multibeam_sensors.pop_front();
		osg::ref_ptr<osg::Transform> vMs=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMs->asPositionAttitudeTransform()->setPosition(osg::Vec3d(MB.position[0],MB.position[1],MB.position[2]));
		vMs->asPositionAttitudeTransform()->setAttitude(osg::Quat(MB.orientation[0],osg::Vec3d(1,0,0),MB.orientation[1],osg::Vec3d(0,1,0), MB.orientation[2],osg::Vec3d(0,0,1) ));
		urdf->link[MB.link]->getParent(0)->getParent(0)->asGroup()->addChild(vMs);
		MultibeamSensor  mb=MultibeamSensor(oscene->root,MB.name,vMs,MB.initAngle,MB.finalAngle,MB.angleIncr,MB.range);
		multibeam_sensors.push_back(mb);
		camview.push_back(mb);
		OSG_INFO << "Done adding a Multibeam Sensor..." << std::endl;
	}

	//Adding object pickers
	while(vehicleChars.object_pickers.size() > 0){
		OSG_INFO << "Adding an object picker..." << std::endl;
		rangeSensor rs;
		rs=vehicleChars.object_pickers.front();
		vehicleChars.object_pickers.pop_front();
		osg::ref_ptr<osg::Transform> vMr=(osg::Transform*) new osg::PositionAttitudeTransform;
		vMr->asPositionAttitudeTransform()->setPosition(osg::Vec3d(rs.position[0],rs.position[1],rs.position[2]));
		vMr->asPositionAttitudeTransform()->setAttitude(osg::Quat(rs.orientation[0],osg::Vec3d(1,0,0),rs.orientation[1],osg::Vec3d(0,1,0), rs.orientation[2],osg::Vec3d(0,0,1) ));
		vMr->setName("ObjectPickerNode");
		urdf->link[rs.link]->asGroup()->addChild(vMr);
		object_pickers.push_back(ObjectPicker(rs.name, oscene->scene->localizedWorld, vMr, rs.range, true));
		OSG_INFO << "Done adding an object picker..." << std::endl;
	}

	//Set-up a lamp attached to the vehicle: TODO
	/*
  osg::Light *_light=new osg::Light;
  _light->setLightNum(1);
  _light->setAmbient( osg::Vec4d(1.0f, 1.0f, 1.0f, 1.0f ));
  _light->setDiffuse( osg::Vec4d( 1.0, 1.0, 1.0, 1.0 ) );
  _light->setSpecular(osg::Vec4d( 0.1f, 0.1f, 0.1f, 1.0f ) );
  _light->setDirection(osg::Vec3d(0.0, 0.0, -5.0));
  _light->setSpotCutoff(40.0);
  _light->setSpotExponent(10.0);

  lightSource = new osg::LightSource;
  lightSource->setLight(_light);
  lightSource->setLocalStateSetModes(osg::StateAttribute::ON);
  lightSource->setUpdateCallback(new LightUpdateCallback(baseTransform));
	 */
}