Compare commits

..

5 Commits

Author SHA1 Message Date
Oleg Kalachev
53a00ef5e7 Merge pull request #330 from deadln/melodic-devel
Preparations for release in rosdistro
2021-05-17 23:44:29 +03:00
deadln
6809c0e852 Implemented catkin_virtualenv into clover package 2021-05-12 10:23:05 -07:00
deadln
03b87ee336 Merge branch 'master' into melodic-devel 2021-05-12 10:20:24 -07:00
deadln
a2c3b77c62 Increased versions in packages to 0.21.2 (#323)
* Preparations for release in rosdistro

* Changed version to 0.21.2 in package.xlm
2021-03-26 18:26:32 +03:00
deadln
cbeb46fac3 Preparations for release in rosdistro (#322) 2021-03-26 18:05:41 +03:00
76 changed files with 247 additions and 343 deletions

View File

@@ -1,29 +0,0 @@
name: Build RPi image
on:
push:
branches: [ '*' ]
pull_request:
branches: [ master ]
release:
types: [ created ]
jobs:
build-image:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build image
run: |
docker run --privileged --rm -v /dev:/dev -v $(pwd):/builder/repo -e TRAVIS_TAG="${{ github.event.release.tag_name }}" sfalexrog/img-tool:qemu-update
- name: Compress image
run: |
sudo chmod -R 777 images && zip -9 $(echo images/clover_*).zip images/clover_* && ls -l images
- name: Upload image
uses: softprops/action-gh-release@v1
if: ${{ github.event_name == 'release' }}
with:
files: images/clover_*.zip
prerelease: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -1,16 +0,0 @@
name: Build
on:
push:
branches: [ '*' ]
pull_request:
branches: [ master ]
jobs:
build-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

View File

@@ -1,54 +0,0 @@
name: Documentation
on:
push:
branches: [ '*' ]
pull_request:
branches: [ master ]
jobs:
documentation:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with: { node-version: '10' }
- name: Setup tools
run: |
sudo sh -c "echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections"
sudo apt-get update && sudo apt-get install -y calibre msttcorefonts
npm install gitbook-cli -g
gitbook fetch 3.2.3 && npm i npm@3.10.10 --prefix=~/.gitbook/versions/3.2.3/ # fixing https://travis-ci.org/github/CopterExpress/clover/jobs/766541125#L932
npm install markdownlint-cli -g
npm install svgexport -g
gitbook -V
markdownlint -V
- name: Run markdownlint
run: markdownlint docs
- name: Check Assets
run: |
./check_assets_size.py
./check_unused_assets.py
- name: Build GitBook
run: |
gitbook install
gitbook build
- name: Generate PDF
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
run: |
for i in 1 2 3 4; do gitbook pdf ./ _book/clover.pdf && break || sleep 1; done
sudo apt-get -q install ghostscript
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
ls -lah _book/clover*.pdf
- name: Deploy
uses: JamesIves/github-pages-deploy-action@4.1.3
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
with:
branch: gh-pages
folder: _book
clean: true
single-commit: true # to avoid multiple copies of large pdf files

View File

@@ -1,18 +0,0 @@
name: Editorconfig lint
on:
push:
branches: [ '*' ]
pull_request:
branches: [ master ]
jobs:
editorconfig:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: .editorconfig Linter
run: |
wget --no-verbose https://github.com/okalachev/editorconfig-checker/releases/download/1.2.1-disable-spaces-amount/ec-linux-amd64
chmod +x ec-linux-amd64
./ec-linux-amd64 -spaces-after-tabs -e "roslib.js|ros3d.js|eventemitter2.js|draw.cpp|BinUtils.swift|\.idea|apps/android/app|blockly/|clover_blocks/programs/|highlight/|python.js|Assets.xcassets|test_parser_pass.txt|test_node_failure.txt|aruco_pose/vendor|\.stl|\.dxf|\.dae"

View File

@@ -1,32 +0,0 @@
name: Monitor
on:
schedule:
- cron: '0 0 * * *' # At 00:00 every day
workflow_dispatch:
jobs:
check-urls:
runs-on: ubuntu-latest
steps:
- name: Check website links accessibility
run: |
curl -ILf https://clover.coex.tech
curl -ILf https://clover.coex.tech/clover_en.pdf
curl -ILf https://clover.coex.tech/clover_ru.pdf
curl -ILf https://clover.coex.tech/connection
curl -ILf https://clover.coex.tech/aruco
curl -ILf https://clover.coex.tech/programming
curl -ILf https://clover.coex.tech/led
curl -ILf https://clover.coex.tech/en/snippets.html
curl -ILf https://clover.coex.tech/en/simulation.html
curl -ILf https://clover.coex.tech/aruco
curl -ILf https://clover.coex.tech/led
curl -ILf https://clover.coex.tech/camera_setup
curl -ILf https://clover.coex.tech/firmware
curl -ILf https://clover.coex.tech/power
curl -ILf https://clover.coex.tech/hostname
curl -ILf https://clover.coex.tech/en/blocks.html
curl -ILf https://clover.coex.tech/en/gpio.html
curl -ILf https://clover.coex.tech/en/leds.html
curl -ILf https://clover.coex.tech/en/simple_offboard.html

View File

@@ -109,8 +109,7 @@
"Li-ion",
"Nvidia",
"VirtualBox",
"VMware",
"DuoCam"
"VMware"
],
"code_blocks": false
},

124
.travis.yml Normal file
View File

@@ -0,0 +1,124 @@
os: linux
dist: xenial
language: generic
services:
- docker
env:
global:
- DOCKER="sfalexrog/img-tool:qemu-update"
- TARGET_REPO="https://github.com/${TRAVIS_REPO_SLUG}.git"
- IMAGE_VERSION=${TRAVIS_TAG:-${TRAVIS_COMMIT:0:7}}
- IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
git:
depth: 1
jobs:
fast_finish: true
include:
- stage: Build
name: "Raspberry Pi Image Build"
cache:
directories:
- imgcache
before_script:
- docker pull ${DOCKER}
# Check if there are any cached images, copy them to our "images" directory
- if [ -n "$(ls -A imgcache/*.zip)" ]; then mkdir -p images && cp imgcache/*.zip images; fi
script:
- if [[ -z ${TRAVIS_TAG} && "${TRAVIS_PULL_REQUEST}" != "false" ]]; then
echo "Commit range is ${TRAVIS_COMMIT_RANGE}" &&
if [ $(git diff --name-only ${TRAVIS_COMMIT_RANGE} | grep -v ^"docs/" | wc -l) -eq 0 ]; then
echo " === Docs-only change; skipping build ===" &&
export SKIP_BUILD=true;
fi;
fi
- if [ -z ${SKIP_BUILD} ]; then
docker run --privileged --rm -v /dev:/dev -v $(pwd):/builder/repo -e TRAVIS_TAG="${TRAVIS_TAG}" ${DOCKER};
fi
before_cache:
- cp images/*.zip imgcache
after_success:
- sudo chmod -R 777 *
- cd images && zip -9 ${IMAGE_NAME}.zip ${IMAGE_NAME} && stat --printf="Compressed image size:%s\n" ${IMAGE_NAME}.zip
before_deploy:
# Set up git user name and tag this commit
- git config --local user.name "goldarte"
- git config --local user.email "goldartt@gmail.com"
deploy:
provider: releases
token: ${GITHUB_OAUTH_TOKEN}
file: ${IMAGE_NAME}.zip
skip_cleanup: true
on:
tags: true
draft: true
name: ${TRAVIS_TAG}
- stage: Build
name: "Native Kinetic build"
env:
- NATIVE_DOCKER=ros:kinetic-ros-base
before_script:
- docker pull ${NATIVE_DOCKER}
script:
- docker run --rm -v $(pwd):/root/catkin_ws/src/clover ${NATIVE_DOCKER} /root/catkin_ws/src/clover/builder/standalone-install.sh
- stage: Build
name: "Native Melodic build"
env:
- NATIVE_DOCKER=ros:melodic-ros-base
before_script:
- docker pull ${NATIVE_DOCKER}
script:
- docker run --rm -v $(pwd):/root/catkin_ws/src/clover ${NATIVE_DOCKER} /root/catkin_ws/src/clover/builder/standalone-install.sh
- stage: Build
name: "Documentation"
language: node_js
node_js:
- "10"
before_script:
- sudo sh -c "echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections"
- sudo apt update && sudo apt install -y calibre msttcorefonts
- npm install gitbook-cli -g
- gitbook fetch 3.2.3 && npm i npm@3.10.10 --prefix=~/.gitbook/versions/3.2.3/ # fixing https://travis-ci.org/github/CopterExpress/clover/jobs/766541125#L932
- npm install markdownlint-cli -g
- npm install svgexport -g
- gitbook -V
- markdownlint -V
script:
- markdownlint docs
- ./check_assets_size.py
- ./check_unused_assets.py
- gitbook install
- gitbook build
- for i in 1 2 3 4; do gitbook pdf ./ _book/clover.pdf && break || sleep 1; done
- sudo apt-get install ghostscript
- 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
- ls -lah _book/clover*.pdf
deploy:
provider: pages
local_dir: _book
skip_cleanup: true
token: ${GITHUB_OAUTH_TOKEN}
keep_history: true
target_branch: master
repo: CopterExpress/clover.coex.tech
fqdn: clover.coex.tech
verbose: true
on:
branch: master
- stage: Build
name: Editorconfig-lint
language: generic
before_script:
- wget https://github.com/okalachev/editorconfig-checker/releases/download/1.2.1-disable-spaces-amount/ec-linux-amd64
- chmod +x ec-linux-amd64
script:
- ./ec-linux-amd64 -spaces-after-tabs -e "roslib.js|ros3d.js|eventemitter2.js|draw.cpp|BinUtils.swift|\.idea|apps/android/app|blockly/|clover_blocks/programs/|highlight/|python.js|Assets.xcassets|test_parser_pass.txt|test_node_failure.txt|aruco_pose/vendor|\.stl|\.dxf|\.dae"
stages:
- Build
# More info there
# https://github.com/travis-ci/travis-ci/issues/6893
# https://docs.travis-ci.com/user/customizing-the-build/
# https://docs.travis-ci.com/user/deployment/releases
# https://docs.travis-ci.com/user/environment-variables/

View File

@@ -20,7 +20,7 @@ Clover drone is used on a wide range of educational events, including [Copter Ha
Preconfigured image for Raspberry Pi with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clover/releases).
![GitHub Workflow Status](https://img.shields.io/github/workflow/status/CopterExpress/clover/CI)
[![Build Status](https://travis-ci.org/CopterExpress/clover.svg?branch=master)](https://travis-ci.org/CopterExpress/clover)
![GitHub all releases](https://img.shields.io/github/downloads/CopterExpress/clover/total)
Image features:
@@ -38,10 +38,6 @@ API description for autonomous flights is available [on GitBook](https://clover.
For manual package installation and running see [`clover` package documentation](clover/README.md).
## Support
[![Telegram Support Chat](https://img.shields.io/endpoint?label=Support%20Chat&url=https%3A%2F%2Ftelegram-badge-4mbpu8e0fit4.runkit.sh%2F%3Furl%3Dhttps%3A%2F%2Ft.me%2FCOEXHelpDesk)](https://t.me/COEXHelpdesk)
## License
While the Clover platform source code is available under the MIT License, note, that the [documentation](docs/) is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

0
_book/file Normal file
View File

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<package format="2">
<name>aruco_pose</name>
<version>0.21.1</version>
<version>0.21.2</version>
<description>Positioning with ArUco markers</description>
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>

View File

@@ -154,7 +154,7 @@ systemctl enable monkey.service
echo_stamp "Install Node.js"
cd /home/pi
wget --no-verbose https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz
wget https://nodejs.org/dist/v10.15.0/node-v10.15.0-linux-armv6l.tar.gz
tar -xzf node-v10.15.0-linux-armv6l.tar.gz
cp -R node-v10.15.0-linux-armv6l/* /usr/local/
rm -rf node-v10.15.0-linux-armv6l/

View File

@@ -3,9 +3,8 @@
# Perform a "standalone install" in a Docker container
set -e
# Step 1: Install pip
apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 # https://github.com/osrf/docker_images/issues/535
apt-get update
apt-get install -y curl
apt update
apt install -y curl
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python ./get-pip.py
@@ -22,7 +21,7 @@ led_msgs:
stretch: ros-kinetic-led-msgs
buster: ros-melodic-led-msgs
EOF
apt-get update
apt update
rosdep update
# Step 2: Run rosdep to install all dependencies

View File

@@ -24,6 +24,7 @@ find_package(catkin REQUIRED COMPONENTS
tf2_ros
image_transport
cv_bridge
catkin_virtualenv
)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
@@ -132,6 +133,16 @@ generate_messages(
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
# Generate the virtualenv
catkin_generate_virtualenv(INPUT_REQUIREMENTS requirements.in)
# Make sure your python executables are installed using `catkin_install_python`:
catkin_install_python(
PROGRAMS
src/selfcheck.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
catkin_package(
# INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
@@ -248,11 +259,8 @@ target_link_libraries(${PROJECT_NAME}
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
install(FILES requirements.in
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
# Only install udev rules when building a Debian package
# FIXME: Other operating systems may have other prefixes

View File

@@ -11,7 +11,7 @@
<arg name="rangefinder_vl53l1x" default="true"/>
<arg name="led" default="true"/>
<arg name="blocks" default="false"/>
<arg name="rc" default="false"/>
<arg name="rc" default="true"/>
<arg name="simulator" default="false"/> <!-- flag that we are operating on a simulated drone -->

View File

@@ -36,7 +36,7 @@
posctl: { r: 50, g: 100, b: 220 }
offboard: { r: 220, g: 20, b: 250 }
low_battery: { threshold: 3.6, effect: blink_fast, r: 255, g: 0, b: 0 }
error: { effect: flash, r: 255, g: 0, b: 0, ignore: [ "[lpe] vision position timeout" ]}
error: { effect: flash, r: 255, g: 0, b: 0 }
</rosparam>
</node>
</launch>

View File

@@ -7,8 +7,7 @@
<arg name="respawn" default="true"/>
<arg name="distance_sensor_remap" default="rangefinder/range"/>
<arg name="usb_device" default="/dev/px4fmu"/>
<arg name="prefix" default="" unless="$(eval fcu_conn == 'usb')"/>
<arg name="prefix" default="rosrun clover waitfile $(arg usb_device)" if="$(eval fcu_conn == 'usb')"/>
<arg name="prefix" default="bash -c 'while [ ! -e $(arg usb_device) ]; do sleep 1; done; $0 $@'" if="$(eval fcu_conn == 'usb')"/>
<node pkg="mavros" type="mavros_node" name="mavros" launch-prefix="$(arg prefix)" required="false" clear_params="true" respawn="$(arg respawn)" unless="$(eval fcu_conn == 'none')" respawn_delay="1" output="screen">
<!-- UART connection -->

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<package format="2">
<name>clover</name>
<version>0.21.1</version>
<version>0.21.2</version>
<description>The Clover package</description>
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
@@ -15,6 +15,7 @@
<!-- Package format specifier version 2.0 allows specifying dependencies for both
build- and runtime in a single <depend> element -->
<build_depend>catkin_virtualenv</build_depend>
<depend>message_generation</depend>
<depend>roscpp</depend>
<depend>rospy</depend>
@@ -38,7 +39,8 @@
<depend>web_video_server</depend>
<depend>tf2_web_republisher</depend>
<depend>python-lxml</depend>
<exec_depend>python-pymavlink</exec_depend>
<test_depend>ros_pytest</test_depend>
<!-- <exec_depend>python-pymavlink</exec_depend> -->
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
@@ -46,5 +48,6 @@
<export>
<nodelet plugin="${prefix}/nodelet_plugins.xml" />
<!-- Other tools can request additional information be placed here -->
<pip_requirements>requirements.in</pip_requirements>
</export>
</package>

13
clover/requirements.in Normal file
View File

@@ -0,0 +1,13 @@
click>=7.1.2
docopt>=0.6.2
flask>=1.1.1
future>=0.18.2
geopy>=1.11.0
itsdangerous>=1.1.0
jinja2>=2.11.3
lxml>=4.6.3
markupsafe>=1.1.1
pymavlink>=2.4.14
smbus2>=0.3.0
vl53l1x>=0.0.5
werkzeug>=1.0.1

View File

@@ -1,5 +0,0 @@
flask==1.1.1
docopt==0.6.2
geopy==1.11.0
smbus2==0.3.0
VL53L1X==0.0.5

View File

@@ -12,7 +12,6 @@
#include <ros/ros.h>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
#include <clover/SetLEDEffect.h>
@@ -30,7 +29,6 @@ ros::Timer timer;
ros::Time start_time;
double blink_rate, blink_fast_rate, flash_delay, fade_period, wipe_period, rainbow_period;
double low_battery_threshold;
std::vector<std::string> error_ignore;
bool blink_state;
led_msgs::SetLEDs set_leds;
led_msgs::LEDStateArray state, start_state;
@@ -276,10 +274,6 @@ void handleMavrosState(const mavros_msgs::State& msg)
void handleLog(const rosgraph_msgs::Log& log)
{
if (log.level >= rosgraph_msgs::Log::ERROR) {
// check if ignored
for (auto const& str : error_ignore) {
if (log.msg.find(str) != std::string::npos) return;
}
notify("error");
}
}
@@ -308,7 +302,6 @@ int main(int argc, char **argv)
nh_priv.param("rainbow_period", rainbow_period, 5.0);
nh_priv.param("notify/low_battery/threshold", low_battery_threshold, 3.7);
nh_priv.param("notify/error/ignore", error_ignore, {});
ros::service::waitForService("set_leds"); // cannot work without set_leds service
set_leds_srv = nh.serviceClient<led_msgs::SetLEDs>("set_leds", true);

View File

@@ -152,7 +152,7 @@ private:
cv::Point2d shift = cv::phaseCorrelate(prev_, curr_, hann_, &response);
// Publish raw shift in pixels
geometry_msgs::Vector3Stamped shift_vec;
static geometry_msgs::Vector3Stamped shift_vec;
shift_vec.header.stamp = msg->header.stamp;
shift_vec.header.frame_id = msg->header.frame_id;
shift_vec.vector.x = shift.x;
@@ -179,7 +179,7 @@ private:
double flow_y = atan2(points_undist[0].y, focal_length_y);
// // Convert to FCU frame
geometry_msgs::Vector3Stamped flow_camera, flow_fcu;
static geometry_msgs::Vector3Stamped flow_camera, flow_fcu;
flow_camera.header.frame_id = msg->header.frame_id;
flow_camera.header.stamp = msg->header.stamp;
flow_camera.vector.x = flow_y; // +y means counter-clockwise rotation around Y axis
@@ -198,7 +198,7 @@ private:
if (calc_flow_gyro_) {
try {
auto flow_gyro_camera = calcFlowGyro(msg->header.frame_id, prev_stamp_, msg->header.stamp);
geometry_msgs::Vector3Stamped flow_gyro_fcu;
static geometry_msgs::Vector3Stamped flow_gyro_fcu;
tf_buffer_->transform(flow_gyro_camera, flow_gyro_fcu, fcu_frame_id_);
flow_.integrated_xgyro = flow_gyro_fcu.vector.x;
flow_.integrated_ygyro = flow_gyro_fcu.vector.y;
@@ -206,7 +206,7 @@ private:
} catch (const tf2::TransformException& e) {
// Invalidate previous frame
prev_.release();
goto publish_debug;
return;
}
}
@@ -218,10 +218,6 @@ private:
flow_.quality = (uint8_t)(response * 255);
flow_pub_.publish(flow_);
prev_ = curr_.clone();
prev_stamp_ = msg->header.stamp;
publish_debug:
// Publish debug image
if (img_pub_.getNumSubscribers() > 0) {
// publish debug image
@@ -235,12 +231,15 @@ publish_debug:
}
// Publish estimated angular velocity
geometry_msgs::TwistStamped velo;
static geometry_msgs::TwistStamped velo;
velo.header.stamp = msg->header.stamp;
velo.header.frame_id = fcu_frame_id_;
velo.twist.angular.x = flow_fcu.vector.x / integration_time.toSec();
velo.twist.angular.y = flow_fcu.vector.y / integration_time.toSec();
velo.twist.angular.x = flow_.integrated_x / integration_time.toSec();
velo.twist.angular.y = flow_.integrated_y / integration_time.toSec();
velo_pub_.publish(velo);
prev_ = curr_.clone();
prev_stamp_ = msg->header.stamp;
}
}

View File

@@ -712,7 +712,7 @@ bool serve(enum setpoint_type_t sp_type, float x, float y, float z, float vx, fl
}
if (sp_type == VELOCITY) {
Vector3Stamped vel;
static Vector3Stamped vel;
vel.header.frame_id = frame_id;
vel.header.stamp = stamp;
vel.vector.x = vx;

View File

@@ -53,7 +53,7 @@ void publishZero(const ros::TimerEvent& e)
}
ROS_INFO_THROTTLE(10, "publish zero");
geometry_msgs::PoseStamped zero;
static geometry_msgs::PoseStamped zero;
zero.header.frame_id = local_frame_id;
zero.header.stamp = e.current_real;
zero.pose.orientation.w = 1;

View File

@@ -1,9 +0,0 @@
#!/usr/bin/env bash
# $ ./waitfile <file> <command> <args...>
# wait until <file> appears and then invoke <command> with <args>
echo "wait for file $1"
while [ ! -e "$1" ]; do sleep 1; done;
echo "file $1 appeared"
exec "${@:2}"

View File

@@ -1 +0,0 @@
/tmp/clover.err

View File

@@ -9,7 +9,6 @@
<li><a href="viz.html">View 3D visualization</a> (<code>ros3djs</code>)</li>
<li><a href="aruco_map.html">3D visualization for markers map</a> (<code>ros3djs</code>)</li>
<li><a href="../clover_blocks/">Blocks programming</a> (<code>Blockly</code>)</li>
<li><a href="clover.err">Clover console</a> (<code>/tmp/clover.err</code>)</li>
</ul>
<div class="version"></div>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<package format="2">
<name>clover_blocks</name>
<version>0.21.1</version>
<version>0.21.2</version>
<description>Blockly programming support for Clover</description>
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
<license>MIT</license>

View File

@@ -11,8 +11,7 @@
from __future__ import print_function
import rospy
import os, sys
import traceback
import os
import threading
import re
import uuid
@@ -117,12 +116,7 @@ def run(req):
rospy.loginfo('Program forced to stop')
except Exception as e:
rospy.logerr(str(e))
traceback.print_exc()
etype, value, tb = sys.exc_info()
fmt = traceback.format_exception(etype, value, tb)
fmt.pop(1) # remove 'clover_blocks' file frame
exc_info = ''.join(fmt)
error_pub.publish(str(e) + '\n\n' + exc_info)
error_pub.publish(str(e))
rospy.loginfo('Program terminated')
running_lock.release()

View File

@@ -1,6 +1,6 @@
<package format="2">
<name>clover_description</name>
<version>0.21.1</version>
<version>0.21.2</version>
<description>The clover_description package provides URDF models of the Clover series of quadcopters.</description>
<maintainer email="sfalexrog@gmail.com">Alexey Rogachevskiy</maintainer>

View File

@@ -1,6 +1,6 @@
<package format="2">
<name>clover_simulation</name>
<version>0.21.1</version>
<version>0.21.2</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: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -66,7 +66,7 @@ The set of services and topics is similar to the regular set in [simple_offboard
An example of a program that controls the copter by position using the `navigate` and `set_mode` services:
```cpp
// Connecting libraries for working with rosserial
// Connecting libraries for working with rosseral
#include <ros.h>
// Connecting Clover and MAVROS package message header files

View File

@@ -134,7 +134,7 @@ navigate(x=2, y=2, z=2, speed=1, frame_id='aruco_map')
Starting with the [image](image.md) version 0.18, the drone also can fly relative to a marker in the map, even if it is not currently visible. Like with [single-marker navigation](aruco_marker.md#working-with-detected-markers), this works by setting the frame_id parameter to aruco_ID, where ID is the desired marker number.
The following code will move the drone to the point 1 meter above the center of marker 5:
The folloding code will move the drone to the point 1 meter above the center of marker 5:
```python
navigate(frame_id='aruco_5', x=0, y=0, z=1)

View File

@@ -2,8 +2,6 @@
The GNSS receiver **COEX GPS** is compatible with the [COEX Pix](coex_pix.md) flight controller. This receiver comes with a COEX Clover Drone Kit.
> **Hint** The source files of the COEX GPS board are [published](https://github.com/CopterExpress/hardware/tree/master/COEX%20GPS) under the CC BY-NC-SA license.
## Port pinouts
### Top view

View File

@@ -4,8 +4,6 @@
Board size: 35x35 mm.
> **Hint** The source files of the COEX PDB board are [published](https://github.com/CopterExpress/hardware/tree/master/COEX%20PDB) under the CC BY-NC-SA license.
## Port pinouts
### Top view

View File

@@ -2,8 +2,6 @@
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.
## Revision 1.1
### Physical specs

View File

@@ -1,5 +1,5 @@
# Events
Clover is being used in a lot of educational events and competitions, such as WorldSkills, NTI Olympics, Copter Hack, Innopolis Open Robotics, etc.
Clover is being used in a lot of educational events and competitions, such as WorldSkills, NTI Olypics, Copter Hack, Innopolis Open Robotics, etc.
This section contains articles written specifically for a particular event.

View File

@@ -34,7 +34,7 @@
<img src="../assets/fpv/fpv_9.png" width=300 class="zoom border">
</div>
> **Hint** Check what you are wearing shrink tubes before soldering the wires.
> **Hint** Сheck what you are wearing shrink tubes before soldering the wires.
6. Solder the JST male connector to the transmitter.

View File

@@ -98,7 +98,7 @@ Main strip control methods:
+ `numPixels()` returns the number of pixels in the strip. Convenient for whole strip operations.
+ `setPixelColor(pos, color)` sets the pixel color at `pos` to `color`. Color should be a 24-bit value, where the first 8 bits are for the red channel, the next 8 bits are for the green channel, and the last 8 bits are for the blue channel. You may use the `Color(red, green, blue)` convenience function to convert colors to this format. Each color value should be an integer in the \[0..255\] range, where 0 means zero brightness and 255 means full brightness.
+ `SetPixelColorRGB(pos, red, green, blue)` sets the pixel at `pos` to the color value with components `red`, `green` and `blue`. Each component value should be an integer in the \[0..255\] range, where 0 means zero brightness and 255 means full brightness.
+ `SetPixelColorRGB(pos, red, green, blue)` sets the pixel at `pos` to the color value with components `red`, `green` and `blue`. Each component value shoule be an integer in the \[0..255\] range, where 0 means zero brighness and 255 means full brightness.
+ `show()` updates the strip state. Any changes to the strip state are only pushed to the actual strip after calling this method.
## Does it have to be this way?

View File

@@ -268,6 +268,12 @@ Flying forward (relative to the drone) at the speed of 1 m/s:
set_velocity(vx=1, vy=0.0, vz=0, frame_id='body')
```
One possible way of flying in a circle:
```python
set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='body')
```
### set_attitude
Set pitch, roll, yaw and throttle level (similar to [the `STABILIZED` mode](modes.md)). This service may be used for lower level control of the drone behavior, or controlling the drone when no reliable data on its position is available.

View File

@@ -15,7 +15,7 @@ Password: `raspberry`.
For SSH access from Windows, you may use [PuTTY] (https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html).
You can also gain SSH access from your smart-phone using the [Termius](https://www.termius.com) app.
You can also gain SSH access from your smart-phone using the [Termius] app (https://www.termius.com).
Read more: https://www.raspberrypi.org/documentation/remote-access/ssh/README.md

View File

@@ -1,6 +1,6 @@
# Подключение регуляторов 4in1
## Распиновка платы регуляторов 4in1
## Распиновка платы реуляторов 4in1
Одним цветом выделены соответствующие фазные провода (рис. 1a) и управляющий ими сигнал (рис. 1b).
@@ -10,7 +10,7 @@
На рис. 2a указана распиновка гребенки:
* **SIGNAL** подключение регуляторов. Каждый пин имеет свой собственный сигнал. На 5 и 6 сигнал можно получать ШИМ сигнал (Например, можно подключить сервопривод).
* **SIGNAL** подключение регуляторов. Каждый пин имет свой собственный сигнал. На 5 и 6 сигнал можно получать ШИМ сигнал (Например, можно подключить сервопривод).
* **GND** земля полетного контроллера. Единая шина на всех пинах GND (отмечены черным).
* 1, 2, 3, 4 порты для подключения ESC.
* 1, 2 - порты расширения выходного ШИМ сигнала (настраиваются в QGroundControl, также могут использоваться для управления гексакоптером).
@@ -23,7 +23,7 @@
## Иллюстрация подключения, исходя из текущей ориентации платы регуляторов 4in1
Используя рис. 1a, 1b, 2a, 2b необходимо сопоставить каждому мотору свой сигнал управления и подключить в соответствии с порядком нумерации моторов Pixracer.
Используя рис. 1a, 1b, 2a, 2b необходимо сопоставить каждому мотору свой сигнал управления и подключить в соотвествии с порядком нумерации моторов Pixracer.
Например, мотор М3, вращающийся против часовой стрелки (верхний левый угол) управляется сигналом S4 (зеленый провод). Подключается в порт 3.

View File

@@ -86,7 +86,6 @@
* [Установка FPV (Клевер 3)](fpv.md)
* [Магнитный захват](magnetic_grip.md)
* [Механический захват](mechanical_grip.md)
* [Груз для магнитного захвата](magnetic_grip_load.md)
* [Сборка шаровой защиты](sphere_guard.md)
* [Управление в режиме тренера](trainer_mode.md)
* [Техника лужения](tinning.md)
@@ -98,7 +97,7 @@
* [Светодиодная лента (legacy)](leds_old.md)
* [Вклад в Клевер](contributing.md)
* [Переход на версию 0.20](migrate20.md)
* [COEX DuoCam](duocam.md)
* [COEX Duocam](duocam.md)
* [Виртуальная MAVLink-камера](duocam_mavlink.md)
* [Мероприятия](events.md)
* [CopterHack-2021](copterhack2021.md)

View File

@@ -76,7 +76,7 @@ for(int i=0; i<8; i++) {
Пример программы, контролирующей коптер по позиции, с использованием сервисов `navigate` и `set_mode`:
```cpp
// Подключение библиотек для работы с rosserial
// Подключение библиотек для работы с rosseral
#include <ros.h>
// Подключение заголовочных файлов сообщений пакета clover и MAVROS

View File

@@ -6,7 +6,7 @@
## Создание поля
<div style="display: flex; flex-direction: row"><img src="../assets/fieldsetup.PNG" alt=""><div style="padding-left: 20px">Перед началом работы надо задать размеры поля. Оно нужно только для удобства. Для перемещения по "полотну" используйте тачпад или колёсико мыши для перемещения по карте. При использовании мыши зажмите Shift для перемещения в горизонтальном направлении и Ctrl для увеличения/уменьшения поля.</div></div>
<div style="display: flex; flex-direction: row"><img src="../assets/fieldsetup.PNG" alt=""><div style="padding-left: 20px">Перед началом работы надо задать размеры поля. Оно нужно только для удобства. Для перемения по "полотну" испольнуйте тачпад или колёсико мыши для перемещения по карте. При использовании мыши зажмите Shift для перемещения в горизонтальном направлении и Ctrl для увеличения/уменьшения поля.</div></div>
## Инструмент творения

View File

@@ -204,7 +204,7 @@
![Постпаячная проверка](../assets/zapPDBtest.jpg)
Чтобы припой аккуратно заполнил всю площадку, необходимо её прогреть. Для этого нужно удерживать жало паяльника на контактной площадке в течение 2 сек (или больше, если потребуется)
Чтобы припой аккуратно заполнил всю площадку, необходимо её прогреть. Для этого нужно удерживать жало паяльника на контактной плащадке в течение 2 сек (или больше, если потребуется)
#### Пайка силового разъема питания XT60

View File

@@ -393,7 +393,7 @@
Установите 4 пропеллера, согласно [схеме вращения](#проверка-направления-вращения-моторов). При установке пропеллеров АКБ должна быть отключена.
При установке будьте внимательны, чтобы пропеллер не был перевернут. На лицевой стороне пропеллера имеется маркировка его характеристик, а также направление вращения, которое должно совпадать с направлением вращения моторов.
При установке будте внимательны, чтобы пропеллер не был перевернут. На лицевой стороне пропеллера имеется маркировка его характеристик, а также направление вращения, которое должно совпадать с направлением вращения моторов.
<div class="image-group">
<img src="../assets/assembling_clever4/final_2.png" width=300 class="zoom border">
@@ -413,7 +413,7 @@
<img src="../assets/assembling_clever4/final_1.png" width=300 class="zoom border center">
Обязательно установите и настройте индикатор напряжения перед полетом, чтобы не переразрядить аккумулятор. Для настройки индикатора используйте кнопку расположенную в его основании. Отображаемые цифры во время настройки обозначают минимально возможное напряжение в каждой [ячейке](glossary.md#ячейка--банка-акб) аккумулятора, рекомендуемое значение **3.5**.
Обязательно установите и настройте индикатор напряжения перед полетом, чтобы не переразрядить аккумулятор. Для настройки индикатора используйте конпку расположенную в его основании. Отображаемые цифры во время настройки обозначают минимально возможное напряжение в каждой [ячейке](glossary.md#ячейка--банка-акб) аккумулятора, рекомендуемое значение **3.5**.
> **Info** Звуковая индикация означает, что ваш аккумулятор разряжен и его нужно зарядить.

View File

@@ -47,7 +47,7 @@ git clone https://github.com/Tennessium/HUEX
Перед началом работы с системой необходимо перевести коптеры в режим клиента и подключить к сети WiFi. Вы можете воспользоваться [этим мануалом](network.md#переключение-адаптера-в-режим-клиента)
Однако, для упрощения развертывания системы на нескольких коптерах, рекомендуется использование нашего скрипта, лежащего в папке *copter/setup/*
Однако, для упрощения развертывания системы на нескольких коптреах, рекомендуется использование нашего скрипта, лежащего в папке *copter/setup/*
- Перейдите в папку
@@ -91,7 +91,7 @@ pip install -r requirements.txt
В файле *copter/consts.py* укажите IP-адрес сервера.
Для запуска основного скрипта воспользуйтесь нашим systemd-сервисом.
Для запуска основного скрипта воспользуйтсь нашим systemd-сервисом.
```bash
sudo systemctl enable /home/pi/HUEX/clever/setup/taxi.service
@@ -108,7 +108,7 @@ sudo systemctl stop taxi.service
## Веб-интерфейс центра управления полётами
<img src="../assets/cup.png" alt=""/>
В данном веб интерфейсе можно следить за полётами всех дронов на карте (масштабировать с помощью колёсика, передвигать с помощью Alt). При нажатии на лебедя в правом верхнем углу все коптеры аварийно садятся, А при нажатии на значок "обновить" все коптеры автоматически удаляются, что приводит к удалению всех команд и посадке активных на текущий момент коптеров.
В данном веб интерфейсе можно следить за полётами всех дронов на карте (масштабировать с помощью колёсика, передвигаять с помощью Alt). При нажатии на лебедя в правом верхнем углу все коптеры аварийно садятся, А при нажатии на значок "обновить" все коптеры автоматически удаляются, что приводит к удалению всех комманд и посадке активных на текущий момент коптеров.
С помощью инструментов в правом нижнем углу можно строить новые основания и рёбра.
## Веб-интерфейс заказа

View File

@@ -69,7 +69,7 @@
* *body* координаты относительно коптера: вперед (*forward*), влево (*left*), вверх (*up*).
* *markers map* система координат, связанная с [картой ArUco-маркеров](aruco_map.md).
* *marker* система координат, связанная с [ArUco-маркером](aruco_marker.md); появляется поле для ввода ID маркеа.
* *marker* система координта, связанная с [ArUco-маркером](aruco_marker.md); появляется поле для ввода ID маркеа.
* *last navigate target* координаты относительно последней заданной точки для навигации.
* *map* локальная система координат коптера, связана с местом его инициализации.

View File

@@ -66,7 +66,7 @@ sudo python setup.py install
![asd](../assets/cam_calib3.png)
Если перекрестия были распознаны правильно, нажмите на клавишу ***Add***, и перейдите к получению новых фотографий. В противном же случае, если перекрестия были распознаны некорректно, пропустите данную фотографию при помощи клавиши ***Skip***.
Если перекрестия были распознаныы правильно, нажмите на клавишу ***Add***, и перейдите к получению новых фотографий. В противном же случае, если перекрестия были распознаны некорректно, пропустите данную фотографию при помощи клавиши ***Skip***.
>В большинстве случаев найденные углы будут подсвечиваться разными цветами, но иногда подсветка будет становиться красной. это происходит в том случае, если углы распознаны, но неточно.
@@ -183,7 +183,7 @@ Path: # Путь до папки с изображениями
![asd](../assets/img2.jpg)
Исправленные изображения:
Иcправленные изображения:
![asd](../assets/calibresult.jpg)

View File

@@ -1,6 +1,6 @@
# clever-show
Программное обеспечение для запуска шоу дронов под управлением Raspberry Pi с пакетом COEX [Clover](https://github.com/CopterExpress/clever) и полётного контроллера с прошивкой PX4.
Програмное обеспечение для запуска шоу дронов под управлением Raspberry Pi с пакетом COEX [Clover](https://github.com/CopterExpress/clever) и полётного контроллера с прошивкой PX4.
Создайте анимацию в Blender, сконвертируйте её в полётные пути дронов, настройте дроны и запустите своё собственное шоу дронов!

View File

@@ -2,8 +2,6 @@
ГНСС-приемник **COEX GPS** совместим с полетным контроллером [COEX Pix](coex_pix.md). Этот приемник поставляется с наборами COEX Клевер 4 Pro.
> **Hint** Исходные файлы платы COEX GPS [выложены](https://github.com/CopterExpress/hardware/tree/master/COEX%20GPS) в открытый доступ под лицензией CC BY-NC-SA.
## Схемы расположения контактов
### Вид сверху

View File

@@ -4,8 +4,6 @@
Габаритные размеры платы: 35x35 мм.
> **Hint** Исходные файлы платы COEX PDB [выложены](https://github.com/CopterExpress/hardware/tree/master/COEX%20PDB) в открытый доступ под лицензией CC BY-NC-SA.
## Схемы расположения контактов
### Вид сверху

View File

@@ -2,8 +2,6 @@
Полетный контроллер **COEX Pix** является модифицированным аналогом полетного контроллера [Pixracer](https://docs.px4.io/v1.9.0/en/flight_controller/pixracer.html). Этот полетный контроллер поставляется с наборами **Клевер 4** и далее.
> **Hint** Исходные файлы полетного контроллера COEX Pix [выложены](https://github.com/CopterExpress/hardware/tree/master/COEX%20Pix) в открытый доступ под лицензией CC BY-NC-SA.
## Ревизия 1.1
### Характеристики
@@ -31,7 +29,7 @@
* *I2C* (JST-GH 4 pin) разъем для подключения поддерживаемых I2C устройств.
* *PWR* (JST-GH 6 pin) разъем для подключения питания с платы COEX PDB или аналогичной, датчиков напряжения и тока.
* *RC IN* (JST-GH 4 pin) разъем для подключения радиоприемника аппаратуры радиоуправления, канала для * снятия показаний RSSI. Поддерживаемые RC протоколы PPM и SBUS.
* Разъем Micro USB для подключения к ПК для настройки и коммуникации по протоколу USB 2.0/1.1
* Разьем Micro USB для подключения к ПК для настройки и коммуникации по протоколу USB 2.0/1.1
* Слот для карты памяти MicroSD, до 32 ГБ.
* Серворазъемы для подключения контроллеров моторов и других устройств.

View File

@@ -10,12 +10,8 @@
> **Warning** Протокол взаимодействия находится в процессе модификации. В новых версиях планируется избавиться от прямой отправки значений параметров и их количества от `duocam-mavlink` к QGroundControl.
<!-- markdownlint-disable MD044 -->
`duocam-camera` и `duocam-mavlink` обмениваются данными с помощью очередей POSIX. Имена очередей и формат сообщений доступен в репозитории [duocam-common](https://github.com/CopterExpress/duocam-common).
<!-- markdownlint-enable MD044 -->
Для объединения блоков, взаимодействующих через MAVLink, можно использовать любой MAVLink-коммутатор/маршрутизатор, который либо позволяет отключить таблицу коммутации, либо заполняет её по схеме *MAVLink ID:Component ID* (например, `cmavnode`, `mavlink-fast-switch`, `mavlink-switch`).
> **Warning** При использовании `mavlink-fast-switch` требуется использовать `mavlink-serial-bridge`, либо любой другой мост для передачи MAVLink из последовательного порта в UDP, так как `mavlink-fast-switch` работает только с UDP.

View File

@@ -82,7 +82,7 @@
Прежде чем начинать полет, необходимо перевести коптер в состояние *Armed*.
* Состояние *Armed* моторы вращаются в соответствии с положением стика газа, коптер готов к полету.
* Состояние *Armed* моторы вращаются в соответсвии с положением стика газа, коптер готов к полету.
* Состояние *Disarmed* моторы не вращаются, коптер не реагирует на стик газа.
По умолчанию коптер находится в состоянии *Disarmed* и переходит в него в случае если вы долго не взлетаете.

View File

@@ -89,7 +89,7 @@
## Воздушная подушка и управление в ней
Понятие *воздушной подушки* очень важно во всей летательной технике. Сама по себе воздушная подушка является зоной повышенного давления, возникающая за счет воздуха пропускаемого через пропеллеры. Данная область характеризуется турбулентностями и воздушными потоками влияющими на полет коптера.
Понятие *воздушной подушки* очень важно во всей летательной технике. Сама по себе воздушная подушка является зоной повышенного давления, возникающая за счет воздуха пропускаемого через пропеллеры. Данная область харрактеризуется турбелентностями и воздушными потоками влияющими на полет коптера.
Пилоты стараются избегать полетов в воздушной подушке, но на ее границе имеется стабильная область, в которой коптер может зависнуть при минимальном значении газа. В таком случае создается ощущение, что коптер "сел" на воздушную подушку.
@@ -103,9 +103,9 @@
Аналогично с предыдущими упражнениями перед взлетом выполните [следующие действия](#предполетные-проверки).
**Упражнение №1**. Поднимайте стик газа, пока коптер не пролетит воздушную подушку и не окажется над ней (высота от пола ~25-30 см, для коптера Клевер 4). Коптер не должен подниматься вверх или проваливаться вниз, высота полета должна стабилизироваться. Как и в предыдущем упражнении корректируйте позицию коптера по осям X, Y с помощью стика крена и тангажа. В результате коптер должен зависнуть в одной точке с небольшими покачиваниями по сторонам. Удерживайте коптер 30-40 секунд.
**Упражнение №1**. Поднимайте стик газа, пока коптер не пролетит воздушную подушку и не окажется над ней (высота от пола ~25-30 см, для коптера Клевер 4). Коптер не должен подниматься вверх или проваливаться вниз, высота полета должа стабилизироваться. Как и в предыдущем упражнении корректируйте позицию коптера по осям X, Y с помощью стика крена и тангажа. В результате коптер должен зависнуть в одной точке с небольшими покачиваниями по сторонам. Удерживайте коптер 30-40 секунд.
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Далее пролетите по квадрату со стороной 1 м сначала по часовой стрелке, потом против часовой стрелки. Повторите траекторию в каждую сторону 2-3 раза.
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Далее пролетите по квадрату со стороной 1 м сначала по часовой стрелке, потом против часовой стрели. Повторите траекторию в каждую сторону 2-3 раза.
**Упражнение №3**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Попробуйте описать коптером круг с диаметром 1 м, по часовой и против часовой стрелки. Повторите траекторию в каждую сторону 2-3 раза.
@@ -126,7 +126,7 @@
**Упражнение №1**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Описывайте коптером круг вокруг себя, на расстоянии 2-3 м, при этом поворачивая его таким образом, чтобы задняя часть коптера всегда была направлен на вас. Выполняйте упражнение по часовой стрелке и против. Повторите упражнение 4-5 раз.
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Обойдите коптер вокруг, при этом поворачивая его таким образом, чтобы задняя часть была направлена на вас. Обходите коптер по часовой стрелке и против. Повторите упражнение 4-5 раз.
**Упражнение №2**. Поднимите коптер на воздушную подушку и стабилизируйте его в одной точке. Обойдите коптер вокруг, при этом поворачивая его таким образом, чтобы задяя часть была направлена на вас. Обходите коптер по часовой стрелке и против. Повторите упражнение 4-5 раз.
> **Caution** Дополнительные упражнения значительно сложнее обычных и не обязательны к выполнению. Приступайте к ним, только если вы уже уверенно управляете коптером.
@@ -136,7 +136,7 @@
## Свободный полет
Если вы можете выполнить каждое из описанных выше упражнений, скорее всего, вы уже умеете свободно взлетать и управлять коптером. Далее будут представлены некоторые упражнения для закрепления полученных навыков.
Если вы можете выполнить каждое из описанных выше упражнений, скорее всего, вы уже умеете свободно взлетать и управлять коптером. Далее будут представленны некоторые упражнения для закрепления полученных навыков.
Упражнения:

View File

@@ -39,7 +39,7 @@ ESC имеет прошивку, которая определяет особе
## Ячейка / "банка" АКБ
Составная часть АКБ, непосредственный источник тока. Обычно АКБ для БПЛА состоят из нескольких (26) ячеек, соединенных последовательно. Максимальное напряжение одной Li-po ячейки 4.2 В; общее напряжение АКБ равно суммарному напряжению ячеек. Количество ячеек обозначается буквой *S*, например: *2S*, *3S*, *4S*.
Составная часть АКБ, непосредственный источник тока. Обычно АКБ для БПЛА состоят из нескольких (26) ячеек, соединенных последовательно. Максимальное напряжение одной Li-po ячейки 4.2 В; общее напряжение АКБ равно суммарному напряжению ячеек. Количество ячеек обозночается буквой *S*, например: *2S*, *3S*, *4S*.
В Клевере обычно применяются аккумуляторы *3S*.
@@ -55,7 +55,7 @@ ESC имеет прошивку, которая определяет особе
**2\.** Совокупность данных о состоянии аппарата, так таковая (высота, ориентация, глобальные координаты и т. д.).
**3\.** Система для передачи данных о состоянии аппарата или команд для него по воздуху. Примеры: радиомодемы (RFD900, 3DR Radio Modem), Wi-Fi модули (ESP-07). Raspberry Pi на Клевере также может быть использован в качестве модуля для телеметрии: [использование QGroundControl через Wi-Fi](gcs_bridge.md).
**3\.** Система для передачи данных о состоянии аппарата или команд для него по воздуху. Примеры: радиомодемы (RFD900, 3DR Radio Modem), Wi-Fi модули (ESP-07). Raspberry Pi на Клевере также может быть использован в качестве модуля для телемерии: [использование QGroundControl через Wi-Fi](gcs_bridge.md).
## Арминг
@@ -73,7 +73,7 @@ Armed состояние коптера готовности к полету
## Образ SD-карты
Полная копия содержимого SD-карты, представленная в виде файла. Такой файл можно загрузить на SD-карту, воспользовавшись специальной утилитой, например Etcher. SD-карта, вставленная в Raspberry Pi является единственным его долговременным хранилищем и полностью определяет, что он будет делать.
Полная копия содержимого SD-карты, представленная в виде файла. Такой файл можно зазгрузить на SD-карту, воспользовавшись специальной утилитой, например Etcher. SD-карта, вставленная в Raspberry Pi является единственным его долговременным хранилищем и полностью определяет, что он будет делать.
Конструктор Клевер включает в себя [рекомендованный образ для SD-карты](image.md).

View File

@@ -203,7 +203,7 @@ lirc.deinit()
<img src="../assets/IR_transmitter.png" height="200px" alt="IR transmitter scheme">
> **Hint** В случае, если вы используете готовую плату ИК-передатчика, подключите ее к нужным пинам Raspberry в соответствии с маркировкой пинов, точно так же как и с приемником.
> **Hint** В случае, если вы используете готовую плату ИК-передатчика, подключите ее к нужным пинам Raspberry в соответсвии с маркировкой пинов, точно так же как и с приемником.
Если все правильно подключено, то можно отправлять сигналы заданные на моменте [настройки пульта](#remote_control), используя команду:

View File

@@ -1,53 +0,0 @@
# Груз с подставкой для магнитного захвата
Груз с подставкой для использования в работе с квадрокоптером Клевер 4 WS.
Грузом для магнитного захвата является некая геометрическая фигура, которая имеет внутренний и внешний конус и имеет форму стакана с вырезами для облегчения.
## Технические характеристики
### Груз в сборе с подставкой и пластиной для зацепа магнитного захвата
Груз в сборе с подставкой и пластиной для зацепа магнитного захвата выглядит следующим образом:
<img src="../assets/grip_load/assembly.png" width=300 class="zoom center">
### Подставка под груз для магнитного захвата
Подставка под груз для магнитного захвата имеет разборную конструкцию и состоит из двух частей.
Первая - это низ:
<img src="../assets/grip_load/ball_stand.png" width=300 class="zoom center">
Вторая - это дополнение, чтобы добрать необходимую высоту для точного позиционирования груза на подставке:
<img src="../assets/grip_load/addition.png" width=300 class="zoom center">
В сборе это выглядит так:
<img src="../assets/grip_load/cup_stand.png" width=300 class="zoom center">
### Груз для подставки
Сам груз отдельно от подставки выглядит следующим образом:
<img src="../assets/grip_load/cup.png" width=300 class="zoom center">
Вес при 100% заполнении из материала PETG при печати на 3D принтере составляет 35 грамм.
Высота груза 72.5 миллиметров.
## Фиксация груза на захвате
Для того, чтобы груз держался на магнитном захвате, на его верхнюю часть приклеивается комплектная пластина, и в сборке это выглядит следующим образом:
<img src="../assets/grip_load/cup_with_plate.png" width=300 class="zoom center">
На дно подставки необходимо приклеить двусторонний скотч для дальнейшей фиксации подставки на используемой в дальнейшем поверхности:
<img src="../assets/grip_load/stand_tape.png" width=300 class="zoom center">
В случае использования нижней части с механическим захватом также необходимо приклеить к её основанию двусторонний скотч, чтобы подставку не сдувало воздушным потоком от пропеллеров. В сборке с теннисным мячиком это выглядит следующим образом:
<img src="../assets/grip_load/stand_with_ball.png" width=300 class="zoom center">

View File

@@ -2,7 +2,7 @@
Основная документация: https://mavlink.io/en/.
MAVLink – это протокол для организации связи между автономными летательными и транспортными системами (дронами, самолетами, автомобилями). Протокол MAVLink лежит в основе взаимодействия между Pixhawk и Raspberry Pi.
MAVLink – это протокол для организации связи между автономными летательными и транспортными системами (дронами, самолетами, автомобилями). Проктол MAVLink лежит в основе взаимодействия между Pixhawk и Raspberry Pi.
В Клевер включено 2 обертки над этим протоколом: [MAVROS](mavros.md) и [simple_offboard](simple_offboard.md).
@@ -33,7 +33,7 @@ MAVLink-сообщение это отдельная "порция" данных
### Система, компонент системы
Каждое устройство (дрон, базовая станция и т. д.) имеет ID в сети MAVLink. В PX4 MAVLink ID меняется с помощью параметра `MAV_SYS_ID`. Каждое MAVLink сообщение содержит поле с ID системы-отправителя. Кроме того, некоторые сообщения (например, `COMMAND_LONG`) содержат также ID системы-получателя.
Каждое устройство (дрон, базовая станция и т. д.) имеет ID в сети MAVLink. В PX4 MAVLink ID менятся с помощью параметра `MAV_SYS_ID`. Каждое MAVLink сообщение содержит поле с ID системы-отправителя. Кроме того, некоторые сообщения (например, `COMMAND_LONG`) содержат также ID системы-получателя.
Помимо ID систем, сообщения могут содержать ID компонента-отправителя и компонента-получателя. Примеры компонентов системы: полетный контроллер, внешняя камера, управляющий бортовой компьютер (Raspberry Pi в случае Клевера) и т. д.
@@ -171,7 +171,7 @@ MAVLink-сообщение это отдельная "порция" данных
<td><code>signature</code></td>
<td>13 байт</td>
<td>Сигнатура (опционально)</td>
<td>Позволяет убедиться, что пакет не был скомпрометирован.
<td>Позволяет убедиться, что пакет не был скомпроментирован.
Обычно не используется.</td>
</tr>
</table>

View File

@@ -48,8 +48,8 @@ MAVROS подписывается на определенные ROS-топики
### Топики для посылки raw-пакетов
`/mavros/setpoint_raw/local` — отправка пакета [SET\_POSITION\_TARGET\_LOCAL\_NED](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_LOCAL_NED). Позволяет установить целевую позицию /целевую скорость и целевое рысканье/угловую скорость по рысканью. Выбор устанавливаемых величин осуществляется с помощью поля `type_mask`.
`/mavros/setpoint_raw/local` — отправка пакета [SET\_POSITION\_TARGET\_LOCAL\_NED](https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_LOCAL_NED). Позволяет установить целевую позицию/целевую скорость и целевое рысканье/угловую скорость по рысканью. Выбор устанавливаемых величин осуществляется с помощью поля `type_mask`.
`/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)\).

View File

@@ -32,7 +32,7 @@
<td><img src="../assets/dxf/4.2/grab_deck.png"></td>
<td>
<b>Дека захвата</b>.<br>
Функция: Дека для установки захватов и внешней периферии (камера, дальномер).<br>
Функция: Дека для установки захватов и внешней переферии(камера, дальномер).<br>
Материал: Монолитный поликарбонат 2мм.<br>
Количество: 1 шт.
</td>

View File

@@ -35,7 +35,7 @@
Регулятор угловых угловых скоростей можно настраивать как в режиме ACRO, так и в режиме STABILIZED.
Предпочтительнее настраивать регуляторы в режиме ACRO, поскольку вам будет легче визуально заметить произведенные изменения коэффициентов. Если вы собираетесь использовать этот режим отключите Expo-параметры и снизьте чувствительность стиков для облегчения управления.
Предпочтительнее настраивать регуляторы в режиме ACRO, поскольку вам будет легче визуально заметить произведенные изменения коэффициентов. Если вы собираетесь использовать этот режим отключите Expo-параметры и снизте чувствительность стиков для облегчения управления.
* `MC_ACRO_EXPO` = 0, `MC_ACRO_EXPO_Y` = 0, `MC_ACRO_SUPEXPO` = 0, `MC_ACRO_SUPEXPOY` = 0
* `MC_ACRO_P_MAX` = 200, `MC_ACRO_R_MAX` = 200
@@ -45,7 +45,7 @@
Если ваш аппарат вообще не летает обратите внимание на две основные вещи:
* Если вы видите сильные осцилляции при попытке взлета, уменьшайте все коэффициенты *P* и *D* до тех пор, пока аппарат не поднимется в воздух.
* Если вы видите сильные осцилляции при попытке взлета, уменьшайте все кэоффициенты *P* и *D* до тех пор, пока аппарат не поднимется в воздух.
* С другой стороны, если аппарат почти не реагирует на управление передаваемое с пульта, увеличивайте коэффициент *P*.
Концепция настройки регуляторов одинакова как в режиме STABILIZED, так и в режиме ACRO. Итеративно с указанным шагом настраиваете коэффициенты *P* и *D* для крена и тангажа, а затем изменяете *I*. Первоначально вы можете использовать одинаковые значения для крена, когда регуляторы настроены достаточно хорошо вы можете точно донастроить их по крену и тангажу отдельно (если ваш аппарат симметричен, можете оставить коэффициенты одинаковыми). Идея настройки регулятора рыскания идентична настройке крена и тангажа, за исключением того, что коэффициент *D* может оставаться нулевым.
@@ -83,9 +83,9 @@
После изменения коэффициентов регулятора, для того, чтобы протестировать новые значения, подайте на вход аппарата быстрый ступенчатый ввод. Для этого быстро наклоните стик радиоаппаратуры в сторону, при этом коптер точно должен выполнять переданное управление, без осцилляций и "перестреливания". Поскольку обычно стики радиоаппаратуры подпружинены, в случае если их отпустить, они начинают колебаться, хорошо настроенный аппарат будет колебаться вместе со стиком.
## Конфигурация логгера
## Конфигурация логера
Для получения более полной информации с графиков вы можете настроить логгер удобным вам образом. Для его настройки вы можете пользоваться параметрами:
Для получения более полной информации с графиков вы можете настроить логер удобным вам образом. Для его настройки вы можете пользоваться параметрами:
* `SDLOG_PROFILE` - включение большого количества функций приводит к увеличению размера файла лога, а также к увеличению требований по скорости записи, перед начало работой убедитесь, что используете накопитель с достаточной пропускной способностью.
1. default set - запись общих логов системы
@@ -94,7 +94,7 @@
4. system identification - высокочастотные данные приводов и IMU
5. high rate - высокочастотные данные радио, угловых скоростей и приводов
6. debug - для записи пользовательских отладочных топиков
7. sensor comparison - низкочастотные данные IMU, барометра и компаса, для сравнения показаний датчиков
7. sensor comparison - низкочастотные данные IMU, барометра и компаса, для сравнения покозаний датчиков
* SDLOG_MODE
1. when armed until disarm - лог записывается с момента арма коптера, до момента дизарма коптера
2. from boot until disarm - лог записывается с момента запуска системы, до момента дизарма коптера
@@ -121,7 +121,7 @@
На графиках красной линией отмечено рассчитанное значение, а зеленой требуемое.
Качество настройки характеризуется тем, что рассчитанное значение должно быть максимально близким к требуемому. Если оба графика совпадают, это значит, что ваш коптер точно выполняет все переданные ему команды, если же графики сильно отличаются, во время полета вы заметите, что коптер неправильно выполняет ваши команды управления.
Качество настройки характеризуется тем, что расчитаное значение должно быть максимально близким к требуемому. Если оба графика совпадают, это значит, что ваш коптер точно выполняет все переданные ему команды, если же графики сильно отличаются, во время полета вы заметите, что коптер неправильно выполняет ваши команды управления.
## Регулятор положения

View File

@@ -37,7 +37,7 @@
* 2  дальномер (например, vl53l1x).
* 3 данные с VPE.
Вариант 2 является наиболее точным, но его корректно использовать, только если поверхность, над которой летает коптер плоская. В противном случае начало координат по Z будет двигаться вверх и вниз с изменением высоты поверхности.
Вариант 2 является наиболее точным, но его корректно использовать, только если поверхность, над которой летает котер плоская. В противном случае начало координат по Z будет двигаться вверх и вниз с изменением высоты поверхности.
## Multicopter Position Control (полет по позиции)

View File

@@ -268,9 +268,15 @@ set_position(x=0, y=0, z=0, frame_id='body', yaw=float('nan'), yaw_rate=0.5)
set_velocity(vx=1, vy=0.0, vz=0, frame_id='body')
```
Один из вариантов полета по кругу:
```python
set_velocity(vx=0.4, vy=0.0, vz=0, yaw=float('nan'), yaw_rate=0.4, frame_id='body')
```
### set_attitude
Установить тангаж, крен, рысканье и уровень газа (примерный аналог управления в [режиме `STABILIZED`](modes.md)). Данный сервис может быть использован для более низкоуровневого контроля поведения коптера либо для управления коптером при отсутствии источника достоверных данных о его позиции.
Установить тангаж, крен, рысканье и уровень газа (примерный аналог управления в [режиме `STABILIZED`](modes.md)). Данный сервис может быть использован для более низкоуровнего контроля поведения коптера либо для управления коптером при отсутствии источника достоверных данных о его позиции.
Параметры:

View File

@@ -14,7 +14,7 @@ UART последовательный асинхронный интерфе
В Linux есть понятие Posix Terminal Interface (подробнее [здесь](https://ru.wikipedia.org/wiki/TTY-абстракция)). Это некоторая абстракция над последовательным или виртуальным интерфейсом, позволяющая работать с устройством нескольким агентам одновременно.
В качестве примера такой абстракции в Raspbian можно привести `/dev/tty1` устройство вывода текста на экран подключенный по HDMI.
В качестве примера такой абстрации в Raspbian можно привести `/dev/tty1` устройство вывода текста на экран подключенный по HDMI.
## UART на Raspberry Pi 3

View File

@@ -12,13 +12,13 @@
{ "from": "connectortypes.html", "to": "ru/connectortypes.html" },
{ "from": "gps.html", "to": "ru/gps.html" },
{ "from": "setup.html", "to": "ru/setup.html" },
{ "from": "power.html", "to": "en/power.html" },
{ "from": "power.html", "to": "ru/power.html" },
{ "from": "modes.html", "to": "ru/modes.html" },
{ "from": "firmware.html", "to": "en/firmware.html" },
{ "from": "firmware.html", "to": "ru/firmware.html" },
{ "from": "px4_parameters.html", "to": "ru/px4_parameters.html" },
{ "from": "raspberry.html", "to": "ru/raspberry.html" },
{ "from": "microsd_images.html", "to": "ru/image.html" },
{ "from": "connection.html", "to": "en/connection.html" },
{ "from": "connection.html", "to": "ru/connection.html" },
{ "from": "wifi.html", "to": "ru/wifi.html" },
{ "from": "ssh.html", "to": "ru/ssh.html" },
{ "from": "network.html", "to": "ru/network.html" },
@@ -36,7 +36,7 @@
{ "from": "camera_frame.html", "to": "ru/camera_setup.html" },
{ "from": "ru/camera_frame.html", "to": "camera_setup.html" },
{ "from": "camera.html", "to": "ru/camera.html" },
{ "from": "led.html", "to": "en/leds.html" },
{ "from": "led.html", "to": "ru/leds.html" },
{ "from": "leds.html", "to": "ru/leds.html" },
{ "from": "rviz.html", "to": "ru/rviz.html" },
{ "from": "sitl.html", "to": "ru/sitl.html" },

View File

@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<package format="2">
<name>roswww_static</name>
<version>0.21.1</version>
<version>0.21.2</version>
<description>Static web pages for ROS packages</description>
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
<license>MIT</license>