mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-01 07:29:32 +00:00
Compare commits
18 Commits
test_resul
...
v0.23-rc.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3ac99fbef | ||
|
|
ae9a5154ab | ||
|
|
1878e467ac | ||
|
|
75b63ad77d | ||
|
|
140535b0b4 | ||
|
|
2a8c85144e | ||
|
|
65bc74b5ec | ||
|
|
ac4f16f973 | ||
|
|
baf8b736d4 | ||
|
|
bb318ce93f | ||
|
|
d7b6968fee | ||
|
|
08f6aa7aee | ||
|
|
d5e729c66c | ||
|
|
27c83d062c | ||
|
|
04bc9fb017 | ||
|
|
b2928dd536 | ||
|
|
2a4163cbeb | ||
|
|
d1edc95ab5 |
14
.github/workflows/build.yml
vendored
14
.github/workflows/build.yml
vendored
@@ -7,13 +7,13 @@ on:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
# melodic:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - uses: actions/checkout@v2
|
||||
# - name: Native Melodic build
|
||||
# run: |
|
||||
# docker run --rm -v $(pwd):/root/catkin_ws/src/clover ros:melodic-ros-base /root/catkin_ws/src/clover/builder/standalone-install.sh
|
||||
melodic:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Native Melodic build
|
||||
run: |
|
||||
docker run --rm -v $(pwd):/root/catkin_ws/src/clover ros:melodic-ros-base /root/catkin_ws/src/clover/builder/standalone-install.sh
|
||||
noetic:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
4
.github/workflows/docs.yml
vendored
4
.github/workflows/docs.yml
vendored
@@ -10,10 +10,6 @@ jobs:
|
||||
docs:
|
||||
runs-on: ubuntu-18.04
|
||||
steps:
|
||||
- name: Cancel previous runs
|
||||
uses: styfle/cancel-workflow-action@0.9.1
|
||||
with:
|
||||
access_token: ${{ github.token }}
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format="2">
|
||||
<name>aruco_pose</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>Positioning with ArUco markers</description>
|
||||
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
|
||||
@@ -30,7 +30,7 @@ Options:
|
||||
-o <filename> Output map file name in the 'map' subdirectory of aruco_pose package
|
||||
|
||||
Example:
|
||||
rosrun aruco_pose genmap.py 0.33 2 4 1 1 0 -o test_map.txt
|
||||
rosrun aruco_pose genmap.py 0.33 2 4 1 1 0 > $(catkin_find aruco_pose map)/test_map.txt
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
@@ -9,10 +9,10 @@ def node():
|
||||
return rospy.init_node('aruco_pose_opencv_crash', anonymous=True)
|
||||
|
||||
def test_opencv_crashes_img01(node):
|
||||
rospy.wait_for_message('aruco_detect_01/visualization', VisMarkerArray, timeout=20)
|
||||
rospy.wait_for_message('aruco_detect_01/visualization', VisMarkerArray, timeout=5)
|
||||
|
||||
def test_opencv_crashes_img02(node):
|
||||
rospy.wait_for_message('aruco_detect_02/visualization', VisMarkerArray, timeout=20)
|
||||
rospy.wait_for_message('aruco_detect_02/visualization', VisMarkerArray, timeout=5)
|
||||
|
||||
def test_opencv_crashes_img03(node):
|
||||
rospy.wait_for_message('aruco_detect_03/visualization', VisMarkerArray, timeout=20)
|
||||
rospy.wait_for_message('aruco_detect_03/visualization', VisMarkerArray, timeout=5)
|
||||
|
||||
@@ -90,7 +90,7 @@ echo_stamp "Installing OpenCV 4.2-compatible ROS packages"
|
||||
apt install -y --no-install-recommends \
|
||||
ros-${ROS_DISTRO}-compressed-image-transport=1.14.0-0buster \
|
||||
ros-${ROS_DISTRO}-cv-bridge=1.15.0-0buster \
|
||||
ros-${ROS_DISTRO}-cv-camera=0.5.1-0buster \
|
||||
ros-${ROS_DISTRO}-cv-camera=0.5.0-0buster \
|
||||
ros-${ROS_DISTRO}-image-publisher=1.15.3-0buster \
|
||||
ros-${ROS_DISTRO}-web-video-server=0.2.1-0buster
|
||||
apt-mark hold \
|
||||
@@ -146,7 +146,7 @@ echo_stamp "Install GeographicLib datasets (needed for mavros)" \
|
||||
echo_stamp "Running tests"
|
||||
cd /home/pi/catkin_ws
|
||||
# FIXME: Investigate failing tests
|
||||
catkin_make run_tests && catkin_test_results
|
||||
catkin_make run_tests #&& catkin_test_results
|
||||
|
||||
echo_stamp "Change permissions for catkin_ws"
|
||||
chown -Rf pi:pi /home/pi/catkin_ws
|
||||
|
||||
@@ -138,7 +138,6 @@ echo_stamp "Install and enable Butterfly (web terminal)"
|
||||
echo_stamp "Workaround for tornado >= 6.0 breaking butterfly"
|
||||
export CRYPTOGRAPHY_DONT_BUILD_RUST=1
|
||||
my_travis_retry pip3 install cryptography==3.4.6 # https://stackoverflow.com/a/68472128/6850197
|
||||
my_travis_retry pip3 install pyOpenSSL==20.0.1
|
||||
my_travis_retry pip3 install tornado==5.1.1
|
||||
my_travis_retry pip3 install butterfly
|
||||
my_travis_retry pip3 install butterfly[systemd]
|
||||
|
||||
@@ -58,9 +58,5 @@ rosversion rosshow
|
||||
rosversion nodelet
|
||||
rosversion image_view
|
||||
|
||||
# validate some versions
|
||||
[[ $(rosversion cv_camera) == "0.5.1" ]] # patched version with init fix
|
||||
[[ $(rosversion ws281x) == "0.0.12" ]]
|
||||
|
||||
# validate examples are present
|
||||
[[ $(ls /home/pi/examples/*) ]]
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
|
||||
<!-- simplified offboard control -->
|
||||
<node name="simple_offboard" pkg="clover" type="simple_offboard" output="screen" clear_params="true">
|
||||
<param name="reference_frames/body" value="map"/>
|
||||
<param name="reference_frames/base_link" value="map"/>
|
||||
<param name="reference_frames/navigate_target" value="map"/>
|
||||
<param name="reference_frames/main_camera_optical" value="map"/>
|
||||
</node>
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<rosparam command="load" file="$(find clover)/launch/mavros_config.yaml"/>
|
||||
|
||||
<!-- remap rangefinder -->
|
||||
<remap from="mavros/distance_sensor/rangefinder_sub" to="$(arg distance_sensor_remap)" if="$(eval bool(distance_sensor_remap))"/>
|
||||
<remap from="mavros/distance_sensor/rangefinder_sub" to="rangefinder/range"/>
|
||||
|
||||
<rosparam param="plugin_whitelist">
|
||||
- altitude
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Config file for mavros
|
||||
# Based on https://raw.githubusercontent.com/mavlink/mavros/master/mavros/launch/px4_config.yaml
|
||||
|
||||
startup_px4_usb_quirk: false
|
||||
startup_px4_usb_quirk: true
|
||||
|
||||
conn:
|
||||
heartbeat_rate: 1.0 # send heartbeat rate in Hertz
|
||||
timeout: 10.0 # heartbeat timeout in seconds
|
||||
heartbeat_rate: 1.0 # send hertbeat rate in Hertz
|
||||
timeout: 10.0 # hertbeat timeout in seconds
|
||||
timesync_rate: 10.0 # TIMESYNC rate in Hertz (feature disabled if 0.0)
|
||||
system_time_rate: 1.0 # send system time to FCU rate in Hertz (disabled if 0.0)
|
||||
|
||||
@@ -78,9 +78,6 @@ distance_sensor:
|
||||
field_of_view: 0.5
|
||||
rangefinder_sub:
|
||||
subscriber: true
|
||||
id: 1
|
||||
orientation: PITCH_270
|
||||
covariance: 1 # cm
|
||||
|
||||
# fake_gps
|
||||
fake_gps:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format="3">
|
||||
<name>clover</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>The Clover package</description>
|
||||
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
|
||||
@@ -201,18 +201,13 @@ def check_fcu():
|
||||
if version_str == '':
|
||||
info('no version data available from SITL')
|
||||
|
||||
r = re.compile(r'^FW (git tag|version): (v?\d\.\d\.\d.*)$')
|
||||
is_clover_firmware = False
|
||||
for ver_line in version_str.split('\n'):
|
||||
match = r.search(ver_line)
|
||||
if match is not None:
|
||||
field, version = match.groups()
|
||||
info('firmware %s: %s' % (field, version))
|
||||
if 'clover' in version or 'clever' in version:
|
||||
is_clover_firmware = True
|
||||
|
||||
if not is_clover_firmware:
|
||||
failure('not running Clover PX4 firmware, https://clover.coex.tech/firmware')
|
||||
for line in version_str.split('\n'):
|
||||
if line.startswith('FW version: '):
|
||||
info(line[len('FW version: '):])
|
||||
elif line.startswith('FW git tag: '):
|
||||
info(line[len('FW git tag: '):])
|
||||
elif line.startswith('HW arch: '):
|
||||
info(line[len('HW arch: '):])
|
||||
|
||||
est = get_param('SYS_MC_EST_GROUP')
|
||||
if est == 1:
|
||||
@@ -485,12 +480,6 @@ def check_local_position():
|
||||
failure('roll is %.2f deg; place copter horizontally or redo level horizon calib',
|
||||
math.degrees(roll))
|
||||
|
||||
if not tf_buffer.can_transform('base_link', pose.header.frame_id, rospy.get_rostime(), rospy.Duration(0.5)):
|
||||
failure('can\'t transform from %s to base_link (timeout 0.5 s): is TF enabled?', pose.header.frame_id)
|
||||
|
||||
if not tf_buffer.can_transform('body', pose.header.frame_id, rospy.get_rostime(), rospy.Duration(0.5)):
|
||||
failure('can\'t transform from %s to body (timeout 0.5 s)', pose.header.frame_id)
|
||||
|
||||
except rospy.ROSException:
|
||||
failure('no local position')
|
||||
|
||||
@@ -620,7 +609,7 @@ def check_boot_duration():
|
||||
output = subprocess.check_output('systemd-analyze').decode()
|
||||
r = re.compile(r'([\d\.]+)s\s*$', flags=re.MULTILINE)
|
||||
duration = float(r.search(output).groups()[0])
|
||||
if duration > 20:
|
||||
if duration > 15:
|
||||
failure('long Raspbian boot duration: %ss (systemd-analyze for analyzing)', duration)
|
||||
|
||||
|
||||
@@ -740,14 +729,6 @@ def check_network():
|
||||
|
||||
@check('RPi health')
|
||||
def check_rpi_health():
|
||||
try:
|
||||
import shutil
|
||||
total, used, free = shutil.disk_usage('/')
|
||||
if free < 1024 * 1024 * 1024:
|
||||
failure('disk space is less than 1 GB; consider removing logs (~/.ros/log/)')
|
||||
except Exception as e:
|
||||
info('could not check the disk free space: %s', str(e))
|
||||
|
||||
# `vcgencmd get_throttled` output codes taken from
|
||||
# https://github.com/raspberrypi/documentation/blob/JamesH65-patch-vcgencmd-vcdbg-docs/raspbian/applications/vcgencmd.md#get_throttled
|
||||
# TODO: support more base platforms?
|
||||
|
||||
@@ -61,7 +61,6 @@ std::shared_ptr<tf2_ros::TransformBroadcaster> transform_broadcaster;
|
||||
std::shared_ptr<tf2_ros::StaticTransformBroadcaster> static_transform_broadcaster;
|
||||
|
||||
// Parameters
|
||||
string mavros;
|
||||
string local_frame;
|
||||
string fcu_frame;
|
||||
ros::Duration transform_timeout;
|
||||
@@ -862,9 +861,8 @@ int main(int argc, char **argv)
|
||||
static_transform_broadcaster = std::make_shared<tf2_ros::StaticTransformBroadcaster>();
|
||||
|
||||
// Params
|
||||
nh_priv.param("mavros", mavros, string("mavros")); // for case of using multiple connections
|
||||
nh.param<string>(mavros + "/local_position/tf/frame_id", local_frame, "map");
|
||||
nh.param<string>(mavros + "/local_position/tf/child_frame_id", fcu_frame, "base_link");
|
||||
nh.param<string>("mavros/local_position/tf/frame_id", local_frame, "map");
|
||||
nh.param<string>("mavros/local_position/tf/child_frame_id", fcu_frame, "base_link");
|
||||
nh_priv.param("target_frame", target.child_frame_id, string("navigate_target"));
|
||||
nh_priv.param("setpoint", setpoint.child_frame_id, string("setpoint"));
|
||||
nh_priv.param("auto_release", auto_release, true);
|
||||
@@ -875,13 +873,6 @@ int main(int argc, char **argv)
|
||||
nh_priv.param<string>("body_frame", body.child_frame_id, "body");
|
||||
nh_priv.getParam("reference_frames", reference_frames);
|
||||
|
||||
// Default reference frames
|
||||
std::map<string, string> default_reference_frames;
|
||||
default_reference_frames[body.child_frame_id] = local_frame;
|
||||
default_reference_frames[fcu_frame] = local_frame;
|
||||
if (!target.child_frame_id.empty()) default_reference_frames[target.child_frame_id] = local_frame;
|
||||
reference_frames.insert(default_reference_frames.begin(), default_reference_frames.end()); // merge defaults
|
||||
|
||||
state_timeout = ros::Duration(nh_priv.param("state_timeout", 3.0));
|
||||
local_position_timeout = ros::Duration(nh_priv.param("local_position_timeout", 2.0));
|
||||
velocity_timeout = ros::Duration(nh_priv.param("velocity_timeout", 2.0));
|
||||
@@ -896,25 +887,25 @@ int main(int argc, char **argv)
|
||||
arming_timeout = ros::Duration(nh_priv.param("arming_timeout", 4.0));
|
||||
|
||||
// Service clients
|
||||
arming = nh.serviceClient<mavros_msgs::CommandBool>(mavros + "/cmd/arming");
|
||||
set_mode = nh.serviceClient<mavros_msgs::SetMode>(mavros + "/set_mode");
|
||||
arming = nh.serviceClient<mavros_msgs::CommandBool>("mavros/cmd/arming");
|
||||
set_mode = nh.serviceClient<mavros_msgs::SetMode>("mavros/set_mode");
|
||||
|
||||
// Telemetry subscribers
|
||||
auto state_sub = nh.subscribe(mavros + "/state", 1, &handleState);
|
||||
auto velocity_sub = nh.subscribe(mavros + "/local_position/velocity_body", 1, &handleMessage<TwistStamped, velocity>);
|
||||
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);
|
||||
auto state_sub = nh.subscribe("mavros/state", 1, &handleState);
|
||||
auto velocity_sub = nh.subscribe("mavros/local_position/velocity_body", 1, &handleMessage<TwistStamped, velocity>);
|
||||
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
|
||||
position_pub = nh.advertise<PoseStamped>(mavros + "/setpoint_position/local", 1);
|
||||
position_raw_pub = nh.advertise<PositionTarget>(mavros + "/setpoint_raw/local", 1);
|
||||
attitude_pub = nh.advertise<PoseStamped>(mavros + "/setpoint_attitude/attitude", 1);
|
||||
attitude_raw_pub = nh.advertise<AttitudeTarget>(mavros + "/setpoint_raw/attitude", 1);
|
||||
rates_pub = nh.advertise<TwistStamped>(mavros + "/setpoint_attitude/cmd_vel", 1);
|
||||
thrust_pub = nh.advertise<Thrust>(mavros + "/setpoint_attitude/thrust", 1);
|
||||
position_pub = nh.advertise<PoseStamped>("mavros/setpoint_position/local", 1);
|
||||
position_raw_pub = nh.advertise<PositionTarget>("mavros/setpoint_raw/local", 1);
|
||||
attitude_pub = nh.advertise<PoseStamped>("mavros/setpoint_attitude/attitude", 1);
|
||||
attitude_raw_pub = nh.advertise<AttitudeTarget>("mavros/setpoint_raw/attitude", 1);
|
||||
rates_pub = nh.advertise<TwistStamped>("mavros/setpoint_attitude/cmd_vel", 1);
|
||||
thrust_pub = nh.advertise<Thrust>("mavros/setpoint_attitude/thrust", 1);
|
||||
|
||||
// Service servers
|
||||
auto gt_serv = nh.advertiseService("get_telemetry", &getTelemetry);
|
||||
|
||||
@@ -33,29 +33,3 @@ def test_web_video_server(node):
|
||||
# Python 3
|
||||
import urllib.request as urllib
|
||||
urllib.urlopen("http://localhost:8080").read()
|
||||
|
||||
def test_blocks(node):
|
||||
rospy.wait_for_service('clover_blocks/run', timeout=5)
|
||||
rospy.wait_for_service('clover_blocks/stop', timeout=5)
|
||||
rospy.wait_for_service('clover_blocks/load', timeout=5)
|
||||
rospy.wait_for_service('clover_blocks/store', timeout=5)
|
||||
|
||||
from std_msgs.msg import String
|
||||
from clover_blocks.srv import Run
|
||||
|
||||
def wait_print():
|
||||
try:
|
||||
wait_print.result = rospy.wait_for_message('clover_blocks/print', String, timeout=5).data
|
||||
except Exception as e:
|
||||
wait_print.result = str(e)
|
||||
|
||||
import threading
|
||||
t = threading.Thread(target=wait_print)
|
||||
t.start()
|
||||
rospy.sleep(0.1)
|
||||
|
||||
run = rospy.ServiceProxy('clover_blocks/run', Run)
|
||||
assert run(code='print("test")').success == True
|
||||
|
||||
t.join()
|
||||
assert wait_print.result == 'test'
|
||||
|
||||
@@ -23,7 +23,10 @@
|
||||
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="map_flipped_frame" args="0 0 0 3.1415926 3.1415926 0 map map_flipped" required="true"/>
|
||||
|
||||
<node name="simple_offboard" pkg="clover" type="simple_offboard" required="true" output="screen"/>
|
||||
<node name="simple_offboard" pkg="clover" type="simple_offboard" required="true" output="screen">
|
||||
<param name="reference_frames/body" value="map"/>
|
||||
<param name="reference_frames/base_link" value="map"/>
|
||||
</node>
|
||||
|
||||
<node name="tf2_web_republisher" pkg="tf2_web_republisher" type="tf2_web_republisher" required="true"/>
|
||||
|
||||
@@ -35,8 +38,6 @@
|
||||
<rosparam param="notify">startup: { r: 255, g: 255, b: 255 }</rosparam>
|
||||
</node>
|
||||
|
||||
<node name="clover_blocks" pkg="clover_blocks" type="clover_blocks" output="screen" required="true"/>
|
||||
|
||||
<param name="test_module" value="$(find clover)/test/basic.py"/>
|
||||
<test test-name="basic_test" pkg="ros_pytest" type="ros_pytest_runner"/>
|
||||
</launch>
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<h1>
|
||||
/var/log/clover.log
|
||||
<a style="font-size: 0.5em; vertical-align: super; font-weight: normal" href="clover.log" download>download</a>
|
||||
</h1>
|
||||
|
||||
<pre></pre>
|
||||
|
||||
<script type="module">
|
||||
var pre = document.querySelector('pre');
|
||||
|
||||
fetch('clover.log?' + Math.random()).then(function(response) { // random to forbid caching
|
||||
if (response.status == 404) {
|
||||
pre.innerHTML = '/var/log/clover.log does not exist';
|
||||
return;
|
||||
} else if (response.status !== 200) {
|
||||
pre.innerHTML('Error ' + response.status);
|
||||
return;
|
||||
}
|
||||
response.text().then(function(content) {
|
||||
pre.innerHTML = content;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -9,7 +9,7 @@
|
||||
<li><a href="" id="butterfly">Open web terminal</a> (<code>Butterfly</code>)</li>
|
||||
<li>View <a href="viz.html">View 3D visualization</a>, <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="console.html">Clover console</a> (<code>/var/log/clover.log</code>)</li>
|
||||
<li><a href="clover.log">Clover console</a> (<code>/var/log/clover.log</code>)</li>
|
||||
</ul>
|
||||
|
||||
<div class="version"></div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
const url = 'ws://' + location.hostname + ':9090';
|
||||
const ros = new ROSLIB.Ros({ url: url });
|
||||
const params = Object.fromEntries(new URLSearchParams(window.location.search).entries());
|
||||
|
||||
ros.on('connection', function () {
|
||||
document.body.classList.add('connected');
|
||||
@@ -53,15 +52,6 @@ function viewTopic(topic) {
|
||||
new ROSLIB.Topic({ ros: ros, name: topic }).subscribe(function(msg) {
|
||||
document.title = topic;
|
||||
if (mouseDown) return;
|
||||
|
||||
if (msg.header.stamp) {
|
||||
if (params.date || params.offset) {
|
||||
let date = new Date(msg.header.stamp.secs * 1e3 + msg.header.stamp.nsecs * 1e-6);
|
||||
if (params.date) msg.header.date = date.toISOString();
|
||||
if (params.offset) msg.header.offset = (new Date() - date) * 1e-3;
|
||||
}
|
||||
}
|
||||
|
||||
topicMessage.innerHTML = yamlStringify(msg); // JSON.stringify(msg, null, 4);
|
||||
});
|
||||
}
|
||||
@@ -72,6 +62,8 @@ topicMessage.addEventListener('mousedown', function() { mouseDown = true; });
|
||||
topicMessage.addEventListener('mouseup', function() { mouseDown = false; });
|
||||
|
||||
function init() {
|
||||
const params = Object.fromEntries(new URLSearchParams(window.location.search).entries());
|
||||
|
||||
if (!params.topic) {
|
||||
viewTopicsList();
|
||||
} else {
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
<body>
|
||||
<h1> </h1>
|
||||
<ul id="topics"></ul>
|
||||
<code id="topic-message">No messages received</code>
|
||||
<code id="topic-message" title="Hold mouse button to pause">No messages received</code>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format="2">
|
||||
<name>clover_blocks</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>Blockly programming support for Clover</description>
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
<license>MIT</license>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<package format="2">
|
||||
<name>clover_description</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>The clover_description package provides URDF models of the Clover series of quadcopters.</description>
|
||||
|
||||
<maintainer email="sfalexrog@gmail.com">Alexey Rogachevskiy</maintainer>
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
<xacro:property name="sqrt2" value="1.4142135623730951" />
|
||||
<xacro:property name="rotor_drag_coefficient" value="1.75e-04" />
|
||||
<xacro:property name="rolling_moment_coefficient" value="0.000001" />
|
||||
<xacro:property name="color" value="DarkGrey" />
|
||||
<xacro:property name="color" value="$(arg visual_material)" />
|
||||
|
||||
<!-- Property Blocks -->
|
||||
<!-- Clover body inertia -->
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<package format="2">
|
||||
<name>clover_simulation</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>The clover_simulation package provides worlds and launch files for Gazebo.</description>
|
||||
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 695 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 972 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 381 KiB After Width: | Height: | Size: 1.2 MiB |
@@ -70,7 +70,7 @@
|
||||
* [Remote control app](rc.md)
|
||||
* [Wi-Fi Configuration](network.md)
|
||||
* [UART settings](uart.md)
|
||||
* [PX4 Parameters](parameters.md)
|
||||
* [PX4 Parameters](px4_parameters.md)
|
||||
* [PX4 Logs and Topics](flight_logs.md)
|
||||
* [PX4 Firmware](firmware.md)
|
||||
* [MAVLink](mavlink.md)
|
||||
@@ -101,7 +101,6 @@
|
||||
* [CopterHack-2018](copterhack2018.md)
|
||||
* [CopterHack-2017](copterhack2017.md)
|
||||
* [Video contest](video_contest.md)
|
||||
* [Educational contests](educational_contests.md)
|
||||
* [Clover-based projects](projects.md)
|
||||
* [Autonomous Multirotor Landing System (AMLS)](amls.md)
|
||||
* [Drone show](clever-show.md)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# ArUco markers
|
||||
|
||||
> **Note** The following applies to [image versions](image.md) **0.16** and up. Older documentation is still available for [for version **0.15.1**](https://github.com/CopterExpress/clover/blob/v0.15.1/docs/en/aruco.md).
|
||||
|
||||
[ArUco markers](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) are commonly used for vision-based position estimation.
|
||||
|
||||
Examples of ArUco markers:
|
||||
|
||||
@@ -93,7 +93,7 @@ The marker map adheres to the [ROS coordinate system convention](http://www.ros.
|
||||
|
||||
## VPE setup
|
||||
|
||||
In order to enable vision position estimation you should use the following [PX4 parameters](parameters.md).
|
||||
In order to enable vision position estimation you should use the following [PX4 parameters](px4_parameters.md).
|
||||
|
||||
If you're using **LPE** (`SYS_MC_EST_GROUP` parameter is set to `local_position_estimator,attitude_estimator_q`):
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Software autorun
|
||||
systemd
|
||||
---
|
||||
|
||||
Main documentation: https://wiki.archlinux.org/title/Systemd.
|
||||
Main documentation: [https://wiki.archlinux.org/index.php/Systemd_(Russian)](https://wiki.archlinux.org/index.php/Systemd_(Russian)).
|
||||
|
||||
All automatically started Clover software is launched as a `clover.service` systemd service.
|
||||
|
||||
@@ -50,12 +50,12 @@ You can add your own node to the list of automatically launched ones. To do this
|
||||
|
||||
The started file must have *permission* to run:
|
||||
|
||||
```bash
|
||||
```(bash)
|
||||
chmod +x my_program.py
|
||||
```
|
||||
|
||||
When scripting languages are used, a <a href="https://en.wikipedia.org/wiki/Shebang_(Unix)">shebang</a> should be placed at the beginning of the file, for example:
|
||||
When scripting languages are used, [shebang] should be placed at the beginning of the file (https://ru.wikipedia.org/wiki/Shebang_(Unix)), for example:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env python3
|
||||
```(bash)
|
||||
#!/usr/bin/env python
|
||||
```
|
||||
|
||||
@@ -14,7 +14,7 @@ In order to perform the sensor calibration, select the *Vehicle Setup* tab and c
|
||||
4. Put the drone in one of the orientations marked by the red outline and wait for the appropriate outline to turn yellow.
|
||||
5. Spin the drone as required until the outline turns green. Do this for all orientations.
|
||||
|
||||
Read more in the PX4 docs: https://docs.px4.io/master/en/config/compass.html.
|
||||
Read more in the PX4 docs: https://docs.px4.io/v1.9.0/en/config/compass.html.
|
||||
|
||||
## Gyroscope
|
||||
|
||||
@@ -27,7 +27,7 @@ Read more in the PX4 docs: https://docs.px4.io/master/en/config/compass.html.
|
||||
|
||||
> **Warning** The drone should stay completely still during the calibration.
|
||||
|
||||
Read more in the PX4 docs: https://docs.px4.io/master/en/config/gyroscope.html.
|
||||
Read more in the PX4 docs: https://docs.px4.io/v1.9.0/en/config/gyroscope.html.
|
||||
|
||||
## Accelerometer
|
||||
|
||||
@@ -38,7 +38,7 @@ Read more in the PX4 docs: https://docs.px4.io/master/en/config/gyroscope.html.
|
||||
3. Put the drone in one of the orientations marked by the red outline and wait for the appropriate outline to turn yellow.
|
||||
4. Hold the drone in this orientation until the outline turns green. Do this for all orientations.
|
||||
|
||||
Read more in the PX4 docs: https://docs.px4.io/master/en/config/accelerometer.html.
|
||||
Read more in the PX4 docs: https://docs.px4.io/v1.9.0/en/config/accelerometer.html.
|
||||
|
||||
## Level horizon
|
||||
|
||||
@@ -50,6 +50,6 @@ Read more in the PX4 docs: https://docs.px4.io/master/en/config/accelerometer.ht
|
||||
4. Press *OK*.
|
||||
5. Wait for the calibration to finish.
|
||||
|
||||
Read more in the PX4 docs: https://docs.px4.io/master/en/config/level_horizon_calibration.html.
|
||||
Read more in the PX4 docs: https://docs.px4.io/v1.9.0/en/config/level_horizon_calibration.html.
|
||||
|
||||
**Next**: [RC setup](radio.md).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# COEX Pix
|
||||
|
||||
The **COEX Pix** flight controller is a modified [Pixracer](https://docs.px4.io/master/en/flight_controller/pixracer.html) FCU. It is a part of the **Clover 4** quadrotor kit.
|
||||
The **COEX Pix** flight controller is a modified [Pixracer](https://docs.px4.io/v1.9.0/en/flight_controller/pixracer.html) FCU. It is a part of the **Clover 4** quadrotor kit.
|
||||
|
||||
> **Hint** The source files of the COEX Pix flight controller are [published](https://github.com/CopterExpress/hardware/tree/master/COEX%20Pix) under the CC BY-NC-SA license.
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ USB connection is the preferred way to connect to the flight controller.
|
||||
|
||||
The `connected` field should have the `True` value.s
|
||||
|
||||
> **Hint** You need to set the `CBRK_USB_CHK` [parameter](parameters.md) to 197848 for the USB connection to work.
|
||||
> **Hint** You need to set the `CBRK_USB_CHK` [parameter](px4_parameters.md) to 197848 for the USB connection to work.
|
||||
|
||||
## UART connection
|
||||
|
||||
|
||||
@@ -13,27 +13,27 @@ The proposed projects have to be open-source and be compatible with the Clover q
|
||||
|Place|Team|Project|Points|
|
||||
|:-:|-|-|-|
|
||||
||🇰🇬 Alatoo University Team|[Облачная платформа для симулятора Клевера](https://github.com/pteacher/clover/blob/clover_simulator/docs/ru/clover-development-studio.md)||
|
||||
||🇧🇾 FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover2/docs/ru/advanced_clover_simulator.md)||
|
||||
||🇧🇾 FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover2/docs/ru/advancedclover2.md)||
|
||||
||🇻🇳 Dragon&Tanker|[Dragon&Tanker](https://github.com/uml4/clover/blob/drone_observe_autonomous_car/docs/en/dragon_and_tanker_team.md)||
|
||||
||🇷🇺 Stereo|[Neural obstacle avoidance](https://github.com/den250400/clover/blob/neural-obstacle-avoidance/docs/en/neural-obstacle-avoidance.md)||
|
||||
||🇷🇺 Space clowns|[Copter For Space](https://github.com/slavikyd/clover/blob/patch-3/docs/ru/c4s.md)||
|
||||
||🇷🇺 R.S.|[Drone Hawk](https://github.com/slavaroot/clover/blob/droneHawkSecurity/docs/ru/drone-hawk-security.md)||
|
||||
||🇲🇾 Moopt|[IoT Water Monitoring & Optimization](https://github.com/kafechew/clover/blob/master/docs/en/moopt-uav.md)||
|
||||
||🇧🇷 Atena - Grupo SEMEAR|[Swarm in Blocks](https://github.com/Grupo-SEMEAR-USP/clover/blob/Swarm_in_Blocks/docs/en/swarm_in_blocks.md)||
|
||||
||🇧🇷 Atena - Grupo SEMEAR|[Swarm in Blocks](https://github.com/Grupo-SEMEAR-USP/clover/blob/Swarm_in_Blocks/docs/en/Swarm_in_Blocks.md)||
|
||||
||🇷🇺 Clevertron|[Clevertron](https://github.com/Daniel-drone/clover/blob/Clevertron-1/docs/ru/clevertron.md)||
|
||||
||🇷🇺 Clover Rescue Team|[Rescue Clover](https://github.com/DevMBS/clover/blob/CloverRescueTeam/docs/ru/clover-rescue-team.md)||
|
||||
||🇵🇱 Edgenoon|[Neural and vision-based landing method](https://github.com/edgenoon-ai/clover/blob/neural_vision_based_landing_method/docs/en/neural_vision_based_landing_method.md)||
|
||||
||🇷🇺 CopterCat|[CopterCat](https://github.com/matveylapin/clover/blob/CopterCat/docs/ru/сopter_сat.md)||
|
||||
||🇷🇺 Дрой Ронов|[Clover Swarm](https://github.com/stinger000/clever/blob/clover_swarm_request/docs/ru/clover-swarm.md)||
|
||||
||🇩🇪 Inondro|[Inondro Pix](https://github.com/Inondro/clover/blob/inondro-pix/docs/en/inondro_copterhack22_pix.md)||
|
||||
||🇷🇺 V-NAV|[Visual Navigation](https://github.com/v-nav/clover/blob/v-nav_article/docs/ru/v-nav.md)||
|
||||
||🇮🇳 DJS Phoenix|[Autonomous valet parking drone assistance](https://github.com/DJSPhoenix/clover/blob/DJSPhoenix-Ikshana/docs/en/djs_phoenix_ikshana.md)||
|
||||
||🇷🇺 Джедаи 1581|[Ретранслятор на базе Клевера](https://github.com/JJNIK/clover/blob/patch-1/docs/ru/1581.md)||
|
||||
||🇷🇺 SPECTRE|[SPECTRE](https://github.com/alakhmenev/clover/blob/spectre_team/docs/ru/spectre_team.md)||
|
||||
||🇷🇺 Lucky flight|[Swarm of Improved Clover](https://github.com/bessiaka/clover/blob/Lucky-flight/docs/ru/lucky_flight.md)||
|
||||
||🇷🇺 SolidEye|[Разработка лидара без движущихся частей](https://github.com/feanorgg/clover/blob/solideye/docs/ru/solid_eye.md)||
|
||||
||🇰🇬 AI_U_CLOVER|[AIU_CLOVER](https://github.com/zhibekm/clover/blob/zhibekm-patch-1/docs/en/aiu-article.md)||
|
||||
||🇷🇺 С305|[Система мониторинга воздуха](https://github.com/Ruslan2288/clover/blob/master/docs/ru/air_monitor.md)| |
|
||||
|✕|🇻🇳 Dragon&Tanker|[Dragon&Tanker](https://github.com/uml4/clover/blob/drone_observe_autonomous_car/docs/en/dragon_and_tanker_team.md)||
|
||||
|✕|🇷🇺 V-NAV|[Visual Navigation](https://github.com/v-nav/clover/blob/v-nav_article/docs/ru/v-nav.md)||
|
||||
|✕|🇷🇺 Джедаи 1581|[Ретранслятор на базе Клевера](https://github.com/JJNIK/clover/blob/patch-1/docs/ru/1581.md)||
|
||||
|✕|🇷🇺 Lucky flight|[Swarm of Improved Clover](https://github.com/bessiaka/clover/blob/Lucky-flight/docs/ru/lucky_flight.md)||
|
||||
|✕|🇺🇸 EnviroFleet|[EnviroFleet](https://github.com/gueyman/clover/blob/envirofleet/docs/en/enviro_fleet.md)||
|
||||
|✕|🇷🇺 Бизнес-гуси|[Drone Rover Climbing System](https://github.com/HexaHEX/clover/blob/CopterHack2022_Business_Geese-1/docs/ru/business_geese.md)||
|
||||
|✕|🇷🇺 fuall|[Доставка дронами](https://github.com/Silly4s/clover/blob/master/docs/ru/dostavka.md)||
|
||||
|
||||
@@ -1,118 +0,0 @@
|
||||
# Educational contests
|
||||
|
||||
## 1. Contest for the best educational lecture {#lecture}
|
||||
|
||||
The Copter Express company organizes a contest for the best educational lecture with COEX Clover 4 quadcopter kit application.
|
||||
|
||||
The main goal of the contest is aerial robotics popularization and community development.
|
||||
|
||||
### Lecture requirements
|
||||
|
||||
* The topic of the lecture is of free choice. Programmable quadcopter kit COEX Clover 4 and/or The Clover simulation environment should be used as the main tool in the lecture.
|
||||
> **Note** *The version of COEX Clover is not earlier than [version 4](https://clover.coex.tech/en/assemble_4.html). The virtual machine image is not earlier than [version 1.0](https://github.com/CopterExpress/clover_vm/releases/tag/v1.0).
|
||||
* The video is uploaded on YouTube or another public platform and is public accessible.
|
||||
* The language of the lecture is any. The video contains subtitles in English in case the language is made neither of English nor Russian.
|
||||
* The duration of the lecture is limited from 15 min. to 3 hours.
|
||||
|
||||
### Requirements for the participants
|
||||
|
||||
* The participant must be the author of the lesson.
|
||||
* Third parties can provide technical support for recording a lecture.
|
||||
* The status of the participant is unlimited (student, representative of a general education institution, representative of the industry, amateur).
|
||||
|
||||
Applications deadline: September 1, 2022.
|
||||
|
||||
### How to apply?
|
||||
|
||||
The application to the contest is performed via the [Google Form](https://docs.google.com/forms/d/e/1FAIpQLScE2kN5dO2OYNSM8hOYzOa5Qvh2uDdd9Fjx8OnL1W93bfEBgw/viewform) where the link to the video lecture should be attached.
|
||||
|
||||
Participants who are the authors of the lecture are allowed to participate in the competition.
|
||||
|
||||
### Prizes
|
||||
|
||||
Based on the results of the submitted application, the jury selects the winners of the competition. The quality of the video, it is content, and audience engagement are assessed.
|
||||
|
||||
* 1st place: $500.
|
||||
* 2nd place: $400.
|
||||
* 3rd place: $300.
|
||||
* 4th place: $200.
|
||||
* 5th place: $100.
|
||||
|
||||
## 2. Contest for the best school lesson {#lesson}
|
||||
|
||||
The Copter Express company organizes a contest for the best school lesson with COEX Clover 4 quadcopter kit application.
|
||||
|
||||
The main goal of the contest is aerial robotics popularization and community development.
|
||||
|
||||
### Lesson requirements
|
||||
|
||||
* Programmable quadcopter kit COEX Clover 4 should be used as the main tool for the lesson.
|
||||
> **Note** *The version of COEX Clover is not earlier than [version 4](https://clover.coex.tech/en/assemble_4.html).
|
||||
* Integration of the quadcopter into any of the general education disciplines (physics, mathematics, computer science, etc.).
|
||||
* Practical use of the main tool in the lesson.
|
||||
* Grade - no restrictions (primary, high school).
|
||||
* Lesson duration is 30-45 minutes.
|
||||
* Lesson format - offline.
|
||||
* The video of the lesson was filmed in the classroom of a general education institution.
|
||||
|
||||
### Requirements for the participants
|
||||
|
||||
* The participant must be the author of the lesson.
|
||||
* The participant must be a teacher of a general education institution
|
||||
|
||||
### How to apply?
|
||||
|
||||
The application to the contest is performed via the [Google Form](https://docs.google.com/forms/d/e/1FAIpQLSdelVy6yQ1iN6u88KeiEIKGj7gGaM0xccSt2tiYKB46ICmjkQ/viewform).
|
||||
|
||||
Applications deadline: September 1, 2022.
|
||||
|
||||
### Prizes
|
||||
|
||||
Based on the results of the submitted application, the jury selects the winners of the competition. The video and material quality are assessed.
|
||||
|
||||
* 1st place: $500.
|
||||
* 2nd place: $400.
|
||||
* 3rd place: $300.
|
||||
* 4th place: $200.
|
||||
* 5th place: $100.
|
||||
|
||||
## 3. Contest for the best online course {#course}
|
||||
|
||||
The Copter Express company organizes a contest for the best online course with COEX Clover 4 quadcopter kit application.
|
||||
|
||||
The main goal of the contest is aerial robotics popularization and community development.
|
||||
|
||||
The course is evaluated according to a separate, publicly available lesson submitted for the contest.
|
||||
|
||||
### Course requirements
|
||||
|
||||
* The course is related to the direction of Aerial robotics.
|
||||
* Programmable quadcopter kit COEX Clover 4 and/or The Clover simulation environment should be used as the main tool in the course;
|
||||
> **Note** *The version of COEX Clover is not earlier than [version 4](https://clover.coex.tech/en/assemble_4.html). The virtual machine image is not earlier than [version 1.0](https://github.com/CopterExpress/clover_vm/releases/tag/v1.0).
|
||||
* The course is located on a public platform (e.g., Coursera).
|
||||
* The course can be either paid or free of charge. One public lesson from the course is submitted for the competition;
|
||||
* The lesson submitted for the contest should be publicly accessible.
|
||||
* The language of the lesson is any. The video contains subtitles in English in case the language is made neither of English nor Russian (if there is a video in the lesson).
|
||||
* The duration of the course and lesson is not limited.
|
||||
|
||||
### Requirements for the participants
|
||||
|
||||
* The participant must be the author of the course.
|
||||
* Third parties can provide technical support for preparing a course.
|
||||
* The status of the participant is unlimited (student, representative of a general education institution, representative of the industry, amateur).
|
||||
|
||||
### How to apply?
|
||||
|
||||
The application to the contest is performed via the [Google Form](https://docs.google.com/forms/d/e/1FAIpQLSdf2Q68X4hPnFE9f3EP95AxPNnzHKqIsFHtTRT6EBKiH93wzg/viewform) where the link to the video course should be attached.
|
||||
|
||||
Applications deadline: September 1, 2022.
|
||||
|
||||
### Prizes
|
||||
|
||||
Based on the results of the submitted application, the members of the Commission select the winners of the competition. The quality of the material, the format of the presentation of the material, the total volume and content of the course are assessed.
|
||||
|
||||
* 1st place: $1000.
|
||||
* 2nd place: $800.
|
||||
* 3rd place: $600.
|
||||
* 4th place: $400.
|
||||
* 5th place: $200.
|
||||
@@ -4,10 +4,10 @@ Main article is available at https://docs.px4.io/master/en/config/safety.html.
|
||||
|
||||
The *Safety* panel allows you to configure actions that should be performed when a failsafe is triggered. You should at the very least configure the RC Loss failsafe, which is triggered when the RC transmitter link is lost:
|
||||
|
||||
1. In QGroundControl software, go to the *Vehicle Setup* panel and choose the *Safety* menu.
|
||||
1. Open the *Safety* panel.
|
||||
2. Select one of the following actions in the *RC Loss Failsafe Trigger* option:
|
||||
* *Land mode* – transition to automatic land mode;
|
||||
* *Terminate* – set all outputs to their failsafe values.
|
||||
3. Set the timeout value before RC Loss triggers in the *RC Loss Timeout* field. We recommend setting it to 2 s.
|
||||
3. Set the timeout value before RC Loss triggers in the *RC Loss Timeout* field. We recommend setting it to 0.5 s.
|
||||
|
||||
<img src="../assets/qgc-failsafe.png" alt="QGroundControl failsafe" class="zoom">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Flight
|
||||
|
||||
> **Info** See also official PX4 flying guide: https://docs.px4.io/master/en/flying/.
|
||||
> **Info** See also official PX4 flying guide: https://docs.px4.io/v1.9.0/en/flying/.
|
||||
|
||||
This section explains the basics of manual controlling the quadcopter in different modes using radio remote control (for autonomous flying see "[Programming](programming.md)") section.
|
||||
|
||||
|
||||
@@ -9,8 +9,7 @@ Main frames in the `clover` package:
|
||||
* `base_link` is rigidly bound to the drone. It is shown by the simplified drone model on the image above;
|
||||
* `body` is bound to the drone, but its Z axis points up regardless of the drone's pitch and roll. It is shown by the red, blue and green lines in the illustration;
|
||||
* <a name="navigate_target"></a>`navigate_target` is bound to the current navigation target (as set by the [navigate](simple_offboard.md#navigate) service);
|
||||
* `setpoint` is current position setpoint;
|
||||
* `main_camera_optical` is the coordinate system, [linked to the main camera](camera_setup.md#frame);
|
||||
* `setpoint` is current position setpoint.
|
||||
|
||||
Additional frames become available when [ArUco positioning system](aruco.md) is active:
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ rostopic echo /rangefinder/range
|
||||
|
||||
> **Hint** We recommend using our [custom PX4 firmware for Clover](firmware.md#modified-firmware-for-clover) for best laser rangefinder support.
|
||||
|
||||
PX4 should be properly [configured](parameters.md) to use the rangefinder data.
|
||||
PX4 should be properly [configured](px4_parameters.md) to use the rangefinder data.
|
||||
|
||||
Set the following parameters when EKF2 is used (`SYS_MC_EST_GROUP` = `ekf2`):
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ Examples of MAVLink messages:
|
||||
* `GLOBAL_POSITION_INT` – global position of the quadcopter (latitude/longitude/altitude);
|
||||
* `COMMAND_LONG` – a command to the quadcopter (take off, land, toggle modes, etc).
|
||||
|
||||
A complete list of MAVLink messages is available in [MAVLink documentation](https://mavlink.io/en/messages/common.html).
|
||||
A complete list of MAVLink messages is available in [MAVLink documentation] (http://mavlink.org/messages/common).
|
||||
|
||||
### System, system component
|
||||
|
||||
|
||||
@@ -4,11 +4,10 @@ PX4 **mode** determines how the vehicle should react to commands and RC signals.
|
||||
|
||||
In order to configure flight modes:
|
||||
|
||||
1. Open the *Vehicle Setup* panel in QGroundControl.
|
||||
1. Open the *Vehicle Setup* tab in QGroundControl.
|
||||
2. Select the *Flight Modes* menu.
|
||||
3. Set the *Mode Channel* to the SwC switch (*Channel 6*).
|
||||
4. Optionally, set the *Emergency Kill Switch Channel* to SwA switch (*Channel 5*).
|
||||
5. Set desired flight modes.
|
||||
3. Choose SwC (Channel 6) as mode selection switch.
|
||||
4. Set desired flight modes.
|
||||
|
||||
The following flight modes are recommended:
|
||||
|
||||
@@ -16,8 +15,8 @@ In order to configure flight modes:
|
||||
* Flight Mode 4: *Altitude*.
|
||||
* Flight Mode 6: *Position*.
|
||||
|
||||
6. Check mode switching by changing the switch position.
|
||||
7. Choose SwA (Channel 5) as emergency motor stop (*Kill switch*).
|
||||
5. Check mode switching by changing the switch position.
|
||||
6. Choose SwA (Channel 5) as emergency motor stop (*Kill switch*).
|
||||
|
||||
<img src="../assets/qgc-modes.png" class="zoom" alt="QGroundControl modes">
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
# Use of Optical Flow
|
||||
|
||||
Running the "Optical Flow" function offers the possibility of POSCTL flight mode, and autonomous flight operating on a camera pointed downwards that detects changes of ground texture.
|
||||
Running the technology "Optical Flow" offers the possibility of POSCTL flight mode, and autonomous flight operating on a camera pointed downwards that detects changes of ground texture.
|
||||
|
||||
## Enabling
|
||||
|
||||
> **Hint** For Optical Flow to work it's required that the laser rangefinder is [connected and configured](laser.md).
|
||||
> **Hint** It is recommended to use [special PX4 firmware for Clover](firmware.md).
|
||||
|
||||
The use of a rangefinder is essential. [Connect and setup laser-ranging sensor VL53L1X](laser.md), according to the manual.
|
||||
|
||||
Enable Optical Flow in the file `~/catkin_ws/src/clover/clover/launch/clover.launch`:
|
||||
|
||||
@@ -12,7 +14,7 @@ Enable Optical Flow in the file `~/catkin_ws/src/clover/clover/launch/clover.lau
|
||||
<arg name="optical_flow" default="true"/>
|
||||
```
|
||||
|
||||
Optical Flow publishes data in `/mavros/px4flow/raw/send` topic. In the topic `/optical_flow/debug` is also published a visualization, that can be viewed with [web_video_server](web_video_server.md).
|
||||
Optical Flow publishes data in `mavros/px4flow/raw/send` topic. In the topic `optical_flow/debug` is also published a visualization, that can be viewed with [web_video_server](web_video_server.md).
|
||||
|
||||
> **Info** Correct connection and [setup](camera.md) of the camera module is needed for proper functioning.
|
||||
|
||||
|
||||
@@ -6,16 +6,15 @@ Open the *Vehicle Setup* tab and select the *Power* menu.
|
||||
|
||||
> **Note** Power sensor calibration should be done with the battery pack connected to the drone.
|
||||
|
||||
1. In QGroundControl software, go the *Vehicle Setup* panel and choose the *Power* menu.
|
||||
2. Set the *Number of cells* parameter according to the number of cells in your battery (*3* for the Clover 4 drone).
|
||||
3. Calculate the voltage divider:
|
||||
If there is no voltage indicator or manual calibration is not possible, set the average value of the voltage divider for the Clover 4 kit (*Voltage divider* = 11).
|
||||
|
||||
1. Set the *Number of cells* parameter according to the number of cells in your battery (*3* for the Clover 4 drone).
|
||||
2. Calculate the voltage divider:
|
||||
* Measure voltage across the battery (you may use a battery voltage tester for that).
|
||||
* Press the *Calculate* button next to the *Voltage divider* label.
|
||||
* Put the battery voltage into the prompt and click *Calculate*.
|
||||
* Press *Close* to save the calculated value.
|
||||
|
||||
If there is no voltage indicator or manual calibration is not possible, set the average value of the voltage divider for the Clover 4 kit (*Voltage divider* = 11).
|
||||
|
||||
<img src="../assets/qgc-voltage-divider.png" class="zoom">
|
||||
|
||||
Further reading: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
|
||||
@@ -31,6 +30,6 @@ Further reading: https://docs.qgroundcontrol.com/en/SetupView/Power.html.
|
||||
|
||||
<img src="../assets/qgc-power.png" class="zoom">
|
||||
|
||||
Further reading: https://docs.px4.io/master/en/advanced_config/esc_calibration.html.
|
||||
Further reading: https://docs.px4.io/v1.9.0/en/advanced_config/esc_calibration.html.
|
||||
|
||||
**Next**: [Failsafe configuration](failsafe.md)
|
||||
|
||||
@@ -9,7 +9,7 @@ Before connecting and calibrating the RC, make sure that:
|
||||
|
||||
## Connecting the RC transmitter
|
||||
|
||||
1. In QGroundControl software, go the *Vehicle Setup* panel and choose the *Radio* menu.
|
||||
1. Open the *Vehicle Setup* tab and select the *Radio* menu.
|
||||
2. Power on the transmitter by sliding the **POWER** slider up.
|
||||
3. Make sure the transmitter-receiver link is working.
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ Each topic has the a of messages it passes. ROS include a lot of standard messag
|
||||
|Message type|Description|
|
||||
|-|-|
|
||||
|[`std_msgs/Int64`](https://docs.ros.org/api/std_msgs/html/msg/Int64.html)|Integer number.|
|
||||
|[`std_msgs/Float64`](https://docs.ros.org/api/std_msgs/html/msg/Float64.html)|Double-precision floating-point number.|
|
||||
|[`std_msgs/Float64`](https://docs.ros.org/api/std_msgs/html/msg/Float64.html)|Double-precision floating-point number|
|
||||
|[`std_msgs/String`](https://docs.ros.org/api/std_msgs/html/msg/String.html)|String.|
|
||||
|[`geometry_msgs/PoseStamped`](https://docs.ros.org/api/geometry_msgs/html/msg/PoseStamped.html)|Position and orientation of an object in a given [coordinate system](frames.md) and a time stamp (widely used for passing the robot pose or some robot's part pose).|
|
||||
|[`geometry_msgs/TwistStamped`](https://docs.ros.org/api/geometry_msgs/html/msg/TwistStamped.html)|Linear and angular velocity of an object in a given coordinate system and a time stamp.|
|
||||
|
||||
@@ -43,7 +43,7 @@ Axis or Grid configured to frame `aruco_map` will visualize the location [on the
|
||||
|
||||
### jsk_rviz_plugins
|
||||
|
||||
It is also recommended to install additional useful plugins for rviz [jsk_rviz_plugins](https://jsk-visualization.readthedocs.io/en/latest/jsk_rviz_plugins/index.html). This kit allows visualizing topics like `TwistStamped` (velocity) `CameraInfo`, `PolygonArray`, and many more. To install, use command:
|
||||
It is also recommended to install additional useful plugins for rviz [jsk_rviz_plugins](https://jsk-docs.readthedocs.io/en/latest/jsk_visualization/doc/jsk_rviz_plugins/index.html). This kit allows visualizing topics like `TwistStamped` (velocity) `CameraInfo`, `PolygonArray`, and many more. To install, use command:
|
||||
|
||||
```(bash)
|
||||
sudo apt-get install ros-melodic-jsk-visualization
|
||||
|
||||
@@ -295,7 +295,7 @@ The positive direction of `yaw_rate` rotation (when viewed from the top) is coun
|
||||
|
||||
Switch the drone to landing [mode](modes.md) (`AUTO.LAND` or similar).
|
||||
|
||||
> **Note** Set the `COM_DISARM_LAND` [PX4 parameter](parameters.md) to a value greater than 0 to enable automatic disarm after landing.
|
||||
> **Note** Set the `COM_DISARM_LAND` [PX4 parameter](px4_parameters.md) to a value greater than 0 to enable automatic disarm after landing.
|
||||
|
||||
Landing the drone:
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ The plugin will collect publishing rate statistics and slow the simulation down
|
||||
|
||||
### Set simulation speed
|
||||
|
||||
Since v1.9 the PX4 SITL setup supports [setting the simulation speed](https://docs.px4.io/master/en/simulation/#run-simulation-faster-than-realtime) by setting the `PX4_SIM_SPEED_FACTOR` environment variable. Its value is picked up by PX4 startup scripts, which in turn reconfigure it to expect a certain speedup/slowdown.
|
||||
Since v1.9 the PX4 SITL setup supports [setting the simulation speed](https://dev.px4.io/v1.9.0/en/simulation/#simulation_speed) by setting the `PX4_SIM_SPEED_FACTOR` environment variable. Its value is picked up by PX4 startup scripts, which in turn reconfigure it to expect a certain speedup/slowdown.
|
||||
|
||||
You should set its value to the actual real time factor that you get with `throttling_camera`. The real time factor may be found in the Gazebo GUI window at the bottom:
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ PX4 Simulation
|
||||
|
||||
Main article: https://dev.px4.io/en/simulation/
|
||||
|
||||
PX4 simulation is possible in Linux and macOS with the use of physical environment simulation systems [jMAVSim](https://docs.px4.io/master/en/simulation/jmavsim.html) and [the Gazebo](http://gazebosim.org).
|
||||
PX4 simulation is possible in Linux and macOS with the use of physical environment simulation systems [jMAVSim](https://pixhawk.org/dev/hil/jmavsim) and [the Gazebo](http://gazebosim.org).
|
||||
|
||||
jMAVSim is a lightweight environment intended only for testing multi-rotor aircraft systems; Gazebo is a versatile environment for all types of robots.
|
||||
|
||||
|
||||
@@ -8,11 +8,13 @@
|
||||
|
||||
<a name="block-takeoff"></a><!-- old name of anchor -->
|
||||
|
||||
Function to fly to a point and wait for copter's arrival:
|
||||
Fly towards a point and wait for copter's arrival:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
#...
|
||||
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
@@ -62,6 +64,8 @@ Wait for copter's arrival to the [navigate](simple_offboard.md#navigate) target:
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def wait_arrival(tolerance=0.2):
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
@@ -75,8 +79,6 @@ def wait_arrival(tolerance=0.2):
|
||||
Calculate the distance between two points (**important**: the points are to be in the same [coordinate system](frames.md)):
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
@@ -86,8 +88,6 @@ def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
Approximation of distance (in meters) between two global coordinates (latitude/longitude):
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
@@ -203,16 +203,19 @@ from geometry_msgs.msg import PoseStamped, TwistStamped
|
||||
from sensor_msgs.msg import BatteryState
|
||||
from mavros_msgs.msg import RCIn
|
||||
|
||||
# ...
|
||||
|
||||
def pose_update(pose):
|
||||
# Processing new data of copter's position
|
||||
pass
|
||||
|
||||
# Other handler functions
|
||||
# ...
|
||||
|
||||
rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update)
|
||||
rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update)
|
||||
rospy.Subscriber('/mavros/battery', BatteryState, battery_update)
|
||||
rospy.Subscriber('mavros/rc/in', RCIn, rc_callback)
|
||||
|
||||
rospy.spin()
|
||||
```
|
||||
|
||||
Information about MAVROS topics is available at [the link](mavros.md).
|
||||
@@ -226,13 +229,18 @@ Information about MAVROS topics is available at [the link](mavros.md).
|
||||
Send an arbitrary [MAVLink message](mavlink.md) to the copter:
|
||||
|
||||
```python
|
||||
# ...
|
||||
|
||||
from mavros_msgs.msg import Mavlink
|
||||
from mavros import mavlink
|
||||
from pymavlink import mavutil
|
||||
|
||||
# ...
|
||||
|
||||
mavlink_pub = rospy.Publisher('mavlink/to', Mavlink, queue_size=1)
|
||||
|
||||
# Sending a HEARTBEAT message:
|
||||
|
||||
msg = mavutil.mavlink.MAVLink_heartbeat_message(mavutil.mavlink.MAV_TYPE_GCS, 0, 0, 0, 0, 0)
|
||||
msg.pack(mavutil.mavlink.MAVLink('', 2, 1))
|
||||
ros_msg = mavlink.convert_to_rosmsg(msg)
|
||||
@@ -273,6 +281,8 @@ Change the [flight mode](modes.md) to arbitrary one:
|
||||
```python
|
||||
from mavros_msgs.srv import SetMode
|
||||
|
||||
# ...
|
||||
|
||||
set_mode = rospy.ServiceProxy('mavros/set_mode', SetMode)
|
||||
|
||||
# ...
|
||||
@@ -287,6 +297,8 @@ Flip:
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
PI_2 = math.pi / 2
|
||||
|
||||
def flip():
|
||||
@@ -325,6 +337,8 @@ from pymavlink import mavutil
|
||||
from mavros_msgs.srv import CommandLong
|
||||
from mavros_msgs.msg import State
|
||||
|
||||
# ...
|
||||
|
||||
send_command = rospy.ServiceProxy('/mavros/cmd/command', CommandLong)
|
||||
|
||||
def calibrate_gyro():
|
||||
@@ -358,6 +372,8 @@ Enable and disable [ArUco markers recognition](aruco_marker.md) dynamically (for
|
||||
import rospy
|
||||
import dynamic_reconfigure.client
|
||||
|
||||
# ...
|
||||
|
||||
client = dynamic_reconfigure.client.Client('aruco_detect')
|
||||
|
||||
# Turn markers recognition off
|
||||
@@ -376,6 +392,8 @@ Wait for global position to appear (finishing [GPS receiver](gps.md) initializat
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
if math.isfinite(get_telemetry().lat):
|
||||
break
|
||||
@@ -390,8 +408,12 @@ Read flight controller's parameter:
|
||||
from mavros_msgs.srv import ParamGet
|
||||
from mavros_msgs.msg import ParamValue
|
||||
|
||||
# ...
|
||||
|
||||
param_get = rospy.ServiceProxy('mavros/param/get', ParamGet)
|
||||
|
||||
# ...
|
||||
|
||||
# Read parameter of type INT
|
||||
value = param_get(param_id='COM_FLTMODE1').value.integer
|
||||
|
||||
@@ -407,8 +429,12 @@ Set flight controller's parameter:
|
||||
from mavros_msgs.srv import ParamSet
|
||||
from mavros_msgs.msg import ParamValue
|
||||
|
||||
# ...
|
||||
|
||||
param_set = rospy.ServiceProxy('mavros/param/set', ParamSet)
|
||||
|
||||
# ...
|
||||
|
||||
# Set parameter of type INT:
|
||||
param_set(param_id='COM_FLTMODE1', value=ParamValue(integer=8))
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ while True:
|
||||
|
||||
### Filtering the data
|
||||
|
||||
To filter (smooth out) the data and delete [outliers](https://en.wikipedia.org/wiki/Outlier), [Kalman filter](https://en.wikipedia.org/wiki/Kalman_filter) or a simple [median filter](https://en.wikipedia.org/wiki/Median_filter) can be used. An example of median filtering implementation:
|
||||
To filter (smooth out) the data and delete [outliers](https://en.wikipedia.org/wiki/Outlier), [Kalman filter](https://en.wikipedia.org/wiki/Kalman_filter) or a simple [median filter](https://ru.wikipedia.org/wiki/Median_filter) can be used. An example of median filtering implementation:
|
||||
|
||||
```python
|
||||
import collections
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
* [Пилотирование со смартфона](rc.md)
|
||||
* [Настройка сети RPi](network.md)
|
||||
* [Интерфейс UART](uart.md)
|
||||
* [Параметры PX4](parameters.md)
|
||||
* [Параметры PX4](px4_parameters.md)
|
||||
* [Работа с логами PX4](flight_logs.md)
|
||||
* [Прошивка PX4](firmware.md)
|
||||
* [Протокол MAVLink](mavlink.md)
|
||||
@@ -101,7 +101,6 @@
|
||||
* [Светодиодная лента (legacy)](leds_old.md)
|
||||
* [Вклад в Клевер](contributing.md)
|
||||
* [Репозиторий пакетов COEX](packages.md)
|
||||
* [Тестирование Клевера](testing.md)
|
||||
* [Переход на версию 0.20](migrate20.md)
|
||||
* [Переход на версию 0.22](migrate22.md)
|
||||
* [COEX DuoCam](duocam.md)
|
||||
@@ -116,7 +115,6 @@
|
||||
* [CopterHack-2018](copterhack2018.md)
|
||||
* [CopterHack-2017](copterhack2017.md)
|
||||
* [Конкурс видео](video_contest.md)
|
||||
* [Образовательные конкурсы](educational_contests.md)
|
||||
* [Проекты на базе Клевера](projects.md)
|
||||
* [Система автоматической посадки (AMLS)](amls.md)
|
||||
* [Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](remote-control-with-oculusvr.md)
|
||||
|
||||
@@ -93,7 +93,7 @@ rosrun aruco_pose genmap.py 0.33 2 4 1 1 0 -o test_map.txt
|
||||
|
||||
## Настройка VPE
|
||||
|
||||
Для работы механизма Vision Position Estimation необходимы следующие [настройки PX4](parameters.md).
|
||||
Для работы механизма Vision Position Estimation необходимы следующие [настройки PX4](px4_parameters.md).
|
||||
|
||||
При использовании **LPE** (параметр `SYS_MC_EST_GROUP` = `local_position_estimator, attitude_estimator_q`):
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
systemd
|
||||
---
|
||||
|
||||
Основная документация: https://wiki.archlinux.org/index.php/Systemd_(Русский).
|
||||
Основная документация: [https://wiki.archlinux.org/index.php/Systemd_(Русский)](https://wiki.archlinux.org/index.php/Systemd_(Русский)).
|
||||
|
||||
Все автоматически стартуемое ПО Клевера запускается в виде systemd-сервиса `clover.service`.
|
||||
|
||||
@@ -54,8 +54,8 @@ roslaunch
|
||||
chmod +x my_program.py
|
||||
```
|
||||
|
||||
При использовании скриптовых языков вначале файла должен стоять <a href="https://ru.wikipedia.org/wiki/Шебанг_(Unix)">shebang</a>, например:
|
||||
При использовании скриптовых языков вначале файла должен стоять [shebang](https://ru.wikipedia.org/wiki/Шебанг_(Unix)), например:
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env python3
|
||||
#!/usr/bin/env python
|
||||
```
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
4. Последовательно устанавливайте квадрокоптер в каждую из указанных ориентаций до появления желтой рамки.
|
||||
5. Вращайте квадрокоптер по направлению стрелки до появления зеленой рамки.
|
||||
|
||||
> **Warning** Последние версии прошивки PX4 не поддерживают внутренний компас на полетном контроллере COEX Pix. При появлении ошибки *No mags found* перейдите во вкладку *Parameters*, установите параметры `SYS_HAS_MAG` в `0`, `EKF2_MAG_TYPE` в `None` и перезагрузите полетный контроллер (*Tools* => *Reboot Vehicle*).
|
||||
|
||||
Дополнительная информация: https://docs.px4.io/master/en/config/compass.html.
|
||||
|
||||
## Гироскоп
|
||||
|
||||
@@ -42,4 +42,4 @@ sudo systemctl start clever-blocks.service
|
||||
python main.py
|
||||
```
|
||||
|
||||
После запуска Вы можете открыть веб-интерфейс для блочного программирования по адресу [192.168.11.1:5000](http://192.168.11.1:5000).
|
||||
После запуска Вы можете открыть веб-интерфейс для блочного программирования по адресу [192.168.11.1:5000](192.168.11.1:5000).
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
Поле `connected` должно содержать значение `True`.
|
||||
|
||||
> **Hint** Для корректной работы подключения Raspberry Pi и Pixhawk по USB необходимо установить значение [параметра](parameters.md) `CBRK_USB_CHK` на 197848.
|
||||
> **Hint** Для корректной работы подключения Raspberry Pi и Pixhawk по USB необходимо установить значение [параметра](px4_parameters.md) `CBRK_USB_CHK` на 197848.
|
||||
|
||||
## Подключение по UART
|
||||
|
||||
|
||||
@@ -13,27 +13,27 @@ CopterHack 2022 — это международный конкурс по ра
|
||||
|Место|Команда|Проект|Балл|
|
||||
|:-:|-|-|-|
|
||||
||🇰🇬 Alatoo University Team|[Облачная платформа для симулятора Клевера](https://github.com/pteacher/clover/blob/clover_simulator/docs/ru/clover-development-studio.md)||
|
||||
||🇧🇾 FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover2/docs/ru/advanced_clover_simulator.md)||
|
||||
||🇧🇾 FTL|[Advanced Clover 2](https://github.com/FTL-team/clover/blob/FTL-advancedClover2/docs/ru/advancedclover2.md)||
|
||||
||🇻🇳 Dragon&Tanker|[Dragon&Tanker](https://github.com/uml4/clover/blob/drone_observe_autonomous_car/docs/en/dragon_and_tanker_team.md)||
|
||||
||🇷🇺 Stereo|[Neural obstacle avoidance](https://github.com/den250400/clover/blob/neural-obstacle-avoidance/docs/en/neural-obstacle-avoidance.md)||
|
||||
||🇷🇺 Space clowns|[Copter For Space](https://github.com/slavikyd/clover/blob/patch-3/docs/ru/c4s.md)||
|
||||
||🇷🇺 R.S.|[Drone Hawk](https://github.com/slavaroot/clover/blob/droneHawkSecurity/docs/ru/drone-hawk-security.md)||
|
||||
||🇲🇾 Moopt|[IoT Water Monitoring & Optimization](https://github.com/kafechew/clover/blob/master/docs/en/moopt-uav.md)||
|
||||
||🇧🇷 Atena - Grupo SEMEAR|[Swarm in Blocks](https://github.com/Grupo-SEMEAR-USP/clover/blob/Swarm_in_Blocks/docs/en/swarm_in_blocks.md)||
|
||||
||🇧🇷 Atena - Grupo SEMEAR|[Swarm in Blocks](https://github.com/Grupo-SEMEAR-USP/clover/blob/Swarm_in_Blocks/docs/en/Swarm_in_Blocks.md)||
|
||||
||🇷🇺 Clevertron|[Clevertron](https://github.com/Daniel-drone/clover/blob/Clevertron-1/docs/ru/clevertron.md)||
|
||||
||🇷🇺 Clover Rescue Team|[Rescue Clover](https://github.com/DevMBS/clover/blob/CloverRescueTeam/docs/ru/clover-rescue-team.md)||
|
||||
||🇵🇱 Edgenoon|[Neural and vision-based landing method](https://github.com/edgenoon-ai/clover/blob/neural_vision_based_landing_method/docs/en/neural_vision_based_landing_method.md)||
|
||||
||🇷🇺 CopterCat|[CopterCat](https://github.com/matveylapin/clover/blob/CopterCat/docs/ru/сopter_сat.md)||
|
||||
||🇷🇺 Дрой Ронов|[Clover Swarm](https://github.com/stinger000/clever/blob/clover_swarm_request/docs/ru/clover-swarm.md)||
|
||||
||🇩🇪 Inondro|[Inondro Pix](https://github.com/Inondro/clover/blob/inondro-pix/docs/en/inondro_copterhack22_pix.md)||
|
||||
||🇷🇺 V-NAV|[Visual Navigation](https://github.com/v-nav/clover/blob/v-nav_article/docs/ru/v-nav.md)||
|
||||
||🇮🇳 DJS Phoenix|[Autonomous valet parking drone assistance](https://github.com/DJSPhoenix/clover/blob/DJSPhoenix-Ikshana/docs/en/djs_phoenix_ikshana.md)||
|
||||
||🇷🇺 Джедаи 1581|[Ретранслятор на базе Клевера](https://github.com/JJNIK/clover/blob/patch-1/docs/ru/1581.md)||
|
||||
||🇷🇺 SPECTRE|[SPECTRE](https://github.com/alakhmenev/clover/blob/spectre_team/docs/ru/spectre_team.md)||
|
||||
||🇷🇺 Lucky flight|[Swarm of Improved Clover](https://github.com/bessiaka/clover/blob/Lucky-flight/docs/ru/lucky_flight.md)||
|
||||
||🇷🇺 SolidEye|[Разработка лидара без движущихся частей](https://github.com/feanorgg/clover/blob/solideye/docs/ru/solid_eye.md)||
|
||||
||🇰🇬 AI_U_CLOVER|[AIU_CLOVER](https://github.com/zhibekm/clover/blob/zhibekm-patch-1/docs/en/aiu-article.md)||
|
||||
||🇷🇺 С305|[Система мониторинга воздуха](https://github.com/Ruslan2288/clover/blob/master/docs/ru/air_monitor.md)| |
|
||||
|✕|🇻🇳 Dragon&Tanker|[Dragon&Tanker](https://github.com/uml4/clover/blob/drone_observe_autonomous_car/docs/en/dragon_and_tanker_team.md)||
|
||||
|✕|🇷🇺 V-NAV|[Visual Navigation](https://github.com/v-nav/clover/blob/v-nav_article/docs/ru/v-nav.md)||
|
||||
|✕|🇷🇺 Джедаи 1581|[Ретранслятор на базе Клевера](https://github.com/JJNIK/clover/blob/patch-1/docs/ru/1581.md)||
|
||||
|✕|🇷🇺 Lucky flight|[Swarm of Improved Clover](https://github.com/bessiaka/clover/blob/Lucky-flight/docs/ru/lucky_flight.md)||
|
||||
|✕|🇺🇸 EnviroFleet|[EnviroFleet](https://github.com/gueyman/clover/blob/envirofleet/docs/en/enviro_fleet.md)||
|
||||
|✕|🇷🇺 Бизнес-гуси|[Drone Rover Climbing System](https://github.com/HexaHEX/clover/blob/CopterHack2022_Business_Geese-1/docs/ru/business_geese.md)||
|
||||
|✕|🇷🇺 fuall|[Доставка дронами](https://github.com/Silly4s/clover/blob/master/docs/ru/dostavka.md)||
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
# Образовательные конкурсы
|
||||
|
||||
## 1. Конкурс на лучшую образовательную лекцию {#lecture}
|
||||
|
||||
Компания «Коптер Экспресс» объявляет конкурс на лучшую образовательную лекцию с использованием конструктора программируемого квадрокоптера «COEX Клевер 4».
|
||||
|
||||
Основной целью конкурса является популяризация летающей робототехники и развитие сообщества данного направления.
|
||||
|
||||
### Требования к лекции
|
||||
|
||||
* Тематика лекции - открытая, на выбор участника (пример: сборка, настройка, программирование, лекция интегрированная в школьную программу и т.п.).
|
||||
* Основной инструмент лекции - «Конструктор программируемого квадрокоптера «COEX Клевер 4» и/или «Симуляционная среда программируемого квадрокоптера Клевер».
|
||||
> **Note** *Версия «COEX Клевер» не ранее [4 версии](https://clover.coex.tech/ru/assemble_4.html). «Симуляционная среда программируемого квадрокоптера Клевер» - не ранее [версии 1.0](https://github.com/CopterExpress/clover_vm/releases/tag/v1.0).
|
||||
* Видео загружено на YouTube или иную общедоступную платформу, и находится в открытом доступе для любых пользователей;
|
||||
* Язык лекции - на выбор участника. Если язык лекции не русский/английский - наличие субтитров к видео на английском языке.
|
||||
* Продолжительность лекции - от 15 мин. до 3 часов.
|
||||
* Лекция может являться частью курса или серии лекций, но должна раскрывать заданную участником тематику и быть завершенной.
|
||||
|
||||
### Требования к участникам
|
||||
|
||||
* Участник должен быть автором лекции.
|
||||
* Техническую поддержку при записи лекции могут оказывать сторонние лица.
|
||||
* Статус участника - без ограничений (школьник, студент, представитель общеобразовательного учреждения, представитель ДПО, представитель ВПО, представитель СПО, представитель отрасли, любитель).
|
||||
|
||||
### Подача заявки
|
||||
|
||||
Прием заявок осуществляется через [Google Форму](https://docs.google.com/forms/d/e/1FAIpQLScE2kN5dO2OYNSM8hOYzOa5Qvh2uDdd9Fjx8OnL1W93bfEBgw/viewform).
|
||||
|
||||
Дедлайн подачи заявок: 1 сентября 2022 года.
|
||||
|
||||
### Призы
|
||||
|
||||
По итогам представленной заявки жюри определяет победителей конкурса. При определении победителей учитываются качество видео, содержание и показатели вовлечения аудитории.
|
||||
|
||||
* 1 место: $500.
|
||||
* 2 место: $400.
|
||||
* 3 место: $300.
|
||||
* 4 место: $200.
|
||||
* 5 место: $100.
|
||||
|
||||
## 2. Конкурс на лучший школьный урок {#lesson}
|
||||
|
||||
Компания «Коптер Экспресс» объявляет конкурс на лучший школьный урок с использованием конструктора программируемого квадрокоптера «COEX Клевер 4».
|
||||
|
||||
Основной целью конкурса является популяризация летающей робототехники и развитие сообщества данного направления.
|
||||
|
||||
### Требования к уроку
|
||||
|
||||
* Основной инструмент урока - «Конструктор программируемого квадрокоптера «COEX Клевер 4».
|
||||
> **Note** *Версия «COEX Клевер» не ранее [4 версии](https://clover.coex.tech/ru/assemble_4.html).
|
||||
* Интеграция квадрокоптера в любую из общеобразовательных дисциплин (физика, математика, информатика, урок технологии и т.д.).
|
||||
* Практическое использование основного инструмента на уроке.
|
||||
* Класс - без ограничений (начальная, основная школа).
|
||||
* Продолжительность урока - 30-45 минут.
|
||||
* Формат урока - оффлайн.
|
||||
* Видео урока снято в классе общеобразовательного учреждения.
|
||||
|
||||
### Требования к участникам
|
||||
|
||||
* Участник должен быть автором урока.
|
||||
* Участник должен являться преподавателем общеобразовательного учреждения.
|
||||
|
||||
### Подача заявки
|
||||
|
||||
Прием заявок осуществляется через [Google Форму](https://docs.google.com/forms/d/e/1FAIpQLSdelVy6yQ1iN6u88KeiEIKGj7gGaM0xccSt2tiYKB46ICmjkQ/viewform).
|
||||
|
||||
Дедлайн подачи заявок: 1 сентября 2022 года.
|
||||
|
||||
### Призы
|
||||
|
||||
По итогам представленной заявки жюри определяет победителей конкурса. При определении победителей учитываются качество видео и материала.
|
||||
|
||||
* 1 место: $500.
|
||||
* 2 место: $400.
|
||||
* 3 место: $300.
|
||||
* 4 место: $200.
|
||||
* 5 место: $100.
|
||||
|
||||
## 3. Конкурс на лучший онлайн-курс {#course}
|
||||
|
||||
Компания «Коптер Экспресс» объявляет конкурс на лучший онлайн-курс с использованием конструктора программируемого квадрокоптера «COEX Клевер 4».
|
||||
|
||||
Основной целью конкурса является популяризация летающей робототехники и развитие сообщества данного направления.
|
||||
|
||||
Оценка курса производится по заявленному на конкурс отдельному, общедоступному уроку.
|
||||
|
||||
### Требования к курсу
|
||||
|
||||
* Направление курса - «Летающая робототехника».
|
||||
* Основной инструмент курса - «Конструктор программируемого квадрокоптера «COEX Клевер 4» и/или «Симуляционная среда программируемого квадрокоптера Клевер».
|
||||
> **Note** *Версия «COEX Клевер» не ранее [4 версии](https://clover.coex.tech/ru/assemble_4.html). «Симуляционная среда программируемого квадрокоптера Клевер» - не ранее [версии 1.0](https://github.com/CopterExpress/clover_vm/releases/tag/v1.0).
|
||||
* Курс расположен на общедоступной платформе (Stepik, Coursera и т.п.).
|
||||
* Доступ к курсу может быть как платный, так и бесплатный, на конкурс принимается один бесплатный и общедоступный урок заявленного курса.
|
||||
* Заявленный на конкурс урок должен быть в открытом доступе.
|
||||
* Язык курса - на выбор участника. Если язык урока не русский/английский - наличие субтитров к видео (в случае наличия видео) на английском языке.
|
||||
* Продолжительность курса и заявленного урока - не ограничена.
|
||||
* Участники вправе подать на конкурс курс разработанный ранее, и применявшийся в системе образования, с сохранением всех вышеперечисленных требований.
|
||||
|
||||
### Требования к участникам
|
||||
|
||||
* Участник должен быть автором курса.
|
||||
* Техническую поддержку при подготовке курса могут оказывать сторонние лица.
|
||||
* Статус участника - без ограничений (школьник, студент, представитель Общеобразовательного учреждения, представитель ДПО, представитель ВПО, представитель СПО, представитель отрасли, любитель).
|
||||
|
||||
### Подача заявки
|
||||
|
||||
Прием заявок осуществляется через [Google Форму](https://docs.google.com/forms/d/e/1FAIpQLSdf2Q68X4hPnFE9f3EP95AxPNnzHKqIsFHtTRT6EBKiH93wzg/viewform).
|
||||
|
||||
Дедлайн подачи заявок: 1 сентября 2022 года
|
||||
|
||||
### Призы
|
||||
|
||||
По итогам представленной заявки жюри определяет победителей конкурса. Оценка производится по заявленному на конкурс уроку, при определении победителей учитываются качество материала (формат подачи материала, общий объем и содержание курса).
|
||||
|
||||
* 1 место: $1000.
|
||||
* 2 место: $800.
|
||||
* 3 место: $600.
|
||||
* 4 место: $400.
|
||||
* 5 место: $200.
|
||||
@@ -11,8 +11,7 @@
|
||||
* `base_link` — координаты относительно квадрокоптера: схематичное изображение квадрокоптера на иллюстрации;
|
||||
* `body` — координаты относительно квадрокоптера без учета наклонов по тангажу и крену: красная, синяя и зеленая линии на иллюстрации;
|
||||
* <a name="navigate_target"></a>`navigate_target` – координаты точки, в которую сейчас летит дрон (с использованием [navigate](simple_offboard.md#navigate));
|
||||
* `setpoint` – текущий setpoint по позиции;
|
||||
* `main_camera_optical` – система координат, [связанная с основной камерой](camera_setup.md#frame).
|
||||
* `setpoint` – текущий setpoint по позиции.
|
||||
|
||||
При использовании [системы позиционирования по ArUco-маркерам](aruco.md) появляются дополнительные фреймы:
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ rostopic echo /rangefinder/range
|
||||
|
||||
> **Hint** Для корректной работы лазерного дальномера с полетным контроллером рекомендуется использование [специальной сборки PX4 для Клевера](firmware.md#прошивка-для-клевера).
|
||||
|
||||
Для использования данных с дальномера в [PX4 должен быть сконфигурирован](parameters.md).
|
||||
Для использования данных с дальномера в [PX4 должен быть сконфигурирован](px4_parameters.md).
|
||||
|
||||
При использовании EKF2 (`SYS_MC_EST_GROUP` = `ekf2`):
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ MAVLink-сообщение это отдельная "порция" данных
|
||||
* `GLOBAL_POSITION_INT` – глобальная позиция квадрокоптера (широта/долгота/высота);
|
||||
* `COMMAND_LONG` – команда для квадрокоптера (взлететь, сесть, переключить режим и т. д.).
|
||||
|
||||
Полный список MAVLink-сообщений можно посмотреть в [документации MAVLink](https://mavlink.io/en/messages/common.html).
|
||||
Полный список MAVLink-сообщений можно посмотреть в [документации MAVLink](http://mavlink.org/messages/common).
|
||||
|
||||
### Система, компонент системы
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<img src="../assets/programming.png" width=250 align=right>
|
||||
|
||||
Платформа Клевера позволяет использовать [Raspberry Pi](raspberry.md) для того, чтобы запрограммировать автономный полет дрона. Чаще всего программа для автономного полета пишется на языке Python. Программа может [получать телеметрию](simple_offboard.md#get_telemetry) (заряд батареи, ориентацию, положение, скорости) и отправлять команды, например: [полететь в точку](simple_offboard.md#navigate), [установить ориентацию](simple_offboard.md#set_attitude), [установить угловую скорость](simple_offboard.md#set_rates).
|
||||
Платформа Клевера позволяет использовать [Raspberry Pi](raspberry.md) для того, чтобы запрограммировать автономный полет дрона. Чаще всего программа для автономного полета пишется на языке Python. Программа может [получать телеметрию](simple_offboard.md#get_telemetry) (заряд батареи, ориентацию, расположение и т. д.) и отправлять команды: [полететь в точку](simple_offboard.md#navigate), [установить ориентацию](simple_offboard.md#set_attitude), [угловую скорость](simple_offboard.md#set_rates) и т. д.
|
||||
|
||||
Платформа основывается на [фреймворке ROS](ros.md), который обеспечивает связь между пользовательской программой и сервисами Клевера, которые запущены в фоне в виде systemd-демона `clover`. Для связи с полетным контроллером используется пакет [MAVROS](mavros.md).
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
## Система позиционирования {#positioning}
|
||||
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система вычисляет и сообщает дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
Для того, чтобы дрон мог зависать на месте или летать между точками, необходимо использование системы позиционирования. Такая система должна вычислять и сообщать дрону, где он находится. Клевер предполагает использование нескольких систем позиционирования: [optical flow](optical_flow.md) (используется [камера](camera.md) и [лазерный дальномер](laser.md)), [визуальные маркеры](aruco.md) (используется камера и маркеры, наклеенные на пол или потолок), GPS и других.
|
||||
|
||||
### Optical flow
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
## Автономный полет {#flight}
|
||||
|
||||
> **Info** Для изучения языка программирования Python можно обратиться к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
||||
> **Info** Для изучения языка программирования Python вы можете обратиться к [самоучителю](https://pythonworld.ru/samouchitel-python).
|
||||
|
||||
После настройки системы позиционирования становится возможным написание скриптов для автономных полетов. Для выполнения скриптов [подключитесь в Raspberry Pi по SSH](ssh.md).
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ Axis или Grid настроенный на фрейм `aruco_map` будут
|
||||
|
||||
### jsk_rviz_plugins
|
||||
|
||||
Рекомендуется также установка набора дополнительных полезных плагинов для rviz [jsk_rviz_plugins](https://jsk-visualization.readthedocs.io/en/latest/jsk_rviz_plugins/index.html). Это набор позволяет визуализировать топики типа `TwistStamped` (скорость), `CameraInfo`, `PolygonArray` и многое другое. Для установки используйте команду:
|
||||
Рекомендуется также установка набора дополнительных полезных плагинов для rviz [jsk_rviz_plugins](https://jsk-docs.readthedocs.io/en/latest/jsk_visualization/doc/jsk_rviz_plugins/index.html). Это набор позволяет визуализировать топики типа `TwistStamped` (скорость), `CameraInfo`, `PolygonArray` и многое другое. Для установки используйте команду:
|
||||
|
||||
```bash
|
||||
sudo apt-get install ros-melodic-jsk-visualization
|
||||
|
||||
@@ -16,33 +16,26 @@
|
||||
|
||||
<img src="../assets/pix-sd.png" alt="Pixracer и MicroSD-карта" class="zoom center" width=400>
|
||||
|
||||
* Установите карту в компьютер (используйте адаптер при необходимости).
|
||||
* Отформатируйте карту в файловую систему FAT32. Для этого кликните на значок SD-карты в "Проводнике" и нажмите "Форматирование" в Windows. Используйте "Дисковую утилиту" в macOS.
|
||||
* Выполните "Безопасное извлечение" карты, извлеките карту.
|
||||
* Установите карту в полетный контроллер.
|
||||
1. Установите карту в компьютер (используйте адаптер при необходимости).
|
||||
2. Отформатируйте карту в файловую систему FAT32. Для этого кликните на значок SD-карты в "Проводнике" и нажмите "Форматирование" в Windows. Используйте "Дисковую утилиту" в macOS.
|
||||
3. Выполните "Безопасное извлечение" карты, извлеките карту.
|
||||
4. Установите карту в полетный контроллер.
|
||||
|
||||
## Загрузка прошивки в полетный контроллер
|
||||
|
||||
Основная статья: https://docs.qgroundcontrol.com/en/SetupView/Firmware.html.
|
||||
Для использования всех наиболее актуальных функций PX4 используйте последнюю версию прошивки PX4 (*1.12+*).
|
||||
|
||||
> **Note** Перед осуществлением перепрошивки Pixracer не должен быть подключен к компьютеру по USB.
|
||||
> **Note** Альтернативой является использование более старой прошивки (*1.8.2*) [с патчами COEX](firmware.md). В этой прошивке функциональность автономных полетов является более оттестированной и отлаженной. Прошивка может быть скачана с GitHub — **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">Скачать</a>**.
|
||||
|
||||
Для Клевера, в особенности для осуществления автономных полетов, рекомендуется использовать версию прошивки PX4 от Copter Express. Скачайте актуальную версию прошивки на GitHub — **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">скачать</a>**.
|
||||
|
||||
> **Info** Для квадрокоптеров с Pixhawk (Клевер 2) существует отдельная версия прошивки. Подробности смотрите в статье "[Прошивка полетного контроллера](firmware.md)".
|
||||
|
||||
Загрузите прошивку в полетный контролер:
|
||||
1. Отключите полетный контроллер от компьютера (если он подключен).
|
||||
2. Запустите программу QGroundControl.
|
||||
3. Перейдите в панель *Vehicle Setup* (кликнув на логотип QGroundControl в левом верхнем углу) и выберите меню *Firmware*.
|
||||
4. Подключите полетный контроллер к компьютеру по USB.
|
||||
5. Выберите в появившемся меню справа *PX4 Flight Stack*.
|
||||
|
||||
<img src="../assets/qgc-firmware.png" alt="QGroundControl firmware upload" class="zoom">
|
||||
|
||||
1. Запустите программу QGroundControl.
|
||||
2. Зайдите во вкладку *Vehicle Setup*.
|
||||
3. Выберите меню *Firmware*.
|
||||
4. Подключите Pixracer к компьютеру по USB.
|
||||
5. Дождитесь подключения Pixracer к QGroundControl.
|
||||
6. Выберите в меню справа *PX4 Flight Stack*.
|
||||
|
||||
Для загрузки прошивки от Copter Express (рекомендуется):
|
||||
Для загрузки прошивки COEX:
|
||||
|
||||
* Выберите *Advanced settings*.
|
||||
* В выпадающем меню выберите *Custom firmware file...*
|
||||
|
||||
@@ -295,7 +295,7 @@ set_velocity(vx=1, vy=0.0, vz=0, frame_id='body')
|
||||
|
||||
Перевести коптер в [режим](modes.md) посадки (`AUTO.LAND` или аналогичный).
|
||||
|
||||
> **Note** Для автоматического отключения винтов после посадки [параметр PX4](parameters.md) `COM_DISARM_LAND` должен быть установлен в значение > 0.
|
||||
> **Note** Для автоматического отключения винтов после посадки [параметр PX4](px4_parameters.md) `COM_DISARM_LAND` должен быть установлен в значение > 0.
|
||||
|
||||
Посадка коптера:
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ GPS датчик необходим полетов с использование
|
||||
|
||||
### Выставление скорости симуляции
|
||||
|
||||
PX4, начиная с версии 1.9, поддерживает [принудительную установку скорости симуляции](https://docs.px4.io/master/en/simulation/#run-simulation-faster-than-realtime) с помощью переменной окружения `PX4_SIM_SPEED_FACTOR`. Выставление этой переменной подготавливает все компоненты симулятора к соответствующему ускорению/замедлению.
|
||||
PX4, начиная с версии 1.9, поддерживает [принудительную установку скорости симуляции](https://dev.px4.io/v1.9.0/en/simulation/#simulation_speed) с помощью переменной окружения `PX4_SIM_SPEED_FACTOR`. Выставление этой переменной подготавливает все компоненты симулятора к соответствующему ускорению/замедлению.
|
||||
|
||||
Значение этой переменной должно соответствовать величине Real Time Factor (скорости симуляции по отношению к реальному времени), получаемой при использовании `throttling_camera`. Величина Real Time Factor отображается в окне Gazebo на нижней панели:
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
Основная статья: https://dev.px4.io/en/simulation/
|
||||
|
||||
Симуляция PX4 возможна в ОС GNU/Linux и macOS с использованием систем симуляции физической среды [jMAVSim](https://docs.px4.io/master/en/simulation/jmavsim.html) и [Gazebo](http://gazebosim.org).
|
||||
Симуляция PX4 возможна в ОС GNU/Linux и macOS с использованием систем симуляции физической среды [jMAVSim](https://pixhawk.org/dev/hil/jmavsim) и [Gazebo](http://gazebosim.org).
|
||||
|
||||
jMAVSim является легковесной средой, предназначенной только для тестирование мультироторных летательных систем; Gazebo – универсальная среда для любых типов роботов.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* Пакеты [ROS](http://www.ros.org/), требуемые для запуска нод Клевера
|
||||
* Собранный для симулятора PX4
|
||||
* Легковесный web-интерфейс для Gazebo [Gzweb](http://gazebosim.org/gzweb.html)
|
||||
* Web-терминал [Butterfly](https://github.com/paradoxxxzero/butterfly)
|
||||
* Web-терминал [Butterfly](http://paradoxxxzero.github.io/2014/02/28/butterfly.html)
|
||||
|
||||
## Предварительная настройка
|
||||
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
|
||||
<a name="block-takeoff"></a><!-- old name of anchor -->
|
||||
|
||||
Функция для полета в точку и ожидание окончания полета:
|
||||
Полет в точку и ожидание окончания полета:
|
||||
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), speed=0.5, frame_id='', auto_arm=False, tolerance=0.2):
|
||||
navigate(x=x, y=y, z=z, yaw=yaw, speed=speed, frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
@@ -72,6 +74,8 @@ land_wait()
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def wait_arrival(tolerance=0.2):
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
@@ -87,6 +91,8 @@ def wait_arrival(tolerance=0.2):
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
|
||||
```
|
||||
@@ -98,6 +104,8 @@ def get_distance(x1, y1, z1, x2, y2, z2):
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
def get_distance_global(lat1, lon1, lat2, lon2):
|
||||
return math.hypot(lat1 - lat2, lon1 - lon2) * 1.113195e5
|
||||
```
|
||||
@@ -213,16 +221,19 @@ from geometry_msgs.msg import PoseStamped, TwistStamped
|
||||
from sensor_msgs.msg import BatteryState
|
||||
from mavros_msgs.msg import RCIn
|
||||
|
||||
# ...
|
||||
|
||||
def pose_update(pose):
|
||||
# Обработка новых данных о позиции коптера
|
||||
pass
|
||||
|
||||
# Остальные функции-обработчики
|
||||
# ...
|
||||
|
||||
rospy.Subscriber('/mavros/local_position/pose', PoseStamped, pose_update)
|
||||
rospy.Subscriber('/mavros/local_position/velocity', TwistStamped, velocity_update)
|
||||
rospy.Subscriber('/mavros/battery', BatteryState, battery_update)
|
||||
rospy.Subscriber('mavros/rc/in', RCIn, rc_callback)
|
||||
|
||||
rospy.spin()
|
||||
```
|
||||
|
||||
Информацию по топикам MAVROS см. по [ссылке](mavros.md).
|
||||
@@ -236,10 +247,14 @@ rospy.spin()
|
||||
Пример отправки произвольного [MAVLink-сообщения](mavlink.md) коптеру:
|
||||
|
||||
```python
|
||||
# ...
|
||||
|
||||
from mavros_msgs.msg import Mavlink
|
||||
from mavros import mavlink
|
||||
from pymavlink import mavutil
|
||||
|
||||
# ...
|
||||
|
||||
mavlink_pub = rospy.Publisher('mavlink/to', Mavlink, queue_size=1)
|
||||
|
||||
# Отправка сообщения HEARTBEAT:
|
||||
@@ -284,6 +299,8 @@ rospy.spin()
|
||||
```python
|
||||
from mavros_msgs.srv import SetMode
|
||||
|
||||
# ...
|
||||
|
||||
set_mode = rospy.ServiceProxy('mavros/set_mode', SetMode)
|
||||
|
||||
# ...
|
||||
@@ -298,6 +315,8 @@ set_mode(custom_mode='STABILIZED')
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
PI_2 = math.pi / 2
|
||||
|
||||
def flip():
|
||||
@@ -336,6 +355,8 @@ from pymavlink import mavutil
|
||||
from mavros_msgs.srv import CommandLong
|
||||
from mavros_msgs.msg import State
|
||||
|
||||
# ...
|
||||
|
||||
send_command = rospy.ServiceProxy('/mavros/cmd/command', CommandLong)
|
||||
|
||||
def calibrate_gyro():
|
||||
@@ -369,14 +390,16 @@ calibrate_gyro()
|
||||
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})
|
||||
```
|
||||
|
||||
@@ -387,6 +410,8 @@ client.update_configuration({'enabled': True})
|
||||
```python
|
||||
import math
|
||||
|
||||
# ...
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
if math.isfinite(get_telemetry().lat):
|
||||
break
|
||||
@@ -401,8 +426,12 @@ while not rospy.is_shutdown():
|
||||
from mavros_msgs.srv import ParamGet
|
||||
from mavros_msgs.msg import ParamValue
|
||||
|
||||
# ...
|
||||
|
||||
param_get = rospy.ServiceProxy('mavros/param/get', ParamGet)
|
||||
|
||||
# ...
|
||||
|
||||
# Считать параметр типа INT
|
||||
value = param_get(param_id='COM_FLTMODE1').value.integer
|
||||
|
||||
@@ -418,8 +447,12 @@ value = param_get(param_id='MPC_Z_P').value.float
|
||||
from mavros_msgs.srv import ParamSet
|
||||
from mavros_msgs.msg import ParamValue
|
||||
|
||||
# ...
|
||||
|
||||
param_set = rospy.ServiceProxy('mavros/param/set', ParamSet)
|
||||
|
||||
# ...
|
||||
|
||||
# Изменить параметр типа INT:
|
||||
param_set(param_id='COM_FLTMODE1', value=ParamValue(integer=8))
|
||||
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
# Список тестирования
|
||||
|
||||
Актуальный список для ручного тестирования релизов Клевера.
|
||||
|
||||
Критичность: **критично**, средняя критичность, *не критично*.
|
||||
|
||||
## [Образ Клевера](image.md)
|
||||
|
||||
### Общие тесты
|
||||
|
||||
* **Раздача [Wi-Fi](wifi.md)**
|
||||
* **Возможность подключения по [SSH](ssh.md) по IP и Hostname**
|
||||
* **Успешное подключение COEX Pix по USB (по умолчанию)**
|
||||
* Успешное подключение COEX Pix по UART (с настройкой)
|
||||
* **Бридж для QGC – корректное подключение по TCP**
|
||||
* Бридж для QGC – корректное подключение по UDP-b
|
||||
* **Раздача главной страницы**
|
||||
* **Раздача пользовательской документации (RU/EN), отсутствие битых изображений и т. д.**
|
||||
* **Работа веб-терминала Butterfly**
|
||||
* **Работа web_video_server**
|
||||
* **Корректная работа драйвера камеры, корректные изображения и данные в топиках**
|
||||
* **Корректная работа драйвера vl53l1x (i2c к Raspberry), в том числе топика `~data`**
|
||||
* **Корректная работа optical flow и всех его топиков, полет по optical flow**
|
||||
* **Полет по полю маркеров**
|
||||
* **Корректная установка OpenCV – возможность использования из Python и C++**
|
||||
* **Отсутствие неожиданного жора памяти и CPU (можно контролировать с помощью `selfcheck.py` или `htop`)**
|
||||
* Автоматическая перекалибровка камеры при изменении разрешения
|
||||
|
||||
### Тесты веб-части
|
||||
|
||||
* Работа веб-просмотрщика топиков
|
||||
* Работа веб-консоли
|
||||
* Работа веб 3D-визуализации ArUco (map, detect)
|
||||
* Работа веб 3D-визуализации web_rviz
|
||||
* Работа веб 3D-визуализации web_visualization_aruco_map
|
||||
* Работает отображение карты ArUco `/aruco_map/image` и в snapshot, и в debug
|
||||
* Визуализация расположения камеры в web rviz
|
||||
* Правильное отображение осей в `/aruco_map/image`
|
||||
|
||||
### Тесты selfcheck.py
|
||||
|
||||
* **Корректная работа `rosrun clover selfcheck.py`, отсутствие варнингов, анализ вывода**
|
||||
* **Выводит ориентацию камеры текстом**
|
||||
* **Делает `commander check`**
|
||||
* **Показывается, что используется наш форк прошивки и версию образа**
|
||||
* **Показывает возникающие ошибки и опечатки, допущенные в .launch файлах**
|
||||
* **Проверка на throttling**
|
||||
|
||||
### Тесты simple_offboard
|
||||
|
||||
* **Корректная работа simple_offboard – взлет, полет в точку в любом фрейме, отсутствие проблем с `yaw` и `yaw_rate`**
|
||||
* **В фрейме `body`**
|
||||
* **В фрейме `aruco_map`**
|
||||
* **В фрейме `map`**
|
||||
* **В фрейме `navigate_target`**
|
||||
* Корректное выполнения флипа
|
||||
* **Возможность лететь к отдельным маркерам в карте, которые вне кадра и в кадре**
|
||||
* **Корректное детектирование статуса kill switch при выполнение команды с флагом `auto_arm`**
|
||||
* *Корректная работа outdoor по GPS-координатам*
|
||||
* Работают программы из папки `~/examples`
|
||||
|
||||
### Тесты [ArUco](aruco.md)
|
||||
|
||||
* **Распознавание ArUco-маркеров, корректная работа всех топиков пакета `aruco_detect` и `aruco_map`**
|
||||
* **VPE-полеты по маркерам на полу**
|
||||
* *VPE-полеты по маркерам на потолке*
|
||||
* Корректное распознавание ArUco-маркеров и ArUco-карты (проверка с помощью rviz или debug)
|
||||
* *Работает в случае если используется слишком большой ID*
|
||||
* Работают комментарии в файле карты, а также в карте используется от 4 до 8 параметров
|
||||
* Полет по Optical Flow над 1 маркером
|
||||
* `aruco_map` не падает в случае маленьких размеров карты и маркеров
|
||||
|
||||
### Тесты [pigpiod](gpio.md)
|
||||
|
||||
* Корректная работа pigpiod, возможность работы с сонаром, сервой и электромагнитом по мануалу
|
||||
* Одновременная работа pigpiod и rpi_ws281x (правильная работа светодиодной ленты и сервы)
|
||||
|
||||
### Тесты [LED-ленты](leds.md)
|
||||
|
||||
* **Работает нода LED ленты на RPi 4**
|
||||
* Дополнительная проверка на RPi 3, RPi 4 Rev. 1.4
|
||||
* **Корректная работа всех notify эффектов заданных в `led.launch`**
|
||||
* **Низкоуровневое управление отдельными диодами**
|
||||
* **Высокоуровневое управление эффектами**
|
||||
|
||||
### [Блочное программирование](blocks.md)
|
||||
|
||||
* Корректная работа функционала блочного программирования
|
||||
* Работа функций сохранение/загрузка/удаление
|
||||
* Работа с pigpiod
|
||||
* Работа всех примеров
|
||||
|
||||
### Дополнительно
|
||||
|
||||
* ROS ноды не падают в случае потери всех соединений (удобно проверять с экраном)
|
||||
* Работает `rosshow`
|
||||
* Работает `espeak`
|
||||
* *Работает LIRC*
|
||||
* *Работа iOS-пульта из коробки*
|
||||
* *Работа Android-пульта из коробки*
|
||||
@@ -66,8 +66,6 @@
|
||||
{ "from": "gpio/", "to": "en/gpio.html" },
|
||||
|
||||
{ "from": "ru/microsd_images.html", "to": "image.html" },
|
||||
{ "from": "en/microsd_images.html", "to": "image.html" },
|
||||
{ "from": "ru/px4_parameters.html", "to": "parameters.html" },
|
||||
{ "from": "en/px4_parameters.html", "to": "parameters.html" }
|
||||
{ "from": "en/microsd_images.html", "to": "image.html" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format="2">
|
||||
<name>roswww_static</name>
|
||||
<version>0.23.0</version>
|
||||
<version>0.21.1</version>
|
||||
<description>Static web pages for ROS packages</description>
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
<license>MIT</license>
|
||||
|
||||
Reference in New Issue
Block a user