Compare commits

..

12 Commits

Author SHA1 Message Date
Oleg Kalachev
d383a1c858 Minor fix 2020-10-06 02:38:29 +03:00
Oleg Kalachev
d15eb7785e Merge branch 'master' into ros-book 2020-10-06 02:31:40 +03:00
Oleg Kalachev
bb9d8edb78 Merge branch 'master' into ros-book 2020-10-06 02:23:01 +03:00
Oleg Kalachev
852b854676 Add REP abbreviation expansion 2020-08-10 21:26:13 +03:00
Oleg Kalachev
72491ade0e Update docs/ru/ros.md
Co-authored-by: Alexey Rogachevskiy <sfalexrog@gmail.com>
2020-08-07 00:41:42 +03:00
Oleg Kalachev
f5ee72940c Add timeout for wait_for_message 2020-08-06 15:36:09 +03:00
Oleg Kalachev
b6cedecdf0 Add wait_for_message info 2020-08-06 15:33:55 +03:00
Oleg Kalachev
8b1dddce67 Move working with multiple machines to ROS advanced article 2020-08-05 23:04:41 +03:00
Oleg Kalachev
a89bc82f2b Merge branch 'master' into ros-book 2020-08-05 13:48:06 +03:00
Oleg Kalachev
156527641a Continue working on ROS book 2020-08-05 13:44:32 +03:00
Oleg Kalachev
4f9e4b1a28 Merge branch 'master' into ros-book 2020-08-05 11:21:05 +03:00
Oleg Kalachev
46f8f6eb89 docs: add ROS book draft 2020-05-10 12:09:43 +03:00
125 changed files with 403 additions and 123013 deletions

View File

@@ -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>

View File

@@ -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 -->

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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;

View File

@@ -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();

View File

@@ -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`

View File

@@ -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 });

Binary file not shown.

Before

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 549 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 472 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 574 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 164 KiB

View File

@@ -69,11 +69,6 @@ footer img {
table.versions td {
text-align: center;
background: white;
}
table.versions .subversion {
font-size: 80%;
}
.circle {
width: 0.8em;

View File

@@ -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).

View File

@@ -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&nbsp;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&nbsp;4.1</a></td>
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
</tr> -->
<tr>
<td><a href="assemble_4.md">Clover&nbsp;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&nbsp;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&nbsp;4.1</a></td>
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
</tr>
<tr>
<td><a href="assemble_2.md">Clover&nbsp;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&nbsp;4</a></td>
<td><img src="../assets/versions/clover_4.jpg" width=200></td>
</tr>
<tr>
<td><a href="assemble_4_2.md">Clover&nbsp;3</a></td>
<td><img src="../assets/versions/clover_3.jpg" width=200></td>
</tr>
<tr>
<td><a href="assemble_4_2.md">Clover&nbsp;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.

Some files were not shown because too many files have changed in this diff Show More