text: (window.webpackJsonp=window.webpackJsonp||[]).push([[55],{1229:function(e,t,r){e.exports=r.p+"assets/img/px4flow_v1.0_top_generated.d62003e3.png"},1230:function(e,t,r){e.exports=r.p+"assets/img/px4flow_top.8e2c92ec.jpg"},1231:function(e,t,r){e.exports=r.p+"assets/img/px4flowalignwithpixhawk.72ce1e4f.jpg"},1232:function(e,t,r){e.exports=r.p+"assets/img/flow_focus_book.2ea5c9f8.jpg"},1233:function(e,t,r){e.exports=r.p+"assets/img/flow_focusing.db3b5bed.png"},1234:function(e,t,r){e.exports=r.p+"assets/img/px4flow_trajectory.4733623b.jpg"},1235:function(e,t,r){e.exports=r.p+"assets/img/qgc_video_downlink_px4flow.7a3b0283.jpg"},1236:function(e,t,r){e.exports=r.p+"assets/img/px4flow_video_distorted.1e91d641.png"},1237:function(e,t,r){e.exports=r.p+"assets/img/px4flow_testing.fe2ec9d2.jpg"},1238:function(e,t,r){e.exports=r.p+"assets/img/px4flow_onboard_parameters.5b280541.png"},1239:function(e,t){e.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkEAIAAACvEN5AAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAACXZwQWcAAABkAAAAZACHJl7mAAABf0lEQVR42u3bwQ2CQBRFUT+hJFdu3EIdFmkrVGAdNsENCTmnglncvJkQndfz9Xw9H3CqdY455rj6GNzNOp/5zOfqY3A36+yzz371Mbibec973nP1Mbgbi0VCWCSERWJd9mVfhMXJLBYJYZGY7bE9tqtPwe1YLBLCIiEsEj43kLBYJIRFQlgkvLFIWCwSwiLhKiRhsUgIi8Q622zj5w2czBuLhKuQhLBIuApJWCwSwiIhLBLeWCQsFglhkXAVkrBYJIRFQlgkvLFIWCwSwiLhKiRhsUgIi4SwSHhjkbBYJIRFYl22ZVv8YZWTWSwSwiIhLBI+N5CwWCSERcJVSMJikRAWCWGR8MYiYbFICIuEq5CExSIhLBLCIuGNRcJikRAWCVchCYtFQlgkhEXCH1ZJWCwSwiLhcwMJi0VCWCSERcIbi4TFIiEsEq5CEhaLhLBICIuENxYJi0VCWCRchSQsFglhkRAWCW8sEhaLxHx/39/3d/UxuJt1jjnmuPoY3M0fGs5gaLxsDUAAAAAASUVORK5CYII="},1240:function(e,t){e.exports="data:image/png;base64,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"},2199:function(e,t,r){"use strict";r.r(t);var a=r(18),o=Object(a.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"px4flow-smart-camera"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#px4flow-smart-camera"}},[e._v("#")]),e._v(" PX4FLOW Smart Camera")]),e._v(" "),a("p",[e._v("PX4FLOW is an "),a("RouterLink",{attrs:{to:"/ko/sensor/optical_flow.html"}},[e._v("optical flow")]),e._v(" smart camera. It has a native resolution of 752x480 pixels and calculates optical flow on a 4x binned and cropped area at 400 Hz, giving it a very high light sensitivity.")],1),e._v(" "),a("p",[a("img",{attrs:{src:r(1229),alt:"PX4Flow v1.0"}})]),e._v(" "),a("p",[e._v("Unlike many mouse sensors, it also works indoors and in low outdoor light conditions without the need for an illumination LED. It can be freely reprogrammed to perform any other basic, efficient low-level computer vision tasks.")]),e._v(" "),a("ul",[a("li",[e._v("168 MHz Cortex M4F CPU (128 + 64 KB RAM)")]),e._v(" "),a("li",[e._v("752x480 MT9V034 image sensor, L3GD20 3D Gyro")]),e._v(" "),a("li",[e._v("16 mm M12 lens (IR block filter)")]),e._v(" "),a("li",[e._v("Size 45.5 mm x 35mm")]),e._v(" "),a("li",[e._v("Power consumption 115mA / 5V")])]),e._v(" "),a("p"),a("div",{staticClass:"embed-responsive embed-responsive-16by9"},[a("iframe",{staticClass:"embed-responsive-item youtube-player",attrs:{type:"text/html",width:"640",height:"390",src:"https://www.youtube.com/embed/0Jpq6DU_HVg",frameborder:"0",webkitallowfullscreen:"",mozallowfullscreen:"",allowfullscreen:""}})]),a("p"),e._v(" "),a("h2",{attrs:{id:"where-to-buy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#where-to-buy"}},[e._v("#")]),e._v(" Where to Buy")]),e._v(" "),a("p",[e._v("Order this module from:")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"http://www.unmannedtechshop.co.uk/px4flow-smart-camera-optical-flow-sensor/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Unmanned Tech"),a("OutboundLink")],1),e._v(" (UK)")]),e._v(" "),a("li",[a("a",{attrs:{href:"https://shop.holybro.com/px4flow-kit_p1035.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Holybro"),a("OutboundLink")],1),e._v(" (Germany & EU)")]),e._v(" "),a("li",[a("a",{attrs:{href:"https://store-drotek.com/798-optical-flow-kit-px4flow.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Drotek"),a("OutboundLink")],1)])]),e._v(" "),a("h2",{attrs:{id:"specifications"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#specifications"}},[e._v("#")]),e._v(" Specifications")]),e._v(" "),a("ul",[a("li",[e._v("MT9V034 machine vision CMOS sensor with global shutter")]),e._v(" "),a("li",[e._v("Optical flow processing at 4x4 binned image at "),a("strong",[e._v("400 Hz")])]),e._v(" "),a("li",[e._v("Superior light sensitivity with 24x24 μm super-pixels")]),e._v(" "),a("li",[e._v("Onboard 16bit gyroscope up to 2000°/s and 780 Hz update rate, default high precision-mode at 500°/s")]),e._v(" "),a("li",[e._v("Onboard sonar input and mount for "),a("RouterLink",{attrs:{to:"/ko/sensor/rangefinders.html#maxbotix-i2cxl-maxsonar-ez"}},[e._v("Maxbotix sonar sensors")]),e._v(". (HRLV-EZ4 recommended, "),a("a",{attrs:{href:"https://www.sparkfun.com/products/11309",target:"_blank",rel:"noopener noreferrer"}},[e._v("SparkFun Product Link"),a("OutboundLink")],1),e._v(")")],1),e._v(" "),a("li",[e._v("USB bootloader")]),e._v(" "),a("li",[e._v("USB serial up to 921600 baud (including live camera view with "),a("a",{attrs:{href:"http://qgroundcontrol.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGroundControl"),a("OutboundLink")],1),e._v(")")]),e._v(" "),a("li",[e._v("USB power option")]),e._v(" "),a("li",[a("strong",[e._v("Does fit the MatrixVision Bluefox MV mounting holes (camera center off-centered)")])])]),e._v(" "),a("p",[a("img",{attrs:{src:r(1230),alt:"PX4Flow Top"}}),e._v(" "),a("img",{attrs:{src:r(375),alt:"px4flow-bottom"}})]),e._v(" "),a("h2",{attrs:{id:"pixhawk-setup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pixhawk-setup"}},[e._v("#")]),e._v(" Pixhawk Setup")]),e._v(" "),a("p",[e._v("In order to use the PX4Flow board, connect it to the I2C bus (on any Pixhawk series controller) and enable the driver using "),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_EN_PX4FLOW"}},[e._v("SENS_EN_PX4FLOW")]),e._v(".")],1),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("PX4FLOW does not work on FMUv5 (Pixhawk 4) for PX4 versions less than **1.9.0**. All other PX4/PX4-Autopilot versions should work.")])]),e._v(" "),a("p",[e._v("The steps are:")]),e._v(" "),a("ul",[a("li",[e._v("In "),a("em",[e._v("QGroundControl")]),e._v(":\n"),a("ul",[a("li",[e._v("Update the firmware on PX4Flow (in the top left menu, click on CONFIG, then on Firmware Upgrade)")]),e._v(" "),a("li",[e._v("Set the parameter "),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_EN_PX4FLOW"}},[e._v("SENS_EN_PX4FLOW")]),e._v(" and reboot (see "),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameters.html"}},[e._v("Parameters")]),e._v(" for information on finding and setting parameters).")],1)])]),e._v(" "),a("li",[e._v("Connect PX4Flow I2C to the Pixhawk I2C")])]),e._v(" "),a("p",[e._v("Once enabled, the module will be detected on boot. Flow data should be coming through at 10Hz if the autopilot is connected via "),a("strong",[e._v("USB")]),e._v(". Flow data is transmitted over wireless channels at a lower rate.")]),e._v(" "),a("p",[a("span",{attrs:{id:"mounting"}})]),e._v(" "),a("h3",{attrs:{id:"mounting-orientation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#mounting-orientation"}},[e._v("#")]),e._v(" Mounting/Orientation")]),e._v(" "),a("p",[e._v("The recommended mounting orientation is defined as Y on flow board pointing towards "),a("strong",[e._v("front of vehicle")]),e._v(", as shown in the following picture.")]),e._v(" "),a("p",[a("img",{attrs:{src:r(1231),alt:"PX4Flow align with Pixhawk"}})]),e._v(" "),a("p",[e._v("On "),a("strong",[e._v("PX4")]),e._v(", the orientation should be set using the parameter "),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_FLOW_ROT"}},[e._v("SENS_FLOW_ROT")]),e._v(". The above orientation maps to "),a("a",{attrs:{href:"#SENS_FLOW_ROT"}},[e._v("SENS_FLOW_ROT=270")]),e._v(" degrees (the default).")],1),e._v(" "),a("p",[e._v("Make sure the PX4Flow board is well dampened.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("PX4Flow emits a significant amount of electromagnetic radiation, and should be placed as far away from other electronics (in particular GPS modules) as possible (see [Hardware/issues/8](https://github.com/PX4/Hardware/issues/8) for more information).")])]),e._v(" "),a("p",[a("span",{attrs:{id:"px4_configuration"}})]),e._v(" "),a("h2",{attrs:{id:"px4-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#px4-configuration"}},[e._v("#")]),e._v(" PX4 Configuration")]),e._v(" "),a("p",[e._v("The PX4Flow parameters that you may need to configure are listed below.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Parameter")]),e._v(" "),a("th",[e._v("Description")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[a("span",{attrs:{id:"SENS_EN_PX4FLOW"}}),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_EN_PX4FLOW"}},[e._v("SENS_EN_PX4FLOW")])],1),e._v(" "),a("td",[e._v("Start the PX4 Flow driver.")])]),e._v(" "),a("tr",[a("td",[a("span",{attrs:{id:"SENS_FLOW_MAXHGT"}}),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_FLOW_MAXHGT"}},[e._v("SENS_FLOW_MAXHGT")])],1),e._v(" "),a("td",[e._v("Maximum height above ground when reliant on optical flow.")])]),e._v(" "),a("tr",[a("td",[a("span",{attrs:{id:"SENS_FLOW_MINHGT"}}),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_FLOW_MINHGT"}},[e._v("SENS_FLOW_MINHGT")])],1),e._v(" "),a("td",[e._v("Minimum height above ground when reliant on optical flow.")])]),e._v(" "),a("tr",[a("td",[a("span",{attrs:{id:"SENS_FLOW_MAXR"}}),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_FLOW_MAXR"}},[e._v("SENS_FLOW_MAXR")])],1),e._v(" "),a("td",[e._v("Maximum angular flow rate reliably measurable by the optical flow sensor.")])]),e._v(" "),a("tr",[a("td",[a("span",{attrs:{id:"SENS_FLOW_ROT"}}),a("RouterLink",{attrs:{to:"/ko/advanced_config/parameter_reference.html#SENS_FLOW_ROT"}},[e._v("SENS_FLOW_ROT")])],1),e._v(" "),a("td",[e._v("Yaw rotation of the PX4FLOW board relative to the vehicle body frame.")])])])]),e._v(" "),a("p",[e._v("If you're using flow with the ECL/EFK2 estimator you will also need to set the "),a("RouterLink",{attrs:{to:"/ko/sensor/optical_flow.html#ekf2"}},[e._v("Optical Flow > Estimators > EKF2")]),e._v(" parameters. These enable fusing optical flow measurements for velocity calculation and also allow you to define offsets if the sensor is not centred within the vehicle.")],1),e._v(" "),a("h3",{attrs:{id:"connecting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#connecting"}},[e._v("#")]),e._v(" Connecting")]),e._v(" "),a("p",[e._v("The PX4flow is connected to the I2C bus. If you are connecting multiple devices to the same bus you will need to set each with a unique address. The next section explains how.")]),e._v(" "),a("h3",{attrs:{id:"px4flow-i2c-device-address"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#px4flow-i2c-device-address"}},[e._v("#")]),e._v(" PX4FLOW I2C Device address")]),e._v(" "),a("p",[e._v('The default I2C address of the PX4Flow is 0x42, but it can be incremented using the three solder jumpers labeled "I2C BUS ADDR". This is useful if another device has the same address.')]),e._v(" "),a("p",[e._v("The address increment is equal to the 3-bit value encoded by the jumpers. For example if jumper 0 and 1 are soldered and jumper 2 is unsoldered, the address is incremented by 1"),a("em",[e._v("1 + 1")]),e._v("2 + 0*4 = 3, which gives address 0x45. If all jumpers are unsoldered, the camera will be automatically discovered by the autopilot firmware.")]),e._v(" "),a("p",[e._v("The address range for the 8 possible choices is: 0x42 - 0x49.")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Address")]),e._v(" "),a("th",[e._v("Bit 2")]),e._v(" "),a("th",[e._v("Bit 1")]),e._v(" "),a("th",[e._v("Bit 0")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("7 Bit Address 0x42 (default)")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("0")])]),e._v(" "),a("tr",[a("td",[e._v("7 Bit Address 0x43")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("1")])]),e._v(" "),a("tr",[a("td",[e._v(":")]),e._v(" "),a("td",[e._v(":")]),e._v(" "),a("td",[e._v(":")]),e._v(" "),a("td",[e._v(":")])]),e._v(" "),a("tr",[a("td",[e._v("7 Bit Address 0x49")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("1")])])])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[e._v("There are different I2C readouts available. Details about the "),a("strong",[e._v("I2C frame")]),e._v(" and the "),a("strong",[e._v("I2C integral frame")]),e._v(" are in the driver source code.")])]),e._v(" "),a("p",[e._v("If you modify the I2C address of the PX4Flow, make sure to start the PX4 driver with the correct address:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("px4flow start                  # address=0x42 (default)\npx4flow stop\npx4flow start -a 0x45          # address=0x45\n")])])]),a("h2",{attrs:{id:"focusing-the-lens"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#focusing-the-lens"}},[e._v("#")]),e._v(" Focusing the Lens")]),e._v(" "),a("p",[e._v("In order to ensure good optical flow quality, it is important to focus the camera on the PX4Flow to the desired height of flight. To focus the camera, put an object with text on (e. g. a book) and plug in the PX4Flow into USB and run "),a("em",[e._v("QGroundControl")]),e._v(". Under the settings menu, select the PX4Flow and you should see a camera image. Focus the lens by unscrewing the set screw and loosening and tightening the lens to find where it is in focus.")]),e._v(" "),a("div",{staticClass:"custom-block note"},[a("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),a("p",[e._v("If you fly above 3m, the camera will be focused at infinity and won't need to be changed for higher flight.")])]),e._v(" "),a("p",[a("img",{attrs:{src:r(1232),alt:"Flow Focus Book"}})]),e._v(" "),a("p",[a("em",[e._v("Figure: Use a text book to focus the flow camera at the height you want to fly, typically 1-3 meters. Above 3 meters the camera should be focused at infinity and work for all higher altitudes.")])]),e._v(" "),a("p",[a("img",{attrs:{src:r(1233),alt:"Flow Focusing"}})]),e._v(" "),a("p",[a("em",[e._v("Figure: The QGroundControl px4flow interface that can be used for focusing the camera")])]),e._v(" "),a("h2",{attrs:{id:"accuracy"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#accuracy"}},[e._v("#")]),e._v(" Accuracy")]),e._v(" "),a("p",[e._v('The ortho photo below shows that a flight on the park roads is accurately measured. This was done with a PX4FMU on a 7" quad flying at about 1.6 m altitude in manual flight. No GPS, only PX4FLOW integration of position.')]),e._v(" "),a("p",[a("img",{attrs:{src:r(1234),alt:"PX4FLOW trajectory"}})]),e._v(" "),a("h2",{attrs:{id:"downloads"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#downloads"}},[e._v("#")]),e._v(" Downloads")]),e._v(" "),a("h3",{attrs:{id:"manual-and-schematics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manual-and-schematics"}},[e._v("#")]),e._v(" Manual and Schematics")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/PX4/px4_user_guide/raw/master/assets/hardware/sensors/px4flow/px4flow_manual_v1.3.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("PX4FLOW v1.3 User Manual"),a("OutboundLink")],1)]),e._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/PX4/px4_user_guide/raw/master/assets/hardware/sensors/px4flow/px4flow_schematic_v1.3.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("PX4FLOW v1.3 Schematic and Layout"),a("OutboundLink")],1)]),e._v(" "),a("li",[e._v("Documentation in hardware repo: "),a("a",{attrs:{href:"https://github.com/PX4/Hardware/tree/master/FLOWv1",target:"_blank",rel:"noopener noreferrer"}},[e._v("PX4/Hardware/FLOWv1"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"usb-driver"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usb-driver"}},[e._v("#")]),e._v(" USB Driver")]),e._v(" "),a("p",[e._v("Linux and MacOS come with the required drivers. Windows drivers can be downloaded from: "),a("a",{attrs:{href:"https://github.com/PX4/px4_user_guide/raw/master/assets/hardware/sensors/px4flow/px4flow_win_drivers.zip",target:"_blank",rel:"noopener noreferrer"}},[e._v("px4flow_win_drivers.zip"),a("OutboundLink")],1)]),e._v(" "),a("h3",{attrs:{id:"papers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#papers"}},[e._v("#")]),e._v(" Papers")]),e._v(" "),a("p",[e._v("The flow module as been accepted as paper to the International Conference on Robotics and Automation (ICRA 2013) in Karlsruhe, Germany.")]),e._v(" "),a("ul",[a("li",[e._v("Dominik Honegger, Lorenz Meier, Petri Tanskanen and Marc Pollefeys: "),a("a",{attrs:{href:"https://github.com/PX4/px4_user_guide/raw/master/assets/hardware/sensors/px4flow/px4flow_paper.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("An Open Source and Open Hardware Embedded Metric Optical Flow CMOS Camera for Indoor and Outdoor Applications"),a("OutboundLink")],1)])]),e._v(" "),a("h3",{attrs:{id:"libraries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#libraries"}},[e._v("#")]),e._v(" Libraries")]),e._v(" "),a("p",[e._v("The following are third party libraries that can be used to integrate the flow module in your projects.")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/vooon/mavros",target:"_blank",rel:"noopener noreferrer"}},[e._v("mavros"),a("OutboundLink")],1),e._v(": A general MAVLink ROS interface, maintained by Vladimir Ermakov")]),e._v(" "),a("li",[e._v("[px-ros-pkg]](https://github.com/cvg/px-ros-pkg): A PX4FLOW ROS (Robot Operating System) interface, maintained by Lionel Heng (hengli@inf.ethz.ch).")]),e._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/eschnou/arduino-px4flow-i2c",target:"_blank",rel:"noopener noreferrer"}},[e._v("arduino-px4flow-i2c"),a("OutboundLink")],1),e._v(": An Arduino library wrapping the I2C interface, maintained by Laurent Eschenauer (laurent@eschenauer.be).")])]),e._v(" "),a("h2",{attrs:{id:"connectors"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#connectors"}},[e._v("#")]),e._v(" Connectors")]),e._v(" "),a("ul",[a("li",[a("strong",[e._v("USART2 (J2)")]),e._v(": Hirose DF13 6 pos ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=H3371-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: DF13A-6P-1.25H(20)"),a("OutboundLink")],1),e._v(")\n"),a("ul",[a("li",[e._v("Mates: Hirose DF13 6 pos housing ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=H2182-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: Hirose DF13-6S-1.25C"),a("OutboundLink")],1),e._v(")")])])]),e._v(" "),a("li",[a("strong",[e._v("USART3 (J1)")]),e._v(": Hirose DF13 6 pos ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=H3370-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: DF13A-6P-1.25H(20)"),a("OutboundLink")],1),e._v(")\n"),a("ul",[a("li",[e._v("Mates: Hirose DF13 6 pos housing ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=DF13-6S-1.25C",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: Hirose DF13-6S-1.25C"),a("OutboundLink")],1),e._v(")")])])]),e._v(" "),a("li",[a("strong",[e._v("I2C1 (J3)")]),e._v(": Hirose DF13 4 pos ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=H3369-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: DF13A-4P-1.25H(20)"),a("OutboundLink")],1),e._v(")\n"),a("ul",[a("li",[e._v("Mates: Hirose DF13 4 pos housing ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=DF13-4S-1.25C",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: Hirose DF13-4S-1.25C"),a("OutboundLink")],1),e._v(")")])])]),e._v(" "),a("li",[a("strong",[e._v("USB (J5)")]),e._v(": Micro USB-B\n"),a("ul",[a("li",[e._v("Mates: Cell phone data / charger cables, e.g. "),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=AE10418-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: ASSMANN AK67421-0.5-R"),a("OutboundLink")],1)])])]),e._v(" "),a("li",[a("strong",[e._v("ARM MINI JTAG (J6")]),e._v(", //not populated per default//"),a("strong",[e._v(")")]),e._v(": 1.27 mm 10pos header (SHROUDED, for Black Magic Probe: Samtec FTSH-105-01-F-DV-K or (untested) or Harwin M50-3600542 ("),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=M50-3600542",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digikey"),a("OutboundLink")],1),e._v(" or "),a("a",{attrs:{href:"http://ch.mouser.com/ProductDetail/Harwin/M50-3600542/?qs=%2fha2pyFadujTt%2fIEz8xdzrYzHAVUnbxh8Ki%252bwWYPNeEa09PYvTkIOQ%3d%3d",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mouser"),a("OutboundLink")],1),e._v(")\n"),a("ul",[a("li",[e._v("JTAG Adapter Option #1: "),a("a",{attrs:{href:"https://1bitsquared.com/products/black-magic-probe",target:"_blank",rel:"noopener noreferrer"}},[e._v("BlackMagic Probe"),a("OutboundLink")],1),e._v(". Note, may come without cables (check with vendor). If so, needs the "),a("strong",[e._v("Samtec FFSD-05-D-06.00-01-N")]),e._v(" cable ("),a("a",{attrs:{href:"http://www.samtec.com/suddenservice/samples/samples.aspx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Samtec sample service"),a("OutboundLink")],1),e._v(" or "),a("a",{attrs:{href:"http://www.digikey.com/product-search/en?x=0&y=0&lang=en&site=us&KeyWords=FFSD-05-D-06.00-01-N",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: SAM8218-ND"),a("OutboundLink")],1),e._v(") and a Mini-USB cable")]),e._v(" "),a("li",[e._v("JTAG Adapter Option #2: "),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=497-10484-ND",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: ST-LINK/V2"),a("OutboundLink")],1),e._v(" / "),a("a",{attrs:{href:"http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00026748.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("ST USER MANUAL"),a("OutboundLink")],1),e._v(", needs an ARM Mini JTAG to 20pos adapter: "),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=MDL-ADA2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: 726-1193-ND"),a("OutboundLink")],1),e._v(" "),a("ul",[a("li",[e._v("JTAG Adapter Option #3: "),a("a",{attrs:{href:"http://www.sparkfun.com/products/8278",target:"_blank",rel:"noopener noreferrer"}},[e._v("SparkFun Link: Olimex ARM-TINY"),a("OutboundLink")],1),e._v(" or any other OpenOCD-compatible ARM Cortex JTAG adapter, needs an ARM Mini JTAG to 20pos adapter: "),a("a",{attrs:{href:"https://www.digikey.com/products/en?keywords=MDL-ADA2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Digi-Key Link: 726-1193-ND"),a("OutboundLink")],1)])])])])])]),e._v(" "),a("h3",{attrs:{id:"optics"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#optics"}},[e._v("#")]),e._v(" Optics")]),e._v(" "),a("p",[e._v("The correct optics are delivered by 3D Robotics already mounted and focused.")]),e._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"http://www.lensation.de/de/shop/detail/27-accessories/flypage/418-s-mount-lens-holder-13mm-sh02m13.html?sef=hcfp",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lens mount"),a("OutboundLink")],1)]),e._v(" "),a("li",[e._v("16 mm M12 (S-mount) lens (with IR-cut filter)")])]),e._v(" "),a("p",[e._v("The focal length influences the maximum measurable velocity.")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("maximum velocity = +/- 4 pixels / (1second/internalupdaterate)*grounddistance/focal length in pixels\n")])])]),a("p",[e._v("The internal update rate is 400 Hz.")]),e._v(" "),a("p",[e._v("pixelsize is 24 micro meters, a 16mm lens has therefore a focal length of 0.016 meter / 24 micro meter per pixel = 666.666 pixels")]),e._v(" "),a("p",[e._v("Max velocities for different focal length lenses and ground distances:")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Ground distance")]),e._v(" "),a("th",[e._v("1m")]),e._v(" "),a("th",[e._v("3m")]),e._v(" "),a("th",[e._v("10m")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("16mm lens")]),e._v(" "),a("td",[e._v("2.4m/s")]),e._v(" "),a("td",[e._v("7.2m/s")]),e._v(" "),a("td",[e._v("24m/s")])]),e._v(" "),a("tr",[a("td",[e._v("8mm lens")]),e._v(" "),a("td",[e._v("4.8m/s")]),e._v(" "),a("td",[e._v("14.4m/s")]),e._v(" "),a("td",[e._v("48m/s")])]),e._v(" "),a("tr",[a("td",[e._v("6mm lens")]),e._v(" "),a("td",[e._v("6.4m/s")]),e._v(" "),a("td",[e._v("19.2m/s")]),e._v(" "),a("td",[e._v("64m/s")])]),e._v(" "),a("tr",[a("td",[e._v("4mm lens")]),e._v(" "),a("td",[e._v("9.6m/s")]),e._v(" "),a("td",[e._v("28.8m/s")]),e._v(" "),a("td",[e._v("96m/s")])])])]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("max_vel = 4/(1/400)*grounddistance/(focallength/0.000024)\n")])])]),a("h2",{attrs:{id:"configuration-image-quality-and-output"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration-image-quality-and-output"}},[e._v("#")]),e._v(" Configuration: Image Quality and Output")]),e._v(" "),a("p",[e._v("PX4FLOW is not designed as a camera, but does all processing on-chip. You can configure the image quality and output (the image output is only intended for focusing the lens).")]),e._v(" "),a("p",[a("img",{attrs:{src:r(1235),alt:"Video Downlink"}})]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("- Download [QGroundControl](http://qgroundcontrol.com/#downloads)\n- Unplug your flow sensor\n- In *QGroundControl*, click on **Configuration > Firmware Update**. Hit the big green **Scan** button.\n- Connect the flow sensor.\n  Click on upgrade once its detected (leave the default to “stable”)\n- Maximize the *QGroundControl* window. Click on **Tool Widgets > Video Downlink**\n- Enjoy the live view and **focus the camera by loosening the locking screw and turning the lens at an object at 3m distance**.\n- If you want to get higher res to focus the sensor, go to **Config > Advanced Config** and set the [VIDEO_ONLY](#VIDEO_ONLY) parameter to 1.\n")])])]),a("h2",{attrs:{id:"general-troubleshooting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-troubleshooting"}},[e._v("#")]),e._v(" General Troubleshooting")]),e._v(" "),a("ul",[a("li",[e._v("Unplug the flow sensor if plugged")]),e._v(" "),a("li",[e._v("Start "),a("em",[e._v("QGroundControl")]),e._v(", select the PX4 startup mode go to "),a("strong",[e._v("Config > Firmware Upgrade")]),e._v(".\n"),a("ul",[a("li",[e._v("Click on SCAN (green button in the center)")]),e._v(" "),a("li",[e._v("Connect the flow sensor now")]),e._v(" "),a("li",[e._v("Flash the stable firmware")])])]),e._v(" "),a("li",[e._v("Click on "),a("strong",[e._v("Advanced Config")]),e._v(" in the left menu to see the parameters")]),e._v(" "),a("li",[e._v("Display the video stream with QGroundControl ("),a("strong",[e._v("Tool Widgets > Video Downlink")]),e._v(")\n"),a("ul",[a("li",[e._v("Check that there are no stripes on the stream. If you get stripes, set "),a("code",[e._v("IMAGE_TEST_PAT")]),e._v(" to 1. It should look like the examples above. If you have stripes in the image but no stripes when this mode is enabled, right-click into the image once in both modes and save and send an image of each mode to the manufacturer's support team.")]),e._v(" "),a("li",[e._v("Check that you get a clear image (its a tele / zoom lens, so the visible area will be small)")])])]),e._v(" "),a("li",[e._v("Set the "),a("code",[e._v("VIDEO_ONLY")]),e._v(" parameter to 1 to obtain a higher resolution image.")]),e._v(" "),a("li",[e._v("Check that the image is sharp at the operating distance (the typical flight altitude)")])]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[a("RouterLink",{attrs:{to:"/ko/contribute/support.html#forums-and-chat"}},[e._v("Ask for help")]),e._v(" if you have a distorted image with visible dark lines (like the one below): "),a("img",{attrs:{src:r(1236),alt:"Distorted video"}})],1)]),e._v(" "),a("p",[a("span",{attrs:{id:"developer_guide"}})]),e._v(" "),a("h1",{attrs:{id:"px4flow-developer-guide"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#px4flow-developer-guide"}},[e._v("#")]),e._v(" PX4FLOW Developer Guide")]),e._v(" "),a("h2",{attrs:{id:"hardware-setup"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#hardware-setup"}},[e._v("#")]),e._v(" Hardware Setup")]),e._v(" "),a("ul",[a("li",[e._v("PX4FLOW Board v1.3")]),e._v(" "),a("li",[e._v("HRLV-MaxSonar-EZ (MB1043)")]),e._v(" "),a("li",[e._v("16mm Lens")]),e._v(" "),a("li",[e._v("Micro USB cable")])]),e._v(" "),a("p",[a("img",{attrs:{src:r(1237),alt:"PX4FLOW Testing"}})]),e._v(" "),a("h2",{attrs:{id:"software-build-source"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#software-build-source"}},[e._v("#")]),e._v(" Software / Build Source")]),e._v(" "),a("ul",[a("li",[e._v("PC with "),a("em",[e._v("QGroundControl")]),e._v(" installed")]),e._v(" "),a("li",[e._v("PX4FLOW Firmware (Firmware source code on Github: "),a("a",{attrs:{href:"https://github.com/PX4/Flow",target:"_blank",rel:"noopener noreferrer"}},[e._v("PX4/Flow"),a("OutboundLink")],1),e._v(")")])]),e._v(" "),a("div",{staticClass:"custom-block note"},[a("p",{staticClass:"custom-block-title"},[e._v("PX4 *driver* code can be found here: [PX4/PX4-Autopilot/src/drivers/px4flow](https://github.com/PX4/PX4-Autopilot/tree/master/src/drivers/optical_flow/px4flow)")])]),e._v(" "),a("h2",{attrs:{id:"build"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#build"}},[e._v("#")]),e._v(" Build")]),e._v(" "),a("p",[e._v("Install the "),a("RouterLink",{attrs:{to:"/ko/dev_setup/dev_env.html"}},[e._v("PX4 toolchain")]),e._v(". Then and clone the sources from https://github.com/PX4/Flow using "),a("em",[e._v("git")]),e._v(".")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" flow\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v(" all\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("make")]),e._v(" upload-usb\n")])])]),a("p",[e._v("Then connect the flow sensor. It should show these steps on a successful upload:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Found board "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("6,0")]),e._v(" bootloader "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rev")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("3")]),e._v(" on /dev/ttyACM1\nerase"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nprogram"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nverify"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\ndone, rebooting.\n")])])]),a("h2",{attrs:{id:"troubleshooting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),a("p",[e._v("In case one doesn't see the aforementioned steps, the modem-manager should be removed by:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("apt-get")]),e._v(" remove modemmanager\n")])])]),a("p",[e._v("User also needs to be in the plugdev group:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("usermod")]),e._v(" -a -G plugdev "),a("span",{pre:!0,attrs:{class:"token environment constant"}},[e._v("$USER")]),e._v("\n")])])]),a("h2",{attrs:{id:"focus-image"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#focus-image"}},[e._v("#")]),e._v(" Focus Image")]),e._v(" "),a("p",[e._v("Connect PX4FLOW to QGroundControl:")]),e._v(" "),a("ul",[a("li",[e._v("Connect PX4FLOW sensor over USB to PC")]),e._v(" "),a("li",[e._v("Open QGroundControl")]),e._v(" "),a("li",[e._v("Switch to Plot perspective: Perspectives/Plot")]),e._v(" "),a("li",[e._v("Connect to PX4FLOW sensor: Communication/Add Link")])]),e._v(" "),a("p",[a("img",{attrs:{src:r(1238),alt:"PX4 Onboard Parameters"}})]),e._v(" "),a("ul",[a("li",[e._v("Link Type: Serial")]),e._v(" "),a("li",[e._v("Protocol: MAVLink")]),e._v(" "),a("li",[e._v("Serial Port: corresponding Port (e.g. /dev/ttyACM* or COMM*)")])]),e._v(" "),a("p",[e._v('Now a new unmanned system should appear and onboard parameters are loaded (click on "Get" if not)')]),e._v(" "),a("p",[e._v("Change Parameter "),a("code",[e._v("VIDEO_ONLY")]),e._v(" to 1 and press Set.")]),e._v(" "),a("p",[e._v("The Widget Video Downlink shows now the Image in full resolution. Focus the lens on 1.5m. Fix the lens position and switch "),a("code",[e._v("VIDEO_ONLY")]),e._v(" Mode off.")]),e._v(" "),a("h2",{attrs:{id:"data-output"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-output"}},[e._v("#")]),e._v(" Data Output")]),e._v(" "),a("p",[e._v("The PX4FLOW module outputs "),a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" packets on USB and serial port. Use "),a("a",{attrs:{href:"http://qgroundcontrol.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("QGroundControl"),a("OutboundLink")],1),e._v(" to read data from the module. An I2C interface for sensor data reading is offered as well. Third party "),a("a",{attrs:{href:"#libraries"}},[e._v("libraries")]),e._v(" are available to connect and integrate PX4FLOW data in your projects.")]),e._v(" "),a("ul",[a("li",[e._v("USART3: MAVLink at 115200, 8N1 baud: "),a("a",{attrs:{href:"https://mavlink.io/en/messages/common.html#OPTICAL_FLOW",target:"_blank",rel:"noopener noreferrer"}},[e._v("OPTICAL_FLOW"),a("OutboundLink")],1),e._v(" message, "),a("a",{attrs:{href:"https://mavlink.io/en/messages/common.html#OPTICAL_FLOW_RAD",target:"_blank",rel:"noopener noreferrer"}},[e._v("OPTICAL_FLOW_RAD"),a("OutboundLink")],1),e._v(", "),a("a",{attrs:{href:"https://mavlink.io/en/messages/common.html#HEARTBEAT",target:"_blank",rel:"noopener noreferrer"}},[e._v("HEARTBEAT"),a("OutboundLink")],1),e._v(" message")]),e._v(" "),a("li",[e._v("USB: Baud rate is not relevant (USB ignores it): "),a("code",[e._v("OPTICAL_FLOW")]),e._v(" message, "),a("code",[e._v("OPTICAL_FLOW_RAD")]),e._v(", "),a("code",[e._v("HEARTBEAT")]),e._v(" message, image.")]),e._v(" "),a("li",[e._v("I2C1: latest Flow value (i2c_frame) and accumulated Flow (i2c_integral_frame) values since last I2C readout available for readout.")])]),e._v(" "),a("h2",{attrs:{id:"px4flow-parameters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#px4flow-parameters"}},[e._v("#")]),e._v(" PX4FLOW Parameters")]),e._v(" "),a("p",[e._v("The following list gives a short explanation of the current available parameters in the PX4FLOW firmware.")]),e._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),a("p",[e._v("Parameters are currently not written to ROM (they reset at power loss). To change them permanently build your own version of firmware using instructions in the "),a("a",{attrs:{href:"#developer_guide"}},[e._v("PX4FLOW Developer Guide")]),e._v(" above. Relevant parameters can be found "),a("a",{attrs:{href:"https://github.com/PX4/Flow/blob/master/src/modules/flow/settings.c",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),a("OutboundLink")],1),e._v(".")])]),e._v(" "),a("h3",{attrs:{id:"bflow-f-thrd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bflow-f-thrd"}},[e._v("#")]),e._v(" BFLOW_F_THRD")]),e._v(" "),a("p",[e._v("This parameter is a feature threshold and limits the quality of patterns that are used to calculate the bottom flow. For low values (e.g. 10) almost every pattern is taken, for higher values (e.g. 100) only significant patters are taken.")]),e._v(" "),a("h3",{attrs:{id:"bflow-v-thrd"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#bflow-v-thrd"}},[e._v("#")]),e._v(" BFLOW_V_THRD")]),e._v(" "),a("p",[e._v("This is a pattern correlation threshold for filtering bad matches. Lower means only strong correlations are accepted.")]),e._v(" "),a("h3",{attrs:{id:"others"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#others"}},[e._v("#")]),e._v(" Others")]),e._v(" "),a("table",[a("thead",[a("tr",[a("th",[e._v("Name")]),e._v(" "),a("th",[e._v("Default")]),e._v(" "),a("th",[e._v("Access")]),e._v(" "),a("th",[e._v("Comment")])])]),e._v(" "),a("tbody",[a("tr",[a("td",[e._v("AEC")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera Automatic Exposure Control. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("AGC")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera Automatic Gain Control. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_F_THLD")]),e._v(" "),a("td",[e._v("40")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("This parameter is a feature threshold and limits the quality of patterns that are used to calculate the bottom flow. For low values (e.g. 10) almost every pattern is taken, for higher values (e.g. 100) only significant patterns are taken.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_V_THLD")]),e._v(" "),a("td",[e._v("5000")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("This is a pattern correlation threshold for filtering bad matches. Lower means only strong correlations are accepted.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_HIST_FIL")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Flow histogram filter. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_GYRO_COM")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Gyro compensation. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_LP_FIL")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Lowpass filter on flow output. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_W_NEW")]),e._v(" "),a("td",[e._v("0.3")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Flow lowpass filter gain")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_MAX_PIX")]),e._v(" "),a("td",[e._v("8")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Delete (parameter not used).")])]),e._v(" "),a("tr",[a("td",[e._v("BFLOW_RATE")]),e._v(" "),a("td",[e._v("10.0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Rate with which updates for optical flow are published")])]),e._v(" "),a("tr",[a("td",[e._v("BRIGHT")]),e._v(" "),a("td",[e._v("20")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Desired brightness level from camera")])]),e._v(" "),a("tr",[a("td",[e._v("DEBUG")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Debug messages. 1: ON, 0: OFF")])]),e._v(" "),a("tr",[a("td",[e._v("EXPOSURE_MAX")]),e._v(" "),a("td",[e._v("500")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Maximal exposure time (μs)")])]),e._v(" "),a("tr",[a("td",[e._v("GAIN_MAX")]),e._v(" "),a("td",[e._v("16")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Maximal gain (units?)")])]),e._v(" "),a("tr",[a("td",[e._v("GYRO_SENS_DPS")]),e._v(" "),a("td",[e._v("250")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Gyroscope sensitivity: 250, 500, 2000 (dps)")])]),e._v(" "),a("tr",[a("td",[e._v("GYRO_COMP_THR")]),e._v(" "),a("td",[e._v("0.01")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Gyro compensation threshold (dps): Gyro data lower than this threshold is not compensated to prevent drift")])]),e._v(" "),a("tr",[a("td",[e._v("HDR")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera High Dynamic Range. 1: ON, 0: OFF")])]),e._v(" "),a("tr",[a("td",[e._v("IMAGE_HEIGHT")]),e._v(" "),a("td",[e._v("64")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Image height (pixels)")])]),e._v(" "),a("tr",[a("td",[e._v("IMAGE_WIDTH")]),e._v(" "),a("td",[e._v("64")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Image width (pixels)")])]),e._v(" "),a("tr",[a("td",[e._v("IMAGE_L_LIGHT")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Delete (parameter not used).")])]),e._v(" "),a("tr",[a("td",[e._v("IMAGE_NOISE_C")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Image sensor noise correction, 1: ON, 0: OFF")])]),e._v(" "),a("tr",[a("td",[e._v("IMAGE_TEST_PAT")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Gray-shaded test pattern mode. 1: ON, 0: OFF")])]),e._v(" "),a("tr",[a("td",[e._v("LENS_FOCAL_LEN")]),e._v(" "),a("td",[e._v("16.0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Focal length of lens (mm)")])]),e._v(" "),a("tr",[a("td",[e._v("POSITION")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("0: Only position 0 is used (Bottom: 0, Front: 1, Top: 2, Back: 3, Right: 4, Left: 5)")])]),e._v(" "),a("tr",[a("td",[e._v("SHTR_W_1")]),e._v(" "),a("td",[e._v("443")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera Shutter W_1 ?")])]),e._v(" "),a("tr",[a("td",[e._v("SHTR_W_2")]),e._v(" "),a("td",[e._v("473")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera Shutter W_2 ?")])]),e._v(" "),a("tr",[a("td",[e._v("SHTR_W_TOT")]),e._v(" "),a("td",[e._v("480")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Camera Shutter Total ?")])]),e._v(" "),a("tr",[a("td",[e._v("SONAR_FILTERED")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Kalman filter on sonar output. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("SONAR_KAL_L1")]),e._v(" "),a("td",[e._v("0.8461")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Sonar Kalman gain L1 (for the position)")])]),e._v(" "),a("tr",[a("td",[e._v("SONAR_KAL_L2")]),e._v(" "),a("td",[e._v("6.2034")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Sonar Kalman gain L2 (for the speed)")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_ID")]),e._v(" "),a("td",[e._v("81")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" System ID")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_COMP_ID")]),e._v(" "),a("td",[e._v("50")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" Component ID")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_SENSOR_ID")]),e._v(" "),a("td",[e._v("77")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" Sensor ID")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_TYPE")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" System Type (0 means generic)")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_AP_TYPE")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[a("a",{attrs:{href:"https://mavlink.io/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" Autopilot Type (0 means generic)")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_SW_VER")]),e._v(" "),a("td",[e._v("13XX")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Software Version")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_SEND_STATE")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send "),a("a",{attrs:{href:"https://mavlink.io/en/messages/common.html#HEARTBEAT",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" Heartbeat. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("SYS_SEND_LPOS")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send "),a("a",{attrs:{href:"https://mavlink.io/en/messages/common.html#LOCAL_POSITION_NED",target:"_blank",rel:"noopener noreferrer"}},[e._v("MAVLink"),a("OutboundLink")],1),e._v(" Local position estimate. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("USART_2_BAUD")]),e._v(" "),a("td",[e._v("115200")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Baudrate USART 2")])]),e._v(" "),a("tr",[a("td",[e._v("USART_3_BAUD")]),e._v(" "),a("td",[e._v("115200")]),e._v(" "),a("td",[e._v("R")]),e._v(" "),a("td",[e._v("Baudrate USART 3 (Data Output)")])]),e._v(" "),a("tr",[a("td",[e._v("USB_SEND_DEBUG")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send debug msgs over USB. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("USB_SEND_FLOW")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send flow over USB. 1: ON. 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("USB_SEND_FWD")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send forwarded flow over USB. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("USB_SEND_GYRO")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send gyro data over USB. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("USB_SEND_VIDEO")]),e._v(" "),a("td",[e._v("1")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Send video over USB. 1: ON, 0: OFF.")])]),e._v(" "),a("tr",[a("td",[e._v("VIDEO_ONLY")]),e._v(" "),a("td",[e._v("0")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("High resolution video mode. 1: ON, 0: OFF")])]),e._v(" "),a("tr",[a("td",[e._v("VIDEO_RATE")]),e._v(" "),a("td",[e._v("50")]),e._v(" "),a("td",[e._v("RW")]),e._v(" "),a("td",[e._v("Time between images of video transmission (ms)")])])])]),e._v(" "),a("h2",{attrs:{id:"modes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modes"}},[e._v("#")]),e._v(" Modes")]),e._v(" "),a("p",[a("span",{attrs:{id:"VIDEO_ONLY"}})]),e._v(" "),a("h3",{attrs:{id:"video-only-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#video-only-mode"}},[e._v("#")]),e._v(" VIDEO ONLY Mode")]),e._v(" "),a("p",[e._v("Set "),a("code",[e._v("VIDEO_ONLY")]),e._v(" to 1 for high resolution mode. In this mode the camera image is transmitted at a higher resolution to ease the lens focus process. No flow values are calculated in this mode.")]),e._v(" "),a("h3",{attrs:{id:"test-pattern-mode"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#test-pattern-mode"}},[e._v("#")]),e._v(" Test Pattern Mode")]),e._v(" "),a("p",[e._v("If the parameter "),a("code",[e._v("IMAGE_TEST_PAT")]),e._v(" is set to 1, the sensor inserts a vertical gray-shaded test pattern in the signal chain.")]),e._v(" "),a("ul",[a("li",[e._v("Test Pattern 64x64 (VIDEO ONLY Mode is OFF) "),a("img",{attrs:{src:r(1239),alt:"test_pattern_64x64"}})]),e._v(" "),a("li",[e._v("Test Pattern 376x240 (VIDEO ONLY Mode is ON) "),a("img",{attrs:{src:r(1240),alt:"test_pattern_376x240"}})])])])}),[],!1,null,null,null);t.default=o.exports},375:function(e,t,r){e.exports=r.p+"assets/img/px4flow_bottom.915780e0.jpg"}}]);