mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-03 08:29:32 +00:00
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 commita01d199890from 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 commite119220e91. * Try to fix * Try to fix * Revert "image: use older CMake (3.13.4-1)" This reverts commitdf28da0060. * Revert "Revert "image: use older CMake (3.13.4-1)"" This reverts commita28c774e8f. * Verbosity * Debugging * More debugging * Display all CMake variables * Try to fix * Another try to fix * Revert "Another try to fix" This reverts commit5a4c3a0da7. * 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:
BIN
docs/assets/noetic.png
Normal file
BIN
docs/assets/noetic.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -39,7 +39,7 @@ cat file.py
|
||||
Run `file.py` as a Python script:
|
||||
|
||||
```bash
|
||||
python file.py
|
||||
python3 file.py
|
||||
```
|
||||
|
||||
Reboot Raspberry Pi:
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
59
docs/en/migrate22.md
Normal 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
27
docs/en/packages.md
Normal 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
|
||||
```
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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** После выполнения программы дрон может некорректно приземлиться и продолжать лететь над полом. В таком случае нужно перехватить управление.
|
||||
|
||||
@@ -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` указывается название топика для записи видео.
|
||||
|
||||
@@ -39,7 +39,7 @@ cat file.py
|
||||
Запустить Python-скрипт `file.py`:
|
||||
|
||||
```bash
|
||||
python file.py
|
||||
python3 file.py
|
||||
```
|
||||
|
||||
Перезагрузить Raspberry Pi:
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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-карту в компьютер (используйте адаптер при необходимости).
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
59
docs/ru/migrate22.md
Normal 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
27
docs/ru/packages.md
Normal 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
|
||||
```
|
||||
@@ -42,10 +42,10 @@
|
||||
rosrun clover selfcheck.py
|
||||
```
|
||||
|
||||
Для того, чтобы запустить Python-скрипт, используйте команду `python`:
|
||||
Для того, чтобы запустить Python-скрипт, используйте команду `python3`:
|
||||
|
||||
```bash
|
||||
python flight.py
|
||||
python3 flight.py
|
||||
```
|
||||
|
||||
Пример программы для полета (взлет, пролет вперед, посадка):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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')
|
||||
```
|
||||
|
||||
Посадка коптера (командная строка):
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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())
|
||||
```
|
||||
|
||||
Пример графиков исходных и отфильтрованных данных:
|
||||
|
||||
Reference in New Issue
Block a user