mirror of
https://github.com/CopterExpress/clover.git
synced 2026-06-03 08:29:32 +00:00
Compare commits
23 Commits
www-header
...
v0.20-alph
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cda7858fb9 | ||
|
|
a01d199890 | ||
|
|
63a792b29d | ||
|
|
360eb02909 | ||
|
|
688b4e3acb | ||
|
|
8042669ade | ||
|
|
6b9d90d3d7 | ||
|
|
4f110d4eaa | ||
|
|
f7eda0be97 | ||
|
|
1da2f76758 | ||
|
|
60a77a35a5 | ||
|
|
0ffde38b8b | ||
|
|
99632bf554 | ||
|
|
d44a80b357 | ||
|
|
77189b5f5f | ||
|
|
b37a32d4dc | ||
|
|
b359414377 | ||
|
|
6d4dd6956f | ||
|
|
cb26f0933e | ||
|
|
d944f57ebb | ||
|
|
ad430284de | ||
|
|
b5cf47fdb5 | ||
|
|
99f24abf8d |
19
.travis.yml
19
.travis.yml
@@ -1,5 +1,4 @@
|
||||
os: linux
|
||||
dist: xenial
|
||||
sudo: required
|
||||
language: generic
|
||||
services:
|
||||
- docker
|
||||
@@ -44,7 +43,7 @@ jobs:
|
||||
- cd images && zip ${IMAGE_NAME}.zip ${IMAGE_NAME}
|
||||
deploy:
|
||||
provider: releases
|
||||
token: ${GITHUB_OAUTH_TOKEN}
|
||||
api_key: ${GITHUB_OAUTH_TOKEN}
|
||||
file: ${IMAGE_NAME}.zip
|
||||
skip_cleanup: true
|
||||
on:
|
||||
@@ -85,13 +84,13 @@ jobs:
|
||||
- gitbook build
|
||||
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
|
||||
local-dir: _book
|
||||
skip-cleanup: true
|
||||
github-token: ${GITHUB_OAUTH_TOKEN}
|
||||
keep-history: true
|
||||
target-branch: master
|
||||
repo: CopterExpress/clever.coex.tech
|
||||
fqdn: clever.coex.tech
|
||||
verbose: true
|
||||
on:
|
||||
branch: master
|
||||
|
||||
105
README.md
105
README.md
@@ -1,40 +1,103 @@
|
||||
# COEX Clover Drone Kit
|
||||
# CLEVER
|
||||
|
||||
<img src="docs/assets/clever4-front-white.png" align="right" width="400px" alt="Clover Drone">
|
||||
<img src="docs/assets/clever4-front-white.png" align="right" width="400px" alt="CLEVER drone">
|
||||
|
||||
Clover is an educational programmable drone kit consisting of an unassembled quadcopter, open source software and documentation. The kit includes Pixracer-compatible autopilot running PX4 firmware, Raspberry Pi 4 as companion computer, a camera for computer vision navigation as well as additional sensors and peripheral devices.
|
||||
CLEVER (Russian: *"Клевер"*, meaning *"Clover"*) is an educational programmable drone kit consisting of an unassembled quadcopter, open source software and documentation. The kit includes Pixhawk/Pixracer autopilot running PX4 firmware, Raspberry Pi 3 as companion computer, a camera for computer vision navigation as well as additional sensors and peripheral devices.
|
||||
|
||||
The main documentation is available [on Gitbook](https://clover.coex.tech/).
|
||||
Copter Express has implemented a large number of different autonomous drone projects using exactly the same platform: [automated pizza delivery](https://www.youtube.com/watch?v=hmkAoZOtF58) in Samara and Kazan, coffee delivery in Skolkovo Innovation Center, [autonomous quadcopter with charging station](https://www.youtube.com/watch?v=RjX6nUqw1mI) for site monitoring and security, winning drones on [Robocross-2016](https://www.youtube.com/watch?v=dGbDaz_VmYU) and [Robocross-2017](https://youtu.be/AQnd2CRczbQ) competitions and many others.
|
||||
|
||||
Official website: <a href="https://coex.tech/clover">coex.tech/clover</a>.
|
||||
**The main documentation is available [on Gitbook](https://clever.coex.tech/).**
|
||||
|
||||
## Video compilation
|
||||
|
||||
[](https://youtu.be/u3omgsYC4Fk)
|
||||
|
||||
Clover drone is used on a wide range of educational events, including [Copter Hack](https://www.youtube.com/watch?v=xgXheg3TTs4), WorldSkills Drone Operation competition, [Autonomous Vehicles Track of NTI Olympics 2016–2020](https://www.youtube.com/watch?v=E1_ehvJRKxg), Quadro Hack 2019 (National University of Science and Technology MISiS), Russian Robot Olympiad (autonomous flights), and others.
|
||||
Use it to learn how to assemble, configure, pilot and program autonomous CLEVER drone.
|
||||
|
||||
## Raspberry Pi image
|
||||
|
||||
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).
|
||||
**Preconfigured image for Raspberry Pi 3 with installed and configured software, ready to fly, is available [in the Releases section](https://github.com/CopterExpress/clever/releases).**
|
||||
|
||||
[](https://travis-ci.org/CopterExpress/clover)
|
||||
[](https://travis-ci.org/CopterExpress/clever)
|
||||
|
||||
Image features:
|
||||
Image includes:
|
||||
|
||||
* Raspbian Buster
|
||||
* [ROS Melodic](http://wiki.ros.org/melodic)
|
||||
* ROS Melodic
|
||||
* Configured networking
|
||||
* OpenCV
|
||||
* [`mavros`](http://wiki.ros.org/mavros)
|
||||
* Periphery drivers for ROS ([GPIO](https://clover.coex.tech/en/gpio.html), [LED strip](https://clover.coex.tech/en/leds.html), etc)
|
||||
* `aruco_pose` package for marker-assisted navigation
|
||||
* `clover` package for autonomous drone control
|
||||
* mavros
|
||||
* Periphery drivers (`pigpiod`, `rpi_ws281x`, etc)
|
||||
* CLEVER software bundle for autonomous drone control
|
||||
|
||||
API description for autonomous flights is available [on GitBook](https://clover.coex.tech/en/simple_offboard.html).
|
||||
API description (in Russian) for autonomous flights is available [on GitBook](https://clever.coex.tech/simple_offboard.html).
|
||||
|
||||
For manual package installation and running see [`clover` package documentation](clover/README.md).
|
||||
## Manual installation
|
||||
|
||||
Install ROS Melodic according to the [documentation](http://wiki.ros.org/melodic/Installation), then [create a Catkin workspace](http://wiki.ros.org/catkin/Tutorials/create_a_workspace).
|
||||
|
||||
Clone this repo to directory `~/catkin_ws/src/clever`:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src
|
||||
git clone https://github.com/CopterExpress/clever.git clever
|
||||
```
|
||||
|
||||
All the required ROS packages (including `mavros` and `opencv`) can be installed using `rosdep`:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/
|
||||
rosdep install -y --from-paths src --ignore-src
|
||||
```
|
||||
|
||||
Build ROS packages (on memory constrained platforms you might be going to need to use `-j1` key):
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws
|
||||
catkin_make -j1
|
||||
```
|
||||
|
||||
To complete `mavros` install you'll need to install `geographiclib` datasets:
|
||||
|
||||
```bash
|
||||
curl https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | sudo bash
|
||||
```
|
||||
|
||||
You may optionally install udev rules to provide `/dev/px4fmu` symlink to your PX4-based flight controller connected over USB. Copy `99-px4fmu.rules` to your `/lib/udev/rules.d` folder:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/clever/clever/config
|
||||
sudo cp 99-px4fmu.rules /lib/udev/rules.d
|
||||
```
|
||||
|
||||
Alternatively you may change the `fcu_url` property in `mavros.launch` file to point to your flight controller device.
|
||||
|
||||
## Running
|
||||
|
||||
Enable systemd service `roscore` (if not running):
|
||||
|
||||
```bash
|
||||
sudo systemctl enable /home/<username>/catkin_ws/src/clever/builder/assets/roscore.service
|
||||
sudo systemctl start roscore
|
||||
```
|
||||
|
||||
To start connection to SITL, use:
|
||||
|
||||
```bash
|
||||
roslaunch clever sitl.launch
|
||||
```
|
||||
|
||||
To start connection to the flight controller, use:
|
||||
|
||||
```bash
|
||||
roslaunch clever clever.launch
|
||||
```
|
||||
|
||||
> Note that the package is configured to connect to `/dev/px4fmu` by default (see [previous section](#manual-installation)). Install udev rules or specify path to your FCU device in `mavros.launch`.
|
||||
|
||||
Also, you can enable and start the systemd service:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable /home/<username>/catkin_ws/src/clever/deploy/clever.service
|
||||
sudo systemctl start clever
|
||||
```
|
||||
|
||||
## 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.
|
||||
While the Clever 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.
|
||||
|
||||
@@ -394,7 +394,7 @@ publish_debug:
|
||||
int num_markers = board_->dictionary->bytesList.rows;
|
||||
if (num_markers <= id) {
|
||||
NODELET_ERROR("Marker id %d is not in dictionary; current dictionary contains %d markers. "
|
||||
"Please see https://github.com/CopterExpress/clover/blob/master/aruco_pose/README.md#parameters for details",
|
||||
"Please see https://github.com/CopterExpress/clever/blob/master/aruco_pose/README.md#parameters for details",
|
||||
id, num_markers);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Copyright (C) 2018 Copter Express Technologies
|
||||
#
|
||||
|
||||
@@ -1,26 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
import sys
|
||||
import unittest
|
||||
import json
|
||||
import rospy
|
||||
import rostest
|
||||
import pytest
|
||||
|
||||
from sensor_msgs.msg import Image
|
||||
from visualization_msgs.msg import MarkerArray as VisMarkerArray
|
||||
|
||||
@pytest.fixture
|
||||
def node():
|
||||
return rospy.init_node('test_aruco_largemap', anonymous=True)
|
||||
|
||||
class TestArucoPose(unittest.TestCase):
|
||||
def setUp(self):
|
||||
rospy.init_node('test_aruco_largemap', anonymous=True)
|
||||
def test_large_map_image(node):
|
||||
img = rospy.wait_for_message('aruco_map/image', Image, timeout=5)
|
||||
assert img.width == 2000
|
||||
assert img.height == 2000
|
||||
assert img.encoding in ('mono8', 'rgb8')
|
||||
|
||||
def test_map_image(self):
|
||||
img = rospy.wait_for_message('aruco_map/image', Image, timeout=5)
|
||||
self.assertEqual(img.width, 2000)
|
||||
self.assertEqual(img.height, 2000)
|
||||
self.assertIn(img.encoding, ('mono8', 'rgb8'))
|
||||
|
||||
def test_map_visualization(self):
|
||||
vis = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5)
|
||||
|
||||
|
||||
rostest.rosrun('aruco_pose', 'test_aruco_largemap', TestArucoPose, sys.argv)
|
||||
def test_large_map_visualization(node):
|
||||
vis = rospy.wait_for_message('aruco_map/visualization', VisMarkerArray, timeout=5)
|
||||
assert len(vis.markers) == 11
|
||||
|
||||
@@ -9,5 +9,6 @@
|
||||
<param name="map" value="$(find aruco_pose)/test/largemap.txt"/>
|
||||
</node>
|
||||
|
||||
<test test-name="test_aruco_pose_largemap" pkg="aruco_pose" type="largemap.py"/>
|
||||
<param name="test_module" value="$(find aruco_pose)/test/largemap.py"/>
|
||||
<test test-name="test_node_pass" pkg="ros_pytest" type="ros_pytest_runner"/>
|
||||
</launch>
|
||||
|
||||
12
book.json
12
book.json
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"title": "Clover",
|
||||
"title": "Clever",
|
||||
"description": "Конструктор квадрокоптера «Клевер»",
|
||||
"author": "Copter Express",
|
||||
"language": "en",
|
||||
@@ -28,7 +28,7 @@
|
||||
"blank": true
|
||||
},
|
||||
"sitemap": {
|
||||
"hostname": "https://clover.coex.tech"
|
||||
"hostname": "https://clever.coex.tech"
|
||||
},
|
||||
"toolbar": {
|
||||
"buttons":
|
||||
@@ -37,19 +37,19 @@
|
||||
"label": "Edit page on github",
|
||||
"icon": "fa fa-pencil-square-o",
|
||||
"position" : "left",
|
||||
"url": "https://github.com/CopterExpress/clover/edit/master/docs/{{filepath_lang}}"
|
||||
"url": "https://github.com/CopterExpress/clever/edit/master/docs/{{filepath_lang}}"
|
||||
},
|
||||
{
|
||||
"label": "GitHub",
|
||||
"icon": "fa fa-github",
|
||||
"position" : "left",
|
||||
"url": "https://github.com/CopterExpress/clover"
|
||||
"url": "https://github.com/CopterExpress/clever"
|
||||
}
|
||||
]
|
||||
},
|
||||
"addcssjs": {
|
||||
"css": ["../clover.css"],
|
||||
"js": ["../clover.js"]
|
||||
"css": ["../clever.css"],
|
||||
"js": ["../clever.js"]
|
||||
},
|
||||
"language-picker": {
|
||||
"languages": [["ru", "Russian"], ["en", "English"]]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from distutils.core import setup
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Information: https://clover.coex.tech/programming
|
||||
# Information: https://clever.coex.tech/en/programming.html
|
||||
|
||||
import rospy
|
||||
from clover import srv
|
||||
@@ -15,7 +15,7 @@ set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
|
||||
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
|
||||
# Take off and hover 1 m above the ground
|
||||
# Takeoff and hover 1 m above the ground
|
||||
navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
|
||||
|
||||
# Wait for 3 seconds
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
# Information: https://clover.coex.tech/en/aruco.html
|
||||
|
||||
import rospy
|
||||
from clover import srv
|
||||
from std_srvs.srv import Trigger
|
||||
|
||||
rospy.init_node('flight')
|
||||
|
||||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||||
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
|
||||
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
|
||||
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
|
||||
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
|
||||
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
|
||||
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
|
||||
# Take off and hover 1 m above the ground
|
||||
navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
|
||||
|
||||
# Wait for 3 seconds
|
||||
rospy.sleep(3)
|
||||
|
||||
# Fly 1 meter above ArUco marker 0
|
||||
navigate(x=0, y=0, z=1, frame_id='aruco_0')
|
||||
|
||||
# Wait for 3 seconds
|
||||
rospy.sleep(3)
|
||||
|
||||
# Fly to x=1 y=1 z=1 relative to ArUco markers map
|
||||
navigate(x=1, y=1, z=1, frame_id='aruco_map')
|
||||
|
||||
# Wait for 3 seconds
|
||||
rospy.sleep(3)
|
||||
|
||||
# Perform landing
|
||||
land()
|
||||
@@ -1,4 +1,4 @@
|
||||
# Information: https://clover.coex.tech/en/leds.html
|
||||
# Information: https://clever.coex.tech/en/leds.html
|
||||
|
||||
import rospy
|
||||
from clover.srv import SetLEDEffect
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
# Information: https://clover.coex.tech/en/snippets.html#block-nav
|
||||
|
||||
import math
|
||||
import rospy
|
||||
from clover import srv
|
||||
from std_srvs.srv import Trigger
|
||||
|
||||
rospy.init_node('flight')
|
||||
|
||||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||||
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
|
||||
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
|
||||
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
|
||||
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
|
||||
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
|
||||
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
|
||||
def navigate_wait(x=0, y=0, z=0, yaw=float('nan'), yaw_rate=0, speed=0.5, \
|
||||
frame_id='body', tolerance=0.2, auto_arm=False):
|
||||
|
||||
res = navigate(x=x, y=y, z=z, yaw=yaw, yaw_rate=yaw_rate, speed=speed, \
|
||||
frame_id=frame_id, auto_arm=auto_arm)
|
||||
|
||||
if not res.success:
|
||||
return res
|
||||
|
||||
while not rospy.is_shutdown():
|
||||
telem = get_telemetry(frame_id='navigate_target')
|
||||
if math.sqrt(telem.x ** 2 + telem.y ** 2 + telem.z ** 2) < tolerance:
|
||||
return res
|
||||
rospy.sleep(0.2)
|
||||
|
||||
# Take off 1 meter
|
||||
navigate_wait(z=1, frame_id='body', auto_arm=True)
|
||||
|
||||
# Fly forward 1 m
|
||||
navigate_wait(x=1, frame_id='body')
|
||||
|
||||
# Land
|
||||
land()
|
||||
@@ -62,10 +62,6 @@ hostnamectl set-hostname $NEW_HOSTNAME
|
||||
sed -i 's/127\.0\.1\.1.*/127.0.1.1\t'${NEW_HOSTNAME}' '${NEW_HOSTNAME}'.local/g' /etc/hosts
|
||||
# .local (mdns) hostname added to make it accesable when wlan and ethernet interfaces are down
|
||||
|
||||
echo_stamp "Enable ROS services"
|
||||
systemctl enable roscore
|
||||
systemctl enable clover
|
||||
|
||||
echo_stamp "Harware setup"
|
||||
/root/hardware_setup.sh
|
||||
|
||||
|
||||
9
builder/assets/python3.yaml
Normal file
9
builder/assets/python3.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
python3-wxgtk:
|
||||
debian:
|
||||
buster: [python3-wxgtk4.0]
|
||||
python3-serial:
|
||||
debian:
|
||||
buster: [python3-serial]
|
||||
python3-requests:
|
||||
debian:
|
||||
buster: [python3-requests]
|
||||
@@ -115,6 +115,7 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-network.
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/clover.service' '/lib/systemd/system/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/roscore.service' '/lib/systemd/system/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/melodic-rosdep-clover.yaml' '/etc/ros/rosdep/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/python3.yaml' '/etc/ros/rosdep/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/ros_python_paths' '/etc/sudoers.d/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/pigpiod.service' '/lib/systemd/system/'
|
||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/launch.nanorc' '/usr/share/nano/'
|
||||
|
||||
@@ -68,7 +68,8 @@ my_travis_retry() {
|
||||
# TODO: 'kinetic-rosdep-clover.yaml' should add only if we use our repo?
|
||||
echo_stamp "Init rosdep"
|
||||
my_travis_retry rosdep init
|
||||
echo "yaml file:///etc/ros/rosdep/melodic-rosdep-clover.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list
|
||||
echo "yaml file:///etc/ros/rosdep/melodic-rosdep-clover.yaml" > /etc/ros/rosdep/sources.list.d/30-clover.list
|
||||
echo "yaml file:///etc/ros/rosdep/python3.yaml" > /etc/ros/rosdep/sources.list.d/40-python3.list
|
||||
my_travis_retry rosdep update
|
||||
|
||||
echo_stamp "Populate rosdep for ROS user"
|
||||
@@ -87,6 +88,7 @@ resolve_rosdep() {
|
||||
}
|
||||
|
||||
export ROS_IP='127.0.0.1' # needed for running tests
|
||||
export ROS_PYTHON_VERSION=3
|
||||
|
||||
echo_stamp "Reconfiguring Clover repository for simplier unshallowing"
|
||||
cd /home/pi/catkin_ws/src/clover
|
||||
@@ -95,11 +97,15 @@ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
|
||||
echo_stamp "Build and install Clover"
|
||||
cd /home/pi/catkin_ws
|
||||
resolve_rosdep $(pwd)
|
||||
my_travis_retry pip install wheel
|
||||
my_travis_retry pip install -r /home/pi/catkin_ws/src/clover/clover/requirements.txt
|
||||
my_travis_retry pip3 install wheel
|
||||
my_travis_retry pip3 install -r /home/pi/catkin_ws/src/clover/clover/requirements.txt
|
||||
source /opt/ros/melodic/setup.bash
|
||||
catkin_make -j2 -DCMAKE_BUILD_TYPE=Release
|
||||
|
||||
echo_stamp "Enable ROS services"
|
||||
systemctl enable roscore
|
||||
systemctl enable clover
|
||||
|
||||
echo_stamp "Install clever package (for backwards compatibility)"
|
||||
cd /home/pi/catkin_ws/src/clover/builder/assets/clever
|
||||
./setup.py install
|
||||
@@ -129,7 +135,7 @@ echo_stamp "Install GeographicLib datasets (needed for mavros)" \
|
||||
|
||||
# FIXME: Buster comes with tornado==5.1.1 but we need tornado==4.2.1 for rosbridge_suite
|
||||
# (note that Python 3 will still have a more recent version)
|
||||
pip install tornado==4.2.1
|
||||
pip3 install tornado==4.2.1
|
||||
|
||||
echo_stamp "Running tests"
|
||||
cd /home/pi/catkin_ws
|
||||
|
||||
@@ -67,7 +67,7 @@ apt-get update \
|
||||
|
||||
echo "deb http://packages.ros.org/ros/ubuntu buster main" > /etc/apt/sources.list.d/ros-latest.list
|
||||
echo "deb http://deb.coex.tech/opencv3 buster main" > /etc/apt/sources.list.d/opencv3.list
|
||||
echo "deb http://deb.coex.tech/rpi-ros-melodic buster main" > /etc/apt/sources.list.d/rpi-ros-melodic.list
|
||||
echo "deb http://deb.coex.tech/melodic-py3 buster main" > /etc/apt/sources.list.d/rpi-ros-melodic.list
|
||||
echo "deb http://deb.coex.tech/clover buster main" > /etc/apt/sources.list.d/clover.list
|
||||
|
||||
echo_stamp "Update apt cache"
|
||||
@@ -95,21 +95,21 @@ libjpeg8 \
|
||||
tcpdump \
|
||||
ltrace \
|
||||
libpoco-dev \
|
||||
libzbar0 \
|
||||
python-rosdep \
|
||||
python-rosinstall-generator \
|
||||
python-wstool \
|
||||
python-rosinstall \
|
||||
python3-rosdep \
|
||||
python3-rosinstall-generator \
|
||||
python3-wstool \
|
||||
python3-rosinstall \
|
||||
build-essential \
|
||||
libffi-dev \
|
||||
monkey \
|
||||
pigpio python-pigpio python3-pigpio \
|
||||
i2c-tools \
|
||||
espeak espeak-data python-espeak \
|
||||
espeak espeak-data python3-espeak \
|
||||
ntpdate \
|
||||
python-dev \
|
||||
python3-dev \
|
||||
python-systemd \
|
||||
python3-venv \
|
||||
python3-systemd \
|
||||
mjpg-streamer \
|
||||
python3-opencv \
|
||||
&& echo_stamp "Everything was installed!" "SUCCESS" \
|
||||
@@ -133,13 +133,14 @@ pip3 --version
|
||||
|
||||
echo_stamp "Install and enable Butterfly (web terminal)"
|
||||
echo_stamp "Workaround for tornado >= 6.0 breaking butterfly"
|
||||
my_travis_retry pip3 install tornado==5.1.1
|
||||
my_travis_retry pip3 install tornado==4.2.1
|
||||
my_travis_retry pip3 install butterfly
|
||||
my_travis_retry pip3 install butterfly[systemd]
|
||||
systemctl enable butterfly.socket
|
||||
|
||||
echo_stamp "Install ws281x library"
|
||||
my_travis_retry pip install --prefer-binary rpi_ws281x
|
||||
my_travis_retry pip2 install --prefer-binary rpi_ws281x
|
||||
my_travis_retry pip3 install --prefer-binary rpi_ws281x
|
||||
|
||||
echo_stamp "Setup Monkey"
|
||||
mv /etc/monkey/sites/default /etc/monkey/sites/default.orig
|
||||
@@ -155,13 +156,9 @@ rm -rf node-v10.15.0-linux-armv6l/
|
||||
rm node-v10.15.0-linux-armv6l.tar.gz
|
||||
|
||||
echo_stamp "Installing ptvsd"
|
||||
my_travis_retry pip install ptvsd
|
||||
my_travis_retry pip2 install ptvsd
|
||||
my_travis_retry pip3 install ptvsd
|
||||
|
||||
echo_stamp "Installing pyzbar"
|
||||
my_travis_retry pip install pyzbar
|
||||
my_travis_retry pip3 install pyzbar
|
||||
|
||||
echo_stamp "Add .vimrc"
|
||||
cat << EOF > /home/pi/.vimrc
|
||||
set mouse-=a
|
||||
|
||||
@@ -18,13 +18,15 @@ echo "Run image tests"
|
||||
|
||||
export ROS_DISTRO='melodic'
|
||||
export ROS_IP='127.0.0.1'
|
||||
export ROS_PYTHON_VERSION=3
|
||||
source /opt/ros/melodic/setup.bash
|
||||
source /home/pi/catkin_ws/devel/setup.bash
|
||||
|
||||
cd /home/pi/catkin_ws/src/clover/builder/test/
|
||||
./tests.sh
|
||||
./tests.py
|
||||
./tests_py3.py
|
||||
# Disable Python 2 tests for image - we're dropping support, right?
|
||||
# ./tests_py2.py
|
||||
[[ $(./tests_clever.py) == "Warning: clever package is renamed to clover" ]] # test backwards compatibility
|
||||
|
||||
echo "Move /etc/ld.so.preload back to its original position"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# validate all required modules installed
|
||||
|
||||
@@ -17,6 +17,8 @@ from std_srvs.srv import Trigger
|
||||
from clover.srv import GetTelemetry, Navigate, NavigateGlobal, SetPosition, SetVelocity, \
|
||||
SetAttitude, SetRates, SetLEDEffect
|
||||
|
||||
get_telemetry = rospy.ServiceProxy('get_telemetry', GetTelemetry)
|
||||
|
||||
import tf2_ros
|
||||
import tf2_geometry_msgs
|
||||
|
||||
@@ -26,6 +28,5 @@ from pymavlink import mavutil
|
||||
import rpi_ws281x
|
||||
import pigpio
|
||||
from espeak import espeak
|
||||
from pyzbar import pyzbar
|
||||
|
||||
print cv2.getBuildInformation()
|
||||
print(cv2.getBuildInformation())
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# test backwards compatibility
|
||||
|
||||
|
||||
7
builder/test/tests_py2.py
Executable file
7
builder/test/tests_py2.py
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Make sure our Python 2 software is installed
|
||||
|
||||
import cv2
|
||||
|
||||
print(cv2.getBuildInformation())
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Make sure our Python 3 software is installed
|
||||
|
||||
import cv2
|
||||
from pyzbar import pyzbar
|
||||
|
||||
print(cv2.getBuildInformation())
|
||||
@@ -30,12 +30,6 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
||||
|
||||
find_package(GeographicLib REQUIRED)
|
||||
|
||||
find_package(OpenCV 3 REQUIRED
|
||||
COMPONENTS
|
||||
calib3d
|
||||
imgproc
|
||||
)
|
||||
|
||||
## System dependencies are found with CMake's conventions
|
||||
# find_package(Boost REQUIRED COMPONENTS system)
|
||||
|
||||
@@ -210,7 +204,6 @@ add_dependencies(shell ${PROJECT_NAME}_generate_messages_cpp)
|
||||
## Specify libraries to link a library or executable target against
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
${catkin_LIBRARIES}
|
||||
${OpenCV_LIBRARIES}
|
||||
)
|
||||
|
||||
#############
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
# `clover` ROS package
|
||||
|
||||
A bundle for autonomous navigation and drone control.
|
||||
|
||||
## Manual installation
|
||||
|
||||
Install ROS Melodic according to the [documentation](http://wiki.ros.org/melodic/Installation), then [create a Catkin workspace](http://wiki.ros.org/catkin/Tutorials/create_a_workspace).
|
||||
|
||||
Clone this repo to directory `~/catkin_ws/src/clover`:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src
|
||||
git clone https://github.com/CopterExpress/clover.git clover
|
||||
```
|
||||
|
||||
All the required ROS packages (including `mavros` and `opencv`) can be installed using `rosdep`:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/
|
||||
rosdep install -y --from-paths src --ignore-src
|
||||
```
|
||||
|
||||
Build ROS packages (on memory constrained platforms you might be going to need to use `-j1` key):
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws
|
||||
catkin_make -j1
|
||||
```
|
||||
|
||||
To complete `mavros` install you'll need to install `geographiclib` datasets:
|
||||
|
||||
```bash
|
||||
curl https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh | sudo bash
|
||||
```
|
||||
|
||||
You may optionally install udev rules to provide `/dev/px4fmu` symlink to your PX4-based flight controller connected over USB. Copy `99-px4fmu.rules` to your `/lib/udev/rules.d` folder:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws/src/clover/clover/config
|
||||
sudo cp 99-px4fmu.rules /lib/udev/rules.d
|
||||
```
|
||||
|
||||
Alternatively you may change the `fcu_url` property in `mavros.launch` file to point to your flight controller device.
|
||||
|
||||
## Running
|
||||
|
||||
Enable systemd service `roscore` (if not running):
|
||||
|
||||
```bash
|
||||
sudo systemctl enable /home/<username>/catkin_ws/src/clover/builder/assets/roscore.service
|
||||
sudo systemctl start roscore
|
||||
```
|
||||
|
||||
To start connection to SITL, use:
|
||||
|
||||
```bash
|
||||
roslaunch clover sitl.launch
|
||||
```
|
||||
|
||||
To start connection to the flight controller, use:
|
||||
|
||||
```bash
|
||||
roslaunch clover clover.launch
|
||||
```
|
||||
|
||||
> Note that the package is configured to connect to `/dev/px4fmu` by default (see [previous section](#manual-installation)). Install udev rules or specify path to your FCU device in `mavros.launch`.
|
||||
|
||||
Also, you can enable and start the systemd service:
|
||||
|
||||
```bash
|
||||
sudo systemctl enable /home/<username>/catkin_ws/src/clover/deploy/clover.service
|
||||
sudo systemctl start clover
|
||||
```
|
||||
45
clover/camera_info/fisheye_cam_320.yaml
Normal file
45
clover/camera_info/fisheye_cam_320.yaml
Normal file
@@ -0,0 +1,45 @@
|
||||
image_width: 320
|
||||
image_height: 240
|
||||
distortion_model: plumb_bob
|
||||
camera_name: raspicam
|
||||
camera_matrix:
|
||||
rows: 3
|
||||
cols: 3
|
||||
data:
|
||||
- 166.23942373073172
|
||||
- 0.
|
||||
- 162.19011246829268
|
||||
- 0.
|
||||
- 166.5880923974026
|
||||
- 109.82227735714285
|
||||
- 0.
|
||||
- 0.
|
||||
- 1.
|
||||
distortion_coefficients:
|
||||
rows: 1
|
||||
cols: 8
|
||||
data: [ 2.15356885e-01, -1.17472846e-01, -3.06197672e-04,
|
||||
-1.09444025e-04, -4.53657258e-03, 5.73090623e-01,
|
||||
-1.27574577e-01, -2.86125589e-02, 0.00000000e+00,
|
||||
0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
|
||||
0.00000000e+00, 0.00000000e+00]
|
||||
rectification_matrix:
|
||||
rows: 3
|
||||
cols: 3
|
||||
data: [1, 0, 0, 0, 1, 0, 0, 0, 1]
|
||||
projection_matrix:
|
||||
rows: 3
|
||||
cols: 4
|
||||
data:
|
||||
- 166.23942373073172
|
||||
- 0.
|
||||
- 162.19011246829268
|
||||
- 0.
|
||||
- 0.
|
||||
- 166.5880923974026
|
||||
- 109.82227735714285
|
||||
- 0.
|
||||
- 0.
|
||||
- 0.
|
||||
- 1.
|
||||
- 0.
|
||||
@@ -1,17 +1,17 @@
|
||||
image_width: 640
|
||||
image_height: 480
|
||||
distortion_model: plumb_bob
|
||||
camera_name: main_camera_optical
|
||||
camera_name: raspicam
|
||||
camera_matrix:
|
||||
rows: 3
|
||||
cols: 3
|
||||
data:
|
||||
- 332.47884746146343
|
||||
- 0.
|
||||
- 320.0
|
||||
- 324.38022493658536
|
||||
- 0.
|
||||
- 333.1761847948052
|
||||
- 240.0
|
||||
- 219.6445547142857
|
||||
- 0.
|
||||
- 0.
|
||||
- 1.
|
||||
@@ -3,7 +3,7 @@
|
||||
<arg name="aruco_map" default="false"/>
|
||||
<arg name="aruco_vpe" default="false"/>
|
||||
|
||||
<!-- For additional help go to https://clover.coex.tech/aruco -->
|
||||
<!-- For additional help go to https://clever.coex.tech/aruco -->
|
||||
|
||||
<!-- aruco_detect: detect aruco markers, estimate poses -->
|
||||
<node name="aruco_detect" pkg="nodelet" if="$(arg aruco_detect)" type="nodelet" args="load aruco_pose/aruco_detect nodelet_manager" output="screen" clear_params="true">
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<launch>
|
||||
<arg name="fcu_conn" default="usb"/>
|
||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
||||
<arg name="fcu_sys_id" default="1"/>
|
||||
<arg name="gcs_bridge" default="tcp"/>
|
||||
<arg name="web_video_server" default="true"/>
|
||||
<arg name="rosbridge" default="true"/>
|
||||
@@ -20,7 +19,6 @@
|
||||
<include file="$(find clover)/launch/mavros.launch">
|
||||
<arg name="fcu_conn" value="$(arg fcu_conn)"/>
|
||||
<arg name="fcu_ip" value="$(arg fcu_ip)"/>
|
||||
<arg name="fcu_sys_id" value="$(arg fcu_sys_id)"/>
|
||||
<arg name="gcs_bridge" value="$(arg gcs_bridge)"/>
|
||||
</include>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<launch>
|
||||
<!-- article about camera setup: https://clover.coex.tech/camera_setup -->
|
||||
<!-- article about camera setup: https://clever.coex.tech/camera_frame -->
|
||||
|
||||
<arg name="direction_z" default="down"/> <!-- direction the camera points: down, up -->
|
||||
<arg name="direction_y" default="backward"/> <!-- direction the camera cable points: backward, forward -->
|
||||
@@ -18,14 +18,14 @@
|
||||
<node pkg="nodelet" type="nodelet" name="main_camera" args="load cv_camera/CvCameraNodelet nodelet_manager" clear_params="true">
|
||||
<param name="device_path" value="/dev/video0"/> <!-- v4l2 device -->
|
||||
<param name="frame_id" value="main_camera_optical"/>
|
||||
<param name="camera_info_url" value="file://$(find clover)/camera_info/fisheye_cam.yaml"/>
|
||||
<param name="camera_info_url" value="file://$(find clover)/camera_info/fisheye_cam_320.yaml"/>
|
||||
|
||||
<param name="rate" value="100"/> <!-- poll rate -->
|
||||
<param name="cv_cap_prop_fps" value="40"/> <!-- camera FPS -->
|
||||
<param name="capture_delay" value="0.02"/> <!-- approximate delay on frame retrieving -->
|
||||
<param name="rescale_camera_info" value="true"/> <!-- automatically rescale camera calibration info -->
|
||||
|
||||
<!-- camera resolution -->
|
||||
<!-- camera resolution, NOTE: camera_info file should match it -->
|
||||
<param name="image_width" value="320"/>
|
||||
<param name="image_height" value="240"/>
|
||||
</node>
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
<launch>
|
||||
<arg name="fcu_conn" default="usb"/> <!-- options: usb, uart, tcp, udp, sitl -->
|
||||
<arg name="fcu_ip" default="127.0.0.1"/>
|
||||
<arg name="fcu_sys_id" default="1"/>
|
||||
<arg name="gcs_bridge" default="tcp"/>
|
||||
<arg name="viz" default="true"/>
|
||||
<arg name="respawn" default="true"/>
|
||||
@@ -20,9 +19,6 @@
|
||||
<!-- sitl since PX4 1.9.0 -->
|
||||
<param name="fcu_url" value="udp://@$(arg fcu_ip):14580" if="$(eval fcu_conn == 'sitl')"/>
|
||||
|
||||
<!-- set target_system_id -->
|
||||
<param name="target_system_id" value="$(arg fcu_sys_id)" />
|
||||
|
||||
<!-- gcs bridge -->
|
||||
<param name="gcs_url" value="tcp-l://0.0.0.0:5760" if="$(eval gcs_bridge == 'tcp')"/>
|
||||
<param name="gcs_url" value="udp://0.0.0.0:14550@14550" if="$(eval gcs_bridge == 'udp')"/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format="2">
|
||||
<package format="3">
|
||||
<name>clover</name>
|
||||
<version>0.0.1</version>
|
||||
<description>The Clover package</description>
|
||||
@@ -7,7 +7,7 @@
|
||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||
<license>MIT</license>
|
||||
|
||||
<url type="website">https://clover.coex.tech/</url>
|
||||
<url type="website">https://clever.coex.tech/</url>
|
||||
<author email="okalachev@gmail.com">Oleg Kalachev</author>
|
||||
<author email="urpylka@gmail.com">Artem Smirnov</author>
|
||||
|
||||
@@ -37,8 +37,10 @@
|
||||
<depend>rosbridge_server</depend>
|
||||
<depend>web_video_server</depend>
|
||||
<depend>tf2_web_republisher</depend>
|
||||
<depend>python-lxml</depend>
|
||||
<exec_depend>python-pymavlink</exec_depend>
|
||||
<depend condition="$ROS_PYTHON_VERSION == 2">python-lxml</depend>
|
||||
<depend condition="$ROS_PYTHON_VERSION == 3">python3-lxml</depend>
|
||||
<exec_depend condition="$ROS_PYTHON_VERSION == 2">python-pymavlink</exec_depend>
|
||||
<exec_depend condition="$ROS_PYTHON_VERSION == 3">python-pymavlink</exec_depend>
|
||||
<!-- Use test_depend for packages you need only for testing: -->
|
||||
<!-- <test_depend>gtest</test_depend> -->
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
flask==1.1.1
|
||||
docopt==0.6.2
|
||||
geopy==1.11.0
|
||||
smbus2==0.2.1
|
||||
VL53L1X==0.0.2
|
||||
geopy==1.20.0
|
||||
smbus2==0.3.0
|
||||
VL53L1X==0.0.4
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/env python
|
||||
#!/usr/bin/env python3
|
||||
# coding=utf-8
|
||||
|
||||
# Copyright (C) 2018 Copter Express Technologies
|
||||
@@ -138,7 +138,7 @@ def mavlink_exec(cmd, timeout=3.0):
|
||||
timeout=3,
|
||||
baudrate=0,
|
||||
count=len(cmd),
|
||||
data=map(ord, cmd.ljust(70, '\0')))
|
||||
data=[ord(c) for c in cmd.ljust(70, '\0')])
|
||||
msg.pack(link)
|
||||
ros_msg = mavlink.convert_to_rosmsg(msg)
|
||||
mavlink_pub.publish(ros_msg)
|
||||
@@ -210,7 +210,7 @@ def check_fcu():
|
||||
is_clover_firmware = True
|
||||
|
||||
if not is_clover_firmware:
|
||||
failure('not running Clover PX4 firmware, https://clover.coex.tech/firmware')
|
||||
failure('not running Clover PX4 firmware, https://clever.coex.tech/firmware')
|
||||
|
||||
est = get_param('SYS_MC_EST_GROUP')
|
||||
if est == 1:
|
||||
@@ -250,11 +250,11 @@ def check_fcu():
|
||||
try:
|
||||
battery = rospy.wait_for_message('mavros/battery', BatteryState, timeout=3)
|
||||
if not battery.cell_voltage:
|
||||
failure('cell voltage is not available, https://clover.coex.tech/power')
|
||||
failure('cell voltage is not available, https://clever.coex.tech/power')
|
||||
else:
|
||||
cell = battery.cell_voltage[0]
|
||||
if cell > 4.3 or cell < 3.0:
|
||||
failure('incorrect cell voltage: %.2f V, https://clover.coex.tech/power', cell)
|
||||
failure('incorrect cell voltage: %.2f V, https://clever.coex.tech/power', cell)
|
||||
elif cell < 3.7:
|
||||
failure('critically low cell voltage: %.2f V, recharge battery', cell)
|
||||
except rospy.ROSException:
|
||||
@@ -609,7 +609,7 @@ def check_rangefinder():
|
||||
|
||||
@check('Boot duration')
|
||||
def check_boot_duration():
|
||||
output = subprocess.check_output('systemd-analyze')
|
||||
output = subprocess.check_output('systemd-analyze').decode()
|
||||
r = re.compile(r'([\d\.]+)s\s*$', flags=re.MULTILINE)
|
||||
duration = float(r.search(output).groups()[0])
|
||||
if duration > 15:
|
||||
@@ -620,7 +620,7 @@ def check_boot_duration():
|
||||
def check_cpu_usage():
|
||||
WHITELIST = 'nodelet',
|
||||
CMD = "top -n 1 -b -i | tail -n +8 | awk '{ printf(\"%-8s\\t%-8s\\t%-8s\\n\", $1, $9, $12); }'"
|
||||
output = subprocess.check_output(CMD, shell=True)
|
||||
output = subprocess.check_output(CMD, shell=True).decode()
|
||||
processes = output.split('\n')
|
||||
for process in processes:
|
||||
if not process:
|
||||
@@ -636,7 +636,7 @@ def check_cpu_usage():
|
||||
def check_clover_service():
|
||||
try:
|
||||
output = subprocess.check_output('systemctl show -p ActiveState --value clover.service'.split(),
|
||||
stderr=subprocess.STDOUT)
|
||||
stderr=subprocess.STDOUT).decode()
|
||||
except subprocess.CalledProcessError as e:
|
||||
failure('systemctl returned %s: %s', e.returncode, e.output)
|
||||
return
|
||||
@@ -718,7 +718,7 @@ def check_network():
|
||||
if ros_hostname in parts:
|
||||
break
|
||||
else:
|
||||
failure('not found %s in /etc/hosts, ROS will malfunction if network interfaces are down, https://clover.coex.tech/hostname', ros_hostname)
|
||||
failure('not found %s in /etc/hosts, ROS will malfunction if network interfaces are down, https://clever.coex.tech/hostname', ros_hostname)
|
||||
|
||||
|
||||
@check('RPi health')
|
||||
@@ -751,7 +751,7 @@ def check_rpi_health():
|
||||
# <parameter>=<value>
|
||||
# In case of `get_throttled`, <value> is a hexadecimal number
|
||||
# with some of the FLAGs OR'ed together
|
||||
output = subprocess.check_output(['vcgencmd', 'get_throttled'])
|
||||
output = subprocess.check_output(['vcgencmd', 'get_throttled']).decode()
|
||||
except OSError:
|
||||
failure('could not call vcgencmd binary; not a Raspberry Pi?')
|
||||
return
|
||||
|
||||
@@ -490,7 +490,7 @@ inline void checkState()
|
||||
throw std::runtime_error("State timeout, check mavros settings");
|
||||
|
||||
if (!state.connected)
|
||||
throw std::runtime_error("No connection to FCU, https://clover.coex.tech/connection");
|
||||
throw std::runtime_error("No connection to FCU, https://clever.coex.tech/connection");
|
||||
}
|
||||
|
||||
#define ENSURE_FINITE(var) { if (!std::isfinite(var)) throw std::runtime_error(#var " argument cannot be NaN or Inf"); }
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python
|
||||
import rospy
|
||||
import pytest
|
||||
from mavros_msgs.msg import State
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> <!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Слой_1" x="0px" y="0px" viewBox="0 0 1224.8 637.4" style="enable-background:new 0 0 1224.8 637.4;" xml:space="preserve"> <style type="text/css"> .st0{fill:#FFFFFF;} </style> <g> <g> <rect x="621.2" y="212.9" class="st0" width="160.1" height="18.5"></rect> <rect x="621.2" y="406.9" class="st0" width="160.1" height="18.5"></rect> <rect x="621.2" y="309.4" class="st0" width="160.1" height="18.5"></rect> </g> <g> <path class="st0" d="M496.7,406.5c-45.3,0-82.6-34.5-87.1-78.6H391c4.4,54.5,50.1,97.4,105.7,97.4c55.5,0,101.1-43,105.7-97.4 h-18.6C579.3,372,541.9,406.5,496.7,406.5z"></path> <path class="st0" d="M496.7,231.4c45,0,82.2,34.2,87,78h18.6c-4.9-54-50.4-96.5-105.6-96.5c-55.1,0-100.6,42.4-105.6,96.5h18.6 C414.4,265.6,451.6,231.4,496.7,231.4z"></path> </g> <g> <polygon class="st0" points="982.7,246 982.8,246 1011.9,212.9 987.2,212.9 918.3,291.1 930.6,305.1 "></polygon> <polygon class="st0" points="905.9,305.1 905.9,305.1 824.5,212.9 799.8,212.9 893.5,319.1 799.8,425.4 824.5,425.4 905.9,333.2 905.9,333.2 918.3,319.1 "></polygon> <polygon class="st0" points="918.2,347.1 987.2,425.4 1011.9,425.4 930.6,333.1 "></polygon> </g> <path class="st0" d="M230.3,318.7c0-48.4,39.3-87.7,87.7-87.7h53.9v-18.5H317c-58,0.7-105.2,48.3-105.2,106.2 c0,57.8,45.4,104.5,103.6,106.2h56.8v-18.5H318C269.6,406.4,230.3,367,230.3,318.7z"></path> </g> </svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,19 +1,7 @@
|
||||
<style>
|
||||
body { margin: 0; font-family: 'Roboto', Arial; }
|
||||
header { height: 67px; background: black; position: relative; }
|
||||
header .logo { display: block; width: 160px; height: 83px; background: url(img/coex.svg) 100% 100%;}
|
||||
header .clover { position: absolute; right: 100px; top: 10px; font-size: 35px; }
|
||||
</style>
|
||||
|
||||
<header>
|
||||
<a href="/" class=logo></a>
|
||||
<div class=clover>🍀</div>
|
||||
</header>
|
||||
|
||||
<h1>Clover Drone Kit Tools</h1>
|
||||
|
||||
<ul>
|
||||
<li><a href="docs">View documentation</a> (snapshot of <a href="https://clover.coex.tech">clover.coex.tech</a>)</li>
|
||||
<li><a href="docs">View documentation</a> (snapshot of <a href="https://clever.coex.tech">clever.coex.tech</a>)</li>
|
||||
<li><a href="" id="wvs">View image topics</a> (<code>web_video_server</code>)</li>
|
||||
<li><a href="" id="butterfly">Open web terminal</a> (<code>Butterfly</code>)</li>
|
||||
<li><a href="viz.html">View 3D visualization</a> (<code>ros3djs</code>)</li>
|
||||
|
||||
59075
clover/www/js/ros3d.js
vendored
59075
clover/www/js/ros3d.js
vendored
File diff suppressed because one or more lines are too long
1571
clover/www/js/three.min.js
vendored
1571
clover/www/js/three.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 56 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 183 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 98 KiB |
Binary file not shown.
@@ -40,7 +40,7 @@ section ul li:before {
|
||||
margin-bottom: 0.85em;
|
||||
}
|
||||
|
||||
/* Main Clover image */
|
||||
/* Main Clever image */
|
||||
.book img.bigclever {
|
||||
margin-bottom: -12%;
|
||||
}
|
||||
@@ -6,7 +6,7 @@ The project was created in collaboration with Texel inc. that develops 3D-scanne
|
||||
|
||||
Our fellows from Texel provided a module consisting of a Raspberry Pi and a PrimeSense 3D-sensor.
|
||||
|
||||
We provided a Clover 3 drone that's capable of autonomous flight and wrote a flight program.
|
||||
We provided a Clever 3 drone that's capable of autonomous flight and wrote a flight program.
|
||||
|
||||
To make it all work we conducted many tests, made changes in the drone's design and tuned the drone properly.
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# COEX Clover
|
||||
# COEX Clever
|
||||
|
||||
<img class="center bigclever zoom" src="../assets/clever4-front-white-large.png" width="80%" alt="COEX Clover 4">
|
||||
<img class="center bigclever zoom" src="../assets/clever4-front-white-large.png" width="80%" alt="COEX Clever 4">
|
||||
|
||||
**Clover** is an educational kit of a programmable quadcopter that consists of popular open source components, and a set of necessary documentation and libraries for working with it.
|
||||
CLEVER (Russian: *"Клевер"*, meaning *"Clover"*) is an educational kit of a programmable quadcopter that consists of popular open source components, and a set of necessary documentation and libraries for working with it.
|
||||
|
||||
The kit includes a Pixhawk/Pixracer flight controller with the PX4 flight stack, a [Raspberry Pi 4](raspberry.md) as a controlling onboard computer, and a [camera module](camera.md) for performing flights with the use of computer vision, as well as a set of various sensors and other peripherals.
|
||||
The kit includes a Pixhawk/Pixracer flight controller with the PX4 flight stack, a [Raspberry Pi 3](raspberry.md) as a controlling onboard computer, and a [camera module](camera.md) for performing flights with the use of computer vision, as well as a set of various sensors and other peripherals.
|
||||
|
||||
The Clover platform contains a [pre-configured image for Raspberry Pi](image.md) with the full set of required software for working with peripheral devices and [programming autonomous flights](simple_offboard.md). The source code of the platform and of the documentation is open and [available on GitHub](https://github.com/CopterExpress/clover).
|
||||
The Clever platform contains a [pre-configured image for Raspberry Pi](image.md) with the full set of required software for working with peripheral devices and [programming autonomous flights](simple_offboard.md). The source code of the platform and of the documentation is open and [available on GitHub](https://github.com/CopterExpress/clever).
|
||||
|
||||
If you have studied the documentation but have not found an answer to your question, join our support chat and our specialists will be happy to answer you: [@COEXHelpdesk](tg://resolve?domain=COEXHelpdesk).
|
||||
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
* [Glossary](gloss.md)
|
||||
* [Safety tips](safety.md)
|
||||
* Assembly
|
||||
* [Clover 4 assembly](assemble_4.md)
|
||||
* [Clover 3 assembly](assemble_3.md)
|
||||
* [Clover 2 assembly](assemble_2.md)
|
||||
* [Clever 4 assembly](assemble_4.md)
|
||||
* [Clever 3 assembly](assemble_3.md)
|
||||
* [Clever 2 assembly](assemble_2.md)
|
||||
* Configuration
|
||||
* [Initial setup](setup.md)
|
||||
* [Sensor calibration](calibration.md)
|
||||
@@ -52,9 +52,8 @@
|
||||
* [PID Setup](calibratePID.md)
|
||||
* [Model files for parts](models.md)
|
||||
* [ROS Melodic installation](ros-install.md)
|
||||
* [Camera calibration](camera_calibration.md)
|
||||
* [Quadcopter control with 4G communication](4g.md)
|
||||
* [Clover and Jetson Nano](jetson_nano.md)
|
||||
* [Clever and Jetson Nano](jetson_nano.md)
|
||||
* [Remote control app](rc.md)
|
||||
* [Wi-Fi Configuration](network.md)
|
||||
* [UART settings](uart.md)
|
||||
@@ -65,20 +64,18 @@
|
||||
* [Multimeter usage](test_connection.md)
|
||||
* [RC Troubleshooting](radioerrors.md)
|
||||
* [Flashing ESCs](esc_firmware.md)
|
||||
* [Camera calibration](camera_calibration.md)
|
||||
* [Interfacing with Arduino](arduino.md)
|
||||
* [Connecting GPS](gps.md)
|
||||
* [Working with IR sensors on Raspberry Pi 3](ir_sensors.md)
|
||||
* [FPV Setup](fpv.md)
|
||||
* [Trainer mode](trainer_mode.md)
|
||||
* [Tinning](tinning.md)
|
||||
* [Types of power connectors](connectortypes.md)
|
||||
* [Connecting 4 in 1 ESCs](4in1.md)
|
||||
* [Soldering safety](tb.md)
|
||||
* [LED strip (legacy)](leds_old.md)
|
||||
* [Contribution Guidelines](contributing.md)
|
||||
* [Migration to v0.20](migrate20.md)
|
||||
* Clover-based projects
|
||||
* [Drone show](clever-show.md)
|
||||
* Clever-based projects
|
||||
* [Copter spheric guard](shield.md)
|
||||
* [Face recognition system](face_recognition.md)
|
||||
* [Android RC app](android.md)
|
||||
@@ -87,4 +84,3 @@
|
||||
* [Copter Hack 2019](copterhack2019.md)
|
||||
* [Copter Hack 2018](copterhack2018.md)
|
||||
* [Copter Hack 2017](copterhack2017.md)
|
||||
* [Camera calibration (legacy)](camera_calib.md)
|
||||
|
||||
@@ -14,11 +14,11 @@ However, to make you fully understand the application, I will tell you about eac
|
||||
|
||||
## Wrapper
|
||||
|
||||
Let's start with the simplest thing — the appearance of our application. At [**GitHub**](https://github.com/CopterExpress/clover/tree/master/apps/android/app/src/main/assets), you can find *HTML*, *CSS* and *JavaScript* files, which make up the web page to be used for controlling the copter. To have this page displayed in our application, do the following:
|
||||
Let's start with the simplest thing — the appearance of our application. At [**GitHub**](https://github.com/CopterExpress/clever/tree/master/apps/android/app/src/main/assets), you can find *HTML*, *CSS* and *JavaScript* files, which make up the web page to be used for controlling the copter. To have this page displayed in our application, do the following:
|
||||
|
||||
1. Create folder **assets** in the main folder of the app named **app**
|
||||
|
||||
2. Add to it all files from [here](https://github.com/CopterExpress/clover/tree/master/apps/android/app/src/main/assets)
|
||||
2. Add to it all files from [here](https://github.com/CopterExpress/clever/tree/master/apps/android/app/src/main/assets)
|
||||
|
||||
If you reached this stage, you already have the web page you want, congratulations! Now we have to display it somehow in the app. To do this, in class *activity* in method **onCreate**, write the following code:
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ For interaction with ROS topics and services on a Raspberry Pi, you can use the
|
||||
|
||||
The main tutorial for rosserial: http://wiki.ros.org/rosserial_arduino/Tutorials
|
||||
|
||||
Arudino is to be installed on Clover and connected via a USB port.
|
||||
Arudino is to be installed on Clever and connected via a USB port.
|
||||
|
||||
## Configuring Arduino IDE
|
||||
|
||||
@@ -24,7 +24,7 @@ To run the program on Arduino once, you can use command:
|
||||
roslaunch clever arduino.launch
|
||||
```
|
||||
|
||||
To start the link with Arduino at the startup automatically, set argument `arudino` in the Clover launch file (`~/catkin_ws/src/clever/clever/launch/clever.launch`):
|
||||
To start the link with Arduino at the startup automatically, set argument `arudino` in the Clever launch file (`~/catkin_ws/src/clever/clever/launch/clever.launch`):
|
||||
|
||||
```xml
|
||||
<arg name="arduino" default="true"/>
|
||||
@@ -59,7 +59,7 @@ for(int i=0; i<8; i++) {
|
||||
}
|
||||
```
|
||||
|
||||
## Working with Clover
|
||||
## Working with Clever
|
||||
|
||||
The set of services and topics is similar to the regular set in [simple_offboard](simple_offboard.md) and [mavros](mavros.md).
|
||||
|
||||
@@ -69,7 +69,7 @@ An example of a program that controls the copter by position using the `navigate
|
||||
// Connecting libraries for working with rosseral
|
||||
#include <ros.h>
|
||||
|
||||
// Connecting Clover and MAVROS package message header files
|
||||
// Connecting Clever and MAVROS package message header files
|
||||
#include <clever/Navigate.h>
|
||||
#include <mavros_msgs/SetMode.h>
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ArUco markers
|
||||
|
||||
> **Note** The following applies to [image versions](image.md) **0.16** and up. Older documentation is still available for [for version **0.15.1**](https://github.com/CopterExpress/clover/blob/v0.15.1/docs/en/aruco.md).
|
||||
> **Note** The following applies to [image versions](image.md) **0.16** and up. Older documentation is still available for [for version **0.15.1**](https://github.com/CopterExpress/clever/blob/v0.15.1/docs/ru/aruco.md).
|
||||
|
||||
[ArUco markers](https://docs.opencv.org/3.2.0/d5/dae/tutorial_aruco_detection.html) are commonly used for vision-based position estimation.
|
||||
|
||||
@@ -12,13 +12,13 @@ Examples of ArUco markers:
|
||||
|
||||
For rapid generation of markers for printing, you may use an online tool: http://chev.me/arucogen/.
|
||||
|
||||
[Clover Raspberry Pi image](image.md) contains a pre-installed `aruco_pose` ROS package, which can be used for marker detection.
|
||||
[Clever Raspberry Pi image](image.md) contains a pre-installed `aruco_pose` ROS package, which can be used for marker detection.
|
||||
|
||||
## Modes of operation
|
||||
|
||||
There are several preconfigured modes of operation for ArUco markers on the Clover drone:
|
||||
There are several preconfigured modes of operation for ArUco markers on the Clever drone:
|
||||
|
||||
* [single marker detection and navigation](aruco_marker.md);
|
||||
* [map-based navigation](aruco_map.md).
|
||||
|
||||
> **Info** Additional documentation for the `aruco_pose` ROS package is available [on GitHub](https://github.com/CopterExpress/clover/blob/master/aruco_pose/README.md).
|
||||
> **Info** Additional documentation for the `aruco_pose` ROS package is available [on GitHub](https://github.com/CopterExpress/clever/blob/master/aruco_pose/README.md).
|
||||
|
||||
@@ -45,7 +45,7 @@ Map path is defined in the `map` parameter:
|
||||
<param name="map" value="$(find aruco_pose)/map/map.txt"/>
|
||||
```
|
||||
|
||||
Some map examples are provided in [`~/catkin_ws/src/clever/aruco_pose/map`](https://github.com/CopterExpress/clover/tree/master/aruco_pose/map).
|
||||
Some map examples are provided in [`~/catkin_ws/src/clever/aruco_pose/map`](https://github.com/CopterExpress/clever/tree/master/aruco_pose/map).
|
||||
|
||||
Grid maps may be generated using the `genmap.py` script:
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Clover 2 construction kit assembly instruction
|
||||
Clever 2 construction kit assembly instruction
|
||||
============================================
|
||||
|
||||

|
||||

|
||||
|
||||
## The constructor kit contents
|
||||
|
||||
@@ -78,7 +78,7 @@ Clover 2 construction kit assembly instruction
|
||||
|
||||
## Additional equipment
|
||||
|
||||
### This equipment is not part of the Clover 2 constructor kit, but it is required for the assembly process
|
||||
### This equipment is not part of the Clever 2 constructor kit, but it is required for the assembly process
|
||||
|
||||
1. Soldering iron
|
||||
2. Colophony/ Flux (neutral)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Assembly of Clover 3
|
||||
# Assembly of Clever 3
|
||||
|
||||
This manual discusses the assembly of the COEX Clover 3 kit with a 4 in 1 EDC circuit-board.
|
||||
This manual discusses the assembly of the COEX Clever 3 kit with a 4 in 1 EDC circuit-board.
|
||||
|
||||

|
||||

|
||||
|
||||
> **Caution** Before using soldering equipment, be sure to read the [safety precautions when soldering](tb.md).
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Clover 4 assembly
|
||||
# Clever 4 assembly
|
||||
|
||||
<img src="../assets/assembling_clever4/clover_assembly.png" width=900 class="zoom center">
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Step-by-step guide on autonomous flight with Clover 4
|
||||
# Step-by-step guide on autonomous flight with Clever 4
|
||||
|
||||
This manual contains links to other articles in which each of the topics addressed is discussed in more detail. If you encounter difficulties while reading one of these articles, it is recommended that you return to this manual, since many operations here are described step by step and some unnecessary steps are skipped.
|
||||
|
||||
@@ -15,9 +15,9 @@ This manual contains links to other articles in which each of the topics address
|
||||
|
||||
- Connect to Wi-Fi and open the web interface ([this article](wifi.md)).
|
||||
|
||||
After the first power-up, the network appears with a delay. You need to wait until the system is fully loaded. If the Clover network does not appear in the list of networks for a long time, reopen the window with the network selection. Then the list of networks will be updated.
|
||||
After the first power-up, the network appears with a delay. You need to wait until the system is fully loaded. If the Clever network does not appear in the list of networks for a long time, reopen the window with the network selection. Then the list of networks will be updated.
|
||||
|
||||
> **Hint** Now if you have connected to the Clover's Wi-Fi network, it is recommended to open the [local version of this guide](http://192.168.11.1/docs/ru/auto_setup.html), otherwise the links will not work.
|
||||
> **Hint** Now if you have connected to the Clever's Wi-Fi network, it is recommended to open the [local version of this guide](http://192.168.11.1/docs/ru/auto_setup.html), otherwise the links will not work.
|
||||
|
||||
- Connect to Raspberry Pi via SSH.
|
||||
|
||||
@@ -47,7 +47,7 @@ This manual contains links to other articles in which each of the topics address
|
||||
|
||||
## Basic commands
|
||||
|
||||
You will need the basic Linux commands, as well as special Clover commands, to work efficiently in the system.
|
||||
You will need the basic Linux commands, as well as special Clever commands, to work efficiently in the system.
|
||||
|
||||
Show list of files and folders:
|
||||
|
||||
@@ -289,7 +289,7 @@ and replace map.txt with your map name.
|
||||
|
||||
- Connect remotely to the flight controller through QGroundControl.
|
||||
|
||||
All the necessary settings for that are already set in Clover. Now you need to create a new connection in QGroundControl. Use the settings from [this article](gcs_bridge.md).
|
||||
All the necessary settings for that are already set in Clever. Now you need to create a new connection in QGroundControl. Use the settings from [this article](gcs_bridge.md).
|
||||
|
||||
## Remote controller setup
|
||||
|
||||
@@ -297,7 +297,7 @@ and replace map.txt with your map name.
|
||||
|
||||
Set channel 5 to SwC switch; channel 5 to SwA switch. Or you can use any other switches you like.
|
||||
|
||||
## Clover selfcheck
|
||||
## Clever selfcheck
|
||||
|
||||
Perform selfcheck when you have set up your drone or when you have faced problems. The selfcheck process is described in the article "[Automated self checks](selfcheck.md)"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ systemd
|
||||
|
||||
Main documentation: [https://wiki.archlinux.org/index.php/Systemd_(Russian)](https://wiki.archlinux.org/index.php/Systemd_(Russian)).
|
||||
|
||||
All automatically started Clover software is launched as a `clever.service` systemd service.
|
||||
All automatically started Clever software is launched as a `clever.service` systemd service.
|
||||
|
||||
The service may be restarted by the `systemctl` command:
|
||||
|
||||
@@ -20,14 +20,14 @@ Text output of the software can be viewed using the `journalctl` command:
|
||||
journalctl -u clever
|
||||
```
|
||||
|
||||
To run Clover software directly in the current console session, you can use the `roslaunch` command:
|
||||
To run Clever software directly in the current console session, you can use the `roslaunch` command:
|
||||
|
||||
```(bash)
|
||||
sudo systemctl restart clever
|
||||
roslaunch clever clever.launch
|
||||
```
|
||||
|
||||
You can disable Clover software autolaunch using the `disable` command:
|
||||
You can disable Clever software autolaunch using the `disable` command:
|
||||
|
||||
```(bash)
|
||||
sudo systemctl disable clever
|
||||
|
||||
@@ -88,66 +88,53 @@ image_pub.publish(bridge.cv2_to_imgmsg(cv_image, 'bgr8'))
|
||||
|
||||
The obtained images can be viewed using [web_video_server](web_video_server.md).
|
||||
|
||||
#### Retrieving one frame
|
||||
|
||||
It's possibly to retrieve one camera frame at a time. This method works slower than normal topic subscribing and should not be used when it's necessary to process camera images continuously.
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from sensor_msgs.msg import Image
|
||||
from cv_bridge import CvBridge
|
||||
|
||||
rospy.init_node('computer_vision_sample')
|
||||
bridge = CvBridge()
|
||||
|
||||
# ...
|
||||
|
||||
# Retrieve a frame:
|
||||
img = bridge.imgmsg_to_cv2(rospy.wait_for_message('main_camera/image_raw', Image), 'bgr8')
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
#### Working with QR codes
|
||||
|
||||
> **Hint** For high-speed recognition and positioning, it is better to use [ArUco markers](aruco.md).
|
||||
|
||||
To program actions of the copter for the detection of [QR codes](https://en.wikipedia.org/wiki/QR_code) you can use the [pyZBar](https://pypi.org/project/pyzbar/). This lib is installed in the last image for Raspberry Pi.
|
||||
To program actions of the copter upon detection of [QR codes](https://en.wikipedia.org/wiki/QR_code) you can use the [ZBar] library (http://zbar.sourceforge.net). It should be installed using pip:
|
||||
|
||||
```bash
|
||||
sudo pip install zbar
|
||||
```
|
||||
|
||||
QR codes recognition in Python:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from pyzbar import pyzbar
|
||||
import cv2
|
||||
import zbar
|
||||
from cv_bridge import CvBridge
|
||||
from sensor_msgs.msg import Image
|
||||
|
||||
bridge = CvBridge()
|
||||
|
||||
rospy.init_node('barcode_test')
|
||||
scanner = zbar.ImageScanner()
|
||||
scanner.parse_config('enable')
|
||||
|
||||
# Image subscriber callback function
|
||||
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_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))
|
||||
gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY, dstCn=0)
|
||||
|
||||
pil = ImageZ.fromarray(gray)
|
||||
raw = pil.tobytes()
|
||||
|
||||
image = zbar.Image(320, 240, 'Y800', raw) # Image params
|
||||
scanner.scan(image)
|
||||
|
||||
for symbol in image:
|
||||
# print detected QR code
|
||||
print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data
|
||||
|
||||
image_sub = rospy.Subscriber('main_camera/image_raw', Image, image_callback, queue_size=1)
|
||||
|
||||
rospy.spin()
|
||||
```
|
||||
|
||||
The script will take up to 100% CPU capacity. To slow down the script artificially, you can use [throttling](http://wiki.ros.org/topic_tools/throttle) of frames from the camera, for example, at 5 Hz (`main_camera.launch`):
|
||||
|
||||
```xml
|
||||
<node pkg="topic_tools" name="cam_throttle" type="throttle"
|
||||
args="messages main_camera/image_raw 5.0 main_camera/image_raw_throttled"/>
|
||||
args="messages main_camera/image_raw 5.0 main_camera/image_raw/throttled"/>
|
||||
```
|
||||
|
||||
The topic for the subscriber in this case should be changed for `main_camera/image_raw_throttled`.
|
||||
The topic for the subscriber in this case should be changed for `main_camera/image_raw/throttled`.
|
||||
|
||||
@@ -1,228 +0,0 @@
|
||||
# Camera calibration
|
||||
|
||||
Computer vision is becoming more and more widespread. Often, computer vision algorithms are not precise and obtain distorted images from the camera, which is especially true for fisheye cameras.
|
||||
|
||||

|
||||
|
||||
> The image is "rounded" closer to the edge.
|
||||
|
||||
Any computer vision algorithm will perceive the picture incorrectly. To remove such distortion, the camera that receives the image is to be calibrated in accordance with its own peculiarities.
|
||||
|
||||
## Script installation
|
||||
|
||||
First, you have to install the necessary libraries:
|
||||
|
||||
```
|
||||
pip install numpy
|
||||
pip install opencv-python
|
||||
pip install glob
|
||||
pip install pyyaml
|
||||
pip install urllib.request
|
||||
```
|
||||
|
||||
Then download the script from the repository:
|
||||
|
||||
```(bash)
|
||||
git clone https://github.com/tinderad/clever_cam_calibration.git
|
||||
```
|
||||
|
||||
Go to the downloaded folder and install the script:
|
||||
|
||||
```(bash)
|
||||
cd clever_cam_calibration
|
||||
sudo python setup.py build
|
||||
sudo python setup.py install
|
||||
```
|
||||
|
||||
If you are using Windows, download the archive from the [repository](https://github.com/tinderad/clever_cam_calibration/archive/master.zip), unzip it and install:
|
||||
|
||||
```(bash)
|
||||
cd path\to\archive\clever_cam_calibration\
|
||||
python setup.py build
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
> path\to\archive – path to unpacked archive.
|
||||
|
||||
## Preparing for calibration
|
||||
|
||||
You will have to prepare a calibration target. It looks like a chessboard. The file is available for downloading [here](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png).
|
||||
Glue a printed target to any solid surface. Count the number of intersections on the board lengthwise and widthwise, measure the size of a cell (mm).
|
||||
|
||||

|
||||
|
||||
Turn on Clover and connect to its Wi-Fi.
|
||||
|
||||
> Navigate to 192.168.11.1:8080 and check whether the computer receives images from the image_raw topic.
|
||||
|
||||
## Calibration
|
||||
|
||||
Run script ***calibrate_cam***:
|
||||
|
||||
**Windows:**
|
||||
|
||||
```(bash)
|
||||
>path\to\python\Scripts\calibrate_cam.exe
|
||||
```
|
||||
|
||||
> path\to\Python – path to the Python folder
|
||||
|
||||
**Linux:**
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam
|
||||
```
|
||||
|
||||
Specify board parameters:
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam
|
||||
Chessboard width: # Intersections widthwise
|
||||
Chessboard height: # Intersections heightwise
|
||||
Square size: # Length of cell edge (mm)
|
||||
Saving mode (YES - on): # Save mode
|
||||
```
|
||||
|
||||
> Save mode: if enabled, all received pictures will be saved in the current folder.
|
||||
|
||||
The script will start running:
|
||||
|
||||
```
|
||||
Calibration started!
|
||||
Commands:
|
||||
help, catch (key: Enter), delete, restart, stop, finish
|
||||
```
|
||||
|
||||
To calibrate the camera, make at least 25 photos of the chessboard at various angles.
|
||||
|
||||

|
||||
|
||||
To make a photo, enter command ***catch***.
|
||||
|
||||
```(bash)
|
||||
>catch
|
||||
```
|
||||
|
||||
The program will inform you about the calibration status.
|
||||
|
||||
```(bash)
|
||||
...
|
||||
Chessboard not found, now 0 (25 required)
|
||||
> # Enter
|
||||
---
|
||||
Image added, now 1 (25 required)
|
||||
```
|
||||
|
||||
> Instead of entering command ***catch*** each time, you can just press ***Enter*** (enter a blank line).
|
||||
|
||||
After you have made a sufficient number of images, enter command ***finish***.
|
||||
|
||||
```(bash)
|
||||
...
|
||||
>finish
|
||||
Calibration successful!
|
||||
```
|
||||
|
||||
### Calibration by the existing images
|
||||
|
||||
If you already have images, you can calibrate the camera by them with the help of script ***calibrate_cam_ex***.
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam_ex
|
||||
```
|
||||
|
||||
Specify target characteristics and the path to the folder with images:
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam_ex
|
||||
Chessboard width: # Intersections widthwise
|
||||
Chessboard height: # Intersections heightwise
|
||||
Square size: # Length of cell edge (mm)
|
||||
Path: # Path to the folder with images
|
||||
```
|
||||
|
||||
Apart from that, this script works similarly to ***calibrate_cam***.
|
||||
|
||||
The program will process all received pictures, and create file ***camera_info.yaml*** in the current folder. Using this file, you can equalize distortions in the images obtained from this camera.
|
||||
|
||||
> If you change the resolution of the received image, you will have to re-calibrate the camera.
|
||||
|
||||
## Correcting distortions
|
||||
|
||||
Function ***get_undistorted_image(cv2_image, camera_info)*** is responsible for obtaining a corrected image:
|
||||
|
||||
* ***cv2_image***: An image encoded into a cv2 array.
|
||||
* ***camera_info***: The path to the calibration file.¬
|
||||
|
||||
The function returns a cv2 array, into which the corrected image is coded.
|
||||
|
||||
> If you are using a fisheye camera provided with Clover, for processing images with resolution 320x240 or 640x480, you can use the existing calibration settings. To do this, pass parameters ***clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_320*** or ***clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_640*** as argument ***camera_info***, respectively.
|
||||
|
||||
## Examples of operation
|
||||
|
||||
Source images:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Corrected images:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## An example of usage
|
||||
|
||||
**Processing image stream from the camera**.
|
||||
|
||||
This program receives images from the camera on Clover and displays them on the screen in corrected for, using the existing calibration file.
|
||||
|
||||
```python
|
||||
import clevercamcalib.clevercamcalib as ccc
|
||||
import cv2
|
||||
import urllib.request
|
||||
import numpy as np
|
||||
while True:
|
||||
req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw')
|
||||
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
|
||||
image = cv2.imdecode(arr, -1)
|
||||
undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640)
|
||||
cv2.imshow("undistort", undistorted_img)
|
||||
cv2.waitKey(33)
|
||||
cv2.destroyAllWindows()
|
||||
```
|
||||
|
||||
## The usage for ArUco
|
||||
|
||||
To apply the calibration parameters to the ArUco navigation system, move the calibration .yaml file to Raspberry Pi of Clover, and initialize it.
|
||||
|
||||
> Don't forget to connect to Wi-Fi of Clover.
|
||||
|
||||
The SFTP protocol is used for transferring the file. This example, WinSCP program is used.
|
||||
|
||||
Connect to Raspberry Pi via SFTP:
|
||||
|
||||
> Password: ***raspberry***
|
||||
|
||||

|
||||
|
||||
Press “Enter”. Go to ***/home/pi/catkin_ws/src/clever/clever/camera_info/***, and copy the calibration .yaml file to this folder:
|
||||
|
||||

|
||||
|
||||
Now we have to select this file in ArUco configuration. Connection via SSH is used for this purpose. This example, PuTTY program is used.
|
||||
|
||||
Connect to Raspberry Pi via SSH:
|
||||
|
||||

|
||||
|
||||
Log in with username ***pi*** and password ***raspberry***, go to directory ***/home/pi/catkin_ws/src/clever/clever/launch*** and start editing configuration ***main_camera.launch***:
|
||||
|
||||

|
||||
|
||||
In line ***camera node***, change parameter ***camera_info*** to ***camera_info.yaml***:
|
||||
|
||||

|
||||
|
||||
> Don't forget to change camera resolution.
|
||||
@@ -1,45 +1,228 @@
|
||||
# Camera calibration
|
||||
|
||||
Camera calibration can significantly improve the quality of nodes related to computer vision: [ArUco markers detection](aruco.md) and [optical flow](optical_flow.md).
|
||||
Computer vision is becoming more and more widespread. Often, computer vision algorithms are not precise and obtain distorted images from the camera, which is especially true for fisheye cameras.
|
||||
|
||||
Camera calibration process allows to define the parameters reflecting the specific lens installed. These parameters include focal lengths, principal point (which depends on camera lens placement regarding the centre), distortion coefficient *D*. You can read more about camera distortion model used in the [OpenCV documentation](https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html).
|
||||

|
||||
|
||||
There are several tools allowing to calibrate the camera and store calculated parameters into the system. Usually they use calibration images, "chessboards" or combinations of "chessboards" and ArUco-marker grids ([ChArUco](https://docs.opencv.org/3.4/df/d4a/tutorial_charuco_detection.html)).
|
||||
> The image is "rounded" closer to the edge.
|
||||
|
||||
## camera_calibration ROS-package
|
||||
Any computer vision algorithm will perceive the picture incorrectly. To remove such distortion, the camera that receives the image is to be calibrated in accordance with its own peculiarities.
|
||||
|
||||
Main tutorial: http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration.
|
||||
## Script installation
|
||||
|
||||
In order to calibrate the camera with the `camera_calibration` ROS-package you need a computer with OS GNU/Linux and [ROS Melodic](ros-install.md) installed.
|
||||
First, you have to install the necessary libraries:
|
||||
|
||||
<img src="../assets/camera_calibration.png" alt="ROS Camera Calibrator" class="zoom center" width=600>
|
||||
```
|
||||
pip install numpy
|
||||
pip install opencv-python
|
||||
pip install glob
|
||||
pip install pyyaml
|
||||
pip install urllib.request
|
||||
```
|
||||
|
||||
1. Using the Terminal, install `camera_calibration` package to your computer:
|
||||
Then download the script from the repository:
|
||||
|
||||
```bash
|
||||
sudo apt-get install ros-melodic-camera-calibration
|
||||
```
|
||||
```(bash)
|
||||
git clone https://github.com/tinderad/clever_cam_calibration.git
|
||||
```
|
||||
|
||||
2. Download the chessboard – [chessboard.pdf](../assets/chessboard.pdf). Print the chessboard on paper or open it on the computer screen.
|
||||
Go to the downloaded folder and install the script:
|
||||
|
||||
3. Connect to the [Clover Wi-Fi network](wifi.md).
|
||||
```(bash)
|
||||
cd clever_cam_calibration
|
||||
sudo python setup.py build
|
||||
sudo python setup.py install
|
||||
```
|
||||
|
||||
4. Run camera calibration (on your computer):
|
||||
If you are using Windows, download the archive from the [repository](https://github.com/tinderad/clever_cam_calibration/archive/master.zip), unzip it and install:
|
||||
|
||||
```bash
|
||||
ROS_MASTER_URI=http://192.168.11.1:11311 rosrun camera_calibration cameracalibrator.py --size 6x8 --square 0.108 image:=/main_camera/image_raw camera:=/main_camera
|
||||
```
|
||||
```(bash)
|
||||
cd path\to\archive\clever_cam_calibration\
|
||||
python setup.py build
|
||||
python setup.py install
|
||||
```
|
||||
|
||||
> **Note** Change the value *0.108* to actual size a square on the chessboard in metres. For example, value *0.03* corresponds to 3 cm.
|
||||
> path\to\archive – path to unpacked archive.
|
||||
|
||||
5. When the calibration program starts, move the drone so the calibration board is observed from different angles:
|
||||
## Preparing for calibration
|
||||
|
||||
* Place the chessboard in the left, right, top and bottom part of the frame.
|
||||
* Rotate the chessboard around all 3 axes.
|
||||
* Move camera toward and away from the chessboard, so that it is observed from different distance.
|
||||
You will have to prepare a calibration target. It looks like a chessboard. The file is available for downloading [here](https://www.oreilly.com/library/view/learning-opencv-3/9781491937983/assets/lcv3_ac01.png).
|
||||
Glue a printed target to any solid surface. Count the number of intersections on the board lengthwise and widthwise, measure the size of a cell (mm).
|
||||
|
||||
6. Click the *CALIBRATE* button, when it's active. The process of calculation will take several minutes.
|
||||

|
||||
|
||||
When the calculation is done, you'll see calculated parameters in the terminal. The corrected camera image view will be displayed as well. If calibration was successful all straight lines will remain straight on the image displayed.
|
||||
Turn on Clever and connect to its Wi-Fi.
|
||||
|
||||
7. Click the *COMMIT* button to store calculated calibration parameters. The result will be stored in the main Clover camera calibration file: `/home/pi/catkin_ws/src/clever/clever/camera_info/fisheye_cam_320.yaml`.
|
||||
> Navigate to 192.168.11.1:8080 and check whether the computer receives images from the image_raw topic.
|
||||
|
||||
## Calibration
|
||||
|
||||
Run script **_calibrate_cam_**:
|
||||
|
||||
**Windows:**
|
||||
|
||||
```(bash)
|
||||
>path\to\python\Scripts\calibrate_cam.exe
|
||||
```
|
||||
|
||||
> path\to\Python – path to the Python folder
|
||||
|
||||
**Linux:**
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam
|
||||
```
|
||||
|
||||
Specify board parameters:
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam
|
||||
Chessboard width: # Intersections widthwise
|
||||
Chessboard height: # Intersections heightwise
|
||||
Square size: # Length of cell edge (mm)
|
||||
Saving mode (YES - on): # Save mode
|
||||
```
|
||||
|
||||
> Save mode: if enabled, all received pictures will be saved in the current folder.
|
||||
|
||||
The script will start running:
|
||||
|
||||
```
|
||||
Calibration started!
|
||||
Commands:
|
||||
help, catch (key: Enter), delete, restart, stop, finish
|
||||
```
|
||||
|
||||
To calibrate the camera, make at least 25 photos of the chessboard at various angles.
|
||||
|
||||

|
||||
|
||||
To make a photo, enter command **_catch_**.
|
||||
|
||||
```(bash)
|
||||
>catch
|
||||
```
|
||||
|
||||
The program will inform you about the calibration status.
|
||||
|
||||
```(bash)
|
||||
...
|
||||
Chessboard not found, now 0 (25 required)
|
||||
> # Enter
|
||||
---
|
||||
Image added, now 1 (25 required)
|
||||
```
|
||||
|
||||
> Instead of entering command **_catch_** each time, you can just press **_Enter_** (enter a blank line).
|
||||
|
||||
After you have made a sufficient number of images, enter command **_finish_**.
|
||||
|
||||
```(bash)
|
||||
...
|
||||
>finish
|
||||
Calibration successful!
|
||||
```
|
||||
|
||||
### Calibration by the existing images
|
||||
|
||||
If you already have images, you can calibrate the camera by them with the help of script **_calibrate_cam_ex_**.
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam_ex
|
||||
```
|
||||
|
||||
Specify target characteristics and the path to the folder with images:
|
||||
|
||||
```(bash)
|
||||
>calibrate_cam_ex
|
||||
Chessboard width: # Intersections widthwise
|
||||
Chessboard height: # Intersections heightwise
|
||||
Square size: # Length of cell edge (mm)
|
||||
Path: # Path to the folder with images
|
||||
```
|
||||
|
||||
Apart from that, this script works similarly to **_calibrate_cam_**.
|
||||
|
||||
The program will process all received pictures, and create file **_camera_info_****_._****_yaml_** in the current folder. Using this file, you can equalize distortions in the images obtained from this camera.
|
||||
|
||||
> If you change the resolution of the received image, you will have to re-calibrate the camera.
|
||||
|
||||
## Correcting distortions
|
||||
|
||||
Function **_get_undistorted_image(cv2_image, camera_info)_** is responsible for obtaining a corrected image:
|
||||
|
||||
* **_cv2_image_**: An image encoded into a cv2 array.
|
||||
* **_camera_****___****_info_**: The path to the calibration file.¬
|
||||
|
||||
The function returns a cv2 array, into which the corrected image is coded.
|
||||
|
||||
> If you are using a fisheye camera provided with Clever, for processing images with resolution 320x240 or 640x480, you can use the existing calibration settings. To do this, pass parameters **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_320_** or **_clever_cam_calibration.clevercamcalib.CLEVER_FISHEYE_CAM_640_** as argument **_camera_info_**, respectively.
|
||||
|
||||
## Examples of operation
|
||||
|
||||
Source images:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
Corrected images:
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## An example of usage
|
||||
|
||||
**Processing image stream from the camera**.
|
||||
|
||||
This program receives images from the camera on Clever and displays them on the screen in corrected for, using the existing calibration file.
|
||||
|
||||
```python
|
||||
import clevercamcalib.clevercamcalib as ccc
|
||||
import cv2
|
||||
import urllib.request
|
||||
import numpy as np
|
||||
while True:
|
||||
req = urllib.request.urlopen('http://192.168.11.1:8080/snapshot?topic=/main_camera/image_raw')
|
||||
arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
|
||||
image = cv2.imdecode(arr, -1)
|
||||
undistorted_img = ccc.get_undistorted_image(image, ccc.CLEVER_FISHEYE_CAM_640)
|
||||
cv2.imshow("undistort", undistorted_img)
|
||||
cv2.waitKey(33)
|
||||
cv2.destroyAllWindows()
|
||||
```
|
||||
|
||||
## The usage for ArUco
|
||||
|
||||
To apply the calibration parameters to the ArUco navigation system, move the calibration .yaml file to Raspberry Pi of Clever, and initialize it.
|
||||
|
||||
> Don't forget to connect to Wi-Fi of Clever.
|
||||
|
||||
The SFTP protocol is used for transferring the file. This example, WinSCP program is used.
|
||||
|
||||
Connect to Raspberry Pi via SFTP:
|
||||
|
||||
> Password: _**raspberry**_
|
||||
|
||||

|
||||
|
||||
Press “Enter”. Go to _**/home/pi/catkin_ws/src/clever/clever/camera_info/**_, and copy the calibration .yaml file to this folder:
|
||||
|
||||

|
||||
|
||||
Now we have to select this file in ArUco configuration. Connection via SSH is used for this purpose. This example, PuTTY program is used.
|
||||
|
||||
Connect to Raspberry Pi via SSH:
|
||||
|
||||

|
||||
|
||||
Log in with username _**pi**_ and password _**raspberry**_, go to directory _**/home/pi/catkin_ws/src/clever/clever/launch**_ and start editing configuration _**main_camera.launch**_:
|
||||
|
||||

|
||||
|
||||
In line _**camera node**_, change parameter _**camera_info**_ to _**camera_info.yaml**_:
|
||||
|
||||

|
||||
|
||||
> Don't forget to change camera resolution.
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Camera setup
|
||||
|
||||
> **Note** The following applies to [image version](image.md) **0.20** and up. See [previous version of the article](https://github.com/CopterExpress/clover/blob/v0.19/docs/en/camera_frame.md) for older images.
|
||||
> **Note** The following applies to [image version](image.md) **0.15** and up. See [previous version of the article](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/camera_frame.md) (Russian only) for older images.
|
||||
|
||||
Computer vision modules (like [ArUco markers](aruco.md) and [Optical Flow](optical_flow.md)) require adjusting the camera focus and set up camera position and orientation relative to the drone body. Optional camera calibration can improve their quality of performance.
|
||||
Computer vision modules (like [ArUco markers](aruco.md) and [Optical Flow](optical_flow.md)) require adjusting the camrea focus and set up camera position and orientation relative to the drone body.
|
||||
|
||||
## Focusing the camera lens {#focus}
|
||||
## Focusing the camera lens
|
||||
|
||||
In order to focus the camera lens, do the following:
|
||||
|
||||
@@ -19,71 +19,10 @@ In order to focus the camera lens, do the following:
|
||||
|
||||
## Setting the camera position {#frame}
|
||||
|
||||
Position and orientation of the main camera is [set in the](cli.md#editing) `~/catkin_ws/src/clover/clover/launch/main_camera.launch` file:
|
||||
Position and orientation of the main camera is [set in the](cli.md#editing) `~/catkin_ws/src/clever/clever/launch/main_camera.launch` file:
|
||||
|
||||
```xml
|
||||
<arg name="direction_z" default="down"/> <!-- direction the camera points: down, up -->
|
||||
<arg name="direction_y" default="backward"/> <!-- direction the camera cable points: backward, forward -->
|
||||
```
|
||||
|
||||
To set the orientation, define:
|
||||
|
||||
* direction the camera lens points `direction_z`: `down` or `up`;
|
||||
* direction the camera cable points `direction_y`: `backward` or `forward`.
|
||||
|
||||
### Examples
|
||||
|
||||
### Camera faces downward, cable goes backward
|
||||
|
||||
```xml
|
||||
<arg name="direction_z" default="down"/>
|
||||
<arg name="direction_y" default="backward"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_1_rviz.png" width=300>
|
||||
<img src="../assets/camera_option_1_clever.jpg" width=300>
|
||||
|
||||
### Camera faces downward, cable goes forward
|
||||
|
||||
```xml
|
||||
<arg name="direction_z" default="down"/>
|
||||
<arg name="direction_y" default="forward"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_2_rviz.png" width=300>
|
||||
<img src="../assets/camera_option_2_clever.jpg" width=300>
|
||||
|
||||
### Camera faces upward, cable goes backward
|
||||
|
||||
```xml
|
||||
<arg name="direction_z" default="up"/>
|
||||
<arg name="direction_y" default="backward"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_3_rviz.png" width=300>
|
||||
<img src="../assets/camera_option_3_clever.jpg" width=300>
|
||||
|
||||
### Camera faces upward, cable goes forward
|
||||
|
||||
```xml
|
||||
<arg name="direction_z" default="up"/>
|
||||
<arg name="direction_y" default="forward"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_4_rviz.png" width=300>
|
||||
<img src="../assets/camera_option_4_clever.jpg" width=300>
|
||||
|
||||
> **Hint** The [`selfcheck.py` utility](selfcheck.md) will describe your current camera setup in a human-readable fashion. Be sure to check whether this description corresponds to your actual camera position.
|
||||
|
||||
### Custom camera position
|
||||
|
||||
It's possible to set arbitrary camera position and orientation. In order to do that uncomment node, marked as `Template for custom camera orientation`:
|
||||
|
||||
```xml
|
||||
<!-- Template for custom camera orientation -->
|
||||
<!-- Camera position and orientation are represented by base_link -> main_camera_optical transform -->
|
||||
<!-- static_transform_publisher arguments: x y z yaw pitch roll frame_id child_frame_id -->
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 -1.5707963 0 3.1415926 base_link main_camera_optical"/>
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0 0 -0.07 -1.5707963 0 3.1415926 base_link main_camera_optical"/>
|
||||
```
|
||||
|
||||
This line describes how the camera is positioned relative to the drone body. Technically, it creates a static transform between the `base_link` frame ( which [corresponds to the flight controller housing](frames.md)) and the camera (`main_camera_optical`) in the following format:
|
||||
@@ -100,6 +39,44 @@ Camera frame (that is, [frame of reference](frames.md)) is aligned as follows:
|
||||
|
||||
Shifts are set in meters, angles are in radians. You can check the transform for correctness using [rviz](rviz.md).
|
||||
|
||||
## Calibration {#calibration}
|
||||
## Presets for Clever
|
||||
|
||||
To improve the quality of computer vision related algorithms it's recommended to perform camera calibration, which is described in the [appropriate article](camera_calibration.md).
|
||||
The presets for usual camera orientations are available in the `main_camera.launch` file. The images should help you choose the one that is right for you: the first one is how your drone will be displayed in [rviz](rviz.md), the second is how the camera is actually mounted on the drone.
|
||||
|
||||
### 1. Camera faces downward, cable goes backward
|
||||
|
||||
```xml
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 -1.5707963 0 3.1415926 base_link main_camera_optical"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_1_rviz.png" width=400>
|
||||
<img src="../assets/camera_option_1_clever.jpg" width=400>
|
||||
|
||||
### 2. Camera faces downward, cable goes forward
|
||||
|
||||
```xml
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 -0.07 1.5707963 0 3.1415926 base_link main_camera_optical"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_2_rviz.png" width=400>
|
||||
<img src="../assets/camera_option_2_clever.jpg" width=400>
|
||||
|
||||
### 3. Camera faces upward, cable goes backward
|
||||
|
||||
```xml
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 1.5707963 0 0 base_link main_camera_optical"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_3_rviz.png" width=400>
|
||||
<img src="../assets/camera_option_3_clever.jpg" width=400>
|
||||
|
||||
### 4. Camera faces upward, cable goes forward
|
||||
|
||||
```xml
|
||||
<node pkg="tf2_ros" type="static_transform_publisher" name="main_camera_frame" args="0.05 0 0.07 -1.5707963 0 0 base_link main_camera_optical"/>
|
||||
```
|
||||
|
||||
<img src="../assets/camera_option_4_rviz.png" width=400>
|
||||
<img src="../assets/camera_option_4_clever.jpg" width=400>
|
||||
|
||||
> **Hint** The [`selfcheck.py` utility](selfcheck.md) will describe your current camera setup in a human-readable fashion. Be sure to check whether this description corresponds to your actual camera position.
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
# clever-show
|
||||
|
||||
Software for making the drone show controlled by Raspberry Pi, PX4 and COEX [Clover](https://github.com/CopterExpress/clover) package.
|
||||
|
||||
Create animation in Blender, convert it to drone paths, set up the drones and run your own show!
|
||||
|
||||
Project repository: https://github.com/CopterExpress/clever-show.
|
||||
|
||||
## Demo video
|
||||
|
||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/HdHbZFz7nR0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||
|
||||
12 drones perform in a show in Electrotheatre Stanislavsky, Moscow.
|
||||
|
||||
## Team
|
||||
|
||||
* Arthur Golubtsov, software engineer in COEX, https://github.com/goldarte
|
||||
* Artem Vasyunik, software engineer intern in COEX, https://github.com/artem30801
|
||||
@@ -1,6 +1,6 @@
|
||||
# COEX Pix
|
||||
|
||||
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.
|
||||
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 **Clever 4** quadrotor kit.
|
||||
|
||||
## Revision 1.1
|
||||
|
||||
@@ -43,7 +43,7 @@ The **COEX Pix** flight controller is a modified [Pixracer](https://docs.px4.io/
|
||||
|
||||
### Mounting suggestions
|
||||
|
||||
**Important**: The board is meant to be installed with a non-standard orientation (roll 180º, yaw 90º) on the Clover airframe. Therefore, the `SENS_BOARD_ROT` PX4 parameter should be set to `ROLL 180, YAW 90`.
|
||||
**Important**: The board is meant to be installed with a non-standard orientation (roll 180º, yaw 90º) on the Clever airframe. Therefore, the `SENS_BOARD_ROT` PX4 parameter should be set to `ROLL 180, YAW 90`.
|
||||
|
||||
### Usage notes
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
# Contribution to Clover
|
||||
# Contribution to Clever
|
||||
|
||||
Clover is mostly an [open source](https://en.wikipedia.org/wiki/Open-source_software) and [open hardware](https://en.wikipedia.org/wiki/Open-source_hardware) project aimed at lowering the entry threshold to development of the projects related to flying robotics. You can contribute to the project by offering fixes and improvements for Clover documentation and software.
|
||||
Clever is mostly an [open source](https://en.wikipedia.org/wiki/Open-source_software) and [open hardware](https://en.wikipedia.org/wiki/Open-source_hardware) project aimed at lowering the entry threshold to development of the projects related to flying robotics. You can contribute to the project by offering fixes and improvements for Clever documentation and software.
|
||||
|
||||
> **Note** To offer changes to Clover documentation or SW, you should have an account at [GitHub](https://github.com).
|
||||
> **Note** To offer changes to Clever documentation or SW, you should have an account at [GitHub](https://github.com).
|
||||
|
||||
## Markdown
|
||||
|
||||
All Clover documentation is written in the widespread [Markdown](https://en.wikipedia.org/wiki/Markdown) format. There are many Markdown guides on the Internet.
|
||||
All Clever documentation is written in the widespread [Markdown](https://en.wikipedia.org/wiki/Markdown) format. There are many Markdown guides on the Internet.
|
||||
|
||||
In Russian: https://guides.hexlet.io/markdown/.
|
||||
|
||||
@@ -22,7 +22,7 @@ For a local build of a static documentation website, use the [`gitbook-cli`](htt
|
||||
|
||||
If you have found an error in the documentation or if you want to improve it, use the **Pull Request** mechanism.
|
||||
|
||||
1. Find a file with the article you want in the repository – https://github.com/CopterExpress/clover/tree/master/docs.
|
||||
1. Find a file with the article you want in the repository – https://github.com/CopterExpress/clever/tree/master/docs.
|
||||
2. Click "Edit".
|
||||
|
||||
<img src="../assets/github-edit.png" alt="GitHub Edit">
|
||||
@@ -36,18 +36,18 @@ More information about Pull Requests is available [at GitHub](https://help.githu
|
||||
|
||||
## Contributing a new article
|
||||
|
||||
> **Note** If you've made your own project based on Clover, you can add an article about it to the "Clover-based projects" section.
|
||||
> **Note** If you've made your own project based on Clever, you can add an article about it to the "Clever-based projects" section.
|
||||
|
||||
Prepare your article and send it as a pull request to the [Clover repository](https://github.com/CopterExpress/clover).
|
||||
Prepare your article and send it as a pull request to the [Clever repository](https://github.com/CopterExpress/clever).
|
||||
|
||||
1. Fork the Clover repository:
|
||||
1. Fork the Clever repository:
|
||||
|
||||
<img src="../assets/github-fork.png" alt="GitHub Fork">
|
||||
|
||||
2. Check out the freshly-forked repository on your computer:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/<USERNAME>/clover.git
|
||||
git clone https://github.com/<USERNAME>/clever.git
|
||||
```
|
||||
|
||||
3. Open the directory with the source code checkout and create a new branch for your article (for example, `new-article`):
|
||||
@@ -75,7 +75,7 @@ Prepare your article and send it as a pull request to the [Clover repository](ht
|
||||
|
||||
```bash
|
||||
git add docs/
|
||||
git commit -m "Add new article for Clover"
|
||||
git commit -m "Add new article for Clever"
|
||||
```
|
||||
|
||||
8. Upload your branch to your forked repository on GitHub:
|
||||
@@ -84,15 +84,11 @@ Prepare your article and send it as a pull request to the [Clover repository](ht
|
||||
git push -u origin new-article
|
||||
```
|
||||
|
||||
9. Open your repository on GitHub and send a `pull request` from your branch to Clover:
|
||||
9. Open your repository on GitHub and send a `pull request` from your branch to Clever:
|
||||
|
||||
<img src="../assets/github-pull-request.png" alt="GitHub Pull Request">
|
||||
|
||||
<img src="../assets/github-pull-request-create.png" alt="GitHub Create Pull">
|
||||
|
||||
10. Wait for the review, be ready to make changes if needed.
|
||||
11. Look at your new and useful article at https://clover.coex.tech !
|
||||
|
||||
## 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>).
|
||||
11. Look at your new and useful article at https://clever.coex.tech !
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Copter Hack 2017
|
||||
===
|
||||
|
||||
On July 28 – 30, 2017, Copter Express held a hackathon named "Copter Hack 2017", where the objective was to program a Clover to dance-fly autonomously to random music.
|
||||
On July 28 – 30, 2017, Copter Express held a hackathon named "Copter Hack 2017", where the objective was to program a Clever to dance-fly autonomously to random music.
|
||||
|
||||
The team "Pangolins" became the winners.
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ Winning teams:
|
||||
|
||||
1. Starshine (Moscow) — controlling the drone using a "smart" glove.
|
||||
2. Alcopter (Moscow) — controlling the drone with gestures and pose change.
|
||||
3. Merry copter (Samara) — a Vkontakte bot for controlling the copter, a joint flight of "Zhuzha" and "Clover 3".
|
||||
3. Merry copter (Samara) — a Vkontakte bot for controlling the copter, a joint flight of "Zhuzha" and "Clever 3".
|
||||
4. International Post (Novosibirsk) — automatic scattering leaflets from the drone.
|
||||
5. LAMAR (Yekaterinburg) — an automatic quadcopter battery replacement station.
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@ This parameter is used for *IMU* orientation correction.
|
||||
|
||||
### Suggested image versions
|
||||
|
||||
Raspberry Pi versions 3B+ and lower: [v0.18](https://github.com/CopterExpress/clover/releases/tag/v0.18)
|
||||
Raspberry Pi versions 3B+ and lower: [v0.18](https://github.com/CopterExpress/clever/releases/tag/v0.18)
|
||||
|
||||
Raspberry Pi version 4: [v0.19-alpha.1](https://github.com/CopterExpress/clover/releases/tag/v0.19-alpha.1)
|
||||
Raspberry Pi version 4: [v0.19-alpha.1](https://github.com/CopterExpress/clever/releases/tag/v0.19-alpha.1)
|
||||
|
||||
### Camera orientation
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ To display the settings of all ESCs simultaneously, you can use the ESC Overview
|
||||
|
||||
ESC firmware files are located [here](https://github.com/cleanflight/blheli-multishot/tree/master/BLHeli_S%20SiLabs/Hex%20Files).
|
||||
|
||||
To flesh ESCs, click on button Flash BLHeli and choose the firmware file with the type of the controller, the name of which is indicated in the firmware name frame on top of the screen in tab Silabs ESC Setup (for the controller that is used in Clover 2, it is A-H-70).
|
||||
To flesh ESCs, click on button Flash BLHeli and choose the firmware file with the type of the controller, the name of which is indicated in the firmware name frame on top of the screen in tab Silabs ESC Setup (for the controller that is used in Clever 2, it is A-H-70).
|
||||
|
||||
To re-flash an individual ESC, disable all other ESCs.
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Introduction
|
||||
|
||||
Recently, face recognition systems have been getting a wider use, the application scope of this technology is really expansive: from regular selfie drones to police drones. Everywhere it is being integrated into various devices. The recognition process itself is really fascinating, and that's what inspired me to create a project associated with it. The purpose of my internship project was to create a simple open source system for face recognition with a Clover quadcopter. The program takes images from the quadcopter's camera and processes it on a PC. Therefore, all other instructions are executed on a PC.
|
||||
Recently, face recognition systems have been getting a wider use, the application scope of this technology is really expansive: from regular selfie drones to police drones. Everywhere it is being integrated into various devices. The recognition process itself is really fascinating, and that's what inspired me to create a project associated with it. The purpose of my internship project was to create a simple open source system for face recognition with a Clever quadcopter. The program takes images from the quadcopter's camera and processes it on a PC. Therefore, all other instructions are executed on a PC.
|
||||
|
||||
## Development
|
||||
|
||||
@@ -93,7 +93,7 @@ Further explanation of the code is available at GitHub of the used API in the co
|
||||
|
||||
## Using
|
||||
|
||||
It is enough to connect to "Clover" via Wi-Fi and check whether the video stream from the camera is working correctly.
|
||||
It is enough to connect to "Clever" via Wi-Fi and check whether the video stream from the camera is working correctly.
|
||||
|
||||
Then just run the script:
|
||||
|
||||
|
||||
@@ -3,17 +3,17 @@ Pixhawk / Pixracer firmware flashing
|
||||
|
||||
Pixhawk or Pixracer firmware may be flashed using QGroundControl or command line utilities.
|
||||
|
||||
Modified firmware for Clover
|
||||
Modified firmware for Clever
|
||||
---
|
||||
|
||||
It is advisable to use a specialized build of PX4 with the necessary fixes and better defaults for the Clover drone. Use the latest stable release in our [GitHub repository](https://github.com/CopterExpress/Firmware/releases) with the word `clever`, for example, `v1.8.2-clever.5`.
|
||||
It is advisable to use a specialized build of PX4 with the necessary fixes and better defaults for the Clever drone. Use the latest stable release in our [GitHub repository](https://github.com/CopterExpress/Firmware/releases) with the word `clever`, for example, `v1.8.2-clever.5`.
|
||||
|
||||
<div id="release" style="display:none">
|
||||
<p>Latest stable release: <strong><a id="download-latest-release"></a></strong>.</p>
|
||||
|
||||
<ul>
|
||||
<li>Firmware for Pixracer (<strong>Clover 4 / Clover 3</strong>) – <a id="firmware-pixracer" href=""><code>px4fmu-v4_default.px4</code></a>.</li>
|
||||
<li>Firmware for Pixhawk (<strong>Clover 2</strong>) – <a id="firmware-pixhawk" href=""><code>px4fmu-v2_lpe.px4</code></a>.</li>
|
||||
<li>Firmware for Pixracer (<strong>Clever 4 / Clever 3</strong>) – <a id="firmware-pixracer" href=""><code>px4fmu-v4_default.px4</code></a>.</li>
|
||||
<li>Firmware for Pixhawk (<strong>Clever 2</strong>) – <a id="firmware-pixhawk" href=""><code>px4fmu-v2_lpe.px4</code></a>.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -60,8 +60,8 @@ Firmware variants
|
||||
|
||||
The name of the firmware file contains information about the target flight controller and build variant. For example:
|
||||
|
||||
* `px4fmu-v4_default.px4` — firmware for Pixhawk with EKF2 and LPE (**Clover 3** / **Clover 4**).
|
||||
* `px4fmu-v2_lpe.px4` — firmware for Pixhawk with LPE (**Clover 2**).
|
||||
* `px4fmu-v4_default.px4` — firmware for Pixhawk with EKF2 and LPE (**Clever 3** / **Clever 4**).
|
||||
* `px4fmu-v2_lpe.px4` — firmware for Pixhawk with LPE (**Clever 2**).
|
||||
* `px4fmu-v2_default.px4` — firmware for Pixhawk with EKF2.
|
||||
* `px4fmu-v3_default.px4` — firmware for newer Pixhawk versions (rev. 3 chip, see Fig. + Bootloader v5) with EKF2 and LPE.
|
||||
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
Coordinate systems (frames)
|
||||
===
|
||||
|
||||

|
||||
> **Note** The following applies to [image](image.md) version 0.15 and up. See [previous version of the article](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/frames.md) (Russian only) for older images.
|
||||
|
||||

|
||||
|
||||
Main frames in the `clever` package:
|
||||
|
||||
@@ -25,7 +27,7 @@ tf2
|
||||
|
||||
Read more at http://wiki.ros.org/tf2
|
||||
|
||||
tf2 ROS package is used extensively in the Clover platform. tf2 is a set of libraries for C++, Python and other programming languages that are used to work with the frames. Internally, ROS nodes publish `TransformStamped` messages to `/tf` topic with transforms between frames at certain points in time.
|
||||
tf2 ROS package is used extensively in the Clever platform. tf2 is a set of libraries for C++, Python and other programming languages that are used to work with the frames. Internally, ROS nodes publish `TransformStamped` messages to `/tf` topic with transforms between frames at certain points in time.
|
||||
|
||||
The [`simple_offboard`](simple_offboard.md) node can be used to request the drone position in an arbitrary frame by setting the `frame_id` argument appropriately in a call to `get_telemetry` service.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Using QGroundControl via Wi-Fi
|
||||
You can monitor, control, calibrate and configure the flight controller of the quadcopter using QGroundControl via Wi-Fi.
|
||||
This requires [connecting to Wi-Fi](wifi.md) of the `CLEVER-xxxx` network.
|
||||
|
||||
After that, in the Clover launch-file `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch`, choose one of the preconfigured bridge modes.
|
||||
After that, in the Clever launch-file `/home/pi/catkin_ws/src/clever/clever/launch/clever.launch`, choose one of the preconfigured bridge modes.
|
||||
|
||||
After editing the launch-file, restart the clever service:
|
||||
|
||||
@@ -27,7 +27,7 @@ Then in the QGroundControl program, choose Application Settings > Comm Links > A
|
||||
|
||||

|
||||
|
||||
Then choose "Clover" from the list of connections, and click "Connect".
|
||||
Then choose "Clever" from the list of connections, and click "Connect".
|
||||
|
||||
UDP bridge (with automated connection)
|
||||
---
|
||||
|
||||
@@ -41,13 +41,13 @@ A rechargeable power source for the drone. Quadrotors typically use LiPo (lithiu
|
||||
|
||||
Single element of the battery pack. Typical drone batteries contain several (2 to 6) cells connected in series. Maximum LiPo cell voltage is 4.2 v; battery voltage is a sum of each cell's voltage (if they are connected in series). The number of cells connected in series is marked by the letter *S*, as in *2S* (two cells in series), *3S*, *4S*.
|
||||
|
||||
Clover kits typically use *3S* batteries.
|
||||
Clever kits typically use *3S* batteries.
|
||||
|
||||
## Remote control / radio control equipment
|
||||
|
||||
A radio-operated quadcopter remote control. Operation of the remote control requires connecting a receiver to the flight controller.
|
||||
|
||||
Clover may also be [controlled from a smartphone](rc.md).
|
||||
Clever may also be [controlled from a smartphone](rc.md).
|
||||
|
||||
## Telemetry
|
||||
|
||||
@@ -55,7 +55,7 @@ Clover may also be [controlled from a smartphone](rc.md).
|
||||
|
||||
**2\.** The data about the aircraft state (height, orientation, global coordinates, etc.).
|
||||
|
||||
**3\.** A system for transmitting the data about the aircraft state or commands to it over the air. Examples: radio modems (RFD900, 3DR Radio Modem), Wi-Fi modules (ESP-07). Raspberry Pi may also be used in Clover as a telemetry module: [the use of QGroundControl via Wi-Fi](gcs_bridge.md).
|
||||
**3\.** A system for transmitting the data about the aircraft state or commands to it over the air. Examples: radio modems (RFD900, 3DR Radio Modem), Wi-Fi modules (ESP-07). Raspberry Pi may also be used in Clever as a telemetry module: [the use of QGroundControl via Wi-Fi](gcs_bridge.md).
|
||||
|
||||
## Arming
|
||||
|
||||
@@ -65,17 +65,17 @@ The opposite state is Disarmed.
|
||||
|
||||
## PX4
|
||||
|
||||
A popular open source flight controller software that works with the Pixhawk series of flight controllers, Pixracer, and others. PX4 is recommended to be used with Clover.
|
||||
A popular open source flight controller software that works with the Pixhawk series of flight controllers, Pixracer, and others. PX4 is recommended to be used with Clever.
|
||||
|
||||
## Raspberry Pi
|
||||
|
||||
[A popular single-board computer](raspberry.md) that is used in the Clover kit.
|
||||
[A popular single-board computer](raspberry.md) that is used in the Clever kit.
|
||||
|
||||
## SD card image
|
||||
|
||||
A complete digital copy of SD card contents stored in a single file. This file may be written to an SD card using special software like Etcher. A Raspberry Pi's SD card is the only long-term memory of the single-board computer.
|
||||
|
||||
The Clover kit includes a [recommended SD card image](image.md)
|
||||
The Clever kit includes a [recommended SD card image](image.md)
|
||||
|
||||
## APM / ArduPilot
|
||||
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
# Hostname
|
||||
|
||||
[By default](image.md) the hostname of the Clover drone is set to `clever-xxxx`, where `xxxx` are random numbers. These numbers are the same as in the [Wi-Fi SSID](wifi.md).
|
||||
[By default](image.md) the hostname of the Clever drone is set to `clever-xxxx`, where `xxxx` are random numbers. These numbers are the same as in the [Wi-Fi SSID](wifi.md).
|
||||
|
||||
Thus, Clover is accessible on machines that support mDNS as `clever-xxxx.local`. You can use this name to access Clover over SSH:
|
||||
Thus, Clever is accessible on machines that support mDNS as `clever-xxxx.local`. You can use this name to access Clever over SSH:
|
||||
|
||||
```bash
|
||||
ssh pi@clever-xxxx.local
|
||||
```
|
||||
|
||||
Also, this name can be used in place of IP-address to open Clover web pages in browser, accessing ROS master, etc.
|
||||
Also, this name can be used in place of IP-address to open Clever web pages in browser, accessing ROS master, etc.
|
||||
|
||||
## Changing hostname
|
||||
|
||||
In some situations it is necessary to change Clover's hostname. You can use the `hostnamectl` utility for that:
|
||||
In some situations it is necessary to change Clever's hostname. You can use the `hostnamectl` utility for that:
|
||||
|
||||
```bash
|
||||
sudo hostnamectl set-hostname newname
|
||||
|
||||
@@ -31,7 +31,7 @@ Before you test it you need to install on your laptop:
|
||||
- Install Nodejs from [here](https://nodejs.org/en/download/). For [Ubuntu installation](https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/)
|
||||
- Install Yarn package manager from [here](https://yarnpkg.com/lang/en/docs/install/). [Usual problem](https://github.com/yarnpkg/yarn/issues/3189) while installing and using yarn with Ubuntu.
|
||||
- Have an experience in manual control on the drone in case of any weird behavior happen.
|
||||
- Worked before with COEX drones, if this is your first time to work with COEX drones check [this](https://clover.coex.tech/en/).
|
||||
- Worked before with COEX drones, if this is your first time to work with COEX drones check [this](https://clever.coex.tech/en/).
|
||||
|
||||
and you are ready to build and use the required codes.
|
||||
|
||||
@@ -145,7 +145,7 @@ Animation is created by [this](https://justsketchme.web.app/)
|
||||
## References
|
||||
|
||||
- [Human pose estimation guide](https://blog.nanonets.com/human-pose-estimation-2d-guide/)
|
||||
- [Clover drones tutorials](https://clover.coex.tech/en/)
|
||||
- [Clever drones tutorials](https://clever.coex.tech/en/)
|
||||
- [Posenet GitHub repo](https://github.com/tensorflow/tfjs-models/tree/master/posenet)
|
||||
- [Posenet meduim article](https://medium.com/tensorflow/real-time-human-pose-estimation-in-the-browser-with-tensorflow-js-7dd0bc881cd5)
|
||||
- [Tensorflow.js demos](https://www.tensorflow.org/js/demos)
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Raspberry Pi image
|
||||
|
||||
The RPi image for Clover contains all the necessary software for working with Clover and [programming autonomous flights](simple_offboard.md). The Clover platform is based on [Raspbian OS](https://www.raspberrypi.org/downloads/raspbian/) and robotics framework [ROS](ros.md). The source code of the image builder and all the additional packages is [available on GitHub](https://github.com/CopterExpress/clover).
|
||||
The RPi image for Clever contains all the necessary software for working with Clever and [programming autonomous flights](simple_offboard.md). The Clever platform is based on [Raspbian OS](https://www.raspberrypi.org/downloads/raspbian/) and robotics framework [ROS](ros.md). The source code of the image builder and all the additional packages is [available on GitHub](https://github.com/CopterExpress/clever).
|
||||
|
||||
## Usage
|
||||
|
||||
1. Download the latest stable release of the image – **<a class="latest-image" href="https://github.com/CopterExpress/clover/releases">download</a>**.
|
||||
1. Download the latest stable release of the image – **<a class="latest-image" href="https://github.com/CopterExpress/clever/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).
|
||||
4. Flash the downloaded image to the card using Etcher.
|
||||
@@ -12,6 +12,6 @@ The RPi image for Clover contains all the necessary software for working with Cl
|
||||
|
||||
<img src="../assets/etcher.png" class="zoom">
|
||||
|
||||
After flashing the image on the MicroSD-card, you can [connect to the Clover over Wi-Fi](wifi.md), use [wireless connection in QGroundControl](gcs_bridge.md), gain access to the Raspberry [over SSH](ssh.md) and use all the other features.
|
||||
After flashing the image on the MicroSD-card, you can [connect to the Clever over Wi-Fi](wifi.md), use [wireless connection in QGroundControl](gcs_bridge.md), gain access to the Raspberry [over SSH](ssh.md) and use all the other features.
|
||||
|
||||
**Next:** [Connecting over Wi-Fi](wifi.md).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Clover and Jetson Nano
|
||||
# Clever and Jetson Nano
|
||||
|
||||
## Jetson Nano overview
|
||||
|
||||
@@ -12,7 +12,7 @@ Jetson Nano developer kits come with a carrier board that has USB 3.0, CSI and E
|
||||
|
||||
## Setting up
|
||||
|
||||
Nvidia provides an SD card image with an operating system based on Ubuntu Linux 18.04 for Jetson Nano. This image is a good starting point for ROS and Clover installation.
|
||||
Nvidia provides an SD card image with an operating system based on Ubuntu Linux 18.04 for Jetson Nano. This image is a good starting point for ROS and Clever installation.
|
||||
|
||||
### Initial system setup
|
||||
|
||||
@@ -70,14 +70,14 @@ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||
sudo python ./get-pip.py
|
||||
```
|
||||
|
||||
### Building Clover nodes
|
||||
### Building Clever nodes
|
||||
|
||||
Create a "workspace" directory in your home folder and populate it with Clover packages:
|
||||
Create a "workspace" directory in your home folder and populate it with Clever packages:
|
||||
|
||||
```bash
|
||||
mkdir -p ~/catkin_ws/src
|
||||
cd ~/catkin_ws/src
|
||||
git clone https://github.com/CopterExpress/clover
|
||||
git clone https://github.com/CopterExpress/clever
|
||||
git clone https://github.com/CopterExpress/ros_led
|
||||
git clone https://github.com/okalachev/vl53l1x_ros
|
||||
```
|
||||
@@ -103,16 +103,16 @@ Install development libraries for OpenCV 3.2 (recent Jetson Nano images have Ope
|
||||
sudo apt install libopencv-dev=3.2.0+dfsg-4ubuntu0.1
|
||||
```
|
||||
|
||||
Finally, build the Clover nodes:
|
||||
Finally, build the Clever nodes:
|
||||
|
||||
```bash
|
||||
cd ~/catkin_ws
|
||||
catkin_make
|
||||
```
|
||||
|
||||
> **Hint** You may also want to add udev rules for PX4 flight controllers. Copy [the rules file](https://github.com/CopterExpress/clover/blob/master/clover/config/99-px4fmu.rules) to `/etc/udev/rules.d` and run `sudo udevadm control --reload-rules && sudo udevadm trigger`.
|
||||
> **Hint** You may also want to add udev rules for PX4 flight controllers. Copy [the rules file](https://github.com/CopterExpress/clever/blob/master/clever/config/99-px4fmu.rules) to `/etc/udev/rules.d` and run `sudo udevadm control --reload-rules && sudo udevadm trigger`.
|
||||
|
||||
### Running Clover nodes
|
||||
### Running Clever nodes
|
||||
|
||||
Set up the workspace environment:
|
||||
|
||||
@@ -127,7 +127,7 @@ Configure the launch files to your taste and use `roslaunch` to launch the nodes
|
||||
roslaunch clever clever.launch
|
||||
```
|
||||
|
||||
> **Hint** You may want to start the Clover nodes automatically. This can be done with `systemd`: look at service files for [`roscore`](https://github.com/CopterExpress/clover/blob/master/builder/assets/roscore.service) and [`clever`](https://github.com/CopterExpress/clover/blob/master/builder/assets/clever.service) that are used in our image and adjust them as necessary.
|
||||
> **Hint** You may want to start the Clever nodes automatically. This can be done with `systemd`: look at service files for [`roscore`](https://github.com/CopterExpress/clever/blob/master/builder/assets/roscore.service) and [`clever`](https://github.com/CopterExpress/clever/blob/master/builder/assets/clever.service) that are used in our image and adjust them as necessary.
|
||||
|
||||
## Caveats
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Working with a laser rangefinder
|
||||
|
||||
> **Note** Documentation for the [image](image.md), versions, starting with **0.18**. For older versions refer to [documentation for version **0.17**](https://github.com/CopterExpress/clover/blob/v0.17/docs/en/laser.md).
|
||||
> **Note** Documentation for the [image](image.md), versions, starting with **0.18**. For older versions refer to [documentation for version **0.17**](https://github.com/CopterExpress/clever/blob/v0.17/docs/en/laser.md).
|
||||
|
||||
## VL53L1X Rangefinder
|
||||
|
||||
The rangefinder model recommended for Clover is STM VL53L1X. This rangefinder can measure distances from 0 to 4 m while ensuring high measurement accuracy.
|
||||
The rangefinder model recommended for Clever is STM VL53L1X. This rangefinder can measure distances from 0 to 4 m while ensuring high measurement accuracy.
|
||||
|
||||
The [image for Raspberry Pi](image.md) contains pre-installed corresponding ROS driver.
|
||||
|
||||
@@ -74,16 +74,6 @@ def range_callback(msg):
|
||||
rospy.Subscriber('rangefinder/range', Range, range_callback)
|
||||
```
|
||||
|
||||
Also it's possible to read one rangefinder measurement at a time:
|
||||
|
||||
```python
|
||||
from sensor_msgs.msg import Range
|
||||
|
||||
# ...
|
||||
|
||||
data = rospy.wait_for_message('rangefinder/range', Range)
|
||||
```
|
||||
|
||||
### Data visualization
|
||||
|
||||
You may use rqt_multiplot tool to plot rangefinder data.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **Note** The following applies to image version 0.18 and up. See [previous version of the article](leds_old.md) for older images.
|
||||
|
||||
Clover drone kits contain addressable LED strips based on *ws281x* drivers. Each LED may be set to any one of 16 million possible colors (each color is encoded by a 24-bit number). This allows making the Clover flight more spectacular, as well as show flight modes, display stages of current user program, and notify the pilot of other events.
|
||||
Clever drone kits contain addressable LED strips based on *ws281x* drivers. Each LED may be set to any one of 16 million possible colors (each color is encoded by a 24-bit number). This allows making the Clever flight more spectacular, as well as show flight modes, display stages of current user program, and notify the pilot of other events.
|
||||
|
||||
<img src="../assets/clever-led.png" class="center" width=600>
|
||||
|
||||
@@ -99,7 +99,7 @@ disconnected: { effect: blink, r: 255, g: 50, b: 50 }
|
||||
|
||||
The left part is one of the possible events that the strip reacts to. The right part contains the effect description that you want to execute for this event. Here is the list of supported events:
|
||||
|
||||
* `startup` – Clover system startup;
|
||||
* `startup` – Clever system startup;
|
||||
* `connected` – successful connection to the flight controller;
|
||||
* `disconnected` – connection to the flight controller lost;
|
||||
* `armed` – flight controller transitioned to armed state;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## Connecting and determining the type of the strip
|
||||
|
||||
> **Note** The following is applicable to image versions 0.14 and up. For versions 0.13 and older see [an older revision of this article](https://github.com/CopterExpress/clover/blob/v0.16/docs/en/leds.md)
|
||||
> **Note** The following is applicable to image versions 0.14 and up. For versions 0.13 and older see [an older revision of this article](https://github.com/CopterExpress/clever/blob/v0.16/docs/en/leds.md)
|
||||
|
||||
Connect the +5v and GND leads of your LED to a power source and the DIN (data in) lead to GPIO18 or GPIO21.
|
||||
|
||||
@@ -103,7 +103,7 @@ Main strip control methods:
|
||||
|
||||
## Does it have to be this way?
|
||||
|
||||
The LED strip type used in the Clover kits use the following protocol: a data source (a Raspberry Pi, for example) sends a bit stream, 24 bits per LED. Each LED reads the first 24 bits from the stream and sets its color accordingly while passing the rest of the stream to the next LED. Zeroes and ones are encoded by different pulse lengths.
|
||||
The LED strip type used in the Clever kits use the following protocol: a data source (a Raspberry Pi, for example) sends a bit stream, 24 bits per LED. Each LED reads the first 24 bits from the stream and sets its color accordingly while passing the rest of the stream to the next LED. Zeroes and ones are encoded by different pulse lengths.
|
||||
|
||||
This LED strip is supported by the [rpi_ws281x](https://github.com/jgarff/rpi_ws281x) library. The library uses the DMA (direct memory access) module of the Raspberry CPU and can utilize one of the three periphery channels: PWM, PCM or SPI. This allows the library to drive the strip consistently in a multitasking environment.
|
||||
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
# Theory
|
||||
|
||||
[**Lesson # 1** "Introduction. Principles of designing and building multicopters"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson1.md)
|
||||
[**Lesson # 1** "Introduction. Principles of designing and building multicopters"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson1.md)
|
||||
|
||||
[**Lesson # 2** "Fundamentals of electricity"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson2.md)
|
||||
[**Lesson # 2** "Fundamentals of electricity"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson2.md)
|
||||
|
||||
[**Lesson # 3** "Theory of soldering"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson3.md)
|
||||
[**Lesson # 3** "Theory of soldering"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson3.md)
|
||||
|
||||
[**Lesson # 4** "Aerodynamics of the flight. Propeller"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson4.md)
|
||||
[**Lesson # 4** "Aerodynamics of the flight. Propeller"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson4.md)
|
||||
|
||||
<!--[**Lesson # 5** "Brushless motors and controllers"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson5.md)-->
|
||||
<!--[**Lesson # 5** "Brushless motors and controllers"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson5.md)-->
|
||||
|
||||
[**Lesson 6** "Fundamentals of electromagnetism. Types of motors"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson6.md)
|
||||
[**Lesson 6** "Fundamentals of electromagnetism. Types of motors"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson6.md)
|
||||
|
||||
<!--[**Lesson # 7** "Operating principle, types and design of batteries"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson7.md)
|
||||
<!--[**Lesson # 7** "Operating principle, types and design of batteries"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson7.md)
|
||||
|
||||
[**Lesson # 8** "Controlling the flight of the multicopter. The flight controller operating principle. PID ESCs"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson8.md)
|
||||
[**Lesson # 8** "Controlling the flight of the multicopter. The flight controller operating principle. PID ESCs"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson8.md)
|
||||
|
||||
[**Lesson # 9** "Fundamentals of radio communication. Operation principle of radio control equipment"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson9.md)
|
||||
[**Lesson # 9** "Fundamentals of radio communication. Operation principle of radio control equipment"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson9.md)
|
||||
|
||||
[**Lesson # 10** "Analog and digital video streaming. Cameras, transmitters and receivers used"](https://github.com/CopterExpress/clover/blob/master/docs/en/lesson10.md)-->
|
||||
[**Lesson # 10** "Analog and digital video streaming. Cameras, transmitters and receivers used"](https://github.com/CopterExpress/clever/blob/master/docs/en/lesson10.md)-->
|
||||
|
||||
## Video lessons
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ Basic documentation: https://mavlink.io/en/.
|
||||
|
||||
MAVLink is a communication protocol between autonomous aircraft and vehicle systems (drones, planes, vehicles). The MAVLink protocol lies at the base of interaction between Pixhawk and Raspberry Pi.
|
||||
|
||||
Clover contains two wrappers for this protocol: [MAVROS](mavros.md) and [simple_offboard](simple_offboard.md).
|
||||
Clever contains two wrappers for this protocol: [MAVROS](mavros.md) and [simple_offboard](simple_offboard.md).
|
||||
|
||||
The code for sending an arbitrary MAVLink message may be found in [the examples](snippets.md#mavlink).
|
||||
|
||||
@@ -35,7 +35,7 @@ A complete list of MAVLink messages is available in [MAVLink documentation] (htt
|
||||
|
||||
Each device (a drone, a base station, etc.) has an ID in the MAVLink network. In PX4 MAVLink, ID is changed using parameter `MAV_SYS_ID`. Each MAVLink message contains a field with the ID of the originating system. Besides, some messages (for example, `COMMAND_LONG`) also contain the ID of the target system.
|
||||
|
||||
In addition to IDs of the systems, the messages may contain IDs of the originating component and the target component. Examples of the system components: a flight controller, an external camera, a controlling onboard computer (Raspberry Pi in case of Clover), etc.
|
||||
In addition to IDs of the systems, the messages may contain IDs of the originating component and the target component. Examples of the system components: a flight controller, an external camera, a controlling onboard computer (Raspberry Pi in case of Clever), etc.
|
||||
|
||||
### An example of a package
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ MAVROS \(MAVLink + ROS\) is a ROS package that allows controlling drones via the
|
||||
|
||||
MAVROS subscribes to certain ROS topics that can be used to send commands, publishes telemetry to other topics, and provides services.
|
||||
|
||||
The MAVROS node is automatically started in the Clover launch-file. In order to [set the type of connection](connection.md), change the `fcu_conn` argument.
|
||||
The MAVROS node is automatically started in the Clever launch-file. In order to [set the type of connection](connection.md), change the `fcu_conn` argument.
|
||||
|
||||
> **Hint** Simplified interaction with the drone is possible with the use of [`simple_offboard`] package (simple_offboard.md).
|
||||
|
||||
|
||||
@@ -1,129 +0,0 @@
|
||||
# Migration to version 0.20
|
||||
|
||||
[Image](image.md) version v0.20 includes significant changes in comparison with the version 0.19. When transitioning please note the changes presented below.
|
||||
|
||||
## ROS package `clever` is renamed to `clover`
|
||||
|
||||
All the imports in Python scripts should be changed.
|
||||
|
||||
Before:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from clever import srv
|
||||
from std_srvs.srv import Trigger
|
||||
|
||||
rospy.init_node('flight')
|
||||
|
||||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||||
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
|
||||
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
|
||||
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
|
||||
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
|
||||
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
|
||||
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
|
||||
# Take off 1 m
|
||||
navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
|
||||
```
|
||||
|
||||
After:
|
||||
|
||||
```python
|
||||
import rospy
|
||||
from clover import srv
|
||||
from std_srvs.srv import Trigger
|
||||
|
||||
rospy.init_node('flight')
|
||||
|
||||
get_telemetry = rospy.ServiceProxy('get_telemetry', srv.GetTelemetry)
|
||||
navigate = rospy.ServiceProxy('navigate', srv.Navigate)
|
||||
navigate_global = rospy.ServiceProxy('navigate_global', srv.NavigateGlobal)
|
||||
set_position = rospy.ServiceProxy('set_position', srv.SetPosition)
|
||||
set_velocity = rospy.ServiceProxy('set_velocity', srv.SetVelocity)
|
||||
set_attitude = rospy.ServiceProxy('set_attitude', srv.SetAttitude)
|
||||
set_rates = rospy.ServiceProxy('set_rates', srv.SetRates)
|
||||
land = rospy.ServiceProxy('land', Trigger)
|
||||
|
||||
# Take off 1 м
|
||||
navigate(x=0, y=0, z=1, frame_id='body', auto_arm=True)
|
||||
```
|
||||
|
||||
## systemd service `clever` is renamed to `clover`
|
||||
|
||||
For restarting the platform instead of:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart clever
|
||||
```
|
||||
|
||||
use command:
|
||||
|
||||
```bash
|
||||
sudo systemctl restart clover
|
||||
```
|
||||
|
||||
## Path to platform's files changed
|
||||
|
||||
The `~/catkin_ws/src/clever/` directory is renamed to `~/catkin_ws/src/clover`. Thus, configuration files (`*.launch`) are to be edited using the new path.
|
||||
|
||||
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`.
|
||||
|
||||
## The camera orientation configuration changed
|
||||
|
||||
See details in the "[Camera setup](camera_setup.md#frame)" article.
|
||||
@@ -6,33 +6,31 @@ This page contains models and drawings of some of the drone parts. They can be u
|
||||
|
||||
### 3D print
|
||||
|
||||
* Battery holder – [`battery_holder.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/battery_holder.stl). Filament: PLA/ABS/SBS. Infill: 50% or more.
|
||||
* Battery holder – [`battery_holder.stl`](https://github.com/CopterExpress/clever/raw/master/docs/assets/stl/battery_holder.stl). Filament: PLA/ABS/SBS. Infill: 50% or more.
|
||||
|
||||
### Laser cut
|
||||
|
||||
* Reinforcing Pad – [`reinforcing_pad.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/reinforcing_pad.dxf)
|
||||
* Reinforcing Pad – [`reinforcing_pad.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/reinforcing_pad.dxf)
|
||||
|
||||
## Clover 3
|
||||
|
||||
### 3D print
|
||||
|
||||
* Camera case – [`camera_case.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_case.stl). Filament: PLA/ABS/SBS.
|
||||
* Camera mount – [`camera_mount.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_mount.stl). Filament: PLA/ABS/SBS.
|
||||
* Camera plate – [`camera_plate.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/camera_plate.stl). Filament: PLA/ABS/SBS.
|
||||
* Mounting deck small – [`mounting_deck_small.stl`](https://github.com/CopterExpress/clover/raw/master/docs/assets/stl/mounting_deck_small.stl). Filament: PLA/ABS/SBS.
|
||||
* Camera case – [`camera_case.stl`](https://github.com/CopterExpress/clever/raw/master/docs/assets/stl/camera_case.stl). Filament: PLA/ABS/SBS.
|
||||
* Camera mount – [`camera_mount.stl`](https://github.com/CopterExpress/clever/raw/master/docs/assets/stl/camera_mount.stl). Filament: PLA/ABS/SBS.
|
||||
* Camera plate – [`camera_plate.stl`](https://github.com/CopterExpress/clever/raw/master/docs/assets/stl/camera_plate.stl). Filament: PLA/ABS/SBS.
|
||||
|
||||
### Laser cut
|
||||
|
||||
* Big leg – [`big_leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/big_leg.dxf).
|
||||
* Deck mount – [`deck.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/deck.dxf).
|
||||
* Prop guard – [`prop_guard.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard.dxf).
|
||||
* Prop guard fork – [`prop_guard_mount.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/prop_guard_mount.dxf).
|
||||
* Spacer – [`grab_spacer.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/grab_spacer.dxf).
|
||||
* Leg – [`leg.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/leg.dxf).
|
||||
* LED mount plate – [`led_mount_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/led_mount_plate.dxf).
|
||||
* Mounting deck small – [`mounting_deck_small.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/mounting_deck_small.dxf).
|
||||
* Big leg – [`big_leg.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/big_leg.dxf).
|
||||
* Deck mount – [`deck.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/deck.dxf).
|
||||
* Prop guard – [`prop_guard.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/prop_guard.dxf).
|
||||
* Prop guard fork – [`prop_guard_mount.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/prop_guard_mount.dxf).
|
||||
* Spacer – [`grab_spacer.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/grab_spacer.dxf).
|
||||
* Leg – [`leg.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/leg.dxf).
|
||||
* LED mount plate – [`led_mount_plate.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/led_mount_plate.dxf).
|
||||
|
||||
### Milling
|
||||
|
||||
* Central plate – [`central_plate.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/central_plate.dxf).
|
||||
* Arm – [`arm.dxf`](https://github.com/CopterExpress/clover/raw/master/docs/assets/dxf/arm.dxf).
|
||||
* Central plate – [`central_plate.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/central_plate.dxf).
|
||||
* Arm – [`arm.dxf`](https://github.com/CopterExpress/clever/raw/master/docs/assets/dxf/arm.dxf).
|
||||
|
||||
@@ -39,7 +39,7 @@ In manual mode the pilot controls the drone directly. GPS, computer vision data,
|
||||
|
||||
In autonomous flight modes the quadcopter ignores the control signals from the transmitter and uses a program to fly.
|
||||
|
||||
* **OFFBOARD** mode uses an external computer (like a [Raspberry Pi](raspberry.md)). This mode is used in Clover for [autonomous flights](simple_offboard.md).
|
||||
* **OFFBOARD** mode uses an external computer (like a [Raspberry Pi](raspberry.md)). This mode is used in Clever for [autonomous flights](simple_offboard.md).
|
||||
* **AUTO.MISSION** – PX4 uses the mission pre-loaded into the drone (the mission is uploaded using ground control station over [MAVLink](mavlink.md)). This mode is commonly used to move in a pre-planned path using GPS as a position source, for example, in photogrammetry.
|
||||
* **AUTO.RTL** – the copter automatically returns to the takeoff (launch) point.
|
||||
* **AUTO.LAND** – the copter lands at the current position.
|
||||
|
||||
@@ -4,7 +4,7 @@ Running the technology "Optical Flow" offers the possibility of POSCTL flight mo
|
||||
|
||||
## Enabling
|
||||
|
||||
> **Hint** It is recommended to use [special PX4 firmware for Clover](firmware.md).
|
||||
> **Hint** It is recommended to use [special PX4 firmware for Clever](firmware.md#прошивка-для-клевера).
|
||||
|
||||
The use of a rangefinder is essential. [Connect and setup laser-ranging sensor VL53L1X](laser.md), according to the manual.
|
||||
|
||||
@@ -74,7 +74,7 @@ navigate(x=1.5, frame_id='body')
|
||||
|
||||
<!-- TODO: статья по пидам -->
|
||||
|
||||
If the copter has an unstable position, try to increase the *P* coefficient of speed PID controller - parameters are `MPC_XY_VEL_P` and `MPC_Z_VEL_P`.
|
||||
If the copter has an unstable position using VPE, try to increase the *P* coefficient of speed PID controller - parameters are `MPC_XY_VEL_P` and `MPC_Z_VEL_P`.
|
||||
|
||||
If the copter has an unstable height, try increasing `MPC_Z_VEL_P` coefficient or getting better hover throttle - `MPC_THR_HOVER`.
|
||||
|
||||
@@ -85,8 +85,6 @@ If the copter is consistently yawing, try:
|
||||
* different values for `EKF2_MAG_TYPE` parameter, that indicates how data from the magnetometer is used in EKF2;
|
||||
* changing values of `EKF2_MAG_NOISE`, `EKF2_GYR_NOISE`, `EKF2_GYR_B_NOISE` parameters.
|
||||
|
||||
> **Note** For better results perform gyro calibration directly before taking off, using [appropriate snippet](snippets.md#calibrate-gyro).
|
||||
|
||||
If the copter's height is deviating, try:
|
||||
|
||||
* increasing the value of `MPC_Z_VEL_P` coefficient;
|
||||
|
||||
@@ -6,9 +6,9 @@ Open the *Vehicle Setup* tab and select the *Power* menu.
|
||||
|
||||
> **Note** Power sensor calibration should be done with the battery pack connected to the drone.
|
||||
|
||||
If there is no voltage indicator or manual calibration is not possible, set the average value of the voltage divider for the Clover 4 kit (*Voltage divider* = 11).
|
||||
If there is no voltage indicator or manual calibration is not possible, set the average value of the voltage divider for the Clever 4 kit (*Voltage divider* = 11).
|
||||
|
||||
1. Set the *Number of cells* parameter according to the number of cells in your battery (*3* for the Clover 4 drone).
|
||||
1. Set the *Number of cells* parameter according to the number of cells in your battery (*3* for the Clever 4 drone).
|
||||
2. Calculate the voltage divider:
|
||||
* Measure voltage across the battery (you may use a battery voltage tester for that).
|
||||
* Press the *Calculate* button next to the *Voltage divider* label.
|
||||
|
||||
@@ -2,15 +2,15 @@
|
||||
|
||||
<img src="../assets/programming.png" width="250" align="right">
|
||||
|
||||
The Clover platform allows a [Raspberry Pi](raspberry.md) computer to be used for programming autonomous flights. The flight program is typically written using the Python programming language. The program may [receive telemetry data](simple_offboard.md#get_telemetry) (which includes battery data, attitude, position, and other parameters) and send commands like: [fly to a point in space](simple_offboard.md#navigate), [set attitude](simple_offboard.md#set_attitude), [set angular rates](simple_offboard.md#set_rates), and others.
|
||||
The Clever platform allows a [Raspberry Pi](raspberry.md) computer to be used for programming autonomous flights. The flight program is typically written using the Python programming language. The program may [receive telemetry data](simple_offboard.md#get_telemetry) (which includes battery data, attitude, position, and other parameters) and send commands like: [fly to a point in space](simple_offboard.md#navigate), [set attitude](simple_offboard.md#set_attitude), [set angular rates](simple_offboard.md#set_rates), and others.
|
||||
|
||||
The platform utilizes the [ROS framework](ros.md), which allows the user program to communicate with the Clover services that are running as a `clever` systemd daemon. The [MAVROS](mavros.md) package is used to interact with the flight controller.
|
||||
The platform utilizes the [ROS framework](ros.md), which allows the user program to communicate with the Clever services that are running as a `clever` systemd daemon. The [MAVROS](mavros.md) package is used to interact with the flight controller.
|
||||
|
||||
PX4 uses [OFFBOARD mode](modes.md#auto) for autonomous flights. The Clover API can be used to transition the drone to this flight mode automatically. If you need to interrupt the autonomous flight, use your flight mode stick on your RC controller to transition to any other flight mode.
|
||||
PX4 uses [OFFBOARD mode](modes.md#auto) for autonomous flights. The Clever API can be used to transition the drone to this flight mode automatically. If you need to interrupt the autonomous flight, use your flight mode stick on your RC controller to transition to any other flight mode.
|
||||
|
||||
## Positioning system {#positioning}
|
||||
|
||||
A drone has to use a positioning system to be able to hover still or to fly from point to point. The system should compute the drone position and feed this data into the flight controller. Clover allows using multiple positioning systems, such as [optical flow](optical_flow.md) (requires a [camera](camera.md) and a [rangefinder](laser.md)), [fiducial markers](aruco.md) (requires a camera and markers), GPS and others.
|
||||
A drone has to use a positioning system to be able to hover still or to fly from point to point. The system should compute the drone position and feed this data into the flight controller. Clever allows using multiple positioning systems, such as [optical flow](optical_flow.md) (requires a [camera](camera.md) and a [rangefinder](laser.md)), [fiducial markers](aruco.md) (requires a camera and markers), GPS and others.
|
||||
|
||||
### Optical flow
|
||||
|
||||
@@ -92,7 +92,7 @@ You can also use the ["Autonomous flight"](simple_offboard.md) article as an API
|
||||
|
||||
## Additional periphery
|
||||
|
||||
The Clover platform also exposes APIs for interacting with other peripherals. Read more in the following articles:
|
||||
The Clever platform also exposes APIs for interacting with other peripherals. Read more in the following articles:
|
||||
|
||||
* [LED strip](leds.md);
|
||||
* [laser rangefinder](laser.md);
|
||||
|
||||
@@ -4,7 +4,7 @@ Main article: https://dev.px4.io/en/advanced/parameter_reference.html
|
||||
|
||||
> **Note** This is a description some of the most important PX4 parameters as of version 1.8.0. The full list is available at the link above.
|
||||
|
||||
To change PX4 parameters, you can use the QGroundControl application [by connecting to Clover via Wi-Fi](gcs_bridge.md):
|
||||
To change PX4 parameters, you can use the QGroundControl application [by connecting to Clever via Wi-Fi](gcs_bridge.md):
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Raspberry Pi
|
||||
============
|
||||
|
||||
**Raspberry Pi** is a single-board computer that fits in the palm, created on the basis of ARM mobile microprocessor. It features low energy consumption, and it can even run on solar panels. Raspberry Pi 3 is included in the kits for programmable quadcopters "Clover".
|
||||
**Raspberry Pi** is a single-board computer that fits in the palm, created on the basis of ARM mobile microprocessor. It features low energy consumption, and it can even run on solar panels. Raspberry Pi 3 is included in the kits for programmable quadcopters "Clever".
|
||||
|
||||
<img src="../assets/raspberry.png" class="center zoom" alt="Raspberry Pi 3" width="400">
|
||||
|
||||
@@ -14,6 +14,6 @@ Technical specifications:
|
||||
* Four USB 2.0 ports.
|
||||
* An HDMI port.
|
||||
|
||||
Raspberry Pi is connected to the flight controller in the Clover kit and is used as a companion computer. It can be used to [connect to the drone over Wi-Fi](wifi.md), perform autonomous flights, access peripherals and much more.
|
||||
Raspberry Pi is connected to the flight controller in the Clever kit and is used as a companion computer. It can be used to [connect to the drone over Wi-Fi](wifi.md), perform autonomous flights, access peripherals and much more.
|
||||
|
||||
**Next**: [Raspberry Pi image](image.md)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
Controlling Clover from a smartphone
|
||||
Controlling Clever from a smartphone
|
||||
===
|
||||
|
||||
<a href="https://itunes.apple.com/ru/app/clever-rc/id1396166572?mt=8"><img src="../assets/appstore.svg"></a><a href="https://play.google.com/store/apps/details?id=express.copter.cleverrc"><img src="../assets/google_play.png" width="15%"></a>
|
||||
|
||||
To control Clover from a smartphone via Wi-Fi, you have to install the appropriate application – [iOS](https://itunes.apple.com/ru/app/clever-rc/id1396166572?mt=8), Android (https://play.google.com/store/apps/details?id=express.copter.cleverrc).
|
||||
To control Clever from a smartphone via Wi-Fi, you have to install the appropriate application – [iOS](https://itunes.apple.com/ru/app/clever-rc/id1396166572?mt=8), Android (https://play.google.com/store/apps/details?id=express.copter.cleverrc).
|
||||
|
||||

|
||||
|
||||
@@ -16,7 +16,7 @@ Configuring
|
||||
|
||||
> **Warning** An open QGroundControl or rviz connection sends large amounts of data over Wi-Fi, which can adversely affect responsiveness of the mobile transmitter. It is recommended not to use these applications together with it.
|
||||
|
||||
Install [Clover image on RPi](image.md). For running the application, settings `rosbridge` and `rc` in the launch file (`~/catkin_ws/src/clever/clever/launch/clever.launch`) should be enabled:
|
||||
Install [Clever image on RPi](image.md). For running the application, settings `rosbridge` and `rc` in the launch file (`~/catkin_ws/src/clever/clever/launch/clever.launch`) should be enabled:
|
||||
|
||||
```xml
|
||||
<arg name="rosbridge" default="true"/>
|
||||
@@ -44,7 +44,7 @@ Additional PX4 parameters:
|
||||
Connection
|
||||
---
|
||||
|
||||
Connect the smartphone to Clover [Wi-Fi](wifi.md) network (`CLEVER-xxxx`). The application should connect to the copter automatically. Upon successful connection, the current [mode](modes.md) and the battery charge level should be displayed.
|
||||
Connect the smartphone to Clever [Wi-Fi](wifi.md) network (`CLEVER-xxxx`). The application should connect to the copter automatically. Upon successful connection, the current [mode](modes.md) and the battery charge level should be displayed.
|
||||
|
||||
The sticks on the screen of the application work just like real sticks. To arm the copter, hold the left stick in the bottom right corner for several seconds. To disarm — in the bottom left corner.
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ You can also work with the services using the `rosservice` utility. For instance
|
||||
rosservice call /get_telemetry "{frame_id: ''}"
|
||||
```
|
||||
|
||||
More examples of using the services for Clover quadcopter autonomous flights are available in the [documentation for node simple_offboard](simple_offboard.md).
|
||||
More examples of using the services for Clever quadcopter autonomous flights are available in the [documentation for node simple_offboard](simple_offboard.md).
|
||||
|
||||
Working on several PCs
|
||||
---
|
||||
|
||||
@@ -14,13 +14,13 @@ Install package `ros-melodic-desktop-full` or `ros-melodic-desktop` using the [i
|
||||
Start rviz
|
||||
---
|
||||
|
||||
To start еру visualization of the state of Clover in real time, connect to it via Wi-Fi (`CLEVER-xxx`) and run rviz, specifying an appropriate ROS_MASTER_URI:
|
||||
To start еру visualization of the state of Clever in real time, connect to it via Wi-Fi (`CLEVER-xxx`) and run rviz, specifying an appropriate ROS_MASTER_URI:
|
||||
|
||||
```(bash)
|
||||
ROS_MASTER_URI=http://192.168.11.1:11311 rviz
|
||||
```
|
||||
|
||||
If connection is not established, make sure the `.bashrc` of Clover contains line:
|
||||
If connection is not established, make sure the `.bashrc` of Clever contains line:
|
||||
|
||||
```(bash)
|
||||
export ROS_HOSTNAME=`hostname`.local
|
||||
@@ -56,7 +56,7 @@ Starting the rqt toolkit
|
||||
|
||||

|
||||
|
||||
To start rqt for monitoring Clover status, use command:
|
||||
To start rqt for monitoring Clever status, use command:
|
||||
|
||||
```(bash)
|
||||
ROS_MASTER_URI=http://192.168.11.1:11311 rqt
|
||||
|
||||
@@ -27,7 +27,7 @@ Main article: https://docs.qgroundcontrol.com/en/SetupView/Firmware.html
|
||||
|
||||
> **Note** Do not connect your flight controller prior to flashing.
|
||||
|
||||
We recommend using the modified version of PX4 by CopterExpress for the Clover drone, especially for autonomous flights. Download the latest stable version **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">from our GitHub</a>**.
|
||||
We recommend using the modified version of PX4 by CopterExpress for the Clever drone, especially for autonomous flights. Download the latest stable version **<a class="latest-firmware v4" href="https://github.com/CopterExpress/Firmware/releases">from our GitHub</a>**.
|
||||
|
||||
Flash the flight controller with this firmware:
|
||||
|
||||
@@ -87,7 +87,7 @@ Press the *Save* button to save the changed value to the flight controller. Chan
|
||||
|
||||
#### Configuring PID regulators
|
||||
|
||||
##### Averaged PID coefficients for the Clover 4 drone
|
||||
##### Averaged PID coefficients for the Clever 4 drone
|
||||
|
||||
* `MC_PITCHRATE_P` = 0.087
|
||||
* `MC_PITCHRATE_I` = 0.037
|
||||
@@ -103,7 +103,7 @@ Press the *Save* button to save the changed value to the flight controller. Chan
|
||||
* `MPC_Z_VEL_P` = 0.24
|
||||
* `MPC_Z_P` = 1.2
|
||||
|
||||
##### Averaged PID coefficients for the Clover 3 drone
|
||||
##### Averaged PID coefficients for the Clever 3 drone
|
||||
|
||||
* `MC_PITCHRATE_P` = 0.145
|
||||
* `MC_PITCHRATE_I` = 0.050
|
||||
|
||||
@@ -86,7 +86,7 @@ After drying, the guard is ready for installation and for the first test flight!
|
||||
|
||||
## First flights
|
||||
|
||||
We have made a guard for the Clover 2 copter, which is a learning aid for quadcopters assembly and setup and is installed on it without modification. The guard weighs 70g more (139 grams) than the standard one, and almost does not affect controllability and flying time.
|
||||
We have made a guard for the Clever 2 copter, which is a learning aid for quadcopters assembly and setup and is installed on it without modification. The guard weighs 70g more (139 grams) than the standard one, and almost does not affect controllability and flying time.
|
||||
|
||||
It should also be said that excessive vibrations, if any, may be removed by more rigid attachment to the copter.
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
Simple OFFBOARD
|
||||
===
|
||||
|
||||
> **Note** The following applies to [image](image.md) versions **0.15** and up. Older documentation is still avaliable [for version **0.14**](https://github.com/CopterExpress/clover/blob/v0.14/docs/ru/simple_offboard.md) (Russian only).
|
||||
> **Note** The following applies to [image](image.md) versions **0.15** and up. Older documentation is still avaliable [for version **0.14**](https://github.com/CopterExpress/clever/blob/v0.14/docs/ru/simple_offboard.md) (Russian only).
|
||||
|
||||
<!-- -->
|
||||
|
||||
> **Hint** We recommend using our [special PX4 firmware for Clover](firmware.md#modified-firmware-for-clever) for autonomous flights.
|
||||
> **Hint** We recommend using our [special PX4 firmware for Clever](firmware.md#modified-firmware-for-clever) for autonomous flights.
|
||||
|
||||
The `simple_offboard` module of the `clever` package is intended for simplified programming of the autonomous drone flight (`OFFBOARD` [flight mode](modes.md)). It allows setting the desired flight tasks, and automatically transforms [coordinates between frames](frames.md).
|
||||
|
||||
|
||||
@@ -361,36 +361,4 @@ rospy.loginfo('flip')
|
||||
flip()
|
||||
```
|
||||
|
||||
Requires the [special PX4 firmware for Clover](firmware.md#modified-firmware-for-clever). Before running a flip, take all necessary safty precautions.
|
||||
|
||||
### # {#calibrate-gyro}
|
||||
|
||||
Perform gyro calibration:
|
||||
|
||||
```python
|
||||
from pymavlink import mavutil
|
||||
from mavros_msgs.srv import CommandLong
|
||||
from mavros_msgs.msg import State
|
||||
|
||||
# ...
|
||||
|
||||
send_command = rospy.ServiceProxy('/mavros/cmd/command', CommandLong)
|
||||
|
||||
def calibrate_gyro():
|
||||
rospy.loginfo('Calibrate gyro')
|
||||
if not send_command(command=mavutil.mavlink.MAV_CMD_PREFLIGHT_CALIBRATION, param1=1).success:
|
||||
return False
|
||||
|
||||
calibrating = False
|
||||
while not rospy.is_shutdown():
|
||||
state = rospy.wait_for_message('mavros/state', State)
|
||||
if state.system_status == mavutil.mavlink.MAV_STATE_CALIBRATING or state.system_status == mavutil.mavlink.MAV_STATE_UNINIT:
|
||||
calibrating = True
|
||||
elif calibrating and state.system_status == mavutil.mavlink.MAV_STATE_STANDBY:
|
||||
rospy.loginfo('Calibrating finished')
|
||||
return True
|
||||
|
||||
calibrate_gyro()
|
||||
```
|
||||
|
||||
> **Note** In process of calibration the drone should not be moved.
|
||||
Requires the [special PX4 firmware for Clever](firmware.md#modified-firmware-for-clever). Before running a flip, take all necessary safty precautions.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user