× New: Site Scan integration with Autodesk BIM 360

What We Tend to Open

We believe in putting powerful tools in the hands of developers. In many cases, this means open sourcing what we are working on early and often in accordance with our policy and core values. When contributing to other open source projects we strive to follow best practices and licenses set by that open source community. As a rule of thumb, we will open source, under various licenses, the following types of software:

Generic tools: A tool, library, or other utility that solves a generic problem

Non-core: Software not part of our core value proposition as a business

Discretionary: Code that we collectively decide provides greater value to our community of developers than the incremental value it may provide to 3DR if kept proprietary

Derived work: As it is often faster to develop using open tools, we correspondingly open derived works based on those tools in adherence with the license terms and conventions.

How We Develop

In general, we are biased towards developing in an open fashion to the ends of finding bugs early, driving platform adoption, and increasing developer goodwill. 3DR protects future product releases until they are public. We practice modular (not monolithic) software development so that software not directly related to future products can be considered for open sourcing based on the metrics above. Above all else, we like to develop in a fashion that adds to overall platform value, which keeps us happy as engineers and typically means opening early and often!

3DR believes in the open-source development model, and we are proud to include the following open source componets in Solo.

Source:

Why Open Source?

Culture: Started by Chris Anderson in 2007, DIYD has grown into the world’s largest open robotics community.

Trust: The home for 3DR’s open source platform. The Dronecode Project is a collaborative project that brings together open source projects under a nonprofit structure governed by the Linux Foundation.

Quality: 3DR’s free and open application development platform. This enable makers everywhere to leverage our platform and create their own drone apps for free.

History: “The app store for drones.” The home for drone apps developed on our platform.

Recruiting: The most robust and versatile open drone flight code on the planet. The Tower open source community is located here.

Portability (no lock in): The world’s best selling autopiR Our partners in the open hardware Pixhawk project.

Reuse: Check out consumer drone projects powered by our Pixhawk autopilot.

PROJECT COMPONENT VERSION LICENSE
ArduPilot Copter Flight code 3 GPLv3
Linux Kernel 3.10.17 GPLv2
U-boot Bootloader 2013.04 GPLv2
Linux-Wireless hostap-daemon 2.4 BSD
Linux-Wireless cfg80211/nl80211/ath9k backports-20141221 GPLv2
Linux-Wireless WPA-Supplicant 2 BSD
Linux-Wireless iw 3.11 BSD
Linux-Wireless wireless-tools 29 GPLv2
MAVproxy 1.4.4 GPLv3
pyMAVlink 1.4.41 LGPLv3
DroneKit solo-release Apache
gstreamer Gstreamer 0.1.0 LGPL
gstreamer Plugins (good, base) 0.1.0 LGPL
Python 2.7.3 PSF
OpenSSH OpenSSH Server 6.2 BSD
IPTables 1.4.19.1 GPLv2+
dnsmasq 2.55 GPLv3
rpm 5.4.9 LGPL 2.1
e2fsprogs 1.42.8 GPLv2
dosfstools 2.11 GPLv2
nano 2.25 GPLv2
vim 7.4.27 VIM
busybox 1.21.1 GPLv2
Gstreamer Solo app 1 LGPL 2.1
Alamo Fire Solo app MIT
HanekeSwift Solo app Apache V2
GPU Image Solo app BSD 2 Clause
Swifty JSON Solo app MIT
AKPickerView Solo app MIT
CocoaAsyncSocker Solo app Public Domain
MAVlink (Generated Code) Solo app LGPLv3
NMSSH Solo app MIT
XCGLogger Solo app MIT
Pixhawk Autopilot hardware 2 CC BY-SA 3.0
tag * ppcUrlCookiePart1 and ppcUrlCookiePart2 must be called, see bottom of script * update ppcUrlCookiePart2 and ppcUrlCookiePart2 to match your querystring and form field names * */ //Leave this as true to always use querystring values if they exist, if no querystring will attempt to get cookie values var ppcUseLatestValues = true; //set this to false to use cookie values if they exist (if false, will not check querystring first). //function to grab params from cookie function getCookie(param_name) { var i, x, y, cookie = document.cookie.split(";"); for (i = 0; i < cookie.length; i++) { x = cookie[i].substr(0, cookie[i].indexOf("=")); y = cookie[i].substr(cookie[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == param_name) { return unescape(y); } } } //function to create cookie function setCookie(param_name, value, exdays) { var exdate = new Date(); exdate.setDate(exdate.getDate() + exdays); //CHANGE DOMAIN BELOW TO MATCH SITE var c_value = escape(value) + ((exdays == null) ? "" : "; domain=.3dr.com; path=/; expires=" + exdate.toUTCString()); document.cookie = param_name + "=" + c_value; } //function to check if cookie exists and, if so, run the setCookie function function checkCookie(param_name, param_url_name) { var param_value = getCookie(param_name); if ((param_value != null && param_value != "" && param_value != "undefined") && ppcUseLatestValues == false) { //this means the param name/value pair exists - and we don't want to use latest } else { //this means the param name/value pair does not exist - so create it //grab values from URL var pageURL = window.location.search.substring(1); var URLVariables = pageURL.split('&'); for (var i = 0; i < URLVariables.length; i++) { var parameterName = URLVariables[i].split('='); if (parameterName[0] == param_url_name) { //filter out "#" in case that is in the last URL param param_value = decodeURIComponent(parameterName[1].split("#")[0]); } } if (param_value != "undefined" && param_value != "" && param_value != null) { //create cookie setCookie(param_name, param_value, 365); } } } //function to setup the parameters and save the cookie values function ppcUrlCookiePart1() { //setup list/array of parameters desired. names on right should match querystring names var param_names = new Array( 'utm_source;utm_source', 'utm_medium;utm_medium', 'utm_campaign;utm_campaign', 'utm_term;utm_term', 'utm_content;utm_content' ); //loop through all params and create cookie for (i = 0; i < param_names.length; i++) { var param_object = param_names[i].split(";");//split out the cookie name and url name var param_name = param_object[0]; var param_url_name = param_object[1]; //start the cookie creation checkCookie(param_name, param_url_name); } } //function to grab cookie params function mGetCookie(param_name) { var i, x, y, cookie = document.cookie.split(";"); for (i = 0; i < cookie.length; i++) { x = cookie[i].substr(0, cookie[i].indexOf("=")); y = cookie[i].substr(cookie[i].indexOf("=") + 1); x = x.replace(/^\s+|\s+$/g, ""); if (x == param_name) { return unescape(y); } } } //function to check if cookie exists and, if so, fill out the corresponding form fields function mCheckCookie(param_name, param_field_name) { var param_value = mGetCookie(param_name); if (param_value != null && param_value != "" && param_value != "undefined") { try { var obj1 = document.getElementsByName(param_field_name); obj1[0].value = param_value; return true; } catch (err) { return false; } } return false; } //function to setup parameters and begin cookie value insertion into marketo form function ppcUrlCookiePart2() { //setup list/array of parameters desired. names on right should match hidden form field names var param_names = new Array( 'utm_source;Lead Source Name (Last Touch)', 'utm_medium;Lead Source Last Touch', 'utm_campaign;Lead Campaign (Last Touch)', 'utm_term;Lead Campaign Term (Last Touch)', 'utm_content;Lead Campaign Content (Last Touch)' ); //loop through all params and create cookie for (i = 0; i < param_names.length; i++) { var param_object = param_names[i].split(";");//split out the cookie name and url name var param_name = param_object[0]; var param_field_name = param_object[1]; //start the cookie creation mCheckCookie(param_name, param_field_name); } } //ppcUrlCookiePart1 will grab values from the querystring and save them in cookies ppcUrlCookiePart1(); //ppcUrlCookiePart2 will retrive values from the cookies and populate the hidden form fields - should be in the onload try { //attempt for Marketo form MktoForms2.whenReady(function (form){ ppcUrlCookiePart2(); }); } catch (err) { //if error on Marketo form, try loading for regular form. ppcUrlCookiePart2(); }