Compare commits
118 Commits
raspios_64
...
fix-builde
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
23c745c17b | ||
|
|
c646aa3b43 | ||
|
|
dbeef76ec0 | ||
|
|
91543a9c0e | ||
|
|
f25816f2d5 | ||
|
|
62e5a20a79 | ||
|
|
857e41516a | ||
|
|
48549de07f | ||
|
|
1c70499ebd | ||
|
|
6190605312 | ||
|
|
27ae453136 | ||
|
|
9d544a139a | ||
|
|
bf84a98cb6 | ||
|
|
9270b6a278 | ||
|
|
8a95789d77 | ||
|
|
db328ba25e | ||
|
|
afa50add8f | ||
|
|
735b88d498 | ||
|
|
8aaaae929e | ||
|
|
793b614b7b | ||
|
|
62ab5c2357 | ||
|
|
181a78e4a9 | ||
|
|
c72eb0c027 | ||
|
|
5d99e44c30 | ||
|
|
5eb9b4acbe | ||
|
|
30ada8f311 | ||
|
|
e717829945 | ||
|
|
50dc17badb | ||
|
|
1dea541df2 | ||
|
|
d6b950b726 | ||
|
|
e2a1d3aaeb | ||
|
|
165e4d1a61 | ||
|
|
4f631300d4 | ||
|
|
e252a1cddc | ||
|
|
25dd17c286 | ||
|
|
b9395e3d18 | ||
|
|
a32dd7dcdd | ||
|
|
1e12e34070 | ||
|
|
3ff675d794 | ||
|
|
bb3e4befe5 | ||
|
|
fe71007ebd | ||
|
|
68cec159f7 | ||
|
|
4e8127f690 | ||
|
|
8f78f2b6e4 | ||
|
|
c8163cd38b | ||
|
|
7831992d6a | ||
|
|
873befdba9 | ||
|
|
c3cbc305c3 | ||
|
|
b71e802a2e | ||
|
|
3c5f2c958e | ||
|
|
267993aec4 | ||
|
|
86dd42c3b3 | ||
|
|
9d338d843b | ||
|
|
3e100bee91 | ||
|
|
8a29b9a37a | ||
|
|
2e80a06db1 | ||
|
|
0003985c3b | ||
|
|
f250916ede | ||
|
|
ee2944a1d3 | ||
|
|
a088524468 | ||
|
|
215fe237ca | ||
|
|
8c1b5c19d0 | ||
|
|
779dfb3f4f | ||
|
|
23d503adc5 | ||
|
|
0350ecbff7 | ||
|
|
12bed337dc | ||
|
|
6a1b609ccd | ||
|
|
3d5c51a42e | ||
|
|
3702ed0c86 | ||
|
|
741abadb54 | ||
|
|
c6dc732867 | ||
|
|
ba76e51966 | ||
|
|
7951f0e2ba | ||
|
|
cd58c03c0f | ||
|
|
ce6b2530c4 | ||
|
|
14e4af76aa | ||
|
|
f3f1557b0b | ||
|
|
18d410db24 | ||
|
|
207dc88579 | ||
|
|
58f6ac4b39 | ||
|
|
688e4f0ca9 | ||
|
|
7cbe823700 | ||
|
|
df681e0a79 | ||
|
|
8aad2fc363 | ||
|
|
3c8dd14c9d | ||
|
|
3a20bc3212 | ||
|
|
1105cd8750 | ||
|
|
43d7e7c70b | ||
|
|
7a1e885df1 | ||
|
|
9a9c2d5c9f | ||
|
|
eaeb146878 | ||
|
|
2452be05ff | ||
|
|
a4336a39c9 | ||
|
|
9cdf7dea41 | ||
|
|
b90dc3c020 | ||
|
|
91252d8d50 | ||
|
|
c4b94390e9 | ||
|
|
1b4167365e | ||
|
|
01ec592abb | ||
|
|
e2e2e04381 | ||
|
|
27e0189cf5 | ||
|
|
e3d89cbc4c | ||
|
|
a0ac85e0d3 | ||
|
|
83e5911110 | ||
|
|
05d634d2d3 | ||
|
|
4967d651bd | ||
|
|
91f948d3f4 | ||
|
|
ebf55244f4 | ||
|
|
5b6d08e25d | ||
|
|
8036214406 | ||
|
|
5d3c8c89cb | ||
|
|
2075fa52ef | ||
|
|
b0e1e1ffae | ||
|
|
4482f973db | ||
|
|
b1c7ee6b66 | ||
|
|
ff9e669352 | ||
|
|
6c8291749f | ||
|
|
039d2438cd |
@@ -22,6 +22,7 @@
|
|||||||
"ROS Kinetic",
|
"ROS Kinetic",
|
||||||
"ROS Melodic",
|
"ROS Melodic",
|
||||||
"OpenCV",
|
"OpenCV",
|
||||||
|
"OpenVPN",
|
||||||
"Gazebo",
|
"Gazebo",
|
||||||
"GitHub",
|
"GitHub",
|
||||||
"FPV",
|
"FPV",
|
||||||
@@ -106,7 +107,9 @@
|
|||||||
"UDP",
|
"UDP",
|
||||||
"QR",
|
"QR",
|
||||||
"Li-ion",
|
"Li-ion",
|
||||||
"Nvidia"
|
"Nvidia",
|
||||||
|
"VirtualBox",
|
||||||
|
"VMware"
|
||||||
],
|
],
|
||||||
"code_blocks": false
|
"code_blocks": false
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ env:
|
|||||||
- IMAGE_VERSION=${TRAVIS_TAG:-${TRAVIS_COMMIT:0:7}}
|
- IMAGE_VERSION=${TRAVIS_TAG:-${TRAVIS_COMMIT:0:7}}
|
||||||
- IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
|
- IMAGE_NAME="$(basename -s '.git' ${TARGET_REPO})_${IMAGE_VERSION}.img"
|
||||||
git:
|
git:
|
||||||
depth: 50
|
depth: 1
|
||||||
jobs:
|
jobs:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
include:
|
include:
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
- cp images/*.zip imgcache
|
- cp images/*.zip imgcache
|
||||||
after_success:
|
after_success:
|
||||||
- sudo chmod -R 777 *
|
- sudo chmod -R 777 *
|
||||||
- cd images && zip ${IMAGE_NAME}.zip ${IMAGE_NAME} && stat --printf="Compressed image size:%s\n" ${IMAGE_NAME}.zip
|
- cd images && zip -9 ${IMAGE_NAME}.zip ${IMAGE_NAME} && stat --printf="Compressed image size:%s\n" ${IMAGE_NAME}.zip
|
||||||
before_deploy:
|
before_deploy:
|
||||||
# Set up git user name and tag this commit
|
# Set up git user name and tag this commit
|
||||||
- git config --local user.name "goldarte"
|
- git config --local user.name "goldarte"
|
||||||
|
|||||||
12
README.md
@@ -1,12 +1,14 @@
|
|||||||
# COEX Clover Drone Kit
|
# clover🍀: create autonomous drones easily
|
||||||
|
|
||||||
<img src="docs/assets/clever4-front-white.png" align="right" width="400px" alt="Clover Drone">
|
<img src="docs/assets/clover42-main.png" align="right" width="400px" alt="COEX Clover 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.
|
Clover is an open source [ROS](https://www.ros.org)-based framework, providing user-friendly tools to control [PX4](https://px4.io)-powered drones. Clover is available as a ROS package, but is shipped mainly as a preconfigured image for Raspberry Pi. Once you've installed Raspberry Pi on your drone and flashed the image to its microSD card, taking the drone up in the air is a matter of minutes.
|
||||||
|
|
||||||
The main documentation is available [on Gitbook](https://clover.coex.tech/).
|
COEX Clover Drone is an educational programmable drone kit, suited perfectly for running clover software. The kit is shipped unassembled and includes Pixracer-compatible autopilot running PX4 firmware, Raspberry Pi 4 as a companion computer, a camera for computer vision navigation as well as additional sensors and peripheral devices. Batteries included.
|
||||||
|
|
||||||
Official website: <a href="https://coex.tech/clover">coex.tech/clover</a>.
|
The main documentation is available at [https://clover.coex.tech](https://clover.coex.tech/). Official website: [coex.tech/clover](https://coex.tech/clover).
|
||||||
|
|
||||||
|
[__Support us on Kickstarter!__](https://www.kickstarter.com/projects/copterexpress/cloverdrone)
|
||||||
|
|
||||||
## Video compilation
|
## Video compilation
|
||||||
|
|
||||||
|
|||||||
8
aruco_pose/CHANGELOG.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Changelog for package aruco_pose
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
0.21.1 (2020-11-17)
|
||||||
|
-------------------
|
||||||
|
* First release of aruco_pose package to ROS
|
||||||
|
* Contributors: Alamoris, Alexey Rogachevskiy, Arthur Golubtsov, Ilya Petrov, Oleg Kalachev
|
||||||
@@ -8,6 +8,8 @@ p = cv2.aruco.DetectorParameters_create()
|
|||||||
|
|
||||||
gen = ParameterGenerator()
|
gen = ParameterGenerator()
|
||||||
|
|
||||||
|
gen.add("enabled", bool_t, 0, "if detection enabled", True)
|
||||||
|
|
||||||
gen.add("adaptiveThreshConstant", double_t, 0,
|
gen.add("adaptiveThreshConstant", double_t, 0,
|
||||||
"Constant for adaptive thresholding before finding contours",
|
"Constant for adaptive thresholding before finding contours",
|
||||||
p.adaptiveThreshConstant, 0, 100)
|
p.adaptiveThreshConstant, 0, 100)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package format="2">
|
<package format="2">
|
||||||
<name>aruco_pose</name>
|
<name>aruco_pose</name>
|
||||||
<version>0.0.1</version>
|
<version>0.21.1</version>
|
||||||
<description>Positioning with ArUco markers</description>
|
<description>Positioning with ArUco markers</description>
|
||||||
|
|
||||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ private:
|
|||||||
std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
|
std::unique_ptr<tf2_ros::Buffer> tf_buffer_;
|
||||||
std::unique_ptr<tf2_ros::TransformListener> tf_listener_;
|
std::unique_ptr<tf2_ros::TransformListener> tf_listener_;
|
||||||
std::shared_ptr<dynamic_reconfigure::Server<aruco_pose::DetectorConfig>> dyn_srv_;
|
std::shared_ptr<dynamic_reconfigure::Server<aruco_pose::DetectorConfig>> dyn_srv_;
|
||||||
|
bool enabled_ = true;
|
||||||
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
cv::Ptr<cv::aruco::Dictionary> dictionary_;
|
||||||
cv::Ptr<cv::aruco::DetectorParameters> parameters_;
|
cv::Ptr<cv::aruco::DetectorParameters> parameters_;
|
||||||
image_transport::Publisher debug_pub_;
|
image_transport::Publisher debug_pub_;
|
||||||
@@ -128,6 +129,8 @@ public:
|
|||||||
private:
|
private:
|
||||||
void imageCallback(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo)
|
void imageCallback(const sensor_msgs::ImageConstPtr& msg, const sensor_msgs::CameraInfoConstPtr &cinfo)
|
||||||
{
|
{
|
||||||
|
if (!enabled_) return;
|
||||||
|
|
||||||
Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
|
Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
|
||||||
|
|
||||||
vector<int> ids;
|
vector<int> ids;
|
||||||
@@ -356,6 +359,7 @@ private:
|
|||||||
|
|
||||||
void paramCallback(aruco_pose::DetectorConfig &config, uint32_t level)
|
void paramCallback(aruco_pose::DetectorConfig &config, uint32_t level)
|
||||||
{
|
{
|
||||||
|
enabled_ = config.enabled;
|
||||||
parameters_->adaptiveThreshConstant = config.adaptiveThreshConstant;
|
parameters_->adaptiveThreshConstant = config.adaptiveThreshConstant;
|
||||||
parameters_->adaptiveThreshWinSizeMin = config.adaptiveThreshWinSizeMin;
|
parameters_->adaptiveThreshWinSizeMin = config.adaptiveThreshWinSizeMin;
|
||||||
parameters_->adaptiveThreshWinSizeMax = config.adaptiveThreshWinSizeMax;
|
parameters_->adaptiveThreshWinSizeMax = config.adaptiveThreshWinSizeMax;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Information: https://clover.coex.tech/en/aruco.html
|
# Information: https://clover.coex.tech/aruco
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
from clover import srv
|
from clover import srv
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Information: https://clover.coex.tech/en/leds.html
|
# Information: https://clover.coex.tech/led
|
||||||
|
|
||||||
import rospy
|
import rospy
|
||||||
from clover.srv import SetLEDEffect
|
from clover.srv import SetLEDEffect
|
||||||
@@ -7,19 +7,25 @@ rospy.init_node('leds')
|
|||||||
|
|
||||||
set_effect = rospy.ServiceProxy('led/set_effect', SetLEDEffect) # define proxy to ROS-service
|
set_effect = rospy.ServiceProxy('led/set_effect', SetLEDEffect) # define proxy to ROS-service
|
||||||
|
|
||||||
|
print('Fill red')
|
||||||
set_effect(r=255, g=0, b=0) # fill strip with red color
|
set_effect(r=255, g=0, b=0) # fill strip with red color
|
||||||
rospy.sleep(2)
|
rospy.sleep(2)
|
||||||
|
|
||||||
|
print('Fill green')
|
||||||
set_effect(r=0, g=100, b=0) # fill strip with green color
|
set_effect(r=0, g=100, b=0) # fill strip with green color
|
||||||
rospy.sleep(2)
|
rospy.sleep(2)
|
||||||
|
|
||||||
|
print('Fade to blue')
|
||||||
set_effect(effect='fade', r=0, g=0, b=255) # fade to blue color
|
set_effect(effect='fade', r=0, g=0, b=255) # fade to blue color
|
||||||
rospy.sleep(2)
|
rospy.sleep(2)
|
||||||
|
|
||||||
|
print('Flash red')
|
||||||
set_effect(effect='flash', r=255, g=0, b=0) # flash twice with red color
|
set_effect(effect='flash', r=255, g=0, b=0) # flash twice with red color
|
||||||
rospy.sleep(5)
|
rospy.sleep(2)
|
||||||
|
|
||||||
|
print('Blink white')
|
||||||
set_effect(effect='blink', r=255, g=255, b=255) # blink with white color
|
set_effect(effect='blink', r=255, g=255, b=255) # blink with white color
|
||||||
rospy.sleep(5)
|
rospy.sleep(5)
|
||||||
|
|
||||||
|
print('Rainbow')
|
||||||
set_effect(effect='rainbow') # show rainbow
|
set_effect(effect='rainbow') # show rainbow
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
set -e # Exit immidiately on non-zero result
|
set -e # Exit immidiately on non-zero result
|
||||||
|
|
||||||
SOURCE_IMAGE="https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2020-02-14/2020-02-13-raspbian-buster-lite.zip"
|
SOURCE_IMAGE="https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-01-12/2021-01-11-raspios-buster-armhf-lite.zip"
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:='noninteractive'}
|
export DEBIAN_FRONTEND=${DEBIAN_FRONTEND:='noninteractive'}
|
||||||
export LANG=${LANG:='C.UTF-8'}
|
export LANG=${LANG:='C.UTF-8'}
|
||||||
@@ -105,7 +105,7 @@ ${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/monkey.
|
|||||||
# software install
|
# software install
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-software.sh'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-software.sh'
|
||||||
# examples
|
# examples
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/examples' '/home/pi/'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} copy ${SCRIPTS_DIR}'/assets/examples' '/home/pi/' # TODO: symlink?
|
||||||
# network setup
|
# network setup
|
||||||
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-network.sh'
|
${BUILDER_DIR}/image-chroot.sh ${IMAGE_PATH} exec ${SCRIPTS_DIR}'/image-network.sh'
|
||||||
# avahi setup
|
# avahi setup
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
# copies or substantial portions of the Software.
|
# copies or substantial portions of the Software.
|
||||||
#
|
#
|
||||||
|
|
||||||
set -e # Exit immidiately on non-zero result
|
set -ex # Exit immidiately on non-zero result
|
||||||
|
|
||||||
REPO=$1
|
REPO=$1
|
||||||
REF=$2
|
REF=$2
|
||||||
@@ -130,6 +130,9 @@ catkin_make run_tests #&& catkin_test_results
|
|||||||
echo_stamp "Change permissions for catkin_ws"
|
echo_stamp "Change permissions for catkin_ws"
|
||||||
chown -Rf pi:pi /home/pi/catkin_ws
|
chown -Rf pi:pi /home/pi/catkin_ws
|
||||||
|
|
||||||
|
echo_stamp "Change permissions for examples"
|
||||||
|
chown -Rf pi:pi /home/pi/examples
|
||||||
|
|
||||||
echo_stamp "Setup ROS environment"
|
echo_stamp "Setup ROS environment"
|
||||||
cat << EOF >> /home/pi/.bashrc
|
cat << EOF >> /home/pi/.bashrc
|
||||||
LANG='C.UTF-8'
|
LANG='C.UTF-8'
|
||||||
|
|||||||
@@ -82,6 +82,9 @@ apt-get update
|
|||||||
|
|
||||||
# Let's retry fetching those packages several times, just in case
|
# Let's retry fetching those packages several times, just in case
|
||||||
echo_stamp "Software installing"
|
echo_stamp "Software installing"
|
||||||
|
apt-cache policy cmake
|
||||||
|
apt-cache policy cmake-data
|
||||||
|
my_travis_retry apt-get install --no-install-recommends -y cmake-data=3.13.4-1 cmake=3.13.4-1
|
||||||
my_travis_retry apt-get install --no-install-recommends -y \
|
my_travis_retry apt-get install --no-install-recommends -y \
|
||||||
unzip \
|
unzip \
|
||||||
zip \
|
zip \
|
||||||
@@ -95,7 +98,6 @@ git \
|
|||||||
dnsmasq \
|
dnsmasq \
|
||||||
tmux \
|
tmux \
|
||||||
vim \
|
vim \
|
||||||
cmake \
|
|
||||||
libjpeg8 \
|
libjpeg8 \
|
||||||
tcpdump \
|
tcpdump \
|
||||||
ltrace \
|
ltrace \
|
||||||
@@ -110,7 +112,6 @@ libffi-dev \
|
|||||||
monkey \
|
monkey \
|
||||||
pigpio python-pigpio python3-pigpio \
|
pigpio python-pigpio python3-pigpio \
|
||||||
i2c-tools \
|
i2c-tools \
|
||||||
espeak espeak-data python-espeak \
|
|
||||||
ntpdate \
|
ntpdate \
|
||||||
python-dev \
|
python-dev \
|
||||||
python3-dev \
|
python3-dev \
|
||||||
@@ -124,10 +125,11 @@ sed -i "s/updates_available//" /usr/share/byobu/status/status
|
|||||||
|
|
||||||
echo_stamp "Installing pip"
|
echo_stamp "Installing pip"
|
||||||
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
||||||
|
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip2.py
|
||||||
python3 get-pip.py
|
python3 get-pip.py
|
||||||
python get-pip.py
|
python get-pip2.py
|
||||||
rm get-pip.py
|
rm get-pip.py get-pip2.py
|
||||||
#my_travis_retry pip install --upgrade pip
|
my_travis_retry pip install --upgrade pip
|
||||||
#my_travis_retry pip3 install --upgrade pip
|
#my_travis_retry pip3 install --upgrade pip
|
||||||
|
|
||||||
echo_stamp "Make sure both pip and pip3 are installed"
|
echo_stamp "Make sure both pip and pip3 are installed"
|
||||||
@@ -136,6 +138,7 @@ pip3 --version
|
|||||||
|
|
||||||
echo_stamp "Install and enable Butterfly (web terminal)"
|
echo_stamp "Install and enable Butterfly (web terminal)"
|
||||||
echo_stamp "Workaround for tornado >= 6.0 breaking butterfly"
|
echo_stamp "Workaround for tornado >= 6.0 breaking butterfly"
|
||||||
|
export CRYPTOGRAPHY_DONT_BUILD_RUST=1
|
||||||
my_travis_retry pip3 install tornado==5.1.1
|
my_travis_retry pip3 install tornado==5.1.1
|
||||||
my_travis_retry pip3 install butterfly
|
my_travis_retry pip3 install butterfly
|
||||||
my_travis_retry pip3 install butterfly[systemd]
|
my_travis_retry pip3 install butterfly[systemd]
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ set -e
|
|||||||
# Step 1: Install pip
|
# Step 1: Install pip
|
||||||
apt update
|
apt update
|
||||||
apt install -y curl
|
apt install -y curl
|
||||||
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
|
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
|
||||||
python ./get-pip.py
|
python ./get-pip.py
|
||||||
|
|
||||||
# Step 1.5: Add deb.coex.tech to apt
|
# Step 1.5: Add deb.coex.tech to apt
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ import pymavlink
|
|||||||
from pymavlink import mavutil
|
from pymavlink import mavutil
|
||||||
import rpi_ws281x
|
import rpi_ws281x
|
||||||
import pigpio
|
import pigpio
|
||||||
from espeak import espeak
|
# from espeak import espeak
|
||||||
from pyzbar import pyzbar
|
from pyzbar import pyzbar
|
||||||
|
|
||||||
print cv2.getBuildInformation()
|
print cv2.getBuildInformation()
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ monkey --version
|
|||||||
pigpiod -v
|
pigpiod -v
|
||||||
i2cdetect -V
|
i2cdetect -V
|
||||||
butterfly -h
|
butterfly -h
|
||||||
espeak --version
|
# espeak --version
|
||||||
mjpg_streamer --version
|
mjpg_streamer --version
|
||||||
|
|
||||||
# ros stuff
|
# ros stuff
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
EXCLUDE = ('clever4-front-white.png', '.DS_Store', 'clever4-front-black-large.png')
|
EXCLUDE = ('clever4-front-white.png', 'clever4-front-white-large.png', '.DS_Store',
|
||||||
|
'clever4-front-black-large.png','clover42-black.png')
|
||||||
|
|
||||||
code = 0
|
code = 0
|
||||||
|
|
||||||
os.chdir('./docs')
|
os.chdir('./docs')
|
||||||
|
|||||||
8
clover/CHANGELOG.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Changelog for package clover
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
0.21.1 (2020-11-17)
|
||||||
|
-------------------
|
||||||
|
* First release of clover package to ROS
|
||||||
|
* Contributors: Alexey Rogachevskiy, Arthur Golubtsov, Oleg Kalachev
|
||||||
@@ -44,16 +44,12 @@ Alternatively you may change the `fcu_url` property in `mavros.launch` file to p
|
|||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
To start connection to SITL, use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
roslaunch clover sitl.launch
|
|
||||||
```
|
|
||||||
|
|
||||||
To start connection to the flight controller, use:
|
To start connection to the flight controller, use:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
roslaunch clover clover.launch
|
roslaunch clover clover.launch
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For the simulation information see the [corresponding article](https://clover.coex.tech/en/simulation.html).
|
||||||
|
|
||||||
> 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`.
|
> 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`.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<arg name="ws281x" default="true"/>
|
<arg name="ws281x" default="true"/>
|
||||||
<arg name="led_effect" default="true"/>
|
<arg name="led_effect" default="true"/>
|
||||||
<arg name="led_notify" default="true"/>
|
<arg name="led_notify" default="true"/>
|
||||||
<arg name="led_count" default="58"/>
|
<arg name="led_count" default="72"/>
|
||||||
<arg name="gpio_pin" default="21"/>
|
<arg name="gpio_pin" default="21"/>
|
||||||
|
|
||||||
<arg name="simulator" default="false"/>
|
<arg name="simulator" default="false"/>
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
<launch>
|
|
||||||
<!-- clover configuration for testing in sitl -->
|
|
||||||
<arg name="ip" default="127.0.0.1"/>
|
|
||||||
<arg name="rosbridge" default="false"/>
|
|
||||||
|
|
||||||
<include file="$(find clover)/launch/clover.launch">
|
|
||||||
<arg name="fcu_conn" value="udp"/>
|
|
||||||
<arg name="fcu_ip" value="$(arg ip)"/>
|
|
||||||
<arg name="gcs_bridge" value="false"/>
|
|
||||||
<arg name="optical_flow" value="false"/>
|
|
||||||
<arg name="web_video_server" default="false"/>
|
|
||||||
<arg name="main_camera" default="false"/>
|
|
||||||
<arg name="rosbridge" value="$(arg rosbridge)"/>
|
|
||||||
<arg name="aruco" default="false"/>
|
|
||||||
<arg name="rangefinder_vl53l1x" default="false"/>
|
|
||||||
<arg name="led" default="false"/>
|
|
||||||
<arg name="rc" default="false"/>
|
|
||||||
</include>
|
|
||||||
</launch>
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package format="2">
|
<package format="2">
|
||||||
<name>clover</name>
|
<name>clover</name>
|
||||||
<version>0.0.1</version>
|
<version>0.21.1</version>
|
||||||
<description>The Clover package</description>
|
<description>The Clover package</description>
|
||||||
|
|
||||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ ros::Duration state_timeout;
|
|||||||
ros::Duration velocity_timeout;
|
ros::Duration velocity_timeout;
|
||||||
ros::Duration global_position_timeout;
|
ros::Duration global_position_timeout;
|
||||||
ros::Duration battery_timeout;
|
ros::Duration battery_timeout;
|
||||||
|
ros::Duration manual_control_timeout;
|
||||||
float default_speed;
|
float default_speed;
|
||||||
bool auto_release;
|
bool auto_release;
|
||||||
bool land_only_in_offboard, nav_from_sp, check_kill_switch;
|
bool land_only_in_offboard, nav_from_sp, check_kill_switch;
|
||||||
@@ -488,17 +489,26 @@ void publishSetpoint(const ros::TimerEvent& event)
|
|||||||
publish(event.current_real);
|
publish(event.current_real);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void checkKillSwitch()
|
inline void checkManualControl()
|
||||||
{
|
{
|
||||||
if (!TIMEOUT(manual_control, state_timeout))
|
if (!manual_control_timeout.isZero() && TIMEOUT(manual_control, manual_control_timeout)) {
|
||||||
throw std::runtime_error("Manual control timeout, can't check kill switch status");
|
throw std::runtime_error("Manual control timeout, RC is switched off?");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_kill_switch) {
|
||||||
|
// switch values: https://github.com/PX4/PX4-Autopilot/blob/c302514a0809b1765fafd13c014d705446ae1113/msg/manual_control_setpoint.msg#L3
|
||||||
|
const uint8_t SWITCH_POS_NONE = 0; // switch is not mapped
|
||||||
|
const uint8_t SWITCH_POS_ON = 1; // switch activated
|
||||||
|
const uint8_t SWITCH_POS_MIDDLE = 2; // middle position
|
||||||
|
const uint8_t SWITCH_POS_OFF = 3; // switch not activated
|
||||||
|
|
||||||
const int KILL_SWITCH_BIT = 12; // https://github.com/PX4/Firmware/blob/c302514a0809b1765fafd13c014d705446ae1113/src/modules/mavlink/mavlink_messages.cpp#L3975
|
const int KILL_SWITCH_BIT = 12; // https://github.com/PX4/Firmware/blob/c302514a0809b1765fafd13c014d705446ae1113/src/modules/mavlink/mavlink_messages.cpp#L3975
|
||||||
bool kill_switch = manual_control.buttons & (1 << KILL_SWITCH_BIT);
|
uint8_t kill_switch = (manual_control.buttons & (0b11 << KILL_SWITCH_BIT)) >> KILL_SWITCH_BIT;
|
||||||
|
|
||||||
if (kill_switch)
|
if (kill_switch == SWITCH_POS_ON)
|
||||||
throw std::runtime_error("Kill switch is on");
|
throw std::runtime_error("Kill switch is on");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
inline void checkState()
|
inline void checkState()
|
||||||
{
|
{
|
||||||
@@ -527,8 +537,8 @@ bool serve(enum setpoint_type_t sp_type, float x, float y, float z, float vx, fl
|
|||||||
// Checks
|
// Checks
|
||||||
checkState();
|
checkState();
|
||||||
|
|
||||||
if (auto_arm && check_kill_switch) {
|
if (auto_arm) {
|
||||||
checkKillSwitch();
|
checkManualControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
// default frame is local frame
|
// default frame is local frame
|
||||||
@@ -862,6 +872,7 @@ int main(int argc, char **argv)
|
|||||||
velocity_timeout = ros::Duration(nh_priv.param("velocity_timeout", 2.0));
|
velocity_timeout = ros::Duration(nh_priv.param("velocity_timeout", 2.0));
|
||||||
global_position_timeout = ros::Duration(nh_priv.param("global_position_timeout", 10.0));
|
global_position_timeout = ros::Duration(nh_priv.param("global_position_timeout", 10.0));
|
||||||
battery_timeout = ros::Duration(nh_priv.param("battery_timeout", 2.0));
|
battery_timeout = ros::Duration(nh_priv.param("battery_timeout", 2.0));
|
||||||
|
manual_control_timeout = ros::Duration(nh_priv.param("manual_control_timeout", 0.0));
|
||||||
|
|
||||||
transform_timeout = ros::Duration(nh_priv.param("transform_timeout", 0.5));
|
transform_timeout = ros::Duration(nh_priv.param("transform_timeout", 0.5));
|
||||||
telemetry_transform_timeout = ros::Duration(nh_priv.param("telemetry_transform_timeout", 0.5));
|
telemetry_transform_timeout = ros::Duration(nh_priv.param("telemetry_transform_timeout", 0.5));
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
<title>Clover Drone Kit Tools</title>
|
||||||
|
|
||||||
<h1>Clover Drone Kit Tools</h1>
|
<h1>Clover Drone Kit Tools</h1>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
8
clover_blocks/CHANGELOG.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Changelog for package clover_blocks
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
0.21.1 (2020-11-17)
|
||||||
|
-------------------
|
||||||
|
* First release of clover_blocks package to ROS
|
||||||
|
* Contributors: Oleg Kalachev
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<package format="2">
|
<package format="2">
|
||||||
<name>clover_blocks</name>
|
<name>clover_blocks</name>
|
||||||
<version>0.0.0</version>
|
<version>0.21.1</version>
|
||||||
<description>Blockly programming support for Clover</description>
|
<description>Blockly programming support for Clover</description>
|
||||||
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
<maintainer email="okalachev@gmail.com">Oleg Kalachev</maintainer>
|
||||||
<license>MIT</license>
|
<license>MIT</license>
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
</value>
|
</value>
|
||||||
<value name="Z">
|
<value name="Z">
|
||||||
<shadow type="math_number" id="n0ULZn64%k.:,l(,D?TZ">
|
<shadow type="math_number" id="n0ULZn64%k.:,l(,D?TZ">
|
||||||
<field name="NUM">0</field>
|
<field name="NUM">1</field>
|
||||||
</shadow>
|
</shadow>
|
||||||
</value>
|
</value>
|
||||||
<value name="ID">
|
<value name="ID">
|
||||||
|
|||||||
@@ -1,16 +1,5 @@
|
|||||||
<xml xmlns="https://developers.google.com/blockly/xml">
|
<xml xmlns="https://developers.google.com/blockly/xml">
|
||||||
<variables>
|
<block type="controls_whileUntil" id="U1it{GcGuSS:=[xiwZr1" x="113" y="113">
|
||||||
<variable id="_{V-S5HPBUl]CcJkL1Jw">led_count</variable>
|
|
||||||
</variables>
|
|
||||||
<block type="variables_set" id="{)^J~:UMX%D;RWvztWLN" x="113" y="87">
|
|
||||||
<field name="VAR" id="_{V-S5HPBUl]CcJkL1Jw">led_count</field>
|
|
||||||
<value name="VALUE">
|
|
||||||
<block type="math_number" id="V_W$3,VFwZjcc|?|1o`l">
|
|
||||||
<field name="NUM">58</field>
|
|
||||||
</block>
|
|
||||||
</value>
|
|
||||||
<next>
|
|
||||||
<block type="controls_whileUntil" id="U1it{GcGuSS:=[xiwZr1">
|
|
||||||
<field name="MODE">WHILE</field>
|
<field name="MODE">WHILE</field>
|
||||||
<value name="BOOL">
|
<value name="BOOL">
|
||||||
<block type="logic_boolean" id="]7ZDRwde}/RqjQCX}aVW">
|
<block type="logic_boolean" id="]7ZDRwde}/RqjQCX}aVW">
|
||||||
@@ -76,9 +65,7 @@
|
|||||||
<shadow type="math_number" id="jENTcXz0C5/=)Xpd!}LL">
|
<shadow type="math_number" id="jENTcXz0C5/=)Xpd!}LL">
|
||||||
<field name="NUM">1</field>
|
<field name="NUM">1</field>
|
||||||
</shadow>
|
</shadow>
|
||||||
<block type="variables_get" id="Ko,`n=i88FY~`YbQLA?[">
|
<block type="led_count" id="vM@X8s!xa]v}AaK6PWF5"></block>
|
||||||
<field name="VAR" id="_{V-S5HPBUl]CcJkL1Jw">led_count</field>
|
|
||||||
</block>
|
|
||||||
</value>
|
</value>
|
||||||
</block>
|
</block>
|
||||||
</value>
|
</value>
|
||||||
@@ -101,6 +88,4 @@
|
|||||||
</block>
|
</block>
|
||||||
</statement>
|
</statement>
|
||||||
</block>
|
</block>
|
||||||
</next>
|
|
||||||
</block>
|
|
||||||
</xml>
|
</xml>
|
||||||
@@ -353,6 +353,17 @@ Blockly.Blocks['set_effect'] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Blockly.Blocks['led_count'] = {
|
||||||
|
init: function () {
|
||||||
|
this.appendDummyInput()
|
||||||
|
.appendField("LED count");
|
||||||
|
this.setOutput(true, "Number");
|
||||||
|
this.setColour(COLOR_LED);
|
||||||
|
this.setTooltip("Returns the number of LEDs (configured in led.launch).");
|
||||||
|
this.setHelpUrl(DOCS_URL + '#' + this.type);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Blockly.Blocks['take_off'] = {
|
Blockly.Blocks['take_off'] = {
|
||||||
init: function () {
|
init: function () {
|
||||||
this.appendValueInput("ALT")
|
this.appendValueInput("ALT")
|
||||||
@@ -535,7 +546,7 @@ Blockly.Blocks['gpio_read'] = {
|
|||||||
this.setOutput(true, "Boolean");
|
this.setOutput(true, "Boolean");
|
||||||
this.setColour(COLOR_GPIO);
|
this.setColour(COLOR_GPIO);
|
||||||
this.setTooltip("Returns if there is voltage on a GPIO pin.");
|
this.setTooltip("Returns if there is voltage on a GPIO pin.");
|
||||||
this.setHelpUrl(DOCS_URL + '#' + this.type);
|
this.setHelpUrl(DOCS_URL + '#GPIO');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -552,7 +563,7 @@ Blockly.Blocks['gpio_write'] = {
|
|||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setTooltip("Set GPIO pin level.");
|
this.setTooltip("Set GPIO pin level.");
|
||||||
this.setHelpUrl(DOCS_URL + '#' + this.type);
|
this.setHelpUrl(DOCS_URL + '#GPIO');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -568,7 +579,24 @@ Blockly.Blocks['set_servo'] = {
|
|||||||
this.setColour(COLOR_GPIO);
|
this.setColour(COLOR_GPIO);
|
||||||
this.setPreviousStatement(true, null);
|
this.setPreviousStatement(true, null);
|
||||||
this.setNextStatement(true, null);
|
this.setNextStatement(true, null);
|
||||||
this.setTooltip("Set PWM on a GPIO pin to control servo. PWM is specified in range of 500–2500 ms.");
|
this.setTooltip("Set PWM on a GPIO pin to control servo. PWM is specified in range of 500–2500 μs.");
|
||||||
this.setHelpUrl(DOCS_URL + '#' + this.type);
|
this.setHelpUrl(DOCS_URL + '#GPIO');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Blockly.Blocks['set_duty_cycle'] = {
|
||||||
|
init: function () {
|
||||||
|
this.appendValueInput("PIN")
|
||||||
|
.setCheck("Number")
|
||||||
|
.appendField("set GPIO pin");
|
||||||
|
this.appendValueInput("DUTY_CYCLE")
|
||||||
|
.setCheck("Number")
|
||||||
|
.appendField("to duty cycle");
|
||||||
|
this.setInputsInline(true);
|
||||||
|
this.setColour(COLOR_GPIO);
|
||||||
|
this.setPreviousStatement(true, null);
|
||||||
|
this.setNextStatement(true, null);
|
||||||
|
this.setTooltip("Set PWM duty cycle on a GPIO pin (better to control LEDs, etc). Duty cycle is set in range of 0–1.");
|
||||||
|
this.setHelpUrl(DOCS_URL + '#GPIO');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -106,6 +106,7 @@
|
|||||||
<value name="INDEX"><shadow type="math_number"><field name="NUM">0</field></shadow></value>
|
<value name="INDEX"><shadow type="math_number"><field name="NUM">0</field></shadow></value>
|
||||||
<value name="COLOR"><shadow type="colour_picker"></shadow></value>
|
<value name="COLOR"><shadow type="colour_picker"></shadow></value>
|
||||||
</block>
|
</block>
|
||||||
|
<block type="led_count"></block>
|
||||||
</category>
|
</category>
|
||||||
<category name="GPIO" colour="#5b97cc">
|
<category name="GPIO" colour="#5b97cc">
|
||||||
<block type="gpio_read">
|
<block type="gpio_read">
|
||||||
@@ -119,6 +120,10 @@
|
|||||||
<value name="PIN"><shadow type="math_number"><field name="NUM">1</field></shadow></value>
|
<value name="PIN"><shadow type="math_number"><field name="NUM">1</field></shadow></value>
|
||||||
<value name="PWM"><shadow type="math_number"><field name="NUM">1500</field></shadow></value>
|
<value name="PWM"><shadow type="math_number"><field name="NUM">1500</field></shadow></value>
|
||||||
</block>
|
</block>
|
||||||
|
<block type="set_duty_cycle">
|
||||||
|
<value name="PIN"><shadow type="math_number"><field name="NUM">1</field></shadow></value>
|
||||||
|
<value name="DUTY_CYCLE"><shadow type="math_number"><field name="NUM">0.5</field></shadow></value>
|
||||||
|
</block>
|
||||||
</category>
|
</category>
|
||||||
<sep></sep>
|
<sep></sep>
|
||||||
<category name="Logic" colour="#5b80a5">
|
<category name="Logic" colour="#5b80a5">
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Blockly.Python.addReservedWords('_b,_print');
|
|||||||
Blockly.Python.addReservedWords('rospy,srv,Trigger,get_telemetry,navigate,set_velocity,land');
|
Blockly.Python.addReservedWords('rospy,srv,Trigger,get_telemetry,navigate,set_velocity,land');
|
||||||
Blockly.Python.addReservedWords('navigate_wait,land_wait,wait_arrival,wait_yaw,get_distance');
|
Blockly.Python.addReservedWords('navigate_wait,land_wait,wait_arrival,wait_yaw,get_distance');
|
||||||
Blockly.Python.addReservedWords('pigpio,pi,Range');
|
Blockly.Python.addReservedWords('pigpio,pi,Range');
|
||||||
Blockly.Python.addReservedWords('SetLEDEffect,set_effect');
|
Blockly.Python.addReservedWords('SetLEDEffect,set_effect,led_count,get_led_count');
|
||||||
Blockly.Python.addReservedWords('SetLEDs,LEDState,set_leds');
|
Blockly.Python.addReservedWords('SetLEDs,LEDState,set_leds');
|
||||||
|
|
||||||
const IMPORT_SRV = `from clover import srv
|
const IMPORT_SRV = `from clover import srv
|
||||||
@@ -87,6 +87,9 @@ function generateROSDefinitions() {
|
|||||||
Blockly.Python.definitions_['import_set_led'] = 'from led_msgs.srv import SetLEDs\nfrom led_msgs.msg import LEDState';
|
Blockly.Python.definitions_['import_set_led'] = 'from led_msgs.srv import SetLEDs\nfrom led_msgs.msg import LEDState';
|
||||||
code += `set_leds = rospy.ServiceProxy('led/set_leds', SetLEDs, persistent=True)\n`;
|
code += `set_leds = rospy.ServiceProxy('led/set_leds', SetLEDs, persistent=True)\n`;
|
||||||
}
|
}
|
||||||
|
if (rosDefinitions.ledStateArray) {
|
||||||
|
Blockly.Python.definitions_['import_led_state_array'] = 'from led_msgs.msg import LEDStateArray';
|
||||||
|
}
|
||||||
if (rosDefinitions.navigateWait) {
|
if (rosDefinitions.navigateWait) {
|
||||||
Blockly.Python.definitions_['import_math'] = 'import math';
|
Blockly.Python.definitions_['import_math'] = 'import math';
|
||||||
code += NAVIGATE_WAIT();
|
code += NAVIGATE_WAIT();
|
||||||
@@ -391,10 +394,25 @@ Blockly.Python.set_led = function(block) {
|
|||||||
return `set_leds([LEDState(index=${index}, r=${color.r}, g=${color.g}, b=${color.b})])\n`;
|
return `set_leds([LEDState(index=${index}, r=${color.r}, g=${color.g}, b=${color.b})])\n`;
|
||||||
} else {
|
} else {
|
||||||
let parseColor = Blockly.Python.provideFunction_('parse_color', [PARSE_COLOR]);
|
let parseColor = Blockly.Python.provideFunction_('parse_color', [PARSE_COLOR]);
|
||||||
return `set_leds([LEDState(index=${index}, **${parseColor}(${colorCode})])\n`;
|
return `set_leds([LEDState(index=${index}, **${parseColor}(${colorCode}))])\n`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const GET_LED_COUNT = `led_count = None
|
||||||
|
|
||||||
|
def get_led_count():
|
||||||
|
global led_count
|
||||||
|
if led_count is None:
|
||||||
|
led_count = len(rospy.wait_for_message('led/state', LEDStateArray, timeout=10).leds)
|
||||||
|
return led_count\n`;
|
||||||
|
|
||||||
|
Blockly.Python.led_count = function(block) {
|
||||||
|
rosDefinitions.ledStateArray = true;
|
||||||
|
initNode();
|
||||||
|
Blockly.Python.definitions_['get_led_count'] = GET_LED_COUNT;
|
||||||
|
return [`get_led_count()`, Blockly.Python.ORDER_FUNCTION_CALL]
|
||||||
|
}
|
||||||
|
|
||||||
function pigpio() {
|
function pigpio() {
|
||||||
Blockly.Python.definitions_['import_pigpio'] = 'import pigpio';
|
Blockly.Python.definitions_['import_pigpio'] = 'import pigpio';
|
||||||
Blockly.Python.definitions_['init_pigpio'] = 'pi = pigpio.pi()';
|
Blockly.Python.definitions_['init_pigpio'] = 'pi = pigpio.pi()';
|
||||||
@@ -412,6 +430,10 @@ const SET_SERVO = `\ndef set_servo(pin, pwm):
|
|||||||
pi.set_mode(pin, pigpio.OUTPUT)
|
pi.set_mode(pin, pigpio.OUTPUT)
|
||||||
pi.set_servo_pulsewidth(pin, pwm)\n`;
|
pi.set_servo_pulsewidth(pin, pwm)\n`;
|
||||||
|
|
||||||
|
const SET_DUTY_CYCLE = `\ndef set_duty_cycle(pin, duty_cycle):
|
||||||
|
pi.set_mode(pin, pigpio.OUTPUT)
|
||||||
|
pi.set_PWM_dutycycle(pin, duty_cycle * 255)\n`;
|
||||||
|
|
||||||
Blockly.Python.gpio_read = function(block) {
|
Blockly.Python.gpio_read = function(block) {
|
||||||
pigpio();
|
pigpio();
|
||||||
Blockly.Python.definitions_['gpio_read'] = GPIO_READ;
|
Blockly.Python.definitions_['gpio_read'] = GPIO_READ;
|
||||||
@@ -434,3 +456,11 @@ Blockly.Python.set_servo = function(block) {
|
|||||||
var pwm = Blockly.Python.valueToCode(block, 'PWM', Blockly.Python.ORDER_NONE);
|
var pwm = Blockly.Python.valueToCode(block, 'PWM', Blockly.Python.ORDER_NONE);
|
||||||
return `set_servo(${pin}, ${pwm})\n`;
|
return `set_servo(${pin}, ${pwm})\n`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Blockly.Python.set_duty_cycle = function(block) {
|
||||||
|
pigpio();
|
||||||
|
Blockly.Python.definitions_['set_duty_cycle'] = SET_DUTY_CYCLE;
|
||||||
|
var pin = Blockly.Python.valueToCode(block, 'PIN', Blockly.Python.ORDER_NONE);
|
||||||
|
var dutyCycle = Blockly.Python.valueToCode(block, 'DUTY_CYCLE', Blockly.Python.ORDER_NONE);
|
||||||
|
return `set_duty_cycle(${pin}, ${dutyCycle})\n`;
|
||||||
|
}
|
||||||
|
|||||||
9
clover_description/CHANGELOG.rst
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Changelog for package clover_description
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
0.21.1 (2020-11-17)
|
||||||
|
-------------------
|
||||||
|
* First release of clover_description package to ROS
|
||||||
|
* Contributors: Alexey Rogachevskiy
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
<package format="2">
|
<package format="2">
|
||||||
<name>clover_description</name>
|
<name>clover_description</name>
|
||||||
<version>0.0.1</version>
|
<version>0.21.1</version>
|
||||||
<description>The clover_description package provides URDF models of the Clover series of quadcopters.</description>
|
<description>The clover_description package provides URDF models of the Clover series of quadcopters.</description>
|
||||||
|
|
||||||
<maintainer email="sfalexrog@gmail.com">Alexey Rogachevskiy</maintainer>
|
<maintainer email="sfalexrog@gmail.com">Alexey Rogachevskiy</maintainer>
|
||||||
|
|||||||
8
clover_simulation/CHANGELOG.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Changelog for package clover_simulation
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
0.21.1 (2020-11-17)
|
||||||
|
-------------------
|
||||||
|
* First release of clover_simulation package to ROS
|
||||||
|
* Contributors: Alexey Rogachevskiy
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
<launch>
|
<launch>
|
||||||
|
<arg name="type" default="gazebo"/> <!-- gazebo, jmavsim, none (only clover packages) -->
|
||||||
<arg name="mav_id" default="0"/>
|
<arg name="mav_id" default="0"/>
|
||||||
<arg name="est" default="ekf2"/> <!-- PX4 estimator: lpe, ekf2 -->
|
<arg name="est" default="ekf2"/> <!-- PX4 estimator: lpe, ekf2 -->
|
||||||
<arg name="vehicle" default="clover"/> <!-- PX4 vehicle configuration: clover, clover_vpe -->
|
<arg name="vehicle" default="clover"/> <!-- PX4 vehicle configuration: clover, clover_vpe -->
|
||||||
@@ -9,22 +10,22 @@
|
|||||||
<arg name="use_clover_physics" default="false"/> <!-- Use inertial parameters from CAD models -->
|
<arg name="use_clover_physics" default="false"/> <!-- Use inertial parameters from CAD models -->
|
||||||
|
|
||||||
<!-- Gazebo instance -->
|
<!-- Gazebo instance -->
|
||||||
<include file="$(find gazebo_ros)/launch/empty_world.launch">
|
<include file="$(find gazebo_ros)/launch/empty_world.launch" if="$(eval type == 'gazebo')">
|
||||||
<!-- Workaround for crashes in VMware -->
|
<!-- Workaround for crashes in VMware -->
|
||||||
<env name="SVGA_VGPU10" value="0"/>
|
<env name="SVGA_VGPU10" value="0"/>
|
||||||
<arg name="gui" value="true"/>
|
<arg name="gui" value="true"/>
|
||||||
<arg name="world_name" value="$(find clover_simulation)/resources/worlds/clover.world"/>
|
<arg name="world_name" value="$(find clover_simulation)/resources/worlds/clover_aruco.world"/>
|
||||||
<arg name="verbose" value="true"/>
|
<arg name="verbose" value="true"/>
|
||||||
</include>
|
</include>
|
||||||
|
|
||||||
<!-- PX4 instance -->
|
<!-- PX4 instance -->
|
||||||
<node name="sitl_$(arg mav_id)" pkg="px4" type="px4" output="screen" args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg mav_id)">
|
<node name="sitl_$(arg mav_id)" pkg="px4" type="px4" output="screen" args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg mav_id)" unless="$(eval type == 'none')">
|
||||||
<env name="PX4_SIM_MODEL" value="$(arg vehicle)"/>
|
<env name="PX4_SIM_MODEL" value="$(arg vehicle)"/>
|
||||||
<env name="PX4_ESTIMATOR" value="$(arg est)"/>
|
<env name="PX4_ESTIMATOR" value="$(arg est)"/>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
<!-- Clover model -->
|
<!-- Clover model -->
|
||||||
<include file="$(find clover_description)/launch/spawn_drone.launch">
|
<include file="$(find clover_description)/launch/spawn_drone.launch" if="$(eval type == 'gazebo')">
|
||||||
<arg name="main_camera" value="$(arg main_camera)"/>
|
<arg name="main_camera" value="$(arg main_camera)"/>
|
||||||
<arg name="rangefinder" value="$(arg rangefinder)"/>
|
<arg name="rangefinder" value="$(arg rangefinder)"/>
|
||||||
<arg name="led" value="$(arg led)"/>
|
<arg name="led" value="$(arg led)"/>
|
||||||
@@ -32,10 +33,20 @@
|
|||||||
<arg name="use_clover_physics" value="$(arg use_clover_physics)"/>
|
<arg name="use_clover_physics" value="$(arg use_clover_physics)"/>
|
||||||
</include>
|
</include>
|
||||||
|
|
||||||
|
<node name="jmavsim" pkg="px4" type="jmavsim_run.sh" output="screen" if="$(eval type == 'jmavsim')"/>
|
||||||
|
|
||||||
|
<param name="use_sim_time" value="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
|
||||||
<!-- Clover services -->
|
<!-- Clover services -->
|
||||||
<include file="$(find clover)/launch/clover.launch">
|
<include file="$(find clover)/launch/clover.launch">
|
||||||
<arg name="simulator" value="true"/>
|
<arg name="simulator" value="true"/>
|
||||||
<arg name="fcu_conn" value="sitl"/>
|
<arg name="fcu_conn" value="sitl"/>
|
||||||
<arg name="fcu_ip" value="127.0.0.1"/>
|
<arg name="fcu_ip" value="127.0.0.1"/>
|
||||||
|
<arg name="gcs_bridge" value=""/>
|
||||||
|
<arg name="rc" default="false"/>
|
||||||
|
<arg name="web_video_server" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="main_camera" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="aruco" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
|
<arg name="led" default="false" if="$(eval type == 'jmavsim')"/>
|
||||||
</include>
|
</include>
|
||||||
</launch>
|
</launch>
|
||||||
|
|||||||
1693
clover_simulation/models/aruco_cmit_txt/aruco_model.sdf
Normal file
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 93 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |
|
After Width: | Height: | Size: 94 B |