Newer
Older
Lionel Heng
committed
///*=====================================================================
//
//QGroundControl Open Source Ground Control Station
//
//(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
//
//This file is part of the QGROUNDCONTROL project
//
// QGROUNDCONTROL is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// QGROUNDCONTROL is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
//
//======================================================================*/
/**
* @file
* @brief Definition of the class Pixhawk3DWidget.
*
* @author Lionel Heng <hengli@inf.ethz.ch>
Lionel Heng
committed
*
*/
#include "Pixhawk3DWidget.h"
#include <sstream>
#include <osg/Geode>
#include <osg/Image>
Lionel Heng
committed
#include <osg/LineWidth>
#include <osg/ShapeDrawable>
#include "PixhawkCheetahGeode.h"
#include "UASManager.h"
Lionel Heng
committed
Lionel Heng
committed
#include "QGC.h"
Lionel Heng
committed
#ifdef QGC_PROTOBUF_ENABLED
#include <tr1/memory>
#include <pixhawk.pb.h>
#endif
Lionel Heng
committed
Pixhawk3DWidget::Pixhawk3DWidget(QWidget* parent)
: Q3DWidget(parent)
, uas(NULL)
, mode(DEFAULT_MODE)
, selectedWpIndex(-1)
, displayGrid(true)
, displayTrail(false)
, displayImagery(true)
, displayWaypoints(true)
, displayRGBD2D(false)
, displayObstacleList(true)
, enableTarget(false)
, followCamera(true)
, lastRobotX(0.0f)
, lastRobotY(0.0f)
, lastRobotZ(0.0f)
Lionel Heng
committed
{
setCameraParams(2.0f, 30.0f, 0.01f, 10000.0f);
Lionel Heng
committed
init(15.0f);
// generate Pixhawk Cheetah model
vehicleModel = PixhawkCheetahGeode::instance();
egocentricMap->addChild(vehicleModel);
Lionel Heng
committed
// generate grid model
gridNode = createGrid();
rollingMap->addChild(gridNode);
// generate empty trail model
trailNode = createTrail();
rollingMap->addChild(trailNode);
// generate map model
mapNode = createMap();
rollingMap->addChild(mapNode);
Lionel Heng
committed
// generate waypoint model
Lionel Heng
committed
waypointGroupNode = new WaypointGroupNode;
waypointGroupNode->init();
rollingMap->addChild(waypointGroupNode);
Lionel Heng
committed
// generate target model
targetNode = createTarget();
rollingMap->addChild(targetNode);
Lionel Heng
committed
rgbd3DNode = createRGBD3D();
rollingMap->addChild(rgbd3DNode);
#ifdef QGC_PROTOBUF_ENABLED
obstacleGroupNode = new ObstacleGroupNode;
obstacleGroupNode->init();
rollingMap->addChild(obstacleGroupNode);
#endif
Lionel Heng
committed
setupHUD();
// find available vehicle models in models folder
vehicleModels = findVehicleModels();
Lionel Heng
committed
buildLayout();
updateHUD(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, "132N");
Lionel Heng
committed
connect(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*)),
this, SLOT(setActiveUAS(UASInterface*)));
}
Pixhawk3DWidget::~Pixhawk3DWidget()
{
}
/**
*
* @param uas the UAS/MAV to monitor/display with the HUD
*/
Lionel Heng
committed
void
Pixhawk3DWidget::setActiveUAS(UASInterface* uas)
Lionel Heng
committed
{
if (this->uas != NULL && this->uas != uas)
{
Lionel Heng
committed
// Disconnect any previously connected active MAV
//disconnect(uas, SIGNAL(valueChanged(UASInterface*,QString,double,quint64)), this, SLOT(updateValue(UASInterface*,QString,double,quint64)));
}
this->uas = uas;
}
Lionel Heng
committed
void
Pixhawk3DWidget::selectFrame(QString text)
{
if (text.compare("Global") == 0)
{
Lionel Heng
committed
frame = MAV_FRAME_GLOBAL;
}
else if (text.compare("Local") == 0)
{
Lionel Heng
committed
}
getPosition(lastRobotX, lastRobotY, lastRobotZ);
recenter();
}
Lionel Heng
committed
void
Pixhawk3DWidget::showGrid(int32_t state)
{
if (state == Qt::Checked)
{
Lionel Heng
committed
displayGrid = true;
}
else
{
Lionel Heng
committed
displayGrid = false;
}
}
void
Pixhawk3DWidget::showTrail(int32_t state)
{
if (state == Qt::Checked)
{
if (!displayTrail)
{
Lionel Heng
committed
}
displayTrail = true;
}
else
{
Lionel Heng
committed
displayTrail = false;
}
}
void
Pixhawk3DWidget::showWaypoints(int state)
{
if (state == Qt::Checked)
{
displayWaypoints = true;
}
else
{
displayWaypoints = false;
}
}
Lionel Heng
committed
void
Pixhawk3DWidget::selectMapSource(int index)
{
mapNode->setImageryType(static_cast<Imagery::ImageryType>(index));
hengli
committed
if (mapNode->getImageryType() == Imagery::BLANK_MAP)
{
hengli
committed
displayImagery = false;
}
else
{
hengli
committed
displayImagery = true;
}
Lionel Heng
committed
}
void
Pixhawk3DWidget::selectVehicleModel(int index)
{
vehicleModel = vehicleModels.at(index);
Lionel Heng
committed
void
Pixhawk3DWidget::recenter(void)
Lionel Heng
committed
{
hengli
committed
double robotX = 0.0f, robotY = 0.0f, robotZ = 0.0f;
Lionel Heng
committed
getPosition(robotX, robotY, robotZ);
hengli
committed
recenterCamera(robotY, robotX, -robotZ);
Lionel Heng
committed
}
void
hengli
committed
Pixhawk3DWidget::toggleFollowCamera(int32_t state)
Lionel Heng
committed
{
if (state == Qt::Checked)
{
hengli
committed
followCamera = true;
}
else
{
hengli
committed
followCamera = false;
Lionel Heng
committed
}
}
Lionel Heng
committed
Pixhawk3DWidget::selectTargetHeading(void)
if (!uas)
{
return;
}
if (frame == MAV_FRAME_GLOBAL)
{
double altitude = uas->getAltitude();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), altitude);
p.set(cursorWorldCoords.first, cursorWorldCoords.second);
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
double z = uas->getLocalZ();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), -z);
p.set(cursorWorldCoords.first, cursorWorldCoords.second);
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
target.z() = atan2(p.y() - target.y(), p.x() - target.x());
}
void
Pixhawk3DWidget::selectTarget(void)
{
if (!uas)
{
return;
}
if (frame == MAV_FRAME_GLOBAL)
{
double altitude = uas->getAltitude();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), altitude);
target.set(cursorWorldCoords.first, cursorWorldCoords.second, 0.0);
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
double z = uas->getLocalZ();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), -z);
target.set(cursorWorldCoords.first, cursorWorldCoords.second, 0.0);
}
enableTarget = true;
mode = SELECT_TARGET_YAW_MODE;
}
void
Pixhawk3DWidget::setTarget(void)
{
selectTargetHeading();
uas->setTargetPosition(target.x(), target.y(), 0.0, target.z());
void
Pixhawk3DWidget::insertWaypoint(void)
{
if (!uas)
{
return;
}
Lionel Heng
committed
Waypoint* wp = NULL;
if (frame == MAV_FRAME_GLOBAL)
{
double latitude = uas->getLatitude();
double longitude = uas->getLongitude();
double altitude = uas->getAltitude();
double x, y;
QString utmZone;
Imagery::LLtoUTM(latitude, longitude, x, y, utmZone);
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), altitude);
Imagery::UTMtoLL(cursorWorldCoords.first, cursorWorldCoords.second, utmZone,
latitude, longitude);
wp = new Waypoint(0, longitude, latitude, altitude, 0.0, 0.25);
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
double z = uas->getLocalZ();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), -z);
wp = new Waypoint(0, cursorWorldCoords.first,
cursorWorldCoords.second, z, 0.0, 0.25);
}
if (wp)
{
wp->setFrame(frame);
uas->getWaypointManager()->addWaypointEditable(wp);
}
}
void
Pixhawk3DWidget::moveWaypoint(void)
{
mode = MOVE_WAYPOINT_MODE;
}
void
Pixhawk3DWidget::setWaypoint(void)
{
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
if (!uas)
{
return;
}
const QVector<Waypoint *> waypoints =
uas->getWaypointManager()->getWaypointEditableList();
Waypoint* waypoint = waypoints.at(selectedWpIndex);
if (frame == MAV_FRAME_GLOBAL)
{
double latitude = uas->getLatitude();
double longitude = uas->getLongitude();
double altitude = uas->getAltitude();
double x, y;
QString utmZone;
Imagery::LLtoUTM(latitude, longitude, x, y, utmZone);
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), altitude);
Imagery::UTMtoLL(cursorWorldCoords.first, cursorWorldCoords.second, utmZone,
latitude, longitude);
waypoint->setX(longitude);
waypoint->setY(latitude);
waypoint->setZ(altitude);
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
double z = uas->getLocalZ();
std::pair<double,double> cursorWorldCoords =
getGlobalCursorPosition(getMouseX(), getMouseY(), -z);
waypoint->setX(cursorWorldCoords.first);
waypoint->setY(cursorWorldCoords.second);
waypoint->setZ(z);
}
}
void
Pixhawk3DWidget::deleteWaypoint(void)
{
if (uas)
{
uas->getWaypointManager()->removeWaypoint(selectedWpIndex);
}
}
void
Pixhawk3DWidget::setWaypointAltitude(void)
{
if (!uas)
{
return;
}
bool ok;
const QVector<Waypoint *> waypoints =
uas->getWaypointManager()->getWaypointEditableList();
Waypoint* waypoint = waypoints.at(selectedWpIndex);
Lionel Heng
committed
double altitude = waypoint->getZ();
if (frame == MAV_FRAME_LOCAL_NED)
{
altitude = -altitude;
}
double newAltitude =
QInputDialog::getDouble(this, tr("Set altitude of waypoint %1").arg(selectedWpIndex),
tr("Altitude (m):"), waypoint->getZ(), -1000.0, 1000.0, 1, &ok);
if (ok)
{
if (frame == MAV_FRAME_GLOBAL)
{
waypoint->setZ(newAltitude);
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
waypoint->setZ(-newAltitude);
}
}
void
Pixhawk3DWidget::clearAllWaypoints(void)
{
if (uas)
{
const QVector<Waypoint *> waypoints =
for (int i = waypoints.size() - 1; i >= 0; --i)
{
uas->getWaypointManager()->removeWaypoint(i);
QVector< osg::ref_ptr<osg::Node> >
Pixhawk3DWidget::findVehicleModels(void)
{
QDir directory("models");
QStringList files = directory.entryList(QStringList("*.osg"), QDir::Files);
QVector< osg::ref_ptr<osg::Node> > nodes;
// add Pixhawk Bravo model
nodes.push_back(PixhawkCheetahGeode::instance());
// add sphere of 0.05m radius
osg::ref_ptr<osg::Sphere> sphere = new osg::Sphere(osg::Vec3f(0.0f, 0.0f, 0.0f), 0.05f);
osg::ref_ptr<osg::ShapeDrawable> sphereDrawable = new osg::ShapeDrawable(sphere);
sphereDrawable->setColor(osg::Vec4f(0.5f, 0.0f, 0.5f, 1.0f));
osg::ref_ptr<osg::Geode> sphereGeode = new osg::Geode;
sphereGeode->addDrawable(sphereDrawable);
sphereGeode->setName("Sphere (0.1m)");
nodes.push_back(sphereGeode);
for (int i = 0; i < files.size(); ++i)
{
osg::ref_ptr<osg::Node> node =
osgDB::readNodeFile(directory.absoluteFilePath(files[i]).toStdString().c_str());
if (node)
{
nodes.push_back(node);
}
else
{
printf("%s\n", QString("ERROR: Could not load file " + directory.absoluteFilePath(files[i]) + "\n").toStdString().c_str());
// QStringList dirs = directory.entryList(QDir::Dirs);
// // Add models in subfolders
// for (int i = 0; i < dirs.size(); ++i)
// {
// // Handling the current directory
// QStringList currFiles = QDir(dirs[i]).entryList(QStringList("*.ac"), QDir::Files);
// // Load the file
// osg::ref_ptr<osg::Node> node =
// osgDB::readNodeFile(directory.absoluteFilePath(currFiles.first()).toStdString().c_str());
// if (node)
// {
// nodes.push_back(node);
// }
// else
// {
// printf(QString("ERROR: Could not load file " + directory.absoluteFilePath(files[i]) + "\n").toStdString().c_str());
// }
// }
return nodes;
}
void
Pixhawk3DWidget::buildLayout(void)
{
Lionel Heng
committed
QComboBox* frameComboBox = new QComboBox(this);
frameComboBox->addItem("Local");
Lionel Heng
committed
frameComboBox->setFixedWidth(70);
QCheckBox* gridCheckBox = new QCheckBox(this);
gridCheckBox->setText("Grid");
gridCheckBox->setChecked(displayGrid);
QCheckBox* trailCheckBox = new QCheckBox(this);
trailCheckBox->setText("Trail");
trailCheckBox->setChecked(displayTrail);
QCheckBox* waypointsCheckBox = new QCheckBox(this);
waypointsCheckBox->setText("Waypoints");
waypointsCheckBox->setChecked(displayWaypoints);
Lionel Heng
committed
QLabel* mapLabel = new QLabel("Map", this);
QComboBox* mapComboBox = new QComboBox(this);
mapComboBox->addItem("None");
mapComboBox->addItem("Map (Google)");
mapComboBox->addItem("Satellite (Google)");
QLabel* modelLabel = new QLabel("Vehicle", this);
QComboBox* modelComboBox = new QComboBox(this);
for (int i = 0; i < vehicleModels.size(); ++i)
{
modelComboBox->addItem(vehicleModels[i]->getName().c_str());
}
QPushButton* recenterButton = new QPushButton(this);
recenterButton->setText("Recenter Camera");
QCheckBox* followCameraCheckBox = new QCheckBox(this);
followCameraCheckBox->setText("Follow Camera");
followCameraCheckBox->setChecked(followCamera);
QGridLayout* layout = new QGridLayout(this);
layout->setMargin(0);
layout->setSpacing(2);
Lionel Heng
committed
layout->addWidget(frameComboBox, 0, 10);
layout->addWidget(gridCheckBox, 2, 0);
layout->addWidget(trailCheckBox, 2, 1);
layout->addWidget(waypointsCheckBox, 2, 2);
layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 2, 3);
layout->addWidget(mapLabel, 2, 4);
layout->addWidget(mapComboBox, 2, 5);
layout->addWidget(modelLabel, 2, 6);
layout->addWidget(modelComboBox, 2, 7);
layout->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Expanding), 2, 8);
layout->addWidget(recenterButton, 2, 9);
layout->addWidget(followCameraCheckBox, 2, 10);
layout->setRowStretch(0, 1);
layout->setRowStretch(1, 100);
layout->setRowStretch(2, 1);
Lionel Heng
committed
connect(frameComboBox, SIGNAL(currentIndexChanged(QString)),
this, SLOT(selectFrame(QString)));
connect(gridCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showGrid(int)));
connect(trailCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showTrail(int)));
connect(waypointsCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(showWaypoints(int)));
Lionel Heng
committed
connect(mapComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectMapSource(int)));
connect(modelComboBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(selectVehicleModel(int)));
connect(recenterButton, SIGNAL(clicked()), this, SLOT(recenter()));
connect(followCameraCheckBox, SIGNAL(stateChanged(int)),
this, SLOT(toggleFollowCamera(int)));
}
Lionel Heng
committed
void
Pixhawk3DWidget::resizeGL(int width, int height)
{
Q3DWidget::resizeGL(width, height);
resizeHUD();
}
hengli
committed
void
Pixhawk3DWidget::display(void)
{
// set node visibility
rollingMap->setChildValue(gridNode, displayGrid);
rollingMap->setChildValue(trailNode, displayTrail);
rollingMap->setChildValue(mapNode, displayImagery);
rollingMap->setChildValue(waypointGroupNode, displayWaypoints);
rollingMap->setChildValue(targetNode, enableTarget);
#ifdef QGC_PROTOBUF_ENABLED
rollingMap->setChildValue(obstacleGroupNode, displayObstacleList);
#endif
rollingMap->setChildValue(rgbd3DNode, displayRGBD3D);
hudGroup->setChildValue(rgb2DGeode, displayRGBD2D);
hudGroup->setChildValue(depth2DGeode, displayRGBD2D);
if (!uas)
{
Lionel Heng
committed
double robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw;
QString utmZone;
Lionel Heng
committed
getPose(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw, utmZone);
if (lastRobotX == 0.0f && lastRobotY == 0.0f && lastRobotZ == 0.0f)
{
lastRobotX = robotX;
lastRobotY = robotY;
lastRobotZ = robotZ;
recenterCamera(robotY, robotX, -robotZ);
hengli
committed
}
if (followCamera)
{
hengli
committed
double dx = robotY - lastRobotY;
double dy = robotX - lastRobotX;
double dz = lastRobotZ - robotZ;
moveCamera(dx, dy, dz);
hengli
committed
robotPosition->setPosition(osg::Vec3d(robotY, robotX, -robotZ));
robotAttitude->setAttitude(osg::Quat(-robotYaw, osg::Vec3d(0.0f, 0.0f, 1.0f),
robotPitch, osg::Vec3d(1.0f, 0.0f, 0.0f),
robotRoll, osg::Vec3d(0.0f, 1.0f, 0.0f)));
hengli
committed
if (displayTrail)
{
Lionel Heng
committed
updateTrail(robotX, robotY, robotZ);
}
if (frame == MAV_FRAME_GLOBAL && displayImagery)
{
updateImagery(robotX, robotY, robotZ, utmZone);
Lionel Heng
committed
}
if (displayWaypoints)
{
Lionel Heng
committed
updateWaypoints();
}
if (enableTarget)
{
updateTarget(robotX, robotY);
}
Lionel Heng
committed
#ifdef QGC_PROTOBUF_ENABLED
if (displayRGBD2D || displayRGBD3D)
{
Lionel Heng
committed
updateRGBD(robotX, robotY, robotZ);
Lionel Heng
committed
}
if (displayObstacleList)
{
updateObstacles();
}
Lionel Heng
committed
Lionel Heng
committed
updateHUD(robotX, robotY, robotZ, robotRoll, robotPitch, robotYaw, utmZone);
hengli
committed
lastRobotX = robotX;
lastRobotY = robotY;
lastRobotZ = robotZ;
hengli
committed
}
void
Pixhawk3DWidget::keyPressEvent(QKeyEvent* event)
{
if (!event->text().isEmpty())
{
switch (*(event->text().toAscii().data()))
{
case '1':
displayRGBD2D = !displayRGBD2D;
break;
case '2':
displayRGBD3D = !displayRGBD3D;
break;
enableRGBDColor = !enableRGBDColor;
break;
case 'o':
case 'O':
displayObstacleList = !displayObstacleList;
break;
}
}
Q3DWidget::keyPressEvent(event);
}
hengli
committed
void
Pixhawk3DWidget::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
{
if (mode == MOVE_WAYPOINT_MODE)
{
setWaypoint();
mode = DEFAULT_MODE;
return;
}
if (mode == SELECT_TARGET_YAW_MODE)
{
setTarget();
mode = DEFAULT_MODE;
return;
}
if (event->modifiers() == Qt::ShiftModifier)
{
selectedWpIndex = findWaypoint(event->x(), event->y());
if (selectedWpIndex == -1)
{
showInsertWaypointMenu(event->globalPos());
}
else
{
showEditWaypointMenu(event->globalPos());
}
return;
}
hengli
committed
}
Q3DWidget::mousePressEvent(event);
}
void
Pixhawk3DWidget::mouseMoveEvent(QMouseEvent* event)
{
if (mode == SELECT_TARGET_YAW_MODE)
{
selectTargetHeading();
}
Q3DWidget::mouseMoveEvent(event);
}
Lionel Heng
committed
void
Pixhawk3DWidget::getPose(double& x, double& y, double& z,
double& roll, double& pitch, double& yaw,
QString& utmZone)
{
if (!uas)
{
return;
}
Lionel Heng
committed
if (frame == MAV_FRAME_GLOBAL)
{
double latitude = uas->getLatitude();
double longitude = uas->getLongitude();
double altitude = uas->getAltitude();
Imagery::LLtoUTM(latitude, longitude, x, y, utmZone);
z = -altitude;
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
x = uas->getLocalX();
y = uas->getLocalY();
z = uas->getLocalZ();
Lionel Heng
committed
}
roll = uas->getRoll();
pitch = uas->getPitch();
yaw = uas->getYaw();
Lionel Heng
committed
}
void
Pixhawk3DWidget::getPose(double& x, double& y, double& z,
double& roll, double& pitch, double& yaw)
{
QString utmZone;
getPose(x, y, z, roll, pitch, yaw);
}
void
Pixhawk3DWidget::getPosition(double& x, double& y, double& z,
QString& utmZone)
{
if (!uas)
return;
}
Lionel Heng
committed
if (frame == MAV_FRAME_GLOBAL)
{
double latitude = uas->getLatitude();
double longitude = uas->getLongitude();
double altitude = uas->getAltitude();
Imagery::LLtoUTM(latitude, longitude, x, y, utmZone);
z = -altitude;
}
else if (frame == MAV_FRAME_LOCAL_NED)
{
x = uas->getLocalX();
y = uas->getLocalY();
z = uas->getLocalZ();
Lionel Heng
committed
}
}
void
Pixhawk3DWidget::getPosition(double& x, double& y, double& z)
{
QString utmZone;
getPosition(x, y, z, utmZone);
}
Lionel Heng
committed
osg::ref_ptr<osg::Geode>
Pixhawk3DWidget::createGrid(void)
{
osg::ref_ptr<osg::Geode> geode(new osg::Geode());
osg::ref_ptr<osg::Geometry> fineGeometry(new osg::Geometry());
osg::ref_ptr<osg::Geometry> coarseGeometry(new osg::Geometry());
geode->addDrawable(fineGeometry);
geode->addDrawable(coarseGeometry);
Lionel Heng
committed
float radius = 10.0f;
float resolution = 0.25f;
osg::ref_ptr<osg::Vec3Array> fineCoords(new osg::Vec3Array);
osg::ref_ptr<osg::Vec3Array> coarseCoords(new osg::Vec3Array);
Lionel Heng
committed
// draw a 20m x 20m grid with 0.25m resolution
for (float i = -radius; i <= radius; i += resolution)
{
if (fabs(i - floor(i + 0.5f)) < 0.01f)
{
coarseCoords->push_back(osg::Vec3(i, -radius, 0.0f));
coarseCoords->push_back(osg::Vec3(i, radius, 0.0f));
coarseCoords->push_back(osg::Vec3(-radius, i, 0.0f));
coarseCoords->push_back(osg::Vec3(radius, i, 0.0f));
fineCoords->push_back(osg::Vec3(i, -radius, 0.0f));
fineCoords->push_back(osg::Vec3(i, radius, 0.0f));
fineCoords->push_back(osg::Vec3(-radius, i, 0.0f));
fineCoords->push_back(osg::Vec3(radius, i, 0.0f));
}
Lionel Heng
committed
}
fineGeometry->setVertexArray(fineCoords);
coarseGeometry->setVertexArray(coarseCoords);
Lionel Heng
committed
osg::ref_ptr<osg::Vec4Array> color(new osg::Vec4Array);
color->push_back(osg::Vec4(0.5f, 0.5f, 0.5f, 1.0f));
fineGeometry->setColorArray(color);
coarseGeometry->setColorArray(color);
fineGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);
coarseGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);
fineGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,
coarseGeometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0,
osg::ref_ptr<osg::StateSet> fineStateset(new osg::StateSet);
osg::ref_ptr<osg::LineWidth> fineLinewidth(new osg::LineWidth());
fineLinewidth->setWidth(0.25f);
fineStateset->setAttributeAndModes(fineLinewidth, osg::StateAttribute::ON);
fineStateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
fineGeometry->setStateSet(fineStateset);
osg::ref_ptr<osg::StateSet> coarseStateset(new osg::StateSet);
osg::ref_ptr<osg::LineWidth> coarseLinewidth(new osg::LineWidth());
coarseLinewidth->setWidth(2.0f);
coarseStateset->setAttributeAndModes(coarseLinewidth, osg::StateAttribute::ON);
coarseStateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
coarseGeometry->setStateSet(coarseStateset);
Lionel Heng
committed
return geode;
}
osg::ref_ptr<osg::Geode>
Pixhawk3DWidget::createTrail(void)
{
osg::ref_ptr<osg::Geode> geode(new osg::Geode());
trailGeometry = new osg::Geometry();
trailGeometry->setUseDisplayList(false);
geode->addDrawable(trailGeometry.get());
hengli
committed
trailVertices = new osg::Vec3dArray;
Lionel Heng
committed
trailGeometry->setVertexArray(trailVertices);
trailDrawArrays = new osg::DrawArrays(osg::PrimitiveSet::LINE_STRIP);
trailGeometry->addPrimitiveSet(trailDrawArrays);
osg::ref_ptr<osg::Vec4Array> color(new osg::Vec4Array);
color->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));
trailGeometry->setColorArray(color);
trailGeometry->setColorBinding(osg::Geometry::BIND_OVERALL);
osg::ref_ptr<osg::StateSet> stateset(new osg::StateSet);
osg::ref_ptr<osg::LineWidth> linewidth(new osg::LineWidth());
linewidth->setWidth(1.0f);
stateset->setAttributeAndModes(linewidth, osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
trailGeometry->setStateSet(stateset);
return geode;
}
Lionel Heng
committed
osg::ref_ptr<Imagery>
Pixhawk3DWidget::createMap(void)
{
Lionel Heng
committed
return osg::ref_ptr<Imagery>(new Imagery());
osg::ref_ptr<osg::Geode>
Pixhawk3DWidget::createRGBD3D(void)
Lionel Heng
committed
int frameSize = 752 * 480;
osg::ref_ptr<osg::Geode> geode(new osg::Geode);
osg::ref_ptr<osg::Geometry> geometry(new osg::Geometry);
osg::ref_ptr<osg::Vec3Array> vertices(new osg::Vec3Array(frameSize));
geometry->setVertexArray(vertices);
osg::ref_ptr<osg::Vec4Array> colors(new osg::Vec4Array(frameSize));
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
geometry->setUseDisplayList(false);
geode->addDrawable(geometry);
return geode;
osg::ref_ptr<osg::Node>
Pixhawk3DWidget::createTarget(void)
{
osg::ref_ptr<osg::PositionAttitudeTransform> pat =
new osg::PositionAttitudeTransform;
pat->setPosition(osg::Vec3d(0.0, 0.0, 0.0));
osg::ref_ptr<osg::Cone> cone = new osg::Cone(osg::Vec3f(0.0f, 0.0f, 0.0f), 0.1f, 0.4f);
osg::ref_ptr<osg::ShapeDrawable> coneDrawable = new osg::ShapeDrawable(cone);
coneDrawable->setColor(osg::Vec4f(0.0f, 1.0f, 0.0f, 1.0f));
coneDrawable->getOrCreateStateSet()->setMode(GL_BLEND, osg::StateAttribute::ON);
osg::ref_ptr<osg::Geode> coneGeode = new osg::Geode;
coneGeode->addDrawable(coneDrawable);
coneGeode->setName("Target");