Move ROS Noetic (#327)

* builder: Use 64-bit Raspberry Pi OS

* travis: Use 64-bit builder

* builder: Don't try to install Melodic packages on Noetic

* clover: Use package version 3, update dependencies

* travis: Enable Noetic build

* standalone_install: Auto-select Python, ROS distro

* builder: Use variable substitution for ROS_DISTRO

* builder: Add Noetic package definitions

* builder: Use variable substitution for validation

* aruco_pose, clover: Allow compiling against OpenCV 3 and 4

* builder: Add proper Noetic repository

* builder: Don't force Tornado version

Assume rosbridge_suite depends on the right one.

* builder: Install packages for Python 3

* builder/test: Use Python3 interpreter for ROS tests

TODO (?): add tests for Python2?

* builder: Use Python 3 syntax for Python 3 tests

* builder: Install rpi_ws281x for Python3

* standalone_install: Use proper Python for pytest

* builder: Install espeak for python3

* builder: Use proper path for roscore

* builder: Install rosdep, etc. for python3

* builder: Run Clever/Clover test with Python3

* builder: Use Python3 for Clever compat layer

* builder: Enable OpenCV 4.2 repository

* builder: Force versions for ROS packages that use OpenCV

Also, hold their versions so that they don't get updated for no reason.

* aruco_pose/draw: Replace OpenCV projection code with a rewrite

* builder: Don't try to install compressed_transport twice

* clover: Fix importing urllib for Python3

* aruco_pose, clover: Expose Python scripts through CMake

* clover/selfcheck: Be more python3-compatible

This is basically commit a01d199890 from buster-python3, not sure if it aged well.

* roswww_static: Add python script installation

* clover_blocks: Use Python3 syntax for exec

* aruco_pose: Remove unused code

* Melodic => Noetic in some docs

* docs: add 0.22 migration article

* docs: remove unneeded comment

* docs: python 3 updates

* docs: python 3 update in auto_setup article

* docs: add ROS Noetic transition note

* aruco.launch: add placement, length and map arguments

* genmap.py: add -o argument for output file name

* docs: use -o argument of genmap.py

* simple_offboard: correctly check manual control timeout, separate it from kill switch check

* blocks: force led_leds index to int

* docs: update and fix 0.22 migration articles

* blocks: fix set_leds with color-typed argument

* aruco_gen: Open file in binary mode for Python3 compatibility

* clover: Use proper variable in aruco.launch

* led: change default number of leds to 72

* aruco_pose: Make sure there are no undefined symbols

Also, compile in apriltag_quad_thresh.cpp - it contains some of the functions referenced
in aruco.cpp, which would otherwise be undefined.

* aruco_pose: Make vendored library compatible with older OpenCVs

* aruco_pose, clover: Reduce the amount of OpenCV libs requested

* aruco_pose, clover: Move subscriptions to the end of init

* aruco_pose: Don't expose vendored library symbols

* aruco_pose: Simplify dynamic parameter callback setting

* builder: Build with debug symbols

* clover: Attempt to respawn dying nodelets

* Change Raspberry Pi OS to latest armhf, use packages.coex.tech as a source

* Add CRYPTOGRAPHY_DONT_BUILD_RUST=1

* Fix Node.js installation

* image: use older CMake (3.13.4-1)
Fixing https://travis-ci.org/github/CopterExpress/clover/jobs/764367665#L6984

* image: update Raspberry Pi OS to 2021-03-04

* image: bring back moving ld.so.preload out of the way while building

* Fix pthreads ld error

* Try to fix pthreads ld error

* Another attempt to fix pthreads ld error

* Yet another attempt to fix pthreads ld error

* Try to fix

* Be verbose

* Temporarily disable rc and camera_markers building

* Fix standalone-install

* Revert "Temporarily disable rc and camera_markers building"

This reverts commit e119220e91.

* Try to fix

* Try to fix

* Revert "image: use older CMake (3.13.4-1)"

This reverts commit df28da0060.

* Revert "Revert "image: use older CMake (3.13.4-1)""

This reverts commit a28c774e8f.

* Verbosity

* Debugging

* More debugging

* Display all CMake variables

* Try to fix

* Another try to fix

* Revert "Another try to fix"

This reverts commit 5a4c3a0da7.

* Another try to fix

* And another

* And yet another

* Continue...

* Cleanup

* Sources lists cleanup

* More cleanup

* Restore .git directory in clover repo

* Fix building documentation

* Fix documentation building in image

* Trigger build to update ws281x package

* Test

* Disable unneeded hack

* Disable hack

* image: add cmake-modules package

* www: add viewing clover.err file from web interface

* Remove hacks

* Show nodelet version

* docs: add packages article

* image: add image-view package for recording video from topics

* Minor fix

* CI: add Docker authentication on image build

* CI: fix Bash syntax

* CI: fix authentication in Docker

* CI: move Melodic build and editorconfig-lint to GitHub Actions (#331)

* Create main.yml

* Update main.yml

* Disable native Melodic build in Travis

* Run editorconfig-lint in Actions

* Let wget be less verbose

* Test

* Test ok

* Disable editorconfig-lint in Travis

* docs: add links to hardware sources

* CI: move image building to GitHub actions (#335)

* Start working on building image in GitHub actions

* Trigger GitHub on push to any branch

* Fix TRAVIS_TAG

* Add compress image step

* Disable image build in Travis

* Add upload image step

* Fix compress image

* Fix

* Fix

* Minor fix

* Trigger build on tag

* Show images sizes not in human format

* Upload only built image

* Make prerelease

* Upload assets on release not on tags

* readme: change build badge to GitHub Actions

* readme: add support chat badge

* CI: move documentation building to GitHub Actions (#337)

* CI: change docs target branch to actions

* CI: change docs target branch to master

* CI: use gh-pages target branch for docs

* CI: split up to several workflows

* CI: remove .travis.yml

* CI: change apt to apt-get

* CI: push documentation site to the main repo

* builder: less verbosity

* CI: add new key for apt
Fixing https://github.com/CopterExpress/clover/runs/2700356960#step:3:74

* Add Noetic building to CI

* Add test for QR recognition

* Fix

* Move QR recognition test to a separate file

* Fix QR recognition code for Python 3

* Import SetLEDs, LEDStateArray, LEDState in tests

* Add more imports to tests
(from documentation)

* Fix permissions

* Fix standalone-install for Python 2

* Fix QR recognition test

* Don’t use ROS for QR recognition test

* docs: remove non-working example

* Make v4l2 device file an argument in main_camera.launch

* Wait for v4l2 device before launching the camera driver

* Use exec in waitfile

* Transfer main camera nodelet manager to main_camera.launch

* Update cv_camera version to 0.5.1

* docs: minor fix

* Revert cv_camera to 0.5.0

* Update Raspberry Pi OS to 2021-05-07

* docs: add link to the last ROS Melodic version.

Co-authored-by: Alexey Rogachevskiy <sfalexrog@gmail.com>
This commit is contained in:
Oleg Kalachev
2021-06-08 20:13:46 +03:00
committed by GitHub
parent 5f62a8639a
commit f77843f4a5
68 changed files with 750 additions and 944 deletions

BIN
docs/assets/noetic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -91,7 +91,9 @@
* [Soldering safety](tb.md)
* [LED strip (legacy)](leds_old.md)
* [Contribution Guidelines](contributing.md)
* [COEX packages repository](packages.md)
* [Migration to v0.20](migrate20.md)
* [Migration to v0.22](migrate22.md)
* [Events](events.md)
* [CopterHack-2022](copterhack2022.md)
* [CopterHack-2021](copterhack2021.md)

View File

@@ -1,5 +1,9 @@
# Map-based navigation with ArUco markers
> **Note** The following applies to [image versions](image.md) **0.22** and up. Older documentation is still available for [for version **0.20**](https://github.com/CopterExpress/clover/blob/v0.20/docs/en/aruco_map.md).
<!-- -->
> **Info** Marker detection requires the camera module to be correctly plugged in and [configured](camera_setup.md).
<!-- -->
@@ -39,13 +43,14 @@ marker_id marker_size x y z z_angle y_angle x_angle
`N_angle` is the angle of rotation along the `N` axis in radians.
Map path is defined in the `map` parameter:
Файлы карт располагаются в каталоге `~/catkin_ws/src/clover/aruco_pose/map`. Название файла с картой задается в аргументе `map`:
Map files are located at the `~/catkin_ws/src/clover/aruco_pose/map` directory. Map file name is defined in the `map` argument:
```xml
<param name="map" value="$(find aruco_pose)/map/map.txt"/>
<arg name="map" default="map.txt"/>
```
Some map examples are provided in [`~/catkin_ws/src/clover/aruco_pose/map`](https://github.com/CopterExpress/clover/tree/master/aruco_pose/map).
Some map examples are provided in [the directory](https://github.com/CopterExpress/clover/tree/master/aruco_pose/map).
Grid maps may be generated using the `genmap.py` script:
@@ -152,10 +157,10 @@ If the drone's altitude is not stable, try increasing the `MPC_Z_VEL_P` paramete
In order to navigate using markers on the ceiling, mount the onboard camera so that it points up and [adjust the camera frame accordingly](camera_setup.md).
You should also set the `known_tilt` parameter to `map_flipped` in both `aruco_detect` and `aruco_map` sections of `~/catkin_ws/src/clover/clover/launch/aruco.launch`:
You should also set the `placement` parameter to `ceilin` in `~/catkin_ws/src/clover/clover/launch/aruco.launch`:
```xml
<param name="known_tilt" value="map_flipped"/>
<arg name="placement" default="ceiling"/>
```
This will flip the `aruco_map` frame (making its **<font color=blue>z</font>** axis point downward). Thus, in order to fly 2 metres below ceiling, the `z` argument for the `navigate` service should be set to 2:

View File

@@ -1,5 +1,9 @@
# ArUco marker detection
> **Note** The following applies to [image versions](image.md) **0.22** and up. Older documentation is still available for [for version **0.20**](https://github.com/CopterExpress/clover/blob/v0.20/docs/en/aruco_marker.md).
<!-- -->
> **Info** Marker detection requires the camera module to be correctly plugged in and [configured](camera.md).
`aruco_detect` module detects ArUco markers and publishes their positions in ROS topics and as [TF frames](frames.md).
@@ -22,22 +26,20 @@ For enabling detection set the `aruco_detect` argument in `~/catkin_ws/src/clove
<arg name="aruco_detect" default="true"/>
```
For the module to work correctly the following parameters should be set:
For the module to work correctly the following arguments should also be set:
```xml
<param name="length" value="0.32"/> <!-- length of a single marker, in meters (excluding the white border) -->
<param name="estimate_poses" value="true"/> <!-- position estimation for single markers -->
<param name="send_tf" value="true"/> <!-- TF frame creation for markers -->
<param name="known_tilt" value="map"/> <!-- Marker tilt, explained below -->
<arg name="placement" default="floor"/> <!-- markers' placement, explained below -->
<arg name="length" default="0.33"/> <!-- length of a single marker, in meters (excluding the white border) -->
```
`known_tilt` should be set to:
`placement` argument should be set to:
* `map` if *all* markers are on the ground;
* `map_flipped` if *all* markers are on the ceiling;
* `floor` if *all* markers are on the ground;
* `ceiling` if *all* markers are on the ceiling;
* an empty string otherwise.
You may specify length for each marker individually by using the `length_override` parameter:
You may specify length for each marker individually by using the `length_override` parameter of the node `aruco_detect`:
```xml
<param name="length_override/3" value="0.1"/> <!-- marker with id=3 has a side of 0.1m -->
@@ -98,9 +100,9 @@ rospy.init_node('my_node')
# ...
def markers_callback(msg):
print 'Detected markers:':
print('Detected markers:'):
for marker in msg.markers:
print 'Marker: %s' % marker
print('Marker: %s' % marker)
# Create a Subscription object. Each time a message is posted in aruco_detect/markers, the markers_callback function is called with this message as its argument.
rospy.Subscriber('aruco_detect/markers', MarkerArray, markers_callback)

View File

@@ -126,7 +126,7 @@ Ctrl+C
Start a program `myprogram.py` using Python:
```bash
python myprogram.py
python3 myprogram.py
```
Journal of the events related to `clover` package. Scroll the list by pressing Enter or Ctrl+V (scrolls faster):
@@ -411,7 +411,7 @@ The easiest way to send the program is to copy the content of the program, creat
- Run the program:
```bash
python my_program.py
python3 my_program.py
```
> **Warning** After completion of the program , the drone can land incorrectly and continue to fly over the floor. In this case, you need to intercept control.

View File

@@ -133,12 +133,12 @@ def image_callback(data):
cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
barcodes = pyzbar.decode(cv_image)
for barcode in barcodes:
b_data = barcode.data.encode("utf-8")
b_data = barcode.data.decode("utf-8")
b_type = barcode.type
(x, y, w, h) = barcode.rect
xc = x + w/2
yc = y + h/2
print ("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
print("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback, queue_size=1)
@@ -153,3 +153,13 @@ The script will take up to 100% CPU capacity. To slow down the script artificial
```
The topic for the subscriber in this case should be changed for `main_camera/image_raw_throttled`.
## Video recording
To record a video you can use [`video_recorder`](http://wiki.ros.org/image_view#image_view.2Fdiamondback.video_recorder) node from `image_view` package:
```bash
rosrun image_view video_recorder image:=/main_camera/image_raw
```
The video file will be saved to a file `output.avi`. The `image` argument contains the name of the topic to record.

View File

@@ -39,7 +39,7 @@ cat file.py
Run `file.py` as a Python script:
```bash
python file.py
python3 file.py
```
Reboot Raspberry Pi:

View File

@@ -96,3 +96,7 @@ Prepare your article and send it as a pull request to the [Clover repository](ht
## Easy way
If the above instructions are too difficult for you, send your fixes and new articles by e-mail (<a href="mailto:okalachev@gmail.com">okalachev@gmail.com</a>) or in Telegram messenger (user <a href="tg://resolve?domain=okalachev">@okalachev</a>).
## Publishing packages
You also can publish a package, that extends Clover functionality, into the official [COEX Debian repository](packages.md).

View File

@@ -4,6 +4,8 @@ The RPi image for Clover contains all the necessary software for working with Cl
## Usage
> **Info** Starting from version v0.22, the image is based on ROS Noetic and using Python 3. If you want to use ROS Melodic and Python 2, use version [v0.21.2](https://github.com/CopterExpress/clover/releases/download/v0.21.2/clover_v0.21.2.img.zip).
1. Download the latest stable release of the image **<a class="latest-image" href="https://github.com/CopterExpress/clover/releases">download</a>**.
2. Download and install [Etcher](https://www.balena.io/etcher/), the software for flashing images (available for Windows/Linux/macOS).
3. Put the MicroSD-card into your computer (use an adapter if necessary).

View File

@@ -59,7 +59,7 @@ rospy.init_node('flight')
def range_callback(msg):
# Process data from the rangefinder
print 'Rangefinder distance:', msg.range
print('Rangefinder distance:', msg.range)
rospy.Subscriber('rangefinder/range', Range, range_callback)

View File

@@ -70,56 +70,6 @@ The `~/catkin_ws/src/clever/` directory is renamed to `~/catkin_ws/src/clover`.
For example, `~/catkin_ws/src/clever/clever/launch/clever.launch` file is now `~/catkin_ws/src/clover/clover/launch/clover.launch`.
<!--
## Python 3 transition
Python 2 is depracated since, January 1st, 2020. The Clover platform moves to Python 3.
For running flight script instead of `python` command:
```bash
python flight.py
```
use `python3` command:
```bash
python3 flight.py
```
Python 3 has certain syntax differences in comparison with the old version. Instead of `print` *operator*:
```python
print 'Clover is the best'
```
use `print` *function*:
```python
print('Clover is the best')
```
The division operator operates floating points by default (instead of integer). Python 2:
```python
>>> 10 / 4
2
```
Python 3:
```python
>>> 10 / 4
2.5
```
For strings `unicode` type is used by default (instead of `str` type).
Encoding specification (`# coding: utf8`) is not necessary any more.
More details on all the language changes see in [appropriate article](https://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html).
-->
## Wi-Fi network configuration
Wi-Fi networks' SSID is changed to `clover-XXXX` (where X is a random number), password is changed to `cloverwifi`.

59
docs/en/migrate22.md Normal file
View File

@@ -0,0 +1,59 @@
# Migration to version 0.22
## Python 3 transition
Python 2 is [deprecated](https://www.python.org/doc/sunset-python-2/) since January 1st, 2020. The Clover platform moves to Python 3.
For running flight script instead of `python` command:
```bash
python flight.py
```
use `python3` command:
```bash
python3 flight.py
```
Python 3 has certain syntax differences in comparison with the old version. Instead of `print` *operator*:
```python
print 'Clover is the best' # this won't work
```
use `print` *function*:
```python
print('Clover is the best')
```
The division operator operates floating points by default (instead of integer). Python 2:
```python
>>> 10 / 4
2
```
Python 3:
```python
>>> 10 / 4
2.5
```
For strings `unicode` type is used by default (instead of `str` type).
Encoding specification (`# coding: utf8`) is not necessary any more.
More details on all the language changes see in [appropriate article](https://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html).
## Move to ROS Noetic
<img src="../assets/noetic.png" width=200>
ROS Melodic version was updated to ROS Noetic. See the full list of changes in the [ROS official documentation](http://wiki.ros.org/noetic/Migration).
## Changes in launch-files
Configuration of ArUco-markers navigation is simplified. See details in [markers navigation](aruco_marker.md) and [markers map navigation](aruco_map.md) articles.

27
docs/en/packages.md Normal file
View File

@@ -0,0 +1,27 @@
# COEX packages repository
COEX provides an open [Debian-repository](https://wiki.debian.org/DebianRepository) with ROS Noetic related prebuilt binary pacakges for `armhf` architecture.
> **Info** Repository URL: http://packages.coex.tech.
The repository is already addedd in [RPi image](image.md) and may be used for simple installation of additional ROS packages.
## Packages publishing
You can make a Pull Request in a git repository with packages, adding or updating your package (a file with `.deb` extension), that relates to Clover or ROS. After merging your package will be available for installation with `apt` utility:
```bash
sudo apt install ros-noetic-clover-some-feature
```
Packages, that extend Clover functionality are recommended to be named with `clover_` prefix, e. g. `clover_some_feature`.
## Using on a normal Raspberry Pi OS
On a normal Raspberry Pi OS, the repository may be added to the sources list, this way:
```bash
wget -O - 'http://packages.coex.tech/key.asc' | apt-key add -
echo 'deb http://packages.coex.tech buster main' >> /etc/apt/sources.list
sudo apt update
```

View File

@@ -42,10 +42,10 @@ Before the first flight it's recommended to check the Clover's configuration wit
rosrun clover selfcheck.py
```
In order to run a Python script use the `python` command:
In order to run a Python script use the `python3` command:
```bash
python flight.py
python3 flight.py
```
Below is a complete flight program that performs a takeoff, flies forward and lands:

View File

@@ -63,7 +63,7 @@ An example of subscription to topic `/foo`:
```python
def foo_callback(msg):
print msg.data
print(msg.data)
# Subscribing. When a message is received in topic /foo, function foo_callback will be invoked.
rospy.Subscriber('/foo', String, foo_callback)

View File

@@ -75,14 +75,14 @@ Displaying drone coordinates `x`, `y` and `z` in the local system of coordinates
```python
telemetry = get_telemetry()
print telemetry.x, telemetry.y, telemetry.z
print(telemetry.x, telemetry.y, telemetry.z)
```
Displaying drone altitude relative to [the ArUco map](aruco.md):
```python
telemetry = get_telemetry(frame_id='aruco_map')
print telemetry.z
print(telemetry.z)
```
Checking global position availability:
@@ -90,9 +90,9 @@ Checking global position availability:
```python
import math
if not math.isnan(get_telemetry().lat):
print 'Global position is available'
print('Global position is available')
else:
print 'No global position'
print('No global position')
```
Output of current telemetry (command line):
@@ -303,7 +303,7 @@ Landing the drone:
res = land()
if res.success:
print 'drone is landing'
print('drone is landing')
```
Landing the drone (command line):

View File

@@ -319,7 +319,7 @@ def flip():
rospy.loginfo('finish flip')
set_position(x=start.x, y=start.y, z=start.z, yaw=start.yaw) # finish flip
print navigate(z=2, speed=1, frame_id='body', auto_arm=True) # take off
print(navigate(z=2, speed=1, frame_id='body', auto_arm=True)) # take off
rospy.sleep(10)
rospy.loginfo('flip')

View File

@@ -83,7 +83,7 @@ pi.callback(ECHO, pigpio.FALLING_EDGE, fall)
while True:
# Reading the distance:
print read_distance()
print(read_distance())
```
@@ -104,7 +104,7 @@ def read_distance_filtered():
return numpy.median(history)
while True:
print read_distance_filtered()
print(read_distance_filtered())
```
An example of charts of initial and filtered data:

View File

@@ -97,7 +97,9 @@
* [Подключение регулятора 4 в 1](4in1.md)
* [Светодиодная лента (legacy)](leds_old.md)
* [Вклад в Клевер](contributing.md)
* [Репозиторий пакетов COEX](packages.md)
* [Переход на версию 0.20](migrate20.md)
* [Переход на версию 0.22](migrate22.md)
* [COEX DuoCam](duocam.md)
* [Виртуальная MAVLink-камера](duocam_mavlink.md)
* [Мероприятия](events.md)

View File

@@ -1,5 +1,9 @@
# Навигация по картам ArUco-маркеров
> **Note** Документация для версий [образа](image.md), начиная с версии **0.22**. Для более ранних версий см. [документацию для версии **0.20**](https://github.com/CopterExpress/clover/blob/v0.20/docs/ru/aruco_map.md).
<!-- -->
> **Info** Для распознавания маркеров модуль камеры должен быть корректно подключен и [сконфигурирован](camera.md).
<!-- -->
@@ -39,13 +43,13 @@ id_маркера размераркера x y z угол_z угол_y уго
Где `угол_N` – это угол поворота маркера вокруг оси N в радианах.
Путь к файлу с картой задается в параметре `map`:
Файлы карт располагаются в каталоге `~/catkin_ws/src/clover/aruco_pose/map`. Название файла с картой задается в аргументе `map`:
```xml
<param name="map" value="$(find aruco_pose)/map/map.txt"/>
<arg name="map" default="map.txt"/>
```
Смотрите примеры карт маркеров в каталоге [`~/catkin_ws/src/clover/aruco_pose/map`](https://github.com/CopterExpress/clover/tree/master/aruco_pose/map).
Смотрите примеры карт маркеров в [`вышеуказанном каталоге`](https://github.com/CopterExpress/clover/tree/master/aruco_pose/map).
Файл карты может быть сгенерирован с помощью инструмента `genmap.py`:
@@ -154,10 +158,10 @@ navigate(frame_id='aruco_5', x=0, y=0, z=1)
Для навигации по маркерам, расположенным на потолке, необходимо поставить основную камеру так, чтобы она смотрела вверх и [установить соответствующий фрейм камеры](camera_setup.md#frame).
Также в файле `~/catkin_ws/src/clover/clover/launch/aruco.launch` необходимо установить параметр `known_tilt` в секциях `aruco_detect` и `aruco_map` в значение `map_flipped`:
Также в файле `~/catkin_ws/src/clover/clover/launch/aruco.launch` необходимо выставить аргумент `placement` в значение `ceiling`:
```xml
<param name="known_tilt" value="map_flipped"/>
<arg name="placement" default="ceiling"/>
```
При такой конфигурации фрейм `aruco_map` также окажется перевернутым. Таким образом, для полета на высоту 2 метра ниже потолка, аргумент `z` нужно устанавливать в 2:

View File

@@ -1,5 +1,9 @@
# Распознавание ArUco-маркеров
> **Note** Документация для версий [образа](image.md), начиная с версии **0.22**. Для более ранних версий см. [документацию для версии **0.20**](https://github.com/CopterExpress/clover/blob/v0.20/docs/ru/aruco_marker.md).
<!-- -->
> **Info** Для распознавания маркеров модуль камеры должен быть корректно подключен и [сконфигурирован](camera_setup.md).
Модуль `aruco_detect` распознает ArUco-маркеры и публикует их позиции в ROS-топики и в [TF](frames.md).
@@ -22,22 +26,20 @@
<arg name="aruco_detect" default="true"/>
```
Для правильной работы в этом же файле в секции `aruco_detect` должны быть выставлены параметры:
Для правильной работы в этом же файле также должны быть выставлены аргументы:
```xml
<param name="length" value="0.32"/> <!-- размер маркеров в метрах (не включая белую рамку) -->
<param name="estimate_poses" value="true"/> <!-- включение вычисления позиций маркеров -->
<param name="send_tf" value="true"/> <!-- отправлять позиции маркеров в виде TF-фреймов -->
<param name="known_tilt" value="map"/> <!-- наклон маркеров, см. далее -->
<arg name="placement" default="floor"/> <!-- расположение маркеров, см. далее -->
<arg name="length" default="0.33"/> <!-- размер маркеров в метрах (не включая белую рамку) -->
```
Значение параметра `known_tilt` следует выставлять следующим образом:
Значение аргумента `placement` следует выставлять следующим образом:
* если *все* маркеры наклеены на полу (земле), выставить значение `map`;
* если *все* маркеры наклеены на потолке, выставить значение `map_flipped`;
* если *все* маркеры наклеены на полу (земле), выставить значение `floor`;
* если *все* маркеры наклеены на потолке, выставить значение `ceiling`;
* в противном случае удалить строку с параметром.
Если некоторые маркеры имеют размер, отличный значения `length`, их размер может быть переопределен с помощью параметра `length_override`:
Если некоторые маркеры имеют размер, отличный значения `length`, их размер может быть переопределен с помощью параметра `length_override` ноды `aruco_detect`:
```xml
<param name="length_override/3" value="0.1"/> <!-- маркер c id 3 имеет размер 10 см -->
@@ -110,9 +112,9 @@ rospy.init_node('my_node')
# ...
def markers_callback(msg):
print 'Detected markers:':
print('Detected markers:'):
for marker in msg.markers:
print 'Marker: %s' % marker
print('Marker: %s' % marker)
# Подписываемся. При получении сообщения в топик aruco_detect/markers будет вызвана функция markers_callback.
rospy.Subscriber('aruco_detect/markers', MarkerArray, markers_callback)

View File

@@ -126,7 +126,7 @@ Ctrl+C
Запустить программу myprogram.py на Питоне:
```bash
python myprogram.py
python3 myprogram.py
```
Журнал событий процессов Клевера. Пролистывать список можно нажатием Enter или сочетанием клавиш Ctrl+V (пролистывает быстрее):
@@ -406,7 +406,7 @@ sudo nano /etc/sudoers
- Запустите программу. Для этого выполните команду:
```bash
python my_program.py
python3 my_program.py
```
> **Warning** После выполнения программы дрон может некорректно приземлиться и продолжать лететь над полом. В таком случае нужно перехватить управление.

View File

@@ -135,12 +135,12 @@ def image_callback(data):
cv_image = bridge.imgmsg_to_cv2(data, 'bgr8') # OpenCV image
barcodes = pyzbar.decode(cv_image)
for barcode in barcodes:
b_data = barcode.data.encode("utf-8")
b_data = barcode.data.decode("utf-8")
b_type = barcode.type
(x, y, w, h) = barcode.rect
xc = x + w/2
yc = y + h/2
print ("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
print("Found {} with data {} with center at x={}, y={}".format(b_type, b_data, xc, yc))
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback, queue_size=1)
@@ -155,3 +155,13 @@ rospy.spin()
```
Топик для подписчика в этом случае необходимо поменять на `main_camera/image_raw_throttled`.
## Запись видео
Для записи видео может использована нода [`video_recorder`](http://wiki.ros.org/image_view#image_view.2Fdiamondback.video_recorder) из пакета `image_view`:
```bash
rosrun image_view video_recorder image:=/main_camera/image_raw
```
Видео будет сохранено в файл `output.avi`. В аргументе `image` указывается название топика для записи видео.

View File

@@ -39,7 +39,7 @@ cat file.py
Запустить Python-скрипт `file.py`:
```bash
python file.py
python3 file.py
```
Перезагрузить Raspberry Pi:

View File

@@ -96,3 +96,7 @@
## Простой способ
Если вышеприведенные инструкции для вас оказываются слишком сложными, отправляйте правки или новые статьи по e-mail (<a href="mailto:okalachev@gmail.com">okalachev@gmail.com</a>) или в Telegram (пользователь <a href="tg://resolve?domain=okalachev">@okalachev</a>).
## Публикация пакетов
Вы также можете опубликовать собственный пакет, расширяющий функциональность Клевера, в [Debian-репозитории COEX](packages.md).

View File

@@ -4,6 +4,8 @@
## Использование
> **Info** Начиная с версии v0.22, образ основан на ROS Noetic и использует Python 3. Если вы хотите использовать ROS Melodic и Python 2, используйте версию [v0.21.2](https://github.com/CopterExpress/clover/releases/download/v0.21.2/clover_v0.21.2.img.zip).
1. Скачайте последний стабильный релиз образа — **<a class="latest-image" href="https://github.com/CopterExpress/clover/releases">скачать</a>**.
2. Скачайте и установите [программу для записи образов Etcher](https://www.balena.io/etcher/) (доступна для Windows/Linux/macOS).
3. Установите MicroSD-карту в компьютер (используйте адаптер при необходимости).

View File

@@ -59,7 +59,7 @@ rospy.init_node('flight')
def range_callback(msg):
# Обработка новых данных с дальномера
print 'Rangefinder distance:', msg.range
print('Rangefinder distance:', msg.range)
rospy.Subscriber('rangefinder/range', Range, range_callback)

View File

@@ -72,56 +72,6 @@ sudo systemctl restart clover
Например, файл `~/catkin_ws/src/clever/clever/launch/clever.launch` теперь называется `~/catkin_ws/src/clover/clover/launch/clover.launch`.
<!--
## Переход на Python 3
Python 2 был признан [устаревшим](https://www.python.org/doc/sunset-python-2/), начиная с 1 января 2020 года. Платформа Клевера переходит на использование Python 3.
Для запуска полетных скриптов вместо команды `python`:
```bash
python flight.py
```
теперь следует использовать команду `python3`:
```bash
python3 flight.py
```
Синтаксис языка Python 3 имеет определенные изменения по сравнения со второй версией. Вместо *оператора* `print`:
```python
print 'Clover is the best'
```
теперь используется *функция* `print`:
```python
print('Clover is the best')
```
Оператор деления по умолчанию выполняет деление с плавающей точкой (вместо целочисленного). Python 2:
```python
>>> 10 / 4
2
```
Python 3:
```python
>>> 10 / 4
2.5
```
Для строк по умолчанию теперь используется тип `unicode` (вместо типа `str`).
Указание кодировки файла (`# coding: utf8`) перестало быть необходимым.
Полное описание всех изменений языка смотрите в [соответствующей статье](https://pythonworld.ru/osnovy/python2-vs-python3-razlichiya-sintaksisa.html).
-->
## Настройки Wi-Fi сети
SSID Wi-Fi сети изменен на `clover-XXXX` (где X – случайная цифра), пароль изменен на `cloverwifi`.

59
docs/ru/migrate22.md Normal file
View File

@@ -0,0 +1,59 @@
# Переход на версию 0.22
## Переход на Python 3
Python 2 был признан [устаревшим](https://www.python.org/doc/sunset-python-2/), начиная с 1 января 2020 года. Платформа Клевера переходит на использование Python 3.
Для запуска полетных скриптов вместо команды `python`:
```bash
python flight.py
```
теперь следует использовать команду `python3`:
```bash
python3 flight.py
```
Синтаксис языка Python 3 имеет определенные изменения по сравнения со второй версией. Вместо *оператора* `print`:
```python
print 'Clover is the best' # this won't work
```
теперь используется *функция* `print`:
```python
print('Clover is the best')
```
Оператор деления по умолчанию выполняет деление с плавающей точкой (вместо целочисленного). Python 2:
```python
>>> 10 / 4
2
```
Python 3:
```python
>>> 10 / 4
2.5
```
Для строк по умолчанию теперь используется тип `unicode` (вместо типа `str`).
Указание кодировки файла (`# coding: utf8`) перестало быть необходимым.
Полное описание всех изменений языка смотрите в [соответствующей статье](https://pythonworld.ru/osnovy/python2-vs-python3-razlichiya-sintaksisa.html).
## Переход на ROS Noetic
<img src="../assets/noetic.png" width=200>
Версия ROS Melodic обновлена до ROS Noetic. Смотрите полный список изменений в [официальной документации ROS](http://wiki.ros.org/noetic/Migration).
## Изменения в launch-файлах
Упрощено конфигурирование навигации с использованием ArUco-маркеров. Подробнее в статьях по [навигации по маркерам](aruco_marker.md) и [навигации по картам маркеров](aruco_map.md).

27
docs/ru/packages.md Normal file
View File

@@ -0,0 +1,27 @@
# Репозиторий пакетов COEX
COEX предоставляет открытый [Debian-репозиторий](https://wiki.debian.org/ru/SourcesList) с предсобранными пакетами, относящимися к ROS Noetic, для архитектуры `armhf`.
> **Info** Адрес репозитория: http://packages.coex.tech.
Репозиторий подключен в [образе для RPi](image.md) и может быть использован для легкой установки дополнительных ROS-пакетов.
## Публикация пакетов
Вы можете прислать Pull Request в [git-репозиторий с пакетами](https://github.com/CopterExpress/packages), добавляющий или обновляющий ваш пакет (файл с расширением `.deb`), относящийся с Клеверу или ROS. После принятия ваш пакет будет доступен для установки с помощью утилиты `apt`:
```bash
sudo apt install ros-noetic-clover-some-feature
```
Пакеты, расширяющие функциональность Клевера, рекомендуется называть с префиксом `clover_`, например `clover_some_feature`.
## Использование на обычной Raspberry Pi OS
На обычной Raspberry Pi OS репозиторий может быть добавлен в список источников пакетов следующими командами:
```bash
wget -O - 'http://packages.coex.tech/key.asc' | apt-key add -
echo 'deb http://packages.coex.tech buster main' >> /etc/apt/sources.list
sudo apt update
```

View File

@@ -42,10 +42,10 @@
rosrun clover selfcheck.py
```
Для того, чтобы запустить Python-скрипт, используйте команду `python`:
Для того, чтобы запустить Python-скрипт, используйте команду `python3`:
```bash
python flight.py
python3 flight.py
```
Пример программы для полета (взлет, пролет вперед, посадка):

View File

@@ -63,7 +63,7 @@ foo_pub.publish(data='Hello, world!') # публикуем сообщение
```python
def foo_callback(msg):
print msg.data
print(msg.data)
# Подписываемся. При получении сообщения в топик /foo будет вызвана функция foo_callback.
rospy.Subscriber('/foo', String, foo_callback)

View File

@@ -75,14 +75,14 @@ land = rospy.ServiceProxy('land', Trigger)
```python
telemetry = get_telemetry()
print telemetry.x, telemetry.y, telemetry.z
print(telemetry.x, telemetry.y, telemetry.z)
```
Вывод высоты коптера относительно [карты ArUco-меток](aruco.md):
```python
telemetry = get_telemetry(frame_id='aruco_map')
print telemetry.z
print(telemetry.z)
```
Проверка доступности глобальной позиции:
@@ -90,9 +90,9 @@ print telemetry.z
```python
import math
if not math.isnan(get_telemetry().lat):
print 'Global position is available'
print('Global position is available')
else:
print 'No global position'
print('No global position')
```
Вывод текущей телеметрии (командная строка):
@@ -303,7 +303,7 @@ set_velocity(vx=1, vy=0.0, vz=0, frame_id='body')
res = land()
if res.success:
print 'Copter is landing'
print('Copter is landing')
```
Посадка коптера (командная строка):

View File

@@ -337,7 +337,7 @@ def flip():
rospy.loginfo('finish flip')
set_position(x=start.x, y=start.y, z=start.z, yaw=start.yaw) # finish flip
print navigate(z=2, speed=1, frame_id='body', auto_arm=True) # take off
print(navigate(z=2, speed=1, frame_id='body', auto_arm=True)) # take off
rospy.sleep(10)
rospy.loginfo('flip')

View File

@@ -83,7 +83,7 @@ pi.callback(ECHO, pigpio.FALLING_EDGE, fall)
while True:
# Читаем дистанцию:
print read_distance()
print(read_distance())
```
@@ -104,7 +104,7 @@ def read_distance_filtered():
return numpy.median(history)
while True:
print read_distance_filtered()
print(read_distance_filtered())
```
Пример графиков исходных и отфильтрованных данных: