Note BOTH GUIDE AND DEV SOURCES HAVE MOVED TO QGroundControl Repo: https://github.com/mavlink/qgroundcontrol/tree/master/docs/en
This repo will be archived shortly.
QGroundControl User Guide (Gitbook source)
Home Page: https://docs.qgroundcontrol.com/en/
License: Other
Note BOTH GUIDE AND DEV SOURCES HAVE MOVED TO QGroundControl Repo: https://github.com/mavlink/qgroundcontrol/tree/master/docs/en
This repo will be archived shortly.
Sorry but I've looked everywhere and can't find a more up-to-date user guide than this one:
https://docs.qgroundcontrol.com/en/
If there is later Android user guide information, please give me a hint as to where to find it.
I'm been trying the Android build on Google Play, and also the daily test build, but finding information is proving very difficult. The Android control interface has changed a lot since I first used it, and it seems not all actions are activated until the craft is armed and (sometimes) airborne. It's not ideal figuring this out while the craft is flying, no?
Thanks in advance for any help. If I'm in the wrong forum, please just show me where I can raise this.
The daily HEAD:6b10539a5 2017-03-09 11:28:25 is not working on my machine. It does not connect. I verified that this version has about 90k while the last one, 3.1.3, has about 140k. Not sure if something missing. I had to revert to 3.1.3
I am using Windows 10
This is named "Daily Build New Features" but it isn't clear what it contains.
@DonLakeFlyer Is this a log of new features that have gone into the daily build since the last official release (Release Notes 3.1)?
Bug Page: Daily Build New Features · QGroundControl User Guide
I often need to point people to the mavlink console, so it would be good to have instructions and a screenshot showing how to access it.
I see that all Items on https://docs.qgroundcontrol.com/en/toolbar/toolbar.html have a separate page already except for the Analyze tab.
Critical and emergency battery thresholds parameters state "This threshold commonly will trigger RTL." It would be clearer if it states that it will follow the failsafe selected in the Safety setup. Or am I wrong and there is some override of the desired failsafe, and it goes to RTL in certain instances?
Update https://docs.qgroundcontrol.com/en/SetupView/Power.html
Calibrate your voltage sensor on this screen: ttps://docs.qgroundcontrol.com/en/SetupView/Power.html
Measure the voltage from the lipo using a multimeter, then click 'calibrate' next to the 'voltage divider' and enter the voltage you read from the multimeter.
Do same thing in User guide.
Reference:
https://docs.qgroundcontrol.com/en/FlyView/FlyView.html
Under the Fly View section,
The hyperlinked word "stop" does not take the reader to an associated section. I am hoping to learn how to "abort" a mission without "E-stop" or "RTL."
Further searching for the word "stop" does not bring up information about stopping a mission, other than with "emergency stop."
I am a 1-day-old QGC user, who has flown two successful 6-waypoint missions, over my house, taking off and RTL from a tree-lined backyard. I still have a drone. All credit to QGC developers. Thank you.
Dear all:
I am trying to develop an Android APP that can connect to PX4 JMAVSim simulator and take off. As I turn on the JMAVSim, and then turn on QGC, they are automatically connected. If anybody knows how, please reply me, thanks a lot.
BR
Sean Hsu
Dear all:
My APP is ready, but cannot connect to PX4 simulator JMAVSim. Please let me know what goes wrong if you know. Thanks a lot. I attached my APP code as below.
package com.o3dr.hellodrone;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.o3dr.android.client.ControlTower;
import com.o3dr.android.client.Drone;
import com.o3dr.android.client.apis.ControlApi;
import com.o3dr.android.client.apis.VehicleApi;
import com.o3dr.android.client.interfaces.DroneListener;
import com.o3dr.android.client.interfaces.TowerListener;
import com.o3dr.services.android.lib.coordinate.LatLong;
import com.o3dr.services.android.lib.coordinate.LatLongAlt;
import com.o3dr.services.android.lib.drone.attribute.AttributeEvent;
import com.o3dr.services.android.lib.drone.attribute.AttributeType;
import com.o3dr.services.android.lib.drone.connection.ConnectionParameter;
import com.o3dr.services.android.lib.drone.connection.ConnectionResult;
import com.o3dr.services.android.lib.drone.connection.ConnectionType;
import com.o3dr.services.android.lib.drone.property.Altitude;
import com.o3dr.services.android.lib.drone.property.Gps;
import com.o3dr.services.android.lib.drone.property.Home;
import com.o3dr.services.android.lib.drone.property.Speed;
import com.o3dr.services.android.lib.drone.property.State;
import com.o3dr.services.android.lib.drone.property.Type;
import com.o3dr.services.android.lib.drone.property.VehicleMode;
import java.util.List;
public class MainActivity extends ActionBarActivity implements DroneListener, TowerListener {
private Drone drone;
private int droneType = Type.TYPE_UNKNOWN;
private final Handler handler = new Handler();
Spinner modeSelector;
private ControlTower controlTower;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize the service manager
this.controlTower = new ControlTower(getApplicationContext());
this.drone = new Drone(getApplicationContext());
this.modeSelector = (Spinner)findViewById(R.id.modeSelect);
this.modeSelector.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
onFlightModeSelected(view);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing
}
});
Toast.makeText(getApplicationContext(), "onCreate", Toast.LENGTH_LONG).show();
}
@Override
public void onStart() {
super.onStart();
this.controlTower.connect(this);
Toast.makeText(getApplicationContext(), "onStart", Toast.LENGTH_LONG).show();
}
@Override
public void onStop() {
super.onStop();
if (this.drone.isConnected()) {
this.drone.disconnect();
updateConnectedButton(false);
}
this.controlTower.unregisterDrone(this.drone);
this.controlTower.disconnect();
Toast.makeText(getApplicationContext(), "onStop", Toast.LENGTH_LONG).show();
}
@Override
public void onTowerConnected() {
this.controlTower.registerDrone(this.drone, this.handler);
this.drone.registerDroneListener(this);
Toast.makeText(getApplicationContext(), "onTowerConnected", Toast.LENGTH_LONG).show();
}
@Override
public void onTowerDisconnected() {
Toast.makeText(getApplicationContext(), "onTowerDisconnected", Toast.LENGTH_LONG).show();
}
@Override
public void onDroneEvent(String event, Bundle extras) {
switch (event) {
case AttributeEvent.STATE_CONNECTED:
alertUser("Drone Connected");
updateConnectedButton(this.drone.isConnected());
break;
case AttributeEvent.STATE_DISCONNECTED:
alertUser("Drone Disconnected");
updateConnectedButton(this.drone.isConnected());
break;
case AttributeEvent.STATE_UPDATED:
case AttributeEvent.STATE_ARMING:
updateArmButton();
break;
case AttributeEvent.STATE_VEHICLE_MODE:
updateVehicleMode();
break;
case AttributeEvent.TYPE_UPDATED:
Type newDroneType = this.drone.getAttribute(AttributeType.TYPE);
if (newDroneType.getDroneType() != this.droneType) {
this.droneType = newDroneType.getDroneType();
updateVehicleModesForType(this.droneType);
}
break;
case AttributeEvent.SPEED_UPDATED:
updateAltitude();
updateSpeed();
break;
case AttributeEvent.HOME_UPDATED:
updateDistanceFromHome();
break;
default:
break;
}
Toast.makeText(getApplicationContext(), "onDroneEvent", Toast.LENGTH_LONG).show();
}
/*@Override--->this has compile error
public void onDroneConnectionFailed(ConnectionResult result) {
}*/
@Override
public void onDroneServiceInterrupted(String errorMsg) {
Toast.makeText(getApplicationContext(), "onDroneServiceInterrupted", Toast.LENGTH_LONG).show();
}
public void onBtnConnectTap(View view) {
if(this.drone.isConnected()) {
this.drone.disconnect();
Toast.makeText(getApplicationContext(), "onBtnConnectTap to Disconnect", Toast.LENGTH_LONG).show();
} else {
Bundle extraParams = new Bundle();
extraParams.putInt(ConnectionType.EXTRA_UDP_SERVER_PORT, 14550); // Set default port to 14550
//ConnectionParameter connectionParams = new ConnectionParameter(ConnectionType.TYPE_UDP, extraParams, null);
ConnectionParameter connectionParams = ConnectionParameter.newUdpConnection(14550, null);
this.drone.connect(connectionParams);
Toast.makeText(getApplicationContext(), "onBtnConnectTap to Connect", Toast.LENGTH_LONG).show();
}
}
protected void alertUser(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}
protected void updateConnectedButton(Boolean isConnected) {
Button connectButton = (Button)findViewById(R.id.btnConnect);
if (isConnected) {
connectButton.setText("Disconnect");
} else {
connectButton.setText("Connect");
}
}
public void onFlightModeSelected(View view) {
VehicleMode vehicleMode = (VehicleMode) this.modeSelector.getSelectedItem();
//this.drone.changeVehicleMode(vehicleMode);//changeVehicleMode is out of date, use the following function instead
VehicleApi.getApi(this.drone).setVehicleMode(vehicleMode);
Toast.makeText(getApplicationContext(), "onFlightModeSelected", Toast.LENGTH_LONG).show();
}
protected void updateVehicleModesForType(int droneType) {
List<VehicleMode> vehicleModes = VehicleMode.getVehicleModePerDroneType(droneType);
ArrayAdapter<VehicleMode> vehicleModeArrayAdapter = new ArrayAdapter<VehicleMode>(this, android.R.layout.simple_spinner_item, vehicleModes);
vehicleModeArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
this.modeSelector.setAdapter(vehicleModeArrayAdapter);
Toast.makeText(getApplicationContext(), "updateVehicleModesForType", Toast.LENGTH_LONG).show();
}
protected void updateVehicleMode() {
State vehicleState = this.drone.getAttribute(AttributeType.STATE);
VehicleMode vehicleMode = vehicleState.getVehicleMode();
ArrayAdapter arrayAdapter = (ArrayAdapter)this.modeSelector.getAdapter();
this.modeSelector.setSelection(arrayAdapter.getPosition(vehicleMode));
Toast.makeText(getApplicationContext(), "updateVehicleMode", Toast.LENGTH_LONG).show();
}
protected void updateAltitude() {
TextView altitudeTextView = (TextView)findViewById(R.id.altitudeValueTextView);
Altitude droneAltitude = this.drone.getAttribute(AttributeType.ALTITUDE);
altitudeTextView.setText(String.format("%3.1f", droneAltitude.getAltitude()) + "m");
Toast.makeText(getApplicationContext(), "updateAltitude", Toast.LENGTH_LONG).show();
}
protected void updateSpeed() {
TextView speedTextView = (TextView)findViewById(R.id.speedValueTextView);
Speed droneSpeed = this.drone.getAttribute(AttributeType.SPEED);
speedTextView.setText(String.format("%3.1f", droneSpeed.getGroundSpeed()) + "m/s");
Toast.makeText(getApplicationContext(), "updateSpeed", Toast.LENGTH_LONG).show();
}
protected void updateDistanceFromHome() {
TextView distanceTextView = (TextView)findViewById(R.id.distanceValueTextView);
Altitude droneAltitude = this.drone.getAttribute(AttributeType.ALTITUDE);
double vehicleAltitude = droneAltitude.getAltitude();
Gps droneGps = this.drone.getAttribute(AttributeType.GPS);
LatLong vehiclePosition = droneGps.getPosition();
double distanceFromHome = 0;
if (droneGps.isValid()) {
LatLongAlt vehicle3DPosition = new LatLongAlt(vehiclePosition.getLatitude(), vehiclePosition.getLongitude(), vehicleAltitude);
Home droneHome = this.drone.getAttribute(AttributeType.HOME);
distanceFromHome = distanceBetweenPoints(droneHome.getCoordinate(), vehicle3DPosition);
} else {
distanceFromHome = 0;
}
distanceTextView.setText(String.format("%3.1f", distanceFromHome) + "m");
Toast.makeText(getApplicationContext(), "updateDistanceFromHome", Toast.LENGTH_LONG).show();
}
protected double distanceBetweenPoints(LatLongAlt pointA, LatLongAlt pointB) {
if (pointA == null || pointB == null) {
return 0;
}
double dx = pointA.getLatitude() - pointB.getLatitude();
double dy = pointA.getLongitude() - pointB.getLongitude();
double dz = pointA.getAltitude() - pointB.getAltitude();
Toast.makeText(getApplicationContext(), "distanceBetweenPoints", Toast.LENGTH_LONG).show();
return Math.sqrt(dx*dx + dy*dy + dz*dz);
}
protected void updateArmButton() {
State vehicleState = this.drone.getAttribute(AttributeType.STATE);
Button armButton = (Button)findViewById(R.id.btnArmTakeOff);
if (!this.drone.isConnected()) {
armButton.setVisibility(View.INVISIBLE);
} else {
armButton.setVisibility(View.VISIBLE);
}
if (vehicleState.isFlying()) {
// Land
armButton.setText("LAND");
} else if (vehicleState.isArmed()) {
// Take off
armButton.setText("TAKE OFF");
} else if (vehicleState.isConnected()){
// Connected but not Armed
armButton.setText("ARM");
}
Toast.makeText(getApplicationContext(), "updateArmButton", Toast.LENGTH_LONG).show();
}
public void onArmButtonTap(View view) {
Button thisButton = (Button)view;
State vehicleState = this.drone.getAttribute(AttributeType.STATE);
if (vehicleState.isFlying()) {
// Land
//this.drone.changeVehicleMode(VehicleMode.COPTER_LAND);//changeVehicleMode is out of date, use the following function instead
VehicleApi.getApi(this.drone).setVehicleMode(VehicleMode.COPTER_LAND);
} else if (vehicleState.isArmed()) {
// Take off
//this.drone.doGuidedTakeoff(10); // Default take off altitude is 10m
ControlApi.getApi(this.drone).takeoff(10, null);
} else if (!vehicleState.isConnected()) {
// Connect
alertUser("Connect to a drone first");
} else if (vehicleState.isConnected() && !vehicleState.isArmed()){
// Connected but not Armed
//this.drone.arm(true);//arm is out of date, use the following function instead
VehicleApi.getApi(this.drone).arm(true);
}
Toast.makeText(getApplicationContext(), "onArmButtonTap", Toast.LENGTH_LONG).show();
}
}
"Flight Modes" section needs to be populated.
I'm specifically interested in flight mode needed for local position control with the PX4FLOW. "Loiter" mode does not exist in the current version of QGC.
Can someone help ?
Discussion on this here: http://discuss.px4.io/t/reboot-pixhawk-from-qgc/3508/6
Add Joystick button limitations as per: mavlink/qgroundcontrol#5502 (comment)
This is on the Daily Build:
QGroundControl Development HEAD:8aba44562 2018-07-2814:17:58-0400
But is also in:
QGroundControl Development HEAD:e3833aa5f 2018-07-13 11:43:25 -0700
So the confusing thing is for Plane Roll Sensitivity, how did 0.4s end up on the left side of 0.05s when 0.3s is on the other side. Same thing with Plane Pitch. why is 0.8 s is on the right of 0.95 s when 0.85 s is all the way to the left? What am I missing?
Personally, I prefer the original version with the Slider. Why not incorporate the numerical scale above or below the graduation tick marks with the slider?
Please advise. Thanks.
Add docs: mavlink/qgroundcontrol#6295
When done, this should be linked from topic en/debug/sensor_uorb_topic_debugging.md that will be added to PX4 devguide by PX4/PX4-Devguide#145
Under https://docs.qgroundcontrol.com/en/getting_started/download_and_install.html under Ubuntu Linux / Compressed Archive it is mentioned to "Install additional packages as specified in the github README. You do not need to install Qt."
However the github README has been stripped of mentioning these dependencies.
Daily build docs here: https://docs.qgroundcontrol.com/en/releases/daily_build_new_features.html#fixed-wing-landing-pattern
More detail on the commands involved here: mavlink/mavlink#749 (comment)
Just installed QGC v3.5.0 in Lenovo laptop running Windows 10 Pro v1803. QGC attempts to open but fails. While looking at Task Manager, the app starts to open but Status momentarily shows Suspended, then QGC disappears.
Any ideas/ advise on how to resolve is highly appreciated. @DonLakeFlyer any thoughts or comments?
Thanks.
Using QGroundControl on Ubuntu 16.04 LTS. I have been using QGroundControl v3.5.3 for months without issue. I opened up QGroundControl v3.4.1 by mistake (I have icons for both side-by-side on my desktop). It opened in a weird "full full screen" mode covering up the entire screen including the taskbar, the system menu, etc., and did not have a system menu. The very top of the screen was QGC's "File" option. The only way to exit was to use "File->Exit." I then tried opening up v3.5.3 and it, too, is now showing in the same weird full screen mode. I cannot get it to go back to a windowed or even a "standard" full screen mode. I have tried deleting QGroundControl.ini, ALT-Space, ALT-F7, ALT-F8, but none of these work. I cannot move the window at all. I cannot resize it, and I don't see any options controlling these in Settings. I have been searching on Google for more than 2 hours and I can't find a solution. What the hell is up with this thing?
QGC and Pixhawk 4 Flight Controller.... Quad copter will not arm for flight, messages says, "SEE CONSOLE".....? QGC CONSOLE lists "D", "I", and "E" lines with seems to be errors encountered by either QGC or Pixhawk Flight Controller.....! NO WHERE in any Documentation is there any type of Explanation of these Error's and their Causes.... You can not assume that everyone who uses QGC/Pixhawk knows everything there is to know about either device. I've submitted the problems to PX4.io a supposedly support Discussion and they never replied because they wanted a flight LOG, well people, if your Device/Quad/Plane/Rover/whatever will not ARM.... it's not going ANY WHERE, and therefore A FLIGHT LOG IS NOT CREATED......! So all the Braininess need to come together and focus on the 844 issues - and stop sitting on their thumbs doing nothing....!!!!!!!!
If ya can't fix the problems....get the hell out of the Business...>! =)
https://donlakeflyer.gitbooks.io/qgroundcontrol-user-guide/content/en/PlanView/PlanRallyPoints.html
We need a better explanation than "Rally Points are alternative landing or loiter locations". We then need to link to PX4 and ArduPilot docs that explain the feature.
YOUR VEHICLE IS NOT RESPONDING .
Hello
It would bé great qgc to offer rc override fonction for full joystick control
Virtual joystick is very unreliable it would bé great to connect any kind of gamepad, just like it today is already possible in mission planner
Thanks for your support
Guillaume
Current layout was a bad idea
DESCRIBE PROBLEM WITH DOCS HERE
Bug Page: Overview · QGroundControl User Guide
Bookmark is confusing
To improve recorded video output, I've had success with the following GStreamer pipeline:
gst-launch-1.0 -e udpsrc port=1234 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264" ! rtph264depay ! avdec_h264 ! tee name=tp tp. ! queue ! autovideosink sync=false tp. ! queue ! x264enc speed-preset=3 tune=zerolatency bitrate=3000 key-int-max=0 ! mp4mux ! filesink location="d:/temp/mystream2.mp4" sync = false
You will need to get rid of the h264parse in your existing pipeline as it doesn't seem to work with the mp4mux.
sync = false is important for getting smooth low latency video.
Note: avdec_h264 is in the ugly plugins (for 1.52) but works just fine.
Edit:
Please delete... placed in wrong project.
The link in the daily build feature page links to the .md file. Also the .html file didn't seem to get built.
Hi, I am currently using Intel Aero Drone with Pixhawk and PX4 with the help of QGroundControl.
I connected the drone to my computer and I am able to see through the drone's camera via QGC.
I also have access to the 3 angles of the drone in live that are the heading, the pitch and the roll. Unfortunately, the place where I should be reading the altitude is left blank and I can not figure out why. I have taken a screenshot of what it looks like, I previously realised calibration of the sensors.
Thanks for your help,
Best regards,
Paul. #
I see that there is a new red camera symbol in the android up which is assume is a video record button? if not then what is it suppose to do? When clicking on it it does nothing ? It only changes shape to a square ?
We minimally need "airframe setup" information. Not sure how to handle this - depends on how firmware specific the support is, and how different it is from other vehicles - e.g. can we plan missions, can we do other things ...
There are several broken links in the Survey (Plan Pattern) page.
https://docs.qgroundcontrol.com/en/PlanView/pattern_survey.html
For comparison QGC 2.97 will allow this joystick to be used correctly with the first 4 axis.
In master build, the roll axis (mode 2 right stick) will move axis 5 and 6. Pitch axis can't be calibrated correctly and sits waiting for the final down position indefinitely.
The information below was captured from old wiki. Proposal is to add relevant informaiton under /Releases section and link to github contribution section.
====== Credits / Contact ======
QGroundControl is a community effort to build a next generation micro air vehicle ground control station.
=== Maintainer / Contact ===
=== Developers ===
// In alphabetical order of last name://
=== Libraries ===
We are relying on some open source libraries as base for our application.
=== History ===
The base code was developed 2009-2010 in the [[http://pixhawk.ethz.ch|Pixhawk Project at ETH Zurich]] by Lorenz Meier. It is since 2010 under community development with a wide range of projects and individuals.
FlightGear and the like.
Currently, extra installation steps are required to use video features on linux. We should link to this in the install section of the documentation.
One day it might be easier for everyone: mavlink/qgroundcontrol#7287
There was an issue about this in gitbook's github repository, they have removed the issues list entirely: https://github.com/GitbookIO/gitbook
We have emailed gitbook, but that conversation has not yet been helpful.
I'm not sure if this issue exists on their newer documentation platform (which is version controlled, but not using git).
Copy Trims "additional settings" should be on for ArduPilot from QGC3.2. Is currently in daily build
As per #80 (comment)
We need new screenshots on ArduPilot to cover:
@DonLakeFlyer To provide these, as I can't replicate (or perhaps even better, if this can be mocked explain exactly how and I can add that to our mocklink docs.)
Information required for that here: mavlink/qgroundcontrol#3049
Ricoh GR II
fl (mm): 18.3
image width (pix): 4928
image height: 3264
sensor width (mm): 23.7
sensor height: 15.7
RedEdge
fl: 5.5
image width: 1280
image height: 960
sensor width: 4.8
sensor height: 3.6
Triple checked! Plus, the ability to "save as" to create/save our own cameras would be fantastic. Thanks!
In the documentation on this page
https://dev.qgroundcontrol.com/master/en/getting_started/
For the qt-pro stuff it says:
In the installer Select Components dialog choose: 5.12.6.
5.12.6 isn't included in the qt-pro package by default.
I am receiving build errors of:
Project ERROR: Unknown module(s) in QT: location positioning quickcontrols2 texttospeech multimedia location-private positioning-private charts x11extras waylandclient
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.