Exemplo n.º 1
0
void BaseApplication::syncCallback(const sensor_msgs::CompressedImageConstPtr& depthImg, const sensor_msgs::CompressedImageConstPtr& rgbImg) {

	if (!syncedUpdate) {

		Ogre::MemoryDataStream depthStr(depthImg->data.size(), false, false);
		Ogre::MemoryDataStream rgbStr(rgbImg->data.size(), false, false);
		
		Ogre::uint8 buffer1, buffer2, buffer3, buffer4;
		for (int d=0; d<depthImg->data.size(); d++) {
			buffer1 = depthImg->data[d];
			buffer2 = depthImg->data[d+1];
			buffer3 = depthImg->data[d+2];
			buffer4 = depthImg->data[d+3];
			if (buffer1 == 137 && buffer2 == 80 && buffer3 == 78 && buffer4 == 71) {
				depthStr.write(&depthImg->data[d],depthImg->data.size()-d);
				break;
			}
		}
		depthStr.seek(0); //Reset stream position
		Ogre::DataStreamPtr *pDstr = new Ogre::DataStreamPtr(&depthStr);
		
		for (int d=0; d<rgbImg->data.size(); d++) {
			buffer1 = rgbImg->data[d];
			buffer2 = rgbImg->data[d+1];
			if (buffer1 == 255 && buffer2 == 216)  {
				rgbStr.write(&rgbImg->data[d], rgbImg->data.size()-d);
				break;
			}
		}
		rgbStr.seek(0); // Reset stream position
		Ogre::DataStreamPtr *pRstr = new Ogre::DataStreamPtr(&rgbStr);
		
		using namespace Ogre;
		static Quaternion qRot = Quaternion(-sqrt(0.5), 0.0f, sqrt(0.5), 0.0f)*Quaternion(-sqrt(0.5), sqrt(0.5), 0.0f, 0.0f);
		static tfScalar yaw,pitch,roll;
		static Matrix3 mRot;
		
		try {
			tfListener->lookupTransform("map", "head_xtion_depth_optical_frame", depthImg->header.stamp, snTransform);
			
			snPos.x = snTransform.getOrigin().x();
			snPos.y = snTransform.getOrigin().y();
			snPos.z = snTransform.getOrigin().z();
			snPos = qRot*snPos;
			
			snTransform.getBasis().getEulerYPR(yaw,pitch,roll);
			mRot.FromEulerAnglesZYX(Radian(yaw),Radian(pitch),Radian(roll));
			snOri.FromRotationMatrix(mRot);
			snOri = qRot*snOri;
			
			depImage.load(*pDstr, "png");
			texImage.load(*pRstr, "jpeg");

			syncedUpdate = true;
		} catch (tf::TransformException ex) {
			ROS_ERROR("%s",ex.what());
		}		
	}
}
Exemplo n.º 2
0
void DemoApplication::SmoothCamera::Move (Real deltaTranslation, Real deltaStrafe, Radian pitchAngleStep, Radian yawAngleStep)
{
	// here we update the camera movement at simulation rate
	m_cameraYawAngle = fmodf (m_cameraYawAngle.valueRadians() + yawAngleStep.valueRadians(), 3.141592f * 2.0f);
	m_cameraPitchAngle = Math::Clamp (m_cameraPitchAngle.valueRadians() + pitchAngleStep.valueRadians(), - 80.0f * 3.141592f / 180.0f, 80.0f * 3.141592f / 180.0f);

	Matrix3 rot; 
	rot.FromEulerAnglesZYX (Radian (0.0f), m_cameraYawAngle, m_cameraPitchAngle);
	Matrix4 matrix (rot);
	m_cameraTranslation += Vector3 (matrix[0][2], matrix[1][2], matrix[2][2]) * deltaTranslation;   
	m_cameraTranslation += Vector3 (matrix[0][0], matrix[1][0], matrix[2][0]) * deltaStrafe;   

	matrix.setTrans(m_cameraTranslation);
	matrix = matrix.transpose();
	Update (matrix[0]);
}
Exemplo n.º 3
0
Quaternion OgreMaxUtilities::LoadRotation(const TiXmlElement* objectElement)
{
    Quaternion rotation = Quaternion::IDENTITY;

    if (objectElement->Attribute("qx") != 0)
    {
        //The rotation is specified as a quaternion
        rotation.x = GetRealAttribute(objectElement, "qx", 0);
        rotation.y = GetRealAttribute(objectElement, "qy", 0);
        rotation.z = GetRealAttribute(objectElement, "qz", 0);
        rotation.w = GetRealAttribute(objectElement, "qw", 0);
    }
    else if (objectElement->Attribute("axisX") != 0)
    {
        //The rotation is specified as an axis and angle
        Real angle = GetRealAttribute(objectElement, "angle", 0);

        Vector3 axis;
        axis.x = GetRealAttribute(objectElement, "axisX", 0);
        axis.y = GetRealAttribute(objectElement, "axisY", 0);
        axis.z = GetRealAttribute(objectElement, "axisZ", 0);

        //Convert the angle and axis into the rotation quaternion
        rotation.FromAngleAxis(Radian(angle), axis);
    }
    else if (objectElement->Attribute("angleX") != 0)
    {
        //Assume the rotation is specified as three Euler angles
        Vector3 euler;
        euler.x = GetRealAttribute(objectElement, "angleX", 0);
        euler.y = GetRealAttribute(objectElement, "angleY", 0);
        euler.z = GetRealAttribute(objectElement, "angleZ", 0);
        String order = GetStringAttribute(objectElement, "order");

        //Convert Euler angles to a matrix
        Matrix3 rotationMatrix;
        if (order.length() < 2)
            rotationMatrix.FromEulerAnglesXYZ(Radian(euler.x), Radian(euler.y), Radian(euler.z));
        else
        {
            if (order[0] == 'x')
            {
                if (order[1] == 'y')
                    rotationMatrix.FromEulerAnglesXYZ(Radian(euler.x), Radian(euler.y), Radian(euler.z));
                else
                    rotationMatrix.FromEulerAnglesXZY(Radian(euler.x), Radian(euler.y), Radian(euler.z));
            }
            else if (order[0] == 'y')
            {
                if (order[1] == 'x')
                    rotationMatrix.FromEulerAnglesYXZ(Radian(euler.x), Radian(euler.y), Radian(euler.z));
                else
                    rotationMatrix.FromEulerAnglesYZX(Radian(euler.x), Radian(euler.y), Radian(euler.z));
            }
            else
            {
                if (order[1] == 'x')
                    rotationMatrix.FromEulerAnglesZXY(Radian(euler.x), Radian(euler.y), Radian(euler.z));
                else
                    rotationMatrix.FromEulerAnglesZYX(Radian(euler.x), Radian(euler.y), Radian(euler.z));
            }
        }

        //Convert the matrix into the rotation quaternion
        rotation.FromRotationMatrix(rotationMatrix);
    }
    
    return rotation;
}