mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-03 16:39:31 +00:00
Compare commits
3 Commits
web-improv
...
reduce-siz
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cbc1a5881 | ||
|
|
814064c9a3 | ||
|
|
60fe4469c7 |
@@ -77,7 +77,6 @@ jobs:
|
|||||||
- sudo sh -c "echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections"
|
- sudo sh -c "echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections"
|
||||||
- sudo apt update && sudo apt install -y calibre msttcorefonts
|
- sudo apt update && sudo apt install -y calibre msttcorefonts
|
||||||
- npm install gitbook-cli -g
|
- npm install gitbook-cli -g
|
||||||
- gitbook fetch 3.2.3 && npm i npm@3.10.10 --prefix=~/.gitbook/versions/3.2.3/ # fixing https://travis-ci.org/github/CopterExpress/clover/jobs/766541125#L932
|
|
||||||
- npm install markdownlint-cli -g
|
- npm install markdownlint-cli -g
|
||||||
- npm install svgexport -g
|
- npm install svgexport -g
|
||||||
- gitbook -V
|
- gitbook -V
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ Clover drone is used on a wide range of educational events, including [Copter Ha
|
|||||||
Preconfigured image for Raspberry Pi with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clover/releases).
|
Preconfigured image for Raspberry Pi with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clover/releases).
|
||||||
|
|
||||||
[](https://travis-ci.org/CopterExpress/clover)
|
[](https://travis-ci.org/CopterExpress/clover)
|
||||||

|
|
||||||
|
|
||||||
Image features:
|
Image features:
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ generate_messages(
|
|||||||
|
|
||||||
## Generate dynamic reconfigure parameters in the 'cfg' folder
|
## Generate dynamic reconfigure parameters in the 'cfg' folder
|
||||||
generate_dynamic_reconfigure_options(
|
generate_dynamic_reconfigure_options(
|
||||||
cfg/Detector.cfg
|
cfg/DetectorParams.cfg
|
||||||
)
|
)
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
# Information: https://clover.coex.tech/en/simple_offboard.html#gettelemetry
|
|
||||||
|
|
||||||
import rospy
|
|
||||||
from clover import srv
|
|
||||||
|
|
||||||
rospy.init_node('flight')
|
|
||||||
|
|
||||||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
|
||||||
|
|
||||||
# Print drone's state
|
|
||||||
print(get_telemetry())
|
|
||||||
@@ -65,7 +65,7 @@ echo_stamp "#6 Turn on UART"
|
|||||||
# https://github.com/RPi-Distro/raspi-config/pull/75
|
# https://github.com/RPi-Distro/raspi-config/pull/75
|
||||||
/usr/bin/raspi-config nonint do_serial 1
|
/usr/bin/raspi-config nonint do_serial 1
|
||||||
/usr/bin/raspi-config nonint set_config_var enable_uart 1 /boot/config.txt
|
/usr/bin/raspi-config nonint set_config_var enable_uart 1 /boot/config.txt
|
||||||
echo dtoverlay=pi3-disable-bt >> /boot/config.txt
|
/usr/bin/raspi-config nonint set_config_var dtoverlay pi3-disable-bt /boot/config.txt
|
||||||
systemctl disable hciuart.service
|
systemctl disable hciuart.service
|
||||||
|
|
||||||
# After adding to Raspbian OS
|
# After adding to Raspbian OS
|
||||||
|
|||||||
@@ -76,11 +76,9 @@ my_travis_retry sudo -u pi rosdep update
|
|||||||
|
|
||||||
export ROS_IP='127.0.0.1' # needed for running tests
|
export ROS_IP='127.0.0.1' # needed for running tests
|
||||||
|
|
||||||
# echo_stamp "Reconfiguring Clover repository for simplier unshallowing" # TODO: bring back
|
echo_stamp "Reconfiguring Clover repository for simplier unshallowing"
|
||||||
# cd /home/pi/catkin_ws/src/clover
|
cd /home/pi/catkin_ws/src/clover
|
||||||
# git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
|
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
|
||||||
echo_stamp "Remove .git from Clover to reduce the size"
|
|
||||||
rm -rf /home/pi/catkin_ws/src/clover/.git # TODO: remove
|
|
||||||
|
|
||||||
echo_stamp "Build and install Clover"
|
echo_stamp "Build and install Clover"
|
||||||
cd /home/pi/catkin_ws
|
cd /home/pi/catkin_ws
|
||||||
@@ -101,9 +99,9 @@ rm -rf build # remove build artifacts
|
|||||||
echo_stamp "Build Clover documentation"
|
echo_stamp "Build Clover documentation"
|
||||||
cd /home/pi/catkin_ws/src/clover
|
cd /home/pi/catkin_ws/src/clover
|
||||||
NPM_CONFIG_UNSAFE_PERM=true npm install gitbook-cli -g
|
NPM_CONFIG_UNSAFE_PERM=true npm install gitbook-cli -g
|
||||||
NPM_CONFIG_UNSAFE_PERM=true gitbook fetch 3.2.3 && npm i npm@3.10.10 --prefix=~/.gitbook/versions/3.2.3/ # fixing https://travis-ci.org/github/CopterExpress/clover/jobs/766541125#L932
|
|
||||||
NPM_CONFIG_UNSAFE_PERM=true gitbook install
|
NPM_CONFIG_UNSAFE_PERM=true gitbook install
|
||||||
gitbook build
|
gitbook build
|
||||||
|
rm -rf _book/assets/ && ln -s ../docs/assets/ _book/assets # replace assets with a symlink to reduce image size
|
||||||
touch node_modules/CATKIN_IGNORE docs/CATKIN_IGNORE _book/CATKIN_IGNORE clover/www/CATKIN_IGNORE apps/CATKIN_IGNORE # ignore documentation files by catkin
|
touch node_modules/CATKIN_IGNORE docs/CATKIN_IGNORE _book/CATKIN_IGNORE clover/www/CATKIN_IGNORE apps/CATKIN_IGNORE # ignore documentation files by catkin
|
||||||
|
|
||||||
echo_stamp "Installing additional ROS packages"
|
echo_stamp "Installing additional ROS packages"
|
||||||
|
|||||||
@@ -95,7 +95,6 @@ lsof \
|
|||||||
git \
|
git \
|
||||||
dnsmasq \
|
dnsmasq \
|
||||||
tmux \
|
tmux \
|
||||||
tree \
|
|
||||||
vim \
|
vim \
|
||||||
libjpeg8 \
|
libjpeg8 \
|
||||||
tcpdump \
|
tcpdump \
|
||||||
@@ -149,7 +148,6 @@ my_travis_retry pip install --prefer-binary rpi_ws281x
|
|||||||
echo_stamp "Setup Monkey"
|
echo_stamp "Setup Monkey"
|
||||||
mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
|
mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
|
||||||
mv /root/monkey /etc/monkey/sites/default
|
mv /root/monkey /etc/monkey/sites/default
|
||||||
sed -i 's/SymLink Off/SymLink On/' /etc/monkey/monkey.conf
|
|
||||||
systemctl enable monkey.service
|
systemctl enable monkey.service
|
||||||
|
|
||||||
echo_stamp "Install Node.js"
|
echo_stamp "Install Node.js"
|
||||||
|
|||||||
@@ -41,6 +41,3 @@ pip install --upgrade pytest
|
|||||||
cd /root/catkin_ws
|
cd /root/catkin_ws
|
||||||
source devel/setup.bash
|
source devel/setup.bash
|
||||||
catkin_make run_tests && catkin_test_results
|
catkin_make run_tests && catkin_test_results
|
||||||
|
|
||||||
# Step 5: Install packages
|
|
||||||
catkin_make install
|
|
||||||
|
|||||||
@@ -43,8 +43,6 @@ rosversion aruco_pose
|
|||||||
rosversion vl53l1x
|
rosversion vl53l1x
|
||||||
rosversion mavros
|
rosversion mavros
|
||||||
rosversion mavros_extras
|
rosversion mavros_extras
|
||||||
rosversion ws281x
|
|
||||||
rosversion led_msgs
|
|
||||||
rosversion dynamic_reconfigure
|
rosversion dynamic_reconfigure
|
||||||
rosversion tf2_web_republisher
|
rosversion tf2_web_republisher
|
||||||
rosversion compressed_image_transport
|
rosversion compressed_image_transport
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
<arg name="rangefinder_vl53l1x" default="true"/>
|
<arg name="rangefinder_vl53l1x" default="true"/>
|
||||||
<arg name="led" default="true"/>
|
<arg name="led" default="true"/>
|
||||||
<arg name="blocks" default="false"/>
|
<arg name="blocks" default="false"/>
|
||||||
<arg name="rc" default="false"/>
|
<arg name="rc" default="true"/>
|
||||||
|
<arg name="shell" default="true"/>
|
||||||
|
|
||||||
<arg name="simulator" default="false"/> <!-- flag that we are operating on a simulated drone -->
|
<arg name="simulator" default="false"/> <!-- flag that we are operating on a simulated drone -->
|
||||||
|
|
||||||
@@ -90,6 +91,9 @@
|
|||||||
<param name="use_fake_gcs" value="false"/>
|
<param name="use_fake_gcs" value="false"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
|
<!-- Shell access through ROS service -->
|
||||||
|
<node name="shell" pkg="clover" type="shell" output="screen" if="$(arg shell)"/>
|
||||||
|
|
||||||
<!-- Update static directory -->
|
<!-- Update static directory -->
|
||||||
<node pkg="roswww_static" name="roswww_static" type="main.py" clear_params="true">
|
<node pkg="roswww_static" name="roswww_static" type="main.py" clear_params="true">
|
||||||
<param name="default_package" value="clover"/>
|
<param name="default_package" value="clover"/>
|
||||||
|
|||||||
@@ -6,16 +6,13 @@
|
|||||||
<arg name="viz" default="true"/>
|
<arg name="viz" default="true"/>
|
||||||
<arg name="respawn" default="true"/>
|
<arg name="respawn" default="true"/>
|
||||||
<arg name="distance_sensor_remap" default="rangefinder/range"/>
|
<arg name="distance_sensor_remap" default="rangefinder/range"/>
|
||||||
<arg name="usb_device" default="/dev/px4fmu"/>
|
|
||||||
<arg name="prefix" default="" unless="$(eval fcu_conn == 'usb')"/>
|
|
||||||
<arg name="prefix" default="rosrun clover waitfile $(arg usb_device)" if="$(eval fcu_conn == 'usb')"/>
|
|
||||||
|
|
||||||
<node pkg="mavros" type="mavros_node" name="mavros" launch-prefix="$(arg prefix)" required="false" clear_params="true" respawn="$(arg respawn)" unless="$(eval fcu_conn == 'none')" respawn_delay="1" output="screen">
|
<node pkg="mavros" type="mavros_node" name="mavros" required="false" clear_params="true" respawn="$(arg respawn)" unless="$(eval fcu_conn == 'none')" respawn_delay="1" output="screen">
|
||||||
<!-- UART connection -->
|
<!-- UART connection -->
|
||||||
<param name="fcu_url" value="/dev/ttyAMA0:921600" if="$(eval fcu_conn is None or fcu_conn == 'uart')"/>
|
<param name="fcu_url" value="/dev/ttyAMA0:921600" if="$(eval fcu_conn is None or fcu_conn == 'uart')"/>
|
||||||
|
|
||||||
<!-- USB connection -->
|
<!-- USB connection -->
|
||||||
<param name="fcu_url" value="$(arg usb_device)" if="$(eval fcu_conn == 'usb')"/>
|
<param name="fcu_url" value="/dev/px4fmu" if="$(eval fcu_conn == 'usb')"/>
|
||||||
|
|
||||||
<!-- sitl before PX4 1.9.0 -->
|
<!-- sitl before PX4 1.9.0 -->
|
||||||
<param name="fcu_url" value="udp://@$(arg fcu_ip):14557" if="$(eval fcu_conn == 'udp')"/>
|
<param name="fcu_url" value="udp://@$(arg fcu_ip):14557" if="$(eval fcu_conn == 'udp')"/>
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ private:
|
|||||||
} catch (const tf2::TransformException& e) {
|
} catch (const tf2::TransformException& e) {
|
||||||
// Invalidate previous frame
|
// Invalidate previous frame
|
||||||
prev_.release();
|
prev_.release();
|
||||||
goto publish_debug;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,10 +218,6 @@ private:
|
|||||||
flow_.quality = (uint8_t)(response * 255);
|
flow_.quality = (uint8_t)(response * 255);
|
||||||
flow_pub_.publish(flow_);
|
flow_pub_.publish(flow_);
|
||||||
|
|
||||||
prev_ = curr_.clone();
|
|
||||||
prev_stamp_ = msg->header.stamp;
|
|
||||||
|
|
||||||
publish_debug:
|
|
||||||
// Publish debug image
|
// Publish debug image
|
||||||
if (img_pub_.getNumSubscribers() > 0) {
|
if (img_pub_.getNumSubscribers() > 0) {
|
||||||
// publish debug image
|
// publish debug image
|
||||||
@@ -238,9 +234,12 @@ publish_debug:
|
|||||||
static geometry_msgs::TwistStamped velo;
|
static geometry_msgs::TwistStamped velo;
|
||||||
velo.header.stamp = msg->header.stamp;
|
velo.header.stamp = msg->header.stamp;
|
||||||
velo.header.frame_id = fcu_frame_id_;
|
velo.header.frame_id = fcu_frame_id_;
|
||||||
velo.twist.angular.x = flow_fcu.vector.x / integration_time.toSec();
|
velo.twist.angular.x = flow_.integrated_x / integration_time.toSec();
|
||||||
velo.twist.angular.y = flow_fcu.vector.y / integration_time.toSec();
|
velo.twist.angular.y = flow_.integrated_y / integration_time.toSec();
|
||||||
velo_pub_.publish(velo);
|
velo_pub_.publish(velo);
|
||||||
|
|
||||||
|
prev_ = curr_.clone();
|
||||||
|
prev_stamp_ = msg->header.stamp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# $ ./waitfile <file> <command> <args...>
|
|
||||||
# wait until <file> appears and then invoke <command> with <args>
|
|
||||||
|
|
||||||
echo "wait for file $1"
|
|
||||||
while [ ! -e "$1" ]; do sleep 1; done;
|
|
||||||
echo "file $1 appeared"
|
|
||||||
"${@:2}"
|
|
||||||
@@ -28,3 +28,19 @@ def test_simple_offboard_services_available():
|
|||||||
def test_web_video_server(node):
|
def test_web_video_server(node):
|
||||||
import urllib2
|
import urllib2
|
||||||
urllib2.urlopen("http://localhost:8080").read()
|
urllib2.urlopen("http://localhost:8080").read()
|
||||||
|
|
||||||
|
def test_shell(node):
|
||||||
|
execute = rospy.ServiceProxy('exec', srv.Execute)
|
||||||
|
execute.wait_for_service(5)
|
||||||
|
|
||||||
|
res = execute(cmd='echo foo')
|
||||||
|
assert res.code == 0
|
||||||
|
assert res.output == 'foo\n'
|
||||||
|
|
||||||
|
res = execute(cmd='foo')
|
||||||
|
assert res.code == 32512
|
||||||
|
assert res.output == ''
|
||||||
|
|
||||||
|
res = execute(cmd='ls foo')
|
||||||
|
assert res.code == 512
|
||||||
|
assert res.output == ''
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
/tmp/clover.err
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
/etc/clover_version
|
|
||||||
@@ -1,35 +1,27 @@
|
|||||||
<style>
|
|
||||||
body { font-family: sans-serif; }
|
|
||||||
main { max-width: 600px; margin: 50px auto; }
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<title>Clover Drone Kit Tools</title>
|
<title>Clover Drone Kit Tools</title>
|
||||||
|
|
||||||
<main>
|
<h1>Clover Drone Kit Tools</h1>
|
||||||
<h1>Clover Drone Kit Tools</h1>
|
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="docs">View documentation</a> (snapshot of <a href="https://clover.coex.tech">clover.coex.tech</a>)</li>
|
<li><a href="docs">View documentation</a> (snapshot of <a href="https://clover.coex.tech">clover.coex.tech</a>)</li>
|
||||||
<li><a href="" id="wvs">View image topics</a> (<code>web_video_server</code>)</li>
|
<li><a href="" id="wvs">View image topics</a> (<code>web_video_server</code>)</li>
|
||||||
<li><a href="" id="butterfly">Open web terminal</a> (<code>Butterfly</code>)</li>
|
<li><a href="" id="butterfly">Open web terminal</a> (<code>Butterfly</code>)</li>
|
||||||
<li><a href="viz.html">View 3D visualization</a> (<code>ros3djs</code>)</li>
|
<li><a href="viz.html">View 3D visualization</a> (<code>ros3djs</code>)</li>
|
||||||
<li><a href="aruco_map.html">3D visualization for markers map</a> (<code>ros3djs</code>)</li>
|
<li><a href="aruco_map.html">3D visualization for markers map</a> (<code>ros3djs</code>)</li>
|
||||||
<li><a href="../clover_blocks/">Blocks programming</a> (<code>Blockly</code>)</li>
|
<li><a href="../clover_blocks/">Blocks programming</a> (<code>Blockly</code>)</li>
|
||||||
<li><a href="clover.err">Clover console</a> (<code>/tmp/clover.err</code>)</li>
|
</ul>
|
||||||
</ul>
|
|
||||||
|
|
||||||
<div class="version"></div>
|
<div class="version"></div>
|
||||||
</main>
|
|
||||||
|
|
||||||
|
<script src="js/roslib.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
document.querySelector("#wvs").href = location.protocol + '//' + location.hostname + ':8080';
|
document.querySelector("#wvs").href = location.protocol + '//' + location.hostname + ':8080';
|
||||||
document.querySelector("#butterfly").href = location.protocol + '//' + location.hostname + ':57575';
|
document.querySelector("#butterfly").href = location.protocol + '//' + location.hostname + ':57575';
|
||||||
|
|
||||||
// Determine image version
|
// Determine image version
|
||||||
fetch('clover_version').then(function(response) {
|
var ros = new ROSLIB.Ros({ url: 'ws://' + location.hostname + ':9090' });
|
||||||
if (response.status !== 200) return;
|
var exec = new ROSLIB.Service({ ros: ros, name : '/exec', serviceType : 'clover/Execute' });
|
||||||
response.text().then(function(text) {
|
exec.callService(new ROSLIB.ServiceRequest({ cmd: 'cat /etc/clover_version' }), function(result) {
|
||||||
document.querySelector('.version').innerHTML = 'Version: <code>' + text + '</code>';
|
document.querySelector('.version').innerHTML = 'Version: ' + result.output;
|
||||||
});
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -11,8 +11,7 @@
|
|||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
import os, sys
|
import os
|
||||||
import traceback
|
|
||||||
import threading
|
import threading
|
||||||
import re
|
import re
|
||||||
import uuid
|
import uuid
|
||||||
@@ -117,12 +116,7 @@ def run(req):
|
|||||||
rospy.loginfo('Program forced to stop')
|
rospy.loginfo('Program forced to stop')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
rospy.logerr(str(e))
|
rospy.logerr(str(e))
|
||||||
traceback.print_exc()
|
error_pub.publish(str(e))
|
||||||
etype, value, tb = sys.exc_info()
|
|
||||||
fmt = traceback.format_exception(etype, value, tb)
|
|
||||||
fmt.pop(1) # remove 'clover_blocks' file frame
|
|
||||||
exc_info = ''.join(fmt)
|
|
||||||
error_pub.publish(str(e) + '\n\n' + exc_info)
|
|
||||||
|
|
||||||
rospy.loginfo('Program terminated')
|
rospy.loginfo('Program terminated')
|
||||||
running_lock.release()
|
running_lock.release()
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ target_compile_options(throttling_camera PRIVATE -std=c++11)
|
|||||||
add_dependencies(throttling_camera ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
add_dependencies(throttling_camera ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
|
||||||
|
|
||||||
install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
||||||
install(DIRECTORY models DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
install(DIRECTORY meshes DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
||||||
install(DIRECTORY resources DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
install(DIRECTORY resources DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
|
||||||
|
|
||||||
catkin_install_python(PROGRAMS scripts/aruco_gen
|
catkin_install_python(PROGRAMS scripts/aruco_gen
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 415 KiB |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 8.7 KiB |
@@ -1,6 +1,6 @@
|
|||||||
# CopterHack 2021
|
# CopterHack 2021
|
||||||
|
|
||||||
CopterHack 2021 is a team competition for the development of open source projects for the Clover quadcopter platform. Fifty-four teams from 12 countries took part in the competition.
|
CopterHack 2021 is a team competition for the development of open source projects for the Clover quadcopter platform.
|
||||||
|
|
||||||
All information about the event can be found on the official website: https://coex.tech/copterhack.
|
All information about the event can be found on the official website: https://coex.tech/copterhack.
|
||||||
|
|
||||||
|
|||||||
@@ -96,16 +96,6 @@ This page contains models and drawings of some of the drone parts. They can be u
|
|||||||
</td>
|
</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>
|
<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>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td><img src="../assets/dxf/4.2/grip_spacer.png"></td>
|
|
||||||
<td>
|
|
||||||
<b>Grip spacer</b>.<br>
|
|
||||||
Function: spacer for the gripper plates.<br>
|
|
||||||
Material: monolithic polycarbonate 2mm.<br>
|
|
||||||
Quantity: 1 pcs.
|
|
||||||
</td>
|
|
||||||
<td><a href="https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/4.2/grip_spacer.dxf"><code>grip_spacer.dxf</code></a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Clover 4
|
## Clover 4
|
||||||
|
|||||||
@@ -34,15 +34,7 @@ Read more in the [GPS connection](gps.md) article.
|
|||||||
|
|
||||||
> **Info** For studying Python programming language, see [tutorial](https://www.learnpython.org/en/Welcome).
|
> **Info** For studying Python programming language, see [tutorial](https://www.learnpython.org/en/Welcome).
|
||||||
|
|
||||||
After you've configured your positioning system, you can start writing programs for autonomous flights. Use the [SSH connection to the Raspberry Pi](ssh.md) to run your scripts.
|
After you've configured your positioning system, you can start writing programs for autonomous flights. Use the [SSH connection to the Raspberry Pi](ssh.md) to run your scripts. In order to run a Python script use the `python` command:
|
||||||
|
|
||||||
Before the first flight it's recommended to check the Clover's configuration with [selfcheck.py utility](selfcheck.md):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rosrun clover selfcheck.py
|
|
||||||
```
|
|
||||||
|
|
||||||
In order to run a Python script use the `python` command:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python flight.py
|
python flight.py
|
||||||
|
|||||||
@@ -359,28 +359,3 @@ calibrate_gyro()
|
|||||||
```
|
```
|
||||||
|
|
||||||
> **Note** In process of calibration the drone should not be moved.
|
> **Note** In process of calibration the drone should not be moved.
|
||||||
|
|
||||||
<!-- markdownlint-disable MD044 -->
|
|
||||||
|
|
||||||
### # {#aruco-detect-enabled}
|
|
||||||
|
|
||||||
<!-- markdownlint-enable MD044 -->
|
|
||||||
|
|
||||||
Enable and disable [ArUco markers recognition](aruco_marker.md) dynamically (for example, for saving CPU resources):
|
|
||||||
|
|
||||||
```python
|
|
||||||
import rospy
|
|
||||||
import dynamic_reconfigure.client
|
|
||||||
|
|
||||||
# ...
|
|
||||||
|
|
||||||
client = dynamic_reconfigure.client.Client('aruco_detect')
|
|
||||||
|
|
||||||
# Turn markers recognition off
|
|
||||||
client.update_configuration({'enabled': False})
|
|
||||||
|
|
||||||
rospy.sleep(5)
|
|
||||||
|
|
||||||
# Turn markers recognition on
|
|
||||||
client.update_configuration({'enabled': True})
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# CopterHack 2021
|
# CopterHack 2021
|
||||||
|
|
||||||
CopterHack 2021 – это командный конкурс по разработке проектов с открытым исходным кодом для платформы квадрокоптера "Клевер". В конкурсе приняло участие 54 команды из 12 стран.
|
CopterHack 2021 – это командный конкурс по разработке проектов с открытым исходным кодом для платформы квадрокоптера "Клевер".
|
||||||
|
|
||||||
Все информацию о мероприятии смотрите на официальном сайте: https://ru.coex.tech/copterhack.
|
Все информацию о мероприятии смотрите на официальном сайте: https://ru.coex.tech/copterhack.
|
||||||
|
|
||||||
|
|||||||
@@ -96,16 +96,6 @@
|
|||||||
</td>
|
</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>
|
<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>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td><img src="../assets/dxf/4.2/grip_spacer.png"></td>
|
|
||||||
<td>
|
|
||||||
<b>Проставка для захвата</b>.<br>
|
|
||||||
Функция: Опорный элемент для механического захвата.<br>
|
|
||||||
Материал: Монолитный поликарбонат 2мм.<br>
|
|
||||||
Количество: 1 шт.
|
|
||||||
</td>
|
|
||||||
<td><a href="https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/4.2/grip_spacer.dxf"><code>grip_spacer.dxf</code></a></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Клевер 4
|
## Клевер 4
|
||||||
|
|||||||
@@ -32,17 +32,9 @@
|
|||||||
|
|
||||||
## Автономный полет {#flight}
|
## Автономный полет {#flight}
|
||||||
|
|
||||||
> **Info** Для изучения языка программирования Python вы можете обратиться к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
> **Info** Для изучения языка программирования Python обращайтесь к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
||||||
|
|
||||||
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md).
|
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md). Для того, чтобы запустить Python-скрипт, используйте команду `python`:
|
||||||
|
|
||||||
Перед первым полетом рекомендуется проверить конфигурацию Клевера при помощи [утилиты selfcheck.py](selfcheck.md):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
rosrun clover selfcheck.py
|
|
||||||
```
|
|
||||||
|
|
||||||
Для того, чтобы запустить Python-скрипт, используйте команду `python`:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python flight.py
|
python flight.py
|
||||||
|
|||||||
@@ -377,28 +377,3 @@ calibrate_gyro()
|
|||||||
```
|
```
|
||||||
|
|
||||||
> **Note** В процессе калибровки гироскопов дрон нельзя двигать.
|
> **Note** В процессе калибровки гироскопов дрон нельзя двигать.
|
||||||
|
|
||||||
<!-- markdownlint-disable MD044 -->
|
|
||||||
|
|
||||||
### # {#aruco-detect-enabled}
|
|
||||||
|
|
||||||
<!-- markdownlint-enable MD044 -->
|
|
||||||
|
|
||||||
Динамически включать и отключать [распознавание ArUco-маркеров](aruco_marker.md) (например, для экономии ресурсов процессора):
|
|
||||||
|
|
||||||
```python
|
|
||||||
import rospy
|
|
||||||
import dynamic_reconfigure.client
|
|
||||||
|
|
||||||
# ...
|
|
||||||
|
|
||||||
client = dynamic_reconfigure.client.Client('aruco_detect')
|
|
||||||
|
|
||||||
# Turn markers recognition off
|
|
||||||
client.update_configuration({'enabled': False})
|
|
||||||
|
|
||||||
rospy.sleep(5)
|
|
||||||
|
|
||||||
# Turn markers recognition on
|
|
||||||
client.update_configuration({'enabled': True})
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -49,8 +49,7 @@
|
|||||||
|
|
||||||
{ "from": "modes/", "to": "ru/modes.html" },
|
{ "from": "modes/", "to": "ru/modes.html" },
|
||||||
{ "from": "firmware/", "to": "en/firmware.html" },
|
{ "from": "firmware/", "to": "en/firmware.html" },
|
||||||
{ "from": "simple_offboard/", "to": "en/simple_offboard.html" },
|
{ "from": "simple_offboard/", "to": "ru/simple_offboard.html" },
|
||||||
{ "from": "offboard/", "to": "en/simple_offboard.html" },
|
|
||||||
{ "from": "camera/", "to": "ru/camera.html" },
|
{ "from": "camera/", "to": "ru/camera.html" },
|
||||||
{ "from": "snippets/", "to": "ru/snippets.html" },
|
{ "from": "snippets/", "to": "ru/snippets.html" },
|
||||||
{ "from": "optical_flow/", "to": "ru/optical_flow.html" },
|
{ "from": "optical_flow/", "to": "ru/optical_flow.html" },
|
||||||
@@ -62,7 +61,6 @@
|
|||||||
{ "from": "camera_setup/", "to": "en/camera_setup.html" },
|
{ "from": "camera_setup/", "to": "en/camera_setup.html" },
|
||||||
{ "from": "power/", "to": "en/power.html" },
|
{ "from": "power/", "to": "en/power.html" },
|
||||||
{ "from": "connection/", "to": "en/connection.html" },
|
{ "from": "connection/", "to": "en/connection.html" },
|
||||||
{ "from": "clover_vm/", "to": "en/simulation_vm.html" },
|
|
||||||
|
|
||||||
{ "from": "ru/microsd_images.html", "to": "image.html" },
|
{ "from": "ru/microsd_images.html", "to": "image.html" },
|
||||||
{ "from": "en/microsd_images.html", "to": "image.html" }
|
{ "from": "en/microsd_images.html", "to": "image.html" }
|
||||||
|
|||||||
Reference in New Issue
Block a user