mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-01 15:39:32 +00:00
Compare commits
22 Commits
clover-doc
...
simulator
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc15d19686 | ||
|
|
1e12498cb2 | ||
|
|
43037f515d | ||
|
|
2ea848721c | ||
|
|
d06b0a0cd2 | ||
|
|
1efe10c9dd | ||
|
|
24cd1f6fac | ||
|
|
5223bef5e7 | ||
|
|
105eac7e1d | ||
|
|
c1d6ed27aa | ||
|
|
614784e949 | ||
|
|
9376c017b4 | ||
|
|
b5d300e218 | ||
|
|
efb44484b0 | ||
|
|
0a2ad3d64f | ||
|
|
ffe2d3d5e4 | ||
|
|
81f4795aec | ||
|
|
596ed3dcf2 | ||
|
|
63c71fc331 | ||
|
|
0efb249d9b | ||
|
|
47c6e5aa9b | ||
|
|
687a4f50fd |
24
.github/workflows/build.yml
vendored
24
.github/workflows/build.yml
vendored
@@ -16,8 +16,24 @@ jobs:
|
|||||||
# docker run --rm -v $(pwd):/root/catkin_ws/src/clover ros:melodic-ros-base /root/catkin_ws/src/clover/builder/standalone-install.sh
|
# docker run --rm -v $(pwd):/root/catkin_ws/src/clover ros:melodic-ros-base /root/catkin_ws/src/clover/builder/standalone-install.sh
|
||||||
noetic:
|
noetic:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
container: ros:noetic-ros-base
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: catkin_ws
|
||||||
|
shell: bash
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Native Noetic build
|
with:
|
||||||
run: |
|
path: catkin_ws/src/clover
|
||||||
docker run --rm -v $(pwd):/root/catkin_ws/src/clover ros:noetic-ros-base /root/catkin_ws/src/clover/builder/standalone-install.sh
|
- name: Install pip
|
||||||
|
run: apt-get update && apt-get -y install python3-pip
|
||||||
|
- name: Install dependencies
|
||||||
|
run: rosdep update && rosdep install --from-paths src --ignore-src -y
|
||||||
|
- name: Install GeographicLib datasets
|
||||||
|
run: wget -qO- https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | bash
|
||||||
|
- name: catkin_make
|
||||||
|
run: source /opt/ros/$ROS_DISTRO/setup.bash && catkin_make
|
||||||
|
- name: Run tests
|
||||||
|
run: source devel/setup.bash && catkin_make run_tests && catkin_test_results
|
||||||
|
- name: Install
|
||||||
|
run: source devel/setup.bash && catkin_make install
|
||||||
|
|||||||
23
.github/workflows/docs-docker.yaml
vendored
23
.github/workflows/docs-docker.yaml
vendored
@@ -1,23 +0,0 @@
|
|||||||
name: Build docs Docker image
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
branches: [ '*' ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
docs-docker:
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Build Docker image
|
|
||||||
run: docker build -t clover-docs:latest docs
|
|
||||||
|
|
||||||
- name: Test Docker image
|
|
||||||
run: docker run -t --rm -v `pwd`:/clover clover-docs:latest
|
|
||||||
|
|
||||||
- name: Show results
|
|
||||||
run: |
|
|
||||||
ls -lh _book
|
|
||||||
ls -lh *.pdf
|
|
||||||
@@ -251,4 +251,5 @@ if (CATKIN_ENABLE_TESTING)
|
|||||||
add_rostest(test/test_node_failure.test)
|
add_rostest(test/test_node_failure.test)
|
||||||
add_rostest(test/largemap.test)
|
add_rostest(test/largemap.test)
|
||||||
add_rostest(test/crash_opencv.test)
|
add_rostest(test/crash_opencv.test)
|
||||||
|
add_rostest(test/duplicate.test)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ private:
|
|||||||
|
|
||||||
array_.markers.reserve(ids.size());
|
array_.markers.reserve(ids.size());
|
||||||
aruco_pose::Marker marker;
|
aruco_pose::Marker marker;
|
||||||
|
vector<geometry_msgs::TransformStamped> transforms;
|
||||||
|
transforms.reserve(ids.size());
|
||||||
geometry_msgs::TransformStamped transform;
|
geometry_msgs::TransformStamped transform;
|
||||||
transform.header.stamp = msg->header.stamp;
|
transform.header.stamp = msg->header.stamp;
|
||||||
transform.header.frame_id = msg->header.frame_id;
|
transform.header.frame_id = msg->header.frame_id;
|
||||||
@@ -204,20 +206,33 @@ private:
|
|||||||
snapOrientation(marker.pose.orientation, snap_to.transform.rotation, auto_flip_);
|
snapOrientation(marker.pose.orientation, snap_to.transform.rotation, auto_flip_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check IDs are unique
|
|
||||||
if (send_tf_) {
|
if (send_tf_) {
|
||||||
transform.child_frame_id = getChildFrameId(ids[i]);
|
transform.child_frame_id = getChildFrameId(ids[i]);
|
||||||
|
|
||||||
// check if such static transform is in the map
|
// check if such static transform is in the map
|
||||||
if (map_markers_ids_.find(ids[i]) == map_markers_ids_.end()) {
|
if (map_markers_ids_.find(ids[i]) == map_markers_ids_.end()) {
|
||||||
transform.transform.rotation = marker.pose.orientation;
|
// check if a markers with that id is already added
|
||||||
fillTranslation(transform.transform.translation, tvecs[i]);
|
bool send = true;
|
||||||
br_->sendTransform(transform);
|
for (auto &t : transforms) {
|
||||||
|
if (t.child_frame_id == transform.child_frame_id) {
|
||||||
|
send = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (send) {
|
||||||
|
transform.transform.rotation = marker.pose.orientation;
|
||||||
|
fillTranslation(transform.transform.translation, tvecs[i]);
|
||||||
|
transforms.push_back(transform);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
array_.markers.push_back(marker);
|
array_.markers.push_back(marker);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (send_tf_) {
|
||||||
|
br_->sendTransform(transforms);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
markers_pub_.publish(array_);
|
markers_pub_.publish(array_);
|
||||||
|
|||||||
BIN
aruco_pose/test/duplicate.png
Normal file
BIN
aruco_pose/test/duplicate.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 62 KiB |
8
aruco_pose/test/duplicate.py
Normal file
8
aruco_pose/test/duplicate.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import pytest
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def test_no_tf_repeated_data():
|
||||||
|
# `/rosout` acts weirdly inside rostest, so using a subprocess
|
||||||
|
cmd = """python -c 'import rospy, tf; rospy.init_node("foo"); listener = tf.TransformListener(); rospy.sleep(2)'"""
|
||||||
|
output = str(subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT))
|
||||||
|
assert 'TF_REPEATED_DATA' not in output, 'TF_REPEATED_DATA was logged on duplicate markers'
|
||||||
21
aruco_pose/test/duplicate.test
Normal file
21
aruco_pose/test/duplicate.test
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<launch>
|
||||||
|
<node pkg="image_publisher" type="image_publisher" name="main_camera" args="$(find aruco_pose)/test/duplicate.png">
|
||||||
|
<param name="frame_id" value="main_camera_optical"/>
|
||||||
|
<param name="publish_rate" value="10"/>
|
||||||
|
<param name="camera_info_url" value="file://$(find aruco_pose)/test/camera_info.yaml" />
|
||||||
|
</node>
|
||||||
|
|
||||||
|
<node pkg="nodelet" type="nodelet" name="nodelet_manager" args="manager" required="true"/>
|
||||||
|
|
||||||
|
<node pkg="nodelet" clear_params="true" type="nodelet" name="aruco_detect" args="load aruco_pose/aruco_detect nodelet_manager" required="true">
|
||||||
|
<remap from="image_raw" to="main_camera/image_raw"/>
|
||||||
|
<remap from="camera_info" to="main_camera/camera_info"/>
|
||||||
|
<param name="length" value="0.33"/>
|
||||||
|
<param name="estimate_poses" value="true"/>
|
||||||
|
<param name="send_tf" value="true"/>
|
||||||
|
<param name="cornerRefinementMethod" value="1"/>
|
||||||
|
</node>
|
||||||
|
|
||||||
|
<param name="test_module" value="$(find aruco_pose)/test/duplicate.py"/>
|
||||||
|
<test test-name="aruco_pose_test" pkg="ros_pytest" type="ros_pytest_runner"/>
|
||||||
|
</launch>
|
||||||
@@ -120,6 +120,7 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/launch.
|
|||||||
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clover.rosinstall' '/home/pi/ros_catkin_ws/'
|
# ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/kinetic-ros-clover.rosinstall' '/home/pi/ros_catkin_ws/'
|
||||||
# Add rename script
|
# Add rename script
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS}
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-ros.sh' ${REPO_URL} ${IMAGE_VERSION} false false ${NUMBER_THREADS}
|
||||||
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-simulator.sh'
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-validate.sh'
|
||||||
|
|
||||||
${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH}
|
${BUILDER_DIR}/image-resize.sh ${IMAGE_PATH}
|
||||||
|
|||||||
42
builder/image-simulator.sh
Executable file
42
builder/image-simulator.sh
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
#! /usr/bin/env bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# Script for build the image. Used builder script of the target repo
|
||||||
|
# For build: docker run --privileged -it --rm -v /dev:/dev -v $(pwd):/builder/repo smirart/builder
|
||||||
|
#
|
||||||
|
# Copyright (C) 2018 Copter Express Technologies
|
||||||
|
#
|
||||||
|
# Author: Artem Smirnov <urpylka@gmail.com>
|
||||||
|
#
|
||||||
|
# Distributed under MIT License (available at https://opensource.org/licenses/MIT).
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
|
||||||
|
set -ex # exit on error, echo commands
|
||||||
|
|
||||||
|
echo "--- Downloading PX4"
|
||||||
|
cd /home/pi/catkin_ws/
|
||||||
|
git clone --recursive --depth 1 --branch v1.13.0 https://github.com/PX4/PX4-Autopilot.git /home/pi/PX4-Autopilot
|
||||||
|
ln -s /home/pi/PX4-Autopilot /home/pi/catkin_ws/src/
|
||||||
|
ln -s /home/pi/PX4-Autopilot/Tools/sitl_gazebo /home/pi/catkin_ws/src/
|
||||||
|
|
||||||
|
echo "--- Installing PX4 dependencies"
|
||||||
|
echo "progress=dot:giga" > /home/pi/.wgetrc # make wget don't spam to log
|
||||||
|
apt-get install --no-install-recommends -y gazebo11
|
||||||
|
/home/pi/PX4-Autopilot/Tools/setup/ubuntu.sh --no-nuttx
|
||||||
|
rm /home/pi/.wgetrc
|
||||||
|
pip3 install --user toml
|
||||||
|
|
||||||
|
echo "--- Patching mavlink_sitl_gazebo"
|
||||||
|
# See https://github.com/PX4/PX4-SITL_gazebo/pull/872
|
||||||
|
cd /home/pi/PX4-Autopilot/Tools/sitl_gazebo
|
||||||
|
patch -p1 < /tmp/patches/sitl_gazebo.patch
|
||||||
|
|
||||||
|
echo "--- Build mavlink"
|
||||||
|
cd /home/pi/catkin_ws
|
||||||
|
catkin_make mavlink_c_generate -DCATKIN_WHITELIST_PACKAGES="px4" # at first build PX4's mavlink to enforce mavlink_sitl_gazebo using it
|
||||||
|
ln -s "." build/mavlink/mavlink # fix https://github.com/PX4/PX4-Autopilot/pull/19964
|
||||||
|
|
||||||
|
echo "--- Building the workspace"
|
||||||
|
catkin_make -DCATKIN_WHITELIST_PACKAGES=""
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
<arg name="led" default="true"/>
|
<arg name="led" default="true"/>
|
||||||
<arg name="blocks" default="false"/>
|
<arg name="blocks" default="false"/>
|
||||||
<arg name="rc" default="false"/>
|
<arg name="rc" default="false"/>
|
||||||
<arg name="force_init" value="true"/> <!-- force estimator to init by publishing zero pose -->
|
<arg name="force_init" default="true"/> <!-- force estimator to init by publishing zero pose -->
|
||||||
|
|
||||||
<arg name="simulator" default="false"/> <!-- flag that we are operating on a simulated drone -->
|
<arg name="simulator" default="false"/> <!-- flag that we are operating on a simulated drone -->
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<launch>
|
<launch>
|
||||||
<arg name="fcu_conn" default="usb"/> <!-- options: usb, uart, tcp, udp, sitl -->
|
<arg name="fcu_conn" default="usb"/> <!-- options: usb, uart, tcp, udp, sitl, hitl -->
|
||||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
<arg name="fcu_ip" default="127.0.0.1"/>
|
||||||
<arg name="fcu_sys_id" default="1"/>
|
<arg name="fcu_sys_id" default="1"/>
|
||||||
<arg name="gcs_bridge" default="tcp"/>
|
<arg name="gcs_bridge" default="tcp"/>
|
||||||
@@ -23,6 +23,9 @@
|
|||||||
<!-- sitl since PX4 1.9.0 -->
|
<!-- sitl since PX4 1.9.0 -->
|
||||||
<param name="fcu_url" value="udp://@$(arg fcu_ip):14580" if="$(eval fcu_conn == 'sitl')"/>
|
<param name="fcu_url" value="udp://@$(arg fcu_ip):14580" if="$(eval fcu_conn == 'sitl')"/>
|
||||||
|
|
||||||
|
<!-- hitl connection (to gazebo_mavlink_interface plugin) -->
|
||||||
|
<param name="fcu_url" value="udp://$(arg fcu_ip):14540@" if="$(eval fcu_conn == 'hitl')"/>
|
||||||
|
|
||||||
<!-- set target_system_id -->
|
<!-- set target_system_id -->
|
||||||
<param name="target_system_id" value="$(arg fcu_sys_id)" />
|
<param name="target_system_id" value="$(arg fcu_sys_id)" />
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
<depend>rosbridge_server</depend>
|
<depend>rosbridge_server</depend>
|
||||||
<depend>web_video_server</depend>
|
<depend>web_video_server</depend>
|
||||||
<depend>tf2_web_republisher</depend>
|
<depend>tf2_web_republisher</depend>
|
||||||
|
<depend>libxml2</depend>
|
||||||
|
<depend>libxslt</depend>
|
||||||
<depend condition="$ROS_PYTHON_VERSION == 2">python-lxml</depend>
|
<depend condition="$ROS_PYTHON_VERSION == 2">python-lxml</depend>
|
||||||
<depend condition="$ROS_PYTHON_VERSION == 3">python3-lxml</depend>
|
<depend condition="$ROS_PYTHON_VERSION == 3">python3-lxml</depend>
|
||||||
<depend>dynamic_reconfigure</depend>
|
<depend>dynamic_reconfigure</depend>
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ private:
|
|||||||
|
|
||||||
img.convertTo(curr_, CV_32F);
|
img.convertTo(curr_, CV_32F);
|
||||||
|
|
||||||
if (prev_.empty()) {
|
if (prev_.empty() || (msg->header.stamp - prev_stamp_).toSec() > 0.1) { // outdated previous frame
|
||||||
prev_ = curr_.clone();
|
prev_ = curr_.clone();
|
||||||
prev_stamp_ = msg->header.stamp;
|
prev_stamp_ = msg->header.stamp;
|
||||||
cv::createHanningWindow(hann_, curr_.size(), CV_32F);
|
cv::createHanningWindow(hann_, curr_.size(), CV_32F);
|
||||||
|
|||||||
@@ -625,6 +625,10 @@ def check_rangefinder():
|
|||||||
|
|
||||||
@check('Boot duration')
|
@check('Boot duration')
|
||||||
def check_boot_duration():
|
def check_boot_duration():
|
||||||
|
if not os.path.exists('/etc/clover_version'):
|
||||||
|
info('skip check')
|
||||||
|
return # Don't check not on Clover's image
|
||||||
|
|
||||||
output = subprocess.check_output('systemd-analyze').decode()
|
output = subprocess.check_output('systemd-analyze').decode()
|
||||||
r = re.compile(r'([\d\.]+)s\s*$', flags=re.MULTILINE)
|
r = re.compile(r'([\d\.]+)s\s*$', flags=re.MULTILINE)
|
||||||
duration = float(r.search(output).groups()[0])
|
duration = float(r.search(output).groups()[0])
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ function viewTopicsList() {
|
|||||||
let rosdistro;
|
let rosdistro;
|
||||||
|
|
||||||
function viewTopic(topic) {
|
function viewTopic(topic) {
|
||||||
|
let counter = 0;
|
||||||
let index = '<a href=topics.html>Topics</a>';
|
let index = '<a href=topics.html>Topics</a>';
|
||||||
title.innerHTML = `${index}: ${topic}`;
|
title.innerHTML = `${index}: ${topic}`;
|
||||||
topicMessage.style.display = 'block';
|
topicMessage.style.display = 'block';
|
||||||
@@ -51,10 +52,11 @@ function viewTopic(topic) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
new ROSLIB.Topic({ ros: ros, name: topic }).subscribe(function(msg) {
|
new ROSLIB.Topic({ ros: ros, name: topic }).subscribe(function(msg) {
|
||||||
|
counter++;
|
||||||
document.title = topic;
|
document.title = topic;
|
||||||
if (mouseDown) return;
|
if (mouseDown) return;
|
||||||
|
|
||||||
if (msg.header.stamp) {
|
if (msg.header && msg.header.stamp) {
|
||||||
if (params.date || params.offset) {
|
if (params.date || params.offset) {
|
||||||
let date = new Date(msg.header.stamp.secs * 1e3 + msg.header.stamp.nsecs * 1e-6);
|
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.date) msg.header.date = date.toISOString();
|
||||||
@@ -62,7 +64,8 @@ function viewTopic(topic) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
topicMessage.innerHTML = yamlStringify(msg); // JSON.stringify(msg, null, 4);
|
let txt = `<div class=counter>${counter} received</div>${yamlStringify(msg)}`; // JSON.stringify(msg, null, 4);
|
||||||
|
topicMessage.innerHTML = txt;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
white-space: pre;
|
white-space: pre;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
}
|
}
|
||||||
|
.counter { color: #b9b9b9; margin-bottom: 1em; }
|
||||||
#topic-type { font-family: monospace; font-size: 0.5em; vertical-align: super; font-weight: normal; }
|
#topic-type { font-family: monospace; font-size: 0.5em; vertical-align: super; font-weight: normal; }
|
||||||
.topic { font-family: monospace; }
|
.topic { font-family: monospace; }
|
||||||
body.closed { background-color: rgb(207, 207, 207); }
|
body.closed { background-color: rgb(207, 207, 207); }
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ The simulation may be configured by a set of arguments:
|
|||||||
|
|
||||||
* `mav_id` (*integer*, default: *0*) - MAVLink identifier of the vehicle. **Note**: Multi-vehicle simulation is possible, but requires extensive changes to launch files;
|
* `mav_id` (*integer*, default: *0*) - MAVLink identifier of the vehicle. **Note**: Multi-vehicle simulation is possible, but requires extensive changes to launch files;
|
||||||
* `est` (*string*, default: *lpe*, possible values: *lpe*, *ekf2*) - PX4 estimator selection. Note that this may be overriden in the startup scripts for your craft;
|
* `est` (*string*, default: *lpe*, possible values: *lpe*, *ekf2*) - PX4 estimator selection. Note that this may be overriden in the startup scripts for your craft;
|
||||||
* `vehicle` (*string*, default: *clover*) - PX4 vehicle name. Depending on this parameter, different PX4 presets will be loaded. **Note**: The default value, *clover*, requires you to use [Clover-specific PX4 branch](https://github.com/CopterExpress/Firmware/tree/v1.10.1-clever);
|
* `vehicle` (*string*, default: *clover*) - PX4 vehicle name. Depending on this parameter, different PX4 presets will be loaded.
|
||||||
* `main_camera` (*boolean*, default: *true*) - controls whether the drone will have a vision position estimation camera;
|
* `main_camera` (*boolean*, default: *true*) - controls whether the drone will have a vision position estimation camera;
|
||||||
* `rangefinder` (*boolean*, default: *true*) - controls whether the drone will have a laser rangefinder;
|
* `rangefinder` (*boolean*, default: *true*) - controls whether the drone will have a laser rangefinder;
|
||||||
* `led` (*boolean*, default: *true*) - controls whether the drone will have a programmable LED strip;
|
* `led` (*boolean*, default: *true*) - controls whether the drone will have a programmable LED strip;
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
# Build: sudo docker build -t clover-docs:latest .
|
|
||||||
|
|
||||||
# Run: docker run -it --rm -v ~/clover:/clover clover-docs:latest
|
|
||||||
|
|
||||||
# Save image: sudo docker save clover-docs:latest | gzip > clover-docs.tar.gz
|
|
||||||
|
|
||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y curl git
|
|
||||||
|
|
||||||
RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
|
|
||||||
RUN . $HOME/.nvm/nvm.sh && nvm install 10.15 && nvm use 10.15 && npm --version
|
|
||||||
|
|
||||||
RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections \
|
|
||||||
&& apt-get update \
|
|
||||||
&& apt-get install -y calibre msttcorefonts ghostscript
|
|
||||||
|
|
||||||
RUN . $HOME/.nvm/nvm.sh && curl https://raw.githubusercontent.com/CopterExpress/clover/master/builder/assets/install_gitbook.sh | bash
|
|
||||||
|
|
||||||
# RUN . $HOME/.nvm/nvm.sh && npm install markdownlint-cli@0.28.1 -g && PUPPETEER_SKIP_DOWNLOAD=1 npm install svgexport -g
|
|
||||||
RUN . $HOME/.nvm/nvm.sh && npm install markdownlint-cli@0.28.1 -g && npm install svgexport -g --unsafe-perm
|
|
||||||
|
|
||||||
RUN . $HOME/.nvm/nvm.sh && node -v && gitbook -V && markdownlint -V
|
|
||||||
|
|
||||||
RUN curl https://raw.githubusercontent.com/CopterExpress/clover/master/book.json > book.json
|
|
||||||
|
|
||||||
RUN . $HOME/.nvm/nvm.sh && gitbook install
|
|
||||||
|
|
||||||
CMD . $HOME/.nvm/nvm.sh && export QTWEBENGINE_DISABLE_SANDBOX=1 && cp -r node_modules /clover && cd /clover && gitbook build \
|
|
||||||
&& gitbook pdf ./ _book/clover.pdf && \
|
|
||||||
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=_book/clover_ru_compressed.pdf _book/clover_ru.pdf && \
|
|
||||||
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=_book/clover_en_compressed.pdf _book/clover_en.pdf && \
|
|
||||||
rm _book/clover_ru.pdf && mv _book/clover_ru_compressed.pdf _book/clover_ru.pdf && \
|
|
||||||
rm _book/clover_en.pdf && mv _book/clover_en_compressed.pdf _book/clover_en.pdf
|
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
# Working with the camera
|
# Working with the camera
|
||||||
|
|
||||||
> **Note** In the image version **0.20** `clever` package was renamed to `clover`. See [previous version of the article](https://github.com/CopterExpress/clover/blob/v0.19/docs/en/camera.md) for older images.
|
|
||||||
|
|
||||||
Make sure the camera is enabled in the `~/catkin_ws/src/clover/clover/launch/clover.launch` file:
|
Make sure the camera is enabled in the `~/catkin_ws/src/clover/clover/launch/clover.launch` file:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
|
|||||||
@@ -20,15 +20,14 @@ USB connection is the preferred way to connect to the flight controller.
|
|||||||
|
|
||||||
## UART connection
|
## UART connection
|
||||||
|
|
||||||
> **Note** In the image version **0.20** `clever` package and service was renamed to `clover`. See [previous version of the article](https://github.com/CopterExpress/clover/blob/v0.19/docs/en/connection.md) for older images.
|
|
||||||
|
|
||||||
<!-- TODO: Connection scheme -->
|
<!-- TODO: Connection scheme -->
|
||||||
|
|
||||||
UART connection is another way for the Raspberry Pi and FCU to communicate.
|
UART connection is another way for the Raspberry Pi and FCU to communicate.
|
||||||
|
|
||||||
1. Connect Raspberry Pi to your FCU using a UART cable.
|
1. Connect the TELEM 2 port on the flight controller using a UART cable to the Raspberry Pi pins following this instruction: the black cable (*GND*) to Ground, the green cable (*UART_RX*) to *GPIO14*, the yellow cable (*UART_TX*) to *GPIO15*. Do not connect the red cable (*5V*).
|
||||||
2. [Connect to the Raspberry Pi over SSH](ssh.md).
|
2. Set the PX4 parameters: `MAV_1_CONFIG` to TELEM 2, `SER_TEL2_BAUND` to 921600 8N1. In PX4 of version prior to v1.10.0 the parameter `SYS_COMPANION` should be set to 921600.
|
||||||
3. Change the connection type in `~/catkin_ws/src/clover/clover/launch/clover.launch` to UART:
|
3. [Connect to the Raspberry Pi over SSH](ssh.md).
|
||||||
|
4. Change the connection type in `~/catkin_ws/src/clover/clover/launch/clover.launch` to UART:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<arg name="fcu_conn" default="uart"/>
|
<arg name="fcu_conn" default="uart"/>
|
||||||
@@ -40,15 +39,4 @@ UART connection is another way for the Raspberry Pi and FCU to communicate.
|
|||||||
sudo systemctl restart clover
|
sudo systemctl restart clover
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Hint** Set the `SYS_COMPANION` PX4 parameter to 921600 to enable UART on the FCU.
|
|
||||||
|
|
||||||
## SITL connection
|
|
||||||
|
|
||||||
In order to connect to a local or a remote [SITL](sitl.md) instance set the `fcu_conn` parameter to `udp` and `fcu_ip` to the IP address of the SITL instance (`127.0.0.1` if you are running the instance locally):
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<arg name="fcu_conn" default="udp"/>
|
|
||||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Next**: [Using QGroundControl over Wi-Fi](gcs_bridge.md)
|
**Next**: [Using QGroundControl over Wi-Fi](gcs_bridge.md)
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ Messages published in the topics may be viewed with the `rostopic` utility, e.g.
|
|||||||
|
|
||||||
`/mavros/setpoint_position/local` — set target position and yaw of the drone \(in the ENU coordinate system\).
|
`/mavros/setpoint_position/local` — set target position and yaw of the drone \(in the ENU coordinate system\).
|
||||||
|
|
||||||
|
`/mavros/setpoint_position/global` – set target position in global coordinates (latitude, longitude, altitude) and yaw of the drone.
|
||||||
|
|
||||||
`/mavros/setpoint_position/cmd_vel` — set target linear velocity of the drone.
|
`/mavros/setpoint_position/cmd_vel` — set target linear velocity of the drone.
|
||||||
|
|
||||||
`/mavros/setpoint_attitude/attitude` and `/mavros/setpoint_attitude/att_throttle` — set target attitude and throttle level.
|
`/mavros/setpoint_attitude/attitude` and `/mavros/setpoint_attitude/att_throttle` — set target attitude and throttle level.
|
||||||
@@ -52,4 +54,4 @@ Messages published in the topics may be viewed with the `rostopic` utility, e.g.
|
|||||||
|
|
||||||
`/mavros/setpoint_raw/attitude` — sends [SET\_ATTITUDE\_TARGET](https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET) message. Allows setting the target attitude /angular velocity and throttle level. The values to be set are selected using the `type_mask` field
|
`/mavros/setpoint_raw/attitude` — sends [SET\_ATTITUDE\_TARGET](https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET) message. Allows setting the target attitude /angular velocity and throttle level. The values to be set are selected using the `type_mask` field
|
||||||
|
|
||||||
`/mavros/setpoint_raw/global` — sends [SET\_POSITION\_TARGET\_GLOBAL\_INT](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_GLOBAL_INT). Allows setting the target attitude in global coordinates \(latitude, longitude, altitude\) and flight speed. **Not supported in PX4** \([issue](https://github.com/PX4/Firmware/issues/7552)\).
|
`/mavros/setpoint_raw/global` — sends [SET\_POSITION\_TARGET\_GLOBAL\_INT](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_GLOBAL_INT). Allows setting the target attitude in global coordinates \(latitude, longitude, altitude\) and flight speed.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Setting up the simulation environment from scratch requires some effort, but results in the most performant setup, with less chance of driver issues.
|
Setting up the simulation environment from scratch requires some effort, but results in the most performant setup, with less chance of driver issues.
|
||||||
|
|
||||||
> **Hint** See up-to-date commands set for installation Clover simulation software in the script, that builds the virtual machine image with the simulator: [`install_software.sh`](https://github.com/CopterExpress/clover_vm/blob/master/scripts/install_software.sh).
|
<!-- > **Hint** See up-to-date commands set for installation Clover simulation software in the script, that builds the virtual machine image with the simulator: [`install_software.sh`](https://github.com/CopterExpress/clover_vm/blob/master/scripts/install_software.sh). -->
|
||||||
|
|
||||||
Prerequisites: **Ubuntu 20.04**.
|
Prerequisites: **Ubuntu 20.04**.
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ PX4 will be built along with the other packages in our workspace. You may clone
|
|||||||
Clone PX4 sources and make the required symlinks:
|
Clone PX4 sources and make the required symlinks:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive --depth 1 --branch v1.12.0 https://github.com/PX4/PX4-Autopilot.git ~/PX4-Autopilot
|
git clone --recursive --depth 1 --branch v1.12.3 https://github.com/PX4/PX4-Autopilot.git ~/PX4-Autopilot
|
||||||
ln -s ~/PX4-Autopilot ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot ~/catkin_ws/src/
|
||||||
ln -s ~/PX4-Autopilot/Tools/sitl_gazebo ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot/Tools/sitl_gazebo ~/catkin_ws/src/
|
||||||
ln -s ~/PX4-Autopilot/mavlink ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot/mavlink ~/catkin_ws/src/
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
# Работа с камерой
|
# Работа с камерой
|
||||||
|
|
||||||
> **Note** В версии образа **0.20** пакет и сервис `clever` был переименован в `clover`. Для более ранних версий см. документацию для версии [**0.19**](https://github.com/CopterExpress/clover/blob/v0.19/docs/ru/camera.md).
|
|
||||||
|
|
||||||
<!-- TODO: физическое подключение -->
|
<!-- TODO: физическое подключение -->
|
||||||
|
|
||||||
Для работы с основной камерой необходимо убедиться что она включена в файле `~/catkin_ws/src/clover/clover/launch/clover.launch`:
|
Для работы с основной камерой необходимо убедиться что она включена в файле `~/catkin_ws/src/clover/clover/launch/clover.launch`:
|
||||||
|
|||||||
@@ -20,15 +20,14 @@
|
|||||||
|
|
||||||
## Подключение по UART
|
## Подключение по UART
|
||||||
|
|
||||||
> **Note** В версии образа **0.20** пакет и сервис `clever` был переименован в `clover`. Для более ранних версий см. документацию для версии [**0.19**](https://github.com/CopterExpress/clover/blob/v0.19/docs/ru/connection.md).
|
|
||||||
|
|
||||||
<!-- TODO схема подключения -->
|
<!-- TODO схема подключения -->
|
||||||
|
|
||||||
Дополнительным способом подключения является подключение подключение по интерфейсу UART.
|
Дополнительным способом подключения является подключение подключение по интерфейсу UART.
|
||||||
|
|
||||||
1. Подключите Raspberry Pi к полетному контроллеру по UART.
|
1. Подключите Raspberry Pi к полетному контроллеру по UART. Для этого соедините кабелем порт TELEM 2 на полетном контроллере к пинам на Raspberry Pi следующем образом: черный провод (GND) к Ground, зеленый (*UART_RX*) к *GPIO14*, желтый (*UART_TX*) к *GPIO15*. Красный провод (*5V*) подключать не нужно.
|
||||||
2. [Подключитесь в Raspberry Pi по SSH](ssh.md).
|
2. Измените значения параметров PX4: `MAV_1_CONFIG` на TELEM 2, `SER_TEL2_BAUND` на 921600 8N1. В PX4 до версии v1.10.0 необходима установка параметра `SYS_COMPANION` в значение 921600.
|
||||||
3. Поменяйте в launch-файле Клевера (`~/catkin_ws/src/clover/clover/launch/clover.launch`) тип подключения на UART:
|
3. [Подключитесь в Raspberry Pi по SSH](ssh.md).
|
||||||
|
4. Поменяйте в launch-файле Клевера (`~/catkin_ws/src/clover/clover/launch/clover.launch`) тип подключения на UART:
|
||||||
|
|
||||||
```xml
|
```xml
|
||||||
<arg name="fcu_conn" default="uart"/>
|
<arg name="fcu_conn" default="uart"/>
|
||||||
@@ -40,15 +39,4 @@
|
|||||||
sudo systemctl restart clover
|
sudo systemctl restart clover
|
||||||
```
|
```
|
||||||
|
|
||||||
> **Hint** Для корректной работы подключения Raspberry Pi и полетного контроллера по UART необходимо установить значение параметра `SYS_COMPANION` на 921600.
|
|
||||||
|
|
||||||
## Подключение к SITL
|
|
||||||
|
|
||||||
Для того, чтобы подсоединиться к локально/удаленно запущенному [SITL](sitl.md), необходимо установить аргумент `fcu_conn` в `udp`, и `fcu_ip` в IP-адрес машины, где запущен SITL (`127.0.0.1` для локального):
|
|
||||||
|
|
||||||
```xml
|
|
||||||
<arg name="fcu_conn" default="udp"/>
|
|
||||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Далее**: [Подключение QGroundControl по Wi-Fi](gcs_bridge.md).
|
**Далее**: [Подключение QGroundControl по Wi-Fi](gcs_bridge.md).
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ MAVROS подписывается на определенные ROS-топики
|
|||||||
|
|
||||||
`/mavros/setpoint_position/local` — установить целевую позицию и рысканье \(yaw\) беспилотника \(в системе координат ENU\).
|
`/mavros/setpoint_position/local` — установить целевую позицию и рысканье \(yaw\) беспилотника \(в системе координат ENU\).
|
||||||
|
|
||||||
|
`/mavros/setpoint_position/global` – установить целевую позицию в глобальных координатах (ширина, долгота и высота) и рысканье беспилотника.
|
||||||
|
|
||||||
`/mavros/setpoint_velocity/cmd_vel` — установить целевую линейную скорость беспилотника.
|
`/mavros/setpoint_velocity/cmd_vel` — установить целевую линейную скорость беспилотника.
|
||||||
|
|
||||||
`/mavros/setpoint_attitude/attitude` и `/mavros/setpoint_attitude/att_throttle` — установить целевую ориентацию \(Attitude\) и уровень газа.
|
`/mavros/setpoint_attitude/attitude` и `/mavros/setpoint_attitude/att_throttle` — установить целевую ориентацию \(Attitude\) и уровень газа.
|
||||||
@@ -52,4 +54,4 @@ MAVROS подписывается на определенные ROS-топики
|
|||||||
|
|
||||||
`/mavros/setpoint_raw/attitude` — отправка пакета [SET\_ATTITUDE\_TARGET](https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET). Позволяет установить целевую ориентацию / угловые скорости и уровень газа. Выбор устанавливаемых величин осуществляется с помощью поля `type_mask`
|
`/mavros/setpoint_raw/attitude` — отправка пакета [SET\_ATTITUDE\_TARGET](https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET). Позволяет установить целевую ориентацию / угловые скорости и уровень газа. Выбор устанавливаемых величин осуществляется с помощью поля `type_mask`
|
||||||
|
|
||||||
`/mavros/setpoint_raw/global` — отправка пакета [SET\_POSITION\_TARGET\_GLOBAL\_INT](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_GLOBAL_INT). Позволяет установить целевую позицию в глобальных координатах \(ширина, долгота, высота\), а также скорости полета. **Не поддерживается в PX4** \([issue](https://github.com/PX4/Firmware/issues/7552)\).
|
`/mavros/setpoint_raw/global` — отправка пакета [SET\_POSITION\_TARGET\_GLOBAL\_INT](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_GLOBAL_INT). Позволяет установить целевую позицию в глобальных координатах \(ширина, долгота, высота\), а также скорости полета.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
Настройка среды для симуляции с нуля требует некоторых усилий, однако это приведет к улучшению производительности и к уменьшению вероятности появления проблем с драйверами.
|
||||||
|
|
||||||
> **Hint** Смотрите актуальный набор команд установки необходимого ПО для запуска симулятора Клевера в скрипте сборки виртуальной машины с симулятором: [`install_software.sh`](https://github.com/CopterExpress/clover_vm/blob/master/scripts/install_software.sh).
|
<!-- > **Hint** Смотрите актуальный набор команд установки необходимого ПО для запуска симулятора Клевера в скрипте сборки виртуальной машины с симулятором: [`install_software.sh`](https://github.com/CopterExpress/clover_vm/blob/master/scripts/install_software.sh). -->
|
||||||
|
|
||||||
Требования для сборки: **Ubuntu 20.04**.
|
Требования для сборки: **Ubuntu 20.04**.
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ sudo /usr/bin/python3 -m pip install -r ~/catkin_ws/src/clover/clover/requiremen
|
|||||||
Склонируйте исходный код PX4 и создайте необходимые симлинки:
|
Склонируйте исходный код PX4 и создайте необходимые симлинки:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone --recursive --depth 1 --branch v1.12.0 https://github.com/PX4/PX4-Autopilot.git ~/PX4-Autopilot
|
git clone --recursive --depth 1 --branch v1.12.3 https://github.com/PX4/PX4-Autopilot.git ~/PX4-Autopilot
|
||||||
ln -s ~/PX4-Autopilot ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot ~/catkin_ws/src/
|
||||||
ln -s ~/PX4-Autopilot/Tools/sitl_gazebo ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot/Tools/sitl_gazebo ~/catkin_ws/src/
|
||||||
ln -s ~/PX4-Autopilot/mavlink ~/catkin_ws/src/
|
ln -s ~/PX4-Autopilot/mavlink ~/catkin_ws/src/
|
||||||
|
|||||||
Reference in New Issue
Block a user