Compare commits
12 Commits
v0.21-alph
...
ros-book
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d383a1c858 | ||
|
|
d15eb7785e | ||
|
|
bb9d8edb78 | ||
|
|
852b854676 | ||
|
|
72491ade0e | ||
|
|
f5ee72940c | ||
|
|
b6cedecdf0 | ||
|
|
8b1dddce67 | ||
|
|
a89bc82f2b | ||
|
|
156527641a | ||
|
|
4f9e4b1a28 | ||
|
|
46f8f6eb89 |
@@ -2,17 +2,14 @@
|
||||
<arg name="ws281x" default="true"/>
|
||||
<arg name="led_effect" default="true"/>
|
||||
<arg name="led_notify" default="true"/>
|
||||
<arg name="led_count" default="58"/>
|
||||
<arg name="gpio_pin" default="21"/>
|
||||
|
||||
<arg name="simulator" default="false"/>
|
||||
|
||||
<!-- For additional help go to https://clover.coex.tech/led -->
|
||||
|
||||
<!-- ws281x led strip driver -->
|
||||
<node pkg="ws281x" name="led" type="ws281x_node" clear_params="true" output="screen" if="$(eval ws281x and not simulator)">
|
||||
<param name="led_count" value="$(arg led_count)"/>
|
||||
<param name="gpio_pin" value="$(arg gpio_pin)"/>
|
||||
<param name="led_count" value="58"/>
|
||||
<param name="gpio_pin" value="21"/>
|
||||
<param name="brightness" value="64"/>
|
||||
<param name="strip_type" value="WS2811_STRIP_GRB"/>
|
||||
<param name="target_frequency" value="800000"/>
|
||||
@@ -35,7 +32,7 @@
|
||||
altctl: { r: 255, g: 255, b: 40 }
|
||||
posctl: { r: 50, g: 100, b: 220 }
|
||||
offboard: { r: 220, g: 20, b: 250 }
|
||||
low_battery: { threshold: 3.6, effect: blink_fast, r: 255, g: 0, b: 0 }
|
||||
low_battery: { threshold: 3.7, effect: blink_fast, r: 255, g: 0, b: 0 }
|
||||
error: { effect: flash, r: 255, g: 0, b: 0 }
|
||||
</rosparam>
|
||||
</node>
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
<node if="$(eval direction_z == 'down' and direction_y == 'forward')" pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 1.5707963 0 3.1415926 base_link main_camera_optical"/>
|
||||
<node if="$(eval direction_z == 'up' and direction_y == 'backward')" pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 1.5707963 0 0 base_link main_camera_optical"/>
|
||||
<node if="$(eval direction_z == 'up' and direction_y == 'forward')" pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 -1.5707963 0 0 base_link main_camera_optical"/>
|
||||
<node if="$(eval direction_z == 'forward')" pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.03 0 0.05 -1.5707963 0 -1.5707963 base_link main_camera_optical"/>
|
||||
<node if="$(eval direction_z == 'backward')" pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="-0.03 0 0.05 1.5707963 0 -1.5707963 base_link main_camera_optical"/>
|
||||
|
||||
<!-- Template for custom camera orientation -->
|
||||
<!-- Camera position and orientation are represented by base_link -> main_camera_optical transform -->
|
||||
|
||||
@@ -36,7 +36,6 @@
|
||||
#include <mavros_msgs/Thrust.h>
|
||||
#include <mavros_msgs/State.h>
|
||||
#include <mavros_msgs/StatusText.h>
|
||||
#include <mavros_msgs/ManualControl.h>
|
||||
|
||||
#include <clover/GetTelemetry.h>
|
||||
#include <clover/Navigate.h>
|
||||
@@ -75,7 +74,7 @@ ros::Duration global_position_timeout;
|
||||
ros::Duration battery_timeout;
|
||||
float default_speed;
|
||||
bool auto_release;
|
||||
bool land_only_in_offboard, nav_from_sp, check_kill_switch;
|
||||
bool land_only_in_offboard, nav_from_sp;
|
||||
std::map<string, string> reference_frames;
|
||||
|
||||
// Publishers
|
||||
@@ -123,7 +122,6 @@ enum { YAW, YAW_RATE, TOWARDS } setpoint_yaw_type;
|
||||
// Last received telemetry messages
|
||||
mavros_msgs::State state;
|
||||
mavros_msgs::StatusText statustext;
|
||||
mavros_msgs::ManualControl manual_control;
|
||||
PoseStamped local_position;
|
||||
TwistStamped velocity;
|
||||
NavSatFix global_position;
|
||||
@@ -488,18 +486,6 @@ void publishSetpoint(const ros::TimerEvent& event)
|
||||
publish(event.current_real);
|
||||
}
|
||||
|
||||
inline void checkKillSwitch()
|
||||
{
|
||||
if (!TIMEOUT(manual_control, state_timeout))
|
||||
throw std::runtime_error("Manual control timeout, can't check kill switch status");
|
||||
|
||||
const int KILL_SWITCH_BIT = 12; // https://github.com/PX4/Firmware/blob/c302514a0809b1765fafd13c014d705446ae1113/src/modules/mavlink/mavlink_messages.cpp#L3975
|
||||
bool kill_switch = manual_control.buttons & (1 << KILL_SWITCH_BIT);
|
||||
|
||||
if (kill_switch)
|
||||
throw std::runtime_error("Kill switch is on");
|
||||
}
|
||||
|
||||
inline void checkState()
|
||||
{
|
||||
if (TIMEOUT(state, state_timeout))
|
||||
@@ -527,10 +513,6 @@ bool serve(enum setpoint_type_t sp_type, float x, float y, float z, float vx, fl
|
||||
// Checks
|
||||
checkState();
|
||||
|
||||
if (auto_arm && check_kill_switch) {
|
||||
checkKillSwitch();
|
||||
}
|
||||
|
||||
// default frame is local frame
|
||||
if (frame_id.empty())
|
||||
frame_id = local_frame;
|
||||
@@ -852,7 +834,6 @@ int main(int argc, char **argv)
|
||||
nh_priv.param("auto_release", auto_release, true);
|
||||
nh_priv.param("land_only_in_offboard", land_only_in_offboard, true);
|
||||
nh_priv.param("nav_from_sp", nav_from_sp, true);
|
||||
nh_priv.param("check_kill_switch", check_kill_switch, true);
|
||||
nh_priv.param("default_speed", default_speed, 0.5f);
|
||||
nh_priv.param<string>("body_frame", body.child_frame_id, "body");
|
||||
nh_priv.getParam("reference_frames", reference_frames);
|
||||
@@ -879,7 +860,6 @@ int main(int argc, char **argv)
|
||||
auto global_position_sub = nh.subscribe("mavros/global_position/global", 1, &handleMessage<NavSatFix, global_position>);
|
||||
auto battery_sub = nh.subscribe("mavros/battery", 1, &handleMessage<BatteryState, battery>);
|
||||
auto statustext_sub = nh.subscribe("mavros/statustext/recv", 1, &handleMessage<mavros_msgs::StatusText, statustext>);
|
||||
auto manual_control_sub = nh.subscribe("mavros/manual_control/control", 1, &handleMessage<mavros_msgs::ManualControl, manual_control>);
|
||||
auto local_position_sub = nh.subscribe("mavros/local_position/pose", 1, &handleLocalPosition);
|
||||
|
||||
// Setpoint publishers
|
||||
|
||||
@@ -30,9 +30,7 @@ The frontend files are located in [`www`](./www/) subdirectory. The frontend app
|
||||
Parameters read by frontend:
|
||||
|
||||
* `~navigate_tolerance` (*float*) – distance tolerance in meters, used for navigate-like blocks (default: 0.2).
|
||||
* `~yaw_tolerance` (*float*) – yaw angle tolerance in degrees, used in set_yaw block (default: 20).
|
||||
* `~sleep_time` (*float*) – duration of sleep in loop cycles, used for navigate-like blocks (default: 0.2).
|
||||
* `~confirm_run` (*bool*) – enable confirmation to run the program (default: true).
|
||||
|
||||
These parameters also can be set as URL GET-parameters, for example:
|
||||
|
||||
|
||||
@@ -1,13 +1,5 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (C) 2020 Copter Express Technologies
|
||||
#
|
||||
# Author: Oleg Kalachev <okalachev@gmail.com>
|
||||
#
|
||||
# Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import rospy
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Copter Express Technologies
|
||||
*
|
||||
* Author: Oleg Kalachev <okalachev@gmail.com>
|
||||
*
|
||||
* Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*/
|
||||
|
||||
const COLOR_FLIGHT = 293;
|
||||
const COLOR_STATE = 36;
|
||||
const COLOR_LED = 143;
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Copter Express Technologies
|
||||
*
|
||||
* Author: Oleg Kalachev <okalachev@gmail.com>
|
||||
*
|
||||
* Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*/
|
||||
|
||||
import * as ros from './ros.js';
|
||||
import './blocks.js';
|
||||
import {generateCode, generateUserCode} from './python.js';
|
||||
@@ -39,9 +29,7 @@ var workspace = Blockly.inject('blockly', {
|
||||
function readParams() {
|
||||
return Promise.all([
|
||||
ros.readParam('navigate_tolerance', true, 0.2),
|
||||
ros.readParam('yaw_tolerance', true, 20),
|
||||
ros.readParam('sleep_time', true, 0.2),
|
||||
ros.readParam('confirm_run', true, true),
|
||||
ros.readParam('sleep_time', true, 0.2)
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -109,7 +97,7 @@ new ROSLIB.Topic({ ros: ros.ros, name: ros.priv + 'prompt', messageType: 'clover
|
||||
name: ros.priv + 'input/' + msg.id,
|
||||
messageType: 'std_msgs/String',
|
||||
latch: true
|
||||
}).publish(new ROSLIB.Message({ data: response || '' }));
|
||||
}).publish(new ROSLIB.Message({ data: response }));
|
||||
});
|
||||
|
||||
window.stopProgram = function() {
|
||||
@@ -125,7 +113,7 @@ ros.ros.on('close', update);
|
||||
ready.then(() => runButton.disabled = false);
|
||||
|
||||
window.runProgram = function() {
|
||||
if (ros.params.confirm_run && !confirm('Run program?')) return;
|
||||
if (!confirm('Run program?')) return;
|
||||
|
||||
runRequest = true;
|
||||
update();
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Copter Express Technologies
|
||||
*
|
||||
* Author: Oleg Kalachev <okalachev@gmail.com>
|
||||
*
|
||||
* Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*/
|
||||
|
||||
import {params} from './ros.js';
|
||||
|
||||
// If any new block imports any library, add that library name here.
|
||||
@@ -18,9 +8,14 @@ Blockly.Python.addReservedWords('pigpio,pi,Range');
|
||||
Blockly.Python.addReservedWords('SetLEDEffect,set_effect');
|
||||
Blockly.Python.addReservedWords('SetLEDs,LEDState,set_leds');
|
||||
|
||||
// TODO: parametrize
|
||||
const navigate_tolerance = 0.2;
|
||||
const sleep_time = 0.2;
|
||||
|
||||
const IMPORT_SRV = `from clover import srv
|
||||
from std_srvs.srv import Trigger`;
|
||||
|
||||
// TODO: tolerance to parameters
|
||||
const NAVIGATE_WAIT = () => `\ndef navigate_wait(x=0, y=0, z=0, speed=0.5, frame_id='body', auto_arm=False):
|
||||
res = navigate(x=x, y=y, z=z, yaw=float('nan'), speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
@@ -38,13 +33,15 @@ const LAND_WAIT = () => `\ndef land_wait():
|
||||
while get_telemetry().armed:
|
||||
rospy.sleep(${params.sleep_time})\n`;
|
||||
|
||||
// TODO: tolerance to parameters
|
||||
const WAIT_YAW = () => `\ndef wait_yaw():
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if abs(telem.yaw) < math.radians(${params.yaw_tolerance}):
|
||||
if abs(telem.yaw) < math.radians(20):
|
||||
return
|
||||
rospy.sleep(${params.sleep_time})\n`;
|
||||
|
||||
// TODO: tolerance to parameters
|
||||
const WAIT_ARRIVAL = () => `\ndef wait_arrival():
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
@@ -52,6 +49,7 @@ const WAIT_ARRIVAL = () => `\ndef wait_arrival():
|
||||
return
|
||||
rospy.sleep(${params.sleep_time})\n`;
|
||||
|
||||
// TODO: tolerance to parameters
|
||||
const ARRIVED = () => `\ndef arrived():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
return math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < ${params.navigate_tolerance}\n`
|
||||
|
||||
@@ -1,13 +1,3 @@
|
||||
/*
|
||||
* Copyright (C) 2020 Copter Express Technologies
|
||||
*
|
||||
* Author: Oleg Kalachev <okalachev@gmail.com>
|
||||
*
|
||||
* Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*/
|
||||
|
||||
var url = 'ws://' + location.hostname + ':9090';
|
||||
export var ros = new ROSLIB.Ros({ url });
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 344 KiB |
|
Before Width: | Height: | Size: 340 KiB |
|
Before Width: | Height: | Size: 401 KiB |
|
Before Width: | Height: | Size: 345 KiB |
|
Before Width: | Height: | Size: 419 KiB |
|
Before Width: | Height: | Size: 313 KiB |
|
Before Width: | Height: | Size: 549 KiB |
|
Before Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 333 KiB |
|
Before Width: | Height: | Size: 469 KiB |
|
Before Width: | Height: | Size: 330 KiB |
|
Before Width: | Height: | Size: 472 KiB |
|
Before Width: | Height: | Size: 324 KiB |
|
Before Width: | Height: | Size: 461 KiB |
|
Before Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 456 KiB |
|
Before Width: | Height: | Size: 479 KiB |
|
Before Width: | Height: | Size: 337 KiB |
|
Before Width: | Height: | Size: 338 KiB |
|
Before Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 238 KiB |
|
Before Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 258 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 257 KiB |
|
Before Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 172 KiB |
|
Before Width: | Height: | Size: 315 KiB |
|
Before Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 175 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 437 KiB |
|
Before Width: | Height: | Size: 376 KiB |
|
Before Width: | Height: | Size: 498 KiB |
|
Before Width: | Height: | Size: 574 KiB |
|
Before Width: | Height: | Size: 715 KiB |
|
Before Width: | Height: | Size: 402 KiB |
|
Before Width: | Height: | Size: 211 KiB |
|
Before Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 303 KiB |
|
Before Width: | Height: | Size: 374 KiB |
|
Before Width: | Height: | Size: 366 KiB |
|
Before Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 263 KiB |
|
Before Width: | Height: | Size: 271 KiB |
|
Before Width: | Height: | Size: 300 KiB |
|
Before Width: | Height: | Size: 334 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 58 KiB |
BIN
docs/assets/right-hand-rotate.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
87
docs/assets/right-hand-rule.svg
Normal file
@@ -0,0 +1,87 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
]>
|
||||
<svg version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
|
||||
x="0px" y="0px" width="507px" height="459px" viewBox="-21.914 -25.609 507 459" enable-background="new -21.914 -25.609 507 459"
|
||||
xml:space="preserve">
|
||||
<defs>
|
||||
</defs>
|
||||
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M466.982,303.788c-22-3-57-23-62-26s-28-28-40-47s-23-42-27-55
|
||||
s-8-26-9-33s1-23.5,4-30.5c-7-5-21-6-27,7s-11,33-11,46s22,55,8,61s-17,14-89-4s-102-20-109-6s34,20,56,24s72.021,22.634,65,32
|
||||
c-4.35,5.802-9.375,4.488-20.709,8.488c-19.611,6.922-19.308,9.966-43.791,18.345c-24.433,8.362-22.843,32.226-15.167,36.23
|
||||
s14.016,6.342,46.386-12.013c14.35-5.34,31.782-8.885,47.115-10.218s24.668,56,41.334,64.667s35.999,8,47.999,8
|
||||
s18.666,2.001,25.333-1.333s25.334,1.332,35.334,6.666c0,0,38.667,18.667,42,22.667"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M234.483,270.787c33.999-1.999,45.999,30.667,53.999,48.001"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M306.149,245.453c0.334,25.334,11.001,46.668,25.333,54.666"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M239.816,230.787c-8,1.333-17.333,20-13.333,25.333"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M197.149,220.12c-5.333,4-16,13.333-13.333,18.667"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M149.149,212.12c-6.667,4-8.834,15.501-10.167,18.167"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M222.483,280.121c8,4,12,17.332,9.333,26.666"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M201.296,287.393c6.667,4,7.248,23.993,4.581,27.993"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M175.848,298.59c8.648,6.485,9.591,15.534,5.089,26.466"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M293.982,236.288c-4,10-7,18-6,24"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M294.982,165.288c11.947,1.707,2.677,3.252,25-1"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M399.149,286.788c-4,12-8,15.999-14.667,19.999"/>
|
||||
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M299.816,374.455c15.905-3.181,27.334-5.333,36-8
|
||||
s21.332-10.001,24.666-16.667s0.667-7.999-1.333-12.666s-23.999-2-29.333,0s-10,4-32,7.333s-28,5-39.334,3.666
|
||||
c-9.292-1.094,1.335,22.333,6.001,25S269.816,380.455,299.816,374.455z"/>
|
||||
<path fill="#E5D4B1" stroke="#000000" stroke-width="3" d="M316.784,311.788c18.897-1.333,28.348-2.666,33.435,2.667
|
||||
s2.906,10.667,1.453,12s-18.171,8.666-26.893,11.333c-8.723,2.667-10.176,0.667-27.619,4.667c-17.444,4-18.897,5.333-23.986,7.333
|
||||
c-5.088,2-15.263,1.333-24.711-6c-9.449-7.333-7.996-20-7.269-24c0.727-4,1.455-12.667,19.625-14s12.354,4.666,35.614,5.333
|
||||
C319.691,311.788,316.784,311.788,316.784,311.788z"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M245.815,318.455c-1.923,17.305,1.109,18.166,10.667,25.333"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M275.149,318.787c0,5.333,1.333,17.333,1.333,17.333"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M308.149,317.12c0,2.667,1.334,13.333,1.334,17.333"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M314.815,347.122c0,4,6.667,17.333,6.667,17.333"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M282.482,354.788c1.333,2.667,2.667,14.666,6.667,16"/>
|
||||
<path fill="none" stroke="#897F6A" stroke-width="2" d="M405.815,318.788c-6.666,12-10.666,42.668-17.333,49.334"/>
|
||||
<line fill="none" stroke="#963C96" stroke-width="9" stroke-linecap="round" x1="323.482" y1="90.788" x2="322.814" y2="41.788"/>
|
||||
<polygon fill="#963C96" points="322.814,41.788 299.501,60.3 322.814,0 346.127,60.3 "/>
|
||||
<line fill="none" stroke="#2828FF" stroke-width="9" stroke-linecap="round" x1="88.996" y1="210.46" x2="40.9" y2="201.067"/>
|
||||
<polygon fill="#2828FF" points="40.9,201.067 54.24,227.68 0,192.5 63.799,182.044 "/>
|
||||
<line fill="none" stroke="#E12828" stroke-width="9" stroke-linecap="round" x1="126.377" y1="335.255" x2="95.585" y2="348.005"/>
|
||||
<polygon fill="#E12828" points="95.585,348.005 118.064,371.413 69.063,358.197 96.605,315.568 "/>
|
||||
<g>
|
||||
<path fill="#2828FF" d="M375.868,62.098l-0.308-0.103c-1.121,1.094-2.212,1.887-3.271,2.379s-2.184,0.738-3.373,0.738
|
||||
c-1.75,0-3.138-0.461-4.163-1.384s-1.538-2.157-1.538-3.702c0-2.01,0.987-3.592,2.963-4.748s4.974-1.883,8.993-2.184v-1.948
|
||||
c0-1.271-0.144-2.252-0.431-2.943s-0.656-1.176-1.107-1.456s-0.991-0.42-1.62-0.42s-1.173,0.109-1.63,0.328
|
||||
c-0.459,0.219-0.872,0.632-1.241,1.241s-0.643,1.453-0.82,2.533h-3.876v-3.732c1.572-0.697,2.902-1.22,3.988-1.569
|
||||
c1.088-0.349,2.099-0.605,3.035-0.769s1.836-0.246,2.697-0.246c1.654,0,2.977,0.219,3.969,0.656
|
||||
c0.99,0.438,1.732,1.148,2.225,2.133s0.738,2.345,0.738,4.081v7.998c0,1.162,0.034,1.986,0.103,2.471s0.175,0.837,0.317,1.056
|
||||
c0.145,0.219,0.328,0.39,0.555,0.513c0.225,0.123,0.639,0.26,1.24,0.41v1.354h-7.629L375.868,62.098z M375.191,55.104
|
||||
c-2.119,0.055-3.688,0.451-4.707,1.189s-1.527,1.818-1.527,3.24c0,0.848,0.232,1.494,0.697,1.938s1.107,0.667,1.928,0.667
|
||||
c0.629,0,1.224-0.167,1.784-0.502s1.005-0.783,1.333-1.343s0.492-1.155,0.492-1.784V55.104z"/>
|
||||
<path d="M403.971,52.808l9.208,9.311l-2.051,2.051l-9.188-9.372l-9.475,9.29l-1.907-1.928l9.372-9.352L390.6,43.6l2.051-2.051
|
||||
l9.29,9.27l9.29-9.27l1.928,1.907L403.971,52.808z"/>
|
||||
<path fill="#E12828" d="M422.54,42.492c0-1.299-0.021-2.242-0.062-2.83s-0.127-1.042-0.256-1.364
|
||||
c-0.131-0.321-0.328-0.574-0.596-0.759c-0.266-0.185-0.734-0.345-1.404-0.482v-1.354l5.722-0.287h2.522v11.751l0.021,0.021
|
||||
c1.217-1.135,2.32-1.931,3.312-2.389s2.007-0.687,3.046-0.687c2.434,0,4.259,0.858,5.476,2.574s1.825,4.283,1.825,7.701
|
||||
c0,3.568-0.804,6.248-2.409,8.039c-1.607,1.791-3.982,2.687-7.127,2.687c-2.16,0-4.136-0.39-5.927-1.169l-1.518,1.169l-2.625-0.369
|
||||
V42.492z M428.466,58.058c0,1.682,0.29,2.922,0.871,3.722s1.48,1.2,2.697,1.2c1.258,0,2.218-0.66,2.881-1.979
|
||||
s0.995-3.203,0.995-5.65c0-2.693-0.294-4.703-0.882-6.029s-1.504-1.989-2.748-1.989c-0.602,0-1.196,0.157-1.784,0.472
|
||||
s-1.073,0.762-1.456,1.343s-0.574,1.22-0.574,1.917V58.058z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#2828FF" d="M74.339,166.769l-0.308-0.103c-1.121,1.094-2.212,1.887-3.271,2.379s-2.184,0.738-3.373,0.738
|
||||
c-1.75,0-3.138-0.461-4.163-1.384s-1.538-2.157-1.538-3.702c0-2.01,0.987-3.592,2.963-4.748s4.974-1.883,8.993-2.184v-1.948
|
||||
c0-1.271-0.144-2.252-0.431-2.943s-0.656-1.176-1.107-1.456s-0.991-0.42-1.62-0.42s-1.173,0.109-1.63,0.328
|
||||
c-0.459,0.219-0.872,0.632-1.241,1.241s-0.643,1.453-0.82,2.533h-3.876v-3.732c1.572-0.697,2.902-1.22,3.988-1.569
|
||||
c1.088-0.349,2.099-0.605,3.035-0.769s1.836-0.246,2.697-0.246c1.654,0,2.977,0.219,3.969,0.656
|
||||
c0.99,0.438,1.732,1.148,2.225,2.133s0.738,2.345,0.738,4.081v7.998c0,1.162,0.034,1.986,0.103,2.471s0.175,0.837,0.317,1.056
|
||||
c0.145,0.219,0.328,0.39,0.555,0.513c0.225,0.123,0.639,0.26,1.24,0.41v1.354h-7.629L74.339,166.769z M73.663,159.775
|
||||
c-2.119,0.055-3.688,0.451-4.707,1.189s-1.527,1.818-1.527,3.24c0,0.848,0.232,1.494,0.697,1.938s1.107,0.667,1.928,0.667
|
||||
c0.629,0,1.224-0.167,1.784-0.502s1.005-0.783,1.333-1.343s0.492-1.155,0.492-1.784V159.775z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#E12828" d="M93.716,283.163c0-1.299-0.021-2.242-0.062-2.83s-0.127-1.042-0.256-1.363
|
||||
c-0.131-0.321-0.328-0.574-0.596-0.759c-0.266-0.185-0.734-0.345-1.404-0.481v-1.354l5.722-0.287h2.522v11.75l0.021,0.021
|
||||
c1.217-1.135,2.32-1.932,3.312-2.39s2.007-0.687,3.046-0.687c2.434,0,4.259,0.857,5.476,2.573s1.825,4.282,1.825,7.7
|
||||
c0,3.568-0.804,6.248-2.409,8.039c-1.607,1.791-3.982,2.688-7.127,2.688c-2.16,0-4.136-0.391-5.927-1.17l-1.518,1.17l-2.625-0.369
|
||||
V283.163z M99.643,298.729c0,1.682,0.29,2.922,0.871,3.722s1.48,1.2,2.697,1.2c1.258,0,2.218-0.66,2.881-1.979
|
||||
s0.995-3.202,0.995-5.649c0-2.693-0.294-4.703-0.882-6.029s-1.504-1.99-2.748-1.99c-0.602,0-1.196,0.158-1.784,0.473
|
||||
s-1.073,0.762-1.456,1.343s-0.574,1.22-0.574,1.917V298.729z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 164 KiB |
@@ -69,11 +69,6 @@ footer img {
|
||||
table.versions td {
|
||||
text-align: center;
|
||||
background: white;
|
||||
}
|
||||
|
||||
table.versions .subversion {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
.circle {
|
||||
width: 0.8em;
|
||||
|
||||
@@ -9,43 +9,43 @@
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/m3x10.png" width=70 class="center"></td>
|
||||
<td>Screw M3x10</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/aluminium_40.png" width=100 class="center"></td>
|
||||
<td>Aluminium rack 40 mm</td>
|
||||
<td>Aluminium rack 40mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/m3x8.png" width=60 class="center"></td>
|
||||
<td>Screw M3x8</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/aluminium_20.png" width=70 class="center"></td>
|
||||
<td>Aluminium rack 15 mm</td>
|
||||
<td>Aluminium rack 15mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/m3x5.png" width=40 class="center"></td>
|
||||
<td>Screw M3x5</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/htp-40.png" width=100 class="center"></td>
|
||||
<td>Nylon rack 40 mm</td>
|
||||
<td>Nylon rack 40mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/m2x5.png" width=40 class="center"></td>
|
||||
<td>Screw M2x5</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/htp-30.png" width=80 class="center"></td>
|
||||
<td>Nylon rack 30 mm</td>
|
||||
<td>Nylon rack 30mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/nut_metal.png" width=25 class="center"></td>
|
||||
<td> Nut M3 (self-locking)</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/htp-20.png" width=70 class="center"></td>
|
||||
<td>Nylon rack 20 mm</td>
|
||||
<td>Nylon rack 20mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/nut_nylon.png" width=25 class="center"></td>
|
||||
<td> Nut M3 (nylon)</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/htp-15.png" width=60 class="center"></td>
|
||||
<td>Nylon rack 15 mm</td>
|
||||
<td>Nylon rack 15mm</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/dumper.png" width=50 class="center"></td>
|
||||
<td>Damper rack</td>
|
||||
<td><img src="../assets/assembling_clever4_2/type_size/hts-6.png" width=50 class="center"></td>
|
||||
<td> Nylon rack 6 mm</td>
|
||||
<td> Nylon rack 6mm</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
<img src="../assets/assembling_clever4_2/frame_7.png" width=300 class="zoom border center">
|
||||
|
||||
## Installing motors
|
||||
## Installating motors
|
||||
|
||||
1. When installing motors, pay attention to the rotation scheme of the motors. The rotation marking on the motors must match the rotation pattern.
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
|
||||
## Installing Flight Controller
|
||||
|
||||
Clover 4 drone kit allows you to install various flight controllers, for example [COEX Pix](coex_pix.md) and Pixracer.
|
||||
Set *Clover 4* allows you to install various flight controllers, for example *COEX Pix* and *Pixracer*.
|
||||
|
||||
> **Caution** During installation the flight controller, pay attention to the arrow located on the board, it should be directed to the copter bow.
|
||||
|
||||
@@ -120,7 +120,7 @@ Clover 4 drone kit allows you to install various flight controllers, for example
|
||||
|
||||
> **Hint** Before installing the damper struts, screw 2 layers of nylon nuts, for a stronger fix or bite off the excess thread using side cutters.
|
||||
|
||||
Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
Install the damper struts, fix *COEX Pix* on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/coex_pix.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -130,7 +130,7 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/pixracer_1.png" width=300 class="zoom border center">
|
||||
|
||||
2. Glue 3-4 layers of double-sided tape, glue it in the center of the small deck and install Pixracer on top.
|
||||
2. Glue 3-4 layers of double-sided tape, glue it in the center of the small deck and install *Pixracer* on top.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/pixracer_2.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -153,14 +153,14 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
## Installing Raspberry Pi
|
||||
|
||||
1. Install the 20 mm racks on the main deck, fix them with the M3x8 screws.
|
||||
1. Install the 20mm racks on the main deck, fix them with the M3x8 screws.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/assembling_clever4_2/fc_connection_5.png" width=300 class="zoom border">
|
||||
<img src="../assets/assembling_clever4_2/fc_connection_6.png" width=300 class="zoom border">
|
||||
</div>
|
||||
|
||||
2. On a mounting deck, install 6 mm racks and 30 mm racks, fasten them with the M3x5 and M3x12 bolts, respectively.
|
||||
2. On a mounting deck, install 6mm racks and 30mm racks, fasten them with the M3x5 and M3x12 bolts, respectively.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_1.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -168,7 +168,7 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_2.png" width=300 class="zoom border center">
|
||||
|
||||
4. Install the Raspberry Pi circuit board and fix with nylon nuts.
|
||||
4. Install the *Raspberry Pi* circuit board and fix with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_3.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -176,7 +176,7 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_5.png" width=300 class="zoom border center">
|
||||
|
||||
6. Install 4 20 mm racks and fix them with the M3x8 screws.
|
||||
6. Install 4 20mm racks and fix them with the M3x8 screws.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_6.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -192,11 +192,11 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_9.png" width=300 class="zoom border center">
|
||||
|
||||
10. Connect to the Raspberry Pi rangefinder and power cable.
|
||||
10. Connect to the *Raspberry Pi* rangefinder and power cable.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_10.png" width=300 class="zoom border center">
|
||||
|
||||
11. Connect the camera cable to Raspberry Pi.
|
||||
11. Connect the camera cable to *Raspberry Pi*.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/raspberry_11.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -226,7 +226,7 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/led_5.png" width=300 class="zoom border center">
|
||||
|
||||
7. Connect the signal output of the LED strip (white cable) to Raspberry Ri, to pin *GPIO21*.
|
||||
7. Connect the signal output of the LED strip (white cable) to *Raspberry Ri*, to pin *GPIO 21*.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/led_6.png" width=300 class="zoom border center">
|
||||
|
||||
@@ -250,7 +250,7 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
## Flight preparation
|
||||
|
||||
1. Install the battery strap and connect the flight controller to the Raspberry Pi using a USB cable.
|
||||
1. Install the battery strap and connect the flight controller to the *Raspberry Pi* using a USB cable.
|
||||
|
||||
<div class="image-group">
|
||||
<img src="../assets/assembling_clever4_2/final_1.png" width=300 class="zoom border">
|
||||
@@ -265,4 +265,4 @@ Install the damper struts, fix COEX Pix on them with nylon nuts.
|
||||
|
||||
<img src="../assets/assembling_clever4_2/final_4.png" width=300 class="zoom border center">
|
||||
|
||||
> **Success** The drone is assembled, then perform [setup](setup.md).
|
||||
> **Success** The drone is assembled, then make ["setup"](setup.md).
|
||||
|
||||
@@ -6,24 +6,22 @@ This section contains articles describing the assembly of each version of Clover
|
||||
<tr><th>Version</th><th>Image</th></tr>
|
||||
<tr>
|
||||
<td><a href="assemble_4_2.md">Clover 4.2</a></td>
|
||||
<td><a href="assemble_4_2.md"><img src="../assets/versions/clover_4.jpg" width=200></a></td>
|
||||
</tr>
|
||||
<!-- <tr>
|
||||
<td><a href="assemble_4_1.md">Clover 4.1</a></td>
|
||||
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
|
||||
</tr> -->
|
||||
<tr>
|
||||
<td><a href="assemble_4.md">Clover 4</a></td>
|
||||
<td><a href="assemble_4.md"><img src="../assets/versions/clover_4.jpg" width=200></a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="assemble_3.md">Clover 3</a></td>
|
||||
<td><a href="assemble_3.md"><img src="../assets/versions/clover_3.jpg" width=200></a></td>
|
||||
<td><a href="assemble_4_2.md">Clover 4.1</a></td>
|
||||
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="assemble_2.md">Clover 2</a></td>
|
||||
<td><a href="assemble_2.md"><img src="../assets/versions/clover_2.jpg" width=200></a></td>
|
||||
<td><a href="assemble_4_2.md">Clover 4</a></td>
|
||||
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="assemble_4_2.md">Clover 3</a></td>
|
||||
<td><img src="../assets/versions/clover_3.jpg" width=200></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="assemble_4_2.md">Clover 2</a></td>
|
||||
<td><img src="../assets/versions/clover_2.jpg" width=200></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
Links to Clover's parts CAD-models are available in the "[CAD-models](models.md)" article.
|
||||
|
||||