Compare commits
38 Commits
dec-depth
...
take_off_s
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
749e34b3c4 | ||
|
|
68cec159f7 | ||
|
|
4e8127f690 | ||
|
|
8f78f2b6e4 | ||
|
|
c8163cd38b | ||
|
|
7831992d6a | ||
|
|
873befdba9 | ||
|
|
c3cbc305c3 | ||
|
|
b71e802a2e | ||
|
|
3c5f2c958e | ||
|
|
267993aec4 | ||
|
|
86dd42c3b3 | ||
|
|
9d338d843b | ||
|
|
3e100bee91 | ||
|
|
8a29b9a37a | ||
|
|
2e80a06db1 | ||
|
|
0003985c3b | ||
|
|
f250916ede | ||
|
|
ee2944a1d3 | ||
|
|
a088524468 | ||
|
|
215fe237ca | ||
|
|
8c1b5c19d0 | ||
|
|
779dfb3f4f | ||
|
|
23d503adc5 | ||
|
|
0350ecbff7 | ||
|
|
12bed337dc | ||
|
|
6a1b609ccd | ||
|
|
3d5c51a42e | ||
|
|
3702ed0c86 | ||
|
|
741abadb54 | ||
|
|
c6dc732867 | ||
|
|
ba76e51966 | ||
|
|
7951f0e2ba | ||
|
|
cd58c03c0f | ||
|
|
ce6b2530c4 | ||
|
|
14e4af76aa | ||
|
|
f3f1557b0b | ||
|
|
18d410db24 |
@@ -10,7 +10,7 @@ env:
|
|||||||
- IMAGE_VERSION=${TRAVIS_TAG:-${TRAVIS_COMMIT:0:7}}
|
- IMAGE_VERSION=${TRAVIS_TAG:-${TRAVIS_COMMIT:0:7}}
|
||||||
- IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
|
- IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
|
||||||
git:
|
git:
|
||||||
depth: 25
|
depth: 1
|
||||||
jobs:
|
jobs:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
include:
|
include:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# clover🍀: create autonomous drones easily
|
# clover🍀: create autonomous drones easily
|
||||||
|
|
||||||
<img src="docs/assets/clever4-front-white.png" align="right" width="400px" alt="COEX Clover Drone">
|
<img src="docs/assets/clover42-main.png" align="right" width="400px" alt="COEX Clover Drone">
|
||||||
|
|
||||||
Clover is an open source [ROS](https://www.ros.org)-based framework, providing user-friendly tools to control [PX4](https://px4.io)-powered drones. Clover is available as a ROS package, but is shipped mainly as a preconfigured image for Raspberry Pi. Once you've installed Raspberry Pi on your drone and flashed the image to its microSD card, taking the drone up in the air is a matter of minutes.
|
Clover is an open source [ROS](https://www.ros.org)-based framework, providing user-friendly tools to control [PX4](https://px4.io)-powered drones. Clover is available as a ROS package, but is shipped mainly as a preconfigured image for Raspberry Pi. Once you've installed Raspberry Pi on your drone and flashed the image to its microSD card, taking the drone up in the air is a matter of minutes.
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ p = cv2.aruco.DetectorParameters_create()
|
|||||||
|
|
||||||
gen = ParameterGenerator()
|
gen = ParameterGenerator()
|
||||||
|
|
||||||
|
gen.add("enabled", bool_t, 0, "if detection enabled", True)
|
||||||
|
|
||||||
gen.add("adaptiveThreshConstant", double_t, 0,
|
gen.add("adaptiveThreshConstant", double_t, 0,
|
||||||
"Constant for adaptive thresholding before finding contours",
|
"Constant for adaptive thresholding before finding contours",
|
||||||
p.adaptiveThreshConstant, 0, 100)
|
p.adaptiveThreshConstant, 0, 100)
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ private:
|
|||||||
std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
|
std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
|
||||||
std::unique_ptr<tf2_ros::TransformListener> tf_listener_;
|
std::unique_ptr<tf2_ros::TransformListener> tf_listener_;
|
||||||
std::shared_ptr<dynamic_reconfigure::Server<aruco_pose::DetectorConfig>> dyn_srv_;
|
std::shared_ptr<dynamic_reconfigure::Server<aruco_pose::DetectorConfig>> dyn_srv_;
|
||||||
|
bool enabled_ = true;
|
||||||
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
||||||
cv::Ptr<cv::aruco::DetectorParameters> parameters_;
|
cv::Ptr<cv::aruco::DetectorParameters> parameters_;
|
||||||
image_transport::Publisher debug_pub_;
|
image_transport::Publisher debug_pub_;
|
||||||
@@ -128,6 +129,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
void imageCallback(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo)
|
void imageCallback(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo)
|
||||||
{
|
{
|
||||||
|
if (!enabled_) return;
|
||||||
|
|
||||||
Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
|
Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
|
||||||
|
|
||||||
vector<int> ids;
|
vector<int> ids;
|
||||||
@@ -356,6 +359,7 @@ private:
|
|||||||
|
|
||||||
void paramCallback(aruco_pose::DetectorConfig &config, uint32_t level)
|
void paramCallback(aruco_pose::DetectorConfig &config, uint32_t level)
|
||||||
{
|
{
|
||||||
|
enabled_ = config.enabled;
|
||||||
parameters_->adaptiveThreshConstant = config.adaptiveThreshConstant;
|
parameters_->adaptiveThreshConstant = config.adaptiveThreshConstant;
|
||||||
parameters_->adaptiveThreshWinSizeMin = config.adaptiveThreshWinSizeMin;
|
parameters_->adaptiveThreshWinSizeMin = config.adaptiveThreshWinSizeMin;
|
||||||
parameters_->adaptiveThreshWinSizeMax = config.adaptiveThreshWinSizeMax;
|
parameters_->adaptiveThreshWinSizeMax = config.adaptiveThreshWinSizeMax;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Information: https://clover.coex.tech/en/aruco.html
|
# Information: https://clover.coex.tech/aruco
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
from clover import srv
|
from clover import srv
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Information: https://clover.coex.tech/en/leds.html
|
# Information: https://clover.coex.tech/led
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
from clover.srv import SetLEDEffect
|
from clover.srv import SetLEDEffect
|
||||||
|
|||||||
@@ -110,7 +110,6 @@ libffi-dev \
|
|||||||
monkey \
|
monkey \
|
||||||
pigpio python-pigpio python3-pigpio \
|
pigpio python-pigpio python3-pigpio \
|
||||||
i2c-tools \
|
i2c-tools \
|
||||||
espeak espeak-data python-espeak \
|
|
||||||
ntpdate \
|
ntpdate \
|
||||||
python-dev \
|
python-dev \
|
||||||
python3-dev \
|
python3-dev \
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import pymavlink
|
|||||||
from pymavlink import mavutil
|
from pymavlink import mavutil
|
||||||
import rpi_ws281x
|
import rpi_ws281x
|
||||||
import pigpio
|
import pigpio
|
||||||
from espeak import espeak
|
# from espeak import espeak
|
||||||
from pyzbar import pyzbar
|
from pyzbar import pyzbar
|
||||||
|
|
||||||
print cv2.getBuildInformation()
|
print cv2.getBuildInformation()
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ monkey --version
|
|||||||
pigpiod -v
|
pigpiod -v
|
||||||
i2cdetect -V
|
i2cdetect -V
|
||||||
butterfly -h
|
butterfly -h
|
||||||
espeak --version
|
# espeak --version
|
||||||
mjpg_streamer --version
|
mjpg_streamer --version
|
||||||
|
|
||||||
# ros stuff
|
# ros stuff
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
EXCLUDE = ('clever4-front-white.png', '.DS_Store', 'clever4-front-black-large.png')
|
EXCLUDE = ('clever4-front-white.png', 'clever4-front-white-large.png', '.DS_Store',
|
||||||
|
'clever4-front-black-large.png','clover42-black.png')
|
||||||
|
|
||||||
code = 0
|
code = 0
|
||||||
|
|
||||||
os.chdir('./docs')
|
os.chdir('./docs')
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ add_service_files(
|
|||||||
GetTelemetry.srv
|
GetTelemetry.srv
|
||||||
Navigate.srv
|
Navigate.srv
|
||||||
NavigateGlobal.srv
|
NavigateGlobal.srv
|
||||||
|
TakeOff.srv
|
||||||
SetPosition.srv
|
SetPosition.srv
|
||||||
SetVelocity.srv
|
SetVelocity.srv
|
||||||
SetAttitude.srv
|
SetAttitude.srv
|
||||||
|
|||||||
@@ -44,16 +44,12 @@ Alternatively you may change the `fcu_url` property in `mavros.launch` file to p
|
|||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
To start connection to SITL, use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
roslaunch clover sitl.launch
|
|
||||||
```
|
|
||||||
|
|
||||||
To start connection to the flight controller, use:
|
To start connection to the flight controller, use:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
roslaunch clover clover.launch
|
roslaunch clover clover.launch
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For the simulation information see the [corresponding article](https://clover.coex.tech/en/simulation.html).
|
||||||
|
|
||||||
> Note that the package is configured to connect to `/dev/px4fmu` by default (see [previous section](#manual-installation)). Install udev rules or specify path to your FCU device in `mavros.launch`.
|
> Note that the package is configured to connect to `/dev/px4fmu` by default (see [previous section](#manual-installation)). Install udev rules or specify path to your FCU device in `mavros.launch`.
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
<launch>
|
|
||||||
<!-- clover configuration for testing in sitl -->
|
|
||||||
<arg name="ip" default="127.0.0.1"/>
|
|
||||||
<arg name="rosbridge" default="false"/>
|
|
||||||
|
|
||||||
<include file="$(find clover)/launch/clover.launch">
|
|
||||||
<arg name="fcu_conn" value="udp"/>
|
|
||||||
<arg name="fcu_ip" value="$(arg ip)"/>
|
|
||||||
<arg name="gcs_bridge" value="false"/>
|
|
||||||
<arg name="optical_flow" value="false"/>
|
|
||||||
<arg name="web_video_server" default="false"/>
|
|
||||||
<arg name="main_camera" default="false"/>
|
|
||||||
<arg name="rosbridge" value="$(arg rosbridge)"/>
|
|
||||||
<arg name="aruco" default="false"/>
|
|
||||||
<arg name="rangefinder_vl53l1x" default="false"/>
|
|
||||||
<arg name="led" default="false"/>
|
|
||||||
<arg name="rc" default="false"/>
|
|
||||||
</include>
|
|
||||||
</launch>
|
|
||||||
@@ -41,6 +41,7 @@
|
|||||||
#include <clover/GetTelemetry.h>
|
#include <clover/GetTelemetry.h>
|
||||||
#include <clover/Navigate.h>
|
#include <clover/Navigate.h>
|
||||||
#include <clover/NavigateGlobal.h>
|
#include <clover/NavigateGlobal.h>
|
||||||
|
#include <clover/TakeOff.h>
|
||||||
#include <clover/SetPosition.h>
|
#include <clover/SetPosition.h>
|
||||||
#include <clover/SetVelocity.h>
|
#include <clover/SetVelocity.h>
|
||||||
#include <clover/SetAttitude.h>
|
#include <clover/SetAttitude.h>
|
||||||
@@ -781,6 +782,10 @@ bool navigateGlobal(NavigateGlobal::Request& req, NavigateGlobal::Response& res)
|
|||||||
return serve(NAVIGATE_GLOBAL, NAN, NAN, req.z, NAN, NAN, NAN, NAN, NAN, req.yaw, NAN, NAN, req.yaw_rate, req.lat, req.lon, NAN, req.speed, req.frame_id, req.auto_arm, res.success, res.message);
|
return serve(NAVIGATE_GLOBAL, NAN, NAN, req.z, NAN, NAN, NAN, NAN, NAN, req.yaw, NAN, NAN, req.yaw_rate, req.lat, req.lon, NAN, req.speed, req.frame_id, req.auto_arm, res.success, res.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool takeOff(TakeOff::Request& req, TakeOff::Response& res) {
|
||||||
|
return serve(NAVIGATE, 0, 0, req.alt, NAN, NAN, NAN, NAN, NAN, NAN, NAN, NAN, 0, NAN, NAN, NAN, req.speed, body.child_frame_id, true, res.success, res.message);
|
||||||
|
}
|
||||||
|
|
||||||
bool setPosition(SetPosition::Request& req, SetPosition::Response& res) {
|
bool setPosition(SetPosition::Request& req, SetPosition::Response& res) {
|
||||||
return serve(POSITION, req.x, req.y, req.z, NAN, NAN, NAN, NAN, NAN, req.yaw, NAN, NAN, req.yaw_rate, NAN, NAN, NAN, NAN, req.frame_id, req.auto_arm, res.success, res.message);
|
return serve(POSITION, req.x, req.y, req.z, NAN, NAN, NAN, NAN, NAN, req.yaw, NAN, NAN, req.yaw_rate, NAN, NAN, NAN, NAN, req.frame_id, req.auto_arm, res.success, res.message);
|
||||||
}
|
}
|
||||||
@@ -905,6 +910,7 @@ int main(int argc, char **argv)
|
|||||||
auto gt_serv = nh.advertiseService("get_telemetry", &getTelemetry);
|
auto gt_serv = nh.advertiseService("get_telemetry", &getTelemetry);
|
||||||
auto na_serv = nh.advertiseService("navigate", &navigate);
|
auto na_serv = nh.advertiseService("navigate", &navigate);
|
||||||
auto ng_serv = nh.advertiseService("navigate_global", &navigateGlobal);
|
auto ng_serv = nh.advertiseService("navigate_global", &navigateGlobal);
|
||||||
|
auto to_serv = nh.advertiseService("take_off", &takeOff);
|
||||||
auto sp_serv = nh.advertiseService("set_position", &setPosition);
|
auto sp_serv = nh.advertiseService("set_position", &setPosition);
|
||||||
auto sv_serv = nh.advertiseService("set_velocity", &setVelocity);
|
auto sv_serv = nh.advertiseService("set_velocity", &setVelocity);
|
||||||
auto sa_serv = nh.advertiseService("set_attitude", &setAttitude);
|
auto sa_serv = nh.advertiseService("set_attitude", &setAttitude);
|
||||||
|
|||||||
5
clover/srv/TakeOff.srv
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
float32 alt
|
||||||
|
float32 speed
|
||||||
|
---
|
||||||
|
bool success
|
||||||
|
string message
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
<title>Clover Drone Kit Tools</title>
|
||||||
|
|
||||||
<h1>Clover Drone Kit Tools</h1>
|
<h1>Clover Drone Kit Tools</h1>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<launch>
|
<launch>
|
||||||
|
<arg name="type" default="gazebo"/> <!-- gazebo, jmavsim, none (only clover packages) -->
|
||||||
<arg name="mav_id" default="0"/>
|
<arg name="mav_id" default="0"/>
|
||||||
<arg name="est" default="ekf2"/> <!-- PX4 estimator: lpe, ekf2 -->
|
<arg name="est" default="ekf2"/> <!-- PX4 estimator: lpe, ekf2 -->
|
||||||
<arg name="vehicle" default="clover"/> <!-- PX4 vehicle configuration: clover, clover_vpe -->
|
<arg name="vehicle" default="clover"/> <!-- PX4 vehicle configuration: clover, clover_vpe -->
|
||||||
@@ -9,7 +10,7 @@
|
|||||||
<arg name="use_clover_physics" default="false"/> <!-- Use inertial parameters from CAD models -->
|
<arg name="use_clover_physics" default="false"/> <!-- Use inertial parameters from CAD models -->
|
||||||
|
|
||||||
<!-- Gazebo instance -->
|
<!-- Gazebo instance -->
|
||||||
<include file="$(find gazebo_ros)/launch/empty_world.launch">
|
<include file="$(find gazebo_ros)/launch/empty_world.launch" if="$(eval type == 'gazebo')">
|
||||||
<!-- Workaround for crashes in VMware -->
|
<!-- Workaround for crashes in VMware -->
|
||||||
<env name="SVGA_VGPU10" value="0"/>
|
<env name="SVGA_VGPU10" value="0"/>
|
||||||
<arg name="gui" value="true"/>
|
<arg name="gui" value="true"/>
|
||||||
@@ -18,13 +19,13 @@
|
|||||||
</include>
|
</include>
|
||||||
|
|
||||||
<!-- PX4 instance -->
|
<!-- PX4 instance -->
|
||||||
<node name="sitl_$(arg mav_id)" pkg="px4" type="px4" output="screen" args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg mav_id)">
|
<node name="sitl_$(arg mav_id)" pkg="px4" type="px4" output="screen" args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg mav_id)" unless="$(eval type == 'none')">
|
||||||
<env name="PX4_SIM_MODEL" value="$(arg vehicle)"/>
|
<env name="PX4_SIM_MODEL" value="$(arg vehicle)"/>
|
||||||
<env name="PX4_ESTIMATOR" value="$(arg est)"/>
|
<env name="PX4_ESTIMATOR" value="$(arg est)"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<!-- Clover model -->
|
<!-- Clover model -->
|
||||||
<include file="$(find clover_description)/launch/spawn_drone.launch">
|
<include file="$(find clover_description)/launch/spawn_drone.launch" if="$(eval type == 'gazebo')">
|
||||||
<arg name="main_camera" value="$(arg main_camera)"/>
|
<arg name="main_camera" value="$(arg main_camera)"/>
|
||||||
<arg name="rangefinder" value="$(arg rangefinder)"/>
|
<arg name="rangefinder" value="$(arg rangefinder)"/>
|
||||||
<arg name="led" value="$(arg led)"/>
|
<arg name="led" value="$(arg led)"/>
|
||||||
@@ -32,10 +33,20 @@
|
|||||||
<arg name="use_clover_physics" value="$(arg use_clover_physics)"/>
|
<arg name="use_clover_physics" value="$(arg use_clover_physics)"/>
|
||||||
</include>
|
</include>
|
||||||
|
|
||||||
|
<node name="jmavsim" pkg="px4" type="jmavsim_run.sh" output="screen" if="$(eval type == 'jmavsim')"/>
|
||||||
|
|
||||||
|
<param name="use_sim_time" value="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
|
||||||
<!-- Clover services -->
|
<!-- Clover services -->
|
||||||
<include file="$(find clover)/launch/clover.launch">
|
<include file="$(find clover)/launch/clover.launch">
|
||||||
<arg name="simulator" value="true"/>
|
<arg name="simulator" value="true"/>
|
||||||
<arg name="fcu_conn" value="sitl"/>
|
<arg name="fcu_conn" value="sitl"/>
|
||||||
<arg name="fcu_ip" value="127.0.0.1"/>
|
<arg name="fcu_ip" value="127.0.0.1"/>
|
||||||
|
<arg name="gcs_bridge" value=""/>
|
||||||
|
<arg name="rc" default="false"/>
|
||||||
|
<arg name="web_video_server" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="main_camera" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="aruco" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="led" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
</include>
|
</include>
|
||||||
</launch>
|
</launch>
|
||||||
|
|||||||
BIN
docs/assets/clover42-black.png
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
docs/assets/clover42-main.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 125 KiB After Width: | Height: | Size: 415 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 438 KiB |
BIN
docs/assets/duocam/duocam.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
docs/assets/duocam/gitup_seek.jpg
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
docs/assets/duocam/qgc_duocam_widget.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
4644
docs/assets/dxf/4.2/big_leg.dxf
Normal file
BIN
docs/assets/dxf/4.2/big_leg.png
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
docs/assets/fpv/fpv_1.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
docs/assets/fpv/fpv_10.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
docs/assets/fpv/fpv_11.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
docs/assets/fpv/fpv_12.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
docs/assets/fpv/fpv_13.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
docs/assets/fpv/fpv_14.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
docs/assets/fpv/fpv_15.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/assets/fpv/fpv_16.png
Normal file
|
After Width: | Height: | Size: 177 KiB |
BIN
docs/assets/fpv/fpv_17.png
Normal file
|
After Width: | Height: | Size: 175 KiB |
BIN
docs/assets/fpv/fpv_18.png
Normal file
|
After Width: | Height: | Size: 177 KiB |
BIN
docs/assets/fpv/fpv_19.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
docs/assets/fpv/fpv_2.png
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
docs/assets/fpv/fpv_20.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
docs/assets/fpv/fpv_21.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
docs/assets/fpv/fpv_22.png
Normal file
|
After Width: | Height: | Size: 213 KiB |
BIN
docs/assets/fpv/fpv_3.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
docs/assets/fpv/fpv_4.png
Normal file
|
After Width: | Height: | Size: 197 KiB |
BIN
docs/assets/fpv/fpv_5.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
docs/assets/fpv/fpv_6.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
docs/assets/fpv/fpv_7.png
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
docs/assets/fpv/fpv_8.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
docs/assets/fpv/fpv_9.png
Normal file
|
After Width: | Height: | Size: 9.9 KiB |
BIN
docs/assets/magnet_grip/magnet1.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
docs/assets/magnet_grip/magnet2.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
docs/assets/magnet_grip/magnet3.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
docs/assets/magnet_grip/magnet4.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
docs/assets/magnet_grip/magnet5.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/assets/magnet_grip/magnet_arduino1.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/assets/magnet_grip/magnet_arduino2.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/assets/magnet_grip/magnet_check.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
docs/assets/magnet_grip/magnet_raspberry.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/assets/magnet_grip/scheme.jpg
Normal file
|
After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 815 KiB |
|
Before Width: | Height: | Size: 827 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 870 KiB After Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 677 KiB After Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 623 KiB After Width: | Height: | Size: 204 KiB |
|
Before Width: | Height: | Size: 867 KiB |
|
Before Width: | Height: | Size: 602 KiB After Width: | Height: | Size: 192 KiB |
|
Before Width: | Height: | Size: 489 KiB After Width: | Height: | Size: 172 KiB |
BIN
docs/assets/qgc-frame-apply-clover4.png
Normal file
|
After Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 597 KiB |
|
Before Width: | Height: | Size: 822 KiB After Width: | Height: | Size: 240 KiB |
|
Before Width: | Height: | Size: 821 KiB After Width: | Height: | Size: 253 KiB |
BIN
docs/assets/qgc-power.png
Normal file
|
After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 824 KiB After Width: | Height: | Size: 235 KiB |
|
Before Width: | Height: | Size: 837 KiB After Width: | Height: | Size: 263 KiB |
BIN
docs/assets/qgc-voltage-divider.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 1.6 MiB After Width: | Height: | Size: 970 KiB |
@@ -40,13 +40,9 @@ section ul li:before {
|
|||||||
margin-bottom: 0.85em;
|
margin-bottom: 0.85em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main Clover image */
|
.book.color-theme-2 img.big-clover {
|
||||||
.book img.bigclever {
|
|
||||||
margin-bottom: -12%;
|
|
||||||
}
|
|
||||||
.book.color-theme-2 img.bigclever {
|
|
||||||
/* change image for black background */
|
/* change image for black background */
|
||||||
content:url(assets/clever4-front-black-large.png);
|
content:url(assets/clover42-black.png);
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
footer {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# COEX Clover
|
# COEX Clover
|
||||||
|
|
||||||
<img class="center bigclever zoom" src="../assets/clever4-front-white-large.png" width="80%" alt="COEX Clover 4">
|
<img class="center zoom big-clover" src="../assets/clover42-main.png" width="80%" alt="Clover 4.2">
|
||||||
|
|
||||||
**Clover** is an educational kit of a programmable quadcopter that consists of popular open source components, and a set of necessary documentation and libraries for working with it.
|
**Clover** is an educational kit of a programmable quadcopter that consists of popular open source components, and a set of necessary documentation and libraries for working with it.
|
||||||
|
|
||||||
The kit includes a Pixhawk/Pixracer flight controller with the PX4 flight stack, a [Raspberry Pi 4](raspberry.md) as a controlling onboard computer, and a [camera module](camera.md) for performing flights with the use of computer vision, as well as a set of various sensors and other peripherals.
|
The kit includes a [COEX Pix](coex_pix.md) flight controller with the PX4 flight stack, a [Raspberry Pi 4](raspberry.md) as a controlling onboard computer, and a [camera module](camera.md) for performing flights with the use of computer vision, as well as a set of various sensors and other peripherals.
|
||||||
|
|
||||||
The Clover platform contains a [pre-configured image for Raspberry Pi](image.md) with the full set of required software for working with peripheral devices and [programming autonomous flights](simple_offboard.md). The source code of the platform and of the documentation is open and [available on GitHub](https://github.com/CopterExpress/clover).
|
The Clover platform contains a [pre-configured image for Raspberry Pi](image.md) with the full set of required software for working with peripheral devices and [programming autonomous flights](simple_offboard.md). The source code of the platform and of the documentation is open and [available on GitHub](https://github.com/CopterExpress/clover).
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
* [Guide on autonomous flight](auto_setup.md)
|
* [Guide on autonomous flight](auto_setup.md)
|
||||||
* [Hostname](hostname.md)
|
* [Hostname](hostname.md)
|
||||||
* [PX4 Simulation](sitl.md)
|
* [PX4 Simulation](sitl.md)
|
||||||
|
* [Navigation using vertical ArUco-markers](wall_aruco.md)
|
||||||
* [PID Setup](calibratePID.md)
|
* [PID Setup](calibratePID.md)
|
||||||
* [Model files for parts](models.md)
|
* [Model files for parts](models.md)
|
||||||
* [ROS Melodic installation](ros-install.md)
|
* [ROS Melodic installation](ros-install.md)
|
||||||
@@ -76,7 +77,10 @@
|
|||||||
* [Interfacing with Arduino](arduino.md)
|
* [Interfacing with Arduino](arduino.md)
|
||||||
* [Connecting GPS](gps.md)
|
* [Connecting GPS](gps.md)
|
||||||
* [Working with IR sensors](ir_sensors.md)
|
* [Working with IR sensors](ir_sensors.md)
|
||||||
* [FPV Setup](fpv.md)
|
* [FPV Setup](fpv_clover_4_2.md)
|
||||||
|
* [FPV Setup (Clover 3)](fpv.md)
|
||||||
|
* [Magnetic grip](magnetic_grip.md)
|
||||||
|
* [Mechanical grip](mechanical_grip.md)
|
||||||
* [Trainer mode](trainer_mode.md)
|
* [Trainer mode](trainer_mode.md)
|
||||||
* [Tinning](tinning.md)
|
* [Tinning](tinning.md)
|
||||||
* [Types of power connectors](connectortypes.md)
|
* [Types of power connectors](connectortypes.md)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ For correct work of the blocks programming, `blocks` argument in the Clover laun
|
|||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
To run Clover's blocks programming interface, [connect to Clover's Wi-Fi](wifi.md) and go to web-page http://192.168.11.1:8080/clover_blocks/ or click the link *Blocks programming* at the [main page](wifi.md#web-interface).
|
To run Clover's blocks programming interface, [connect to Clover's Wi-Fi](wifi.md) and go to web-page http://192.168.11.1/clover_blocks/ or click the link *Blocks programming* at the [main page](wifi.md#web-interface).
|
||||||
|
|
||||||
The page looks as follows:
|
The page looks as follows:
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
In order to perform the sensor calibration, select the *Vehicle Setup* tab and choose the *Sensors* menu.
|
In order to perform the sensor calibration, select the *Vehicle Setup* tab and choose the *Sensors* menu.
|
||||||
|
|
||||||
> **Caution** If you use the flight controller *COEX Pix*, all *Autopilot Orientation* columns must specify `ROTATION_ROLL_180_YAW_90`, otherwise the flight controller will not correctly perceive the tilt and rotation of the copter.
|
> **Caution** If you use the flight controller [*COEX Pix*](coex_pix.md), all *Autopilot Orientation* columns must specify `ROTATION_ROLL_180_YAW_90`, otherwise the flight controller will not correctly perceive the tilt and rotation of the copter.
|
||||||
|
|
||||||
## Compass
|
## Compass
|
||||||
|
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ The **COEX Pix** flight controller is a modified [Pixracer](https://docs.px4.io/
|
|||||||
|
|
||||||
### Port pinouts
|
### Port pinouts
|
||||||
|
|
||||||
<img src="../assets/coexpix-top.jpg" width="400" class="zoom">
|
<img src="../assets/coex_pix/coexpix-top.jpg" width="400" class="zoom">
|
||||||
|
|
||||||
<img src="../assets/coexpix-bottom.jpg" width="400" class="zoom">
|
<img src="../assets/coex_pix/coexpix-bottom.jpg" width="400" class="zoom">
|
||||||
|
|
||||||
> **Note** On rev. 1.0 boards *RC IN* port and microSD slot are switched. Pinout for the *RC IN* port is the same on these boards.
|
> **Note** On rev. 1.0 boards *RC IN* port and microSD slot are switched. Pinout for the *RC IN* port is the same on these boards.
|
||||||
|
|
||||||
@@ -70,6 +70,6 @@ The board utilizes low-noise DC-DC converters, voltage inputs have LC and ferrit
|
|||||||
|
|
||||||
### Port pinouts
|
### Port pinouts
|
||||||
|
|
||||||
<img src="../assets/coex_pix/coexpix-top-rev1.2.jpg" width=400 class=zoom>
|
<img src="../assets/coex_pix/coexpix-top-rev1.2.png" width=400 class=zoom>
|
||||||
|
|
||||||
<img src="../assets/coex_pix/coexpix-bottom-rev1.2.jpg" width=400 class=zoom>
|
<img src="../assets/coex_pix/coexpix-bottom-rev1.2.png" width=400 class=zoom>
|
||||||
|
|||||||
94
docs/en/fpv_clover_4_2.md
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# Installing and configuring FPV equipment
|
||||||
|
|
||||||
|
## Preparing and installing the FPV camera and transmitter
|
||||||
|
|
||||||
|
1. Install the small mounting deck onto the main frame.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_1.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_2.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
2. Install the camera mount bracket into the corresponding holes.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_3.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_4.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
3. Cut the three-pin supplied camera cable.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_5.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_6.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
4. Tin the wires
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_7.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
5. Solder the JST-male connector to the power wires of the camera.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_8.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_9.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
> **Hint** Сheck what you are wearing shrink tubes before soldering the wires.
|
||||||
|
|
||||||
|
6. Solder the JST male connector to the transmitter.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_10.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_11.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
7. Solder the yellow camera signal cable to the transmitter.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_12.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_13.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
8. Connect the antenna to the transmitter.
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_14.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
> **Caution** If voltage is applied to a transmitter without an antenna, there is a high probability that it will burn out.
|
||||||
|
|
||||||
|
9. Place the receiver onto the mounting deck, securing it with ties.
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_15.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
10. Place the mounting deck with the receiver on the bottom of the aircraft.
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_16.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
11. Place the camera in the bracket and secure it with the 4 attached bolts. The camera should be at an angle of 15°-20° relative to the plane of the aircraft.
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_17.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_18.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="image-group">
|
||||||
|
<img src="../assets/fpv/fpv_19.png" width=300 class="zoom border">
|
||||||
|
<img src="../assets/fpv/fpv_20.png" width=300 class="zoom border">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
12. Connect the signal cable to the camera.
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_21.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
13. Connect the camera's power cable to the power JST soldered to the *BAT+* and *GND* pads on the power distribution board.
|
||||||
|
|
||||||
|
14. Connect the transmitter power cable to JST at 5V.
|
||||||
|
|
||||||
|
<img src="../assets/fpv/fpv_22.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
## Setting up and connecting FPV goggles
|
||||||
|
|
||||||
|
1. Install the two supplied antennas on the glasses.
|
||||||
|
2. Turn on the glasses by holding the power button for 3-4 seconds.
|
||||||
|
3. Turn on the aircraft and make sure the transmitter LED is blue.
|
||||||
|
4. Press the *Auto Search* button on the glasses to automatically search for an available radio channel.
|
||||||
@@ -86,6 +86,8 @@ How it works: Works from DC. I.e., by applying voltage from a DC source (a batte
|
|||||||
|
|
||||||
* Rapid wear
|
* Rapid wear
|
||||||
|
|
||||||
|
### Brushless motors
|
||||||
|
|
||||||
Brushless motors, in which the moving part is the stator, are more efficient than brush-type motors. This is achieved due to the absence of brushes. However, since motor design is much more complicated, they are more expensive.
|
Brushless motors, in which the moving part is the stator, are more efficient than brush-type motors. This is achieved due to the absence of brushes. However, since motor design is much more complicated, they are more expensive.
|
||||||
|
|
||||||
**Advantages:**
|
**Advantages:**
|
||||||
|
|||||||
65
docs/en/magnetic_grip.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# Assembling and setting up the electromagnetic gripper
|
||||||
|
|
||||||
|
The magnetic gripper can be assembled in various ways according to the wiring diagram.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/scheme.jpg" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
The following is an example of assembling an electromagnetic capture circuit on a breadboard.
|
||||||
|
|
||||||
|
> **Info** It is recommended to lay the wiring between the elements on the back side of the board (in the following images, the wiring is done over the diagram for illustrative purpose).
|
||||||
|
|
||||||
|
1. Place the Schottky diode, 10K resistor, and transistor on the soldering board.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet1.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
2. Solder the contacts on the other side of the board and bite off the remaining element legs.
|
||||||
|
3. Connect the pins of the resistor and the two outer legs of the transistor.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet2.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
4. Connect the center leg of the transistor and the leg of the Schottky diode (opposite to the gray marking strip).
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet3.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
5. Cut the required amount of magnetic grab wire and solder it to the pins of the Schottky diode.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet4.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
6. Solder the *Dupont* - male wires to the transistor and diode leg (red, black wires), and the *Dupont* - fmale wire to the opposite transistor leg (white wire).
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet5.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
## Checking the operation of the electromagnetic gripper
|
||||||
|
|
||||||
|
In order to check the operation of the gripper, apply a voltage of 5V to the signal wire. You can use the *Dupont* dad-dad wire for that.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet_check.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
After applying voltage, the magnet should turn on.
|
||||||
|
|
||||||
|
## Connecting to Raspberry Pi
|
||||||
|
|
||||||
|
Connect the magnetic gripper to a Raspberry Pi for software activation.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet_raspberry.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
An example of the code activating the magnetic gripper can be found [here](gpio.md#connecting-an-electromagnet).
|
||||||
|
|
||||||
|
## Connecting to Arduino
|
||||||
|
|
||||||
|
Connect the gripper to the Arduino Nano board in order to control it manually.
|
||||||
|
|
||||||
|
It is convenient to place it on the same soldering board — insert it into the appropriate holes and solder it from the back to the board.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet_arduino1.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
Then connect the signal output of the circuit to the selected port and solder the *Dupont* female wire to the selected signal port on the board.
|
||||||
|
|
||||||
|
<img src="../assets/magnet_grip/magnet_arduino2.png" width=300 class="zoom border center">
|
||||||
|
|
||||||
|
## Installation of electromagnetic gripper
|
||||||
|
|
||||||
|
1. Install an electromagnet into the center hole on the gripper deck.
|
||||||
|
2. Use a zip tie to pull the assembled circuit to the back of the deck.
|
||||||
|
3. Plug the Arduino *D11* signal pin into one of the *AUX* pins on the flight controller.
|
||||||
|
4. Plug the power wire of the electromagnetic gripper to JST 5V.
|
||||||
18
docs/en/mechanical_grip.md
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Assembling and setting up a mechanical gripper
|
||||||
|
|
||||||
|
1. Combine the main gripper plates.
|
||||||
|
2. Install the servo in the appropriate groove in the center of the plates with the axle gear in the middle.
|
||||||
|
3. Hold down the gripper plates with the small spacers.
|
||||||
|
4. Install the gripper deck so that the mounting holes in the grapple correspond with the self-tapping holes in the plate.
|
||||||
|
5. Fix the gripper structure with self-tapping screws.
|
||||||
|
6. Turn the servo gear to the end position.
|
||||||
|
7. Install the cruciform mount onto the gear.
|
||||||
|
8. Secure the cruciform mount using the screw attached to the servo.
|
||||||
|
9. Tie the servo thread so that there is a 2 to 3 cm margin.
|
||||||
|
10. Thread the servo thread into the corresponding tensioning slots.
|
||||||
|
11. Fasten the grip claws with small self-tapping screws so that their angle is 25°–40°.
|
||||||
|
12. Install the assembled grip onto the aircraft from below.
|
||||||
|
13. Insert the servo cable into the *AUX* 1-2 output on the flight controller.
|
||||||
|
14. Go to the *Radio* tab to control capture with the remote control.
|
||||||
|
15. In the *AUX 1/2 Passthrough RC channel* parameter, select the desired channel.
|
||||||
|
16. Now, when you switch the toggle switch of the corresponding channel, the capture will be closed or opened.
|
||||||
@@ -80,6 +80,24 @@ This page contains models and drawings of some of the drone parts. They can be u
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
## Clover 4.2 WorldSkills
|
||||||
|
|
||||||
|
### Milling
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th width=150>Preview</th><th>Part</th><th width=1>File</th></tr>
|
||||||
|
<tr>
|
||||||
|
<td><img src="../assets/dxf/4.2/big_leg.png"></td>
|
||||||
|
<td>
|
||||||
|
<b>Big leg</b>.<br>
|
||||||
|
Function: Extended footing element.<br>
|
||||||
|
Материал: Monolithic polycarbonate 2mm.<br>
|
||||||
|
Quantity: 2 шт.
|
||||||
|
</td>
|
||||||
|
<td><a href="https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/4.2/big_leg.dxf"><code>big_leg.dxf</code></a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
## Clover 4
|
## Clover 4
|
||||||
|
|
||||||
### 3D print
|
### 3D print
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ In order to configure flight modes:
|
|||||||
|
|
||||||
1. Open the *Vehicle Setup* tab in QGroundControl.
|
1. Open the *Vehicle Setup* tab in QGroundControl.
|
||||||
2. Select the *Flight Modes* menu.
|
2. Select the *Flight Modes* menu.
|
||||||
3. Choose SwC (Channel 5) as mode selection switch.
|
3. Choose SwC (Channel 6) as mode selection switch.
|
||||||
4. Set desired flight modes.
|
4. Set desired flight modes.
|
||||||
|
|
||||||
The following flight modes are recommended:
|
The following flight modes are recommended:
|
||||||
@@ -16,7 +16,7 @@ In order to configure flight modes:
|
|||||||
* Flight Mode 6: *Position*.
|
* Flight Mode 6: *Position*.
|
||||||
|
|
||||||
5. Check mode switching by changing the switch position.
|
5. Check mode switching by changing the switch position.
|
||||||
6. Choose SwA (Channel 6) as emergency motor stop (*Kill switch*).
|
6. Choose SwA (Channel 5) as emergency motor stop (*Kill switch*).
|
||||||
|
|
||||||
<img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes">
|
<img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes">
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ If there is no voltage indicator or manual calibration is not possible, set the
|
|||||||
* Put the battery voltage into the prompt and click *Calculate*.
|
* Put the battery voltage into the prompt and click *Calculate*.
|
||||||
* Press *Close* to save the calculated value.
|
* Press *Close* to save the calculated value.
|
||||||
|
|
||||||
<img src="../assets/qgc-battery.png" class="zoom">
|
<img src="../assets/qgc-voltage-divider.png" class="zoom">
|
||||||
|
|
||||||
Further reading: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
|
Further reading: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ Further reading: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
|
|||||||
3. Connect the battery when prompted.
|
3. Connect the battery when prompted.
|
||||||
4. Wait for the *Calibration complete*.
|
4. Wait for the *Calibration complete*.
|
||||||
|
|
||||||
<img src="../assets/qgc-esc.png" class="zoom">
|
<img src="../assets/qgc-power.png" class="zoom">
|
||||||
|
|
||||||
Further reading: https://docs.px4.io/v1.9.0/en/advanced_config/esc_calibration.html.
|
Further reading: https://docs.px4.io/v1.9.0/en/advanced_config/esc_calibration.html.
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ Main article: https://docs.qgroundcontrol.com/en/SetupView/Firmware.html
|
|||||||
|
|
||||||
We recommend using the modified version of PX4 by CopterExpress for the Clover drone, especially for autonomous flights. Download the latest stable version **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">from our GitHub</a>**.
|
We recommend using the modified version of PX4 by CopterExpress for the Clover drone, especially for autonomous flights. Download the latest stable version **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">from our GitHub</a>**.
|
||||||
|
|
||||||
|
> **Info** For Pixhawk-based quadcopters there is a separate firmware version. See details in "[Pixhawk / Pixracer firmware flashing](firmware.md)" article.
|
||||||
|
|
||||||
Flash the flight controller with this firmware:
|
Flash the flight controller with this firmware:
|
||||||
|
|
||||||
<img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom">
|
<img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom">
|
||||||
@@ -68,12 +70,12 @@ This is how the main QGroundControl settings window will look like:
|
|||||||
|
|
||||||
### Selecting the airframe
|
### Selecting the airframe
|
||||||
|
|
||||||
<img src="../assets/qgc-frame-apply.png" alt="QGroundControl frame selection" class="zoom">
|
<img src="../assets/qgc-frame-apply-clover4.png" alt="QGroundControl frame selection" class="zoom">
|
||||||
|
|
||||||
1. Open the *Vehicle Setup* tab.
|
1. Open the *Vehicle Setup* tab.
|
||||||
2. Select the *Airframe* menu.
|
2. Select the *Airframe* menu.
|
||||||
3. Select the *Quadrotor X* airframe type.
|
3. Select the *Quadrotor X* airframe type.
|
||||||
4. Select the *Generic Quadrotor X* from the dropdown menu.
|
4. For Clover 4 select *COEX Clover 4* from the dropdown menu. Otherwise select *Generic Quadrotor X*.
|
||||||
5. Return to the top of the list and press *Apply and Restart* button, confirm by pressing *Apply*.
|
5. Return to the top of the list and press *Apply and Restart* button, confirm by pressing *Apply*.
|
||||||
6. Wait for the settings to be applied and for the flight controller to restart.
|
6. Wait for the settings to be applied and for the flight controller to restart.
|
||||||
|
|
||||||
@@ -87,6 +89,8 @@ Press the *Save* button to save the changed value to the flight controller. Chan
|
|||||||
|
|
||||||
#### Configuring PID regulators
|
#### Configuring PID regulators
|
||||||
|
|
||||||
|
> **Info** Selecting *COEX Clover 4* frame subtype doesn't require setting PID coefficients.
|
||||||
|
|
||||||
##### Averaged PID coefficients for the Clover 4 drone
|
##### Averaged PID coefficients for the Clover 4 drone
|
||||||
|
|
||||||
* `MC_PITCHRATE_P` = 0.087
|
* `MC_PITCHRATE_P` = 0.087
|
||||||
|
|||||||
@@ -295,6 +295,8 @@ Parameters:
|
|||||||
* `thrust` — throttle level, ranges from 0 (no throttle, propellers are stopped) to 1 (full throttle).
|
* `thrust` — throttle level, ranges from 0 (no throttle, propellers are stopped) to 1 (full throttle).
|
||||||
* `auto_arm` – switch the drone to `OFFBOARD` and arm automatically (**the drone will take off**);
|
* `auto_arm` – switch the drone to `OFFBOARD` and arm automatically (**the drone will take off**);
|
||||||
|
|
||||||
|
The positive direction of `yaw_rate` rotation (when viewed from the top) is counterclockwise,`pitch_rate` rotation is forward, `roll_rate` rotation is to the left.
|
||||||
|
|
||||||
### land
|
### land
|
||||||
|
|
||||||
Switch the drone to landing [mode](modes.md) (`AUTO.LAND` or similar).
|
Switch the drone to landing [mode](modes.md) (`AUTO.LAND` or similar).
|
||||||
|
|||||||
@@ -32,3 +32,9 @@ The simulation environment is based on the following components:
|
|||||||
* ROS packages and Gazebo plugins.
|
* ROS packages and Gazebo plugins.
|
||||||
|
|
||||||
<!-- TODO: Write more, add a diagram, etc -->
|
<!-- TODO: Write more, add a diagram, etc -->
|
||||||
|
|
||||||
|
## Video
|
||||||
|
|
||||||
|
Short video review of the simulator:
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/8HYXREMDfzQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
PX4 Simulation
|
PX4 Simulation
|
||||||
===
|
===
|
||||||
|
|
||||||
> **Hint** This article is about running a standalone PX4 simulation with a generic quadcopter. Consider using [our configuration](simulation.md) for a more Clover-like experience.
|
> **Warning** This article is about running a standalone PX4 simulation with a generic quadcopter and **is outdated**. Consider using [our configuration](simulation.md) for a more Clover-like experience.
|
||||||
|
|
||||||
Main article: https://dev.px4.io/en/simulation/
|
Main article: https://dev.px4.io/en/simulation/
|
||||||
|
|
||||||
|
|||||||
58
docs/en/wall_aruco.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Navigation using vertical ArUco-markers
|
||||||
|
|
||||||
|
The algorithm of the navigation through visual ArUco-markers, that was implemented in the Clever image, supports the flexible configuration of the markers in area. It allows you to place them on any surface, at any angle.
|
||||||
|
|
||||||
|
## Installing the vertical camera mount
|
||||||
|
|
||||||
|
For a better recognition of the markers, you need to set the camera vertically so that the lens is pointed parallel to the horizon.
|
||||||
|
|
||||||
|
> **Note** The configuration file allows you to configure the location of the camera in area relative to the copter in any way. For your convenience, we will review the option of installing the camera at an angle of 90 degrees to the horizon in the direction of the copter's nose.
|
||||||
|
|
||||||
|
### Camera mount, 3D printing
|
||||||
|
|
||||||
|
Print the [camera mount](models.md#clover-3).
|
||||||
|
|
||||||
|
Install the mount in a convenient location, so that the camera has a minimum number of unnecessary objects (protection, legs, propellers, beams) — all of it will negatively affect the recognition of the markers.
|
||||||
|
|
||||||
|
## Setting the camera transform
|
||||||
|
|
||||||
|
To set the camera position at the desired angle, open the file `main_camera.launch`, located in `~/catkin_ws/src/clover/clover/launch/`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano ~/catkin_ws/src/clover/clover/launch/main_camera.launch
|
||||||
|
```
|
||||||
|
|
||||||
|
In the parameters `direction_x`, `direction_y`, set empty values manually or enter the following lines:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sed -i "/direction_z/s/default=\".*\"/default=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/main_camera.launch
|
||||||
|
sed -i "/direction_y/s/default=\".*\"/default=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/main_camera.launch
|
||||||
|
```
|
||||||
|
|
||||||
|
Edit one of the configuration lines or add the line shown bellow:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.05 -1.5707963 0 -1.5707963 base_link main_camera_optical"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Note**. Only one camera configuration can be used at a time. If you insert the line above, don't forget to comment the currently active one. The syntax highlighting system will help you determine that — the active line will be highlighted in a different color than the comments. To comment, add the `<!--` and `-->` symbols at the beginning and the end respectively.
|
||||||
|
|
||||||
|
If you are using the marker map, where the markers have equal distances along the x and y axes, you can use [script for creating markers map `gen_map.py`](aruco_map.md#marker-map-definition). Otherwise, you will need to set them manually. To do this, go to the directory `map_name.txt` and create a map file. Fill out your map according to the [map syntax](aruco_map.md#marker-map-definition). Here is an example of a marker map with a random marker location:
|
||||||
|
|
||||||
|
>**Hint**. When filling out the map, select one of the markers as the origin, and measure the distance to all other markers relative to it. If all your parameters are oriented same way, you can choose not to specify all 8 parameters, but only the first 5: the marker index, size, and its location in space along the x, y, and z axes, respectively.
|
||||||
|
|
||||||
|
```
|
||||||
|
106 0.33 0 0 0
|
||||||
|
103 0.33 1.53 0.23 0
|
||||||
|
153 0.40 -0.56 1.36 0
|
||||||
|
```
|
||||||
|
|
||||||
|
After you fill out the map, you need to apply it. To do it, edit the file `aruco.launch`, located in `~/catkin_ws/src/clover/clover/launch/`. Change the line `<param name="map" value="$(find aruco_pose)/map/map_name.txt"/>`, where `map_name.txt` is the name of your map file.
|
||||||
|
|
||||||
|
If you are using markers that are not linked to horizontal surfaces (floor, ceiling), you must disable the parameter `known_tilt` both in the module `aruco_detect` and `aruco_map` in the same file. To do it automatically, enter:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sed -i "/known_tilt/s/value=\".*\"/value=\"\"/" /home/pi/catkin_ws/src/clover/clover/launch/aruco.launch
|
||||||
|
```
|
||||||
|
|
||||||
|
After all the settings, call `sudo systemctl restart clover` to restart the `clover` service.
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
# Клевер
|
# Клевер
|
||||||
|
|
||||||
<img class="center bigclever zoom" src="../assets/clever4-front-white-large.png" width="80%" alt="Клевер 4">
|
<img class="center zoom big-clover" src="../assets/clover42-main.png" width="80%" alt="Клевер 4.2">
|
||||||
|
|
||||||
**«Клевер»** — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним.
|
**«Клевер»** — это учебный конструктор программируемого квадрокоптера, состоящего из популярных открытых компонентов, а также набор необходимой документации и библиотек для работы с ним.
|
||||||
|
|
||||||
Набор включает в себя полетный контроллер Pixracer с полетным стеком PX4, [Raspberry Pi 4](raspberry.md) в качестве управляющего бортового компьютера, [модуль камеры](camera.md) для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
|
Набор включает в себя полетный контроллер [COEX Pix](coex_pix.md) с полетным стеком PX4, [Raspberry Pi 4](raspberry.md) в качестве управляющего бортового компьютера, [модуль камеры](camera.md) для реализации полетов с использованием компьютерного зрения, а также набор различных датчиков и другой периферии.
|
||||||
|
|
||||||
Платформа Клевера также включает в себя преднастроенный [образ для Raspberry Pi](image.md) в полным набором необходимого ПО для работы со всей периферией и [программирования автономных полетов](simple_offboard.md). Исходный код платформы Клевера и данной документации открыт и [доступен на GitHub](https://github.com/CopterExpress/clover).
|
Платформа Клевера также включает в себя преднастроенный [образ для Raspberry Pi](image.md) в полным набором необходимого ПО для работы со всей периферией и [программирования автономных полетов](simple_offboard.md). Исходный код платформы Клевера и данной документации открыт и [доступен на GitHub](https://github.com/CopterExpress/clover).
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,10 @@
|
|||||||
* [Взаимодействие с Arduino](arduino.md)
|
* [Взаимодействие с Arduino](arduino.md)
|
||||||
* [Подключение GPS](gps.md)
|
* [Подключение GPS](gps.md)
|
||||||
* [Работа с ИК датчиками](ir_sensors.md)
|
* [Работа с ИК датчиками](ir_sensors.md)
|
||||||
* [Установка FPV](fpv.md)
|
* [Установка FPV](fpv_clover_4_2.md)
|
||||||
|
* [Установка FPV (Клевер 3)](fpv.md)
|
||||||
|
* [Магнитный захват](magnetic_grip.md)
|
||||||
|
* [Механический захват](mechanical_grip.md)
|
||||||
* [Сборка шаровой защиты](sphere_guard.md)
|
* [Сборка шаровой защиты](sphere_guard.md)
|
||||||
* [Управление в режиме тренера](trainer_mode.md)
|
* [Управление в режиме тренера](trainer_mode.md)
|
||||||
* [Техника лужения](tinning.md)
|
* [Техника лужения](tinning.md)
|
||||||
@@ -91,6 +94,8 @@
|
|||||||
* [Светодиодная лента (legacy)](leds_old.md)
|
* [Светодиодная лента (legacy)](leds_old.md)
|
||||||
* [Вклад в Клевер](contributing.md)
|
* [Вклад в Клевер](contributing.md)
|
||||||
* [Переход на версию 0.20](migrate20.md)
|
* [Переход на версию 0.20](migrate20.md)
|
||||||
|
* [COEX Duocam](duocam.md)
|
||||||
|
* [Виртуальная MAVLink-камера](duocam_mavlink.md)
|
||||||
* [Мероприятия](events.md)
|
* [Мероприятия](events.md)
|
||||||
* [CopterHack-2021](copterhack2021.md)
|
* [CopterHack-2021](copterhack2021.md)
|
||||||
* [CopterHack-2019](copterhack2019.md)
|
* [CopterHack-2019](copterhack2019.md)
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
Для того, чтобы открыть интерфейс блочного программирования в Клевере, [подключитесь к Клеверу по Wi-Fi](wifi.md) и перейдите на страницу http://192.168.11.1:8080/clover_blocks/ либо нажмите ссылку *Blocks programming* на [основной веб-странице Клевера](wifi.md#веб-интерфейс).
|
Для того, чтобы открыть интерфейс блочного программирования в Клевере, [подключитесь к Клеверу по Wi-Fi](wifi.md) и перейдите на страницу http://192.168.11.1/clover_blocks/ либо нажмите ссылку *Blocks programming* на [основной веб-странице Клевера](wifi.md#веб-интерфейс).
|
||||||
|
|
||||||
Интерфейс выглядит следующим образом:
|
Интерфейс выглядит следующим образом:
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Чтобы откалибровать датчики зайдите во вкладку *Vehicle Setup* и выберите меню *Sensors*.
|
Чтобы откалибровать датчики зайдите во вкладку *Vehicle Setup* и выберите меню *Sensors*.
|
||||||
|
|
||||||
> **Caution** Если вы используете полетный контроллер *COEX Pix*, во всех графах *Autopilot Orientation* необходимо указать значение `ROTATION_ROLL_180_YAW_90`, иначе полетный контроллер будет не корректно воспринимать наклоны и повороты коптера.
|
> **Caution** Если вы используете полетный контроллер [*COEX Pix*](coex_pix.md), во всех графах *Autopilot Orientation* необходимо указать значение `ROTATION_ROLL_180_YAW_90`, иначе полетный контроллер будет не корректно воспринимать наклоны и повороты коптера.
|
||||||
|
|
||||||
## Компас
|
## Компас
|
||||||
|
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
|
|
||||||
### Нововведения
|
### Нововведения
|
||||||
|
|
||||||
* Заменен разъем USB Micro-B на раазъем USB Type-C.
|
* Заменен разъем USB Micro-B на разъем USB Type-C.
|
||||||
* Изменен слот для MicroSD карт, на более глубокий.
|
* Изменен слот для MicroSD карт, на более глубокий.
|
||||||
* Изменены назначения пинов на разьеме I2C.
|
* Изменены назначения пинов на разъеме I2C.
|
||||||
* Добавлены ферритовые фильтры в цепи питания.
|
* Добавлены ферритовые фильтры в цепи питания.
|
||||||
|
|
||||||
### Схемы расположения контактов
|
### Схемы расположения контактов
|
||||||
|
|||||||
197
docs/ru/duocam.md
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
# COEX DuoCam
|
||||||
|
|
||||||
|
"COEX DuoCam" – это программно-аппаратный комплекс, позволяющий получать комбинированное визуально-тепловизионное изображение.
|
||||||
|
|
||||||
|
<img src="../assets/duocam/gitup_seek.jpg" width=400 class="center" alt="duocam">
|
||||||
|
|
||||||
|
В качестве источника визуальной картинки теоретически можно использовать любую камеру, имеющую CSI или HDMI-выход.
|
||||||
|
|
||||||
|
В качестве источника тепловизионной картинки можно использовать тепловизоры Seek Compact или Seek Compact Pro.
|
||||||
|
|
||||||
|
В качестве платформы для запуска обрабатывающего софта рекомендуется использовать одноплатный компьютер Raspberry Pi 4B.
|
||||||
|
|
||||||
|
## Подключение устройств
|
||||||
|
|
||||||
|
Тепловизор подключается в один из портов USB 3.0 на RPi4. Во второй USB 3.0-порт подключается Wi-Fi адаптер для осуществления связи с наземной станцией.
|
||||||
|
|
||||||
|
Визуальная камера подключается в CSI порт напрямую или через HDMI-CSI-конвертер.
|
||||||
|
|
||||||
|
В порт USB 2.0 следует подключить USB-flash устройство, на которое будет производиться сохранение фото и видеофайлов.
|
||||||
|
|
||||||
|
## Принцип работы
|
||||||
|
|
||||||
|
Программная часть осуществляет наложение тепловизионной картинки на визуальную. С помощью конфигурационного файла или виджета управления свойствами камеры в QGroundControl можно изменять результирующее изображение.
|
||||||
|
|
||||||
|
### Выбор модели тепловизора
|
||||||
|
|
||||||
|
Первоначально надо определиться, какая у вас модель тепловизора (простая или Pro) и выставить соответствующую настройку в конфиг-файле (`enable: yes` у seek_thermal_pro или seek_thermal в разделе thermal_camera_models. Важно не забыть выставить `enable: no` у камеры, которую не предполагается использовать).
|
||||||
|
|
||||||
|
### Управление наложением
|
||||||
|
|
||||||
|
При включенном визуальном (`show_visual: yes`) и термическом (`show_thermal: yes`) изображениях, термическое будет налагаться на визуальное в регион, заданный в свойстве `overlay_thermal_on_visual` (начальная точка с координатами `(x_start, y_start)`, ширина региона - `thermal_region_width`, высота - `thermal_region_height`).
|
||||||
|
|
||||||
|
Если отключить визуальное изображение (`show_visual: no`), то термическое развернется на весь экран.
|
||||||
|
|
||||||
|
Если отключить термическое (`show_thermal: no`), то будет транслироваться только визуальное.
|
||||||
|
|
||||||
|
Если отключить оба – изображение перестанет транслироваться.
|
||||||
|
|
||||||
|
### Центровка
|
||||||
|
|
||||||
|
Для центровки результирующего изображения (из-за физического сдвига объективов камер термическое будет сдвинутого относительно центра визуального) следует использовать свойства раздела `final_frame_cropping`. Принцип аналогичен предыдущему разделу.
|
||||||
|
|
||||||
|
### Детекторы контуров (edge detectors)
|
||||||
|
|
||||||
|
Для облегчения понимания термического изображения, есть возможность включения наложения на него соответствующих контуров визуального изображения. В программе реализована поддержка двух алгоритмов детектирования контуров: [Sobel](https://docs.opencv.org/3.4/d2/d2c/tutorial_sobel_derivatives.html) и [Canny](https://docs.opencv.org/3.4/da/d5c/tutorial_canny_detector.html). В соответствующих разделах конфига (`apply_sobel` и `apply_canny`) можно поэкспериментировать с некоторыми свойствами детекторов.
|
||||||
|
|
||||||
|
### Колоризация
|
||||||
|
|
||||||
|
Для большей наглядности, тепловизионное изображение можно колорифицировать. Для этого необходимо выставить свойство `apply_colormap: yes`.
|
||||||
|
|
||||||
|
Конкретную схему колорификации можно выбрать из [списка](https://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html), указав порядковый номер схемы в свойстве `colormap`.
|
||||||
|
|
||||||
|
### Свойства транслируемого видео и сохраняемых файлов
|
||||||
|
|
||||||
|
Свойства транслируемого видео можно изменять в разделе `output_video`. Делать это стоит с четким пониманием того, что делаешь - неправильные настройки могут сломать трансляцию. Например, разрешение видео должно совпадать с настройками gstreamer'а, который осуществляет последующее кодирование.
|
||||||
|
|
||||||
|
Для настройки сохраняемого на флеш-накопитель видео следует пользоваться группой свойств `encode_video`.
|
||||||
|
|
||||||
|
Каталоги для сохранения фото и видеофайлов можно указать в свойствах `path_to_save`.
|
||||||
|
|
||||||
|
### Настройки дополнительной отображаемой информации
|
||||||
|
|
||||||
|
Скрывать\показывать частоту кадров в секунду визуального и термического изображений можно при помощи свойства `show_fps`.
|
||||||
|
|
||||||
|
Показывать\скрывать перекрестие с температурой центрального пикселя можно при помощи свойства `draw_temp`.
|
||||||
|
|
||||||
|
### Подстройка температуры
|
||||||
|
|
||||||
|
В зависимости от используемого тепловизора, может потребоваться корректировка температурного диапазона. В секции `temperature_calibration` Доступны две настройки:
|
||||||
|
|
||||||
|
* Сдвиг (`offset`) - линейный сдвиг температурного диапазон на указанное число.
|
||||||
|
* Масштаб (`scale`) - пропорциональное изменение шкалы.
|
||||||
|
|
||||||
|
### Выравнивание градиента температуры от центра к краям
|
||||||
|
|
||||||
|
Если на тепловизионном изображении наблюдается "рамка", вызванная увеличением определяемой температуры к краям, то следует применить выравнивающий фильтр (виньетирование). Настройки располагаются в секции `vignette`:
|
||||||
|
|
||||||
|
* `enable` - включить-выключить наложение фильтра.
|
||||||
|
* `show_center` - показать точку "центра" для отладки ее положения.
|
||||||
|
* `center_x` - X-координата "центра".
|
||||||
|
* `center_y` - Y-координата "центра".
|
||||||
|
* `max_decrement_relative` - максимальное уменьшение температуры к краям.
|
||||||
|
|
||||||
|
## Виджет управления камерой для QGroundControl
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Где взять
|
||||||
|
|
||||||
|
QGC c необходимый функционалом для управления "COEX DuoCam" можно скачать в нашем [репозитории](https://github.com/CopterExpress/qgroundcontrol/releases). Скачивать следует тот релиз, в названии которого присутствует слово `duocam` с максимальным порядковым номером.
|
||||||
|
|
||||||
|
### Как использовать
|
||||||
|
|
||||||
|
При открытии виджета QGC пошлет MAVLink-сообщения с запросом текущих значений свойств. Необходимо дождаться, пока они все до конца загрузятся. Если загрузка не завершается в течение минуты, необходимо нажать кнопку "Refresh values".
|
||||||
|
|
||||||
|
При изменении значений свойств QGC осуществляет коммуникацию с DuoCam посредством протокола MAVLink, поэтому нет смысла очень часто нажимать контролы - наоборот, после нажатия следует дождаться изменения картинки и только потом переходить к следующему свойству.
|
||||||
|
|
||||||
|
[Подробнее об архитектуре DuoCam и программе `duocam-mavlink`](duocam_mavlink.md).
|
||||||
|
|
||||||
|
## Конфигурационный файл
|
||||||
|
|
||||||
|
Для более глубокой настройки DuoCam можно использовать конфигурационный файл.
|
||||||
|
|
||||||
|
### Как добраться
|
||||||
|
|
||||||
|
Для редактирования конфигурационного файла необходимо извлечь microSD-карту из RPi4, вставить в кард-ридер своего компьютера (от операционной системы требуется возможность читать файловую систему ext4), открыть файл по адресу `<microSD>/etc/duocam/camera.yaml`.
|
||||||
|
|
||||||
|
Также можно зайти по SSH на работающую RPi4 и отредактировать конфигурационный файл внутри системы по тому же пути.
|
||||||
|
|
||||||
|
### Образец конфигурационного файла
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
show_visual: yes
|
||||||
|
show_thermal: yes
|
||||||
|
flip_thermal: no
|
||||||
|
apply_sobel:
|
||||||
|
enable: yes
|
||||||
|
sobel_scale: 3
|
||||||
|
sobel_delta: 0
|
||||||
|
apply_canny: no
|
||||||
|
draw_temp: yes
|
||||||
|
|
||||||
|
output_video:
|
||||||
|
device: /dev/video1
|
||||||
|
width: 1280
|
||||||
|
height: 720
|
||||||
|
bytes_per_pixel: 3
|
||||||
|
framerate: 20
|
||||||
|
|
||||||
|
path_to_save_photos: /media/usb0/
|
||||||
|
path_to_save_videos: /media/usb0/
|
||||||
|
|
||||||
|
encode_video:
|
||||||
|
width: 720
|
||||||
|
height: 480
|
||||||
|
framerate: 10
|
||||||
|
|
||||||
|
thermal_camera_models:
|
||||||
|
seek_thermal_pro:
|
||||||
|
enable: no
|
||||||
|
sensor_resolution:
|
||||||
|
width: 320
|
||||||
|
height: 240
|
||||||
|
overlay_thermal_on_visual:
|
||||||
|
# These values are for GitUp3
|
||||||
|
x_start: 282
|
||||||
|
y_start: 102
|
||||||
|
thermal_region_width: 600
|
||||||
|
thermal_region_height: 400
|
||||||
|
transparency: 0.3
|
||||||
|
# These values are for Raspicam
|
||||||
|
# x_start: 425
|
||||||
|
# y_start: 155
|
||||||
|
# thermal_region_width: 900
|
||||||
|
# thermal_region_height: 600
|
||||||
|
final_frame_cropping:
|
||||||
|
enable: yes
|
||||||
|
x_start: 0
|
||||||
|
y_start: 0
|
||||||
|
width: 1160
|
||||||
|
height: 610
|
||||||
|
|
||||||
|
seek_thermal:
|
||||||
|
enable: yes
|
||||||
|
sensor_resolution:
|
||||||
|
width: 206
|
||||||
|
height: 156
|
||||||
|
overlay_thermal_on_visual:
|
||||||
|
x_start: 282
|
||||||
|
y_start: 102
|
||||||
|
thermal_region_width: 600
|
||||||
|
thermal_region_height: 400
|
||||||
|
transparency: 0.3
|
||||||
|
final_frame_cropping:
|
||||||
|
enable: yes
|
||||||
|
x_start: 0
|
||||||
|
y_start: 0
|
||||||
|
width: 1160
|
||||||
|
height: 610
|
||||||
|
|
||||||
|
# Colormaps are taken from: https://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html
|
||||||
|
# COLORMAP_AUTUMN = 0,
|
||||||
|
# COLORMAP_BONE = 1,
|
||||||
|
# COLORMAP_JET = 2,
|
||||||
|
# COLORMAP_WINTER = 3,
|
||||||
|
# COLORMAP_RAINBOW = 4,
|
||||||
|
# COLORMAP_OCEAN = 5,
|
||||||
|
# COLORMAP_SUMMER = 6,
|
||||||
|
# COLORMAP_SPRING = 7,
|
||||||
|
# COLORMAP_COOL = 8,
|
||||||
|
# COLORMAP_HSV = 9,
|
||||||
|
# COLORMAP_PINK = 10,
|
||||||
|
# COLORMAP_HOT = 11
|
||||||
|
apply_colormap:
|
||||||
|
enable: yes
|
||||||
|
colormap: 4
|
||||||
|
```
|
||||||
104
docs/ru/duocam_mavlink.md
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# Виртуальная MAVLink-камера COEX DuoCam
|
||||||
|
|
||||||
|
Полётные контроллеры поддерживают разные способы взаимодействия с внешними камерами, включая протокол MAVLink. Обычно коммуникация с помощью данного протокола требует использования UART-порта на полётном контроллере, но есть возможность работать с камерой в основном потоке MAVLink-телеметрии с БПЛА.
|
||||||
|
|
||||||
|
Утилита `duocam-mavlink` отвечает за работу виртуальной MAVLink-камеры и встраивается в общую телеметрию между полётным контроллером и QGroundControl.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
На блок-схеме прямыми линиями обозначены взаимодействия между блоками, пунктирными линиями уточняется характер взаимодействия.
|
||||||
|
|
||||||
|
> **Warning** Протокол взаимодействия находится в процессе модификации. В новых версиях планируется избавиться от прямой отправки значений параметров и их количества от `duocam-mavlink` к QGroundControl.
|
||||||
|
|
||||||
|
`duocam-camera` и `duocam-mavlink` обмениваются данными с помощью очередей POSIX. Имена очередей и формат сообщений доступен в репозитории [duocam-common](https://github.com/CopterExpress/duocam-common).
|
||||||
|
|
||||||
|
Для объединения блоков, взаимодействующих через MAVLink, можно использовать любой MAVLink-коммутатор/маршрутизатор, который либо позволяет отключить таблицу коммутации, либо заполняет её по схеме *MAVLink ID:Component ID* (например, `cmavnode`, `mavlink-fast-switch`, `mavlink-switch`).
|
||||||
|
|
||||||
|
> **Warning** При использовании `mavlink-fast-switch` требуется использовать `mavlink-serial-bridge`, либо любой другой мост для передачи MAVLink из последовательного порта в UDP, так как `mavlink-fast-switch` работает только с UDP.
|
||||||
|
|
||||||
|
## Конфигурационный файл
|
||||||
|
|
||||||
|
Для редактирования конфигурационного файла необходимо извлечь microSD-карту из RPi4, вставить в кард-ридер своего компьютера (от операционной системы требуется возможность читать файловую систему ext4), открыть файл по адресу `<microSD>/etc/duocam/mavlink.yaml`.
|
||||||
|
|
||||||
|
Также можно зайти по SSH на работающую RPi4 и отредактировать конфигурационный файл внутри системы по тому же пути.
|
||||||
|
|
||||||
|
Для корректной работы `duocam-mavlink` требуется *MAVLink ID* полётного контроллера (параметр `vehicle_id`) и `MAVLink ID` QGroundControl (параметр `qgc_vehicle_id`). `duocam-mavlink` ожидает телеметрию на UDP (параметры `ip` и `port`) и отправляет сообщения HEARTBEAT с частотой, согласно параметру `heartbeat_frequency`, представляясь, как компонент полётного контроллера `MAV_COMP_ID_CAMERA`.
|
||||||
|
|
||||||
|
Максимальная задержка от `duocam-camera` задаётся параметром `command_timeout`.
|
||||||
|
|
||||||
|
Если система DuoCam используется для полётов внутри помещений, то должен быть включен параметр `no_gps`.
|
||||||
|
|
||||||
|
## Пример конфигурационного файла
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# MAVLink vehicle ID that owns the camera
|
||||||
|
vehicle_id: 1
|
||||||
|
# Enable this flag for indoor use
|
||||||
|
no_gps: False
|
||||||
|
# QGC vehicle ID
|
||||||
|
qgc_vehicle_id: 255
|
||||||
|
mavlink:
|
||||||
|
# IP address of the interface to listen port on (0.0.0.0 for all interfaces)
|
||||||
|
ip: 127.0.0.1
|
||||||
|
# UDP port
|
||||||
|
port: 14540
|
||||||
|
# Heartbeat frequency (Hz)
|
||||||
|
heartbeat_frequency: 1.0
|
||||||
|
# Camera driver command timeout (s)
|
||||||
|
command_timeout: 3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Пример конфигурационного файла для `mavlink-fast-switch`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# MAVLink endpoints
|
||||||
|
endpoints:
|
||||||
|
# UAV endpoint
|
||||||
|
- name: "uav"
|
||||||
|
local:
|
||||||
|
port: 14588
|
||||||
|
# DuoCam MAVLink endpoint
|
||||||
|
- name: "duocam-mavlink"
|
||||||
|
remote:
|
||||||
|
ip: "127.0.0.1"
|
||||||
|
port: 14540
|
||||||
|
# GCS endpoint
|
||||||
|
- name: "gcs"
|
||||||
|
remote:
|
||||||
|
ip: "127.0.0.1"
|
||||||
|
port: 14550
|
||||||
|
# Enable MAVLink ID table
|
||||||
|
# HINT: Can't use this feature with duocam
|
||||||
|
id-table: False
|
||||||
|
```
|
||||||
|
|
||||||
|
## Пример конфигурационного файла для `mavlink-serial-bridge`
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Serial device settings
|
||||||
|
serial:
|
||||||
|
# Device file
|
||||||
|
device: "/dev/ttyS0"
|
||||||
|
# Baudrate
|
||||||
|
baudrate: 57600
|
||||||
|
# Flow control (hardware, none)
|
||||||
|
flow: none
|
||||||
|
# Software serial TX buffer (bytes) (2048 by default)
|
||||||
|
tx-buffer: 2048
|
||||||
|
# UDP port settings
|
||||||
|
udp:
|
||||||
|
# Remote host settings (optional, listening mode if not presented)
|
||||||
|
remote:
|
||||||
|
ip: 127.0.0.1
|
||||||
|
port: 14588
|
||||||
|
# Lock remote host on the initial value (optional, False by default)
|
||||||
|
lock: True
|
||||||
|
# Broadcast mode (optional, False by default)
|
||||||
|
broadcast: False
|
||||||
|
# Local settings (optional, all interfaces and a random port by default)
|
||||||
|
local:
|
||||||
|
# Local IP address (0.0.0.0 to listen on all interfaces) (optional, all interfaces by default)
|
||||||
|
ip: 127.0.0.1
|
||||||
|
# Local UDP port (0 to select a random free port) (optional, 0 by default)
|
||||||
|
port: 0
|
||||||
|
```
|
||||||